ZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsMzUgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IENyZWF0ZSBhIHJlcG9ydCB0byBoZWxwIHVzIGltcHJvdmUKK3RpdGxlOiAnJworbGFiZWxzOiAnJworYXNzaWduZWVzOiAnJworCistLS0KKworKipDYXV0aW9uKioKK1RoZSBJc3N1ZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgZm9yIHRoZSByZXBvcnRpbmcgb2YgcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHByb2plY3QuCitGb3IgYW55IG90aGVyIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgU1RNMzIgcHJvZHVjdCwgdGhlIHBlcmZvcm1hbmNlLCB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzIGFuZCBib2FyZHMsIHRoZSB0b29scyB0aGUgZW52aXJvbm1lbnQgaW4gZ2VuZXJhbCwgcGxlYXNlIHBvc3QgYSB0b3BpYyBpbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykgCisKKyoqRGVzY3JpYmUgdGhlIHNldC11cCoqCisgKiBUaGUgYm9hcmQgKGVpdGhlciBTVCBSUE4gcmVmZXJlbmNlIG9yIHlvdXIgY3VzdG9tIGJvYXJkKQorICogSURFIG9yIGF0IGxlYXN0IHRoZSBjb21waWxlciBhbmQgaXRzIHZlcnNpb24KKworKipEZXNjcmliZSB0aGUgYnVnKioKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgYnVnIGlzLgorCisqKkhvdyBUbyBSZXByb2R1Y2UqKgorMS4gSW5kaWNhdGUgdGhlIGdsb2JhbCBiZWhhdmlvciBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QKKworMi4gVGhlIG1vZHVsZXMgdGhhdCB5b3Ugc3VzcGVjdCB0byBiZSB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0gKERyaXZlciwgQlNQLCBNVyAuLi4pCisKKzMuIFRoZSB1c2UgY2FzZSB0aGF0IGdlbmVyYXRlcyB0aGUgcHJvYmxlbQorCis0LiBIb3cgd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbQorCisKKyoqQWRkaXRpb25hbCBjb250ZXh0KioKK0lmIHlvdSBoYXZlIGEgZmlyc3QgYW5hbHlzaXMgb3IgcGF0Y2ggY29ycmVjdGlvbiwgdGhhbmsgeW91IHRvIHNoYXJlIHlvdXIgcHJvcG9zYWwuCisKKyoqU2NyZWVuc2hvdHMqKgorSWYgYXBwbGljYWJsZSwgYWRkIHNjcmVlbnNob3RzIHRvIGhlbHAgZXhwbGFpbiB5b3VyIHByb2JsZW0uCmRpZmYgLS1naXQgYS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFL290aGVyLWlzc3VlLm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZApAQCAtMCwwICsxLDIyIEBACistLS0KK25hbWU6ICdPdGhlciBJc3N1ZSAnCithYm91dDogR2VuZXJpYyBpc3N1ZSBkZXNjcmlwdGlvbgordGl0bGU6ICcnCitsYWJlbHM6ICcnCithc3NpZ25lZXM6ICcnCisKKy0tLQorCisqKkNhdXRpb24qKgorVGhlIElzc3VlcyBhcmUgc3RyaWN0bHkgbGltaXRlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBwcm9ibGVtIGVuY291bnRlcmVkIHdpdGggdGhlIHNvZnR3YXJlIHByb3ZpZGVkIGluIHRoaXMgcHJvamVjdC4KK0ZvciBhbnkgb3RoZXIgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBTVE0zMiBwcm9kdWN0LCB0aGUgcGVyZm9ybWFuY2UsIHRoZSBoYXJkd2FyZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGJvYXJkcywgdGhlIHRvb2xzIHRoZSBlbnZpcm9ubWVudCBpbiBnZW5lcmFsLCBwbGVhc2UgcG9zdCBhIHRvcGljIGluIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKSAKKworKipEZXNjcmliZSB0aGUgc2V0LXVwKioKKyAqIFRoZSBib2FyZCAoZWl0aGVyIFNUIFJQTiByZWZlcmVuY2Ugb3IgeW91ciBjdXN0b20gYm9hcmQpCisgKiBJREUgb3IgYXQgbGVhc3QgdGhlIGNvbXBpbGVyIGFuZCBpdHMgdmVyc2lvbgorCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIGEgcGF0Y2ggcHJvcG9zYWwsIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKQEAgLTAsMCArMSw4IEBACisjIyBJTVBPUlRBTlQgSU5GT1JNQVRJT04gCisKKyMjIyBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKQorKiBUaGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyBvbmx5IGFmdGVyIGEgKipDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSoqIG1lY2hhbmlzbSBoYXMgYmVlbiBkZXBsb3llZC4KKyogV2UgYXJlIGN1cnJlbnRseSB3b3JraW5nIG9uIHRoZSBzZXQtdXAgb2YgdGhpcyBwcm9jZWR1cmUuIAorICAKKworCmRpZmYgLS1naXQgYS9DT0RFX09GX0NPTkRVQ1QubWQgYi9DT0RFX09GX0NPTkRVQ1QubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MmIwNAotLS0gL2Rldi9udWxsCisrKyBiL0NPREVfT0ZfQ09ORFVDVC5tZApAQCAtMCwwICsxLDc2IEBACisjIENvbnRyaWJ1dG9yIENvdmVuYW50IENvZGUgb2YgQ29uZHVjdAorCisjIyBPdXIgUGxlZGdlCisKK0luIHRoZSBpbnRlcmVzdCBvZiBmb3N0ZXJpbmcgYW4gb3BlbiBhbmQgd2VsY29taW5nIGVudmlyb25tZW50LCB3ZSBhcworY29udHJpYnV0b3JzIGFuZCBtYWludGFpbmVycyBwbGVkZ2UgdG8gbWFraW5nIHBhcnRpY2lwYXRpb24gaW4gb3VyIHByb2plY3QgYW5kCitvdXIgY29tbXVuaXR5IGEgaGFyYXNzbWVudC1mcmVlIGV4cGVyaWVuY2UgZm9yIGV2ZXJ5b25lLCByZWdhcmRsZXNzIG9mIGFnZSwgYm9keQorc2l6ZSwgZGlzYWJpbGl0eSwgZXRobmljaXR5LCBzZXggY2hhcmFjdGVyaXN0aWNzLCBnZW5kZXIgaWRlbnRpdHkgYW5kIGV4cHJlc3Npb24sCitsZXZlbCBvZiBleHBlcmllbmNlLCBlZHVjYXRpb24sIHNvY2lvLWVjb25vbWljIHN0YXR1cywgbmF0aW9uYWxpdHksIHBlcnNvbmFsCithcHBlYXJhbmNlLCByYWNlLCByZWxpZ2lvbiwgb3Igc2V4dWFsIGlkZW50aXR5IGFuZCBvcmllbnRhdGlvbi4KKworIyMgT3VyIFN0YW5kYXJkcworCitFeGFtcGxlcyBvZiBiZWhhdmlvciB0aGF0IGNvbnRyaWJ1dGVzIHRvIGNyZWF0aW5nIGEgcG9zaXRpdmUgZW52aXJvbm1lbnQKK2luY2x1ZGU6CisKKyogVXNpbmcgd2VsY29taW5nIGFuZCBpbmNsdXNpdmUgbGFuZ3VhZ2UKKyogQmVpbmcgcmVzcGVjdGZ1bCBvZiBkaWZmZXJpbmcgdmlld3BvaW50cyBhbmQgZXhwZXJpZW5jZXMKKyogR3JhY2VmdWxseSBhY2NlcHRpbmcgY29uc3RydWN0aXZlIGNyaXRpY2lzbQorKiBGb2N1c2luZyBvbiB3aGF0IGlzIGJlc3QgZm9yIHRoZSBjb21tdW5pdHkKKyogU2hvd2luZyBlbXBhdGh5IHRvd2FyZHMgb3RoZXIgY29tbXVuaXR5IG1lbWJlcnMKKworRXhhbXBsZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIGJ5IHBhcnRpY2lwYW50cyBpbmNsdWRlOgorCisqIFRoZSB1c2Ugb2Ygc2V4dWFsaXplZCBsYW5ndWFnZSBvciBpbWFnZXJ5IGFuZCB1bndlbGNvbWUgc2V4dWFsIGF0dGVudGlvbiBvcgorIGFkdmFuY2VzCisqIFRyb2xsaW5nLCBpbnN1bHRpbmcvZGVyb2dhdG9yeSBjb21tZW50cywgYW5kIHBlcnNvbmFsIG9yIHBvbGl0aWNhbCBhdHRhY2tzCisqIFB1YmxpYyBvciBwcml2YXRlIGhhcmFzc21lbnQKKyogUHVibGlzaGluZyBvdGhlcnMnIHByaXZhdGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBwaHlzaWNhbCBvciBlbGVjdHJvbmljCisgYWRkcmVzcywgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCisqIE90aGVyIGNvbmR1Y3Qgd2hpY2ggY291bGQgcmVhc29uYWJseSBiZSBjb25zaWRlcmVkIGluYXBwcm9wcmlhdGUgaW4gYQorIHByb2Zlc3Npb25hbCBzZXR0aW5nCisKKyMjIE91ciBSZXNwb25zaWJpbGl0aWVzCisKK1Byb2plY3QgbWFpbnRhaW5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjbGFyaWZ5aW5nIHRoZSBzdGFuZGFyZHMgb2YgYWNjZXB0YWJsZQorYmVoYXZpb3IgYW5kIGFyZSBleHBlY3RlZCB0byB0YWtlIGFwcHJvcHJpYXRlIGFuZCBmYWlyIGNvcnJlY3RpdmUgYWN0aW9uIGluCityZXNwb25zZSB0byBhbnkgaW5zdGFuY2VzIG9mIHVuYWNjZXB0YWJsZSBiZWhhdmlvci4KKworUHJvamVjdCBtYWludGFpbmVycyBoYXZlIHRoZSByaWdodCBhbmQgcmVzcG9uc2liaWxpdHkgdG8gcmVtb3ZlLCBlZGl0LCBvcgorcmVqZWN0IGNvbW1lbnRzLCBjb21taXRzLCBjb2RlLCB3aWtpIGVkaXRzLCBpc3N1ZXMsIGFuZCBvdGhlciBjb250cmlidXRpb25zCit0aGF0IGFyZSBub3QgYWxpZ25lZCB0byB0aGlzIENvZGUgb2YgQ29uZHVjdCwgb3IgdG8gYmFuIHRlbXBvcmFyaWx5IG9yCitwZXJtYW5lbnRseSBhbnkgY29udHJpYnV0b3IgZm9yIG90aGVyIGJlaGF2aW9ycyB0aGF0IHRoZXkgZGVlbSBpbmFwcHJvcHJpYXRlLAordGhyZWF0ZW5pbmcsIG9mZmVuc2l2ZSwgb3IgaGFybWZ1bC4KKworIyMgU2NvcGUKKworVGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyBib3RoIHdpdGhpbiBwcm9qZWN0IHNwYWNlcyBhbmQgaW4gcHVibGljIHNwYWNlcword2hlbiBhbiBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGluZyB0aGUgcHJvamVjdCBvciBpdHMgY29tbXVuaXR5LiBFeGFtcGxlcyBvZgorcmVwcmVzZW50aW5nIGEgcHJvamVjdCBvciBjb21tdW5pdHkgaW5jbHVkZSB1c2luZyBhbiBvZmZpY2lhbCBwcm9qZWN0IGUtbWFpbAorYWRkcmVzcywgcG9zdGluZyB2aWEgYW4gb2ZmaWNpYWwgc29jaWFsIG1lZGlhIGFjY291bnQsIG9yIGFjdGluZyBhcyBhbiBhcHBvaW50ZWQKK3JlcHJlc2VudGF0aXZlIGF0IGFuIG9ubGluZSBvciBvZmZsaW5lIGV2ZW50LiBSZXByZXNlbnRhdGlvbiBvZiBhIHByb2plY3QgbWF5IGJlCitmdXJ0aGVyIGRlZmluZWQgYW5kIGNsYXJpZmllZCBieSBwcm9qZWN0IG1haW50YWluZXJzLgorCisjIyBFbmZvcmNlbWVudAorCitJbnN0YW5jZXMgb2YgYWJ1c2l2ZSwgaGFyYXNzaW5nLCBvciBvdGhlcndpc2UgdW5hY2NlcHRhYmxlIGJlaGF2aW9yIG1heSBiZQorcmVwb3J0ZWQgYnkgY29udGFjdGluZyB0aGUgcHJvamVjdCB0ZWFtIGF0IGh0dHBzOi8vd3d3LnN0LmNvbS9jb250ZW50L3N0X2NvbS9lbi9jb250YWN0LXVzLmh0bWwuIEFsbAorY29tcGxhaW50cyB3aWxsIGJlIHJldmlld2VkIGFuZCBpbnZlc3RpZ2F0ZWQgYW5kIHdpbGwgcmVzdWx0IGluIGEgcmVzcG9uc2UgdGhhdAoraXMgZGVlbWVkIG5lY2Vzc2FyeSBhbmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNpcmN1bXN0YW5jZXMuIFRoZSBwcm9qZWN0IHRlYW0gaXMKK29ibGlnYXRlZCB0byBtYWludGFpbiBjb25maWRlbnRpYWxpdHkgd2l0aCByZWdhcmQgdG8gdGhlIHJlcG9ydGVyIG9mIGFuIGluY2lkZW50LgorRnVydGhlciBkZXRhaWxzIG9mIHNwZWNpZmljIGVuZm9yY2VtZW50IHBvbGljaWVzIG1heSBiZSBwb3N0ZWQgc2VwYXJhdGVseS4KKworUHJvamVjdCBtYWludGFpbmVycyB3aG8gZG8gbm90IGZvbGxvdyBvciBlbmZvcmNlIHRoZSBDb2RlIG9mIENvbmR1Y3QgaW4gZ29vZAorZmFpdGggbWF5IGZhY2UgdGVtcG9yYXJ5IG9yIHBlcm1hbmVudCByZXBlcmN1c3Npb25zIGFzIGRldGVybWluZWQgYnkgb3RoZXIKK21lbWJlcnMgb2YgdGhlIHByb2plY3QncyBsZWFkZXJzaGlwLgorCisjIyBBdHRyaWJ1dGlvbgorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBpcyBhZGFwdGVkIGZyb20gdGhlIFtDb250cmlidXRvciBDb3ZlbmFudF1baG9tZXBhZ2VdLCB2ZXJzaW9uIDEuNCwKK2F2YWlsYWJsZSBhdCBodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcvdmVyc2lvbi8xLzQvY29kZS1vZi1jb25kdWN0Lmh0bWwKKworW2hvbWVwYWdlXTogaHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnCisKK0ZvciBhbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjb2RlIG9mIGNvbmR1Y3QsIHNlZQoraHR0cHM6Ly93d3cuY29udHJpYnV0b3ItY292ZW5hbnQub3JnL2ZhcQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODgyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyMSBAQAorIyMgQ29udHJpYnV0aW5nIGd1aWRlCitUaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhIGNoZWNrbGlzdCBiZWZvcmUgY29udHJpYnV0aW5nIHRvIHRoaXMgcmVwb3NpdG9yeS4KK0l0IGluY2x1ZGVzIGxpbmtzIHRvIHJlYWQgdXAgb24gaWYgdG9waWNzIGFyZSB1bmNsZWFyIHRvIHlvdS4KKworVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCisKKyMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQorVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKKyhleGFtcGxlIGZvciBbc3RtMzJ3Ynh4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJ3Ynh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KK0J1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorCistIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCistIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgorLSBbIF0gYE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbHJlYWR5IHJlcG9ydGVkL2ZpeGVkIG9uIEdpdEh1YiBvciBkaXNjdXNzZWQgb24gYSBwcmV2aW91cyBJc3N1ZS5gIFBsZWFzZSByZWZlciB0byB0aGlzIFtkYXNoYm9hcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1NUTWljcm9lbGVjdHJvbmljcy9wcm9qZWN0cy8yKSBmb3IgdGhlIGxpc3Qgb2YgaXNzdWVzIGFuZCBwdWxsLXJlcXVlc3RzLiBEbyBub3QgZm9yZ2V0IHRvIGJyb3dzZSBpbnRvIHRoZSAqKmNsb3NlZCoqIGlzc3Vlcy4KKworCisjIyMgMi4gUG9zdGluZyB0aGUgaXNzdWUKK1doZW4geW91IGhhdmUgY2hlY2tlZCB0aGUgcHJldmlvdXMgYm94ZXMuIFlvdSB3aWxsIGZpbmQgdHdvIHRlbXBsYXRlcyBJc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIHJlcG8KKworIyMjIDMuIFB1bGwgUmVxdWVzdHMKK0ZvciB0aGUgbW9tZW50LCB0aGUgUHVsbCBSZXF1ZXN0IGZlYXR1cmUgaXMgbm90IGRlcGxveWVkLiBTVE1pY3JvbGVjdHJvbmljcyBpcyB3b3JraW5nIG9uIGEgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgcHJvY2VkdXJlCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlY2JkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaApAQCAtMCwwICsxLDM1MzMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9oYWxfbGVnYWN5LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGlhc2VzIGRlZmluaXRpb24gZm9yIHRoZSBTVE0zMkN1YmUgSEFMIGNvbnN0YW50cworICAqICAgICAgICAgIG1hY3JvcyBhbmQgZnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyX0hBTF9MRUdBQ1kKKyNkZWZpbmUgU1RNMzJfSEFMX0xFR0FDWQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FFU19BbGlhc2VkX0RlZmluZXMgSEFMIENSWVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQUVTX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfUkRFUlIKKyNkZWZpbmUgQUVTX0ZMQUdfV1JFUlIgICAgICAgICAgICAgICAgICBDUllQX0ZMQUdfV1JFUlIKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19DQ0YgICAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19DQ0YKKyNkZWZpbmUgQUVTX0NMRUFSRkxBR19SREVSUiAgICAgICAgICAgICBDUllQX0NMRUFSRkxBR19SREVSUgorI2RlZmluZSBBRVNfQ0xFQVJGTEFHX1dSRVJSICAgICAgICAgICAgIENSWVBfQ0xFQVJGTEFHX1dSRVJSCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FEQ19BbGlhc2VkX0RlZmluZXMgSEFMIEFEQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTjEyYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEyQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjEwYiAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzEwQgorI2RlZmluZSBBRENfUkVTT0xVVElPTjhiICAgICAgICAgICAgICAgIEFEQ19SRVNPTFVUSU9OXzhCCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9ONmIgICAgICAgICAgICAgICAgQURDX1JFU09MVVRJT05fNkIKKyNkZWZpbmUgT1ZSX0RBVEFfT1ZFUldSSVRURU4gICAgICAgICAgICBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyNkZWZpbmUgT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgICAgICAgICBBRENfT1ZSX0RBVEFfUFJFU0VSVkVECisjZGVmaW5lIEVPQ19TSU5HTEVfQ09OViAgICAgICAgICAgICAgICAgQURDX0VPQ19TSU5HTEVfQ09OVgorI2RlZmluZSBFT0NfU0VRX0NPTlYgICAgICAgICAgICAgICAgICAgIEFEQ19FT0NfU0VRX0NPTlYKKyNkZWZpbmUgRU9DX1NJTkdMRV9TRVFfQ09OViAgICAgICAgICAgICBBRENfRU9DX1NJTkdMRV9TRVFfQ09OVgorI2RlZmluZSBSRUdVTEFSX0dST1VQICAgICAgICAgICAgICAgICAgIEFEQ19SRUdVTEFSX0dST1VQCisjZGVmaW5lIElOSkVDVEVEX0dST1VQICAgICAgICAgICAgICAgICAgQURDX0lOSkVDVEVEX0dST1VQCisjZGVmaW5lIFJFR1VMQVJfSU5KRUNURURfR1JPVVAgICAgICAgICAgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAKKyNkZWZpbmUgQVdEX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEX0VWRU5UCisjZGVmaW5lIEFXRDFfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgQURDX0FXRDFfRVZFTlQKKyNkZWZpbmUgQVdEMl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICBBRENfQVdEMl9FVkVOVAorI2RlZmluZSBBV0QzX0VWRU5UICAgICAgICAgICAgICAgICAgICAgIEFEQ19BV0QzX0VWRU5UCisjZGVmaW5lIE9WUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgQURDX09WUl9FVkVOVAorI2RlZmluZSBKUU9WRl9FVkVOVCAgICAgICAgICAgICAgICAgICAgIEFEQ19KUU9WRl9FVkVOVAorI2RlZmluZSBBTExfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgIEFEQ19BTExfQ0hBTk5FTFMKKyNkZWZpbmUgUkVHVUxBUl9DSEFOTkVMUyAgICAgICAgICAgICAgICBBRENfUkVHVUxBUl9DSEFOTkVMUworI2RlZmluZSBJTkpFQ1RFRF9DSEFOTkVMUyAgICAgICAgICAgICAgIEFEQ19JTkpFQ1RFRF9DSEFOTkVMUworI2RlZmluZSBTWVNDRkdfRkxBR19TRU5TT1JfQURDICAgICAgICAgIEFEQ19GTEFHX1NFTlNPUgorI2RlZmluZSBTWVNDRkdfRkxBR19WUkVGX0FEQyAgICAgICAgICAgIEFEQ19GTEFHX1ZSRUZJTlQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMSAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWMiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWNiAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjYKKyNkZWZpbmUgQURDX0NMT0NLUFJFU0NBTEVSX1BDTEtfRElWOCAgICBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjgKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzBfVDZfVFJHTyAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UNl9UUkdPCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUcxX1QyMV9DQzIgICAgICAgQURDX0VYVEVSTkFMVFJJR0NPTlZfVDIxX0NDMgorI2RlZmluZSBBRENfRVhURVJOQUxUUklHMl9UMl9UUkdPICAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX1QyX1RSR08KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzNfVDJfQ0M0ICAgICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMl9DQzQKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJRzRfVDIyX1RSR08gICAgICBBRENfRVhURVJOQUxUUklHQ09OVl9UMjJfVFJHTworI2RlZmluZSBBRENfRVhURVJOQUxUUklHN19FWFRfSVQxMSAgICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WX0VYVF9JVDExCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQyAgICAgICAgICAgICAgICAgQURDX0NMT0NLX0FTWU5DX0RJVjEKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX05PTkUgICAgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORQorI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HICAgIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9SSVNJTkcKKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19FREdFX0ZBTExJTkcgICBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VER0VfUklTSU5HRkFMTElORyBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORworI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVfNSAgICAgICAgIEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNQorCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWV9SRUcgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWQorI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5KICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfUkVHICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FT0NfSU5KICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9FT0MKKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUiAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQlVTWSAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9BV0QxCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEFEQ19DSEFOTkVMX1ZCQVRfRElWNCAgICAgICAgICAgQURDX0NIQU5ORUxfVkJBVAorI2VuZGlmIC8qIFNUTTMySDcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NFQ19BbGlhc2VkX0RlZmluZXMgSEFMIENFQyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0NFQ19HRVRfSVQgX19IQUxfQ0VDX0dFVF9GTEFHCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9EZWZpbmVzIEhBTCBDT01QIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFRCAgICAgICBDT01QX1dJTkRPV01PREVfRElTQUJMRQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFRCAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0VOQUJMRQorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMV9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDEKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDJfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVAyCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAzX0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QMworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QNF9FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDQKKyNkZWZpbmUgQ09NUF9FWFRJX0xJTkVfQ09NUDVfRVZFTlQgICAgIENPTVBfRVhUSV9MSU5FX0NPTVA1CisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVA2X0VWRU5UICAgICBDT01QX0VYVElfTElORV9DT01QNgorI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QN19FVkVOVCAgICAgQ09NUF9FWFRJX0xJTkVfQ09NUDcKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIENPTVBfTFBUSU1DT05ORUNUSU9OX0VOQUJMRUQgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSAgICAvKiE8IENPTVBYIG91dHB1dCBnZW5lcmljIG5hbWluZzogY29ubmVjdGVkIHRvIExQVElNIGlucHV0IDEgZm9yIENPTVAxLCBMUFRJTSBpbnB1dCAyIGZvciBDT01QMiAqLworI2VuZGlmCisjZGVmaW5lIENPTVBfT1VUUFVUX0NPTVA2VElNMk9DUkVGQ0xSICBDT01QX09VVFBVVF9DT01QNl9USU0yT0NSRUZDTFIKKyNpZiBkZWZpbmVkKFNUTTMyRjM3M3hDKSB8fCBkZWZpbmVkKFNUTTMyRjM3OHh4KQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zSUMxICAgICAgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM0lDMQorI2RlZmluZSBDT01QX09VVFBVVF9USU0zT0NSRUZDTFIgICAgICAgQ09NUF9PVVRQVVRfQ09NUDFfVElNM09DUkVGQ0xSCisjZW5kaWYgLyogU1RNMzJGMzczeEMgfHwgU1RNMzJGMzc4eHggKi8KKworI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX1dJTkRPV01PREVfRU5BQkxFICAgICAgICAgQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OCisKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzEgICAgICBDT01QX0lOUFVUX1BMVVNfSU8xCisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPMgorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPMyAgICAgIENPTVBfSU5QVVRfUExVU19JTzMKKyNkZWZpbmUgQ09NUF9OT05JTlZFUlRJTkdJTlBVVF9JTzQgICAgICBDT01QX0lOUFVUX1BMVVNfSU80CisjZGVmaW5lIENPTVBfTk9OSU5WRVJUSU5HSU5QVVRfSU81ICAgICAgQ09NUF9JTlBVVF9QTFVTX0lPNQorI2RlZmluZSBDT01QX05PTklOVkVSVElOR0lOUFVUX0lPNiAgICAgIENPTVBfSU5QVVRfUExVU19JTzYKKworI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzFfMlZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUXzNfNFZSRUZJTlQgIENPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX1ZSRUZJTlQgICAgIENPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzFfQ0gxICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDEKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9EQUMxX0NIMiAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfREFDMSAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19EQUMxX0NIMQorI2RlZmluZSBDT01QX0lOVkVSVElOR0lOUFVUX0RBQzIgICAgICAgIENPTVBfSU5QVVRfTUlOVVNfREFDMV9DSDIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzEgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMQorI2lmIGRlZmluZWQoU1RNMzJMMCkKKy8qIElzc3VlIGZpeGVkIG9uIFNUTTMyTDAgQ09NUCBkcml2ZXI6IG9ubHkgMiBkZWRpY2F0ZWQgSU8gKElPMSBhbmQgSU8yKSwgICAgICovCisvKiBJTzIgd2FzIHdyb25nbHkgYXNzaWduZWQgdG8gSU8gc2hhcmVkIHdpdGggREFDIGFuZCBJTzMgd2FzIGNvcnJlc3BvbmRpbmcgICAqLworLyogdG8gdGhlIHNlY29uZCBkZWRpY2F0ZWQgSU8gKG9ubHkgZm9yIENPTVAyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzIgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0RBQzFfQ0gyCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8zICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNlbHNlCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU8yICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzIKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzMgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPMworI2VuZGlmCisjZGVmaW5lIENPTVBfSU5WRVJUSU5HSU5QVVRfSU80ICAgICAgICAgQ09NUF9JTlBVVF9NSU5VU19JTzQKKyNkZWZpbmUgQ09NUF9JTlZFUlRJTkdJTlBVVF9JTzUgICAgICAgICBDT01QX0lOUFVUX01JTlVTX0lPNQorCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfTE9XICAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfTE9XCisjZGVmaW5lIENPTVBfT1VUUFVUTEVWRUxfSElHSCAgICAgICAgICAgQ09NUF9PVVRQVVRfTEVWRUxfSElHSAorCisvKiBOb3RlOiBMaXRlcmFsICJDT01QX0ZMQUdfTE9DSyIga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVG8gY2hlY2sgQ09NUCBsb2NrIHN0YXRlLCB1c2UgbWFjcm8gIl9fSEFMX0NPTVBfSVNfTE9DS0VEKCkiLiAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTVBfQ1NSX0xPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9MT0NLCisjZWxpZiBkZWZpbmVkKENPTVBfQ1NSX0NPTVAxTE9DSykKKyNkZWZpbmUgQ09NUF9GTEFHX0xPQ0sgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0NPTVAxTE9DSworI2VsaWYgZGVmaW5lZChDT01QX0NTUl9DT01QeExPQ0spCisjZGVmaW5lIENPTVBfRkxBR19MT0NLICAgICAgICAgICAgICAgICBDT01QX0NTUl9DT01QeExPQ0sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0xT0M1ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1X0NPTVAxCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTTJPQzMgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzNfQ09NUDEKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNM09DMyAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0zX09DM19DT01QMQorI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDRV9USU0zT0M0ICAgICAgICBDT01QX0JMQU5LSU5HU1JDX1RJTTNfT0M0X0NPTVAyCisjZGVmaW5lIENPTVBfQkxBTktJTkdTUkNFX1RJTThPQzUgICAgICAgIENPTVBfQkxBTktJTkdTUkNfVElNOF9PQzVfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfVElNMTVPQzEgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19USU0xNV9PQzFfQ09NUDIKKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ0VfTk9ORSAgICAgICAgICAgQ09NUF9CTEFOS0lOR1NSQ19OT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQKKyNkZWZpbmUgQ09NUF9NT0RFX0xPV1NQRUVEICAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUgorI2Vsc2UKKyNkZWZpbmUgQ09NUF9NT0RFX0hJR0hTUEVFRCAgICAgICAgICAgICAgQ09NUF9QT1dFUk1PREVfSElHSFNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9NRURJVU1TUEVFRCAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVECisjZGVmaW5lIENPTVBfTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICAgIENPTVBfUE9XRVJNT0RFX0xPV1BPV0VSCisjZGVmaW5lIENPTVBfTU9ERV9VTFRSQUxPV1BPV0VSICAgICAgICAgIENPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyNlbmRpZgorCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPUlRFWF9BbGlhc2VkX0RlZmluZXMgSEFMIENPUlRFWCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcgSEFMX1NZU1RJQ0tfQ0xLU291cmNlQ29uZmlnCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBDUkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRUQgICAgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUKKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0VOQUJMRUQgICAgIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfREFDX0FsaWFzZWRfRGVmaW5lcyBIQUwgREFDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgREFDMV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NIQU5ORUxfMQorI2RlZmluZSBEQUMxX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUNfQ0hBTk5FTF8yCisjZGVmaW5lIERBQzJfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBQ19DSEFOTkVMXzEKKyNkZWZpbmUgREFDX1dBVkVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgREFDX1dBVkVfTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzAKKyNkZWZpbmUgREFDX1dBVkVfVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFDX0NSX1dBVkUxXzEKKyNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfTk9ORQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fTk9JU0UgICAgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9OT0lTRQorI2RlZmluZSBEQUNfV0FWRUdFTkVSQVRJT05fVFJJQU5HTEUgICAgICAgICAgICAgICAgICAgICBEQUNfV0FWRV9UUklBTkdMRQorCisjaWYgZGVmaW5lZChTVE0zMkc0KQorI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRElTQUJMRSAgICAgICAoREFDX0NISVBDT05ORUNUX0VYVEVSTkFMIHwgREFDX0NISVBDT05ORUNUX0JPVEgpCisjZGVmaW5lIERBQ19DSElQQ09OTkVDVF9FTkFCTEUgICAgICAgIChEQUNfQ0hJUENPTk5FQ1RfSU5URVJOQUwgfCBEQUNfQ0hJUENPTk5FQ1RfQk9USCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJHMCkKKyNkZWZpbmUgSEFMX0RBQ19NU1BfSU5JVF9DQl9JRCAgICAgICBIQUxfREFDX01TUElOSVRfQ0JfSUQKKyNkZWZpbmUgSEFMX0RBQ19NU1BfREVJTklUX0NCX0lEICAgICBIQUxfREFDX01TUERFSU5JVF9DQl9JRAorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RNQV9BbGlhc2VkX0RlZmluZXMgSEFMIERNQSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfUkVNQVBETUFfQURDX0RNQV9DSDIgICAgICAgICAgICAgICAgRE1BX1JFTUFQX0FEQ19ETUFfQ0gyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDFfVFhfRE1BX0NINCAgICAgICAgICBETUFfUkVNQVBfVVNBUlQxX1RYX0RNQV9DSDQKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1VTQVJUMV9SWF9ETUFfQ0g1ICAgICAgICAgIERNQV9SRU1BUF9VU0FSVDFfUlhfRE1BX0NINQorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTZfRE1BX0NINCAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE2X0RNQV9DSDQKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1RJTTE3X0RNQV9DSDIgICAgICAgICAgICAgIERNQV9SRU1BUF9USU0xN19ETUFfQ0gyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDNfRE1BX0NIMzIgICAgICAgICAgICBETUFfUkVNQVBfVVNBUlQzX0RNQV9DSDMyCisjZGVmaW5lIEhBTF9SRU1BUERNQV9USU0xNl9ETUFfQ0g2ICAgICAgICAgICAgICBETUFfUkVNQVBfVElNMTZfRE1BX0NINgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMTdfRE1BX0NINyAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTE3X0RNQV9DSDcKKyNkZWZpbmUgSEFMX1JFTUFQRE1BX1NQSTJfRE1BX0NINjcgICAgICAgICAgICAgIERNQV9SRU1BUF9TUEkyX0RNQV9DSDY3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9VU0FSVDJfRE1BX0NINjcgICAgICAgICAgICBETUFfUkVNQVBfVVNBUlQyX0RNQV9DSDY3CisjZGVmaW5lIEhBTF9SRU1BUERNQV9JMkMxX0RNQV9DSDc2ICAgICAgICAgICAgICBETUFfUkVNQVBfSTJDMV9ETUFfQ0g3NgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMV9ETUFfQ0g2ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTFfRE1BX0NINgorI2RlZmluZSBIQUxfUkVNQVBETUFfVElNMl9ETUFfQ0g3ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTJfRE1BX0NINworI2RlZmluZSBIQUxfUkVNQVBETUFfVElNM19ETUFfQ0g2ICAgICAgICAgICAgICAgRE1BX1JFTUFQX1RJTTNfRE1BX0NINgorCisjZGVmaW5lIElTX0hBTF9SRU1BUERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfRE1BX1JFTUFQCisjZGVmaW5lIF9fSEFMX1JFTUFQRE1BX0NIQU5ORUxfRU5BQkxFICAgICAgICAgICAgX19IQUxfRE1BX1JFTUFQX0NIQU5ORUxfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JFTUFQRE1BX0NIQU5ORUxfRElTQUJMRSAgICAgICAgICAgX19IQUxfRE1BX1JFTUFQX0NIQU5ORUxfRElTQUJMRQorCisjaWYgZGVmaW5lZChTVE0zMkw0KQorCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMSAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTIgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkyCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkzICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNCAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTUgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk1CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk2ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJNgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJNyAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTcKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTggICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk4CisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEk5ICAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJOQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTAgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxMSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTEKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTEyICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMgorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9FWFRJMTMgICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRVhUSTEzCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkxNCAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9FWFRJMTQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRVhUSTE1ICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNQorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMF9FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDBfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gxX0VWVCAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDJfRVZUICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIM19FVlQgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDNfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMV9PVVQgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMl9PVVQgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RTSV9URSAgICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9EU0lfVEUKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRFNJX0VPVCAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RTSV9FT1QKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BMkRfRU9UICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQTJEX0VPVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MVERDX0lUICAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFREQ19JVAorCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fTk9fRVZFTlQgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HICAgICAgICAgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORworI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX0ZBTExJTkcgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HX0ZBTExJTkcgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HCisKKyNlbmRpZiAvKiBTVE0zMkw0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMSBETUFfUkVRVUVTVF9EQUMxX0NIMQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUMyIERNQV9SRVFVRVNUX0RBQzFfQ0gyCisKKyNkZWZpbmUgQkRNQV9SRVFVRVNUX0xQX1VBUlQxX1JYIEJETUFfUkVRVUVTVF9MUFVBUlQxX1JYCisjZGVmaW5lIEJETUFfUkVRVUVTVF9MUF9VQVJUMV9UWCBCRE1BX1JFUVVFU1RfTFBVQVJUMV9UWAorCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0RNQU1VWDFfQ0gwX0VWVCAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9ETUFNVVgxX0NIMV9FVlQgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9ETUFNVVgxX0NIMV9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fRE1BTVVYMV9DSDJfRVZUICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDJfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0xQVElNMV9PVVQgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRVUVTVF9HRU5fTFBUSU0yX09VVCAgICAgICAgIEhBTF9ETUFNVVgxX1JFUV9HRU5fTFBUSU0yX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFVRVNUX0dFTl9MUFRJTTNfT1VUICAgICAgICAgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTNfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUVVFU1RfR0VOX1RJTTEyX1RSR08gICAgICAgICBIQUxfRE1BTVVYMV9SRVFfR0VOX1RJTTEyX1RSR08KKworI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIMF9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIMF9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDFfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDFfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0gyX0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0gyX0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NIM19FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NIM19FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fRE1BTVVYMl9DSDRfRVZUICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fRE1BTVVYMl9DSDRfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0RNQU1VWDJfQ0g1X0VWVCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0RNQU1VWDJfQ0g1X0VWVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9ETUFNVVgyX0NINl9FVlQgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9ETUFNVVgyX0NINl9FVlQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9SWF9XS1VQICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9SWF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVUFSVDFfVFhfV0tVUCAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVUFSVDFfVFhfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTJfV0tVUCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFRJTTJfT1VUICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFRJTTJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19XS1VQICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNM19XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0xQVElNM19PVVQgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0xQVElNM19PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU00X1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU00X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBUSU01X1dLVVAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBUSU01X1dLVVAKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fSTJDNF9XS1VQICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fSTJDNF9XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfV0tVUCAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1NQSTZfV0tVUAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9DT01QMV9PVVQgICAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9DT01QMV9PVVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQ09NUDJfT1VUICAgICAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQ09NUDJfT1VUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1JUQ19XS1VQICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1JUQ19XS1VQCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkwICAgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0VYVEkwCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0VYVEkyICAgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0VYVEkyCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0kyQzRfSVRfRVZUICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0kyQzRfSVRfRVZUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX1NQSTZfSVQgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX1NQSTZfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fTFBVQVJUMV9UWF9JVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fTFBVQVJUMV9UWF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9MUFVBUlQxX1JYX0lUICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9MUFVBUlQxX1JYX0lUCisjZGVmaW5lIEhBTF9ETUFNVVgyX1JFUVVFU1RfR0VOX0FEQzNfSVQgICAgICAgICAgICBIQUxfRE1BTVVYMl9SRVFfR0VOX0FEQzNfSVQKKyNkZWZpbmUgSEFMX0RNQU1VWDJfUkVRVUVTVF9HRU5fQURDM19BV0QxX09VVCAgICAgIEhBTF9ETUFNVVgyX1JFUV9HRU5fQURDM19BV0QxX09VVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9CRE1BX0NIMF9JVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMF9JVAorI2RlZmluZSBIQUxfRE1BTVVYMl9SRVFVRVNUX0dFTl9CRE1BX0NIMV9JVCAgICAgICAgSEFMX0RNQU1VWDJfUkVRX0dFTl9CRE1BX0NIMV9JVAorCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fTk9fRVZFTlQgICAgICAgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9SSVNJTkcgICAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9SSVNJTkcKKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFVRVNUX0dFTl9GQUxMSU5HICAgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HX0ZBTExJTkcgICAgICBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcKKworI2RlZmluZSBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0xICAgICAgICAgICAgICAgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMV9PVVQKKyNkZWZpbmUgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMiAgICAgICAgICAgICAgIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTJfT1VUCisjZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTMgICAgICAgICAgICAgICBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0zX09VVAorCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9GTEFTSF9BbGlhc2VkX0RlZmluZXMgSEFMIEZMQVNIIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgVFlQRVBST0dSQU1fQllURSAgICAgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fQllURQorI2RlZmluZSBUWVBFUFJPR1JBTV9IQUxGV09SRCAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTV9XT1JEICAgICAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNX0RPVUJMRVdPUkQgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQKKyNkZWZpbmUgVFlQRUVSQVNFX1NFQ1RPUlMgICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX1NFQ1RPUlMKKyNkZWZpbmUgVFlQRUVSQVNFX1BBR0VTICAgICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFX1BBR0VTCisjZGVmaW5lIFRZUEVFUkFTRV9QQUdFRVJBU0UgICAgICAgICAgIEZMQVNIX1RZUEVFUkFTRV9QQUdFUworI2RlZmluZSBUWVBFRVJBU0VfTUFTU0VSQVNFICAgICAgICAgICBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFCisjZGVmaW5lIFdSUFNUQVRFX0RJU0FCTEUgICAgICAgICAgICAgIE9CX1dSUFNUQVRFX0RJU0FCTEUKKyNkZWZpbmUgV1JQU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgT0JfV1JQU1RBVEVfRU5BQkxFCisjZGVmaW5lIEhBTF9GTEFTSF9USU1FT1VUX1ZBTFVFICAgICAgIEZMQVNIX1RJTUVPVVRfVkFMVUUKKyNkZWZpbmUgT0JFWF9QQ1JPUCAgICAgICAgICAgICAgICAgICAgT1BUSU9OQllURV9QQ1JPUAorI2RlZmluZSBPQkVYX0JPT1RDT05GSUcgICAgICAgICAgICAgICBPUFRJT05CWVRFX0JPT1RDT05GSUcKKyNkZWZpbmUgUENST1BTVEFURV9ESVNBQkxFICAgICAgICAgICAgT0JfUENST1BfU1RBVEVfRElTQUJMRQorI2RlZmluZSBQQ1JPUFNUQVRFX0VOQUJMRSAgICAgICAgICAgICBPQl9QQ1JPUF9TVEFURV9FTkFCTEUKKyNkZWZpbmUgVFlQRUVSQVNFREFUQV9CWVRFICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFREFUQV9CWVRFCisjZGVmaW5lIFRZUEVFUkFTRURBVEFfSEFMRldPUkQgICAgICAgIEZMQVNIX1RZUEVFUkFTRURBVEFfSEFMRldPUkQKKyNkZWZpbmUgVFlQRUVSQVNFREFUQV9XT1JEICAgICAgICAgICAgRkxBU0hfVFlQRUVSQVNFREFUQV9XT1JECisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9CWVRFICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9CWVRFCisjZGVmaW5lIFRZUEVQUk9HUkFNREFUQV9IQUxGV09SRCAgICAgIEZMQVNIX1RZUEVQUk9HUkFNREFUQV9IQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfV09SRCAgICAgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVEJZVEUgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVEJZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1EQVRBX0ZBU1RIQUxGV09SRCAgRkxBU0hfVFlQRVBST0dSQU1EQVRBX0ZBU1RIQUxGV09SRAorI2RlZmluZSBUWVBFUFJPR1JBTURBVEFfRkFTVFdPUkQgICAgICBGTEFTSF9UWVBFUFJPR1JBTURBVEFfRkFTVFdPUkQKKyNkZWZpbmUgUEFHRVNJWkUgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfUEFHRV9TSVpFCisjZGVmaW5lIFRZUEVQUk9HUkFNX0ZBU1RCWVRFICAgICAgICAgIEZMQVNIX1RZUEVQUk9HUkFNX0JZVEUKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVEhBTEZXT1JEICAgICAgRkxBU0hfVFlQRVBST0dSQU1fSEFMRldPUkQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVFdPUkQgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fV09SRAorI2RlZmluZSBWT0xUQUdFX1JBTkdFXzEgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzEKKyNkZWZpbmUgVk9MVEFHRV9SQU5HRV8yICAgICAgICAgICAgICAgRkxBU0hfVk9MVEFHRV9SQU5HRV8yCisjZGVmaW5lIFZPTFRBR0VfUkFOR0VfMyAgICAgICAgICAgICAgIEZMQVNIX1ZPTFRBR0VfUkFOR0VfMworI2RlZmluZSBWT0xUQUdFX1JBTkdFXzQgICAgICAgICAgICAgICBGTEFTSF9WT0xUQUdFX1JBTkdFXzQKKyNkZWZpbmUgVFlQRVBST0dSQU1fRkFTVCAgICAgICAgICAgICAgRkxBU0hfVFlQRVBST0dSQU1fRkFTVAorI2RlZmluZSBUWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUICAgICBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUX0FORF9MQVNUCisjZGVmaW5lIFdSUEFSRUFfQkFOSzFfQVJFQUEgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUEKKyNkZWZpbmUgV1JQQVJFQV9CQU5LMV9BUkVBQiAgICAgICAgICAgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQgorI2RlZmluZSBXUlBBUkVBX0JBTksyX0FSRUFBICAgICAgICAgICBPQl9XUlBBUkVBX0JBTksyX0FSRUFBCisjZGVmaW5lIFdSUEFSRUFfQkFOSzJfQVJFQUIgICAgICAgICAgIE9CX1dSUEFSRUFfQkFOSzJfQVJFQUIKKyNkZWZpbmUgSVdER19TVERCWV9GUkVFWkUgICAgICAgICAgICAgT0JfSVdER19TVERCWV9GUkVFWkUKKyNkZWZpbmUgSVdER19TVERCWV9BQ1RJVkUgICAgICAgICAgICAgT0JfSVdER19TVERCWV9SVU4KKyNkZWZpbmUgSVdER19TVE9QX0ZSRUVaRSAgICAgICAgICAgICAgT0JfSVdER19TVE9QX0ZSRUVaRQorI2RlZmluZSBJV0RHX1NUT1BfQUNUSVZFICAgICAgICAgICAgICBPQl9JV0RHX1NUT1BfUlVOCisjZGVmaW5lIEZMQVNIX0VSUk9SX05PTkUgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9OT05FCisjZGVmaW5lIEZMQVNIX0VSUk9SX1JEICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9SRAorI2RlZmluZSBGTEFTSF9FUlJPUl9QRyAgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUFJPRworI2RlZmluZSBGTEFTSF9FUlJPUl9QR1AgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUEdTCisjZGVmaW5lIEZMQVNIX0VSUk9SX1dSUCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9XUlAKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1BUViAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QVFYKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1BUVlVTUiAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QVFZVU1IKKyNkZWZpbmUgRkxBU0hfRVJST1JfUFJPRyAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX1BST0cKKyNkZWZpbmUgRkxBU0hfRVJST1JfT1AgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX09QRVJBVElPTgorI2RlZmluZSBGTEFTSF9FUlJPUl9QR0EgICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfUEdBCisjZGVmaW5lIEZMQVNIX0VSUk9SX1NJWkUgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9TSVpFCisjZGVmaW5lIEZMQVNIX0VSUk9SX1NJWiAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9TSVpFCisjZGVmaW5lIEZMQVNIX0VSUk9SX1BHUyAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9QR1MKKyNkZWZpbmUgRkxBU0hfRVJST1JfTUlTICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX01JUworI2RlZmluZSBGTEFTSF9FUlJPUl9GQVNUICAgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfRkFTVAorI2RlZmluZSBGTEFTSF9FUlJPUl9GV1dFUlIgICAgICAgICAgICBIQUxfRkxBU0hfRVJST1JfRldXRVJSCisjZGVmaW5lIEZMQVNIX0VSUk9SX05PVFpFUk8gICAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9OT1RaRVJPCisjZGVmaW5lIEZMQVNIX0VSUk9SX09QRVJBVElPTiAgICAgICAgIEhBTF9GTEFTSF9FUlJPUl9PUEVSQVRJT04KKyNkZWZpbmUgRkxBU0hfRVJST1JfRVJTICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VSUk9SX0VSUworI2RlZmluZSBPQl9XREdfU1cgICAgICAgICAgICAgICAgICAgICBPQl9JV0RHX1NXCisjZGVmaW5lIE9CX1dER19IVyAgICAgICAgICAgICAgICAgICAgIE9CX0lXREdfSFcKKyNkZWZpbmUgT0JfU0RBREMxMl9WRERfTU9OSVRPUl9TRVQgICAgT0JfU0RBQ0RfVkREX01PTklUT1JfU0VUCisjZGVmaW5lIE9CX1NEQURDMTJfVkREX01PTklUT1JfUkVTRVQgIE9CX1NEQUNEX1ZERF9NT05JVE9SX1JFU0VUCisjZGVmaW5lIE9CX1JBTV9QQVJJVFlfQ0hFQ0tfU0VUICAgICAgIE9CX1NSQU1fUEFSSVRZX1NFVAorI2RlZmluZSBPQl9SQU1fUEFSSVRZX0NIRUNLX1JFU0VUICAgICBPQl9TUkFNX1BBUklUWV9SRVNFVAorI2RlZmluZSBJU19PQl9TREFEQzEyX1ZERF9NT05JVE9SICAgICBJU19PQl9TREFDRF9WRERfTU9OSVRPUgorI2RlZmluZSBPQl9SRFBfTEVWRUwwICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMAorI2RlZmluZSBPQl9SRFBfTEVWRUwxICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMQorI2RlZmluZSBPQl9SRFBfTEVWRUwyICAgICAgICAgICAgICAgICBPQl9SRFBfTEVWRUxfMgorI2lmIGRlZmluZWQoU1RNMzJHMCkKKyNkZWZpbmUgT0JfQk9PVF9MT0NLX0RJU0FCTEUgICAgICAgICAgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORQorI2RlZmluZSBPQl9CT09UX0xPQ0tfRU5BQkxFICAgICAgICAgICBPQl9CT09UX0VOVFJZX0ZPUkNFRF9GTEFTSAorI2Vsc2UKKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfTk9ORSAgICAgT0JfQk9PVF9MT0NLX0RJU0FCTEUKKyNkZWZpbmUgT0JfQk9PVF9FTlRSWV9GT1JDRURfRkxBU0ggICAgT0JfQk9PVF9MT0NLX0VOQUJMRQorI2VuZGlmCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBGTEFTSF9GTEFHX1NORUNDRV9CQU5LMVJSIEZMQVNIX0ZMQUdfU05FQ0NFUlJfQkFOSzEKKyNkZWZpbmUgRkxBU0hfRkxBR19EQkVDQ0VfQkFOSzFSUiBGTEFTSF9GTEFHX0RCRUNDRVJSX0JBTksxCisjZGVmaW5lIEZMQVNIX0ZMQUdfU1RSQkVSX0JBTksxUiAgRkxBU0hfRkxBR19TVFJCRVJSX0JBTksxCisjZGVmaW5lIEZMQVNIX0ZMQUdfU05FQ0NFX0JBTksyUlIgRkxBU0hfRkxBR19TTkVDQ0VSUl9CQU5LMgorI2RlZmluZSBGTEFTSF9GTEFHX0RCRUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfREJFQ0NFUlJfQkFOSzIKKyNkZWZpbmUgRkxBU0hfRkxBR19TVFJCRVJfQkFOSzJSICBGTEFTSF9GTEFHX1NUUkJFUlJfQkFOSzIKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9KUEVHX0FsaWFzZWRfTWFjcm9zIEhBTCBKUEVHIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfQ0xLX0VOQUJMRSAgICAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNFTl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19ESVNBQkxFICAgICAgICAgICAgICBfX0hBTF9SQ0NfSlBHREVDRU5fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfRk9SQ0VfUkVTRVQgICAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNSU1RfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX0pQRUdfUkVMRUFTRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19KUEdERUNSU1RfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfSlBFR19DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX0pQR0RFQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19KUEVHX0NMS19TTEVFUF9ESVNBQkxFICAgICAgICBfX0hBTF9SQ0NfSlBHREVDX0NMS19TTEVFUF9ESVNBQkxFCisjZW5kaWYgLyogU1RNMzJINyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TWVNDRkdfQWxpYXNlZF9EZWZpbmVzIEhBTCBTWVNDRkcgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEE5ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEE5CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQTEwICAgSTJDX0ZBU1RNT0RFUExVU19QQTEwCisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjYgICAgSTJDX0ZBU1RNT0RFUExVU19QQjYKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDX1BCNyAgICBJMkNfRkFTVE1PREVQTFVTX1BCNworI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkNfUEI4ICAgIEkyQ19GQVNUTU9ERVBMVVNfUEI4CisjZGVmaW5lIEhBTF9TWVNDRkdfRkFTVE1PREVQTFVTX0kyQ19QQjkgICAgSTJDX0ZBU1RNT0RFUExVU19QQjkKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMSAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzEKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMiAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzIKKyNkZWZpbmUgSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfSTJDMyAgICAgICBJMkNfRkFTVE1PREVQTFVTX0kyQzMKKyNpZiBkZWZpbmVkKFNUTTMyRzQpCisKKyNkZWZpbmUgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIgICAgSEFMX1NZU0NGR19FbmFibGVJT1N3aXRjaEJvb3N0ZXIKKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dTd2l0Y2hCb29zdGVyICAgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hCb29zdGVyCisjZGVmaW5lIEhBTF9TWVNDRkdfRW5hYmxlSU9BbmFsb2dTd2l0Y2hWREQgICAgICAgIEhBTF9TWVNDRkdfRW5hYmxlSU9Td2l0Y2hWREQKKyNkZWZpbmUgSEFMX1NZU0NGR19EaXNhYmxlSU9BbmFsb2dTd2l0Y2hWREQgICAgICAgSEFMX1NZU0NGR19EaXNhYmxlSU9Td2l0Y2hWREQKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgTExfRk1DX0FsaWFzZWRfRGVmaW5lcyBMTCBGTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkc0KQorI2RlZmluZSBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0RJU0FCTEUgICAgICAgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0RJU0FCTEUKKyNkZWZpbmUgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9FTkFCTEUgICAgICAgIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9FTkFCTEUKKyNkZWZpbmUgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfOCAgICAgICAgICAgIEZNQ19OQU5EX01FTV9CVVNfV0lEVEhfOAorI2RlZmluZSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF8xNiAgICAgICAgICAgRk1DX05BTkRfTUVNX0JVU19XSURUSF8xNgorI2VsaWYgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkY0KQorI2RlZmluZSBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRElTQUJMRSAgICAgICAgICAgRk1DX05BTkRfUENDX1dBSVRfRkVBVFVSRV9ESVNBQkxFCisjZGVmaW5lIEZNQ19OQU5EX1dBSVRfRkVBVFVSRV9FTkFCTEUgICAgICAgICAgICBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0VOQUJMRQorI2RlZmluZSBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzggICAgICAgICAgICAgICAgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfOAorI2RlZmluZSBGTUNfTkFORF9NRU1fQlVTX1dJRFRIXzE2ICAgICAgICAgICAgICAgRk1DX05BTkRfUENDX01FTV9CVVNfV0lEVEhfMTYKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMTF9GU01DX0FsaWFzZWRfRGVmaW5lcyBMTCBGU01DIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgRlNNQ19OT1JTUkFNX1RZUEVERUYgICAgICAgICAgICAgICAgICAgICAgRlNNQ19OT1JTUkFNX1R5cGVEZWYKKyNkZWZpbmUgRlNNQ19OT1JTUkFNX0VYVEVOREVEX1RZUEVERUYgICAgICAgICAgICAgRlNNQ19OT1JTUkFNX0VYVEVOREVEX1R5cGVEZWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0dQSU9fQWxpYXNlZF9NYWNyb3MgSEFMIEdQSU8gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBHRVRfR1BJT19TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0dFVF9JTkRFWAorI2RlZmluZSBHRVRfR1BJT19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0dFVF9JTkRFWAorCisjaWYgZGVmaW5lZChTVE0zMkY0KQorI2RlZmluZSBHUElPX0FGMTJfU0RNTUMgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RJTworI2RlZmluZSBHUElPX0FGMTJfU0RNTUMxICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTJfU0RJTworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NETU1DMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIEdQSU9fQUYxMl9TRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYxMl9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjEyX1NETU1DICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NETU1DMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEdQSU9fQUY3X1NESU8xICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUY3X1NETU1DMQorI2RlZmluZSBHUElPX0FGOF9TRElPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGOF9TRE1NQzEKKyNkZWZpbmUgR1BJT19BRjEyX1NESU8xICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEyX1NETU1DMQorI2RlZmluZSBHUElPX0FGOV9TRElPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGOV9TRE1NQzIKKyNkZWZpbmUgR1BJT19BRjEwX1NESU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEwX1NETU1DMgorI2RlZmluZSBHUElPX0FGMTFfU0RJTzIgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTFfU0RNTUMyCisjZW5kaWYKKworI2RlZmluZSBHUElPX0FGMF9MUFRJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMF9MUFRJTTEKKyNkZWZpbmUgR1BJT19BRjFfTFBUSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjFfTFBUSU0xCisjZGVmaW5lIEdQSU9fQUYyX0xQVElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYyX0xQVElNMQorCisjaWYgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSAgR1BJT19TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfTE9XCisjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9NRURJVU0KKyNkZWZpbmUgIEdQSU9fU1BFRURfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNkZWZpbmUgIEdQSU9fU1BFRURfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSAorI2VuZGlmIC8qIFNUTTMyTDAgfHwgU1RNMzJMNCB8fCBTVE0zMkY0IHx8IFNUTTMyRjIgfHwgU1RNMzJGNyB8fCBTVE0zMkc0IHx8IFNUTTMySDcqLworCisjaWYgZGVmaW5lZChTVE0zMkwxKQorICNkZWZpbmUgIEdQSU9fU1BFRURfVkVSWV9MT1cgICAgR1BJT19TUEVFRF9GUkVRX0xPVworICNkZWZpbmUgIEdQSU9fU1BFRURfTE9XICAgICAgICAgR1BJT19TUEVFRF9GUkVRX01FRElVTQorICNkZWZpbmUgIEdQSU9fU1BFRURfTUVESVVNICAgICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyAjZGVmaW5lICBHUElPX1NQRUVEX0hJR0ggICAgICAgIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkwxICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkYxKQorICNkZWZpbmUgIEdQSU9fU1BFRURfTE9XICAgIEdQSU9fU1BFRURfRlJFUV9MT1cKKyAjZGVmaW5lICBHUElPX1NQRUVEX01FRElVTSBHUElPX1NQRUVEX0ZSRVFfTUVESVVNCisgI2RlZmluZSAgR1BJT19TUEVFRF9ISUdIICAgR1BJT19TUEVFRF9GUkVRX0hJR0gKKyNlbmRpZiAvKiBTVE0zMkYwIHx8IFNUTTMyRjMgfHwgU1RNMzJGMSAqLworCisjZGVmaW5lIEdQSU9fQUY2X0RGU0RNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUY2X0RGU0RNMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSFJUSU1fQWxpYXNlZF9NYWNyb3MgSEFMIEhSVElNIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fRElTQUJMRUQgICAgICAgICAgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RJU0FCTEVECisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQyX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjY4ICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVEQk9USF9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjY4ICAgICBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9CQUxBTkNFRF9FRVY2CisjZGVmaW5lIEhSVElNX1RJTURFTEFZRURQUk9URUNUSU9OX0RFTEFZRURPVVQxX0RFRVY3OSBIUlRJTV9USU1FUl9BX0JfQ19ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMV9ERUVWNworI2RlZmluZSBIUlRJTV9USU1ERUxBWUVEUFJPVEVDVElPTl9ERUxBWUVET1VUMl9ERUVWNzkgSFJUSU1fVElNRVJfQV9CX0NfREVMQVlFRFBST1RFQ1RJT05fREVMQVlFRE9VVDJfREVFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fREVMQVlFREJPVEhfRUVWNzkgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0RFTEFZRURCT1RIX0VFVjcKKyNkZWZpbmUgSFJUSU1fVElNREVMQVlFRFBST1RFQ1RJT05fQkFMQU5DRURfRUVWNzkgICAgIEhSVElNX1RJTUVSX0FfQl9DX0RFTEFZRURQUk9URUNUSU9OX0JBTEFOQ0VEX0VFVjcKKworI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDb3VudGVyICAgICAgICBfX0hBTF9IUlRJTV9TRVRDT1VOVEVSCisjZGVmaW5lIF9fSEFMX0hSVElNX0dldENvdW50ZXIgICAgICAgIF9fSEFMX0hSVElNX0dFVENPVU5URVIKKyNkZWZpbmUgX19IQUxfSFJUSU1fU2V0UGVyaW9kICAgICAgICAgX19IQUxfSFJUSU1fU0VUUEVSSU9ECisjZGVmaW5lIF9fSEFMX0hSVElNX0dldFBlcmlvZCAgICAgICAgIF9fSEFMX0hSVElNX0dFVFBFUklPRAorI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9TRVRDTE9DS1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9HRVRDTE9DS1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDb21wYXJlICAgICAgICBfX0hBTF9IUlRJTV9TRVRDT01QQVJFCisjZGVmaW5lIF9fSEFMX0hSVElNX0dldENvbXBhcmUgICAgICAgIF9fSEFMX0hSVElNX0dFVENPTVBBUkUKKworI2lmIGRlZmluZWQoU1RNMzJHNCkKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyQ29uZmlnICAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJDb25maWcKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyRW5hYmxlICAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJFbmFibGUKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyRGlzYWJsZSAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJEaXNhYmxlCisjZGVmaW5lIEhBTF9IUlRJTV9FeHRlcm5hbEV2ZW50Q291bnRlclJlc2V0ICAgICBIQUxfSFJUSU1fRXh0RXZlbnRDb3VudGVyUmVzZXQKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JMkNfQWxpYXNlZF9EZWZpbmVzIEhBTCBJMkMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0RJU0FCTEVEICAgICAgICAgICAgICAgIEkyQ19EVUFMQUREUkVTU19ESVNBQkxFCisjZGVmaW5lIEkyQ19EVUFMQUREUkVTU19FTkFCTEVEICAgICAgICAgICAgICAgICBJMkNfRFVBTEFERFJFU1NfRU5BQkxFCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9ESVNBQkxFRCAgICAgICAgICAgICAgICBJMkNfR0VORVJBTENBTExfRElTQUJMRQorI2RlZmluZSBJMkNfR0VORVJBTENBTExfRU5BQkxFRCAgICAgICAgICAgICAgICAgSTJDX0dFTkVSQUxDQUxMX0VOQUJMRQorI2RlZmluZSBJMkNfTk9TVFJFVENIX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgSTJDX05PU1RSRVRDSF9ESVNBQkxFCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRU5BQkxFRCAgICAgICAgICAgICAgICAgICBJMkNfTk9TVFJFVENIX0VOQUJMRQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0VOQUJMRUQgICAgICAgICAgICAgICAgSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFRCAgICAgICAgICAgICAgIEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRQorI2lmIGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJGNykKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NRU1fQlVTWV9UWCAgICAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX01FTV9CVVNZX1JYICAgICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1JYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFggICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfVFgKKyNkZWZpbmUgSEFMX0kyQ19TVEFURV9NQVNURVJfQlVTWV9SWCAgICAgICAgICAgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWAorI2RlZmluZSBIQUxfSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFggICAgICAgICAgICAgSEFMX0kyQ19TVEFURV9CVVNZX1RYCisjZGVmaW5lIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9SWCAgICAgICAgICAgICBIQUxfSTJDX1NUQVRFX0JVU1lfUlgKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVJEQV9BbGlhc2VkX0RlZmluZXMgSEFMIElSREEgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCAgICAgICAgICAgIElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRUQgICAgICAgICAgICAgSVJEQV9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSVdER19BbGlhc2VkX0RlZmluZXMgSEFMIElXREcgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgS1JfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9SRUxPQUQKKyNkZWZpbmUgS1JfS0VZX0VOQUJMRSAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9FTkFCTEUKKyNkZWZpbmUgS1JfS0VZX0VXQSAgICAgICAgICAgICAgICAgICAgICBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRU5BQkxFCisjZGVmaW5lIEtSX0tFWV9EV0EgICAgICAgICAgICAgICAgICAgICAgSVdER19LRVlfV1JJVEVfQUNDRVNTX0RJU0FCTEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xQVElNX0FsaWFzZWRfRGVmaW5lcyBIQUwgTFBUSU0gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJU1RJT04gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04KKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lTVElPTlMgICAgIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR0VER0UgICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HRURHRSAgICAgICAgIExQVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORworI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX0JPVEhFREdFUyAgICAgICAgICAgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVNUSU9OICBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lTVElPTlMgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVNUSU9OUyAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJU1RJT05TICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TCisKKy8qIFRoZSBmb2xsb3dpbmcgMyBkZWZpbml0aW9uIGhhdmUgYWxzbyBiZWVuIHByZXNlbnQgaW4gYSB0ZW1wb3JhcnkgdmVyc2lvbiBvZiBscHRpbS5oICovCisvKiBUaGV5IG5lZWQgdG8gYmUgcmVuYW1lZCBhbHNvIHRvIHRoZSByaWdodCBuYW1lLCBqdXN0IGluIGNhc2UgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT04gICAgICAgIExQVElNX1RSSUdTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUworI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTiAgICAgICAgTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OICAgICAgICBMUFRJTV9UUklHU0FNUExFVElNRV84VFJBTlNJVElPTlMKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTkFORF9BbGlhc2VkX0RlZmluZXMgSEFMIE5BTkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX05BTkRfUmVhZF9QYWdlICAgICAgICAgICAgICBIQUxfTkFORF9SZWFkX1BhZ2VfOGIKKyNkZWZpbmUgSEFMX05BTkRfV3JpdGVfUGFnZSAgICAgICAgICAgICBIQUxfTkFORF9Xcml0ZV9QYWdlXzhiCisjZGVmaW5lIEhBTF9OQU5EX1JlYWRfU3BhcmVBcmVhICAgICAgICAgSEFMX05BTkRfUmVhZF9TcGFyZUFyZWFfOGIKKyNkZWZpbmUgSEFMX05BTkRfV3JpdGVfU3BhcmVBcmVhICAgICAgICBIQUxfTkFORF9Xcml0ZV9TcGFyZUFyZWFfOGIKKworI2RlZmluZSBOQU5EX0FkZHJlc3NUeXBlZGVmICAgICAgICAgICAgIE5BTkRfQWRkcmVzc1R5cGVEZWYKKworI2RlZmluZSBfX0FSUkFZX0FERFJFU1MgICAgICAgICAgICAgICAgIEFSUkFZX0FERFJFU1MKKyNkZWZpbmUgX19BRERSXzFzdF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzFTVF9DWUNMRQorI2RlZmluZSBfX0FERFJfMm5kX0NZQ0xFICAgICAgICAgICAgICAgIEFERFJfMk5EX0NZQ0xFCisjZGVmaW5lIF9fQUREUl8zcmRfQ1lDTEUgICAgICAgICAgICAgICAgQUREUl8zUkRfQ1lDTEUKKyNkZWZpbmUgX19BRERSXzR0aF9DWUNMRSAgICAgICAgICAgICAgICBBRERSXzRUSF9DWUNMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfTk9SX0FsaWFzZWRfRGVmaW5lcyBIQUwgTk9SIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIE5PUl9TdGF0dXNUeXBlZGVmICAgICAgICAgICAgICBIQUxfTk9SX1N0YXR1c1R5cGVEZWYKKyNkZWZpbmUgTk9SX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX1NVQ0NFU1MKKyNkZWZpbmUgTk9SX09OR09JTkcgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX09OR09JTkcKKyNkZWZpbmUgTk9SX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIEhBTF9OT1JfU1RBVFVTX0VSUk9SCisjZGVmaW5lIE5PUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICBIQUxfTk9SX1NUQVRVU19USU1FT1VUCisKKyNkZWZpbmUgX19OT1JfV1JJVEUgICAgICAgICAgICAgICAgICAgIE5PUl9XUklURQorI2RlZmluZSBfX05PUl9BRERSX1NISUZUICAgICAgICAgICAgICAgTk9SX0FERFJfU0hJRlQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX09QQU1QX0FsaWFzZWRfRGVmaW5lcyBIQUwgT1BBTVAgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDAgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDEgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMQorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDIgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMgorI2RlZmluZSBPUEFNUF9OT05JTlZFUlRJTkdJTlBVVF9WUDMgICAgICAgICAgIE9QQU1QX05PTklOVkVSVElOR0lOUFVUX0lPMworCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDAgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfVlAxICAgICAgIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9JTzEKKyNkZWZpbmUgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX1ZQMiAgICAgICBPUEFNUF9TRUNfTk9OSU5WRVJUSU5HSU5QVVRfSU8yCisjZGVmaW5lIE9QQU1QX1NFQ19OT05JTlZFUlRJTkdJTlBVVF9WUDMgICAgICAgT1BBTVBfU0VDX05PTklOVkVSVElOR0lOUFVUX0lPMworCisjZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCAgICAgICAgICAgICAgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8wCisjZGVmaW5lIE9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICAgICAgT1BBTVBfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMCAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgSU9QQU1QX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICAgICBPUEFNUF9JTlZFUlRJTkdJTlBVVF9JTzEKKworI2RlZmluZSBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfVk0wICAgICAgICAgIE9QQU1QX1NFQ19JTlZFUlRJTkdJTlBVVF9JTzAKKyNkZWZpbmUgT1BBTVBfU0VDX0lOVkVSVElOR0lOUFVUX1ZNMSAgICAgICAgICBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfSU5WRVJUSU5HSU5QVVRfVklOTSAgICAgICAgICAgICBPUEFNUF9TRUNfSU5WRVJUSU5HSU5QVVRfSU8xCisKKyNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9OTyAgICAgICAgICAgICAgICAgICBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9OTworI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMCAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMAorI2RlZmluZSBPUEFNUF9QR0FDT05ORUNUX1ZNMSAgICAgICAgICAgICAgICAgIE9QQU1QX1BHQV9DT05ORUNUX0lOVkVSVElOR0lOUFVUX0lPMQorCisjaWYgZGVmaW5lZChTVE0zMkwxKSB8fCBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIEhBTF9PUEFNUF9NU1BfSU5JVF9DQl9JRCAgICAgICBIQUxfT1BBTVBfTVNQSU5JVF9DQl9JRAorI2RlZmluZSBIQUxfT1BBTVBfTVNQX0RFSU5JVF9DQl9JRCAgICAgSEFMX09QQU1QX01TUERFSU5JVF9DQl9JRAorI2VuZGlmCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSTJTX0FsaWFzZWRfRGVmaW5lcyBIQUwgSTJTIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEkyU19TVEFOREFSRF9QSElMTElQUyAgICAgIEkyU19TVEFOREFSRF9QSElMSVBTCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisgICNkZWZpbmUgSTJTX0lUX1RYRSAgICAgICAgICAgICAgIEkyU19JVF9UWFAKKyAgI2RlZmluZSBJMlNfSVRfUlhORSAgICAgICAgICAgICAgSTJTX0lUX1JYUAorCisgICNkZWZpbmUgSTJTX0ZMQUdfVFhFICAgICAgICAgICAgIEkyU19GTEFHX1RYUAorICAjZGVmaW5lIEkyU19GTEFHX1JYTkUgICAgICAgICAgICBJMlNfRkxBR19SWFAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KQorICAjZGVmaW5lIEkyU19DTE9DS19TWVNDTEsgICAgICAgICAgIEkyU19DTE9DS19QTEwKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUENDQVJEX0FsaWFzZWRfRGVmaW5lcyBIQUwgUENDQVJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKy8qIENvbXBhY3QgRmxhc2gtQVRBIHJlZ2lzdGVycyBkZXNjcmlwdGlvbiAqLworI2RlZmluZSBDRl9EQVRBICAgICAgICAgICAgICAgICAgICAgICBBVEFfREFUQQorI2RlZmluZSBDRl9TRUNUT1JfQ09VTlQgICAgICAgICAgICAgICBBVEFfU0VDVE9SX0NPVU5UCisjZGVmaW5lIENGX1NFQ1RPUl9OVU1CRVIgICAgICAgICAgICAgIEFUQV9TRUNUT1JfTlVNQkVSCisjZGVmaW5lIENGX0NZTElOREVSX0xPVyAgICAgICAgICAgICAgIEFUQV9DWUxJTkRFUl9MT1cKKyNkZWZpbmUgQ0ZfQ1lMSU5ERVJfSElHSCAgICAgICAgICAgICAgQVRBX0NZTElOREVSX0hJR0gKKyNkZWZpbmUgQ0ZfQ0FSRF9IRUFEICAgICAgICAgICAgICAgICAgQVRBX0NBUkRfSEVBRAorI2RlZmluZSBDRl9TVEFUVVNfQ01EICAgICAgICAgICAgICAgICBBVEFfU1RBVFVTX0NNRAorI2RlZmluZSBDRl9TVEFUVVNfQ01EX0FMVEVSTkFURSAgICAgICBBVEFfU1RBVFVTX0NNRF9BTFRFUk5BVEUKKyNkZWZpbmUgQ0ZfQ09NTU9OX0RBVEFfQVJFQSAgICAgICAgICAgQVRBX0NPTU1PTl9EQVRBX0FSRUEKKworLyogQ29tcGFjdCBGbGFzaC1BVEEgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0ZfUkVBRF9TRUNUT1JfQ01EICAgICAgICAgICAgQVRBX1JFQURfU0VDVE9SX0NNRAorI2RlZmluZSBDRl9XUklURV9TRUNUT1JfQ01EICAgICAgICAgICBBVEFfV1JJVEVfU0VDVE9SX0NNRAorI2RlZmluZSBDRl9FUkFTRV9TRUNUT1JfQ01EICAgICAgICAgICBBVEFfRVJBU0VfU0VDVE9SX0NNRAorI2RlZmluZSBDRl9JREVOVElGWV9DTUQgICAgICAgICAgICAgICBBVEFfSURFTlRJRllfQ01ECisKKyNkZWZpbmUgUENDQVJEX1N0YXR1c1R5cGVkZWYgICAgICAgICAgSEFMX1BDQ0FSRF9TdGF0dXNUeXBlRGVmCisjZGVmaW5lIFBDQ0FSRF9TVUNDRVNTICAgICAgICAgICAgICAgIEhBTF9QQ0NBUkRfU1RBVFVTX1NVQ0NFU1MKKyNkZWZpbmUgUENDQVJEX09OR09JTkcgICAgICAgICAgICAgICAgSEFMX1BDQ0FSRF9TVEFUVVNfT05HT0lORworI2RlZmluZSBQQ0NBUkRfRVJST1IgICAgICAgICAgICAgICAgICBIQUxfUENDQVJEX1NUQVRVU19FUlJPUgorI2RlZmluZSBQQ0NBUkRfVElNRU9VVCAgICAgICAgICAgICAgICBIQUxfUENDQVJEX1NUQVRVU19USU1FT1VUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9EZWZpbmVzIEhBTCBSVEMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBGT1JNQVRfQklOICAgICAgICAgICAgICAgICAgUlRDX0ZPUk1BVF9CSU4KKyNkZWZpbmUgRk9STUFUX0JDRCAgICAgICAgICAgICAgICAgIFJUQ19GT1JNQVRfQkNECisKKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19Ob25lICAgICBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUKKyNkZWZpbmUgUlRDX1RBTVBFUkVSQVNFQkFDS1VQX0RJU0FCTEVEICBSVENfVEFNUEVSX0VSQVNFX0JBQ0tVUF9ESVNBQkxFCisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRUQgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFCisjZGVmaW5lIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFRCAgICAgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEUKKworI2RlZmluZSBSVENfTUFTS1RBTVBFUkZMQUdfRElTQUJMRUQgICAgIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRQorI2RlZmluZSBSVENfTUFTS1RBTVBFUkZMQUdfRU5BQkxFRCAgICAgIFJUQ19UQU1QRVJNQVNLX0ZMQUdfRU5BQkxFCisjZGVmaW5lIFJUQ19UQU1QRVJFUkFTRUJBQ0tVUF9FTkFCTEVEICAgUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFCisjZGVmaW5lIFJUQ19UQU1QRVIxXzJfSU5URVJSVVBUICAgICAgICAgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUCisjZGVmaW5lIFJUQ19UQU1QRVIxXzJfM19JTlRFUlJVUFQgICAgICAgUlRDX0FMTF9UQU1QRVJfSU5URVJSVVBUCisKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QQzEzICBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUFBJTl9QQTAgUlRDX1RJTUVTVEFNUFBJTl9QT1MxCisjZGVmaW5lIFJUQ19USU1FU1RBTVBQSU5fUEk4IFJUQ19USU1FU1RBTVBQSU5fUE9TMQorI2RlZmluZSBSVENfVElNRVNUQU1QUElOX1BDMSAgIFJUQ19USU1FU1RBTVBQSU5fUE9TMgorCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfUEMxMyAgUlRDX09VVFBVVF9SRU1BUF9OT05FCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfUEIxNCAgUlRDX09VVFBVVF9SRU1BUF9QT1MxCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfUEIyICAgUlRDX09VVFBVVF9SRU1BUF9QT1MxCisKKyNkZWZpbmUgUlRDX1RBTVBFUlBJTl9QQzEzIFJUQ19UQU1QRVJQSU5fREVGQVVMVAorI2RlZmluZSBSVENfVEFNUEVSUElOX1BBMCAgUlRDX1RBTVBFUlBJTl9QT1MxCisjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEk4ICBSVENfVEFNUEVSUElOX1BPUzEKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9TTUFSVENBUkRfQWxpYXNlZF9EZWZpbmVzIEhBTCBTTUFSVENBUkQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX05BQ0tfRU5BQkxFRCAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9OQUNLX0VOQUJMRQorI2RlZmluZSBTTUFSVENBUkRfTkFDS19ESVNBQkxFRCAgICAgICAgICAgICAgICAgU01BUlRDQVJEX05BQ0tfRElTQUJMRQorCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVCSVRfU0FNUExJTkdfRElTQUJMRUQgICAgICBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0VOQUJMRUQgICAgICAgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRQorI2RlZmluZSBTTUFSVENBUkRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEUgICAgICAgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgU01BUlRDQVJEX09ORUJJVF9TQU1QTElOR19FTkFCTEUgICAgICAgIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKworI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9ESVNBQkxFRCAgICAgICAgICAgICAgU01BUlRDQVJEX1RJTUVPVVRfRElTQUJMRQorI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEVEICAgICAgICAgICAgICAgU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFCisKKyNkZWZpbmUgU01BUlRDQVJEX0xBU1RCSVRfRElTQUJMRUQgICAgICAgICAgICAgIFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEUKKyNkZWZpbmUgU01BUlRDQVJEX0xBU1RCSVRfRU5BQkxFRCAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9MQVNUQklUX0VOQUJMRQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9TTUJVU19BbGlhc2VkX0RlZmluZXMgSEFMIFNNQlVTIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX0RVQUxBRERSRVNTX0RJU0FCTEVEICAgICAgU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRQorI2RlZmluZSBTTUJVU19EVUFMQUREUkVTU19FTkFCTEVEICAgICAgIFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRQorI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFRCAgICAgIFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfR0VORVJBTENBTExfRU5BQkxFRCAgICAgICBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUKKyNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0RJU0FCTEVEICAgICAgICBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRQorI2RlZmluZSBTTUJVU19OT1NUUkVUQ0hfRU5BQkxFRCAgICAgICAgIFNNQlVTX05PU1RSRVRDSF9FTkFCTEUKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRUQgICAgICBTTUJVU19BTkFMT0dGSUxURVJfRU5BQkxFCisjZGVmaW5lIFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFRCAgICAgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUKKyNkZWZpbmUgU01CVVNfUEVDX0RJU0FCTEVEICAgICAgICAgICAgICBTTUJVU19QRUNfRElTQUJMRQorI2RlZmluZSBTTUJVU19QRUNfRU5BQkxFRCAgICAgICAgICAgICAgIFNNQlVTX1BFQ19FTkFCTEUKKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0xJU1RFTiAgICBIQUxfU01CVVNfU1RBVEVfTElTVEVOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TUElfQWxpYXNlZF9EZWZpbmVzIEhBTCBTUEkgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX1RJTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICBTUElfVElNT0RFX0RJU0FCTEUKKyNkZWZpbmUgU1BJX1RJTU9ERV9FTkFCTEVEICAgICAgICAgICAgICBTUElfVElNT0RFX0VOQUJMRQorCisjZGVmaW5lIFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFRCAgICAgU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUKKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRUQgICAgICBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFCisKKyNkZWZpbmUgU1BJX05TU19QVUxTRV9ESVNBQkxFRCAgICAgICAgICBTUElfTlNTX1BVTFNFX0RJU0FCTEUKKyNkZWZpbmUgU1BJX05TU19QVUxTRV9FTkFCTEVEICAgICAgICAgICBTUElfTlNTX1BVTFNFX0VOQUJMRQorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorCisgI2RlZmluZSBTUElfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgIFNQSV9GTEFHX1RYUAorICNkZWZpbmUgU1BJX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICBTUElfRkxBR19SWFAKKworICNkZWZpbmUgU1BJX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICBTUElfSVRfVFhQCisgI2RlZmluZSBTUElfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9JVF9SWFAKKworICNkZWZpbmUgU1BJX0ZSTFZMX0VNUFRZICAgICAgICAgICAgICAgICBTUElfUlhfRklGT18wUEFDS0VUCisgI2RlZmluZSBTUElfRlJMVkxfUVVBUlRFUl9GVUxMICAgICAgICAgIFNQSV9SWF9GSUZPXzFQQUNLRVQKKyAjZGVmaW5lIFNQSV9GUkxWTF9IQUxGX0ZVTEwgICAgICAgICAgICAgU1BJX1JYX0ZJRk9fMlBBQ0tFVAorICNkZWZpbmUgU1BJX0ZSTFZMX0ZVTEwgICAgICAgICAgICAgICAgICBTUElfUlhfRklGT18zUEFDS0VUCisKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJTV9BbGlhc2VkX0RlZmluZXMgSEFMIFRJTSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDQ0VSX0NDeEVfTUFTSyAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQ3hFX01BU0sKKyNkZWZpbmUgQ0NFUl9DQ3hORV9NQVNLICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0N4TkVfTUFTSworCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NSMSAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NSMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DUjIgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfU01DUiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfU01DUgorI2RlZmluZSBUSU1fRE1BQmFzZV9ESUVSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9ESUVSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1NSICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1NSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0VHUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0VHUgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMSAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ01SMQorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ01SMiAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ01SMgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ0VSICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ0VSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NOVCAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NOVAorI2RlZmluZSBUSU1fRE1BQmFzZV9QU0MgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9QU0MKKyNkZWZpbmUgVElNX0RNQUJhc2VfQVJSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQVJSCisjZGVmaW5lIFRJTV9ETUFCYXNlX1JDUiAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX1JDUgorI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1IxICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSMyAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSMworI2RlZmluZSBUSU1fRE1BQmFzZV9DQ1I0ICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9DQ1I0CisjZGVmaW5lIFRJTV9ETUFCYXNlX0JEVFIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0JEVFIKKyNkZWZpbmUgVElNX0RNQUJhc2VfRENSICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfRENSCisjZGVmaW5lIFRJTV9ETUFCYXNlX0RNQVIgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0RNQVIKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IxICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IxCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDTVIzICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDTVIzCisjZGVmaW5lIFRJTV9ETUFCYXNlX0NDUjUgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX0NDUjUKKyNkZWZpbmUgVElNX0RNQUJhc2VfQ0NSNiAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfQ0NSNgorI2RlZmluZSBUSU1fRE1BQmFzZV9PUjIgICAgICAgICAgICAgICAgICBUSU1fRE1BQkFTRV9PUjIKKyNkZWZpbmUgVElNX0RNQUJhc2VfT1IzICAgICAgICAgICAgICAgICAgVElNX0RNQUJBU0VfT1IzCisjZGVmaW5lIFRJTV9ETUFCYXNlX09SICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCQVNFX09SCisKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1VwZGF0ZSAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX1VQREFURQorI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0MxICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0MxCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DQzIgICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DQzIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0NDMyAgICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0NDMworI2RlZmluZSBUSU1fRXZlbnRTb3VyY2VfQ0M0ICAgICAgICAgICAgICBUSU1fRVZFTlRTT1VSQ0VfQ0M0CisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9DT00gICAgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9DT00KKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX1RyaWdnZXIgICAgICAgICAgVElNX0VWRU5UU09VUkNFX1RSSUdHRVIKKyNkZWZpbmUgVElNX0V2ZW50U291cmNlX0JyZWFrICAgICAgICAgICAgVElNX0VWRU5UU09VUkNFX0JSRUFLCisjZGVmaW5lIFRJTV9FdmVudFNvdXJjZV9CcmVhazIgICAgICAgICAgIFRJTV9FVkVOVFNPVVJDRV9CUkVBSzIKKworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMVRyYW5zZmVyICAgICBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8yVHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF8yVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8zVHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF80VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF80VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF81VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF81VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF82VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF83VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF83VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF84VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF84VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF85VHJhbnNmZXJzICAgIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xMFRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTFUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTFUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzEyVHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzEyVFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xM1RyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTRUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTRUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE1VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE1VFJBTlNGRVJTCisjZGVmaW5lIFRJTV9ETUFCdXJzdExlbmd0aF8xNlRyYW5zZmVycyAgIFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUworI2RlZmluZSBUSU1fRE1BQnVyc3RMZW5ndGhfMTdUcmFuc2ZlcnMgICBUSU1fRE1BQlVSU1RMRU5HVEhfMTdUUkFOU0ZFUlMKKyNkZWZpbmUgVElNX0RNQUJ1cnN0TGVuZ3RoXzE4VHJhbnNmZXJzICAgVElNX0RNQUJVUlNUTEVOR1RIXzE4VFJBTlNGRVJTCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZGVmaW5lIFRJTTIyX1RJMV9HUElPMSAgIFRJTTIyX1RJMV9HUElPCisjZGVmaW5lIFRJTTIyX1RJMV9HUElPMiAgIFRJTTIyX1RJMV9HUElPCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGMykKKyNkZWZpbmUgSVNfVElNX0hBTExfSU5URVJGQUNFX0lOU1RBTkNFICAgSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIFRJTV9USU0xX0VUUl9DT01QMV9PVVQgICAgICAgIFRJTV9USU0xX0VUUl9DT01QMQorI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDJfT1VUICAgICAgICBUSU1fVElNMV9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTThfRVRSX0NPTVAxX09VVCAgICAgICAgVElNX1RJTThfRVRSX0NPTVAxCisjZGVmaW5lIFRJTV9USU04X0VUUl9DT01QMl9PVVQgICAgICAgIFRJTV9USU04X0VUUl9DT01QMgorI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDFfT1VUICAgICAgICBUSU1fVElNMl9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAyX09VVCAgICAgICAgVElNX1RJTTJfRVRSX0NPTVAyCisjZGVmaW5lIFRJTV9USU0zX0VUUl9DT01QMV9PVVQgICAgICAgIFRJTV9USU0zX0VUUl9DT01QMQorI2RlZmluZSBUSU1fVElNMV9USTFfQ09NUDFfT1VUICAgICAgICBUSU1fVElNMV9USTFfQ09NUDEKKyNkZWZpbmUgVElNX1RJTThfVEkxX0NPTVAyX09VVCAgICAgICAgVElNX1RJTThfVEkxX0NPTVAyCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMV9PVVQgICAgICAgIFRJTV9USU0yX1RJNF9DT01QMQorI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDJfT1VUICAgICAgICBUSU1fVElNMl9USTRfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxQ09NUDJfT1VUICAgVElNX1RJTTJfVEk0X0NPTVAxX0NPTVAyCisjZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QMV9PVVQgICAgICAgIFRJTV9USU0zX1RJMV9DT01QMQorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDJfT1VUICAgICAgICBUSU1fVElNM19USTFfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVAxQ09NUDJfT1VUICAgVElNX1RJTTNfVEkxX0NPTVAxX0NPTVAyCisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVFNDX0FsaWFzZWRfRGVmaW5lcyBIQUwgVFNDIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19TWU5DX1BPTF9GQUxMICAgICAgICBUU0NfU1lOQ19QT0xBUklUWV9GQUxMSU5HCisjZGVmaW5lIFRTQ19TWU5DX1BPTF9SSVNFX0hJR0ggICBUU0NfU1lOQ19QT0xBUklUWV9SSVNJTkcKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9EZWZpbmVzIEhBTCBVQVJUIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0RJU0FCTEVEICAgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFCisjZGVmaW5lIFVBUlRfT05FQklUX1NBTVBMSU5HX0VOQUJMRUQgICAgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFRCAgICBVQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEVEICAgICBVQVJUX09ORV9CSVRfU0FNUExFX0VOQUJMRQorCisjZGVmaW5lIF9fSEFMX1VBUlRfT05FQklUX0VOQUJMRSAgICAgICAgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUKKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVCSVRfRElTQUJMRSAgICAgICBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUKKworI2RlZmluZSBfX0RJVl9TQU1QTElORzE2ICAgICAgICAgICAgICAgIFVBUlRfRElWX1NBTVBMSU5HMTYKKyNkZWZpbmUgX19ESVZNQU5UX1NBTVBMSU5HMTYgICAgICAgICAgICBVQVJUX0RJVk1BTlRfU0FNUExJTkcxNgorI2RlZmluZSBfX0RJVkZSQVFfU0FNUExJTkcxNiAgICAgICAgICAgIFVBUlRfRElWRlJBUV9TQU1QTElORzE2CisjZGVmaW5lIF9fVUFSVF9CUlJfU0FNUExJTkcxNiAgICAgICAgICAgVUFSVF9CUlJfU0FNUExJTkcxNgorCisjZGVmaW5lIF9fRElWX1NBTVBMSU5HOCAgICAgICAgICAgICAgICAgVUFSVF9ESVZfU0FNUExJTkc4CisjZGVmaW5lIF9fRElWTUFOVF9TQU1QTElORzggICAgICAgICAgICAgVUFSVF9ESVZNQU5UX1NBTVBMSU5HOAorI2RlZmluZSBfX0RJVkZSQVFfU0FNUExJTkc4ICAgICAgICAgICAgIFVBUlRfRElWRlJBUV9TQU1QTElORzgKKyNkZWZpbmUgX19VQVJUX0JSUl9TQU1QTElORzggICAgICAgICAgICBVQVJUX0JSUl9TQU1QTElORzgKKworI2RlZmluZSBfX0RJVl9MUFVBUlQgICAgICAgICAgICAgICAgICAgIFVBUlRfRElWX0xQVUFSVAorCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9ERV9JRExFTElORSAgICAgVUFSVF9XQUtFVVBNRVRIT0RfSURMRUxJTkUKKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RFX0FERFJFU1NNQVJLICBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VTQVJUX0FsaWFzZWRfRGVmaW5lcyBIQUwgVVNBUlQgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFRCAgICAgICAgICAgIFVTQVJUX0NMT0NLX0RJU0FCTEUKKyNkZWZpbmUgVVNBUlRfQ0xPQ0tfRU5BQkxFRCAgICAgICAgICAgICBVU0FSVF9DTE9DS19FTkFCTEUKKworI2RlZmluZSBVU0FSVE5BQ0tfRU5BQkxFRCAgICAgICAgICAgICAgIFVTQVJUX05BQ0tfRU5BQkxFCisjZGVmaW5lIFVTQVJUTkFDS19ESVNBQkxFRCAgICAgICAgICAgICAgVVNBUlRfTkFDS19ESVNBQkxFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9XV0RHX0FsaWFzZWRfRGVmaW5lcyBIQUwgV1dERyBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBDRlJfQkFTRSAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfQkFTRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DQU5fQWxpYXNlZF9EZWZpbmVzIEhBTCBDQU4gQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8wICAgICAgICAgICAgIENBTl9GSUxURVJfRklGTzAKKyNkZWZpbmUgQ0FOX0ZpbHRlckZJRk8xICAgICAgICAgICAgIENBTl9GSUxURVJfRklGTzEKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AwICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AxICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgQ0FOX0lUX1JRQ1AyICAgICAgICAgICAgICAgIENBTl9JVF9UTUUKKyNkZWZpbmUgSU5BS19USU1FT1VUICAgICAgICAgICAgICAgIENBTl9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIFNMQUtfVElNRU9VVCAgICAgICAgICAgICAgICBDQU5fVElNRU9VVF9WQUxVRQorI2RlZmluZSBDQU5fVFhTVEFUVVNfRkFJTEVEICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBDQU5fVFhTVEFUVVNfT0sgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBDQU5fVFhTVEFUVVNfUEVORElORyAgICAgICAgKCh1aW50OF90KTB4MDJVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9EZWZpbmVzIEhBTCBFVEggQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBWTEFOX1RBRyAgICAgICAgICAgICAgICBFVEhfVkxBTl9UQUcKKyNkZWZpbmUgTUlOX0VUSF9QQVlMT0FEICAgICAgICAgRVRIX01JTl9FVEhfUEFZTE9BRAorI2RlZmluZSBNQVhfRVRIX1BBWUxPQUQgICAgICAgICBFVEhfTUFYX0VUSF9QQVlMT0FECisjZGVmaW5lIEpVTUJPX0ZSQU1FX1BBWUxPQUQgICAgIEVUSF9KVU1CT19GUkFNRV9QQVlMT0FECisjZGVmaW5lIE1BQ01JSUFSX0NSX01BU0sgICAgICAgIEVUSF9NQUNNSUlBUl9DUl9NQVNLCisjZGVmaW5lIE1BQ0NSX0NMRUFSX01BU0sgICAgICAgIEVUSF9NQUNDUl9DTEVBUl9NQVNLCisjZGVmaW5lIE1BQ0ZDUl9DTEVBUl9NQVNLICAgICAgIEVUSF9NQUNGQ1JfQ0xFQVJfTUFTSworI2RlZmluZSBETUFPTVJfQ0xFQVJfTUFTSyAgICAgICBFVEhfRE1BT01SX0NMRUFSX01BU0sKKworI2RlZmluZSBFVEhfTU1DQ1IgICAgICAgICAgICAgIDB4MDAwMDAxMDBVCisjZGVmaW5lIEVUSF9NTUNSSVIgICAgICAgICAgICAgMHgwMDAwMDEwNFUKKyNkZWZpbmUgRVRIX01NQ1RJUiAgICAgICAgICAgICAweDAwMDAwMTA4VQorI2RlZmluZSBFVEhfTU1DUklNUiAgICAgICAgICAgIDB4MDAwMDAxMENVCisjZGVmaW5lIEVUSF9NTUNUSU1SICAgICAgICAgICAgMHgwMDAwMDExMFUKKyNkZWZpbmUgRVRIX01NQ1RHRlNDQ1IgICAgICAgICAweDAwMDAwMTRDVQorI2RlZmluZSBFVEhfTU1DVEdGTVNDQ1IgICAgICAgIDB4MDAwMDAxNTBVCisjZGVmaW5lIEVUSF9NTUNUR0ZDUiAgICAgICAgICAgMHgwMDAwMDE2OFUKKyNkZWZpbmUgRVRIX01NQ1JGQ0VDUiAgICAgICAgICAweDAwMDAwMTk0VQorI2RlZmluZSBFVEhfTU1DUkZBRUNSICAgICAgICAgIDB4MDAwMDAxOThVCisjZGVmaW5lIEVUSF9NTUNSR1VGQ1IgICAgICAgICAgMHgwMDAwMDFDNFUKKworI2RlZmluZSBFVEhfTUFDX1RYRklGT19GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwVSAgLyogVHggRklGTyBmdWxsICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPTk9UX0VNUFRZICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBVICAvKiBUeCBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19XUklURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwVSAgLyogVHggRklGTyB3cml0ZSBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IElkbGUgKi8KKyNkZWZpbmUgRVRIX01BQ19UWEZJRk9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFUgIC8qIFR4IEZJRk8gcmVhZCBzdGF0dXM6IFJlYWQgKHRyYW5zZmVycmluZyBkYXRhIHRvIHRoZSBNQUMgdHJhbnNtaXR0ZXIpICovCisjZGVmaW5lIEVUSF9NQUNfVFhGSUZPX1dBSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVICAvKiBUeCBGSUZPIHJlYWQgc3RhdHVzOiBXYWl0aW5nIGZvciBUeFN0YXR1cyBmcm9tIE1BQyB0cmFuc21pdHRlciAqLworI2RlZmluZSBFVEhfTUFDX1RYRklGT19XUklUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAwMDAwVSAgLyogVHggRklGTyByZWFkIHN0YXR1czogV3JpdGluZyB0aGUgcmVjZWl2ZWQgVHhTdGF0dXMgb3IgZmx1c2hpbmcgdGhlIFR4RklGTyAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlTU0lPTl9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVSAgLyogTUFDIHRyYW5zbWl0dGVyIGluIHBhdXNlICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfSURMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogSWRsZSAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX1dBSVRJTkcgICAgICAgICAweDAwMDIwMDAwVSAgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IFdhaXRpbmcgZm9yIFN0YXR1cyBvZiBwcmV2aW91cyBmcmFtZSBvciBJRkcvYmFja29mZiBwZXJpb2QgdG8gYmUgb3ZlciAqLworI2RlZmluZSBFVEhfTUFDX1RSQU5TTUlURlJBTUVDT05UUk9MTEVSX0dFTlJBVElOR19QQ0YgICAweDAwMDQwMDAwVSAgLyogTUFDIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2xsZXI6IEdlbmVyYXRpbmcgYW5kIHRyYW5zbWl0dGluZyBhIFBhdXNlIGNvbnRyb2wgZnJhbWUgKGluIGZ1bGwgZHVwbGV4IG1vZGUpICovCisjZGVmaW5lIEVUSF9NQUNfVFJBTlNNSVRGUkFNRUNPTlRST0xMRVJfVFJBTlNGRVJSSU5HICAgIDB4MDAwNjAwMDBVICAvKiBNQUMgdHJhbnNtaXQgZnJhbWUgY29udHJvbGxlcjogVHJhbnNmZXJyaW5nIGlucHV0IGZyYW1lIGZvciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgRVRIX01BQ19NSUlfVFJBTlNNSVRfQUNUSVZFICAgICAgICAgICAweDAwMDEwMDAwVSAgLyogTUFDIE1JSSB0cmFuc21pdCBlbmdpbmUgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfUlhGSUZPX0VNUFRZICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIFJ4IEZJRk8gZmlsbCBsZXZlbDogZW1wdHkgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fQkVMT1dfVEhSRVNIT0xEICAgICAgICAweDAwMDAwMTAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGJlbG93IGZsb3ctY29udHJvbCBkZS1hY3RpdmF0ZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fQUJPVkVfVEhSRVNIT0xEICAgICAgICAweDAwMDAwMjAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmaWxsLWxldmVsIGFib3ZlIGZsb3ctY29udHJvbCBhY3RpdmF0ZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRVRIX01BQ19SWEZJRk9fRlVMTCAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwVSAgLyogUnggRklGTyBmaWxsIGxldmVsOiBmdWxsICovCisjaWYgZGVmaW5lZChTVE0zMkYxKQorI2Vsc2UKKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9JRExFICAgICAgICAgICAweDAwMDAwMDAwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgSURMRSBzdGF0ZSAqLworI2RlZmluZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1JFQURJTkdfREFUQSAgIDB4MDAwMDAwMjBVICAvKiBSeCBGSUZPIHJlYWQgY29udHJvbGxlciBSZWFkaW5nIGZyYW1lIGRhdGEgKi8KKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9SRUFESU5HX1NUQVRVUyAweDAwMDAwMDQwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgUmVhZGluZyBmcmFtZSBzdGF0dXMgKG9yIHRpbWUtc3RhbXApICovCisjZW5kaWYKKyNkZWZpbmUgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9GTFVTSElORyAgICAgICAweDAwMDAwMDYwVSAgLyogUnggRklGTyByZWFkIGNvbnRyb2xsZXIgRmx1c2hpbmcgdGhlIGZyYW1lIGRhdGEgYW5kIHN0YXR1cyAqLworI2RlZmluZSBFVEhfTUFDX1JYRklGT19XUklURV9BQ1RJVkUgICAgICAgICAgIDB4MDAwMDAwMTBVICAvKiBSeCBGSUZPIHdyaXRlIGNvbnRyb2xsZXIgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19OT1RBQ1RJVkUgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgLyB3cml0ZSBjb250cm9sbGVycyBub3QgYWN0aXZlICovCisjZGVmaW5lIEVUSF9NQUNfU01BTExfRklGT19SRUFEX0FDVElWRSAgICAgICAgMHgwMDAwMDAwMlUgIC8qIE1BQyBzbWFsbCBGSUZPIHJlYWQgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1dSSVRFX0FDVElWRSAgICAgICAweDAwMDAwMDA0VSAgLyogTUFDIHNtYWxsIEZJRk8gd3JpdGUgY29udHJvbGxlciBhY3RpdmUgKi8KKyNkZWZpbmUgRVRIX01BQ19TTUFMTF9GSUZPX1JXX0FDVElWRSAgICAgICAgICAweDAwMDAwMDA2VSAgLyogTUFDIHNtYWxsIEZJRk8gcmVhZCAvIHdyaXRlIGNvbnRyb2xsZXJzIGFjdGl2ZSAqLworI2RlZmluZSBFVEhfTUFDX01JSV9SRUNFSVZFX1BST1RPQ09MX0FDVElWRSAgIDB4MDAwMDAwMDFVICAvKiBNQUMgTUlJIHJlY2VpdmUgcHJvdG9jb2wgZW5naW5lIGFjdGl2ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQ01JX0FsaWFzZWRfRGVmaW5lcyBIQUwgRENNSSBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRENNSV9FUlJPUl9PVkYgICAgICBIQUxfRENNSV9FUlJPUl9PVlIKKyNkZWZpbmUgRENNSV9JVF9PVkYgICAgICAgICAgICAgRENNSV9JVF9PVlIKKyNkZWZpbmUgRENNSV9GTEFHX09WRlJJICAgICAgICAgRENNSV9GTEFHX09WUlJJCisjZGVmaW5lIERDTUlfRkxBR19PVkZNSSAgICAgICAgIERDTUlfRkxBR19PVlJNSQorCisjZGVmaW5lIEhBTF9EQ01JX0NvbmZpZ0NST1AgICAgIEhBTF9EQ01JX0NvbmZpZ0Nyb3AKKyNkZWZpbmUgSEFMX0RDTUlfRW5hYmxlQ1JPUCAgICAgSEFMX0RDTUlfRW5hYmxlQ3JvcAorI2RlZmluZSBIQUxfRENNSV9EaXNhYmxlQ1JPUCAgICBIQUxfRENNSV9EaXNhYmxlQ3JvcAorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJGNDI3eHgpIHx8IGRlZmluZWQoU1RNMzJGNDM3eHgpIFwKKyAgfHwgZGVmaW5lZChTVE0zMkY0Mjl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Mzl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Njl4eCkgfHwgZGVmaW5lZChTVE0zMkY0Nzl4eCkgXAorICB8fCBkZWZpbmVkKFNUTTMySDcpCisvKiogQGRlZmdyb3VwIEhBTF9ETUEyRF9BbGlhc2VkX0RlZmluZXMgSEFMIERNQTJEIEFsaWFzZWQgRGVmaW5lcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQTJEX0FSR0I4ODg4ICAgICAgICAgIERNQTJEX09VVFBVVF9BUkdCODg4OAorI2RlZmluZSBETUEyRF9SR0I4ODggICAgICAgICAgICBETUEyRF9PVVRQVVRfUkdCODg4CisjZGVmaW5lIERNQTJEX1JHQjU2NSAgICAgICAgICAgIERNQTJEX09VVFBVVF9SR0I1NjUKKyNkZWZpbmUgRE1BMkRfQVJHQjE1NTUgICAgICAgICAgRE1BMkRfT1VUUFVUX0FSR0IxNTU1CisjZGVmaW5lIERNQTJEX0FSR0I0NDQ0ICAgICAgICAgIERNQTJEX09VVFBVVF9BUkdCNDQ0NAorCisjZGVmaW5lIENNX0FSR0I4ODg4ICAgICAgICAgICAgIERNQTJEX0lOUFVUX0FSR0I4ODg4CisjZGVmaW5lIENNX1JHQjg4OCAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX1JHQjg4OAorI2RlZmluZSBDTV9SR0I1NjUgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9SR0I1NjUKKyNkZWZpbmUgQ01fQVJHQjE1NTUgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQVJHQjE1NTUKKyNkZWZpbmUgQ01fQVJHQjQ0NDQgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQVJHQjQ0NDQKKyNkZWZpbmUgQ01fTDggICAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfTDgKKyNkZWZpbmUgQ01fQUw0NCAgICAgICAgICAgICAgICAgRE1BMkRfSU5QVVRfQUw0NAorI2RlZmluZSBDTV9BTDg4ICAgICAgICAgICAgICAgICBETUEyRF9JTlBVVF9BTDg4CisjZGVmaW5lIENNX0w0ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0w0CisjZGVmaW5lIENNX0E4ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0E4CisjZGVmaW5lIENNX0E0ICAgICAgICAgICAgICAgICAgIERNQTJEX0lOUFVUX0E0CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmICAvKiBTVE0zMkw0IHx8ICBTVE0zMkY3IHx8ICBTVE0zMkY0IHx8ICBTVE0zMkg3ICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX0RlZmluZXMgSEFMIFBQUCBBbGlhc2VkIERlZmluZXMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhBTF9DUllQX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBDUllQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sgICAgIEhBTF9DUllQRXhfQ29tcHV0YXRpb25DcGx0Q2FsbGJhY2sKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0hBU0hfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhBU0ggQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSEFTSF9TVEFURVR5cGVEZWYgICAgICAgIEhBTF9IQVNIX1N0YXRlVHlwZURlZgorI2RlZmluZSBIQUxfSEFTSFBoYXNlVHlwZURlZiAgICAgICAgIEhBTF9IQVNIX1BoYXNlVHlwZURlZgorI2RlZmluZSBIQUxfSE1BQ19NRDVfRmluaXNoICAgICAgICAgIEhBTF9IQVNIX01ENV9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMV9GaW5pc2ggICAgICAgICBIQUxfSEFTSF9TSEExX0ZpbmlzaAorI2RlZmluZSBIQUxfSE1BQ19TSEEyMjRfRmluaXNoICAgICAgIEhBTF9IQVNIX1NIQTIyNF9GaW5pc2gKKyNkZWZpbmUgSEFMX0hNQUNfU0hBMjU2X0ZpbmlzaCAgICAgICBIQUxfSEFTSF9TSEEyNTZfRmluaXNoCisKKy8qSEFTSCBBbGdvcml0aG0gU2VsZWN0aW9uKi8KKworI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMSAgICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEExCisjZGVmaW5lIEhBU0hfQWxnb1NlbGVjdGlvbl9TSEEyMjQgICAgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTIyNAorI2RlZmluZSBIQVNIX0FsZ29TZWxlY3Rpb25fU0hBMjU2ICAgIEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYKKyNkZWZpbmUgSEFTSF9BbGdvU2VsZWN0aW9uX01ENSAgICAgICBIQVNIX0FMR09TRUxFQ1RJT05fTUQ1CisKKyNkZWZpbmUgSEFTSF9BbGdvTW9kZV9IQVNIICAgICAgICAgSEFTSF9BTEdPTU9ERV9IQVNICisjZGVmaW5lIEhBU0hfQWxnb01vZGVfSE1BQyAgICAgICAgIEhBU0hfQUxHT01PREVfSE1BQworCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfU2hvcnRLZXkgIEhBU0hfSE1BQ19LRVlUWVBFX1NIT1JUS0VZCisjZGVmaW5lIEhBU0hfSE1BQ0tleVR5cGVfTG9uZ0tleSAgIEhBU0hfSE1BQ19LRVlUWVBFX0xPTkdLRVkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBHZW5lcmljIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0VuYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1NsZWVwTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUKKyNkZWZpbmUgSEFMX0VuYWJsZURCR1N0b3BNb2RlIEhBTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUKKyNkZWZpbmUgSEFMX0Rpc2FibGVEQkdTdG9wTW9kZSBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZQorI2RlZmluZSBIQUxfRW5hYmxlREJHU3RhbmRieU1vZGUgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZQorI2RlZmluZSBIQUxfRGlzYWJsZURCR1N0YW5kYnlNb2RlIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EQkdfTG93UG93ZXJDb25maWcoUGVyaXBoLCBjbWQpICgoKGNtZCk9PUVOQUJMRSk/IEhBTF9EQkdNQ1VfREJHX0VuYWJsZUxvd1Bvd2VyQ29uZmlnKFBlcmlwaCkgOiBIQUxfREJHTUNVX0RCR19EaXNhYmxlTG93UG93ZXJDb25maWcoUGVyaXBoKSkKKyNkZWZpbmUgSEFMX1ZSRUZJTlRfT3V0cHV0U2VsZWN0ICBIQUxfU1lTQ0ZHX1ZSRUZJTlRfT3V0cHV0U2VsZWN0CisjZGVmaW5lIEhBTF9Mb2NrX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSkgPyBIQUxfU1lTQ0ZHX0VuYWJsZV9Mb2NrX1ZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZV9Mb2NrX1ZSRUZJTlQoKSkKKyNpZiBkZWZpbmVkKFNUTTMyTDApCisjZWxzZQorI2RlZmluZSBIQUxfVlJFRklOVF9DbWQoY21kKSAoKChjbWQpPT1FTkFCTEUpPyBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZJTlQoKSA6IEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZJTlQoKSkKKyNlbmRpZgorI2RlZmluZSBIQUxfQURDX0VuYWJsZUJ1ZmZlcl9DbWQoY21kKSAgKCgoY21kKT09RU5BQkxFKSA/IEhBTF9BRENFeF9FbmFibGVWUkVGSU5UKCkgOiBIQUxfQURDRXhfRGlzYWJsZVZSRUZJTlQoKSkKKyNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJTZW5zb3JfQ21kKGNtZCkgKCgoY21kKT09RU5BQkxFKSA/ICBIQUxfQURDRXhfRW5hYmxlVlJFRklOVFRlbXBTZW5zb3IoKSA6IEhBTF9BRENFeF9EaXNhYmxlVlJFRklOVFRlbXBTZW5zb3IoKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBGTEFTSCBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0hhbGZQYWdlUHJvZ3JhbSAgICAgIEhBTF9GTEFTSEV4X0hhbGZQYWdlUHJvZ3JhbQorI2RlZmluZSBGTEFTSF9FbmFibGVSdW5Qb3dlckRvd24gICBIQUxfRkxBU0hFeF9FbmFibGVSdW5Qb3dlckRvd24KKyNkZWZpbmUgRkxBU0hfRGlzYWJsZVJ1blBvd2VyRG93biAgSEFMX0ZMQVNIRXhfRGlzYWJsZVJ1blBvd2VyRG93bgorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9VbmxvY2sgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1VubG9jaworI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Mb2NrICAgICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX0xvY2sKKyNkZWZpbmUgSEFMX0RBVEFfRUVQUk9NRXhfRXJhc2UgICAgSEFMX0ZMQVNIRXhfREFUQUVFUFJPTV9FcmFzZQorI2RlZmluZSBIQUxfREFUQV9FRVBST01FeF9Qcm9ncmFtICBIQUxfRkxBU0hFeF9EQVRBRUVQUk9NX1Byb2dyYW0KKworIC8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgSTJDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0kyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICAgICBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9JMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgICAgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKyNkZWZpbmUgSEFMX0ZNUEkyQ0V4X0FuYWxvZ0ZpbHRlcl9Db25maWcgICAgICBIQUxfRk1QSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyCisjZGVmaW5lIEhBTF9GTVBJMkNFeF9EaWdpdGFsRmlsdGVyX0NvbmZpZyAgICAgSEFMX0ZNUEkyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIKKworI2RlZmluZSBIQUxfSTJDRmFzdE1vZGVQbHVzQ29uZmlnKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKTogSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykpCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgICBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVAorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgICBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgICBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUCisjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEKKyNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSAgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfRE1BCisjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgICBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQQorI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJXQiAgfHwgU1RNMzJHMCB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJMMCB8fCBTVE0zMkw0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgIEhBTF9GTVBJMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfRk1QSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgICBIQUxfRk1QSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVAorI2RlZmluZSBIQUxfRk1QSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgICBIQUxfRk1QSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVAorI2RlZmluZSBIQUxfRk1QSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgICBIQUxfRk1QSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUCisjZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BIEhBTF9GTVBJMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEKKyNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSAgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfRE1BCisjZGVmaW5lIEhBTF9GTVBJMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgIEhBTF9GTVBJMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQQorI2RlZmluZSBIQUxfRk1QSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgICBIQUxfRk1QSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQQorI2VuZGlmIC8qIFNUTTMyRjQgKi8KKyAvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QV1JfQWxpYXNlZCBIQUwgUFdSIEFsaWFzZWQgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfUFdSX1BWRENvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUl9Db25maWdQVkQKKyNkZWZpbmUgSEFMX1BXUl9EaXNhYmxlQmtVcFJlZyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlQmtVcFJlZworI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVGbGFzaFBvd2VyRG93biAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVGbGFzaFBvd2VyRG93bgorI2RlZmluZSBIQUxfUFdSX0Rpc2FibGVWZGRpbzJNb25pdG9yICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVWZGRpbzJNb25pdG9yCisjZGVmaW5lIEhBTF9QV1JfRW5hYmxlQmtVcFJlZyAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlQmtVcFJlZworI2RlZmluZSBIQUxfUFdSX0VuYWJsZUZsYXNoUG93ZXJEb3duICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUZsYXNoUG93ZXJEb3duCisjZGVmaW5lIEhBTF9QV1JfRW5hYmxlVmRkaW8yTW9uaXRvciAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlVmRkaW8yTW9uaXRvcgorI2RlZmluZSBIQUxfUFdSX1BWRF9QVk1fSVJRSGFuZGxlciAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X1BWRF9QVk1fSVJRSGFuZGxlcgorI2RlZmluZSBIQUxfUFdSX1BWRExldmVsQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BXUl9Db25maWdQVkQKKyNkZWZpbmUgSEFMX1BXUl9WZGRpbzJNb25pdG9yX0lSUUhhbmRsZXIgICAgICAgICAgICAgIEhBTF9QV1JFeF9WZGRpbzJNb25pdG9yX0lSUUhhbmRsZXIKKyNkZWZpbmUgSEFMX1BXUl9WZGRpbzJNb25pdG9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9WZGRpbzJNb25pdG9yQ2FsbGJhY2sKKyNkZWZpbmUgSEFMX1BXUkV4X0FjdGl2YXRlT3ZlckRyaXZlICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVPdmVyRHJpdmUKKyNkZWZpbmUgSEFMX1BXUkV4X0RlYWN0aXZhdGVPdmVyRHJpdmUgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlT3ZlckRyaXZlCisjZGVmaW5lIEhBTF9QV1JFeF9EaXNhYmxlU0RBRENBbmFsb2cgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVNEQURDCisjZGVmaW5lIEhBTF9QV1JFeF9FbmFibGVTREFEQ0FuYWxvZyAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlU0RBREMKKyNkZWZpbmUgSEFMX1BXUkV4X1BWTUNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9Db25maWdQVk0KKworI2RlZmluZSBQV1JfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX05PUk1BTAorI2RlZmluZSBQV1JfTU9ERV9JVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0lUX1JJU0lORworI2RlZmluZSBQV1JfTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0lUX0ZBTExJTkcKKyNkZWZpbmUgUFdSX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0VWRU5UX1JJU0lORworI2RlZmluZSBQV1JfTU9ERV9FVkVOVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgICAgUFdSX1BWRF9NT0RFX0VWRU5UX0ZBTExJTkcKKyNkZWZpbmUgUFdSX01PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAgICAgIFBXUl9QVkRfTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORworCisjZGVmaW5lIENSX09GRlNFVF9CQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfQ1JfT0ZGU0VUX0JCCisjZGVmaW5lIENTUl9PRkZTRVRfQkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfQ1NSX09GRlNFVF9CQgorI2RlZmluZSBQTU9ERV9CSVRfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0JJVF9OVU1CRVIKKyNkZWZpbmUgQ1JfUE1PREVfQkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSX1ZPU19CQgorCisjZGVmaW5lIERCUF9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlBfQklUX05VTUJFUgorI2RlZmluZSBQVkRFX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZERV9CSVRfTlVNQkVSCisjZGVmaW5lIFBNT0RFX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTU9ERV9CSVRfTlVNQkVSCisjZGVmaW5lIEVXVVBfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFV1VQX0JJVF9OVU1CRVIKKyNkZWZpbmUgRlBEU19CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQRFNfQklUX05VTUJFUgorI2RlZmluZSBPREVOX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0RFTl9CSVRfTlVNQkVSCisjZGVmaW5lIE9EU1dFTl9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRFNXRU5fQklUX05VTUJFUgorI2RlZmluZSBNUkxWRFNfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVJMVkRTX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFBMVkRTX0JpdE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTFZEU19CSVRfTlVNQkVSCisjZGVmaW5lIEJSRV9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUkVfQklUX05VTUJFUgorCisjZGVmaW5lIFBXUl9NT0RFX0VWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfUFZEX01PREVfTk9STUFMCisKKyAvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TTUJVU19BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgU01CVVMgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU01CVVNfU2xhdmVfTGlzdGVuX0lUICAgICAgICAgIEhBTF9TTUJVU19FbmFibGVMaXN0ZW5fSVQKKyNkZWZpbmUgSEFMX1NNQlVTX1NsYXZlQWRkckNhbGxiYWNrICAgICAgICBIQUxfU01CVVNfQWRkckNhbGxiYWNrCisjZGVmaW5lIEhBTF9TTUJVU19TbGF2ZUxpc3RlbkNwbHRDYWxsYmFjayAgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBTUEkgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU1BJX0ZsdXNoUnhGaWZvICAgICAgICAgICAgICAgIEhBTF9TUElFeF9GbHVzaFJ4RmlmbworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBUSU0gQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfVElNX0RNQURlbGF5UHVsc2VDcGx0ICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BRGVsYXlQdWxzZUNwbHQKKyNkZWZpbmUgSEFMX1RJTV9ETUFFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RNQUVycm9yCisjZGVmaW5lIEhBTF9USU1fRE1BQ2FwdHVyZUNwbHQgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFDYXB0dXJlQ3BsdAorI2RlZmluZSBIQUxfVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0ICAgICAgICAgICAgICAgICAgICBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJMMCkKKyNkZWZpbmUgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbiAgICAgICAgICAgICAgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm8KKyNkZWZpbmUgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9uaXphdGlvbl9JVCAgICAgICAgICAgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm9fSVQKKyNkZWZpbmUgSEFMX1RJTUV4X0NvbW11dGF0aW9uQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgSEFMX1RJTUV4X0NvbW11dENhbGxiYWNrCisjZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50ICAgICAgICAgICAgICAgIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudAorI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudF9JVCAgICAgICAgICAgICBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQKKyNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnRfRE1BICAgICAgICAgICAgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0RNQQorI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJHMCB8fCBTVE0zMkY3IHx8IFNUTTMyRjQgIHx8IFNUTTMyTDAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1VBUlRfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIFVBUlQgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfVUFSVF9XYWtldXBDYWxsYmFjayBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9MVERDX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBMVERDIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0xURENfTGluZUV2ZW5DYWxsYmFjayBIQUxfTFREQ19MaW5lRXZlbnRDYWxsYmFjaworI2RlZmluZSBIQUxfTFREQ19SZWxhb2QgICAgICAgICAgIEhBTF9MVERDX1JlbG9hZAorI2RlZmluZSBIQUxfTFREQ19TdHJ1Y3RJbml0RnJvbVZpZGVvQ29uZmlnICBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcKKyNkZWZpbmUgSEFMX0xURENfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZyAgSEFMX0xURENFeF9TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX0Z1bmN0aW9ucyBIQUwgUFBQIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0FFU19BbGlhc2VkX01hY3JvcyBIQUwgQ1JZUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIEFFU19JVF9DQyAgICAgICAgICAgICAgICAgICAgICBDUllQX0lUX0NDCisjZGVmaW5lIEFFU19JVF9FUlIgICAgICAgICAgICAgICAgICAgICBDUllQX0lUX0VSUgorI2RlZmluZSBBRVNfRkxBR19DQ0YgICAgICAgICAgICAgICAgICAgQ1JZUF9GTEFHX0NDRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfQWxpYXNlZF9NYWNyb3MgSEFMIEdlbmVyaWMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9HRVRfQk9PVF9NT0RFICAgICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19HRVRfQk9PVF9NT0RFCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZMQVNIICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNICisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNIICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNICisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX1NSQU0gICAgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NSQU0KKyNkZWZpbmUgX19IQUxfUkVNQVBNRU1PUllfRk1DICAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfUkVNQVBNRU1PUllfRk1DCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX0ZNQ19TRFJBTSAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZNQ19TRFJBTQorI2RlZmluZSBfX0hBTF9SRU1BUE1FTU9SWV9GU01DICAgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19SRU1BUE1FTU9SWV9GU01DCisjZGVmaW5lIF9fSEFMX1JFTUFQTUVNT1JZX1FVQURTUEkgICAgICAgICAgICAgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1FVQURTUEkKKyNkZWZpbmUgX19IQUxfRk1DX0JBTksgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfRk1DX0JBTksKKyNkZWZpbmUgX19IQUxfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9WUkVGSU5UX09VVF9FTkFCTEUgICAgICAgICAgICAgIF9fSEFMX1NZU0NGR19WUkVGSU5UX09VVF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfVlJFRklOVF9PVVRfRElTQUJMRSAgICAgICAgICAgICBfX0hBTF9TWVNDRkdfVlJFRklOVF9PVVRfRElTQUJMRQorI2RlZmluZSBfX0hBTF9TWVNDRkdfU1JBTTJfV1JQX0VOQUJMRSAgICAgICAgIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfMF8zMV9FTkFCTEUKKworI2RlZmluZSBTWVNDRkdfRkxBR19WUkVGX1JFQURZICAgICAgICAgICAgICAgIFNZU0NGR19GTEFHX1ZSRUZJTlRfUkVBRFkKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfUkM0OCAgICAgICAgICAgICAgICAgICAgICBSQ0NfRkxBR19IU0k0OAorI2RlZmluZSBJU19TWVNDRkdfRkFTVE1PREVQTFVTX0NPTkZJRyAgICAgICAgIElTX0kyQ19GQVNUTU9ERVBMVVMKKyNkZWZpbmUgVUZCX01PREVfQml0TnVtYmVyICAgICAgICAgICAgICAgICAgICBVRkJfTU9ERV9CSVRfTlVNQkVSCisjZGVmaW5lIENNUF9QRF9CaXROdW1iZXIgICAgICAgICAgICAgICAgICAgICAgQ01QX1BEX0JJVF9OVU1CRVIKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9BRENfQWxpYXNlZF9NYWNyb3MgSEFMIEFEQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fQURDX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFCisjZGVmaW5lIF9fQURDX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRQorI2RlZmluZSBfX0hBTF9BRENfRU5BQkxJTkdfQ09ORElUSU9OUyAgICAgICAgICAgICAgICAgICAgQURDX0VOQUJMSU5HX0NPTkRJVElPTlMKKyNkZWZpbmUgX19IQUxfQURDX0RJU0FCTElOR19DT05ESVRJT05TICAgICAgICAgICAgICAgICAgIEFEQ19ESVNBQkxJTkdfQ09ORElUSU9OUworI2RlZmluZSBfX0hBTF9BRENfSVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lTX0VOQUJMRQorI2RlZmluZSBfX0FEQ19JU19FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lTX0VOQUJMRQorI2RlZmluZSBfX0hBTF9BRENfSVNfU09GVFdBUkVfU1RBUlRfUkVHVUxBUiAgICAgICAgICAgICAgQURDX0lTX1NPRlRXQVJFX1NUQVJUX1JFR1VMQVIKKyNkZWZpbmUgX19IQUxfQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEICAgICAgICAgICAgIEFEQ19JU19TT0ZUV0FSRV9TVEFSVF9JTkpFQ1RFRAorI2RlZmluZSBfX0hBTF9BRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVJfSU5KRUNURUQgQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19SRUdVTEFSX0lOSkVDVEVECisjZGVmaW5lIF9fSEFMX0FEQ19JU19DT05WRVJTSU9OX09OR09JTkdfUkVHVUxBUiAgICAgICAgICBBRENfSVNfQ09OVkVSU0lPTl9PTkdPSU5HX1JFR1VMQVIKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lOR19JTkpFQ1RFRCAgICAgICAgIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkdfSU5KRUNURUQKKyNkZWZpbmUgX19IQUxfQURDX0lTX0NPTlZFUlNJT05fT05HT0lORyAgICAgICAgICAgICAgICAgIEFEQ19JU19DT05WRVJTSU9OX09OR09JTkcKKyNkZWZpbmUgX19IQUxfQURDX0NMRUFSX0VSUk9SQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUKKworI2RlZmluZSBfX0hBTF9BRENfR0VUX1JFU09MVVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgQURDX0dFVF9SRVNPTFVUSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9SSworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9BV0QxQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIX1NISUZUCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0FXRDIzQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QyM0NSCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9BVVRPX0NPTlZFUlNJT04gICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfQVVUT19DT05WRVJTSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFICAgICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRQorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX1JFR19ESVNDQ09OVElOVU9VUyAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRUdfRElTQ0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NGR1JfRElTQ09OVElOVU9VU19OVU0gICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RJU0NPTlRJTlVPVVNfTlVNCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSX0FVVE9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BVVRPV0FJVAorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9DT05USU5VT1VTICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfT1ZFUlJVTgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9ETUFDT05UUkVRICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BQ09OVFJFUQorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUl9FWFRTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRVhUU0VMX1NFVAorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9KRVhUU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTF9TRVQKKyNkZWZpbmUgX19IQUxfQURDX09GUl9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19PRlJfQ0hBTk5FTAorI2RlZmluZSBfX0hBTF9BRENfRElGU0VMX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0RJRlNFTF9DSEFOTkVMCisjZGVmaW5lIF9fSEFMX0FEQ19DQUxGQUNUX0RJRkZfU0VUICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0FMRkFDVF9ESUZGX1NFVAorI2RlZmluZSBfX0hBTF9BRENfQ0FMRkFDVF9ESUZGX0dFVCAgICAgICAgICAgICAgICAgICAgICAgQURDX0NBTEZBQ1RfRElGRl9HRVQKKyNkZWZpbmUgX19IQUxfQURDX1RSWF9ISUdIVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgIEFEQ19UUlhfSElHSFRIUkVTSE9MRAorCisjZGVmaW5lIF9fSEFMX0FEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTiAgICAgICAgICAgICAgICBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTiAgICAgICAgIEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04KKyNkZWZpbmUgX19IQUxfQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04gICAgICAgIEFEQ19BV0QyM1RIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OCisjZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ09NTU9OX1JFR0lTVEVSCisjZGVmaW5lIF9fSEFMX0FEQ19DT01NT05fQ0NSX01VTFRJICAgICAgICAgICAgICAgICAgICAgICBBRENfQ09NTU9OX0NDUl9NVUxUSQorI2RlZmluZSBfX0hBTF9BRENfTVVMVElNT0RFX0lTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgQURDX01VTFRJTU9ERV9JU19FTkFCTEUKKyNkZWZpbmUgX19BRENfTVVMVElNT0RFX0lTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgIEFEQ19NVUxUSU1PREVfSVNfRU5BQkxFCisjZGVmaW5lIF9fSEFMX0FEQ19OT05NVUxUSU1PREVfT1JfTVVMVElNT0RFTUFTVEVSICAgICAgICBBRENfTk9OTVVMVElNT0RFX09SX01VTFRJTU9ERU1BU1RFUgorI2RlZmluZSBfX0hBTF9BRENfQ09NTU9OX0FEQ19PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgQURDX0NPTU1PTl9BRENfT1RIRVIKKyNkZWZpbmUgX19IQUxfQURDX01VTFRJX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19NVUxUSV9TTEFWRQorCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIxX0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMV9MX1NISUZUCisjZGVmaW5lIF9fSEFMX0FEQ19KU1FSX0pMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSlNRUl9KTF9TSElGVAorI2RlZmluZSBfX0hBTF9BRENfSlNRUl9SS19KTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfUktfSkwKKyNkZWZpbmUgX19IQUxfQURDX0NSMV9ESVNDT05USU5VT1VTX05VTSAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRElTQ09OVElOVU9VU19OVU0KKyNkZWZpbmUgX19IQUxfQURDX0NSMV9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfU0NBTl9TRVQKKyNkZWZpbmUgX19IQUxfQURDX0NPTlZDWUNMRVNfTUFYX1JBTkdFICAgICAgICAgICAgICAgICAgIEFEQ19DT05WQ1lDTEVTX01BWF9SQU5HRQorI2RlZmluZSBfX0hBTF9BRENfQ0xPQ0tfUFJFU0NBTEVSX1JBTkdFICAgICAgICAgICAgICAgICAgQURDX0NMT0NLX1BSRVNDQUxFUl9SQU5HRQorI2RlZmluZSBfX0hBTF9BRENfR0VUX0NMT0NLX1BSRVNDQUxFUiAgICAgICAgICAgICAgICAgICAgQURDX0dFVF9DTE9DS19QUkVTQ0FMRVIKKworI2RlZmluZSBfX0hBTF9BRENfU1FSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjEKKyNkZWZpbmUgX19IQUxfQURDX1NNUFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMQorI2RlZmluZSBfX0hBTF9BRENfU01QUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyCisjZGVmaW5lIF9fSEFMX0FEQ19TUVIzX1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSM19SSworI2RlZmluZSBfX0hBTF9BRENfU1FSMl9SSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjJfUksKKyNkZWZpbmUgX19IQUxfQURDX1NRUjFfUksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX1JLCisjZGVmaW5lIF9fSEFMX0FEQ19DUjJfQ09OVElOVU9VUyAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ1IyX0NPTlRJTlVPVVMKKyNkZWZpbmUgX19IQUxfQURDX0NSMV9ESVNDT05USU5VT1VTICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjFfRElTQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ1IxX1NDQU5DT05WICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMV9TQ0FOQ09OVgorI2RlZmluZSBfX0hBTF9BRENfQ1IyX0VPQ1NlbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgQURDX0NSMl9FT0NTZWxlY3Rpb24KKyNkZWZpbmUgX19IQUxfQURDX0NSMl9ETUFDb250UmVxICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DUjJfRE1BQ29udFJlcQorI2RlZmluZSBfX0hBTF9BRENfSlNRUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVIKKworI2RlZmluZSBfX0hBTF9BRENfQ0hTRUxSX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NIU0VMUl9DSEFOTkVMCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9SRUdfRElTQ0NPTlRJTlVPVVMgICAgICAgICAgICAgICBBRENfQ0ZHUjFfUkVHX0RJU0NDT05USU5VT1VTCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9BVVRPT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQVVUT09GRgorI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfQVVUT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX0FVVE9XQUlUCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9DT05USU5VT1VTICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfQ09OVElOVU9VUworI2RlZmluZSBfX0hBTF9BRENfQ0ZHUjFfT1ZFUlJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IxX09WRVJSVU4KKyNkZWZpbmUgX19IQUxfQURDX0NGR1IxX1NDQU5ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMV9TQ0FORElSCisjZGVmaW5lIF9fSEFMX0FEQ19DRkdSMV9ETUFDT05UUkVRICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjFfRE1BQ09OVFJFUQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9NYWNyb3MgSEFMIERBQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX0RIUjEyUjFfQUxJR05FTUVOVCAgICAgICAgICAgICAgICAgICAgICAgIERBQ19ESFIxMlIxX0FMSUdOTUVOVAorI2RlZmluZSBfX0hBTF9ESFIxMlIyX0FMSUdORU1FTlQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfREhSMTJSMl9BTElHTk1FTlQKKyNkZWZpbmUgX19IQUxfREhSMTJSRF9BTElHTkVNRU5UICAgICAgICAgICAgICAgICAgICAgICAgREFDX0RIUjEyUkRfQUxJR05NRU5UCisjZGVmaW5lIElTX0RBQ19HRU5FUkFURV9XQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0RBQ19XQVZFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0RCR01DVV9BbGlhc2VkX01hY3JvcyBIQUwgREJHTUNVIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU0zX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNM19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTMKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU00X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNAorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNNV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU01CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTTVfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU01CisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9USU02X0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTYKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNNl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTYKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNNworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU03X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNNworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNOF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9USU04CisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX1RJTThfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU04CisKKyNkZWZpbmUgX19IQUxfRlJFRVpFX1RJTTlfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNOQorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9USU05X0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfVElNOQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTBfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTAKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTBfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMAorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTFfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTFfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTIKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTNfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTMKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTNfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xMworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNAorI2RlZmluZSBfX0hBTF9GUkVFWkVfQ0FOMl9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9DQU4yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0NBTjJfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9DQU4yCisKKworI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTVfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTUKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTVfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNQorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTZfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTYKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTZfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNgorI2RlZmluZSBfX0hBTF9GUkVFWkVfVElNMTdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfVElNMTcKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfVElNMTdfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xNworI2RlZmluZSBfX0hBTF9GUkVFWkVfUlRDX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1JUQworI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9SVENfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9SVEMKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisgICNkZWZpbmUgX19IQUxfRlJFRVpFX1dXREdfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfV1dERzEKKyAgI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9XV0RHX0RCR01DVSBfX0hBTF9EQkdNQ1VfVW5GcmVlemVfV1dERzEKKyAgI2RlZmluZSBfX0hBTF9GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHMQorICAjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0lXREdfREJHTUNVIF9fSEFMX0RCR01DVV9VbkZyZWV6ZV9JV0RHMQorI2Vsc2UKKyAgI2RlZmluZSBfX0hBTF9GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9XV0RHCisgICNkZWZpbmUgX19IQUxfVU5GUkVFWkVfV1dER19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX1dXREcKKyAgI2RlZmluZSBfX0hBTF9GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JV0RHCisgICNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSVdER19EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9JMkMxX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfSTJDMV9USU1FT1VUCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0kyQzFfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0kyQzFfVElNRU9VVAorI2RlZmluZSBfX0hBTF9GUkVFWkVfSTJDMl9USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzJfVElNRU9VVAorI2RlZmluZSBfX0hBTF9VTkZSRUVaRV9JMkMyX1RJTUVPVVRfREJHTUNVIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMyX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0kyQzNfVElNRU9VVF9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9JMkMzX1RJTUVPVVQKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfSTJDM19USU1FT1VUX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfSTJDM19USU1FT1VUCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9DQU4xX0RCR01DVSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0NBTjEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfQ0FOMV9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0NBTjEKKyNkZWZpbmUgX19IQUxfRlJFRVpFX0xQVElNMV9EQkdNQ1UgX19IQUxfREJHTUNVX0ZSRUVaRV9MUFRJTTEKKyNkZWZpbmUgX19IQUxfVU5GUkVFWkVfTFBUSU0xX0RCR01DVSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0xCisjZGVmaW5lIF9fSEFMX0ZSRUVaRV9MUFRJTTJfREJHTUNVIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0yCisjZGVmaW5lIF9fSEFMX1VORlJFRVpFX0xQVElNMl9EQkdNQ1UgX19IQUxfREJHTUNVX1VORlJFRVpFX0xQVElNMgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DT01QX0FsaWFzZWRfTWFjcm9zIEhBTCBDT01QIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisjZGVmaW5lIENPTVBfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0VOQUJMRQorI2RlZmluZSBDT01QX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9ESVNBQkxFCisjZGVmaW5lIENPTVBfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0xPQ0sKKworI2lmIGRlZmluZWQoU1RNMzJGMzAxeDgpIHx8IGRlZmluZWQoU1RNMzJGMzAyeDgpIHx8IGRlZmluZWQoU1RNMzJGMzE4eHgpIHx8IGRlZmluZWQoU1RNMzJGMzAzeDgpIHx8IGRlZmluZWQoU1RNMzJGMzM0eDgpIHx8IGRlZmluZWQoU1RNMzJGMzI4eHgpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfR0VUX0ZMQUcoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfQ0xFQVJfRkxBRygpKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFNUTTMyRjMwMnhFKSB8fCBkZWZpbmVkKFNUTTMyRjMwMnhDKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA2X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9FTkFCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRU5BQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRElTQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QNl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChTVE0zMkYzMDN4RSkgfHwgZGVmaW5lZChTVE0zMkYzOTh4eCkgfHwgZGVmaW5lZChTVE0zMkYzMDN4QykgfHwgZGVmaW5lZChTVE0zMkYzNTh4eCkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAyKSA/IF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA1KSA/IF9fSEFMX0NPTVBfQ09NUDVfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QN19FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRkFMTElOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDQpID8gX19IQUxfQ09NUF9DT01QNF9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDMpID8gX19IQUxfQ09NUF9DT01QM19FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA0KSA/IF9fSEFMX0NPTVBfQ09NUDRfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDYpID8gX19IQUxfQ09NUF9DT01QNl9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVA3X0VYVElfRElTQUJMRV9JVCgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfR0VUX0ZMQUcoX19GTEFHX18pICAgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDIpID8gX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAzKSA/IF9fSEFMX0NPTVBfQ09NUDNfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDUpID8gX19IQUxfQ09NUF9DT01QNV9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVA2KSA/IF9fSEFMX0NPTVBfQ09NUDZfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9HRVRfRkxBRygpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMikgPyBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMykgPyBfX0hBTF9DT01QX0NPTVAzX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNCkgPyBfX0hBTF9DT01QX0NPTVA0X0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNSkgPyBfX0hBTF9DT01QX0NPTVA1X0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QNikgPyBfX0hBTF9DT01QX0NPTVA2X0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDdfRVhUSV9DTEVBUl9GTEFHKCkpCisjIGVuZGlmCisjIGlmIGRlZmluZWQoU1RNMzJGMzczeEMpIHx8ZGVmaW5lZChTVE0zMkYzNzh4eCkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9FTkFCTEUoX19FWFRJTElORV9fKSAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9SSVNJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9GQUxMSU5HX0lUX0RJU0FCTEUoX19FWFRJTElORV9fKSAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0VOQUJMRV9JVChfX0VYVElMSU5FX18pICAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAoKChfX0VYVElMSU5FX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0lUKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9HRVRfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9HRVRfRkxBRygpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAgICAgICAgICAgKCgoX19GTEFHX18pICA9PSBDT01QX0VYVElfTElORV9DT01QMSkgPyBfX0hBTF9DT01QX0NPTVAxX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9DTEVBUl9GTEFHKCkpCisjIGVuZGlmCisjZWxzZQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfUklTSU5HX0lUX0VOQUJMRShfX0VYVElMSU5FX18pICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX1JJU0lOR19JVF9ESVNBQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRU5BQkxFKF9fRVhUSUxJTkVfXykgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0ZBTExJTkdfSVRfRElTQUJMRShfX0VYVElMSU5FX18pICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpKQorI2RlZmluZSBfX0hBTF9DT01QX0VYVElfRU5BQkxFX0lUKF9fRVhUSUxJTkVfXykgICAgICAgICAgKCgoX19FWFRJTElORV9fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0RJU0FCTEVfSVQoX19FWFRJTElORV9fKSAgICAgICAgICgoKF9fRVhUSUxJTkVfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfSVQoKSkKKyNkZWZpbmUgX19IQUxfQ09NUF9FWFRJX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAgICgoKF9fRkxBR19fKSAgPT0gQ09NUF9FWFRJX0xJTkVfQ09NUDEpID8gX19IQUxfQ09NUF9DT01QMV9FWFRJX0dFVF9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0dFVF9GTEFHKCkpCisjZGVmaW5lIF9fSEFMX0NPTVBfRVhUSV9DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgICAgICAgICAoKChfX0ZMQUdfXykgID09IENPTVBfRVhUSV9MSU5FX0NPTVAxKSA/IF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfQ09NUF9DT01QMl9FWFRJX0NMRUFSX0ZMQUcoKSkKKyNlbmRpZgorCisjZGVmaW5lIF9fSEFMX0NPTVBfR0VUX0VYVElfTElORSAgQ09NUF9HRVRfRVhUSV9MSU5FCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkKKy8qIE5vdGU6IE9uIHRoZXNlIFNUTTMyIGZhbWlsaWVzLCB0aGUgb25seSBhcmd1bWVudCBvZiB0aGlzIG1hY3JvICAgICAgICAgICAgICovCisvKiAgICAgICBpcyBDT01QX0ZMQUdfTE9DSy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgVGhpcyBtYWNybyBpcyByZXBsYWNlZCBieSBfX0hBTF9DT01QX0lTX0xPQ0tFRCB3aXRoIG9ubHkgSEFMIGhhbmRsZSAgKi8KKy8qICAgICAgIGFyZ3VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAoX19IQUxfQ09NUF9JU19MT0NLRUQoX19IQU5ETEVfXykpCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkKKy8qKiBAZGVmZ3JvdXAgSEFMX0NPTVBfQWxpYXNlZF9GdW5jdGlvbnMgSEFMIENPTVAgQWxpYXNlZCBGdW5jdGlvbnMgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ09NUF9TdGFydF9JVCAgICAgICBIQUxfQ09NUF9TdGFydCAvKiBGdW5jdGlvbiBjb25zaWRlcmVkIGFzIGxlZ2FjeSBhcyBFWFRJIGV2ZW50IG9yIElUIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBpbnRvIEhBTF9DT01QX0luaXQoKSAqLworI2RlZmluZSBIQUxfQ09NUF9TdG9wX0lUICAgICAgICBIQUxfQ09NUF9TdG9wICAvKiBGdW5jdGlvbiBjb25zaWRlcmVkIGFzIGxlZ2FjeSBhcyBFWFRJIGV2ZW50IG9yIElUIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBpbnRvIEhBTF9DT01QX0luaXQoKSAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZgorCisvKiogQGRlZmdyb3VwIEhBTF9EQUNfQWxpYXNlZF9NYWNyb3MgSEFMIERBQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfREFDX1dBVkUoV0FWRSkgKCgoV0FWRSkgPT0gREFDX1dBVkVfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdBVkUpID09IERBQ19XQVZFX05PSVNFKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQVZFKSA9PSBEQUNfV0FWRV9UUklBTkdMRSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0ZMQVNIX0FsaWFzZWRfTWFjcm9zIEhBTCBGTEFTSCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfV1JQQVJFQSAgICAgICAgICBJU19PQl9XUlBBUkVBCisjZGVmaW5lIElTX1RZUEVQUk9HUkFNICAgICAgSVNfRkxBU0hfVFlQRVBST0dSQU0KKyNkZWZpbmUgSVNfVFlQRVBST0dSQU1GTEFTSCBJU19GTEFTSF9UWVBFUFJPR1JBTQorI2RlZmluZSBJU19UWVBFRVJBU0UgICAgICAgIElTX0ZMQVNIX1RZUEVFUkFTRQorI2RlZmluZSBJU19OQlNFQ1RPUlMgICAgICAgIElTX0ZMQVNIX05CU0VDVE9SUworI2RlZmluZSBJU19PQl9XREdfU09VUkNFICAgIElTX09CX0lXREdfU09VUkNFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyQ19BbGlhc2VkX01hY3JvcyBIQUwgSTJDIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9JMkNfUkVTRVRfQ1IyICAgICAgICAgICAgIEkyQ19SRVNFVF9DUjIKKyNkZWZpbmUgX19IQUxfSTJDX0dFTkVSQVRFX1NUQVJUICAgICAgICBJMkNfR0VORVJBVEVfU1RBUlQKKyNpZiBkZWZpbmVkKFNUTTMyRjEpCisjZGVmaW5lIF9fSEFMX0kyQ19GUkVRX1JBTkdFICAgICAgICAgICAgSTJDX0ZSRVFSQU5HRQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSTJDX0ZSRVFfUkFOR0UgICAgICAgICAgICBJMkNfRlJFUV9SQU5HRQorI2VuZGlmIC8qIFNUTTMyRjEgKi8KKyNkZWZpbmUgX19IQUxfSTJDX1JJU0VfVElNRSAgICAgICAgICAgICBJMkNfUklTRV9USU1FCisjZGVmaW5lIF9fSEFMX0kyQ19TUEVFRF9TVEFOREFSRCAgICAgICAgSTJDX1NQRUVEX1NUQU5EQVJECisjZGVmaW5lIF9fSEFMX0kyQ19TUEVFRF9GQVNUICAgICAgICAgICAgSTJDX1NQRUVEX0ZBU1QKKyNkZWZpbmUgX19IQUxfSTJDX1NQRUVEICAgICAgICAgICAgICAgICBJMkNfU1BFRUQKKyNkZWZpbmUgX19IQUxfSTJDXzdCSVRfQUREX1dSSVRFICAgICAgICBJMkNfN0JJVF9BRERfV1JJVEUKKyNkZWZpbmUgX19IQUxfSTJDXzdCSVRfQUREX1JFQUQgICAgICAgICBJMkNfN0JJVF9BRERfUkVBRAorI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfQUREUkVTUyAgICAgICAgIEkyQ18xMEJJVF9BRERSRVNTCisjZGVmaW5lIF9fSEFMX0kyQ18xMEJJVF9IRUFERVJfV1JJVEUgICAgSTJDXzEwQklUX0hFQURFUl9XUklURQorI2RlZmluZSBfX0hBTF9JMkNfMTBCSVRfSEVBREVSX1JFQUQgICAgIEkyQ18xMEJJVF9IRUFERVJfUkVBRAorI2RlZmluZSBfX0hBTF9JMkNfTUVNX0FERF9NU0IgICAgICAgICAgIEkyQ19NRU1fQUREX01TQgorI2RlZmluZSBfX0hBTF9JMkNfTUVNX0FERF9MU0IgICAgICAgICAgIEkyQ19NRU1fQUREX0xTQgorI2RlZmluZSBfX0hBTF9JMkNfRlJFUVJBTkdFICAgICAgICAgICAgIEkyQ19GUkVRUkFOR0UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0kyU19BbGlhc2VkX01hY3JvcyBIQUwgSTJTIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19JMlNfSU5TVEFOQ0UgICAgICAgICAgICAgICAgIElTX0kyU19BTExfSU5TVEFOQ0UKKyNkZWZpbmUgSVNfSTJTX0lOU1RBTkNFX0VYVCAgICAgICAgICAgICBJU19JMlNfQUxMX0lOU1RBTkNFX0VYVAorCisjaWYgZGVmaW5lZChTVE0zMkg3KQorICAjZGVmaW5lIF9fSEFMX0kyU19DTEVBUl9GUkVGTEFHICAgICAgIF9fSEFMX0kyU19DTEVBUl9USUZSRUZMQUcKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9JUkRBX0FsaWFzZWRfTWFjcm9zIEhBTCBJUkRBIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0lSREFfRElTQUJMRSAgICAgICAgICAgICAgICAgIF9fSEFMX0lSREFfRElTQUJMRQorI2RlZmluZSBfX0lSREFfRU5BQkxFICAgICAgICAgICAgICAgICAgIF9fSEFMX0lSREFfRU5BQkxFCisKKyNkZWZpbmUgX19IQUxfSVJEQV9HRVRDTE9DS1NPVVJDRSAgICAgICBJUkRBX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fSEFMX0lSREFfTUFTS19DT01QVVRBVElPTiAgICAgSVJEQV9NQVNLX0NPTVBVVEFUSU9OCisjZGVmaW5lIF9fSVJEQV9HRVRDTE9DS1NPVVJDRSAgICAgICAgICAgSVJEQV9HRVRDTE9DS1NPVVJDRQorI2RlZmluZSBfX0lSREFfTUFTS19DT01QVVRBVElPTiAgICAgICAgIElSREFfTUFTS19DT01QVVRBVElPTgorCisjZGVmaW5lIElTX0lSREFfT05FQklUX1NBTVBMRSAgICAgICAgICAgSVNfSVJEQV9PTkVfQklUX1NBTVBMRQorCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfSVdER19BbGlhc2VkX01hY3JvcyBIQUwgSVdERyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX0lXREdfRU5BQkxFX1dSSVRFX0FDQ0VTUyAgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTCisjZGVmaW5lIF9fSEFMX0lXREdfRElTQUJMRV9XUklURV9BQ0NFU1MgSVdER19ESVNBQkxFX1dSSVRFX0FDQ0VTUworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9MUFRJTV9BbGlhc2VkX01hY3JvcyBIQUwgTFBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRV9JTlRFUlJVUFQgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX0xQVElNX0RJU0FCTEVfSU5URVJSVVBUICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9MUFRJTV9HRVRfSVRTVEFUVVMgICAgICAgIF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9PUEFNUF9BbGlhc2VkX01hY3JvcyBIQUwgT1BBTVAgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYUEQgICAgICAgICAgICAgICAgT1BBTVBfQ1NSX09QQVhQRAorI2RlZmluZSBfX09QQU1QX0NTUl9TM1NFTFggICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1MzU0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNFNFTFggICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1M0U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNVNFTFggICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1M1U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9TNlNFTFggICAgICAgICAgICAgICAgT1BBTVBfQ1NSX1M2U0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMX0wgICAgICAgICAgICAgT1BBTVBfQ1NSX09QQVhDQUxfTAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMX0ggICAgICAgICAgICAgT1BBTVBfQ1NSX09QQVhDQUxfSAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYTFBNICAgICAgICAgICAgICAgT1BBTVBfQ1NSX09QQVhMUE0KKyNkZWZpbmUgX19PUEFNUF9DU1JfQUxMX1NXSVRDSEVTICAgICAgICAgIE9QQU1QX0NTUl9BTExfU1dJVENIRVMKKyNkZWZpbmUgX19PUEFNUF9DU1JfQU5BV1NFTFggICAgICAgICAgICAgIE9QQU1QX0NTUl9BTkFXU0VMWAorI2RlZmluZSBfX09QQU1QX0NTUl9PUEFYQ0FMT1VUICAgICAgICAgICAgT1BBTVBfQ1NSX09QQVhDQUxPVVQKKyNkZWZpbmUgX19PUEFNUF9PRkZTRVRfVFJJTV9CSVRTUE9TSVRJT04gIE9QQU1QX09GRlNFVF9UUklNX0JJVFNQT1NJVElPTgorI2RlZmluZSBfX09QQU1QX09GRlNFVF9UUklNX1NFVCAgICAgICAgICAgT1BBTVBfT0ZGU0VUX1RSSU1fU0VUCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfUFdSX0FsaWFzZWRfTWFjcm9zIEhBTCBQV1IgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9QVkRfRVZFTlRfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9FVkVOVAorI2RlZmluZSBfX0hBTF9QVkRfRVZFTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0VWRU5UCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0ZBTExJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BWTV9FVkVOVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVZFTlRfRElTQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVZFTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VWRU5UX0VOQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9QVk1fRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZNX0VYVElfRkFMTElOR1RSSUdHRVJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVk1fRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUFZNX0VYVElfUklTSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWTV9FWFRJX1JJU0lOR1RSSUdHRVJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1BXUl9JTlRFUk5BTFdBS0VVUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlSW50ZXJuYWxXYWtlVXBMaW5lCisjZGVmaW5lIF9fSEFMX1BXUl9JTlRFUk5BTFdBS0VVUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVJbnRlcm5hbFdha2VVcExpbmUKKyNkZWZpbmUgX19IQUxfUFdSX1BVTExfVVBfRE9XTl9DT05GSUdfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVQdWxsVXBQdWxsRG93bkNvbmZpZworI2RlZmluZSBfX0hBTF9QV1JfUFVMTF9VUF9ET1dOX0NPTkZJR19FTkFCTEUgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0VHREVfVFJJR0dFUigpICAgICAgICAgICAgICAgICAgZG8geyBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpO19fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyB9IHdoaWxlKDApCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FVkVOVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0VWRU5UCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FVkVOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRVZFTlQKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0ZBTExJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9GQUxMSU5HVFJJR0dFUl9FTkFCTEUgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0RJU0FCTEUgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9SSVNJTkdUUklHR0VSX0VOQUJMRSAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX1NFVF9SSVNJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgICAgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9QV1JfUFZNX0RJU0FCTEUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7IEhBTF9QV1JFeF9EaXNhYmxlUFZNMSgpO0hBTF9QV1JFeF9EaXNhYmxlUFZNMigpO0hBTF9QV1JFeF9EaXNhYmxlUFZNMygpO0hBTF9QV1JFeF9EaXNhYmxlUFZNNCgpOyB9IHdoaWxlKDApCisjZGVmaW5lIF9fSEFMX1BXUl9QVk1fRU5BQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgSEFMX1BXUkV4X0VuYWJsZVBWTTEoKTtIQUxfUFdSRXhfRW5hYmxlUFZNMigpO0hBTF9QV1JFeF9FbmFibGVQVk0zKCk7SEFMX1BXUkV4X0VuYWJsZVBWTTQoKTsgfSB3aGlsZSgwKQorI2RlZmluZSBfX0hBTF9QV1JfU1JBTTJDT05URU5UX1BSRVNFUlZFX0RJU0FCTEUgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVNSQU0yQ29udGVudFJldGVudGlvbgorI2RlZmluZSBfX0hBTF9QV1JfU1JBTTJDT05URU5UX1BSRVNFUlZFX0VOQUJMRSAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlU1JBTTJDb250ZW50UmV0ZW50aW9uCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlVmRkSU8yCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVWZGRJTzIKKyNkZWZpbmUgX19IQUxfUFdSX1ZERElPMl9FWFRJX0NMRUFSX0VHREVfVFJJR0dFUiAgICAgICAgICAgICAgICAgX19IQUxfUFdSX1ZERElPMl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICAgIF9fSEFMX1BXUl9WRERJTzJfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1BXUl9WRERVU0JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlVmRkVVNCCisjZGVmaW5lIF9fSEFMX1BXUl9WRERVU0JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVWZGRVU0IKKworI2lmIGRlZmluZWQgKFNUTTMyRjQpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0VOQUJMRV9JVChQV1JfRVhUSV9MSU5FX1BWRCkgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfRElTQUJMRV9JVChQV1JfRVhUSV9MSU5FX1BWRCkgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCkKKyNkZWZpbmUgX19IQUxfUFZEX0VYVElfR0VUX0ZMQUcoUFdSX0VYVElfTElORV9QVkQpICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkxBRygpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0NMRUFSX0ZMQUcoUFdSX0VYVElfTElORV9QVkQpICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQoUFdSX0VYVElfTElORV9QVkQpICAgICBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVCgpCisjZWxzZQorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9DTEVBUl9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9ESVNBQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9QVkRfRVhUSV9FTkFCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0dFTkVSQVRFX1NXSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9HRU5FUkFURV9TV0lUCisjZGVmaW5lIF9fSEFMX1BWRF9FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9HRVRfRkxBRworI2VuZGlmIC8qIFNUTTMyRjQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBIQUxfUkNDX0FsaWFzZWQgSEFMIFJDQyBBbGlhc2VkIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfU3RvcFdha2VVcENsb2NrX01TSSAgICAgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJCisjZGVmaW5lIFJDQ19TdG9wV2FrZVVwQ2xvY2tfSFNJICAgICBSQ0NfU1RPUF9XQUtFVVBDTE9DS19IU0kKKworI2RlZmluZSBIQUxfUkNDX0NDU0NhbGxiYWNrIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sKKyNkZWZpbmUgSEFMX1JDNDhfRW5hYmxlQnVmZmVyX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSkgPyBIQUxfUkNDRXhfRW5hYmxlSFNJNDhfVlJFRklOVCgpIDogSEFMX1JDQ0V4X0Rpc2FibGVIU0k0OF9WUkVGSU5UKCkpCisKKyNkZWZpbmUgX19BRENfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQ19DTEtfRU5BQkxFICAgICAgICAgICBfX0hBTF9SQ0NfQURDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BRENfQ0xLX1NMRUVQX0RJU0FCTEUgICAgX19IQUxfUkNDX0FEQ19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0FEQ19DTEtfU0xFRVBfRU5BQkxFICAgICBfX0hBTF9SQ0NfQURDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BRENfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0FEQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQ19SRUxFQVNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfQURDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19BREMxX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0FEQzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BREMxX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzFfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FEQzFfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfQURDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMV9DTEtfU0xFRVBfRU5BQkxFICAgIF9fSEFMX1JDQ19BREMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMxX0NMS19TTEVFUF9ESVNBQkxFICAgX19IQUxfUkNDX0FEQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BREMyX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0FEQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BREMyX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQzJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FEQzNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FEQzNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BREMzX0NMS19FTkFCTEUgX19IQUxfUkNDX0FEQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FEQzNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FEQzNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMzX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FEQzNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FFU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQUVTX0NMS19FTkFCTEUgX19IQUxfUkNDX0FFU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQUVTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BRVNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BRVNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FFU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FFU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19BRVNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRSAgICAgIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUllQX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfQ1JZUF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSWVBfQ0xLX0VOQUJMRSAgX19IQUxfUkNDX0NSWVBfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NSWVBfQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19DUllQX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JZUF9GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfQ1JZUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSWVBfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX0NSWVBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FGSU9fQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0FGSU9fQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19BRklPX0NMS19FTkFCTEUgX19IQUxfUkNDX0FGSU9fQ0xLX0VOQUJMRQorI2RlZmluZSBfX0FGSU9fRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0FGSU9fRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BRklPX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FGSU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0FIQl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUhCX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQUhCX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0FIQl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUhCMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FIQjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUhCMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FIQjJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQUhCM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQUhCM19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FIQjNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQUhCM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FQQjFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQVBCMl9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0FQQjJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQVBCMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQktQX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19CS1BfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19CS1BfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfQktQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19CS1BfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0JLUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0JLUF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19CS1BfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NBTjFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DQU4xX0NMS19FTkFCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NBTjFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DQU4xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NBTjFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NBTjFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NBTjFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DQU4xX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NBTjFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NBTl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19DQU4xX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0FOX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0NBTjFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NBTl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19DQU4xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fQ0FOX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0NBTjFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NBTjJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NBTjJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19FTkFCTEUgX19IQUxfUkNDX0NBTjJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NBTjJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NBTjJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DQU4yX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0NBTjJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0NFQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ0VDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ0VDX0NMS19FTkFCTEUgX19IQUxfUkNDX0NFQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ09NUF9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0NPTVBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19DT01QX0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfQ09NUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ09NUF9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0NPTVBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DT01QX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfQ09NUF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQ09NUF9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX0NPTVBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0NPTVBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19DT01QX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ0VDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DRUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DRUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ0VDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19DUkNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0NSQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0NSQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0NSQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQ1JDX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0NSQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQ1JDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19DUkNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19DUkNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfQ1JDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19EQUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RBQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19EQUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQ19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREFDX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREFDX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RBQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQzFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fREFDMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0RBQzFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfREFDMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fREFDMV9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfREFDMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQzFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREFDMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREJHTUNVX0NMS19FTkFCTEUgICAgIF9fSEFMX1JDQ19EQkdNQ1VfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RCR01DVV9DTEtfRElTQUJMRSAgICAgX19IQUxfUkNDX0RCR01DVV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RCR01DVV9GT1JDRV9SRVNFVCAgICBfX0hBTF9SQ0NfREJHTUNVX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREJHTUNVX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19EQkdNQ1VfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RGU0RNX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RGU0RNX0NMS19FTkFCTEUgX19IQUxfUkNDX0RGU0RNX0NMS19FTkFCTEUKKyNkZWZpbmUgX19ERlNETV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19ERlNETV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19ERlNETV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fREZTRE1fRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RGU0RNX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fREZTRE1fUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfREZTRE1fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RNQTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RNQTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUExX0NMS19FTkFCTEUgX19IQUxfUkNDX0RNQTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19ETUExX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RNQTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RNQTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RNQTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19ETUExX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RNQTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0RNQTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0RNQTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyX0NMS19FTkFCTEUgX19IQUxfUkNDX0RNQTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RNQTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0RNQTJfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0RNQTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RNQTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0RNQTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0RNQTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0VUSE1BQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDX0NMS19FTkFCTEUgX19IQUxfUkNDX0VUSE1BQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19FVEhNQUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19FVEhNQUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRVRITUFDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRVRITUFDUlhfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19FVEhNQUNSWF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfRVRITUFDVFhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZJUkVXQUxMX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GSVJFV0FMTF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZJUkVXQUxMX0NMS19FTkFCTEUgX19IQUxfUkNDX0ZJUkVXQUxMX0NMS19FTkFCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GTEFTSF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19GTEFTSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRkxBU0hfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0ZMQVNIX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTEFTSF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZMQVNIX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0ZMQVNIX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GTElURl9DTEtfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfRkxJVEZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19GTElURl9DTEtfRU5BQkxFICAgICAgICBfX0hBTF9SQ0NfRkxJVEZfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZMSVRGX0ZPUkNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19GTElURl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0ZMSVRGX1JFTEVBU0VfUkVTRVQgICAgIF9fSEFMX1JDQ19GTElURl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRkxJVEZfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0ZMSVRGX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GTElURl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRkxJVEZfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19GTUNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0ZNQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19GTUNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0ZNQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfRk1DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRk1DX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0ZNQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRk1DX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19GTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GTUNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfRk1DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19GU01DX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRlNNQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19GU01DX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPQV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9BX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0FfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9BX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9BX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9BX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPQl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9CX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0JfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9CX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9CX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9CX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0NfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0NfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9DX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0RfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9EX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0RfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9EX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9EX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9EX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPRV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0VfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9FX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0VfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9FX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9FX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9FX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPRl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPRl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPRl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9GX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0ZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0ZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9GX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPRl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9GX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9GX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPR19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0dfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9HX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0dfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0dfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9HX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPR19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9HX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9HX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19HUElPSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0hfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0hfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9IX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19HUElPSF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9IX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX0dQSU9IX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19JMkMxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19JMkMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSTJDMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19JMkMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19JMkMxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSTJDMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19JMkMxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19JMkMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19JMkMyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19JMkMyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSTJDMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19JMkMyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19JMkMyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSTJDMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19JMkMyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19JMkMyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19JMkMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSTJDMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19JMkMzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19JMkMzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSTJDM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19JMkMzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19JMkMzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19JMkMzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSTJDM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19JMkMzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19JMkMzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19JMkMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSTJDM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19JMkMzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MQ0RfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xDRF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0xDRF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19MQ0RfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xDRF9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTENEX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xDRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fTENEX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MQ0RfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19MQ0RfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTENEX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MUFRJTTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0xX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19MUFRJTTFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0xX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MUFRJTTJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0xQVElNMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0xQVElNMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFBUSU0yX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX0xQVElNMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fTFBUSU0yX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MUFRJTTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19MUFRJTTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfTFBUSU0yX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19MUFVBUlQxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19MUFVBUlQxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fTFBVQVJUMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19MUFVBUlQxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19PUEFNUF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19PUEFNUF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19PUEFNUF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fT1BBTVBfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX09QQU1QX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fT1BBTVBfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfT1BBTVBfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX09QQU1QX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19PUEFNUF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX09QQU1QX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX09QQU1QX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19PVEdGU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdGU19DTEtfRU5BQkxFIF9fSEFMX1JDQ19PVEdGU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fT1RHRlNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX09UR0ZTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fT1RHRlNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfT1RHRlNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX09UR0ZTX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19PVEdGU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX09UR0ZTX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX09UR0ZTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19QV1JfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1BXUl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1BXUl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19QV1JfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1BXUl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUFdSX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fUFdSX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1BXUl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fUFdSX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19QV1JfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19QV1JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUFdSX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19RU1BJX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19RU1BJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fUVNQSV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUKKyNkZWZpbmUgX19RU1BJX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fUVNQSV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19RU1BJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19RU1BJX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19RU1BJX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fUVNQSV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQKKworI2lmIGRlZmluZWQoU1RNMzJXQikKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfRU5BQkxFICAgICAgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9DTEtfU0xFRVBfRU5BQkxFICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQgICAgICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX1FTUElfSVNfQ0xLX0VOQUJMRUQgICAgICAgICBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfRElTQUJMRUQgICAgICAgIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfUVNQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCAgIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19TTEVFUF9FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19RU1BJX0lTX0NMS19TTEVFUF9ESVNBQkxFRCAgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX1NMRUVQX0RJU0FCTEVECisjZGVmaW5lIFFTUElfSVJRSGFuZGxlciBRVUFEU1BJX0lSUUhhbmRsZXIKKyNlbmRpZiAvKiBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfRU5BQkxFICovCisKKyNkZWZpbmUgX19STkdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1JOR19DTEtfRElTQUJMRQorI2RlZmluZSBfX1JOR19DTEtfRU5BQkxFIF9fSEFMX1JDQ19STkdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1JOR19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fUk5HX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1JOR19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fUk5HX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19STkdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19STkdfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfUk5HX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TQUkxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TQUkxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0FJMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TQUkxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TQUkxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TQUkxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0FJMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TQUkxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TQUkxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TQUkxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TQUkxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TQUkyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TQUkyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0FJMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TQUkyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TQUkyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TQUkyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0FJMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TQUkyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TQUkyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TQUkyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0FJMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TQUkyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TRElPX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TRElPX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU0RJT19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TRElPX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TRE1NQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TRE1NQ19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NETU1DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0RNTUNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU0RNTUNfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NETU1DX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TRE1NQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NETU1DX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1NETU1DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEkxX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEkxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUEkxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEkxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TUEkxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEkyX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEkyX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUEkyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEkyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TUEkyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEkzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEkzX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUEkzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TUEkzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19TUEkzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TUEkzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUkFNX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19TUkFNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1JBTV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19TUkFNX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUkFNMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1JBTTJfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1JBTTJfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1JBTTJfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NXUE1JMV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19FTkFCTEUgX19IQUxfUkNDX1NXUE1JMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1dQTUkxX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TV1BNSTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TV1BNSTFfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1dQTUkxX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TV1BNSTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NXUE1JMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NXUE1JMV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TV1BNSTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NZU0NGR19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19FTkFCTEUgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1lTQ0ZHX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TWVNDRkdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19TWVNDRkdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1NZU0NGR19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NZU0NGR19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19TWVNDRkdfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTFfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RJTTFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTFfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTEwX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xMF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTEwX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTEwX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xMF9GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTBfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTExX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTExX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTExX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTExX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xMl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xMl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTJfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1RJTTEyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTEzX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0xM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTEzX0NMS19FTkFCTEUgX19IQUxfUkNDX1RJTTEzX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0xM19GT1JDRV9SRVNFVCBfX0hBTF9SQ0NfVElNMTNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19USU0xM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0xM19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTRfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE0X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMTRfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTRfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RJTTE0X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTE0X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTE0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTE1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTE1X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTE1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xNl9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTZfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTZfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTE2X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTE2X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTE2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0xN19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xN19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0xN19DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTdfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1RJTTE3X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0xN19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTE3X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1RJTTE3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0yX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0yX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0yX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0yX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0yX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0yX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0zX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU0zX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU0zX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0zX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU0zX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNM19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU0zX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0zX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU0zX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNM19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU0zX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU00X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU00X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU00X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU00X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU00X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNNF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU00X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU00X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU00X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNNF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU00X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU01X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU01X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU01X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU01X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU01X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNNV9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU01X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU01X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU01X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNNV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU01X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU02X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU02X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNNl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU02X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU02X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU02X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNNl9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU02X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU02X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU02X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNNl9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU02X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU03X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU03X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNN19DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU03X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU03X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU03X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNN19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU03X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU03X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU03X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNN19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU03X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU04X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU04X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNOF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU04X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU04X0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19USU04X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNOF9DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19USU04X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU04X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU04X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNOF9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU04X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU05X0NMS19ESVNBQkxFIF9fSEFMX1JDQ19USU05X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNOV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19USU05X0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU05X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19USU05X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNOV9SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19USU05X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19UU0NfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1RTQ19DTEtfRElTQUJMRQorI2RlZmluZSBfX1RTQ19DTEtfRU5BQkxFIF9fSEFMX1JDQ19UU0NfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1RTQ19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVFNDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVFNDX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1RTQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVFNDX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19UU0NfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19UU0NfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVFNDX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNF9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNF9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ0X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ0X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUNV9DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUNV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VQVJUNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1VBUlQ1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ1X0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VQVJUNV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ1X1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VBUlQ1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDFfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMV9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQxX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDFfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDFfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDJfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUMl9DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUMl9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQyX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUMl9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQyX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDJfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDNfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUM19DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0FSVDNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUM19DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfVVNBUlQzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQzX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1VTQVJUM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQzX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19VU0FSVDNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDNfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNBUlQzX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19VQVJUNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNF9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1VBUlQ0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDRfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19VQVJUNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ0X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVUFSVDRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDRfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VQVJUNF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNF9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1VBUlQ0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19VQVJUNV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUNV9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1VBUlQ1X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDVfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19VQVJUNV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ1X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVUFSVDVfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDVfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VQVJUNV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUNV9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1VBUlQ1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDdfQ0xLX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUN19DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1VBUlQ3X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDdfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VQVJUN19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUN19SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDhfQ0xLX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1VTQVJUOF9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0FSVDhfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQVJUOF9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1VBUlQ4X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVVNCX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1VTQl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1VTQl9DTEtfU0xFRVBfRU5BQkxFICAgIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQl9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19GU19DTEtfRU5BQkxFIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfUkVMRUFTRV9SRVNFVCBfX0hBTF9SQ0NfVVNCX1JFTEVBU0VfUkVTRVQKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0RJU0FCTEUgICBfX0hBTF9SQ0NfV1dERzFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSAgIF9fSEFMX1JDQ19XV0RHMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfV1dERzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1dXREcxX0NMS19TTEVFUF9FTkFCTEUKKworI2RlZmluZSBfX0hBTF9SQ0NfV1dER19GT1JDRV9SRVNFVCAgICAoKHZvaWQpMFUpICAvKiBOb3QgYXZhaWxhYmxlIG9uIHRoZSBTVE0zMkg3Ki8KKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVCAoKHZvaWQpMFUpIC8qIE5vdCBhdmFpbGFibGUgb24gdGhlIFNUTTMySDcqLworCisKKyNkZWZpbmUgIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVEICAgIF9fSEFMX1JDQ19XV0RHMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVEICBfX0hBTF9SQ0NfV1dERzFfSVNfQ0xLX0RJU0FCTEVECisjZW5kaWYKKworI2RlZmluZSBfX1dXREdfQ0xLX0RJU0FCTEUgX19IQUxfUkNDX1dXREdfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19XV0RHX0NMS19FTkFCTEUgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19XV0RHX0NMS19TTEVFUF9FTkFCTEUgX19IQUxfUkNDX1dXREdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1dXREdfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX1dXREdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19XV0RHX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1dXREdfUkVMRUFTRV9SRVNFVAorCisjZGVmaW5lIF9fVElNMjFfQ0xLX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMV9GT1JDRV9SRVNFVCAgIF9fSEFMX1JDQ19USU0yMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1RJTTIxX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19USU0yMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0VOQUJMRSAgIF9fSEFMX1JDQ19USU0yMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1RJTTIyX0ZPUkNFX1JFU0VUICAgX19IQUxfUkNDX1RJTTIyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjJfUkVMRUFTRV9SRVNFVCAgX19IQUxfUkNDX1RJTTIyX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX1RJTTIyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0yMl9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19USU0yMl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0NSU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19FTkFCTEUgX19IQUxfUkNDX0NSU19DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ1JTX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19DUlNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DUlNfQ0xLX1NMRUVQX0VOQUJMRSBfX0hBTF9SQ0NfQ1JTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DUlNfRk9SQ0VfUkVTRVQgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0NSU19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19DUlNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UKKyNkZWZpbmUgX19SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRSBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfUkVMRUFTRQorCisjZGVmaW5lIF9fVVNCX09UR19GU19GT1JDRV9SRVNFVCAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1VTQl9PVEdfSFNfQ0xLX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19VU0JfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVElNOV9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU05X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU05X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVElNOV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTEwX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1RJTTExX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVElNMTFfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19USU0xMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSE1BQ1BUUF9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19FVEhNQUNQVFBfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRITUFDUFRQX0NMS19FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNQVFBfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0VUSE1BQ1BUUF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFTSF9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBU0hfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fSEFTSF9DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19IQVNIX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQVNIX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfSEFTSF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBU0hfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfSEFTSF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNV9DTEtfRElTQUJMRSAgICAgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19TUEk1X0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU1BJNV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19TUEk1X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk1X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTVfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTVfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk1X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19FTkFCTEUKKyNkZWZpbmUgX19TUEk2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19TUEk2X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fU1BJNl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfU1BJNl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NQSTZfUkVMRUFTRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19TUEk2X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk2X0NMS19TTEVFUF9FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1NQSTZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1NQSTZfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19TUEk2X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19FTkFCTEUKKyNkZWZpbmUgX19MVERDX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fTFREQ19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0xURENfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfTFREQ19SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fTFREQ19DTEtfU0xFRVBfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19MVERDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfRVRITUFDX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDVFhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNUWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1RYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fRVRITUFDUlhfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19FVEhNQUNSWF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0VUSE1BQ1JYX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTJfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xMl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTNfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xM19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTEzX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVElNMTRfQ0xLX1NMRUVQX0VOQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19USU0xNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1RJTTE0X0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19FTkFCTEUKKyNkZWZpbmUgX19CS1BTUkFNX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19CS1BTUkFNX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfQktQU1JBTV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQktQU1JBTV9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX0JLUFNSQU1fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19DQ01EQVRBUkFNRU5fQ0xLX0VOQUJMRSAgX19IQUxfUkNDX0NDTURBVEFSQU1FTl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFICBfX0hBTF9SQ0NfQ0NNREFUQVJBTUVOX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19VU0FSVDZfRk9SQ0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19VU0FSVDZfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VU0FSVDZfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX1VTQVJUNl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fVVNBUlQ2X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0FSVDZfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQVJUNl9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU1BJNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NQSTRfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1NQSTRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X1JFTEVBU0VfUkVTRVQgICAgICAgIF9fSEFMX1JDQ19TUEk0X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TUEk0X0NMS19TTEVFUF9FTkFCTEUgICBfX0hBTF9SQ0NfU1BJNF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fU1BJNF9DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1NQSTRfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPSV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0lfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9JX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fR1BJT0lfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0lfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9JX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0lfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPSV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX0NMS19FTkFCTEUKKyNkZWZpbmUgX19HUElPSl9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPSl9GT1JDRV9SRVNFVCAgICAgICAgIF9fSEFMX1JDQ19HUElPSl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0dQSU9KX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0dQSU9KX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19HUElPSl9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0dQSU9KX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfR1BJT0pfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19HUElPS19DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19HUElPS19DTEtfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0dQSU9LX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fR1BJT0tfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfR1BJT0tfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0dQSU9LX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fR1BJT0tfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19HUElPS19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19FVEhfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0VUSF9DTEtfRElTQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfRVRIX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19FTkFCTEUKKyNkZWZpbmUgX19EQ01JX0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19EQ01JX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fRENNSV9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RDTUlfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfRENNSV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fRENNSV9DTEtfU0xFRVBfRU5BQkxFICAgX19IQUxfUkNDX0RDTUlfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0RDTUlfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19EQ01JX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDdfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19ESVNBQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUN19DTEtfRElTQUJMRQorI2RlZmluZSBfX1VBUlQ3X1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX1VBUlQ3X1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVUFSVDdfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19VQVJUN19DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX1VBUlQ3X0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVUFSVDdfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19VQVJUOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19VQVJUOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0NMS19ESVNBQkxFCisjZGVmaW5lIF9fVUFSVDhfRk9SQ0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VBUlQ4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVUFSVDhfUkVMRUFTRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVUFSVDhfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1VBUlQ4X0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fVUFSVDhfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VQVJUOF9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19PVEdIU19GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX09UR0hTX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9ESVNBQkxFICBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQgX19IQUxfUkNDX1VTQl9PVEdfSFNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19JU19DTEtfU0xFRVBfRElTQUJMRUQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTX0ZPUkNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU19SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9DTEtfU0xFRVBfRU5BQkxFICAgICAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUgICAgIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX09UR0hTVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRCAgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9JU19DTEtfU0xFRVBfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfT1RHSFNVTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRCBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0lTX0NMS19TTEVFUF9ESVNBQkxFRAorI2RlZmluZSBfX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUgICAgICAgX19IQUxfUkNDX1NSQU0zX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19DQU4yX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19DQU4yX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fREFDX0NMS19TTEVFUF9FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfREFDX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgIF9fSEFMX1JDQ19EQUNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19BREMyX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19BREMyX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRU5BQkxFICAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fQURDM19DTEtfU0xFRVBfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfQURDM19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0ZTTUNfRk9SQ0VfUkVTRVQgICAgICAgICAgICAgX19IQUxfUkNDX0ZTTUNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX1JFTEVBU0VfUkVTRVQgICAgICAgICAgIF9fSEFMX1JDQ19GU01DX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19GU01DX0NMS19TTEVFUF9ESVNBQkxFICAgICAgIF9fSEFMX1JDQ19GU01DX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fU0RJT19GT1JDRV9SRVNFVCAgICAgICAgICAgICBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVAorI2RlZmluZSBfX1NESU9fUkVMRUFTRV9SRVNFVCAgICAgICAgICAgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUgICAgICAgX19IQUxfUkNDX1NESU9fQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19TRElPX0NMS19TTEVFUF9FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19ETUEyRF9DTEtfRU5BQkxFICAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX0RJU0FCTEUgICAgICAgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19ETUEyRF9GT1JDRV9SRVNFVCAgICAgICAgICAgIF9fSEFMX1JDQ19ETUEyRF9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RNQTJEX1JFTEVBU0VfUkVTRVQgICAgICAgICAgX19IQUxfUkNDX0RNQTJEX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFICAgICAgIF9fSEFMX1JDQ19ETUEyRF9DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUgICAgICBfX0hBTF9SQ0NfRE1BMkRfQ0xLX1NMRUVQX0RJU0FCTEUKKworLyogYWxpYXMgZGVmaW5lIG1haW50YWluZWQgZm9yIGxlZ2FjeSAqLworI2RlZmluZSBfX0hBTF9SQ0NfT1RHRlNfRk9SQ0VfUkVTRVQgICAgX19IQUxfUkNDX1VTQl9PVEdfRlNfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19IQUxfUkNDX09UR0ZTX1JFTEVBU0VfUkVTRVQgIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1JFTEVBU0VfUkVTRVQKKworI2RlZmluZSBfX0FEQzEyX0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzEyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMxMl9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMxMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX0FEQzM0X0NMS19FTkFCTEUgICAgICAgICAgX19IQUxfUkNDX0FEQzM0X0NMS19FTkFCTEUKKyNkZWZpbmUgX19BREMzNF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BREMzNF9DTEtfRElTQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0VOQUJMRSAgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0RBQzJfQ0xLX0RJU0FCTEUgICAgICAgICAgX19IQUxfUkNDX0RBQzJfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMThfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMThfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0xOV9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0xOV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMTlfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMTlfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19USU0yMF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19USU0yMF9DTEtfRU5BQkxFCisjZGVmaW5lIF9fVElNMjBfQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfVElNMjBfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IUlRJTTFfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19IUlRJTTFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hSVElNMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX0hSVElNMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRU5BQkxFICAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fU0RBREMyX0NMS19FTkFCTEUgICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0NMS19FTkFCTEUKKyNkZWZpbmUgX19TREFEQzNfQ0xLX0VOQUJMRSAgICAgICAgIF9fSEFMX1JDQ19TREFEQzNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX1NEQURDMV9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMV9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDMl9DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDMl9DTEtfRElTQUJMRQorI2RlZmluZSBfX1NEQURDM19DTEtfRElTQUJMRSAgICAgICAgX19IQUxfUkNDX1NEQURDM19DTEtfRElTQUJMRQorCisjZGVmaW5lIF9fQURDMTJfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMTJfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMxMl9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMxMl9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fQURDMzRfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQURDMzRfRk9SQ0VfUkVTRVQKKyNkZWZpbmUgX19BREMzNF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BREMzNF9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fREFDMl9GT1JDRV9SRVNFVCAgICAgICAgICBfX0hBTF9SQ0NfREFDMl9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0RBQzJfUkVMRUFTRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0RBQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE4X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE4X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMThfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMThfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTE5X0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTE5X0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMTlfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMTlfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1RJTTIwX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1RJTTIwX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fVElNMjBfUkVMRUFTRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfVElNMjBfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9GT1JDRV9SRVNFVCAgICAgICAgX19IQUxfUkNDX0hSVElNMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hSVElNMV9SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX0hSVElNMV9SRUxFQVNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMxX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMyX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMyX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMzX0ZPUkNFX1JFU0VUICAgICAgICBfX0hBTF9SQ0NfU0RBREMzX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fU0RBREMxX1JFTEVBU0VfUkVTRVQgICAgICBfX0hBTF9SQ0NfU0RBREMxX1JFTEVBU0VfUkVTRVQKKyNkZWZpbmUgX19TREFEQzJfUkVMRUFTRV9SRVNFVCAgICAgIF9fSEFMX1JDQ19TREFEQzJfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX1NEQURDM19SRUxFQVNFX1JFU0VUICAgICAgX19IQUxfUkNDX1NEQURDM19SRUxFQVNFX1JFU0VUCisKKyNkZWZpbmUgX19BREMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19BREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfQURDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19BREMxMl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19BREMxMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0FEQzEyX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0FEQzEyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0FEQzM0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0FEQzM0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQURDMzRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfQURDMzRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fQ0VDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfQ0VDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0NSQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0NSQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMxX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19EQUMyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19EQUMyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fREFDMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfREFDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUExX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUExX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMV9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19ETUEyX0lTX0NMS19FTkFCTEVEICAgICAgIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fRE1BMl9JU19DTEtfRElTQUJMRUQgICAgICBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19GTElURl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19GTElURl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZMSVRGX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0ZMSVRGX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0ZNQ19JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX0ZNQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPQV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9BX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9CX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0JfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0NfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPQ19JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPRF9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9EX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9FX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0VfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fR1BJT0ZfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfR1BJT0ZfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19HUElPRl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19HUElPRl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19HUElPR19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19HUElPR19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0dQSU9HX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX0dQSU9HX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0dQSU9IX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fR1BJT0hfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSFJUSU0xX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfSFJUSU0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzFfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMxX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzJfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMyX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0kyQzNfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19JMkMzX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRU5BQkxFRCAgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1BXUl9JU19DTEtfRElTQUJMRUQgICAgICAgX19IQUxfUkNDX1BXUl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TWVNDRkdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1BJNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1BJNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NQSTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NQSTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fU0RBREMxX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfU0RBREMxX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NEQURDMl9JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1NEQURDMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19TREFEQzNfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19TREFEQzNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fU1JBTV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfU1JBTV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1NSQU1fSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1NSQU1fSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTFfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTJfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTJfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNM19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTNfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTNfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTRfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNV9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTVfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTVfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNNl9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTZfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTZfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNN19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNN19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNOF9JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfVElNOF9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTThfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1RJTThfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTJfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTJfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xMl9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xMl9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xM19JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTEzX0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTEzX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMTVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMTVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xNl9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xNl9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE2X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTE3X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMTdfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVElNMThfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVElNMThfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19USU0xOF9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19USU0xOF9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19USU0xOV9JU19DTEtfRU5BQkxFRCAgICAgIF9fSEFMX1JDQ19USU0xOV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1RJTTE5X0lTX0NMS19ESVNBQkxFRCAgICAgX19IQUxfUkNDX1RJTTE5X0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1RJTTIwX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1RJTTIwX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVElNMjBfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVElNMjBfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19FTkFCTEVEICAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVFNDX0lTX0NMS19ESVNBQkxFRCAgICAgICBfX0hBTF9SQ0NfVFNDX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VBUlQ0X0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1VBUlQ0X0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVUFSVDRfSVNfQ0xLX0RJU0FCTEVEICAgICBfX0hBTF9SQ0NfVUFSVDRfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVUFSVDVfSVNfQ0xLX0VOQUJMRUQgICAgICBfX0hBTF9SQ0NfVUFSVDVfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VQVJUNV9JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19VQVJUNV9JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQgICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVEICAgIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19FTkFCTEVEICAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fVVNBUlQyX0lTX0NMS19ESVNBQkxFRCAgICBfX0hBTF9SQ0NfVVNBUlQyX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRU5BQkxFRCAgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1VTQVJUM19JU19DTEtfRElTQUJMRUQgICAgX19IQUxfUkNDX1VTQVJUM19JU19DTEtfRElTQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0VOQUJMRUQgICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgX19VU0JfSVNfQ0xLX0RJU0FCTEVEICAgICAgIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIF9fV1dER19JU19DTEtfRU5BQkxFRCAgICAgICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX1dXREdfSVNfQ0xLX0RJU0FCTEVEICAgICAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0RJU0FCTEVECisKKyNpZiBkZWZpbmVkKFNUTTMyTDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0NMS19ESVNBQkxFICAgICAgICAgX19IQUxfUkNDX0FFU19DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRU5BQkxFICAgICAgICAgIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19BRVNfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0VOQUJMRSAgICBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfRk9SQ0VfUkVTRVQgICAgICAgICBfX0hBTF9SQ0NfQUVTX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX1JFTEVBU0VfUkVTRVQgICAgICAgX19IQUxfUkNDX0FFU19SRUxFQVNFX1JFU0VUCisjZW5kaWYgLyogU1RNMzJMMSAqLworCisjaWYgZGVmaW5lZChTVE0zMkY0KQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0ZPUkNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19TRElPX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfUkVMRUFTRV9SRVNFVCAgICAgX19IQUxfUkNDX1NESU9fUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19TRElPX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9DTEtfU0xFRVBfRElTQUJMRSBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NMS19FTkFCTEUgICAgICAgIF9fSEFMX1JDQ19TRElPX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9DTEtfRElTQUJMRSAgICAgICBfX0hBTF9SQ0NfU0RJT19DTEtfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0lTX0NMS19FTkFCTEVEICAgIF9fSEFMX1JDQ19TRElPX0lTX0NMS19FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0RJU0FCTEVEICAgX19IQUxfUkNDX1NESU9fSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIFNkbW1jMUNsb2NrU2VsZWN0aW9uICAgICAgICAgICAgICAgU2Rpb0Nsb2NrU2VsZWN0aW9uCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfU0RNTUMxICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19TRElPCisjZGVmaW5lIFJDQ19TRE1NQzFDTEtTT1VSQ0VfQ0xLNDggICAgICAgICAgUkNDX1NESU9DTEtTT1VSQ0VfQ0s0OAorI2RlZmluZSBSQ0NfU0RNTUMxQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgIFJDQ19TRElPQ0xLU09VUkNFX1NZU0NMSworI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX0NPTkZJRyAgICAgICAgICAgIF9fSEFMX1JDQ19TRElPX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1NETU1DMV9TT1VSQ0UgICAgICAgIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDQpCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX1NETU1DMV9GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRU5BQkxFICAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DTEtfU0xFRVBfRElTQUJMRSAgIF9fSEFMX1JDQ19TRE1NQzFfQ0xLX1NMRUVQX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX1NESU9fQ0xLX0RJU0FCTEUgICAgICAgICBfX0hBTF9SQ0NfU0RNTUMxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19TRElPX0lTX0NMS19FTkFCTEVEICAgICAgX19IQUxfUkNDX1NETU1DMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19JU19DTEtfRElTQUJMRUQgICAgIF9fSEFMX1JDQ19TRE1NQzFfSVNfQ0xLX0RJU0FCTEVECisjZGVmaW5lIFNkaW9DbG9ja1NlbGVjdGlvbiAgICAgICAgICAgICAgICAgU2RtbWMxQ2xvY2tTZWxlY3Rpb24KKyNkZWZpbmUgUkNDX1BFUklQSENMS19TRElPICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1NETU1DMQorI2RlZmluZSBfX0hBTF9SQ0NfU0RJT19DT05GSUcgICAgICAgICAgICAgIF9fSEFMX1JDQ19TRE1NQzFfQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU0RJT19TT1VSQ0UgICAgICAgICAgX19IQUxfUkNDX0dFVF9TRE1NQzFfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykKKyNkZWZpbmUgUkNDX1NESU9DTEtTT1VSQ0VfQ0xLNDggICAgICAgICAgICAgUkNDX1NETU1DMUNMS1NPVVJDRV9DTEs0OAorI2RlZmluZSBSQ0NfU0RJT0NMS1NPVVJDRV9TWVNDTEsgICAgICAgICAgIFJDQ19TRE1NQzFDTEtTT1VSQ0VfU1lTQ0xLCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSgpICAgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19ESVNBQkxFKCkgICAgICAgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19ESVNBQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfRElTQUJMRSgpICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfVUxQSV9DTEtfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0ZPUkNFX1JFU0VUKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMV9PVEdfSFNfUkVMRUFTRV9SRVNFVCgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUoKSAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19VTFBJX0NMS19TTEVFUF9FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgIF9fSEFMX1JDQ19VU0IxX09UR19IU19DTEtfU0xFRVBfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgX19IQUxfUkNDX1VTQjFfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKQorCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX0VOQUJMRSgpICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfRU5BQkxFKCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9PVEdfRlNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIF9fSEFMX1JDQ19VU0IyX09UR19GU19DTEtfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX1VMUElfQ0xLX0RJU0FCTEUoKSAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfVUxQSV9DTEtfRElTQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfRk9SQ0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX1JFTEVBU0VfUkVTRVQoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX0NMS19TTEVFUF9FTkFCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19VTFBJX0NMS19TTEVFUF9FTkFCTEUoKSAgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBfX0hBTF9SQ0NfVVNCMl9PVEdfRlNfQ0xLX1NMRUVQX0RJU0FCTEUoKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX09UR19GU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFKCkgX19IQUxfUkNDX1VTQjJfT1RHX0ZTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKQorI2VuZGlmCisKKyNkZWZpbmUgX19IQUxfUkNDX0kyU0NMSyAgICAgICAgICAgIF9fSEFMX1JDQ19JMlNfQ09ORklHCisjZGVmaW5lIF9fSEFMX1JDQ19JMlNDTEtfQ09ORklHICAgICBfX0hBTF9SQ0NfSTJTX0NPTkZJRworCisjZGVmaW5lIF9fUkNDX1BMTFNSQyAgICAgICAgICAgICAgICBSQ0NfR0VUX1BMTF9PU0NTT1VSQ0UKKworI2RlZmluZSBJU19SQ0NfTVNJUkFOR0UgICAgICAgICAgICAgSVNfUkNDX01TSV9DTE9DS19SQU5HRQorI2RlZmluZSBJU19SQ0NfUlRDQ0xLX1NPVVJDRSAgICAgICAgSVNfUkNDX1JUQ0NMS1NPVVJDRQorI2RlZmluZSBJU19SQ0NfU1lTQ0xLX0RJViAgICAgICAgICAgSVNfUkNDX0hDTEsKKyNkZWZpbmUgSVNfUkNDX0hDTEtfRElWICAgICAgICAgICAgIElTX1JDQ19QQ0xLCisjZGVmaW5lIElTX1JDQ19QRVJJUEhDTEsgICAgICAgICAgICBJU19SQ0NfUEVSSVBIQ0xPQ0sKKworI2RlZmluZSBSQ0NfSVRfSFNJMTQgICAgICAgICAgICAgICAgUkNDX0lUX0hTSTE0UkRZCisKKyNkZWZpbmUgUkNDX0lUX0NTU0xTRSAgICAgICAgICAgICAgIFJDQ19JVF9MU0VDU1MKKyNkZWZpbmUgUkNDX0lUX0NTU0hTRSAgICAgICAgICAgICAgIFJDQ19JVF9DU1MKKworI2RlZmluZSBSQ0NfUExMTVVMXzMgICAgICAgICAgICAgICAgUkNDX1BMTF9NVUwzCisjZGVmaW5lIFJDQ19QTExNVUxfNCAgICAgICAgICAgICAgICBSQ0NfUExMX01VTDQKKyNkZWZpbmUgUkNDX1BMTE1VTF82ICAgICAgICAgICAgICAgIFJDQ19QTExfTVVMNgorI2RlZmluZSBSQ0NfUExMTVVMXzggICAgICAgICAgICAgICAgUkNDX1BMTF9NVUw4CisjZGVmaW5lIFJDQ19QTExNVUxfMTIgICAgICAgICAgICAgICBSQ0NfUExMX01VTDEyCisjZGVmaW5lIFJDQ19QTExNVUxfMTYgICAgICAgICAgICAgICBSQ0NfUExMX01VTDE2CisjZGVmaW5lIFJDQ19QTExNVUxfMjQgICAgICAgICAgICAgICBSQ0NfUExMX01VTDI0CisjZGVmaW5lIFJDQ19QTExNVUxfMzIgICAgICAgICAgICAgICBSQ0NfUExMX01VTDMyCisjZGVmaW5lIFJDQ19QTExNVUxfNDggICAgICAgICAgICAgICBSQ0NfUExMX01VTDQ4CisKKyNkZWZpbmUgUkNDX1BMTERJVl8yICAgICAgICAgICAgICAgIFJDQ19QTExfRElWMgorI2RlZmluZSBSQ0NfUExMRElWXzMgICAgICAgICAgICAgICAgUkNDX1BMTF9ESVYzCisjZGVmaW5lIFJDQ19QTExESVZfNCAgICAgICAgICAgICAgICBSQ0NfUExMX0RJVjQKKworI2RlZmluZSBJU19SQ0NfTUNPU09VUkNFICAgICAgICAgICAgSVNfUkNDX01DTzFTT1VSQ0UKKyNkZWZpbmUgX19IQUxfUkNDX01DT19DT05GSUcgICAgICAgIF9fSEFMX1JDQ19NQ08xX0NPTkZJRworI2RlZmluZSBSQ0NfTUNPX05PRElWICAgICAgICAgICAgICAgUkNDX01DT0RJVl8xCisjZGVmaW5lIFJDQ19NQ09fRElWMSAgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzEKKyNkZWZpbmUgUkNDX01DT19ESVYyICAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMgorI2RlZmluZSBSQ0NfTUNPX0RJVjQgICAgICAgICAgICAgICAgUkNDX01DT0RJVl80CisjZGVmaW5lIFJDQ19NQ09fRElWOCAgICAgICAgICAgICAgICBSQ0NfTUNPRElWXzgKKyNkZWZpbmUgUkNDX01DT19ESVYxNiAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMTYKKyNkZWZpbmUgUkNDX01DT19ESVYzMiAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfMzIKKyNkZWZpbmUgUkNDX01DT19ESVY2NCAgICAgICAgICAgICAgIFJDQ19NQ09ESVZfNjQKKyNkZWZpbmUgUkNDX01DT19ESVYxMjggICAgICAgICAgICAgIFJDQ19NQ09ESVZfMTI4CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfTk9ORSAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfTFNJICAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9MU0kKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9MU0UgICAgICAgICAgIFJDQ19NQ08xU09VUkNFX0xTRQorI2RlZmluZSBSQ0NfTUNPU09VUkNFX1NZU0NMSyAgICAgICAgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNJICAgICAgICAgICBSQ0NfTUNPMVNPVVJDRV9IU0kKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9IU0kxNCAgICAgICAgIFJDQ19NQ08xU09VUkNFX0hTSTE0CisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfSFNJNDggICAgICAgICBSQ0NfTUNPMVNPVVJDRV9IU0k0OAorI2RlZmluZSBSQ0NfTUNPU09VUkNFX0hTRSAgICAgICAgICAgUkNDX01DTzFTT1VSQ0VfSFNFCisjZGVmaW5lIFJDQ19NQ09TT1VSQ0VfUExMQ0xLX0RJVjEgICBSQ0NfTUNPMVNPVVJDRV9QTExDTEsKKyNkZWZpbmUgUkNDX01DT1NPVVJDRV9QTExDTEtfTk9ESVYgIFJDQ19NQ08xU09VUkNFX1BMTENMSworI2RlZmluZSBSQ0NfTUNPU09VUkNFX1BMTENMS19ESVYyICAgUkNDX01DTzFTT1VSQ0VfUExMQ0xLX0RJVjIKKworI2lmIGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT19DTEsgICAgIFJDQ19SVENDTEtTT1VSQ0VfTk9ORQorI2VsaWYgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJHNCkKKyNlbHNlCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAgICAgICBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSworI2VuZGlmCisKKyNkZWZpbmUgUkNDX1VTQkNMS19QTExTQUkxICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMU0FJMQorI2RlZmluZSBSQ0NfVVNCQ0xLX1BMTCAgICAgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQkNMS19NU0kgICAgICAgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfTVNJCisjZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMQ0xLICAgICBSQ0NfVVNCQ0xLU09VUkNFX1BMTAorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjEgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTEwKKyNkZWZpbmUgUkNDX1VTQlBMTENMS19ESVYxXzUgICAgICAgIFJDQ19VU0JDTEtTT1VSQ0VfUExMX0RJVjFfNQorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjIgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMgorI2RlZmluZSBSQ0NfVVNCUExMQ0xLX0RJVjMgICAgICAgICAgUkNDX1VTQkNMS1NPVVJDRV9QTExfRElWMworCisjZGVmaW5lIEhTSU9OX0JpdE51bWJlciAgICAgICAgUkNDX0hTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSFNJT05fQklUTlVNQkVSICAgICAgICBSQ0NfSFNJT05fQklUX05VTUJFUgorI2RlZmluZSBIU0VPTl9CaXROdW1iZXIgICAgICAgIFJDQ19IU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIEhTRU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0hTRU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTVNJT05fQklUTlVNQkVSICAgICAgICBSQ0NfTVNJT05fQklUX05VTUJFUgorI2RlZmluZSBDU1NPTl9CaXROdW1iZXIgICAgICAgIFJDQ19DU1NPTl9CSVRfTlVNQkVSCisjZGVmaW5lIENTU09OX0JJVE5VTUJFUiAgICAgICAgUkNDX0NTU09OX0JJVF9OVU1CRVIKKyNkZWZpbmUgUExMT05fQml0TnVtYmVyICAgICAgICBSQ0NfUExMT05fQklUX05VTUJFUgorI2RlZmluZSBQTExPTl9CSVROVU1CRVIgICAgICAgIFJDQ19QTExPTl9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTEkyU09OX0JpdE51bWJlciAgICAgUkNDX1BMTEkyU09OX0JJVF9OVU1CRVIKKyNkZWZpbmUgSTJTU1JDX0JpdE51bWJlciAgICAgICBSQ0NfSTJTU1JDX0JJVF9OVU1CRVIKKyNkZWZpbmUgUlRDRU5fQml0TnVtYmVyICAgICAgICBSQ0NfUlRDRU5fQklUX05VTUJFUgorI2RlZmluZSBSVENFTl9CSVROVU1CRVIgICAgICAgIFJDQ19SVENFTl9CSVRfTlVNQkVSCisjZGVmaW5lIEJEUlNUX0JpdE51bWJlciAgICAgICAgUkNDX0JEUlNUX0JJVF9OVU1CRVIKKyNkZWZpbmUgQkRSU1RfQklUTlVNQkVSICAgICAgICBSQ0NfQkRSU1RfQklUX05VTUJFUgorI2RlZmluZSBSVENSU1RfQklUTlVNQkVSICAgICAgIFJDQ19SVENSU1RfQklUX05VTUJFUgorI2RlZmluZSBMU0lPTl9CaXROdW1iZXIgICAgICAgIFJDQ19MU0lPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTSU9OX0JJVE5VTUJFUiAgICAgICAgUkNDX0xTSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgTFNFT05fQml0TnVtYmVyICAgICAgICBSQ0NfTFNFT05fQklUX05VTUJFUgorI2RlZmluZSBMU0VPTl9CSVROVU1CRVIgICAgICAgIFJDQ19MU0VPTl9CSVRfTlVNQkVSCisjZGVmaW5lIExTRUJZUF9CSVROVU1CRVIgICAgICAgUkNDX0xTRUJZUF9CSVRfTlVNQkVSCisjZGVmaW5lIFBMTFNBSU9OX0JpdE51bWJlciAgICAgUkNDX1BMTFNBSU9OX0JJVF9OVU1CRVIKKyNkZWZpbmUgVElNUFJFX0JpdE51bWJlciAgICAgICBSQ0NfVElNUFJFX0JJVF9OVU1CRVIKKyNkZWZpbmUgUk1WRl9CaXROdW1iZXIgICAgICAgICBSQ0NfUk1WRl9CSVRfTlVNQkVSCisjZGVmaW5lIFJNVkZfQklUTlVNQkVSICAgICAgICAgUkNDX1JNVkZfQklUX05VTUJFUgorI2RlZmluZSBSQ0NfQ1IyX0hTSTE0VFJJTV9CaXROdW1iZXIgUkNDX0hTSTE0VFJJTV9CSVRfTlVNQkVSCisjZGVmaW5lIENSX0JZVEUyX0FERFJFU1MgICAgICAgUkNDX0NSX0JZVEUyX0FERFJFU1MKKyNkZWZpbmUgQ0lSX0JZVEUxX0FERFJFU1MgICAgICBSQ0NfQ0lSX0JZVEUxX0FERFJFU1MKKyNkZWZpbmUgQ0lSX0JZVEUyX0FERFJFU1MgICAgICBSQ0NfQ0lSX0JZVEUyX0FERFJFU1MKKyNkZWZpbmUgQkRDUl9CWVRFMF9BRERSRVNTICAgICBSQ0NfQkRDUl9CWVRFMF9BRERSRVNTCisjZGVmaW5lIERCUF9USU1FT1VUX1ZBTFVFICAgICAgUkNDX0RCUF9USU1FT1VUX1ZBTFVFCisjZGVmaW5lIExTRV9USU1FT1VUX1ZBTFVFICAgICAgUkNDX0xTRV9USU1FT1VUX1ZBTFVFCisKKyNkZWZpbmUgQ1JfSFNJT05fQkIgICAgICAgICAgICBSQ0NfQ1JfSFNJT05fQkIKKyNkZWZpbmUgQ1JfQ1NTT05fQkIgICAgICAgICAgICBSQ0NfQ1JfQ1NTT05fQkIKKyNkZWZpbmUgQ1JfUExMT05fQkIgICAgICAgICAgICBSQ0NfQ1JfUExMT05fQkIKKyNkZWZpbmUgQ1JfUExMSTJTT05fQkIgICAgICAgICBSQ0NfQ1JfUExMSTJTT05fQkIKKyNkZWZpbmUgQ1JfTVNJT05fQkIgICAgICAgICAgICBSQ0NfQ1JfTVNJT05fQkIKKyNkZWZpbmUgQ1NSX0xTSU9OX0JCICAgICAgICAgICBSQ0NfQ1NSX0xTSU9OX0JCCisjZGVmaW5lIENTUl9MU0VPTl9CQiAgICAgICAgICAgUkNDX0NTUl9MU0VPTl9CQgorI2RlZmluZSBDU1JfTFNFQllQX0JCICAgICAgICAgIFJDQ19DU1JfTFNFQllQX0JCCisjZGVmaW5lIENTUl9SVENFTl9CQiAgICAgICAgICAgUkNDX0NTUl9SVENFTl9CQgorI2RlZmluZSBDU1JfUlRDUlNUX0JCICAgICAgICAgIFJDQ19DU1JfUlRDUlNUX0JCCisjZGVmaW5lIENGR1JfSTJTU1JDX0JCICAgICAgICAgUkNDX0NGR1JfSTJTU1JDX0JCCisjZGVmaW5lIEJEQ1JfUlRDRU5fQkIgICAgICAgICAgUkNDX0JEQ1JfUlRDRU5fQkIKKyNkZWZpbmUgQkRDUl9CRFJTVF9CQiAgICAgICAgICBSQ0NfQkRDUl9CRFJTVF9CQgorI2RlZmluZSBDUl9IU0VPTl9CQiAgICAgICAgICAgIFJDQ19DUl9IU0VPTl9CQgorI2RlZmluZSBDU1JfUk1WRl9CQiAgICAgICAgICAgIFJDQ19DU1JfUk1WRl9CQgorI2RlZmluZSBDUl9QTExTQUlPTl9CQiAgICAgICAgIFJDQ19DUl9QTExTQUlPTl9CQgorI2RlZmluZSBEQ0tDRkdSX1RJTVBSRV9CQiAgICAgIFJDQ19EQ0tDRkdSX1RJTVBSRV9CQgorCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0ZSRVFfRVJST1JfQ09VTlRFUiAgICAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRElTQUJMRV9GUkVRX0VSUk9SX0NPVU5URVIgICAgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0VOQUJMRV9BVVRPTUFUSUNfQ0FMSUIgICAgICAgIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0RJU0FCTEVfQVVUT01BVElDX0NBTElCICAgICAgIF9fSEFMX1JDQ19DUlNfQVVUT01BVElDX0NBTElCX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DQUxDVUxBVEVfUkVMT0FEVkFMVUUgICAgICAgICBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURQorCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSVRfU09VUkNFICAgICAgICAgICAgICAgICAgICAgX19IQUxfUkNDX0dFVF9JVAorCisjZGVmaW5lIFJDQ19DUlNfU1lOQ1dBUk0gICAgICAgUkNDX0NSU19TWU5DV0FSTgorI2RlZmluZSBSQ0NfQ1JTX1RSSU1PViAgICAgICAgIFJDQ19DUlNfVFJJTU9WRgorCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfQ0s0OCAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQ0xLNDgKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMUSAgICAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTFEKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMU0FJUCAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTFNBSVAKKyNkZWZpbmUgUkNDX0NLNDhDTEtTT1VSQ0VfUExMSTJTUSAgICAgICAgUkNDX0NMSzQ4Q0xLU09VUkNFX1BMTEkyU1EKKyNkZWZpbmUgSVNfUkNDX0NLNDhDTEtTT1VSQ0UgICAgICAgICAgICAgSVNfUkNDX0NMSzQ4Q0xLU09VUkNFCisjZGVmaW5lIFJDQ19TRElPQ0xLU09VUkNFX0NLNDggICAgICAgICAgIFJDQ19TRElPQ0xLU09VUkNFX0NMSzQ4CisKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19FTkFCTEUgICAgICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DTEtfRElTQUJMRSAgICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0lTX0NMS19FTkFCTEVEICAgICAgICAgX19IQUxfUkNDX0RGU0RNMV9JU19DTEtfRU5BQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX0RJU0FCTEVEICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19ESVNBQkxFRAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fRk9SQ0VfUkVTRVQgICAgICAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0ZPUkNFX1JFU0VUCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9SRUxFQVNFX1JFU0VUICAgICAgICAgIF9fSEFMX1JDQ19ERlNETTFfUkVMRUFTRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fQ0xLX1NMRUVQX0VOQUJMRSAgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NMS19TTEVFUF9FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0RGU0RNX0NMS19TTEVFUF9ESVNBQkxFICAgICAgX19IQUxfUkNDX0RGU0RNMV9DTEtfU0xFRVBfRElTQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfREZTRE1fSVNfQ0xLX1NMRUVQX0VOQUJMRUQgICBfX0hBTF9SQ0NfREZTRE0xX0lTX0NMS19TTEVFUF9FTkFCTEVECisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9JU19DTEtfU0xFRVBfRElTQUJMRUQgIF9fSEFMX1JDQ19ERlNETTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVECisjZGVmaW5lIERmc2RtQ2xvY2tTZWxlY3Rpb24gICAgICAgICBEZnNkbTFDbG9ja1NlbGVjdGlvbgorI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0RGU0RNICAgICAgICAgUkNDX1BFUklQSENMS19ERlNETTEKKyNkZWZpbmUgUkNDX0RGU0RNQ0xLU09VUkNFX1BDTEsgICAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzIKKyNkZWZpbmUgUkNDX0RGU0RNQ0xLU09VUkNFX1NZU0NMSyAgIFJDQ19ERlNETTFDTEtTT1VSQ0VfU1lTQ0xLCisjZGVmaW5lIF9fSEFMX1JDQ19ERlNETV9DT05GSUcgICAgICBfX0hBTF9SQ0NfREZTRE0xX0NPTkZJRworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0RGU0RNX1NPVVJDRSAgX19IQUxfUkNDX0dFVF9ERlNETTFfU09VUkNFCisjZGVmaW5lIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19TV1BNSTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfU1dQTUkxQ0xLU09VUkNFX1BDTEsxCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSyAgICBSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxCisjZGVmaW5lIFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSyAgICBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxCisKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjEgICAgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyU0FQQjIgICAgUkNDX0RGU0RNMUFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjEgICAgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzEKKyNkZWZpbmUgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyU0FQQjIgICAgUkNDX0RGU0RNMkFVRElPQ0xLU09VUkNFX0kyUzIKKyNkZWZpbmUgUkNDX0RGU0RNMUNMS1NPVVJDRV9BUEIyICAgICAgICAgICAgUkNDX0RGU0RNMUNMS1NPVVJDRV9QQ0xLMgorI2RlZmluZSBSQ0NfREZTRE0yQ0xLU09VUkNFX0FQQjIgICAgICAgICAgICBSQ0NfREZTRE0yQ0xLU09VUkNFX1BDTEsyCisjZGVmaW5lIFJDQ19GTVBJMkMxQ0xLU09VUkNFX0FQQiAgICAgICAgICAgIFJDQ19GTVBJMkMxQ0xLU09VUkNFX1BDTEsxCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1JOR19BbGlhc2VkX01hY3JvcyBIQUwgUk5HIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9STkdfUmVhZHlDYWxsYmFjayhfX0hBTkRMRV9fKSAgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjaygoX19IQU5ETEVfXyksIHVpbnQzMl90IHJhbmRvbTMyYml0KQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9NYWNyb3MgSEFMIFJUQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJHMCkgfHwgZGVmaW5lZCAoU1RNMzJMNDEyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDQyMnh4KSB8fCBkZWZpbmVkIChTVE0zMkc0KQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRworI2VuZGlmCisjZGVmaW5lIF9fSEFMX1JUQ19ESVNBQkxFX0lUICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfUlRDX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfRU5BQkxFX0lUCisKKyNpZiBkZWZpbmVkIChTVE0zMkYxKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICBfX0hBTF9SVENfQUxBUk1fRVhUSV9DTEVBUl9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0RJU0FCTEVfSVQoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKQorCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFVF9GTEFHKCkKKworI2RlZmluZSBfX0hBTF9SVENfRVhUSV9HRU5FUkFURV9TV0lUKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpICAgX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpCisjZWxzZQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpID8gX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfQ0xFQVJfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9FTkFCTEVfSVQoX19FWFRJX0xJTkVfXykgICAoKChfX0VYVElfTElORV9fKSAgPT0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkgPyBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCkpKQorI2RlZmluZSBfX0hBTF9SVENfRVhUSV9ESVNBQkxFX0lUKF9fRVhUSV9MSU5FX18pICAoKChfX0VYVElfTElORV9fKSA9PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSA/IF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfSVQoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfSVQoKSkpCisjZGVmaW5lIF9fSEFMX1JUQ19FWFRJX0dFVF9GTEFHKF9fRVhUSV9MSU5FX18pICAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VUX0ZMQUcoKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRVRfRkxBRygpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRVRfRkxBRygpKSkKKyNkZWZpbmUgX19IQUxfUlRDX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSAgICgoKF9fRVhUSV9MSU5FX18pID09IFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpID8gX19IQUxfUlRDX0FMQVJNX0VYVElfR0VORVJBVEVfU1dJVCgpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19FWFRJX0xJTkVfXykgPT0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkgPyBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgOiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfR0VORVJBVEVfU1dJVCgpKSkKKyNlbmRpZiAgIC8qIFNUTTMyRjEgKi8KKworI2RlZmluZSBJU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19SVENfQUxBUk0KKyNkZWZpbmUgSVNfQUxBUk1fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX0FMQVJNX01BU0sKKyNkZWZpbmUgSVNfVEFNUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUgorI2RlZmluZSBJU19UQU1QRVJfRVJBU0VfTU9ERSAgICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX0VSQVNFX01PREUKKyNkZWZpbmUgSVNfVEFNUEVSX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9GSUxURVIKKyNkZWZpbmUgSVNfVEFNUEVSX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQKKyNkZWZpbmUgSVNfVEFNUEVSX01BU0tGTEFHX1NUQVRFICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9NQVNLRkxBR19TVEFURQorI2RlZmluZSBJU19UQU1QRVJfUFJFQ0hBUkdFX0RVUkFUSU9OICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTgorI2RlZmluZSBJU19UQU1QRVJfUFVMTFVQX1NUQVRFICAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1BVTExVUF9TVEFURQorI2RlZmluZSBJU19UQU1QRVJfU0FNUExJTkdfRlJFUSAgICAgICAgICAgICAgICAgICBJU19SVENfVEFNUEVSX1NBTVBMSU5HX0ZSRVEKKyNkZWZpbmUgSVNfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTiAgICAgSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04KKyNkZWZpbmUgSVNfVEFNUEVSX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1RBTVBFUl9UUklHR0VSCisjZGVmaW5lIElTX1dBS0VVUF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1JUQ19XQUtFVVBfQ0xPQ0sKKyNkZWZpbmUgSVNfV0FLRVVQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgSVNfUlRDX1dBS0VVUF9DT1VOVEVSCisKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUKKyNkZWZpbmUgX19SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TRF9BbGlhc2VkX01hY3JvcyBIQUwgU0QgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIFNEX09DUl9DSURfQ1NEX09WRVJXUklFVEUgICBTRF9PQ1JfQ0lEX0NTRF9PVkVSV1JJVEUKKyNkZWZpbmUgU0RfQ01EX1NEX0FQUF9TVEFVUyAgICAgICAgIFNEX0NNRF9TRF9BUFBfU1RBVFVTCisKKyNpZiBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikKKyNkZWZpbmUgIFNEX1NETU1DX0RJU0FCTEVEICAgICAgICAgIFNEX1NESU9fRElTQUJMRUQKKyNkZWZpbmUgIFNEX1NETU1DX0ZVTkNUSU9OX0JVU1kgICAgIFNEX1NESU9fRlVOQ1RJT05fQlVTWQorI2RlZmluZSAgU0RfU0RNTUNfRlVOQ1RJT05fRkFJTEVEICAgU0RfU0RJT19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04gIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTgorI2RlZmluZSAgU0RfQ01EX1NETU1DX1NFTl9PUF9DT05EICAgU0RfQ01EX1NESU9fU0VOX09QX0NPTkQKKyNkZWZpbmUgIFNEX0NNRF9TRE1NQ19SV19ESVJFQ1QgICAgIFNEX0NNRF9TRElPX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVEICAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0VOQUJMRSAgICAgIF9fSEFMX1NEX1NESU9fRU5BQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19ESVNBQkxFICAgICBfX0hBTF9TRF9TRElPX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRQorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRE1BX0RJU0FCTEUgX19IQUxfU0RfU0RJT19ETUFfRElTQUJMCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQgICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVAorI2RlZmluZSAgX19IQUxfU0RfU0RNTUNfRElTQUJMRV9JVCAgX19IQUxfU0RfU0RJT19ESVNBQkxFX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19HRVRfRkxBRyAgICBfX0hBTF9TRF9TRElPX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcKKyNkZWZpbmUgIF9fSEFMX1NEX1NETU1DX0dFVF9JVCAgICAgIF9fSEFMX1NEX1NESU9fR0VUX0lUCisjZGVmaW5lICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9JVCAgICBfX0hBTF9TRF9TRElPX0NMRUFSX0lUCisjZGVmaW5lICBTRE1NQ19TVEFUSUNfRkxBR1MgICAgICAgICBTRElPX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RNTUNfQ01EMFRJTUVPVVQgICAgICAgICAgU0RJT19DTUQwVElNRU9VVAorI2RlZmluZSAgU0RfU0RNTUNfU0VORF9JRl9DT05EICAgICAgU0RfU0RJT19TRU5EX0lGX0NPTkQKKy8qIGFsaWFzIENNU0lTICovCisjZGVmaW5lICBTRE1NQzFfSVJRbiAgICAgICAgICAgICAgICBTRElPX0lSUW4KKyNkZWZpbmUgIFNETU1DMV9JUlFIYW5kbGVyICAgICAgICAgIFNESU9fSVJRSGFuZGxlcgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgIFNEX1NESU9fRElTQUJMRUQgICAgICAgICAgIFNEX1NETU1DX0RJU0FCTEVECisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0JVU1kgICAgICBTRF9TRE1NQ19GVU5DVElPTl9CVVNZCisjZGVmaW5lICBTRF9TRElPX0ZVTkNUSU9OX0ZBSUxFRCAgICBTRF9TRE1NQ19GVU5DVElPTl9GQUlMRUQKKyNkZWZpbmUgIFNEX1NESU9fVU5LTk9XTl9GVU5DVElPTiAgIFNEX1NETU1DX1VOS05PV05fRlVOQ1RJT04KKyNkZWZpbmUgIFNEX0NNRF9TRElPX1NFTl9PUF9DT05EICAgIFNEX0NNRF9TRE1NQ19TRU5fT1BfQ09ORAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRElSRUNUICAgICAgU0RfQ01EX1NETU1DX1JXX0RJUkVDVAorI2RlZmluZSAgU0RfQ01EX1NESU9fUldfRVhURU5ERUQgICAgU0RfQ01EX1NETU1DX1JXX0VYVEVOREVECisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRSAgICAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRSAgICAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0VOQUJMRSAgIF9fSEFMX1NEX1NETU1DX0RNQV9FTkFCTEUKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRE1BX0RJU0FCTCAgIF9fSEFMX1NEX1NETU1DX0RNQV9ESVNBQkxFCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0VOQUJMRV9JVCAgICBfX0hBTF9TRF9TRE1NQ19FTkFCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fRElTQUJMRV9JVCAgIF9fSEFMX1NEX1NETU1DX0RJU0FCTEVfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fR0VUX0ZMQUcgICAgIF9fSEFMX1NEX1NETU1DX0dFVF9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0NMRUFSX0ZMQUcgICBfX0hBTF9TRF9TRE1NQ19DTEVBUl9GTEFHCisjZGVmaW5lICBfX0hBTF9TRF9TRElPX0dFVF9JVCAgICAgICBfX0hBTF9TRF9TRE1NQ19HRVRfSVQKKyNkZWZpbmUgIF9fSEFMX1NEX1NESU9fQ0xFQVJfSVQgICAgIF9fSEFMX1NEX1NETU1DX0NMRUFSX0lUCisjZGVmaW5lICBTRElPX1NUQVRJQ19GTEFHUwkgICAgICAgIFNETU1DX1NUQVRJQ19GTEFHUworI2RlZmluZSAgU0RJT19DTUQwVElNRU9VVAkgICAgICAgICAgU0RNTUNfQ01EMFRJTUVPVVQKKyNkZWZpbmUgIFNEX1NESU9fU0VORF9JRl9DT05ECSAgICAgIFNEX1NETU1DX1NFTkRfSUZfQ09ORAorLyogYWxpYXMgQ01TSVMgZm9yIGNvbXBhdGliaWxpdGllcyAqLworI2RlZmluZSAgU0RJT19JUlFuICAgICAgICAgICAgICAgICAgU0RNTUMxX0lSUW4KKyNkZWZpbmUgIFNESU9fSVJRSGFuZGxlciAgICAgICAgICAgIFNETU1DMV9JUlFIYW5kbGVyCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJMNCkKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ0lEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENJRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkQ1NEVHlwZWRlZiAgICAgICBIQUxfU0RfQ2FyZENTRFR5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdHVzVHlwZWRlZiAgICBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVEZWYKKyNkZWZpbmUgIEhBTF9TRF9DYXJkU3RhdGVUeXBlZGVmICAgICBIQUxfU0RfQ2FyZFN0YXRlVHlwZURlZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMUNwbHRDYWxsYmFjayAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjFDcGx0Q2FsbGJhY2sKKyNkZWZpbmUgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgIEhBTF9TREV4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjaworI2RlZmluZSBIQUxfU0RFeF9SZWFkX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICAgSEFMX1NERXhfUmVhZF9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TREV4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjFDcGx0Q2FsbGJhY2sgICBIQUxfU0RFeF9Xcml0ZV9ETUFEb3VibGVCdWYxQ3BsdENhbGxiYWNrCisjZGVmaW5lIEhBTF9TRF9Ecml2ZVRyYW5zY2l2ZXJfMV84Vl9DYWxsYmFjayAgICAgICAgICBIQUxfU0RfRHJpdmVUcmFuc2NlaXZlcl8xXzhWX0NhbGxiYWNrCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1NNQVJUQ0FSRF9BbGlhc2VkX01hY3JvcyBIQUwgU01BUlRDQVJEIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEVfSVQgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRV9JVCAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVAorI2RlZmluZSBfX1NNQVJUQ0FSRF9FTkFCTEUgICAgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRElTQUJMRSAgICAgICAgICAgICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRQorI2RlZmluZSBfX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUgIF9fSEFMX1NNQVJUQ0FSRF9ETUFfUkVRVUVTVF9FTkFCTEUKKyNkZWZpbmUgX19TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRSBfX0hBTF9TTUFSVENBUkRfRE1BX1JFUVVFU1RfRElTQUJMRQorCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRDTE9DS1NPVVJDRSAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fU01BUlRDQVJEX0dFVENMT0NLU09VUkNFICAgICAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFCisKKyNkZWZpbmUgSVNfU01BUlRDQVJEX09ORUJJVF9TQU1QTElORyAgICBJU19TTUFSVENBUkRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU01CVVNfQWxpYXNlZF9NYWNyb3MgSEFMIFNNQlVTIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IxICAgICAgICAgICBTTUJVU19SRVNFVF9DUjEKKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfQ1IyICAgICAgICAgICBTTUJVU19SRVNFVF9DUjIKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VORVJBVEVfU1RBUlQgICAgICBTTUJVU19HRU5FUkFURV9TVEFSVAorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfQUREUl9NQVRDSCAgICAgIFNNQlVTX0dFVF9BRERSX01BVENICisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9ESVIgICAgICAgICAgICAgU01CVVNfR0VUX0RJUgorI2RlZmluZSBfX0hBTF9TTUJVU19HRVRfU1RPUF9NT0RFICAgICAgIFNNQlVTX0dFVF9TVE9QX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX1BFQ19NT0RFICAgICAgICBTTUJVU19HRVRfUEVDX01PREUKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQgICBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BJX0FsaWFzZWRfTWFjcm9zIEhBTCBTUEkgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9UWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1RYCisjZGVmaW5lIF9fSEFMX1NQSV8xTElORV9SWCAgICAgICAgICAgICAgU1BJXzFMSU5FX1JYCisjZGVmaW5lIF9fSEFMX1NQSV9SRVNFVF9DUkMgICAgICAgICAgICAgU1BJX1JFU0VUX0NSQworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9VQVJUX0FsaWFzZWRfTWFjcm9zIEhBTCBVQVJUIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9VQVJUX0dFVENMT0NLU09VUkNFICAgICAgIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UKKyNkZWZpbmUgX19IQUxfVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04KKyNkZWZpbmUgX19VQVJUX0dFVENMT0NLU09VUkNFICAgICAgICAgICBVQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVUFSVF9NQVNLX0NPTVBVVEFUSU9OICAgICAgICAgVUFSVF9NQVNLX0NPTVBVVEFUSU9OCisKKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBNRVRIT0RFICAgICAgICAgICBJU19VQVJUX1dBS0VVUE1FVEhPRAorCisjZGVmaW5lIElTX1VBUlRfT05FQklUX1NBTVBMRSAgICAgICAgICAgSVNfVUFSVF9PTkVfQklUX1NBTVBMRQorI2RlZmluZSBJU19VQVJUX09ORUJJVF9TQU1QTElORyAgICAgICAgIElTX1VBUlRfT05FX0JJVF9TQU1QTEUKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEhBTF9VU0FSVF9BbGlhc2VkX01hY3JvcyBIQUwgVVNBUlQgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fVVNBUlRfRU5BQkxFX0lUICAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUCisjZGVmaW5lIF9fVVNBUlRfRElTQUJMRV9JVCAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVAorI2RlZmluZSBfX1VTQVJUX0VOQUJMRSAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRQorI2RlZmluZSBfX1VTQVJUX0RJU0FCTEUgICAgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX0RJU0FCTEUKKworI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRDTE9DS1NPVVJDRSAgICAgIFVTQVJUX0dFVENMT0NLU09VUkNFCisjZGVmaW5lIF9fVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UgICAgICAgICAgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVVNCX0FsaWFzZWRfTWFjcm9zIEhBTCBVU0IgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBVU0JfRVhUSV9MSU5FX1dBS0VVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9GU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0ZTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19GU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9GU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIFVTQl9IU19FWFRJX1RSSUdHRVJfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgVVNCX0hTX0VYVElfVFJJR0dFUl9CT1RIX0VER0UgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIFVTQl9IU19FWFRJX0xJTkVfV0FLRVVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfTElORQorCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfR0VUX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9FWFRJX1NFVF9SSVNJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgIF9fSEFMX1VTQl9XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdfRURHRV9UUklHR0VSICAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgICAgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfVVNCX0ZTX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX1NFVF9GQUxMSU5HX0VHREVfVFJJR0dFUiAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfRlNfRVhUSV9TRVRfRkFMTElOR1JJU0lOR19UUklHR0VSICAgICAgICBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFCisjZGVmaW5lIF9fSEFMX1VTQl9GU19FWFRJX0dFTkVSQVRFX1NXSVQgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VORVJBVEVfU1dJVAorCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0VOQUJMRV9JVCAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX0lUCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0RJU0FCTEVfSVQgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRElTQUJMRV9JVAorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFVF9GTEFHCisjZGVmaW5lIF9fSEFMX1VTQl9IU19FWFRJX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfQ0xFQVJfRkxBRworI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfUklTSU5HX0VHREVfVFJJR0dFUiAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9TRVRfRkFMTElOR19FR0RFX1RSSUdHRVIgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UKKyNkZWZpbmUgX19IQUxfVVNCX0hTX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgICAgICAgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRQorI2RlZmluZSBfX0hBTF9VU0JfSFNfRVhUSV9HRU5FUkFURV9TV0lUICAgICAgICAgICAgICAgICAgICBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFTkVSQVRFX1NXSVQKKworI2RlZmluZSBIQUxfUENEX0FjdGl2ZVJlbW90ZVdha2V1cCAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwCisjZGVmaW5lIEhBTF9QQ0RfRGVBY3RpdmVSZW1vdGVXYWtldXAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RfRGVBY3RpdmF0ZVJlbW90ZVdha2V1cAorCisjZGVmaW5lIEhBTF9QQ0RfU2V0VHhGaUZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QQ0RFeF9TZXRUeEZpRm8KKyNkZWZpbmUgSEFMX1BDRF9TZXRSeEZpRm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BDREV4X1NldFJ4RmlGbworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfVElNX0FsaWFzZWRfTWFjcm9zIEhBTCBUSU0gQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9USU1fU2V0SUNQcmVzY2FsZXJWYWx1ZSAgIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRQorI2RlZmluZSBfX0hBTF9USU1fUmVzZXRJQ1ByZXNjYWxlclZhbHVlIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFCisKKyNkZWZpbmUgVElNX0dFVF9JVFNUQVRVUyAgICAgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRQorI2RlZmluZSBUSU1fR0VUX0NMRUFSX0lUICAgICAgICAgICAgICAgIF9fSEFMX1RJTV9DTEVBUl9JVAorCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRTVEFUVVMgICAgICAgICAgX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UKKworI2RlZmluZSBfX0hBTF9USU1fRElSRUNUSU9OX1NUQVRVUyAgICAgIF9fSEFMX1RJTV9JU19USU1fQ09VTlRJTkdfRE9XTgorI2RlZmluZSBfX0hBTF9USU1fUFJFU0NBTEVSICAgICAgICAgICAgIF9fSEFMX1RJTV9TRVRfUFJFU0NBTEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX1NFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDb3VudGVyICAgICAgICAgICAgX19IQUxfVElNX0dFVF9DT1VOVEVSCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX1NFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9HZXRBdXRvcmVsb2FkICAgICAgICAgX19IQUxfVElNX0dFVF9BVVRPUkVMT0FECisjZGVmaW5lIF9fSEFMX1RJTV9TZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX1NFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9HZXRDbG9ja0RpdmlzaW9uICAgICAgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OCisjZGVmaW5lIF9fSEFMX1RJTV9TZXRJQ1ByZXNjYWxlciAgICAgICAgX19IQUxfVElNX1NFVF9JQ1BSRVNDQUxFUgorI2RlZmluZSBfX0hBTF9USU1fR2V0SUNQcmVzY2FsZXIgICAgICAgIF9fSEFMX1RJTV9HRVRfSUNQUkVTQ0FMRVIKKyNkZWZpbmUgX19IQUxfVElNX1NldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fU0VUX0NPTVBBUkUKKyNkZWZpbmUgX19IQUxfVElNX0dldENvbXBhcmUgICAgICAgICAgICBfX0hBTF9USU1fR0VUX0NPTVBBUkUKKworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9ERlNETSAgVElNX0JSRUFLSU5QVVRTT1VSQ0VfREZTRE0xCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FVEhfQWxpYXNlZF9NYWNyb3MgSEFMIEVUSCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRU5BQkxFX0lUICAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfSVQKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfRElTQUJMRV9JVCAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9ESVNBQkxFX0lUCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX0dFVF9GTEFHICAgICAgICAgICAgICAgICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfR0VUX0ZMQUcKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9DTEVBUl9GTEFHCisjZGVmaW5lIF9fSEFMX0VUSF9FWFRJX1NFVF9SSVNJTkdfRUdERV9UUklHR0VSICAgICBfX0hBTF9FVEhfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdfRUdERV9UUklHR0VSICAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFX1RSSUdHRVIKKyNkZWZpbmUgX19IQUxfRVRIX0VYVElfU0VUX0ZBTExJTkdSSVNJTkdfVFJJR0dFUiAgIF9fSEFMX0VUSF9XQUtFVVBfRVhUSV9FTkFCTEVfRkFMTElOR1JJU0lOR19UUklHR0VSCisKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9FTkFCTEUgICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9FTkFCTEUKKyNkZWZpbmUgRVRIX1BST01JU0NJT1VTTU9ERV9ESVNBQkxFICBFVEhfUFJPTUlTQ1VPVVNfTU9ERV9ESVNBQkxFCisjZGVmaW5lIElTX0VUSF9QUk9NSVNDSU9VU19NT0RFICAgICAgSVNfRVRIX1BST01JU0NVT1VTX01PREUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX0xURENfQWxpYXNlZF9NYWNyb3MgSEFMIExUREMgQWxpYXNlZCBNYWNyb3MgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9MVERDX0xBWUVSIExURENfTEFZRVIKKyNkZWZpbmUgX19IQUxfTFREQ19SRUxPQURfQ09ORklHICBfX0hBTF9MVERDX1JFTE9BRF9JTU1FRElBVEVfQ09ORklHCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9TQUlfQWxpYXNlZF9NYWNyb3MgSEFMIFNBSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9PVVRQVVREUklWRV9ESVNBQkxFRCAgICAgICAgICBTQUlfT1VUUFVURFJJVkVfRElTQUJMRQorI2RlZmluZSBTQUlfT1VUUFVURFJJVkVfRU5BQkxFRCAgICAgICAgICAgU0FJX09VVFBVVERSSVZFX0VOQUJMRQorI2RlZmluZSBTQUlfTUFTVEVSRElWSURFUl9FTkFCTEVEICAgICAgICAgU0FJX01BU1RFUkRJVklERVJfRU5BQkxFCisjZGVmaW5lIFNBSV9NQVNURVJESVZJREVSX0RJU0FCTEVEICAgICAgICBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFCisjZGVmaW5lIFNBSV9TVFJFT01PREUgICAgICAgICAgICAgICAgICAgICBTQUlfU1RFUkVPTU9ERQorI2RlZmluZSBTQUlfRklGT1N0YXR1c19FbXB0eSAgICAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfRU1QVFkKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfTGVzczFRdWFydGVyRnVsbCAgIFNBSV9GSUZPU1RBVFVTX0xFU1MxUVVBUlRFUkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfMVF1YXJ0ZXJGdWxsICAgICAgIFNBSV9GSUZPU1RBVFVTXzFRVUFSVEVSRlVMTAorI2RlZmluZSBTQUlfRklGT1N0YXR1c19IYWxmRnVsbCAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfSEFMRkZVTEwKKyNkZWZpbmUgU0FJX0ZJRk9TdGF0dXNfM1F1YXJ0ZXJzRnVsbCAgICAgIFNBSV9GSUZPU1RBVFVTXzNRVUFSVEVSRlVMTAorI2RlZmluZSBTQUlfRklGT1N0YXR1c19GdWxsICAgICAgICAgICAgICAgU0FJX0ZJRk9TVEFUVVNfRlVMTAorI2RlZmluZSBJU19TQUlfQkxPQ0tfTU9OT19TVFJFT19NT0RFICAgICAgSVNfU0FJX0JMT0NLX01PTk9fU1RFUkVPX01PREUKKyNkZWZpbmUgU0FJX1NZTkNIUk9OT1VTX0VYVCAgICAgICAgICAgICAgIFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMQorI2RlZmluZSBTQUlfU1lOQ0VYVF9JTl9FTkFCTEUgICAgICAgICAgICAgU0FJX1NZTkNFWFRfT1VUQkxPQ0tBX0VOQUJMRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfU1BESUZSWF9BbGlhc2VkX01hY3JvcyBIQUwgU1BESUZSWCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBIQUxfU1BESUZSWF9SZWNlaXZlQ29udHJvbEZsb3cgICAgICBIQUxfU1BESUZSWF9SZWNlaXZlQ3RybEZsb3cKKyNkZWZpbmUgSEFMX1NQRElGUlhfUmVjZWl2ZUNvbnRyb2xGbG93X0lUICAgSEFMX1NQRElGUlhfUmVjZWl2ZUN0cmxGbG93X0lUCisjZGVmaW5lIEhBTF9TUERJRlJYX1JlY2VpdmVDb250cm9sRmxvd19ETUEgIEhBTF9TUERJRlJYX1JlY2VpdmVDdHJsRmxvd19ETUEKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfSFJUSU1fQWxpYXNlZF9GdW5jdGlvbnMgSEFMIEhSVElNIEFsaWFzZWQgRnVuY3Rpb25zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkg3KSB8fCBkZWZpbmVkIChTVE0zMkc0KSB8fCBkZWZpbmVkIChTVE0zMkYzKQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfSVQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfRE1BIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnRfRE1BCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdGFydCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0CisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9ETUEgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdG9wX0RNQQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3AKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfUVNQSV9BbGlhc2VkX01hY3JvcyBIQUwgUVNQSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZCAoU1RNMzJMNCkKKyNkZWZpbmUgSEFMX1FQU0lfVElNRU9VVF9ERUZBVUxUX1ZBTFVFIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9QUFBfQWxpYXNlZF9NYWNyb3MgSEFMIFBQUCBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMl9IQUxfTEVHQUNZICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaCBiL0luYy9zdG0zMl9hc3NlcnRfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWJmZmExCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyX2Fzc2VydF90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMl9hc3NlcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU1RNMzIgYXNzZXJ0IHRlbXBsYXRlIGZpbGUuCisgICogICAgICAgICAgVGhpcyBmaWxlIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgcmVuYW1lZAorICAqICAgICAgICAgIHRvIHN0bTMyX2Fzc2VydC5oLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJfQVNTRVJUX0gKKyNkZWZpbmUgU1RNMzJfQVNTRVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisvKioKKyAgKiBAYnJpZWYgIFRoZSBhc3NlcnRfcGFyYW0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzIGNoZWNrLgorICAqIEBwYXJhbSBleHByIElmIGV4cHIgaXMgZmFsc2UsIGl0IGNhbGxzIGFzc2VydF9mYWlsZWQgZnVuY3Rpb24KKyAgKiAgICAgICAgIHdoaWNoIHJlcG9ydHMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgc291cmNlCisgICogICAgICAgICBsaW5lIG51bWJlciBvZiB0aGUgY2FsbCB0aGF0IGZhaWxlZC4KKyAgKiAgICAgICAgIElmIGV4cHIgaXMgdHJ1ZSwgaXQgcmV0dXJucyBubyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKChleHByKSA/ICh2b2lkKTBVIDogYXNzZXJ0X2ZhaWxlZCgodWludDhfdCAqKV9fRklMRV9fLCBfX0xJTkVfXykpCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICB2b2lkIGFzc2VydF9mYWlsZWQodWludDhfdCogZmlsZSwgdWludDMyX3QgbGluZSk7CisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYgLyogVVNFX0ZVTExfQVNTRVJUICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMl9BU1NFUlRfSCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbC5oIGIvSW5jL3N0bTMyd2J4eF9oYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGMwMmVkCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWwuaApAQCAtMCwwICsxLDY2OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWwuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgZm9yIHRoZSBIQUwKKyAgKiAgICAgICAgICBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfY29uZi5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9zeXN0ZW0uaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUwgSEFMCisgICogQHsKKyAgKi8KKyAgCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfQ29uc3RhbnRzIEhBTCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworICAKKy8qKiBAZGVmZ3JvdXAgSEFMX1RJQ0tfRlJFUSBUaWNrIEZyZXF1ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfVElDS19GUkVRXzEwSFogICAgICAgICAxMDBVCisjZGVmaW5lICBIQUxfVElDS19GUkVRXzEwMEhaICAgICAgICAxMFUKKyNkZWZpbmUgIEhBTF9USUNLX0ZSRVFfMUtIWiAgICAgICAgIDFVCisjZGVmaW5lICBIQUxfVElDS19GUkVRX0RFRkFVTFQgICAgICBIQUxfVElDS19GUkVRXzFLSFoKKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFNZU0NGR19FeHBvcnRlZF9Db25zdGFudHMgU1lTQ0ZHIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0Jvb3RNb2RlIEJPT1QgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU0NGR19CT09UX01BSU5GTEFTSCAgICAgICAgICAgTExfU1lTQ0ZHX1JFTUFQX0ZMQVNIICAgICAgICAgICAvKiE8IE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgKi8KKyNkZWZpbmUgU1lTQ0ZHX0JPT1RfU1lTVEVNRkxBU0ggICAgICAgICBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0ggICAgIC8qITwgU3lzdGVtIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLworI2RlZmluZSBTWVNDRkdfQk9PVF9TUkFNICAgICAgICAgICAgICAgIExMX1NZU0NGR19SRU1BUF9TUkFNICAgICAgICAgICAgLyohPCBTUkFNMSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU0NGR19CT09UX1FVQURTUEkgICAgICAgICAgICAgTExfU1lTQ0ZHX1JFTUFQX1FVQURTUEkgICAgICAgICAvKiE8IFFVQURTUEkgbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiogQGRlZmdyb3VwIFNZU0NGR19GUFVfSW50ZXJydXB0cyBGUFUgSW50ZXJydXB0cworICAqIEB7CisgICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSU9DICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0ICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfRFpDICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0ICAgICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfVUZDICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8yICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgVW5kZXJmbG93IEludGVycnVwdCAgICAgICAgICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfT0ZDICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8zICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0ICAgICAgICAgICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSURDICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80ICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgSW5wdXQgZGVub3JtYWwgSW50ZXJydXB0ICAgICovCisjZGVmaW5lIFNZU0NGR19JVF9GUFVfSVhDICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81ICAgICAgICAgICAvKiE8IEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1NSQU0yV1JQIFNSQU0yIFBhZ2UgV3JpdGUgcHJvdGVjdGlvbiAoMCB0byAzMSkKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTAgICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMCAgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDAgICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMSAgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxICAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMSAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyICAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIgICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyICAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTMgICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMyAgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMgICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNCAgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0ICAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNCAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1ICAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTUgICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1ICAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTYgICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNiAgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYgICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNyAgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U3ICAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNyAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U4ICAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTggICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA4ICAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTkgICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFOSAgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDkgICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMTAgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxMCAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxMSAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTExICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMSAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTEyICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTIgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDEyICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMTMgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxMyAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTMgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxNCAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE0ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNCAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTE1ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTUgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE1ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMTYgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxNiAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTYgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxNyAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE3ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNyAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTE4ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTggICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDE4ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMTkgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxOSAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMTkgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyMCAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIwICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMCAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTIxICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjEgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDIxICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMjIgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyMiAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjIgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyMyAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIzICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMyAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTI0ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjQgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI0ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMjUgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyNSAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjUgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyNiAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI2ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNiAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTI3ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjcgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDI3ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMjggICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyOCAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMjggKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyOSAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI5ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyOSAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTMwICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzAgICAgICAgLyohPCBTUkFNMkEgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMwICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMzEgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzMSAgICAgICAvKiE8IFNSQU0yQSBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfU1JBTTJXUlBfMzJfNjMgU1JBTTIgUGFnZSBXcml0ZSBwcm90ZWN0aW9uICgzMiB0byA2MykKKyAgKiBAeworICAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTMyICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzIgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMyICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMzMgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzMyAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMzMgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzNCAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTM0ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzNCAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTM1ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzUgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM1ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMzYgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzNiAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMzYgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzNyAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTM3ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzNyAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTM4ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzggICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM4ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFMzkgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzOSAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgMzkgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0MCAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQwICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0MCAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTQxICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDEgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQxICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNDIgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0MiAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNDIgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0MyAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQzICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0MyAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTQ0ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDQgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ0ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNDUgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0NSAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNDUgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0NiAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQ2ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0NiAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTQ3ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDcgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ3ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNDggICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0OCAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNDggKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0OSAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQ5ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0OSAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTUwICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTAgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUwICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNTEgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1MSAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNTEgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1MiAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTUyICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1MiAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTUzICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTMgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUzICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNTQgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1NCAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNTQgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1NSAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTU1ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1NSAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTU2ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTYgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU2ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNTcgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1NyAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNTcgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1OCAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTU4ICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1OCAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTU5ICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTkgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU5ICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNjAgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2MCAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNjAgKi8KKyNkZWZpbmUgU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2MSAgICAgICAgICBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTYxICAgICAgIC8qITwgU1JBTTJCIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA2MSAqLworI2RlZmluZSBTWVNDRkdfU1JBTTJXUlBfUEFHRTYyICAgICAgICAgIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjIgICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYyICovCisjZGVmaW5lIFNZU0NGR19TUkFNMldSUF9QQUdFNjMgICAgICAgICAgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2MyAgICAgICAvKiE8IFNSQU0yQiBXcml0ZSBwcm90ZWN0aW9uIHBhZ2UgNjMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVlJFRkJVRikKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX1ZSRUZCVUZfVm9sdGFnZVNjYWxlIFZSRUZCVUYgVm9sdGFnZSBTY2FsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwICAgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCAgICAgICAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDAgKFZSRUZfT1VUMSkgKi8KKyNkZWZpbmUgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgICBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUxICAgICAgIC8qITwgVm9sdGFnZSByZWZlcmVuY2Ugc2NhbGUgMSAoVlJFRl9PVVQyKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19WUkVGQlVGX0hpZ2hJbXBlZGFuY2UgVlJFRkJVRiBIaWdoIEltcGVkYW5jZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0RJU0FCTEUgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFZSRUZfcGx1cyBwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyIG91dHB1dCAqLworI2RlZmluZSBTWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRV9FTkFCTEUgICAgVlJFRkJVRl9DU1JfSElaICAgICAgICAgLyohPCBWUkVGX3BsdXMgcGluIGlzIGhpZ2ggaW1wZWRhbmNlICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVlJFRkJVRiAqLworCisvKiogQGRlZmdyb3VwIFNZU0NGR19TUkFNX2ZsYWdzX2RlZmluaXRpb24gU1JBTSBGbGFncworICAqIEB7CisgICovCisKKyNkZWZpbmUgU1lTQ0ZHX0ZMQUdfU1JBTTJfUEUgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfU1BGICAgICAgICAgICAgICAgIC8qITwgU1JBTTIgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNZU0NGR19GTEFHX1NSQU0yX0JVU1kgICAgICAgICAgU1lTQ0ZHX1NDU1JfU1JBTTJCU1kgICAgICAgICAgICAvKiE8IFNSQU0yIGJ1c3kgYnkgZXJhc2Ugb3BlcmF0aW9uICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0Zhc3RNb2RlUGx1c19HUElPIEZhc3QtbW9kZSBQbHVzIG9uIEdQSU8KKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBGYXN0LW1vZGUgUGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgb24gYSBzcGVjaWZpYyBHUElPCisgICovICAKKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCNl9GTVAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCNiAqLworI2RlZmluZSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNyAgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI3X0ZNUCAgICAgICAgLyohPCBFbmFibGUgRmFzdC1tb2RlIFBsdXMgb24gUEI3ICovCisjZGVmaW5lIFNZU0NGR19GQVNUTU9ERVBMVVNfUEI4ICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QICAgICAgICAvKiE8IEVuYWJsZSBGYXN0LW1vZGUgUGx1cyBvbiBQQjggKi8KKyNkZWZpbmUgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkgICAgICAgICBTWVNDRkdfQ0ZHUjFfSTJDX1BCOV9GTVAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QtbW9kZSBQbHVzIG9uIFBCOSAqLworICAgCisvKioKKyAqIEB9CisgKi8KKyAgICAKKy8qKiBAZGVmZ3JvdXAgU2VjdXJlX0lQX1dyaXRlX0FjY2VzcyBTZWN1cmUgSVAgV3JpdGUgQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzEgICBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMxICAgIC8qITwgRW5hYmxpbmcgdGhlIHNlY3VyaXR5IGFjY2VzcyBvZiBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIDEgS0VZWzc6MF0gKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzIgICBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMyICAgIC8qITwgRW5hYmxpbmcgdGhlIHNlY3VyaXR5IGFjY2VzcyBvZiBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIDIgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1BLQSAgICBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19QS0EgICAgIC8qITwgRW5hYmxpbmcgdGhlIHNlY3VyaXR5IGFjY2VzcyBvZiBQdWJsaWMgS2V5IEFjY2VsZXJhdG9yICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1JORyAgICBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcgICAgIC8qITwgRW5hYmxpbmcgdGhlIHNlY3VyaXR5IGFjY2VzcyBvZiBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9NYWNyb3MgSEFMIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREJHTUNVX0V4cG9ydGVkX01hY3JvcyBEQkdNQ1UgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgRnJlZXplIGFuZCBVbmZyZWV6ZSBQZXJpcGhlcmFscyBpbiBEZWJ1ZyBtb2RlCisgICovCisKKy8qKiBAZGVmZ3JvdXAgREJHTUNVX0FQQnhfR1JQeF9TVE9QX0lQIERCR01DVSBDUFUxIEFQQnggR1JQeCBTVE9QIElQCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTIoKSAgICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0yKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfUlRDKCkgICAgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfUlRDKCkgICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfV1dER19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1dXREcoKSAgICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9XV0RHKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIxX0dSUDFfV1dER19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcoKSAgICAgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVCgpICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMxX1RJTUVPVVQoKSAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVCgpICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9JMkMzX1RJTUVPVVQoKSAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0xKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0xKCkgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIxX0dSUDJfTFBUSU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9GUkVFWkVfTFBUSU0yKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMV9HUlAyX0ZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAyX0xQVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0yKCkgICAgICAgICAgTExfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaChMTF9EQkdNQ1VfQVBCMV9HUlAyX0xQVElNMl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9EQkdNQ1VfRlJFRVpFX1RJTTEoKSAgICAgICAgICAgICAgTExfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjJfR1JQMV9USU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0RCR01DVV9VTkZSRUVaRV9USU0xKCkgICAgICAgICAgICBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNigpICAgICAgICAgICAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE2KCkgICAgICAgICAgIExMX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX0ZSRUVaRV9USU0xNygpICAgICAgICAgICAgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoKExMX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfREJHTUNVX1VORlJFRVpFX1RJTTE3KCkgICAgICAgICAgIExMX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGgoTExfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QKQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgREJHTUNVX0MyX0FQQnhfR1JQeF9TVE9QX0lQIERCR01DVSBDUFUyIEFQQnggR1JQeCBTVE9QIElQCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfRlJFRVpFX1RJTTIoKSAgICAgICAgICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9VTkZSRUVaRV9USU0yKCkgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9GUkVFWkVfUlRDKCkgICAgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfVU5GUkVFWkVfUlRDKCkgICAgICAgICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfRlJFRVpFX0lXREcoKSAgICAgICAgICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9VTkZSRUVaRV9JV0RHKCkgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSVdER19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfRlJFRVpFX0kyQzFfVElNRU9VVCgpICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JMkMxX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9VTkZSRUVaRV9JMkMxX1RJTUVPVVQoKSBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfRlJFRVpFX0kyQzNfVElNRU9VVCgpICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9VTkZSRUVaRV9JMkMzX1RJTUVPVVQoKSBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDFfTFBUSU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9GUkVFWkVfTFBUSU0xKCkgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0xKCkgICAgICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIxX0dSUDJfTFBUSU0yX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9GUkVFWkVfTFBUSU0yKCkgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAyX0ZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAyX0xQVElNMl9TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfVU5GUkVFWkVfTFBUSU0yKCkgICAgICAgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaChMTF9DMl9EQkdNQ1VfQVBCMV9HUlAyX0xQVElNMl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QKQorI2RlZmluZSBfX0hBTF9DMl9EQkdNQ1VfRlJFRVpFX1RJTTEoKSAgICAgICAgICAgTExfQzJfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjJfR1JQMV9USU0xX1NUT1ApCisjZGVmaW5lIF9fSEFMX0MyX0RCR01DVV9VTkZSRUVaRV9USU0xKCkgICAgICAgICBMTF9DMl9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfQzJfREJHTUNVX0ZSRUVaRV9USU0xNigpICAgICAgICAgIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCkKKyNkZWZpbmUgX19IQUxfQzJfREJHTUNVX1VORlJFRVpFX1RJTTE2KCkgICAgICAgIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfQzJfREJHTUNVX0ZSRUVaRV9USU0xNygpICAgICAgICAgIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoKExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCkKKyNkZWZpbmUgX19IQUxfQzJfREJHTUNVX1VORlJFRVpFX1RJTTE3KCkgICAgICAgIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVW5GcmVlemVQZXJpcGgoTExfQzJfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QKQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTQ0ZHX0V4cG9ydGVkX01hY3JvcyBTWVNDRkcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgTWFpbiBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX0ZMQVNIKCkgICAgICAgIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeShMTF9TWVNDRkdfUkVNQVBfRkxBU0gpCisKKy8qKiBAYnJpZWYgIFN5c3RlbSBGbGFzaCBtZW1vcnkgbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NZU1RFTUZMQVNIKCkgIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeShMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0gpCisKKy8qKiBAYnJpZWYgIEVtYmVkZGVkIFNSQU0gbWFwcGVkIGF0IDB4MDAwMDAwMDAKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1NSQU0oKSAgICAgICAgIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeShMTF9TWVNDRkdfUkVNQVBfU1JBTSkKKworLyoqIEBicmllZiAgUVVBRFNQSSBtYXBwZWQgYXQgMHgwMDAwMDAwMC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1JFTUFQTUVNT1JZX1FVQURTUEkoKSAgICAgIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeShMTF9TWVNDRkdfUkVNQVBfUVVBRFNQSSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGJvb3QgbW9kZSBhcyBjb25maWd1cmVkIGJ5IHVzZXIuCisgICogQHJldHZhbCBUaGUgYm9vdCBtb2RlIGFzIGNvbmZpZ3VyZWQgYnkgdXNlci4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0JPT1RfTUFJTkZMQVNICisgICogICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfQk9PVF9TWVNURU1GTEFTSAorICAqICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0JPT1RfU1JBTQorICAqICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0JPT1RfUVVBRFNQSQorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfR0VUX0JPT1RfTU9ERSgpICAgICAgICAgICAgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5KCkKKworLyoqIEBicmllZiAgU1JBTTIgcGFnZSAwIHRvIDMxIHdyaXRlIHByb3RlY3Rpb24gZW5hYmxlIG1hY3JvCisgICogQHBhcmFtICBfX1NSQU0yV1JQX18gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHZhbHVlcyBvZiBAcmVmIFNZU0NGR19TUkFNMldSUAorICAqIEBub3RlICAgV3JpdGUgcHJvdGVjdGlvbiBjYW4gb25seSBiZSBkaXNhYmxlZCBieSBhIHN5c3RlbSByZXNldAorICAqLworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfU1JBTTJfV1JQXzFfMzFfRU5BQkxFICAgICAgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF8wXzMxX0VOQUJMRQorI2RlZmluZSBfX0hBTF9TWVNDRkdfU1JBTTJfV1JQXzBfMzFfRU5BQkxFKF9fU1JBTTJXUlBfXykgICAgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfU1JBTTJXUlBfUEFHRSgoX19TUkFNMldSUF9fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlU1JBTTJQYWdlV1JQXzBfMzEoX19TUkFNMldSUF9fKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqIEBicmllZiAgU1JBTTIgcGFnZSAzMiB0byA2MyB3cml0ZSBwcm90ZWN0aW9uIGVuYWJsZSBtYWNybworICAqIEBwYXJhbSAgX19TUkFNMldSUF9fICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB2YWx1ZXMgb2YgQHJlZiBTWVNDRkdfU1JBTTJXUlBfMzJfNjMKKyAgKiBAbm90ZSAgIFdyaXRlIHByb3RlY3Rpb24gY2FuIG9ubHkgYmUgZGlzYWJsZWQgYnkgYSBzeXN0ZW0gcmVzZXQKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF8zMl82M19FTkFCTEUoX19TUkFNMldSUF9fKSAgIGRvIHthc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UoKF9fU1JBTTJXUlBfXykpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZVNSQU0yUGFnZVdSUF8zMl82MyhfX1NSQU0yV1JQX18pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorCisvKiogQGJyaWVmICBTUkFNMiBwYWdlIHdyaXRlIHByb3RlY3Rpb24gdW5sb2NrIHByaW9yIHRvIGVyYXNlCisgICogQG5vdGUgICBXcml0aW5nIGEgd3Jvbmcga2V5IHJlYWN0aXZhdGVzIHRoZSB3cml0ZSBwcm90ZWN0aW9uCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19TUkFNMl9XUlBfVU5MT0NLKCkgICAgICAgICBMTF9TWVNDRkdfVW5sb2NrU1JBTTJXUlAoKQorCisvKiogQGJyaWVmICBTUkFNMiBlcmFzZQorICAqIEBub3RlICAgX19TWVNDRkdfR0VUX0ZMQUcoU1lTQ0ZHX0ZMQUdfU1JBTTJfQlVTWSkgbWF5IGJlIHVzZWQgdG8gY2hlY2sgZW5kIG9mIGVyYXNlCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19TUkFNMl9FUkFTRSgpICAgICAgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlU1JBTTJFcmFzZSgpCisKKy8qKiBAYnJpZWYgIEZsb2F0aW5nIFBvaW50IFVuaXQgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNZU0NGR19GUFVfSW50ZXJydXB0cworICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfRlBVX0lOVEVSUlVQVF9FTkFCTEUoX19JTlRFUlJVUFRfXykgICAgZG8ge2Fzc2VydF9wYXJhbShJU19TWVNDRkdfRlBVX0lOVEVSUlVQVCgoX19JTlRFUlJVUFRfXykpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCAoX19JTlRFUlJVUFRfXykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQorCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GUFVfSU5URVJSVVBUX0RJU0FCTEUoX19JTlRFUlJVUFRfXykgICBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GUFVfSU5URVJSVVBUKChfX0lOVEVSUlVQVF9fKSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgKF9fSU5URVJSVVBUX18pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqIEBicmllZiAgU1lTQ0ZHIEJyZWFrIEVDQyBsb2NrLgorICAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBjb25uZWN0aW9uIG9mIEZsYXNoIEVDQyBlcnJvciBjb25uZWN0aW9uIHRvIFRJTTEvMTYvMTcgQnJlYWsgaW5wdXQuCisgICogQG5vdGUgICBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYW5kIGNhbiBiZSB1bmxvY2tlZCBvbmx5IGJ5IHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX0VDQ19MT0NLKCkgICAgICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyhMTF9TWVNDRkdfVElNQlJFQUtfRUNDKQorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgQ29ydGV4LU00IExvY2t1cCBsb2NrLgorICAqICAgICAgICAgRW5hYmxlIGFuZCBsb2NrIHRoZSBjb25uZWN0aW9uIG9mIENvcnRleC1NNCBMT0NLVVAgKEhhcmRmYXVsdCkgb3V0cHV0IHRvIFRJTTEvMTYvMTcgQnJlYWsgaW5wdXQuCisgICogQG5vdGUgICBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYW5kIGNhbiBiZSB1bmxvY2tlZCBvbmx5IGJ5IHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX0xPQ0tVUF9MT0NLKCkgICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyhMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQKQorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgUFZEIGxvY2suCisgICogICAgICAgICBFbmFibGUgYW5kIGxvY2sgdGhlIFBWRCBjb25uZWN0aW9uIHRvIFRpbWVyMS8xNi8xNyBCcmVhayBpbnB1dCwgYXMgd2VsbCBhcyB0aGUgUFZERSBhbmQgUExTWzI6MF0gaW4gdGhlIFBXUl9DUjIgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYW5kIGNhbiBiZSB1bmxvY2tlZCBvbmx5IGJ5IHN5c3RlbSByZXNldC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0JSRUFLX1BWRF9MT0NLKCkgICAgICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0cyhMTF9TWVNDRkdfVElNQlJFQUtfUFZEKQorCisvKiogQGJyaWVmICBTWVNDRkcgQnJlYWsgU1JBTTIgcGFyaXR5IGxvY2suCisgICogICAgICAgICBFbmFibGUgYW5kIGxvY2sgdGhlIFNSQU0yIHBhcml0eSBlcnJvciBzaWduYWwgY29ubmVjdGlvbiB0byBUSU0xLzE2LzE3IEJyZWFrIGlucHV0LgorICAqIEBub3RlICAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGFuZCBjYW4gYmUgdW5sb2NrZWQgYnkgc3lzdGVtIHJlc2V0LgorICAqLworI2RlZmluZSBfX0hBTF9TWVNDRkdfQlJFQUtfU1JBTTJQQVJJVFlfTE9DSygpICAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzKExMX1NZU0NGR19USU1CUkVBS19TUkFNMl9QQVJJVFkpCisKKy8qKiBAYnJpZWYgIENoZWNrIFNZU0NGRyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0ZMQUdfXyAgc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfRkxBR19TUkFNMl9QRSAgIFNSQU0yIFBhcml0eSBFcnJvciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX0ZMQUdfU1JBTTJfQlVTWSBTUkFNMiBFcmFzZSBPbmdvaW5nCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICgoKCgoKF9fRkxBR19fKSA9PSBTWVNDRkdfU0NTUl9TUkFNMkJTWSk/IFNZU0NGRy0+U0NTUiA6IFNZU0NGRy0+Q0ZHUjIpICYgKF9fRkxBR19fKSkhPSAwVSkgPyAxVSA6IDBVKQorCisvKiogQGJyaWVmICBTZXQgdGhlIFNQRiBiaXQgdG8gY2xlYXIgdGhlIFNSQU0gUGFyaXR5IEVycm9yIEZsYWcuCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19DTEVBUl9GTEFHKCkgICAgICAgICAgICAgICBMTF9TWVNDRkdfQ2xlYXJGbGFnX1NQKCkKKworLyoqIEBicmllZiAgRmFzdCBtb2RlIFBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGVuYWJsZS9kaXNhYmxlIG1hY3JvcworICAqIEBwYXJhbSBfX0ZBU1RNT0RFUExVU19fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1lTQ0ZHX0Zhc3RNb2RlUGx1c19HUElPCisgICovCisjZGVmaW5lIF9fSEFMX1NZU0NGR19GQVNUTU9ERVBMVVNfRU5BQkxFKF9fRkFTVE1PREVQTFVTX18pICBkbyB7YXNzZXJ0X3BhcmFtKElTX1NZU0NGR19GQVNUTU9ERVBMVVMoKF9fRkFTVE1PREVQTFVTX18pKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzKF9fRkFTVE1PREVQTFVTX18pOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDApCisKKyNkZWZpbmUgX19IQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19ESVNBQkxFKF9fRkFTVE1PREVQTFVTX18pIGRvIHthc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUygoX19GQVNUTU9ERVBMVVNfXykpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1NZU0NGR19EaXNhYmxlRmFzdE1vZGVQbHVzKF9fRkFTVE1PREVQTFVTX18pOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBIQUxfUHJpdmF0ZV9NYWNyb3MgSEFMIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNDRkdfUHJpdmF0ZV9NYWNyb3MgU1lTQ0ZHIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19TWVNDRkdfRlBVX0lOVEVSUlVQVChfX0lOVEVSUlVQVF9fKSAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX0lPQykgPT0gU1lTQ0ZHX0lUX0ZQVV9JT0MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9EWkMpID09IFNZU0NGR19JVF9GUFVfRFpDKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfVUZDKSA9PSBTWVNDRkdfSVRfRlBVX1VGQykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19JTlRFUlJVUFRfXykgJiBTWVNDRkdfSVRfRlBVX09GQykgPT0gU1lTQ0ZHX0lUX0ZQVV9PRkMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fSU5URVJSVVBUX18pICYgU1lTQ0ZHX0lUX0ZQVV9JREMpID09IFNZU0NGR19JVF9GUFVfSURDKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0lOVEVSUlVQVF9fKSAmIFNZU0NGR19JVF9GUFVfSVhDKSA9PSBTWVNDRkdfSVRfRlBVX0lYQykpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UoX19QQUdFX18pICAgICAgICAgICAgICAgKCgoX19QQUdFX18pID4gMFUpICYmICgoX19QQUdFX18pIDw9IDB4RkZGRkZGRkZVKSkKKworI2RlZmluZSBJU19TWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFKF9fU0NBTEVfXykgICAgICAoKChfX1NDQUxFX18pID09IFNZU0NGR19WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0NBTEVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEpKQorCisjZGVmaW5lIElTX1NZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFKF9fVkFMVUVfXykgICAgICgoKF9fVkFMVUVfXykgPT0gU1lTQ0ZHX1ZSRUZCVUZfSElHSF9JTVBFREFOQ0VfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1ZSRUZCVUZfVFJJTU1JTkcoX19WQUxVRV9fKSAgICAgICAgICAgKCgoX19WQUxVRV9fKSA+IDBVKSAmJiAoKF9fVkFMVUVfXykgPD0gVlJFRkJVRl9DQ1JfVFJJTSkpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX0ZBU1RNT0RFUExVUyhfX1BJTl9fKSAgICAgICAgICAgICAgICAgKCgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjYpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjcpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCNykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjgpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fUElOX18pICYgU1lTQ0ZHX0ZBU1RNT0RFUExVU19QQjkpICA9PSBTWVNDRkdfRkFTVE1PREVQTFVTX1BCOSkpCisKKyNkZWZpbmUgSVNfU1lTQ0ZHX1NFQ1VSSVRZX0FDQ0VTUyhfX1ZBTFVFX18pICAgICAgICAgICAgKCgoKF9fVkFMVUVfXykgJiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMSkgID09IEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMyKSAgPT0gSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1BLQSkgICA9PSBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfUEtBKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfUk5HKSAgID09IEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9Qcml2YXRlX01hY3JvcyBIQUwgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19USUNLRlJFUShGUkVRKSAoKChGUkVRKSA9PSBIQUxfVElDS19GUkVRXzEwSFopICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IEhBTF9USUNLX0ZSRVFfMTAwSFopIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlJFUSkgPT0gSEFMX1RJQ0tfRlJFUV8xS0haKSkKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zIEhBTCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEhBTCBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0KHZvaWQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RlSW5pdCh2b2lkKTsKK3ZvaWQgSEFMX01zcEluaXQodm9pZCk7Cit2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBIQUwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9JbmNUaWNrKHZvaWQpOwordm9pZCBIQUxfRGVsYXkodWludDMyX3QgRGVsYXkpOwordWludDMyX3QgSEFMX0dldFRpY2sodm9pZCk7Cit1aW50MzJfdCBIQUxfR2V0VGlja1ByaW8odm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU2V0VGlja0ZyZXEodWludDMyX3QgRnJlcSk7Cit1aW50MzJfdCBIQUxfR2V0VGlja0ZyZXEodm9pZCk7Cit2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKTsKK3ZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCk7Cit1aW50MzJfdCBIQUxfR2V0SGFsVmVyc2lvbih2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MCh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3MSh2b2lkKTsKK3VpbnQzMl90IEhBTF9HZXRVSUR3Mih2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBIQUwgRGVidWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogREJHTUNVIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU2xlZXBNb2RlKHZvaWQpOwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlKHZvaWQpOwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKTsKK3ZvaWQgSEFMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworICAKKy8qIEV4cG9ydGVkIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9WYXJpYWJsZXMKKyAgKiBAeworICAqLworZXh0ZXJuIF9fSU8gdWludDMyX3QgdXdUaWNrOworZXh0ZXJuIHVpbnQzMl90IHV3VGlja1ByaW87CitleHRlcm4gdWludDMyX3QgdXdUaWNrRnJlcTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBIQUwgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogU1lTQ0ZHIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfU1lTQ0ZHX1NSQU0yRXJhc2Uodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVNSQU1GZXRjaCh2b2lkKTsKK3VpbnQzMl90IEhBTF9TWVNDRkdfSXNFbmFibGVkU1JBTUZldGNoKHZvaWQpOworCit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9Wb2x0YWdlU2NhbGluZ0NvbmZpZyh1aW50MzJfdCBWb2x0YWdlU2NhbGluZyk7Cit2b2lkIEhBTF9TWVNDRkdfVlJFRkJVRl9IaWdoSW1wZWRhbmNlQ29uZmlnKHVpbnQzMl90IE1vZGUpOwordm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfVHJpbW1pbmdDb25maWcodWludDMyX3QgVHJpbW1pbmdWYWx1ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZCVUYodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVZSRUZCVUYodm9pZCk7CisKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVJT0Jvb3N0ZXIodm9pZCk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZUlPQm9vc3Rlcih2b2lkKTsKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVJT1ZkZCh2b2lkKTsKK3ZvaWQgSEFMX1NZU0NGR19EaXNhYmxlSU9WZGQodm9pZCk7CisKK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVTZWN1cml0eUFjY2Vzcyh1aW50MzJfdCBTZWN1cml0eUFjY2Vzcyk7Cit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVNlY3VyaXR5QWNjZXNzKHVpbnQzMl90IFNlY3VyaXR5QWNjZXNzKTsKK3VpbnQzMl90IEhBTF9TWVNDRkdfSXNFbmFibGVkU2VjdXJpdHlBY2Nlc3ModWludDMyX3QgU2VjdXJpdHlBY2Nlc3MpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9hZGMuaCBiL0luYy9zdG0zMndieHhfaGFsX2FkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNmIxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9hZGMuaApAQCAtMCwwICsxLDE2NzEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2FkYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0FEQ19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiBJbmNsdWRlIGxvdyBsZXZlbCBkcml2ZXIgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfYWRjLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBREMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfVHlwZXMgQURDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIAorICAqIEBicmllZiAgQURDIGdyb3VwIHJlZ3VsYXIgb3ZlcnNhbXBsaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBSYXRpbzsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBvdmVyc2FtcGxpbmcgcmF0aW8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfUkFUSU8gKi8KKworICB1aW50MzJfdCBSaWdodEJpdFNoaWZ0OyAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBkaXZpc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIE92ZXJzYW1wbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfT1ZTX1NISUZUICovCisKKyAgdWludDMyX3QgVHJpZ2dlcmVkTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgcmVndWxhciB0cmlnZ2VyZWQgb3ZlcnNhbXBsaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19PVlNfRElTQ09OVF9NT0RFICovCisKKyAgdWludDMyX3QgT3ZlcnNhbXBsaW5nU3RvcFJlc2V0OyAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgcmVndWxhciBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG92ZXJzYW1wbGluZyBpcyBlaXRoZXIgdGVtcG9yYXJ5IHN0b3BwZWQgb3IgcmVzZXQgdXBvbiBhbiBpbmplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkIG9uIGJvdGggcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzLCB0aGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkaXNjYXJkZWQgYW5kIGZvcmNlZCB0byBzZXR0aW5nICJBRENfUkVHT1ZFUlNBTVBMSU5HX1JFU1VNRURfTU9ERSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBvdmVyc2FtcGxpbmcgYnVmZmVyIGlzIHplcm9lZCBkdXJpbmcgaW5qZWN0aW9uIHNlcXVlbmNlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09WU19TQ09QRV9SRUcgKi8KKworfUFEQ19PdmVyc2FtcGxpbmdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBQYXJhbWV0ZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBzaGFyZWQgd2l0aGluIDIgc2NvcGVzOgorICAqICAgICAgICAgIC0gU2NvcGUgZW50aXJlIEFEQyAoYWZmZWN0cyBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKTogQ2xvY2tQcmVzY2FsZXIsIFJlc29sdXRpb24sIERhdGFBbGlnbiwKKyAgKiAgICAgICAgICAgIFNjYW5Db252TW9kZSwgRU9DU2VsZWN0aW9uLCBMb3dQb3dlckF1dG9XYWl0LgorICAqICAgICAgICAgIC0gU2NvcGUgQURDIGdyb3VwIHJlZ3VsYXI6IENvbnRpbnVvdXNDb252TW9kZSwgTmJyT2ZDb252ZXJzaW9uLCBEaXNjb250aW51b3VzQ29udk1vZGUsIE5ick9mRGlzY0NvbnZlcnNpb24sCisgICogICAgICAgICAgICBFeHRlcm5hbFRyaWdDb252LCBFeHRlcm5hbFRyaWdDb252RWRnZSwgRE1BQ29udGludW91c1JlcXVlc3RzLCBPdmVycnVuLCBPdmVyc2FtcGxpbmdNb2RlLCBPdmVyc2FtcGxpbmcuCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEFEQyBzdGF0ZSBjYW4gYmUgZWl0aGVyOgorICAqICAgICAgICAgIC0gRm9yIGFsbCBwYXJhbWV0ZXJzOiBBREMgZGlzYWJsZWQKKyAgKiAgICAgICAgICAtIEZvciBhbGwgcGFyYW1ldGVycyBleGNlcHQgJ0xvd1Bvd2VyQXV0b1dhaXQnLCAnRE1BQ29udGludW91c1JlcXVlc3RzJyBhbmQgJ092ZXJzYW1wbGluZyc6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ0xvd1Bvd2VyQXV0b1dhaXQnIGFuZCAnRE1BQ29udGludW91c1JlcXVlc3RzJzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZC4KKyAgKiAgICAgICAgIElmIEFEQyBpcyBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZAorICAqICAgICAgICAgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyCisgICogICAgICAgICAod2hpY2ggZnVsZmlsbHMgdGhlIEFEQyBzdGF0ZSBjb25kaXRpb24pIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAvKiE8IFNlbGVjdCBBREMgY2xvY2sgc291cmNlIChzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQVBCIGNsb2NrIG9yIGFzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gc3lzdGVtIGNsb2NrIG9yIFBMTCAoUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgbGlzdCBvZiBjbG9ja3MgYXZhaWxhYmxlKSkgYW5kIGNsb2NrIHByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIEFEQyBjbG9jayBjb25maWd1cmF0aW9uIGlzIGNvbW1vbiB0byBhbGwgQURDIGluc3RhbmNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgY2hhbm5lbHMgb24gaW5qZWN0ZWQgZ3JvdXAsIEFEQyBmcmVxdWVuY3kgc2hvdWxkIGJlIGxvd2VyIHRoYW4gQUhCIGNsb2NrIGZyZXF1ZW5jeSAvNCBmb3IgcmVzb2x1dGlvbiAxMiBvciAxMCBiaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQiBjbG9jayBmcmVxdWVuY3kgLzMgZm9yIHJlc29sdXRpb24gOCBiaXRzLCBBSEIgY2xvY2sgZnJlcXVlbmN5IC8yIGZvciByZXNvbHV0aW9uIDYgYml0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2Ygc3luY2hyb25vdXMgY2xvY2sgbW9kZSBiYXNlZCBvbiBIQ0xLLzEsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgYmUgZW5hYmxlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgc3lzdGVtIGNsb2NrIGhhcyBhIDUwJSBkdXR5IGNsb2NrIGN5Y2xlIChBUEIgcHJlc2NhbGVyIGNvbmZpZ3VyZWQgaW5zaWRlIFJDQyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYnlwYXNzZWQgYW5kIFBDTEsgY2xvY2sgbXVzdCBoYXZlIDUwJSBkdXR5IGN5Y2xlKS4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgdXNhZ2Ugb2YgYXN5bmNocm9ub3VzIGNsb2NrLCB0aGUgc2VsZWN0ZWQgY2xvY2sgbXVzdCBiZSBwcmVsaW1pbmFyaWx5IGVuYWJsZWQgYXQgUkNDIHRvcCBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIGFsbCBBREMgaW5zdGFuY2VzIGFyZSBkaXNhYmxlZC4gKi8KKworICB1aW50MzJfdCBSZXNvbHV0aW9uOyAgICAgICAgICAgIC8qITwgQ29uZmlndXJlIHRoZSBBREMgcmVzb2x1dGlvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfUkVTT0xVVElPTiAqLworCisgIHVpbnQzMl90IERhdGFBbGlnbjsgICAgICAgICAgICAgLyohPCBTcGVjaWZ5IEFEQyBkYXRhIGFsaWdubWVudCBpbiBjb252ZXJzaW9uIGRhdGEgcmVnaXN0ZXIgKHJpZ2h0IG9yIGxlZnQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYWxpZ25tZW50cyBmb3JtYXRzIHZlcnN1cyByZXNvbHV0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19EQVRBX0FMSUdOICovCisKKyAgdWludDMyX3QgU2NhbkNvbnZNb2RlOyAgICAgICAgICAvKiE8IENvbmZpZ3VyZSB0aGUgc2VxdWVuY2VyIG9mIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYXNzb2NpYXRlZCB0byBwYXJhbWV0ZXIgJ0Rpc2NvbnRpbnVvdXNDb252TW9kZScgdG8gaGF2ZSBtYWluIHNlcXVlbmNlIHN1YmRpdmlkZWQgaW4gc3VjY2Vzc2l2ZSBwYXJ0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRpc2FibGVkOiBDb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNoYW5uZWwgY29udmVydGVkLCB0aGUgb25lIGRlZmluZWQgaW4gcmFuayAxKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICdOYnJPZkNvbnZlcnNpb24nIGFuZCAnSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nIGFyZSBkaXNjYXJkZWQgKGVxdWl2YWxlbnQgdG8gc2V0IHRvIDEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZW5hYmxlZDogIENvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2VxdWVuY2UgbW9kZSAobXVsdGlwbGUgcmFua3MgZGVmaW5lZCBieSAnTmJyT2ZDb252ZXJzaW9uJyBvciAnSW5qZWN0ZWROYnJPZkNvbnZlcnNpb24nIGFuZCByYW5rIG9mIGVhY2ggY2hhbm5lbCBpbiBzZXF1ZW5jZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW4gZGlyZWN0aW9uIGlzIHVwd2FyZDogZnJvbSByYW5rIDEgdG8gcmFuayAnbicuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19TY2FuX21vZGUgKi8KKworICB1aW50MzJfdCBFT0NTZWxlY3Rpb247ICAgICAgICAgIC8qITwgU3BlY2lmeSB3aGljaCBFT0MgKEVuZCBPZiBDb252ZXJzaW9uKSBmbGFnIGlzIHVzZWQgZm9yIGNvbnZlcnNpb24gYnkgcG9sbGluZyBhbmQgaW50ZXJydXB0aW9uOiBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9yIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0VPQ1NlbGVjdGlvbi4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgTG93UG93ZXJBdXRvV2FpdDsgLyohPCBTZWxlY3QgdGhlIGR5bmFtaWMgbG93IHBvd2VyIEF1dG8gRGVsYXk6IG5ldyBjb252ZXJzaW9uIHN0YXJ0IG9ubHkgd2hlbiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gKGZvciBBREMgZ3JvdXAgcmVndWxhcikgb3IgcHJldmlvdXMgc2VxdWVuY2UgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpIG9yIEhBTF9BRENFeF9JbmplY3RlZEdldFZhbHVlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgYXV0b21hdGljYWxseSBhZGFwdHMgdGhlIGZyZXF1ZW5jeSBvZiBBREMgY29udmVyc2lvbnMgdHJpZ2dlcnMgdG8gdGhlIHNwZWVkIG9mIHRoZSBzeXN0ZW0gdGhhdCByZWFkcyB0aGUgZGF0YS4gTW9yZW92ZXIsIHRoaXMgYXZvaWRzIHJpc2sgb2Ygb3ZlcnJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxvdyBmcmVxdWVuY3kgYXBwbGljYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IERvIG5vdCB1c2Ugd2l0aCBpbnRlcnJ1cHRpb24gb3IgRE1BIChIQUxfQURDX1N0YXJ0X0lUKCksIEhBTF9BRENfU3RhcnRfRE1BKCkpIHNpbmNlIHRoZXkgY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmcmVlIHRoZSBJUlEgdmVjdG9yIHNlcXVlbmNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24gd2l0aCBIQUxfQURDX1N0YXJ0KCksIDIuIExhdGVyIG9uLCB3aGVuIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIEhBTF9BRENfUG9sbEZvckNvbnZlcnNpb24oKSB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQgSEFMX0FEQ19HZXRWYWx1ZSgpIHRvIHJldHJpZXZlIGNvbnZlcnNpb24gcmVzdWx0IGFuZCB0cmlnIGFub3RoZXIgY29udmVyc2lvbiBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyBncm91cCBpbmplY3RlZCwgdXNlIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9ucyBIQUxfQURDRXhJbmplY3RlZF9TdGFydCgpLCBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpLCAuLi4pLiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBDb250aW51b3VzQ29udk1vZGU7IC8qITwgU3BlY2lmeSB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNvbnZlcnNpb24pIG9yIGNvbnRpbnVvdXMgbW9kZSBmb3IgQURDIGdyb3VwIHJlZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgZmlyc3QgQURDIGNvbnZlcnNpb24gc3RhcnQgdHJpZ2dlciBvY2N1cnJlZCAoc29mdHdhcmUgc3RhcnQgb3IgZXh0ZXJuYWwgdHJpZ2dlcikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworCisgIHVpbnQzMl90IE5ick9mQ29udmVyc2lvbjsgICAgICAgLyohPCBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgcmFua3MgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB3aXRoaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gdXNlIHRoZSByZWd1bGFyIGdyb3VwIHNlcXVlbmNlciBhbmQgY29udmVydCBzZXZlcmFsIHJhbmtzLCBwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScgbXVzdCBiZSBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAxNi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXAgKEFEQyBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgd2l0aG91dCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBvciBleHRlcm5hbCB0cmlnZ2VyIHRoYXQgY291bGQgbGF1bmNoIGEgY29udmVyc2lvbikuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIERpc2NvbnRpbnVvdXNDb252TW9kZTsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zIHNlcXVlbmNlIG9mIEFEQyBncm91cCByZWd1bGFyIGlzIHBlcmZvcm1lZCBpbiBDb21wbGV0ZS1zZXF1ZW5jZS9EaXNjb250aW51b3VzLXNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGlzIHVzZWQgb25seSBpZiBzZXF1ZW5jZXIgaXMgZW5hYmxlZCAocGFyYW1ldGVyICdTY2FuQ29udk1vZGUnKS4gSWYgc2VxdWVuY2VyIGlzIGRpc2FibGVkLCB0aGlzIHBhcmFtZXRlciBpcyBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgY2FuIGJlIGVuYWJsZWQgb25seSBpZiBjb250aW51b3VzIG1vZGUgaXMgZGlzYWJsZWQuIElmIGNvbnRpbnVvdXMgbW9kZSBpcyBlbmFibGVkLCB0aGlzIHBhcmFtZXRlciBzZXR0aW5nIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICovCisKKyAgdWludDMyX3QgTmJyT2ZEaXNjQ29udmVyc2lvbjsgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbnMgaW4gd2hpY2ggdGhlIG1haW4gc2VxdWVuY2Ugb2YgQURDIGdyb3VwIHJlZ3VsYXIgKHBhcmFtZXRlciBOYnJPZkNvbnZlcnNpb24pIHdpbGwgYmUgc3ViZGl2aWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcmFtZXRlciAnRGlzY29udGludW91c0NvbnZNb2RlJyBpcyBkaXNhYmxlZCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA4LiAqLworCisgIHVpbnQzMl90IEV4dGVybmFsVHJpZ0NvbnY7ICAgICAgLyohPCBTZWxlY3QgdGhlIGV4dGVybmFsIGV2ZW50IHNvdXJjZSB1c2VkIHRvIHRyaWdnZXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIGV4dGVybmFsIHRyaWdnZXJzIGFyZSBkaXNhYmxlZCBhbmQgc29mdHdhcmUgdHJpZ2dlciBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgY29tbW9uIHRvIGFsbCBBREMgaW5zdGFuY2VzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgRXh0ZXJuYWxUcmlnQ29udkVkZ2U7ICAvKiE8IFNlbGVjdCB0aGUgZXh0ZXJuYWwgZXZlbnQgZWRnZSB1c2VkIHRvIHRyaWdnZXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBBRENfU09GVFdBUkVfU1RBUlQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIERNQUNvbnRpbnVvdXNSZXF1ZXN0czsgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIERNQSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGluIG9uZSBzaG90IG1vZGUgKERNQSB0cmFuc2ZlciBzdG9wcyB3aGVuIG51bWJlciBvZiBjb252ZXJzaW9ucyBpcyByZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gY29udGludW91cyBtb2RlIChETUEgdHJhbnNmZXIgdW5saW1pdGVkLCB3aGF0ZXZlciBudW1iZXIgb2YgY29udmVyc2lvbnMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNvbnRpbnVvdXMgbW9kZSwgRE1BIG11c3QgYmUgY29uZmlndXJlZCBpbiBjaXJjdWxhciBtb2RlLiBPdGhlcndpc2UgYW4gb3ZlcnJ1biB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIERNQSBidWZmZXIgbWF4aW11bSBwb2ludGVyIGlzIHJlYWNoZWQuICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bjsgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIG92ZXJ3cml0dGVuIG9yIHByZXNlcnZlZCAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBhcHBsaWVzIHRvIEFEQyBncm91cCByZWd1bGFyIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfUkVHX09WUl9EQVRBX0JFSEFWSU9SLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSW4gY2FzZSBvZiBvdmVycnVuIHNldCB0byBkYXRhIHByZXNlcnZlZCBhbmQgdXNhZ2Ugd2l0aCBwcm9ncmFtbWluZyBtb2RlbCB3aXRoIGludGVycnVwdGlvbiAoSEFMX1N0YXJ0X0lUKCkpOiBBREMgSVJRIGhhbmRsZXIgaGFzIHRvIGNsZWFyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MsIHRoaXMgaW5kdWNlcyB0aGUgcmVsZWFzZSBvZiB0aGUgcHJlc2VydmVkIGRhdGEuIElmIG5lZWRlZCwgdGhpcyBkYXRhIGNhbiBiZSBzYXZlZCBpbiBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLCBwbGFjZWQgaW4gdXNlciBwcm9ncmFtIGNvZGUgKGNhbGxlZCBiZWZvcmUgZW5kIG9mIGNvbnZlcnNpb24gZmxhZ3MgY2xlYXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRXJyb3IgcmVwb3J0aW5nIHdpdGggcmVzcGVjdCB0byB0aGUgY29udmVyc2lvbiBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IHBvbGxpbmcgZm9yIGV2ZW50IG9yIGludGVycnVwdGlvbjogRXJyb3IgaXMgcmVwb3J0ZWQgb25seSBpZiBvdmVycnVuIGlzIHNldCB0byBkYXRhIHByZXNlcnZlZC4gSWYgb3ZlcnJ1biBpcyBzZXQgdG8gZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4sIHVzZXIgY2FuIHdpbGxpbmdseSBub3QgcmVhZCBhbGwgdGhlIGNvbnZlcnRlZCBkYXRhLCB0aGlzIGlzIG5vdCBjb25zaWRlcmVkIGFzIGFuIGVycm9uZW91cyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZSB3aXRoIEFEQyBjb252ZXJzaW9uIGJ5IERNQTogRXJyb3IgaXMgcmVwb3J0ZWQgd2hhdGV2ZXIgb3ZlcnJ1biBzZXR0aW5nIChETUEgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBhbGwgZGF0YSBmcm9tIGRhdGEgcmVnaXN0ZXIpLiAqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBPdmVyc2FtcGxpbmdNb2RlOyAgICAgICAvKiE8IFNwZWNpZnkgd2hldGhlciB0aGUgb3ZlcnNhbXBsaW5nIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIG9ubHkgaWYgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBpcyBvbmdvaW5nIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgKi8KKworICBBRENfT3ZlcnNhbXBsaW5nVHlwZURlZiBPdmVyc2FtcGxpbmc7ICAgLyohPCBTcGVjaWZ5IHRoZSBPdmVyc2FtcGxpbmcgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIG92ZXJzYW1wbGluZyBjb25maWd1cmF0aW9uIGlmIG92ZXJzYW1wbGluZyBpcyBhbHJlYWR5IGVuYWJsZWQuICovCisKK31BRENfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2YgQURDIGNoYW5uZWwgZm9yIHJlZ3VsYXIgZ3JvdXAKKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gSEFMX0FEQ19Db25maWdDaGFubmVsKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCAodGhpcyBpcyB0aGUgb25seSBwb3NzaWJsZSBBREMgc3RhdGUgdG8gbW9kaWZ5IHBhcmFtZXRlciAnU2luZ2xlRGlmZicpCisgICogICAgICAgICAgLSBGb3IgYWxsIGV4Y2VwdCBwYXJhbWV0ZXJzICdTYW1wbGluZ1RpbWUnLCAnT2Zmc2V0JywgJ09mZnNldE51bWJlcic6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLgorICAqICAgICAgICAgIC0gRm9yIHBhcmFtZXRlcnMgJ1NhbXBsaW5nVGltZScsICdPZmZzZXQnLCAnT2Zmc2V0TnVtYmVyJzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcy4KKyAgKiAgICAgICAgIElmIEFEQyBpcyBub3QgaW4gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIHRvIG1vZGlmeSBzb21lIHBhcmFtZXRlcnMsIHRoZXNlIHBhcmFtZXRlcnMgc2V0dGluZyBpcyBieXBhc3NlZAorICAqICAgICAgICAgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSBvZiBpbnRlbmRlZCBhY3Rpb24gdG8gdXBkYXRlIGFub3RoZXIgcGFyYW1ldGVyICh3aGljaCBmdWxmaWxscyB0aGUgQURDIHN0YXRlIGNvbmRpdGlvbikKKyAgKiAgICAgICAgIG9uIHRoZSBmbHkpLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2hhbm5lbDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZ5IHRoZSBjaGFubmVsIHRvIGNvbmZpZ3VyZSBpbnRvIEFEQyByZWd1bGFyIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIEFEQyBpbnN0YW5jZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gZGV2aWNlIHBhY2thZ2UgcGlucy4gUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LiAqLworCisgIHVpbnQzMl90IFJhbms7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmeSB0aGUgcmFuayBpbiB0aGUgcmVndWxhciBncm91cCBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX1JFR19TRVFfUkFOS1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2Ugb3JkZXIgb2YgY29udmVyc2lvbiBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IGNoYW5uZWwgc2V0dGluZyAob3IgcGFyYW1ldGVyIG51bWJlciBvZiBjb252ZXJzaW9ucyBhZGp1c3RlZCkgKi8KKworICB1aW50MzJfdCBTYW1wbGluZ1RpbWU7ICAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIuNSBBREMgY2xvY2sgY3ljbGVzIGF0IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMsIDEwLjUgY3ljbGVzIGF0IDEwIGJpdHMsIDguNSBjeWNsZXMgYXQgOCBiaXRzLCA2LjUgY3ljbGVzIGF0IDYgYml0cykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIGNoYW5uZWwgdGhhdCBjYW4gYmUgdXNlZCBpbnRvIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG92ZXJ3cml0ZXMgdGhlIGxhc3Qgc2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgdGltZSBjb25zdHJhaW50cyBtdXN0IGJlIHJlc3BlY3RlZCAoc2FtcGxpbmcgdGltZSBjYW4gYmUgYWRqdXN0ZWQgaW4gZnVuY3Rpb24gb2YgQURDIGNsb2NrIGZyZXF1ZW5jeSBhbmQgc2FtcGxpbmcgdGltZSBzZXR0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIHRpbWluZ3MgdmFsdWVzLiAqLworCisgIHVpbnQzMl90IFNpbmdsZURpZmY7ICAgICAgICAgICAgIC8qITwgU2VsZWN0IHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gZGlmZmVyZW50aWFsIG1vZGU6IERpZmZlcmVudGlhbCBtZWFzdXJlbWVudCBpcyBjYXJyaWVkIG91dCBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBjaGFubmVsICdpJyAocG9zaXRpdmUgaW5wdXQpIGFuZCBjaGFubmVsICdpKzEnIChuZWdhdGl2ZSBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgY2hhbm5lbCAnaScgaGFzIHRvIGJlIGNvbmZpZ3VyZWQsIGNoYW5uZWwgJ2krMScgaXMgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TSU5HTEVfRElGRl9FTkRJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiBUaGlzIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgY2hhbm5lbCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcmVndWxhciBhbmQvb3IgaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgb3ZlcndyaXRlcyB0aGUgbGFzdCBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsIHRoZSBjaGFubmVsICdpKzEnIGlzIG5vdCB1c2FibGUgc2VwYXJhdGVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gQURDIGlzIGRpc2FibGVkIChiZWZvcmUgQURDIHN0YXJ0IGNvbnZlcnNpb24gb3IgYWZ0ZXIgQURDIHN0b3AgY29udmVyc2lvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQURDIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyIHNldHRpbmcgaXMgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGFub3RoZXIgcGFyYW1ldGVyIHVwZGF0ZSBvbiB0aGUgZmx5KSAqLworCisgIHVpbnQzMl90IE9mZnNldE51bWJlcjsgICAgICAgICAgIC8qITwgU2VsZWN0IHRoZSBvZmZzZXQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09GRlNFVF9OQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IE9ubHkgb25lIG9mZnNldCBpcyBhbGxvd2VkIHBlciBjaGFubmVsLiBUaGlzIHBhcmFtZXRlciBvdmVyd3JpdGVzIHRoZSBsYXN0IHNldHRpbmcuICovCisKKyAgdWludDMyX3QgT2Zmc2V0OyAgICAgICAgICAgICAgICAgLyohPCBEZWZpbmUgdGhlIG9mZnNldCB0byBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHJhdyBjb252ZXJ0ZWQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2IGJpdHMpLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkYsIDB4RkYgb3IgMHgzRiByZXNwZWN0aXZlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gYm90aCByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgKEFEQyBkaXNhYmxlZCwgb3IgQURDIGVuYWJsZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlciB0aGF0IGNvdWxkIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLworCit9QURDX0NoYW5uZWxDb25mVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBBREMgYW5hbG9nIHdhdGNoZG9nCisgICogQG5vdGUgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGJ5IGZ1bmN0aW9uIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCBvciBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFdhdGNoZG9nTnVtYmVyOyAgICAvKiE8IFNlbGVjdCB3aGljaCBBREMgYW5hbG9nIHdhdGNoZG9nIGlzIG1vbml0b3JpbmcgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogT25seSAxIGNoYW5uZWwgY2FuIGJlIG1vbml0b3JlZCAob3Igb3ZlcmFsbCBncm91cCBvZiBjaGFubmVscyBieSBzZXR0aW5nIHBhcmFtZXRlciAnV2F0Y2hkb2dNb2RlJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAyIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQgKGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgb2YgJ0hBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCknIGZvciBlYWNoIGNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19BV0RfTlVNQkVSLiAqLworCisgIHVpbnQzMl90IFdhdGNoZG9nTW9kZTsgICAgICAvKiE8IENvbmZpZ3VyZSB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyBtb2RlOiBzaW5nbGUvYWxsL25vbmUgY2hhbm5lbHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBBbmFsb2cgV2F0Y2hkb2cgMTogQ29uZmlndXJlIHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIG1vZGU6IHNpbmdsZSBjaGFubmVsIG9yIGFsbCBjaGFubmVscywgQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAyIGFuZCAzOiBTZXZlcmFsIGNoYW5uZWxzIGNhbiBiZSBtb25pdG9yZWQgYnkgYXBwbHlpbmcgc3VjY2Vzc2l2ZWx5IHRoZSBBV0QgaW5pdCBzdHJ1Y3R1cmUuIENoYW5uZWxzIG9uIEFEQyBncm91cCByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgbm90IGRpZmZlcmVudGlhdGVkOiBTZXQgdmFsdWUgJ0FEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfeHh4JyB0byBtb25pdG9yIDEgY2hhbm5lbCwgdmFsdWUgJ0FEQ19BTkFMT0dXQVRDSERPR19BTExfeHh4JyB0byBtb25pdG9yIGFsbCBjaGFubmVscywgJ0FEQ19BTkFMT0dXQVRDSERPR19OT05FJyB0byBtb25pdG9yIG5vIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlLiAqLworCisgIHVpbnQzMl90IENoYW5uZWw7ICAgICAgICAgICAvKiE8IFNlbGVjdCB3aGljaCBBREMgY2hhbm5lbCB0byBtb25pdG9yIGJ5IGFuYWxvZyB3YXRjaGRvZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFuYWxvZyBXYXRjaGRvZyAxOiB0aGlzIHBhcmFtZXRlciBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgcGFyYW1ldGVyICdXYXRjaGRvZ01vZGUnIGlzIGNvbmZpZ3VyZWQgb24gc2luZ2xlIGNoYW5uZWwgKG9ubHkgMSBjaGFubmVsIGNhbiBiZSBtb25pdG9yZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQW5hbG9nIFdhdGNoZG9nIDIgYW5kIDM6IFNldmVyYWwgY2hhbm5lbHMgY2FuIGJlIG1vbml0b3JlZC4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgY2FsbCBzdWNjZXNzaXZlbHkgdGhlIGZ1bmN0aW9uIEhBTF9BRENfQW5hbG9nV0RHQ29uZmlnKCkgZm9yIGVhY2ggY2hhbm5lbCB0byBiZSBhZGRlZCAob3IgcmVtb3ZlZCB3aXRoIHZhbHVlICdBRENfQU5BTE9HV0FUQ0hET0dfTk9ORScpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTC4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgSVRNb2RlOyAgICAgLyohPCBTcGVjaWZ5IHdoZXRoZXIgdGhlIGFuYWxvZyB3YXRjaGRvZyBpcyBjb25maWd1cmVkIGluIGludGVycnVwdCBvciBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUgKi8KKworICB1aW50MzJfdCBIaWdoVGhyZXNob2xkOyAgICAgLyohPCBDb25maWd1cmUgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvZiBBREMgcmVzb2x1dGlvbiBzZWxlY3RlZCAoMTIsIDEwLCA4IG9yIDYgYml0cyksIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGLCAweDNGRiwgMHhGRiBvciAweDNGIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogQW5hbG9nIHdhdGNoZG9nIDIgYW5kIDMgYXJlIGxpbWl0ZWQgdG8gYSByZXNvbHV0aW9uIG9mIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMgMTIgYml0cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzIHRoZSAyIExTQiBhcmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzYW1wbGluZyBmaW5hbCBjb21wdXRhdGlvbiAoYWZ0ZXIgcmF0aW8gYW5kIHNoaWZ0IGFwcGxpY2F0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLiAqLworCisgIHVpbnQzMl90IExvd1RocmVzaG9sZDsgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgTG93IHRocmVzaG9sZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kaW5nIG9mIEFEQyByZXNvbHV0aW9uIHNlbGVjdGVkICgxMiwgMTAsIDggb3IgNiBiaXRzKSwgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAgYW5kIE1heF9EYXRhID0gMHhGRkYsIDB4M0ZGLCAweEZGIG9yIDB4M0YgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBBbmFsb2cgd2F0Y2hkb2cgMiBhbmQgMyBhcmUgbGltaXRlZCB0byBhIHJlc29sdXRpb24gb2YgOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTAgYml0cyB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IElmIEFEQyBvdmVyc2FtcGxpbmcgaXMgZW5hYmxlZCwgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBhY3RlZDogdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZCBzaGlmdCBhcHBsaWNhdGlvbik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQyBkYXRhIHJlZ2lzdGVyIGJpdGZpZWxkIFsxNTo0XSAoMTIgbW9zdCBzaWduaWZpY2FudCBiaXRzKS4gKi8KK31BRENfQW5hbG9nV0RHQ29uZlR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGNvbmZpZ3VyYXRpb24KKyAgKiBAbm90ZSAgIFN0cnVjdHVyZSBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgdGhyb3VnaCBzdHJ1Y3R1cmUgIkFEQ19IYW5kbGVUeXBlRGVmIgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ29udGV4dFF1ZXVlOyAgICAgICAgICAgICAgICAgLyohPCBJbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gY29udGV4dDogYnVpbGQtdXAgb3ZlciBlYWNoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSBjYWxsIHRvIGZpbmFsbHkgaW5pdGlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTUVIgcmVnaXN0ZXIgYXQgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGxhc3QgY2FsbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgQ2hhbm5lbENvdW50OyAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGluamVjdGVkIHNlcXVlbmNlICovCit9QURDX0luamVjdGlvbkNvbmZpZ1R5cGVEZWY7ICAKKworLyoqIEBkZWZncm91cCBBRENfU3RhdGVzIEFEQyBTdGF0ZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBREMgc3RhdGUgbWFjaGluZTogQURDIHN0YXRlcyBkZWZpbml0aW9uIChiaXRmaWVsZHMpCisgICogQG5vdGUgICBBREMgc3RhdGUgbWFjaGluZSBpcyBtYW5hZ2VkIGJ5IGJpdGZpZWxkcywgc3RhdGUgbXVzdCBiZSBjb21wYXJlZAorICAqICAgICAgICAgd2l0aCBiaXQgYnkgYml0LgorICAqICAgICAgICAgRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkgIgorICAqICAgICAgICAgICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIgorICAqLworLyogU3RhdGVzIG9mIEFEQyBnbG9iYWwgc2NvcGUgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRVNFVCAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgIC8qITwgQURDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUFEWSAgICAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAgIC8qITwgQURDIHBlcmlwaGVyYWwgcmVhZHkgZm9yIHVzZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwgICAgICgweDAwMDAwMDAyVUwpICAgLyohPCBBREMgaXMgYnVzeSBkdWUgdG8gYW4gaW50ZXJuYWwgcHJvY2VzcyAoaW5pdGlhbGl6YXRpb24sIGNhbGlicmF0aW9uKSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICgweDAwMDAwMDA0VUwpICAgLyohPCBUaW1lT3V0IG9jY3VycmVuY2UgKi8KKworLyogU3RhdGVzIG9mIEFEQyBlcnJvcnMgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCAgICAoMHgwMDAwMDAxMFVMKSAgIC8qITwgSW50ZXJuYWwgZXJyb3Igb2NjdXJyZW5jZSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyAgICAgICgweDAwMDAwMDIwVUwpICAgLyohPCBDb25maWd1cmF0aW9uIGVycm9yIG9jY3VycmVuY2UgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEgICAgICAgICAoMHgwMDAwMDA0MFVMKSAgIC8qITwgRE1BIGVycm9yIG9jY3VycmVuY2UgKi8KKworLyogU3RhdGVzIG9mIEFEQyBncm91cCByZWd1bGFyICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgICAgICAgICAgKDB4MDAwMDAxMDBVTCkgICAvKiE8IEEgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyBvbmdvaW5nIG9yIGNhbiBvY2N1ciAoZWl0aGVyIGJ5IGNvbnRpbnVvdXMgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJpZ2dlciwgbG93IHBvd2VyIGF1dG8gcG93ZXItb24gKGlmIGZlYXR1cmUgYXZhaWxhYmxlKSwgbXVsdGltb2RlIEFEQyBtYXN0ZXIgY29udHJvbCAoaWYgZmVhdHVyZSBhdmFpbGFibGUpKSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX1JFR19FT0MgICAgICAgICAgICgweDAwMDAwMjAwVUwpICAgLyohPCBDb252ZXJzaW9uIGRhdGEgYXZhaWxhYmxlIG9uIGdyb3VwIHJlZ3VsYXIgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9SRUdfT1ZSICAgICAgICAgICAoMHgwMDAwMDQwMFVMKSAgIC8qITwgT3ZlcnJ1biBvY2N1cnJlbmNlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QICAgICAgICAgKDB4MDAwMDA4MDBVTCkgICAvKiE8IE5vdCBhdmFpbGFibGUgb24gdGhpcyBTVE0zMiBzZXJpZTogRW5kIE9mIFNhbXBsaW5nIGZsYWcgcmFpc2VkICAqLworCisvKiBTdGF0ZXMgb2YgQURDIGdyb3VwIGluamVjdGVkICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kgICAgICAgICAgKDB4MDAwMDEwMDBVTCkgICAvKiE8IEEgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgb25nb2luZyBvciBjYW4gb2NjdXIgKGVpdGhlciBieSBhdXRvLWluamVjdGlvbiBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyLCBsb3cgcG93ZXIgYXV0byBwb3dlci1vbiAoaWYgZmVhdHVyZSBhdmFpbGFibGUpLCBtdWx0aW1vZGUgQURDIG1hc3RlciBjb250cm9sIChpZiBmZWF0dXJlIGF2YWlsYWJsZSkpICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfSU5KX0VPQyAgICAgICAgICAgKDB4MDAwMDIwMDBVTCkgICAvKiE8IENvbnZlcnNpb24gZGF0YSBhdmFpbGFibGUgb24gZ3JvdXAgaW5qZWN0ZWQgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYgICAgICAgICAoMHgwMDAwNDAwMFVMKSAgIC8qITwgSW5qZWN0ZWQgcXVldWUgb3ZlcmZsb3cgb2NjdXJyZW5jZSAqLworCisvKiBTdGF0ZXMgb2YgQURDIGFuYWxvZyB3YXRjaGRvZ3MgKi8KKyNkZWZpbmUgSEFMX0FEQ19TVEFURV9BV0QxICAgICAgICAgICAgICAoMHgwMDAxMDAwMFVMKSAgIC8qITwgT3V0LW9mLXdpbmRvdyBvY2N1cnJlbmNlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBIQUxfQURDX1NUQVRFX0FXRDIgICAgICAgICAgICAgICgweDAwMDIwMDAwVUwpICAgLyohPCBPdXQtb2Ytd2luZG93IG9jY3VycmVuY2Ugb2YgQURDIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfQVdEMyAgICAgICAgICAgICAgKDB4MDAwNDAwMDBVTCkgICAvKiE8IE91dC1vZi13aW5kb3cgb2NjdXJyZW5jZSBvZiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKworLyogU3RhdGVzIG9mIEFEQyBtdWx0aS1tb2RlICovCisjZGVmaW5lIEhBTF9BRENfU1RBVEVfTVVMVElNT0RFX1NMQVZFICAgKDB4MDAxMDAwMDBVTCkgICAvKiE8IE5vdCBhdmFpbGFibGUgb24gdGhpcyBTVE0zMiBzZXJpZTogQURDIGluIG11bHRpbW9kZSBzbGF2ZSBzdGF0ZSwgY29udHJvbGxlZCBieSBhbm90aGVyIEFEQyBtYXN0ZXIgKHdoZW4gZmVhdHVyZSBhdmFpbGFibGUpICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQGJyaWVmICBBREMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgQURDX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKyAgQURDX0luaXRUeXBlRGVmICAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgLyohPCBBREMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBhbmQgcmVndWxhciBjb252ZXJzaW9ucyBzZXR0aW5nICovCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICpETUFfSGFuZGxlOyAgICAgICAgICAgIC8qITwgUG9pbnRlciBETUEgSGFuZGxlciAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb2NraW5nIG9iamVjdCAqLworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBjb21tdW5pY2F0aW9uIHN0YXRlIChiaXRtYXAgb2YgQURDIHN0YXRlcykgKi8KKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAgLyohPCBBREMgRXJyb3IgY29kZSAqLworICBBRENfSW5qZWN0aW9uQ29uZmlnVHlwZURlZiAgICBJbmplY3Rpb25Db25maWcgOyAgICAgICAvKiE8IEFEQyBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYnVpbGQtdXAgc3RydWN0dXJlICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIENvbnZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBDb252SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAvKiE8IEFEQyBjb252ZXJzaW9uIERNQSBoYWxmLXRyYW5zZmVyIGNhbGxiYWNrICovCisgIHZvaWQgKCogTGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAgICAgICAgICAgICAvKiE8IEFEQyBlcnJvciBjYWxsYmFjayAqLworICB2b2lkICgqIEluamVjdGVkQ29udkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBJbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrICovCisgIHZvaWQgKCogTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrKShzdHJ1Y3QgX19BRENfSGFuZGxlVHlwZURlZiAqaGFkYyk7ICAgICAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjayAqLworICB2b2lkICgqIEVuZE9mU2FtcGxpbmdDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgIC8qITwgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOyAgICAgICAgICAgICAgIC8qITwgQURDIE1zcCBJbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0FEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgICAgICAgICAgICAgLyohPCBBREMgTXNwIERlSW5pdCBjYWxsYmFjayAqLworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfUFEQ19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgQURDIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwMFUsICAvKiE8IEFEQyBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEICAgICAgICAgPSAweDAxVSwgIC8qITwgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgICA9IDB4MDJVLCAgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBBREMgZXJyb3IgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA9IDB4MDRVLCAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX0lOSl9RVUVVRV9PVkVGTE9XX0NCX0lEICAgICAgID0gMHgwNVUsICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18yX0NCX0lEICAgPSAweDA2VSwgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEICAgPSAweDA3VSwgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIElEICovCisgIEhBTF9BRENfRU5EX09GX1NBTVBMSU5HX0NCX0lEICAgICAgICAgPSAweDA4VSwgIC8qITwgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayBJRCAqLworICBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOVUsICAvKiE8IEFEQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfQURDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwQVUgICAvKiE8IEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAqLworfSBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBREMgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcEFEQ19DYWxsYmFja1R5cGVEZWYpKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsgLyohPCBwb2ludGVyIHRvIGEgQURDIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9Db25zdGFudHMgQURDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0Vycm9yX0NvZGUgQURDIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX05PTkUgICAgICAgICAgICAgICgweDAwVSkgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCAgICAgICAgICAoMHgwMVUpICAgLyohPCBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAocHJvYmxlbSBvZiBjbG9ja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUvZGlzYWJsZSwgZXJyb25lb3VzIHN0YXRlLCAuLi4pICAgICAgICovCisjZGVmaW5lIEhBTF9BRENfRVJST1JfT1ZSICAgICAgICAgICAgICAgKDB4MDJVKSAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfQURDX0VSUk9SX0RNQSAgICAgICAgICAgICAgICgweDA0VSkgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0FEQ19FUlJPUl9KUU9WRiAgICAgICAgICAgICAoMHgwOFUpICAgLyohPCBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGVycm9yICAgICAgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICgweDEwVSkgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFICBBREMgY29tbW9uIC0gQ2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVYxICAgICAgICAgICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYxKSAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRob3V0IHByZXNjYWxlciAqLworI2RlZmluZSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIgKi8KKyNkZWZpbmUgQURDX0NMT0NLX1NZTkNfUENMS19ESVY0ICAgICAgICAgICAoTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgLyohPCBBREMgc3luY2hyb25vdXMgY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA0ICovCisKKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEpICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGhvdXQgcHJlc2NhbGVyICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYyICAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYyKSAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAyICAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjQgICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNikgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNiAgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVY4ICAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVY4KSAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA4ICAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjEwICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWMTIgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIpICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTIgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxNiAgICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxNikgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxNiAgKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjMyICAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDMyICAqLworI2RlZmluZSBBRENfQ0xPQ0tfQVNZTkNfRElWNjQgICAgICAgICAgICAgIChMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQpICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgNjQgICovCisjZGVmaW5lIEFEQ19DTE9DS19BU1lOQ19ESVYxMjggICAgICAgICAgICAgKExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMjgpICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxMjggKi8KKyNkZWZpbmUgQURDX0NMT0NLX0FTWU5DX0RJVjI1NiAgICAgICAgICAgICAoTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFU09MVVRJT04gIEFEQyBpbnN0YW5jZSAtIFJlc29sdXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl8xMkIgICAgICAgICAgICAgICAgIChMTF9BRENfUkVTT0xVVElPTl8xMkIpICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgQURDX1JFU09MVVRJT05fMTBCICAgICAgICAgICAgICAgICAoTExfQURDX1JFU09MVVRJT05fMTBCKSAgLyohPCBBREMgcmVzb2x1dGlvbiAxMCBiaXRzICovCisjZGVmaW5lIEFEQ19SRVNPTFVUSU9OXzhCICAgICAgICAgICAgICAgICAgKExMX0FEQ19SRVNPTFVUSU9OXzhCKSAgIC8qITwgQURDIHJlc29sdXRpb24gIDggYml0cyAqLworI2RlZmluZSBBRENfUkVTT0xVVElPTl82QiAgICAgICAgICAgICAgICAgIChMTF9BRENfUkVTT0xVVElPTl82QikgICAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19EQVRBX0FMSUdOIEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0RBVEFBTElHTl9SSUdIVCAgICAgICAgICAgICAgICAoTExfQURDX0RBVEFfQUxJR05fUklHSFQpLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogcmlnaHQgYWxpZ25lZCAoYWxpZ25tZW50IG9uIGRhdGEgcmVnaXN0ZXIgTFNCIGJpdCAwKSovCisjZGVmaW5lIEFEQ19EQVRBQUxJR05fTEVGVCAgICAgICAgICAgICAgICAgKExMX0FEQ19EQVRBX0FMSUdOX0xFRlQpICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IGxlZnQgYWxpZ25lZCAoYWxpZ21lbnQgb24gZGF0YSByZWdpc3RlciBNU0IgYml0IDE1KSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19TY2FuX21vZGUgQURDIHNlcXVlbmNlciBzY2FuIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU0NBTl9ESVNBQkxFICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgLyohPCBTY2FuIG1vZGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURDX1NDQU5fRU5BQkxFICAgICAgICAgICgweDAwMDAwMDAxVUwpICAgICAgIC8qITwgU2NhbiBtb2RlIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19yZWd1bGFyX2V4dGVybmFsX3RyaWdnZXJfc291cmNlIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlCisgICogQHsKKyAgKi8KKy8qIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlcyBmb3IgYWxsIEFEQyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgQURDX1NPRlRXQVJFX1NUQVJUICAgICAgICAgICAgKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGludGVybmFsOiBTVyBzdGFydC4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPICAgICAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08yICAgICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QxX0NDMSAgICAgICAoTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMSkgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR19UMV9DQzIgICAgICAgKExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIpICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MzICAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gzKSAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCAzIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX1QyX1RSR08gICAgICAoTExfQURDX1JFR19UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdfVDJfQ0MyICAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHX0VYVF9JVDExICAgICAoTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX3JlZ3VsYXJfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgZWRnZSAod2hlbiBleHRlcm5hbCB0cmlnZ2VyIGlzIHNlbGVjdGVkKQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdDT05WRURHRV9OT05FICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlZ3VsYXIgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0NPTlZFREdFX1JJU0lORyAgICAgICAgIChMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORykgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byByaXNpbmcgZWRnZSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORyAgICAgICAgKExMX0FEQ19SRUdfVFJJR19FWFRfRkFMTElORykgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORyAgKExMX0FEQ19SRUdfVFJJR19FWFRfUklTSU5HRkFMTElORykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FT0NTZWxlY3Rpb24gQURDIHNlcXVlbmNlciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIG9yIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0VPQ19TSU5HTEVfQ09OViAgICAgICAgIChBRENfSVNSX0VPQykgICAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBmbGFnICAqLworI2RlZmluZSBBRENfRU9DX1NFUV9DT05WICAgICAgICAgICAgKEFEQ19JU1JfRU9TKSAgICAgICAgICAgICAgICAgLyohPCBFbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgZmxhZyAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUiAgQURDIGdyb3VwIHJlZ3VsYXIgLSBPdmVycnVuIGJlaGF2aW9yIG9uIGNvbnZlcnNpb24gZGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQgICAgICAgICAgICAgKExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBwcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQURDX09WUl9EQVRBX09WRVJXUklUVEVOICAgICAgICAgICAoTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTikgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIG92ZXJ3cml0dGVuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfUkVHX1NFUV9SQU5LUyAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgcmFua3MKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMSkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzIgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMikgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzMgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzQgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzUgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNSkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzYgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNikgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzcgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfNykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNyAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzggICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfOCkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOCAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzkgICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfOSkgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEwICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMTApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTAgKi8KKyNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS18xMSAgICAgICAgICAgICAgICAoTExfQURDX1JFR19SQU5LXzExKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDExICovCisjZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMTIgICAgICAgICAgICAgICAgKExMX0FEQ19SRUdfUkFOS18xMikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMiAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzEzICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMTMpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTMgKi8KKyNkZWZpbmUgQURDX1JFR1VMQVJfUkFOS18xNCAgICAgICAgICAgICAgICAoTExfQURDX1JFR19SQU5LXzE0KSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE0ICovCisjZGVmaW5lIEFEQ19SRUdVTEFSX1JBTktfMTUgICAgICAgICAgICAgICAgKExMX0FEQ19SRUdfUkFOS18xNSkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNSAqLworI2RlZmluZSBBRENfUkVHVUxBUl9SQU5LXzE2ICAgICAgICAgICAgICAgIChMTF9BRENfUkVHX1JBTktfMTYpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19DSEFOTkVMX1NBTVBMSU5HVElNRSAgQ2hhbm5lbCAtIFNhbXBsaW5nIHRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8yQ1lDTEVTXzUgICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV8yQ1lDTEVTXzUpICAgIC8qITwgU2FtcGxpbmcgdGltZSAyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV82Q1lDTEVTXzUgICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV82Q1lDTEVTXzUpICAgIC8qITwgU2FtcGxpbmcgdGltZSA2LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV8xMkNZQ0xFU181ICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181KSAgIC8qITwgU2FtcGxpbmcgdGltZSAxMi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjRDWUNMRVNfNSAgICAgICAgKExMX0FEQ19TQU1QTElOR1RJTUVfMjRDWUNMRVNfNSkgICAvKiE8IFNhbXBsaW5nIHRpbWUgMjQuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIEFEQ19TQU1QTEVUSU1FXzQ3Q1lDTEVTXzUgICAgICAgIChMTF9BRENfU0FNUExJTkdUSU1FXzQ3Q1lDTEVTXzUpICAgLyohPCBTYW1wbGluZyB0aW1lIDQ3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV85MkNZQ0xFU181ICAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV85MkNZQ0xFU181KSAgIC8qITwgU2FtcGxpbmcgdGltZSA5Mi41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgQURDX1NBTVBMRVRJTUVfMjQ3Q1lDTEVTXzUgICAgICAgKExMX0FEQ19TQU1QTElOR1RJTUVfMjQ3Q1lDTEVTXzUpICAvKiE8IFNhbXBsaW5nIHRpbWUgMjQ3LjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBBRENfU0FNUExFVElNRV82NDBDWUNMRVNfNSAgICAgICAoTExfQURDX1NBTVBMSU5HVElNRV82NDBDWUNMRVNfNSkgIC8qITwgU2FtcGxpbmcgdGltZSA2NDAuNSBBREMgY2xvY2sgY3ljbGVzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfQ0hBTk5FTCAgQURDIGluc3RhbmNlIC0gQ2hhbm5lbCBudW1iZXIKKyAgKiBAeworICAqLworLyogTm90ZTogVnJlZkludCwgVGVtcFNlbnNvciBhbmQgVmJhdCBpbnRlcm5hbCBjaGFubmVscyBhcmUgbm90IGF2YWlsYWJsZSBvbiAgKi8KKy8qICAgICAgICBhbGwgQURDIGluc3RhbmNlcyAocmVmZXIgdG8gUmVmZXJlbmNlIE1hbnVhbCkuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzAgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzApICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xKSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMikgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjIgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzMgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzMpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF80KSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfNSkgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjUgICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzYgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzYpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42ICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF83KSAgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONyAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOCAgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfOCkgICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjggICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzkgICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzkpICAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45ICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMCAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xMCkgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTEgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTEpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzEyKSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMyAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xMykgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTQgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTQpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1ICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE1KSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNiAgICAgICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8xNikgICAgICAgICAgICAgIC8qITwgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMTYgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTcgICAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfMTcpICAgICAgICAgICAgICAvKiE8IEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3ICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4ICAgICAgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE4KSAgICAgICAgICAgICAgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAgICAgIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLiAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SKSAgICAgIC8qITwgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvci4gKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAgICAgICAgICAoTExfQURDX0NIQU5ORUxfVkJBVCkgICAgICAgICAgICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMyB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFZkZGEuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfQVdEX05VTUJFUiBBbmFsb2cgd2F0Y2hkb2cgLSBBbmFsb2cgd2F0Y2hkb2cgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HXzEgICAgICAgICAgICAgICAoTExfQURDX0FXRDEpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMSAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfMiAgICAgICAgICAgICAgIChMTF9BRENfQVdEMikgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAyICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR18zICAgICAgICAgICAgICAgKExMX0FEQ19BV0QzKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX2FuYWxvZ193YXRjaGRvZ19tb2RlIEFEQyBBbmFsb2cgV2F0Y2hkb2cgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19OT05FICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gYW5hbG9nIHdhdGNoZG9nIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUcgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxU0dMIHwgQURDX0NGR1JfQVdEMUVOKSAgICAgICAgICAgICAgICAgICAgLyohPCBBbmFsb2cgd2F0Y2hkb2cgYXBwbGllZCB0byBhIHJlZ3VsYXIgZ3JvdXAgc2luZ2xlIGNoYW5uZWwgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDICAgICAgICAgKEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9KQVdEMUVOKSAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyB3YXRjaGRvZyBhcHBsaWVkIHRvIGFuIGluamVjdGVkIGdyb3VwIHNpbmdsZSBjaGFubmVsICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMgICAgICAoQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0pBV0QxRU4pIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gYSByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHMgc2luZ2xlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUcgICAgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBbmFsb2cgd2F0Y2hkb2cgYXBwbGllZCB0byByZWd1bGFyIGdyb3VwIGFsbCBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX0lOSkVDICAgICAgICAgICAgKEFEQ19DRkdSX0pBV0QxRU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyB3YXRjaGRvZyBhcHBsaWVkIHRvIGluamVjdGVkIGdyb3VwIGFsbCBjaGFubmVscyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMgICAgICAgICAoQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfSkFXRDFFTikgICAgICAgICAgICAgICAgICAgIC8qITwgQW5hbG9nIHdhdGNoZG9nIGFwcGxpZWQgdG8gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzIGFsbCBjaGFubmVscyAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19PVlNfUkFUSU8gIE92ZXJzYW1wbGluZyAtIFJhdGlvCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18yICAgICAgICAgICAoTExfQURDX09WU19SQVRJT18yKSAgIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyICgyIEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzQgICAgICAgICAgIChMTF9BRENfT1ZTX1JBVElPXzQpICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDQgKDQgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCAgICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fOCkgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgOCAoOCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18xNiAgICAgICAgICAoTExfQURDX09WU19SQVRJT18xNikgIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAxNiAoMTYgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMzIgICAgICAgICAgKExMX0FEQ19PVlNfUkFUSU9fMzIpICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMzIgKDMyIEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBBRENfT1ZFUlNBTVBMSU5HX1JBVElPXzY0ICAgICAgICAgIChMTF9BRENfT1ZTX1JBVElPXzY0KSAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDY0ICg2NCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18xMjggICAgICAgICAoTExfQURDX09WU19SQVRJT18xMjgpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAxMjggKDEyOCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgQURDX09WRVJTQU1QTElOR19SQVRJT18yNTYgICAgICAgICAoTExfQURDX09WU19SQVRJT18yNTYpIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAyNTYgKDI1NiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19PVlNfU0hJRlQgIE92ZXJzYW1wbGluZyAtIERhdGEgc2hpZnQKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF9OT05FICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX05PTkUpICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBubyBzaGlmdCAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBub3QgZGl2aWRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF8xICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAxIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF8yICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAyIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgNCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF8zICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAzIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgOCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF80ICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA0IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgQURDX1JJR0hUQklUU0hJRlRfNSAgICAgICAgICAgICAgICAoTExfQURDX09WU19TSElGVF9SSUdIVF81KSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNSAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDMyIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzYgICAgICAgICAgICAgICAgKExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNikgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDYgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA2NCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBBRENfUklHSFRCSVRTSElGVF83ICAgICAgICAgICAgICAgIChMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcpIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA3IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTI4IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIEFEQ19SSUdIVEJJVFNISUZUXzggICAgICAgICAgICAgICAgKExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDggKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAyNTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FQ19PVlNfRElTQ09OVF9NT0RFICBPdmVyc2FtcGxpbmcgLSBEaXNjb250aW51b3VzIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUiAgIChMTF9BRENfT1ZTX1JFR19DT05UKSAgICAgICAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlOiBjb250aW51b3VzIG1vZGUgKGFsbCBjb252ZXJzaW9ucyBvZiBvdmVyc2FtcGxpbmcgcmF0aW8gYXJlIGRvbmUgZnJvbSAxIHRyaWdnZXIpICovCisjZGVmaW5lIEFEQ19UUklHR0VSRURNT0RFX01VTFRJX1RSSUdHRVIgICAgKExMX0FEQ19PVlNfUkVHX0RJU0NPTlQpICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbyBuZWVkcyBhIHRyaWdnZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfT1ZTX1NDT1BFX1JFRyAgT3ZlcnNhbXBsaW5nIC0gT3ZlcnNhbXBsaW5nIHNjb3BlIGZvciBBREMgZ3JvdXAgcmVndWxhcgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19SRUdPVkVSU0FNUExJTkdfQ09OVElOVUVEX01PREUgICAgKExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVEKSAvKiE8IE92ZXJzYW1wbGluZyBidWZmZXIgbWFpbnRhaW5lZCBkdXJpbmcgaW5qZWN0aW9uIHNlcXVlbmNlICovCisjZGVmaW5lIEFEQ19SRUdPVkVSU0FNUExJTkdfUkVTVU1FRF9NT0RFICAgICAgKExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfUkVTVU1FRCkgICAvKiE8IE92ZXJzYW1wbGluZyBidWZmZXIgemVyb2VkIGR1cmluZyBpbmplY3Rpb24gc2VxdWVuY2UgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V2ZW50X3R5cGUgQURDIEV2ZW50IHR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRU9TTVBfRVZFTlQgICAgICAgICAgKEFEQ19GTEFHX0VPU01QKSAvKiE8IEFEQyBFbmQgb2YgU2FtcGxpbmcgZXZlbnQgKi8KKyNkZWZpbmUgQURDX0FXRDFfRVZFTlQgICAgICAgICAgIChBRENfRkxBR19BV0QxKSAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZXZlbnQgKG1haW4gYW5hbG9nIHdhdGNoZG9nLCBwcmVzZW50IG9uIGFsbCBTVE0zMiBzZXJpZXMpICovCisjZGVmaW5lIEFEQ19BV0QyX0VWRU5UICAgICAgICAgICAoQURDX0ZMQUdfQVdEMikgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGV2ZW50IChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZywgbm90IHByZXNlbnQgb24gYWxsIFNUTTMyIHNlcmllcykgKi8KKyNkZWZpbmUgQURDX0FXRDNfRVZFTlQgICAgICAgICAgIChBRENfRkxBR19BV0QzKSAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgc2VyaWVzKSAqLworI2RlZmluZSBBRENfT1ZSX0VWRU5UICAgICAgICAgICAgKEFEQ19GTEFHX09WUikgICAvKiE8IEFEQyBvdmVycnVuIGV2ZW50ICovCisjZGVmaW5lIEFEQ19KUU9WRl9FVkVOVCAgICAgICAgICAoQURDX0ZMQUdfSlFPVkYpIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisjZGVmaW5lIEFEQ19BV0RfRVZFTlQgICAgICAgICAgICBBRENfQVdEMV9FVkVOVCAgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGV2ZW50OiBOYW1pbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBkZXZpY2VzIGhhdmluZyBvbmx5IG9uZSBhbmFsb2cgd2F0Y2hkb2cgKi8KKworLyoqIEBkZWZncm91cCBBRENfaW50ZXJydXB0c19kZWZpbml0aW9uIEFEQyBpbnRlcnJ1cHRzIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBBRENfSVRfUkRZICAgICAgICAgICBBRENfSUVSX0FEUkRZSUUgICAgLyohPCBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9TTVAgICAgICAgICBBRENfSUVSX0VPU01QSUUgICAgLyohPCBBREMgRW5kIG9mIHNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUgQURDX0lUX0VPQyAgICAgICAgICAgQURDX0lFUl9FT0NJRSAgICAgIC8qITwgQURDIEVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfRU9TICAgICAgICAgICBBRENfSUVSX0VPU0lFICAgICAgLyohPCBBREMgRW5kIG9mIHJlZ3VsYXIgc2VxdWVuY2Ugb2YgY29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfT1ZSICAgICAgICAgICBBRENfSUVSX09WUklFICAgICAgLyohPCBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9KRU9DICAgICAgICAgIEFEQ19JRVJfSkVPQ0lFICAgICAvKiE8IEFEQyBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEFEQ19JVF9KRU9TICAgICAgICAgIEFEQ19JRVJfSkVPU0lFICAgICAvKiE8IEFEQyBFbmQgb2YgaW5qZWN0ZWQgc2VxdWVuY2Ugb2YgY29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBBRENfSVRfQVdEMSAgICAgICAgICBBRENfSUVSX0FXRDFJRSAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpICovCisjZGVmaW5lIEFEQ19JVF9BV0QyICAgICAgICAgIEFEQ19JRVJfQVdEMklFICAgICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBpbnRlcnJ1cHQgc291cmNlIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykgKi8KKyNkZWZpbmUgQURDX0lUX0FXRDMgICAgICAgICAgQURDX0lFUl9BV0QzSUUgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfSVRfSlFPVkYgICAgICAgICBBRENfSUVSX0pRT1ZGSUUgICAgLyohPCBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlICovCisKKyNkZWZpbmUgQURDX0lUX0FXRCAgICAgICAgICAgQURDX0lUX0FXRDEgICAgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2U6IG5hbWluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFNUTTMyIGRldmljZXMgaGF2aW5nIG9ubHkgb25lIGFuYWxvZyB3YXRjaGRvZyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19mbGFnc19kZWZpbml0aW9uIEFEQyBmbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0ZMQUdfUkRZICAgICAgICAgICBBRENfSVNSX0FEUkRZICAgIC8qITwgQURDIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TTVAgICAgICAgICBBRENfSVNSX0VPU01QICAgIC8qITwgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICovCisjZGVmaW5lIEFEQ19GTEFHX0VPQyAgICAgICAgICAgQURDX0lTUl9FT0MgICAgICAvKiE8IEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfRU9TICAgICAgICAgICBBRENfSVNSX0VPUyAgICAgIC8qITwgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfT1ZSICAgICAgICAgICBBRENfSVNSX09WUiAgICAgIC8qITwgQURDIG92ZXJydW4gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19KRU9DICAgICAgICAgIEFEQ19JU1JfSkVPQyAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gZmxhZyAqLworI2RlZmluZSBBRENfRkxBR19KRU9TICAgICAgICAgIEFEQ19JU1JfSkVPUyAgICAgLyohPCBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgKi8KKyNkZWZpbmUgQURDX0ZMQUdfQVdEMSAgICAgICAgICBBRENfSVNSX0FXRDEgICAgIC8qITwgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGZsYWcgKG1haW4gYW5hbG9nIHdhdGNoZG9nKSAqLworI2RlZmluZSBBRENfRkxBR19BV0QyICAgICAgICAgIEFEQ19JU1JfQVdEMiAgICAgLyohPCBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpICovCisjZGVmaW5lIEFEQ19GTEFHX0FXRDMgICAgICAgICAgQURDX0lTUl9BV0QzICAgICAvKiE8IEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBmbGFnIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykgKi8KKyNkZWZpbmUgQURDX0ZMQUdfSlFPVkYgICAgICAgICBBRENfSVNSX0pRT1ZGICAgIC8qITwgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgZmxhZyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX01hY3JvcyBBREMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyogTWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGluICAgKi8KKy8qIGNvZGUgb2YgZmluYWwgdXNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEBicmllZiBSZXR1cm4gcmVzb2x1dGlvbiBiaXRzIGluIENGR1IgcmVnaXN0ZXIgUkVTWzE6MF0gZmllbGQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgVmFsdWUgb2YgYml0ZmllbGQgUkVTIGluIENGR1IgcmVnaXN0ZXIuCisgICovCisjZGVmaW5lIEFEQ19HRVRfUkVTT0xVVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoTExfQURDX0dldFJlc29sdXRpb24oKF9fSEFORExFX18pLT5JbnN0YW5jZSkpCisKKy8qKgorICAqIEBicmllZiBDbGVhciBBREMgZXJyb3IgY29kZSAoc2V0IGl0IHRvIG5vIGVycm9yIGNvZGUgIkhBTF9BRENfRVJST1JfTk9ORSIpLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NMRUFSX0VSUk9SQ09ERShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5FcnJvckNvZGUgPSBIQUxfQURDX0VSUk9SX05PTkUpIAorCisvKioKKyAgKiBAYnJpZWYgU2ltdWx0YW5lb3VzbHkgY2xlYXIgYW5kIHNldCBzcGVjaWZpYyBiaXRzIG9mIHRoZSBoYW5kbGUgU3RhdGUuCisgICogQG5vdGUgIEFEQ19TVEFURV9DTFJfU0VUKCkgbWFjcm8gaXMgbWVyZWx5IGFsaWFzZWQgdG8gZ2VuZXJpYyBtYWNybyBNT0RJRllfUkVHKCksCisgICogICAgICAgIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgU3RhdGUsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZQorICAqICAgICAgICBiaXQgZmllbGQgdG8gY2xlYXIsIHRoZSB0aGlyZCBhbmQgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGJpdCBmaWVsZCB0byBzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19TVEFURV9DTFJfU0VUIE1PRElGWV9SRUcKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGF0IGEgZ2l2ZW4gdmFsdWUgaXMgYWxpZ25lZCB3aXRoIHRoZSBBREMgcmVzb2x1dGlvbiByYW5nZS4KKyAgKiBAcGFyYW0gX19SRVNPTFVUSU9OX18gQURDIHJlc29sdXRpb24gKDEyLCAxMCwgOCBvciA2IGJpdHMpLgorICAqIEBwYXJhbSBfX0FEQ19WQUxVRV9fIHZhbHVlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcmVzb2x1dGlvbi4gICAgIAorICAqIEByZXR2YWwgU0VUIChfX0FEQ19WQUxVRV9fIGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykgb3IgUkVTRVQgKF9fQURDX1ZBTFVFX18gbm90IGluIGxpbmUgd2l0aCBfX1JFU09MVVRJT05fXykKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JBTkdFKF9fUkVTT0xVVElPTl9fLCBfX0FEQ19WQUxVRV9fKSBcCisgICgoX19BRENfVkFMVUVfXykgPD0gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX1JFU09MVVRJT05fXykpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIGxlbmd0aCBvZiB0aGUgc2NoZWR1bGVkIHJlZ3VsYXIgY29udmVyc2lvbnMgZ3JvdXAuCisgICogQHBhcmFtIF9fTEVOR1RIX18gbnVtYmVyIG9mIHByb2dyYW1tZWQgY29udmVyc2lvbnMuICAgCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgd2l0aGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBwcm9ncmFtbWFibGUgcmVndWxhciBjb252ZXJzaW9ucykgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgbnVsbCBvciB0b28gbGFyZ2UpCisgICovCisjZGVmaW5lIElTX0FEQ19SRUdVTEFSX05CX0NPTlYoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPj0gKDFVTCkpICYmICgoX19MRU5HVEhfXykgPD0gKDE2VUwpKSkKKworCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIHJlZ3VsYXIgY29udmVyc2lvbnMgaW4gZGlzY29udGludW91cyBtb2RlLgorICAqIEBwYXJhbSBOVU1CRVIgbnVtYmVyIG9mIHNjaGVkdWxlZCByZWd1bGFyIGNvbnZlcnNpb25zIGluIGRpc2NvbnRpbnVvdXMgbW9kZS4gIAorICAqIEByZXR2YWwgU0VUIChOVU1CRVIgaXMgd2l0aGluIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWd1bGFyIGNvbnZlcnNpb25zIGluIGRpc2NvbnRpbnVvdXMgbW9kZSkgb3IgUkVTRVQgKE5VTUJFUiBpcyBudWxsIG9yIHRvbyBsYXJnZSkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JFR1VMQVJfRElTQ09OVF9OVU1CRVIoTlVNQkVSKSAoKChOVU1CRVIpID49ICgxVUwpKSAmJiAoKE5VTUJFUikgPD0gKDhVTCkpKQorCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjbG9jayBzZXR0aW5nLgorICAqIEBwYXJhbSBfX0FEQ19DTE9DS19fIHByb2dyYW1tZWQgQURDIGNsb2NrLgorICAqIEByZXR2YWwgU0VUIChfX0FEQ19DTE9DS19fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX0FEQ19DTE9DS19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19DTE9DS1BSRVNDQUxFUihfX0FEQ19DTE9DS19fKSAoKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19TWU5DX1BDTEtfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYyKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWNikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVY4KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWMTIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYxNikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FEQ19DTE9DS19fKSA9PSBBRENfQ0xPQ0tfQVNZTkNfRElWNjQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQURDX0NMT0NLX18pID09IEFEQ19DTE9DS19BU1lOQ19ESVYxMjgpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgKSAgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZXNvbHV0aW9uIHNldHRpbmcuCisgICogQHBhcmFtIF9fUkVTT0xVVElPTl9fIHByb2dyYW1tZWQgQURDIHJlc29sdXRpb24uCisgICogQHJldHZhbCBTRVQgKF9fUkVTT0xVVElPTl9fIGlzIGEgdmFsaWQgdmFsdWUpIG9yIFJFU0VUIChfX1JFU09MVVRJT05fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfUkVTT0xVVElPTihfX1JFU09MVVRJT05fXykgKCgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzEyQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzEwQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRVNPTFVUSU9OX18pID09IEFEQ19SRVNPTFVUSU9OXzZCKSAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgcmVzb2x1dGlvbiBzZXR0aW5nIHdoZW4gbGltaXRlZCB0byA2IG9yIDggYml0cy4KKyAgKiBAcGFyYW0gX19SRVNPTFVUSU9OX18gcHJvZ3JhbW1lZCBBREMgcmVzb2x1dGlvbiB3aGVuIGxpbWl0ZWQgdG8gNiBvciA4IGJpdHMuIAorICAqIEByZXR2YWwgU0VUIChfX1JFU09MVVRJT05fXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19SRVNPTFVUSU9OX18gaXMgaW52YWxpZCkKKyAgKi8gCisjZGVmaW5lIElTX0FEQ19SRVNPTFVUSU9OXzhfNl9CSVRTKF9fUkVTT0xVVElPTl9fKSAoKChfX1JFU09MVVRJT05fXykgPT0gQURDX1JFU09MVVRJT05fOEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVTT0xVVElPTl9fKSA9PSBBRENfUkVTT0xVVElPTl82QikgICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjb252ZXJ0ZWQgZGF0YSBhbGlnbm1lbnQuCisgICogQHBhcmFtIF9fQUxJR05fXyBwcm9ncmFtbWVkIEFEQyBjb252ZXJ0ZWQgZGF0YSBhbGlnbm1lbnQuIAorICAqIEByZXR2YWwgU0VUIChfX0FMSUdOX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fQUxJR05fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfREFUQV9BTElHTihfX0FMSUdOX18pICgoKF9fQUxJR05fXykgPT0gQURDX0RBVEFBTElHTl9SSUdIVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQUxJR05fXykgPT0gQURDX0RBVEFBTElHTl9MRUZUKSAgICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBzY2FuIG1vZGUuCisgICogQHBhcmFtIF9fU0NBTl9NT0RFX18gcHJvZ3JhbW1lZCBBREMgc2NhbiBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NDQU5fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TQ0FOX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfU0NBTl9NT0RFKF9fU0NBTl9NT0RFX18pICgoKF9fU0NBTl9NT0RFX18pID09IEFEQ19TQ0FOX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NDQU5fTU9ERV9fKSA9PSBBRENfU0NBTl9FTkFCTEUpICAgICkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGVkZ2UgdHJpZ2dlciBzZXR0aW5nIGZvciByZWd1bGFyIGdyb3VwLgorICAqIEBwYXJhbSBfX0VER0VfXyBwcm9ncmFtbWVkIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19FREdFX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fRURHRV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19FWFRUUklHX0VER0UoX19FREdFX18pICgoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfTk9ORSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfRkFMTElORykgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHQ09OVkVER0VfUklTSU5HRkFMTElORykgICkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fUkVHVFJJR19fIHByb2dyYW1tZWQgQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIFNFVCAoX19SRUdUUklHX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkVHVFJJR19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19FWFRUUklHKF9fSEFORExFX18sIF9fUkVHVFJJR19fKSAoKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9DQzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDFfQ0MyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX0NDMykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMl9DQzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfRVhUX0lUMTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHX1QxX1RSR08pICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR1RSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR19UMV9UUkdPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdfVDJfVFJHTykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHVFJJR19fKSA9PSBBRENfU09GVFdBUkVfU1RBUlQpICAgICAgICAgICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZWd1bGFyIGNvbnZlcnNpb25zIGNoZWNrIGZvciBjb252ZXJ0ZWQgZGF0YSBhdmFpbGFiaWxpdHkuCisgICogQHBhcmFtIF9fRU9DX1NFTEVDVElPTl9fIGNvbnZlcnRlZCBkYXRhIGF2YWlsYWJpbGl0eSBjaGVjay4KKyAgKiBAcmV0dmFsIFNFVCAoX19FT0NfU0VMRUNUSU9OX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fRU9DX1NFTEVDVElPTl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19FT0NfU0VMRUNUSU9OKF9fRU9DX1NFTEVDVElPTl9fKSAoKChfX0VPQ19TRUxFQ1RJT05fXykgPT0gQURDX0VPQ19TSU5HTEVfQ09OVikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FT0NfU0VMRUNUSU9OX18pID09IEFEQ19FT0NfU0VRX0NPTlYpICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyByZWd1bGFyIGNvbnZlcnNpb25zIG92ZXJydW4gaGFuZGxpbmcuCisgICogQHBhcmFtIF9fT1ZSX18gQURDIHJlZ3VsYXIgY29udmVyc2lvbnMgb3ZlcnJ1biBoYW5kbGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19PVlJfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19PVlJfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfT1ZFUlJVTihfX09WUl9fKSAoKChfX09WUl9fKSA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WUl9fKSA9PSBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4pICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjb252ZXJzaW9ucyBzYW1wbGluZyB0aW1lLgorICAqIEBwYXJhbSBfX1RJTUVfXyBBREMgY29udmVyc2lvbnMgc2FtcGxpbmcgdGltZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19USU1FX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fVElNRV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19TQU1QTEVfVElNRShfX1RJTUVfXykgKCgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzJDWUNMRVNfNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzZDWUNMRVNfNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzEyQ1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzI0Q1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzQ3Q1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzkyQ1lDTEVTXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzI0N0NZQ0xFU181KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IEFEQ19TQU1QTEVUSU1FXzY0MENZQ0xFU181KSAgICkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHJlZ3VsYXIgY2hhbm5lbCBzZXR0aW5nLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gcHJvZ3JhbW1lZCBBREMgcmVndWxhciBjaGFubmVsLgorICAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19SRUdVTEFSX1JBTksoX19DSEFOTkVMX18pICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzEgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzIgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzMgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzQgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzUgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzYgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzcgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzggKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzkgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzEwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzEzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfUkVHVUxBUl9SQU5LXzE2KSAgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ19Qcml2YXRlX0NvbnN0YW50cyBBREMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBGaXhlZCB0aW1lb3V0IHZhbHVlcyBmb3IgQURDIGNvbnZlcnNpb24gKGluY2x1ZGluZyBzYW1wbGluZyB0aW1lKSAgICAgICAgKi8KKy8qIE1heGltdW0gc2FtcGxpbmcgdGltZSBpcyA2NDAuNSBBREMgY2xvY2sgY3ljbGUgKFNNUHhbMjowXSA9IDBiMTExICAgICAgICAqLworLyogTWF4aW11bSBjb252ZXJzaW9uIHRpbWUgaXMgMTIuNSArIE1heGltdW0gc2FtcGxpbmcgdGltZSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgb3IgMTIuNSAgKyA2NDAuNSA9IDY1MyBBREMgY2xvY2sgY3ljbGVzICAgICAgICAgICAgKi8KKy8qIE1pbmltdW0gQURDIENsb2NrIGZyZXF1ZW5jeSBpcyAwLjE0IE1IeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWF4aW11bSBjb252ZXJzaW9uIHRpbWUgaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgNjUzIC8gMC4xNCBNSHogPSA0LjY2IG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1NUT1BfQ09OVkVSU0lPTl9USU1FT1VUICAgICAoIDVVTCkgICAgIC8qITwgQURDIHN0b3AgdGltZS1vdXQgdmFsdWUgKi8gCisKKy8qIERlbGF5IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWF4aW11bSBkZWxheSBpcyAxMjB1cyAocmVmZXIgZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyIHRTVEFSVCkuICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1RFTVBTRU5TT1JfREVMQVlfVVMgICAgICAgICAoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUykKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfTWFjcm9zIEFEQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworLyogTWFjcm8gZm9yIGludGVybmFsIEhBTCBkcml2ZXIgdXNhZ2UsIGFuZCBwb3NzaWJseSBjYW4gYmUgdXNlZCBpbnRvIGNvZGUgb2YgKi8KKy8qIGZpbmFsIHVzZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0hBTF9FTV9IQU5ETEVfSVRfRkxBRyBIQUwgQURDIG1hY3JvIHRvIG1hbmFnZSBIQUwgQURDIGhhbmRsZSwgSVQgYW5kIGZsYWdzLgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IEFEQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQURDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEFEQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfUkRZICAgIEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPU01QICBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9DICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX09WUiAgICBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pFT0MgICBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9TICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDEgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDIgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDMgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pRT1ZGICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlLiAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIEFEQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEFEQyBJbnRlcnJ1cHQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfUkRZICAgIEFEQyBSZWFkeSBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPU01QICBBREMgRW5kIG9mIFNhbXBsaW5nIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9DICAgIEFEQyBFbmQgb2YgUmVndWxhciBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfRU9TICAgIEFEQyBFbmQgb2YgUmVndWxhciBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX09WUiAgICBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pFT0MgICBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9TICAgQURDIEVuZCBvZiBJbmplY3RlZCBzZXF1ZW5jZSBvZiBDb252ZXJzaW9ucyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDEgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgaW50ZXJydXB0IHNvdXJjZSAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDIgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0FXRDMgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgaW50ZXJydXB0IHNvdXJjZSAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0pRT1ZGICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBpbnRlcnJ1cHQgc291cmNlLiAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSKSAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBBREMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjaworICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX1JEWSAgICBBREMgUmVhZHkgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9FT1NNUCAgQURDIEVuZCBvZiBTYW1wbGluZyBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPQyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBpbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lUX0VPUyAgICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9PVlIgICAgQURDIG92ZXJydW4gaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KRU9DICAgQURDIEVuZCBvZiBJbmplY3RlZCBDb252ZXJzaW9uIGludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSVRfSkVPUyAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgaW50ZXJydXB0IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QxICAgQURDIEFuYWxvZyB3YXRjaGRvZyAxIGludGVycnVwdCBzb3VyY2UgKG1haW4gYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QyICAgQURDIEFuYWxvZyB3YXRjaGRvZyAyIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9BV0QzICAgQURDIEFuYWxvZyB3YXRjaGRvZyAzIGludGVycnVwdCBzb3VyY2UgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19JVF9KUU9WRiAgQURDIEluamVjdGVkIENvbnRleHQgUXVldWUgT3ZlcmZsb3cgaW50ZXJydXB0IHNvdXJjZS4gIAorICAqIEByZXR2YWwgU3RhdGUgb2YgaW50ZXJydXB0aW9uIChTRVQgb3IgUkVTRVQpCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorICAgIAorLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19GTEFHX18gQURDIGZsYWcKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19SRFkgICAgIEFEQyBSZWFkeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfRU9TTVAgICBBREMgRW5kIG9mIFNhbXBsaW5nIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfRU9DICAgICBBREMgRW5kIG9mIFJlZ3VsYXIgQ29udmVyc2lvbiBmbGFnICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfRU9TICAgICBBREMgRW5kIG9mIFJlZ3VsYXIgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZyAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfT1ZSICAgICBBREMgb3ZlcnJ1biBmbGFnICAgICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19KRU9DICAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgQ29udmVyc2lvbiBmbGFnICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19KRU9TICAgIEFEQyBFbmQgb2YgSW5qZWN0ZWQgc2VxdWVuY2Ugb2YgQ29udmVyc2lvbnMgZmxhZyAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19BV0QxICAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBmbGFnIChtYWluIGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19BV0QyICAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMiBmbGFnIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19BV0QzICAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMyBmbGFnIChhZGRpdGlvbmFsIGFuYWxvZyB3YXRjaGRvZykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRkxBR19KUU9WRiAgIEFEQyBJbmplY3RlZCBDb250ZXh0IFF1ZXVlIE92ZXJmbG93IGZsYWcuICAgICAgICAgICAgCisgICogQHJldHZhbCBTdGF0ZSBvZiBmbGFnIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIHNwZWNpZmllZCBBREMgZmxhZy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIEFEQyBmbGFnCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfUkRZICAgICBBREMgUmVhZHkgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPU01QICAgQURDIEVuZCBvZiBTYW1wbGluZyBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPQyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIENvbnZlcnNpb24gZmxhZyAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX0VPUyAgICAgQURDIEVuZCBvZiBSZWd1bGFyIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19GTEFHX09WUiAgICAgQURDIG92ZXJydW4gZmxhZyAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSkVPQyAgICBBREMgRW5kIG9mIEluamVjdGVkIENvbnZlcnNpb24gZmxhZyAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSkVPUyAgICBBREMgRW5kIG9mIEluamVjdGVkIHNlcXVlbmNlIG9mIENvbnZlcnNpb25zIGZsYWcgICAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMSAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAobWFpbiBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMiAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfQVdEMyAgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZmxhZyAoYWRkaXRpb25hbCBhbmFsb2cgd2F0Y2hkb2cpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0ZMQUdfSlFPVkYgICBBREMgSW5qZWN0ZWQgQ29udGV4dCBRdWV1ZSBPdmVyZmxvdyBmbGFnLiAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworLyogTm90ZTogYml0IGNsZWFyZWQgYml0IGJ5IHdyaXRpbmcgMSAod3JpdGluZyAwIGhhcyBubyBlZmZlY3Qgb24gYW55IGJpdCBvZiByZWdpc3RlciBJU1IpICovCisjZGVmaW5lIF9fSEFMX0FEQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRU1fSEVMUEVSX01BQ1JPIEhBTCBBREMgaGVscGVyIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICAqICAgICAgICAgZnJvbSBsaXRlcmFscyBBRENfQ0hBTk5FTF94LgorICAqIEBub3RlICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19IQUxfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihBRENfQ0hBTk5FTF80KQorICAqICAgICAgICAgICB3aWxsIHJldHVybiBkZWNpbWFsIG51bWJlciAiNCIuCisgICogQG5vdGUgICBUaGUgaW5wdXQgY2FuIGJlIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaXMgcmV0dXJuZWQsIGVpdGhlciBkZWZpbmVkIHdpdGggbnVtYmVyCisgICogICAgICAgICBvciB3aXRoIGJpdGZpZWxkIChvbmx5IG9uZSBiaXQgbXVzdCBiZSBzZXQpLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0xOAorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigoX19DSEFOTkVMX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgQURDIGNoYW5uZWwgaW4gbGl0ZXJhbCBmb3JtYXQgQURDX0NIQU5ORUxfeAorICAqICAgICAgICAgZnJvbSBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQuCisgICogQG5vdGUgICBFeGFtcGxlOgorICAqICAgICAgICAgICBfX0hBTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKDQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGEgZGF0YSBlcXVpdmFsZW50IHRvICJBRENfQ0hBTk5FTF80Ii4KKyAgKiBAcGFyYW0gIF9fREVDSU1BTF9OQl9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS5cbgorICAqICAgICAgICAgKDQpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoX19ERUNJTUFMX05CX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKChfX0RFQ0lNQUxfTkJfXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzZWxlY3RlZCBjaGFubmVsCisgICogICAgICAgICBjb3JyZXNwb25kcyB0byBsaXRlcmFsIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAbm90ZSAgIFRoZSBkaWZmZXJlbnQgbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBBREMgY2hhbm5lbHMgYXJlOgorICAqICAgICAgICAgLSBBREMgaW50ZXJuYWwgY2hhbm5lbDoKKyAgKiAgICAgICAgICAgQURDX0NIQU5ORUxfVlJFRklOVCwgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uCisgICogICAgICAgICAtIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKToKKyAgKiAgICAgICAgICAgQURDX0NIQU5ORUxfMSwgQURDX0NIQU5ORUxfMiwgLi4uCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBsaXRlcmFsCisgICogICAgICAgICBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMX1ZSRUZJTlQsCisgICogICAgICAgICBBRENfQ0hBTk5FTF9URU1QU0VOU09SLCAuLi4pLAorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGZyb20gZnVuY3Rpb25zIHdoZXJlIGEgY2hhbm5lbCBudW1iZXIgaXMKKyAgKiAgICAgICAgIHJldHVybmVkIGZyb20gQURDIHJlZ2lzdGVycywKKyAgKiAgICAgICAgIGJlY2F1c2UgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpbiBBREMgcmVnaXN0ZXJzLiBUaGUgZGlmZmVyZW50aWF0aW9uIGlzIG1hZGUgb25seSB3aXRoCisgICogICAgICAgICBwYXJhbWV0ZXJzIGRlZmluaXRpb25zIG9mIGRyaXZlci4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS4KKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIGEgR1BJTyBwaW4pLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBjaGFubmVsIGNvcnJlc3BvbmRzIHRvIGEgcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMKChfX0NIQU5ORUxfXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSBjaGFubmVsIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICB0byBpdHMgZXF1aXZhbGVudCBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoQURDX0NIQU5ORUxfMSwgQURDX0NIQU5ORUxfMiwgLi4uKS4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBjYW4gYmUsIGFkZGl0aW9uYWxseSB0byBhIHZhbHVlCisgICogICAgICAgICBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgKEFEQ19DSEFOTkVMX1ZSRUZJTlQsIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcyByZXR1cm5lZAorICAqICAgICAgICAgZnJvbSBBREMgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMXzE4CisgICovCisjZGVmaW5lIF9fSEFMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKF9fQ0hBTk5FTF9fKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgoX19DSEFOTkVMX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKEFEQ19DSEFOTkVMXzEsIEFEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfQ0hBTk5FTF9WQkFUCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqLworI2RlZmluZSBfX0hBTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTF9BVkFJTEFCTEUoX19BRENfSU5TVEFOQ0VfXywgX19DSEFOTkVMX18pICBcCisgICAgICAgICBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRSgoX19BRENfSU5TVEFOQ0VfXyksIChfX0NIQU5ORUxfXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgdG8gd2hpY2ggaXMgYmVsb25naW5nIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBBREMgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvcjoKKyAgKiAgICAgICAgIC0gU2V0IHBhcmFtZXRlcnMgY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqICAgICAgICAgLSBNdWx0aW1vZGUgKGZvciBkZXZpY2VzIHdpdGggc2V2ZXJhbCBBREMgaW5zdGFuY2VzKQorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb25zIGhhdmluZyBhcmd1bWVudCAiQURDeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBfX0FEQ3hfXyBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKF9fQURDeF9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQorICAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQorICAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAgKiBAcGFyYW0gIF9fQURDWFlfQ09NTU9OX18gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiBhdCBsZWFzdCBvbmUgQURDIGluc3RhbmNlIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgaXMgZW5hYmxlZC4KKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKChfX0FEQ1hZX0NPTU1PTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbAorICAqICAgICAgICAgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uCisgICogQG5vdGUgICBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgY29ycmVzcG9uZHMgdG8gdm9sdGFnZSByYW5nZQorICAqICAgICAgICAgZGV0ZXJtaW5lZCBieSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2VzIFZyZWYrIGFuZCBWcmVmLQorICAqICAgICAgICAgKHJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQURDIGNvbnZlcnNpb24gZGF0YSBmdWxsLXNjYWxlIGRpZ2l0YWwgdmFsdWUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0RJR0lUQUxfU0NBTEUoX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfRElHSVRBTF9TQ0FMRSgoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBmcm9tCisgICogICAgICAgICBhIHJlc29sdXRpb24gdG8gYW5vdGhlciByZXNvbHV0aW9uLgorICAqIEBwYXJhbSAgX19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQgCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyBSZXNvbHV0aW9uIG9mIHRvIHRoZSBkYXRhIHRvIGJlIGNvbnZlcnRlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fIFJlc29sdXRpb24gb2YgdGhlIGRhdGEgYWZ0ZXIgY29udmVyc2lvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb2x1dGlvbgorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ09OVkVSVF9EQVRBX1JFU09MVVRJT04oX19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9UQVJHRVRfXykgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTigoX19EQVRBX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQorICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfREFUQV9UT19WT0xUQUdFKF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX0RBVEFfVE9fVk9MVEFHRSgoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fQURDX1JFU09MVVRJT05fXykpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSBhbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKQorICAqICAgICAgICAgKHVuaXQ6IG1Wb2x0KSBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZQorICAqICAgICAgICAgcmVmZXJlbmNlIFZyZWZJbnQuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyBWcmVmSW50IGNhbGlicmF0aW9uIHZhbHVlCisgICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgICogQG5vdGUgICBUaGlzIHZvbHRhZ2UgZGVwZW5kcyBvbiB1c2VyIGJvYXJkIGVudmlyb25tZW50OiB2b2x0YWdlIGxldmVsCisgICogICAgICAgICBjb25uZWN0ZWQgdG8gcGluIFZyZWYrLgorICAqICAgICAgICAgT24gZGV2aWNlcyB3aXRoIHNtYWxsIHBhY2thZ2UsIHRoZSBwaW4gVnJlZisgaXMgbm90IHByZXNlbnQKKyAgKiAgICAgICAgIGFuZCBpbnRlcm5hbGx5IGJvbmRlZCB0byBwaW4gVmRkYS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNhbGlicmF0aW9uIGRhdGEgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UKKyAgKiAgICAgICAgIFZyZWZJbnQgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAgKiAgICAgICAgIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQuCisgICogICAgICAgICBPdGhlcndpc2UsIHRoaXMgbWFjcm8gcGVyZm9ybXMgdGhlIHByb2Nlc3NpbmcgdG8gc2NhbGUKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVlJFRklOVF9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgKHJlc29sdXRpb24gMTIgYml0cykKKyAgKiAgICAgICAgIG9mIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBwYXJhbSAgX19BRENfUkVTT0xVVElPTl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKF9fVlJFRklOVF9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgoX19WUkVGSU5UX0FEQ19EQVRBX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzCisgICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICAqICAgICAgICAgICBUZW1wZXJhdHVyZSA9ICgoVFNfQURDX0RBVEEgLSBUU19DQUwxKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyIC0gVFNfQ0FMMSkgKyBUU19DQUwxX1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieSBBREMKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgPSAoVFNfQ0FMMiAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDEgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMSAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDIgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMiAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhhdCBjYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgY29ycmVjdCAoYWRkcmVzcyBhbmQgZGF0YSkuCisgICogICAgICAgICAgICAgICAgICBUbyBjYWxjdWxhdGUgdGVtcGVyYXR1cmUgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMgKGdlbmVyaWMgdmFsdWVzIGxlc3MsIHRoZXJlZm9yZQorICAqICAgICAgICAgICAgICAgICAgbGVzcyBhY2N1cmF0ZSB0aGFuIGNhbGlicmF0ZWQgdmFsdWVzKSwKKyAgKiAgICAgICAgICAgICAgICAgIHVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKi8KKyNkZWZpbmUgX19IQUxfQURDX0NBTENfVEVNUEVSQVRVUkUoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSAodW5pdDogZGVncmVlIENlbHNpdXMpCisgICogICAgICAgICBmcm9tIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLgorICAqIEBub3RlICAgQ29tcHV0YXRpb24gaXMgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yIHR5cGljYWwgdmFsdWVzCisgICogICAgICAgICAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCkuCisgICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICAqICAgICAgICAgICBUZW1wZXJhdHVyZSA9IChUU19UWVBfQ0FMeF9WT0xUKHVWKSAtIFRTX0FEQ19EQVRBICogQ29udmVyc2lvbl91VikKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIEF2Z19TbG9wZSArIENBTHhfVEVNUAorICAqICAgICAgICAgICB3aXRoIFRTX0FEQ19EQVRBICAgICAgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmF3IGRhdGEgbWVhc3VyZWQgYnkgQURDCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKQorICAqICAgICAgICAgICAgICAgIEF2Z19TbG9wZSAgICAgICAgPSB0ZW1wZXJhdHVyZSBzZW5zb3Igc2xvcGUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IHVWL0RlZ3JlZSBDZWxzaXVzKQorICAqICAgICAgICAgICAgICAgIFRTX1RZUF9DQUx4X1ZPTFQgPSB0ZW1wZXJhdHVyZSBzZW5zb3IgZGlnaXRhbCB2YWx1ZSBhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBDQUx4X1RFTVAgKHVuaXQ6IG1WKQorICAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZGV2aWNlIGhhcyBjaGFyYWN0ZXJpc3RpY3MgaW4gbGluZSB3aXRoCisgICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMuCisgICogICAgICAgICAgICAgICAgICBJZiB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgb24KKyAgKiAgICAgICAgICAgICAgICAgIG9uIHRoaXMgZGV2aWNlIChwcmVzZW5jZSBvZiBtYWNybyBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkpLAorICAqICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24gd2lsbCBiZSBtb3JlIGFjY3VyYXRlIHVzaW5nCisgICogICAgICAgICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFKCkuCisgICogQG5vdGUgICBBcyBjYWxjdWxhdGlvbiBpbnB1dCwgdGhlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUKKyAgKiAgICAgICAgIGRlZmluZWQgYXMgaXQgaW1wYWN0cyB0aGUgQURDIExTQiBlcXVpdmFsZW50IHZvbHRhZ2UuCisgICogQG5vdGUgICBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKFZyZWYrKSBtdXN0IGJlIGVpdGhlciBrbm93biBmcm9tCisgICogICAgICAgICB1c2VyIGJvYXJkIGVudmlyb25tZW50IG9yIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIEFEQyBtZWFzdXJlbWVudAorICAqICAgICAgICAgYW5kIEFEQyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRSgpLgorICAqIEBub3RlICAgQURDIG1lYXN1cmVtZW50IGRhdGEgbXVzdCBjb3JyZXNwb25kIHRvIGEgcmVzb2x1dGlvbiBvZiAxMmJpdHMKKyAgKiAgICAgICAgIChmdWxsIHNjYWxlIGRpZ2l0YWwgdmFsdWUgNDA5NSkuIElmIG5vdCB0aGUgY2FzZSwgdGhlIGRhdGEgbXVzdCBiZQorICAqICAgICAgICAgcHJlbGltaW5hcmlseSByZXNjYWxlZCB0byBhbiBlcXVpdmFsZW50IHJlc29sdXRpb24gb2YgMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlIHR5cGljYWwgdmFsdWUgKHVuaXQ6IHVWL0RlZ0NlbHNpdXMpLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gU1RNMzJXQiwgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIkF2Z19TbG9wZSIuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIHR5cGljYWwgdmFsdWUgKGF0IHRlbXBlcmF0dXJlIGFuZCBWcmVmKyBkZWZpbmVkIGluIHBhcmFtZXRlcnMgYmVsb3cpICh1bml0OiBtVikuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMldCLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiVjMwIiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwxKS4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgKHNlZSBwYXJhbWV0ZXIgYWJvdmUpIGlzIGNvcnJlc3BvbmRpbmcgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBBRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0hBTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgXAorICAgICAgICAgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRV9UWVBfUEFSQU1TKChfX1RFTVBTRU5TT1JfVFlQX0FWR1NMT1BFX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19URU1QU0VOU09SX1RZUF9DQUxYX1ZfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQ0FMWF9URU1QX18pLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEFEQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9hZGNfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ19Jbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfTXNwSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDX01zcERlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCBIQUxfQURDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBBRENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0YXJ0X0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKy8qIE5vbi1ibG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX1N0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3IgaW50ZXJydXB0aW9uICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uIGFuZCBETUEpICovCit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDX0lSUUhhbmRsZXIoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYqIHNDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ19BbmFsb2dXREdDb25maWcoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19BbmFsb2dXREdDb25mVHlwZURlZiogQW5hbG9nV0RHQ29uZmlnKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNAorICAqIEB7CisgICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDX0dldFN0YXRlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgIEhBTF9BRENfR2V0RXJyb3IoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX1ByaXZhdGVfRnVuY3Rpb25zIEFEQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBBRENfQ29udmVyc2lvblN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IENvbnZlcnNpb25Hcm91cCk7CitIQUxfU3RhdHVzVHlwZURlZiBBRENfRW5hYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK3ZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgQURDX0RNQUhhbGZDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIEFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfQURDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2FkY19leC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfYWRjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYzQzNwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2FkY19leC5oCkBAIC0wLDAgKzEsNzY0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9hZGNfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQURDIEhBTCBleHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9BRENfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0FEQ19FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEFEQ0V4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfVHlwZXMgQURDIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBBREMgSW5qZWN0ZWQgQ29udmVyc2lvbiBPdmVyc2FtcGxpbmcgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFJhdGlvOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIG92ZXJzYW1wbGluZyByYXRpby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09WU19SQVRJTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdWludDMyX3QgUmlnaHRCaXRTaGlmdDsgICAgICAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgZGl2aXNpb24gY29lZmZpY2llbnQgZm9yIHRoZSBPdmVyc2FtcGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09WU19TSElGVCAqLworfUFEQ19JbmpPdmVyc2FtcGxpbmdUeXBlRGVmOyAgCisKKy8qKiAKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIEFEQyBncm91cCBpbmplY3RlZCBhbmQgQURDIGNoYW5uZWwgYWZmZWN0ZWQgdG8gQURDIGdyb3VwIGluamVjdGVkCisgICogQG5vdGUgICBQYXJhbWV0ZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBzaGFyZWQgd2l0aGluIDIgc2NvcGVzOgorICAqICAgICAgICAgIC0gU2NvcGUgY2hhbm5lbDogSW5qZWN0ZWRDaGFubmVsLCBJbmplY3RlZFJhbmssIEluamVjdGVkU2FtcGxpbmdUaW1lICwgSW5qZWN0ZWRTaW5nbGVEaWZmLCBJbmplY3RlZE9mZnNldE51bWJlciwgSW5qZWN0ZWRPZmZzZXQKKyAgKiAgICAgICAgICAtIFNjb3BlIEFEQyBncm91cCBpbmplY3RlZCAoYWZmZWN0cyBhbGwgY2hhbm5lbHMgb2YgaW5qZWN0ZWQgZ3JvdXApOiBJbmplY3RlZE5ick9mQ29udmVyc2lvbiwgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUsCisgICogICAgICAgICAgICBBdXRvSW5qZWN0ZWRDb252LCBRdWV1ZUluamVjdGVkQ29udGV4dCwgRXh0ZXJuYWxUcmlnSW5qZWNDb252LCBFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlLCBJbmplY092ZXJzYW1wbGluZ01vZGUsIEluamVjT3ZlcnNhbXBsaW5nLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqICAgICAgICAgQURDIHN0YXRlIGNhbiBiZSBlaXRoZXI6CisgICogICAgICAgICAgLSBGb3IgYWxsIHBhcmFtZXRlcnM6IEFEQyBkaXNhYmxlZCAodGhpcyBpcyB0aGUgb25seSBwb3NzaWJsZSBBREMgc3RhdGUgdG8gbW9kaWZ5IHBhcmFtZXRlciAnSW5qZWN0ZWRTaW5nbGVEaWZmJykKKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZScsICdRdWV1ZUluamVjdGVkQ29udGV4dCcsICdJbmplY092ZXJzYW1wbGluZyc6IEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZyBvbiBpbmplY3RlZCBncm91cC4KKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZFNhbXBsaW5nVGltZScsICdJbmplY3RlZE9mZnNldCcsICdJbmplY3RlZE9mZnNldE51bWJlcicsICdBdXRvSW5qZWN0ZWRDb252JzogQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3Vwcy4KKyAgKiAgICAgICAgICAtIEZvciBwYXJhbWV0ZXJzICdJbmplY3RlZENoYW5uZWwnLCAnSW5qZWN0ZWRSYW5rJywgJ0luamVjdGVkTmJyT2ZDb252ZXJzaW9uJywgJ0V4dGVybmFsVHJpZ0luamVjQ29udicsICdFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlJzogQURDIGVuYWJsZWQgYW5kIHdoaWxlIGNvbnZlcnNpb24gb24gZ29pbmcgCisgICogICAgICAgICAgICBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkLgorICAqICAgICAgICAgSWYgQURDIGlzIG5vdCBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgdG8gbW9kaWZ5IHNvbWUgcGFyYW1ldGVycywgdGhlc2UgcGFyYW1ldGVycyBzZXR0aW5nIGlzIGJ5cGFzc2VkCisgICogICAgICAgICB3aXRob3V0IGVycm9yIHJlcG9ydGluZyAoYXMgaXQgY2FuIGJlIHRoZSBleHBlY3RlZCBiZWhhdmlvciBpbiBjYXNlIG9mIGludGVuZGVkIGFjdGlvbiB0byB1cGRhdGUgYW5vdGhlciBwYXJhbWV0ZXIgKHdoaWNoIGZ1bGZpbGxzIHRoZSBBREMgc3RhdGUgY29uZGl0aW9uKSBvbiB0aGUgZmx5KS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEluamVjdGVkQ2hhbm5lbDsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2hhbm5lbCB0byBjb25maWd1cmUgaW50byBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IERlcGVuZGluZyBvbiBkZXZpY2VzIGFuZCBBREMgaW5zdGFuY2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGRldmljZSBwYWNrYWdlIHBpbnMuIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIGNoYW5uZWxzIGF2YWlsYWJpbGl0eS4gKi8KKworICB1aW50MzJfdCBJbmplY3RlZFJhbms7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJhbmsgaW4gdGhlIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19JTkpfU0VRX1JBTktTLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0byBkaXNhYmxlIGEgY2hhbm5lbCBvciBjaGFuZ2Ugb3JkZXIgb2YgY29udmVyc2lvbiBzZXF1ZW5jZXIsIHJhbmsgY29udGFpbmluZyBhIHByZXZpb3VzIGNoYW5uZWwgc2V0dGluZyBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgY2hhbm5lbCBzZXR0aW5nIChvciBwYXJhbWV0ZXIgbnVtYmVyIG9mIGNvbnZlcnNpb25zIGFkanVzdGVkKSAqLworCisgIHVpbnQzMl90IEluamVjdGVkU2FtcGxpbmdUaW1lOyAgICAgICAgICAvKiE8IFNhbXBsaW5nIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEyLjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLCAxMC41IGN5Y2xlcyBhdCAxMCBiaXRzLCA4LjUgY3ljbGVzIGF0IDggYml0cywgNi41IGN5Y2xlcyBhdCA2IGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19IQUxfRUNfQ0hBTk5FTF9TQU1QTElOR1RJTUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBjaGFubmVsIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSByZWd1bGFyIGFuZC9vciBpbmplY3RlZCBncm91cC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgb3ZlcndyaXRlcyB0aGUgbGFzdCBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzIChWcmVmSW50L1ZiYXQvVGVtcFNlbnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlIGFkanVzdGVkIGluIGZ1bmN0aW9uIG9mIEFEQyBjbG9jayBmcmVxdWVuY3kgYW5kIHNhbXBsaW5nIHRpbWUgc2V0dGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgdGltaW5ncyB2YWx1ZXMuICovCisKKyAgdWludDMyX3QgSW5qZWN0ZWRTaW5nbGVEaWZmOyAgICAgICAgICAgIC8qITwgU2VsZWN0aW9uIG9mIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGRpZmZlcmVudGlhbCBtb2RlOiBEaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQgaXMgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbCAnaScgKHBvc2l0aXZlIGlucHV0KSBhbmQgY2hhbm5lbCAnaSsxJyAobmVnYXRpdmUgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGNoYW5uZWwgJ2knIGhhcyB0byBiZSBjb25maWd1cmVkLCBjaGFubmVsICdpKzEnIGlzIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0hBTF9FQ19DSEFOTkVMX1NJTkdMRV9ESUZGX0VORElORy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogVGhpcyBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIGNoYW5uZWwgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJlZ3VsYXIgYW5kL29yIGluamVjdGVkIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBvdmVyd3JpdGVzIHRoZSBsYXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLCB0aGUgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMgc3RvcCBjb252ZXJzaW9uKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQURDIGlzIGVuYWJsZWQsIHRoaXMgcGFyYW1ldGVyIHNldHRpbmcgaXMgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmcgKGFzIGl0IGNhbiBiZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2FzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYW5vdGhlciBwYXJhbWV0ZXIgdXBkYXRlIG9uIHRoZSBmbHkpICovCisKKyAgdWludDMyX3QgSW5qZWN0ZWRPZmZzZXROdW1iZXI7ICAgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgb2Zmc2V0IG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfSEFMX0VDX09GRlNFVF9OQi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogT25seSBvbmUgb2Zmc2V0IGlzIGFsbG93ZWQgcGVyIGNoYW5uZWwuIFRoaXMgcGFyYW1ldGVyIG92ZXJ3cml0ZXMgdGhlIGxhc3Qgc2V0dGluZy4gKi8KKworICB1aW50MzJfdCBJbmplY3RlZE9mZnNldDsgICAgICAgICAgICAgICAgLyohPCBEZWZpbmVzIHRoZSBvZmZzZXQgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcgY29udmVydGVkIGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb2YgQURDIHJlc29sdXRpb24gc2VsZWN0ZWQgKDEyLCAxMCwgOCBvciA2IGJpdHMpLCB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRiwgIDB4M0ZGLCAweEZGIG9yIDB4M0YgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG1vZGlmaWVkIHdoZW4gbm8gY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiBib3RoIHJlZ3VsYXIgYW5kIGluamVjdGVkIGdyb3VwcyAoQURDIGRpc2FibGVkLCBvciBBREMgZW5hYmxlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBjb250aW51b3VzIG1vZGUgb3IgZXh0ZXJuYWwgdHJpZ2dlciB0aGF0IGNvdWxkIGxhdW5jaCBhIGNvbnZlcnNpb24pLiAqLworCisgIHVpbnQzMl90IEluamVjdGVkTmJyT2ZDb252ZXJzaW9uOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJhbmtzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgd2l0aGluIHRoZSBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgdGhlIGluamVjdGVkIGdyb3VwIHNlcXVlbmNlciBhbmQgY29udmVydCBzZXZlcmFsIHJhbmtzLCBwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScgbXVzdCBiZSBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBpbXBhY3RzIHRoZSBlbnRpcmUgaW5qZWN0ZWQgZ3JvdXAuIFRoZXJlZm9yZSwgY2FsbCBvZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBhIGNoYW5uZWwgb24gaW5qZWN0ZWQgZ3JvdXAgY2FuIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscyBwcmV2aW91c2x5IHNldC4gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGU7IC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb25zIHNlcXVlbmNlIG9mIEFEQyBncm91cCBpbmplY3RlZCBpcyBwZXJmb3JtZWQgaW4gQ29tcGxldGUtc2VxdWVuY2UvRGlzY29udGludW91cy1zZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFpbiBzZXF1ZW5jZSBzdWJkaXZpZGVkIGluIHN1Y2Nlc3NpdmUgcGFydHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb250aW51b3VzIG1vZGUgaXMgdXNlZCBvbmx5IGlmIHNlcXVlbmNlciBpcyBlbmFibGVkIChwYXJhbWV0ZXIgJ1NjYW5Db252TW9kZScpLiBJZiBzZXF1ZW5jZXIgaXMgZGlzYWJsZWQsIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NhcmRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29udGludW91cyBtb2RlIGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgY29udGludW91cyBtb2RlIGlzIGRpc2FibGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBtb2RpZmllZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCAoYmVmb3JlIEFEQyBzdGFydCBjb252ZXJzaW9uIG9yIGFmdGVyIEFEQyBzdG9wIGNvbnZlcnNpb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBGb3IgaW5qZWN0ZWQgZ3JvdXAsIGRpc2NvbnRpbnVvdXMgbW9kZSBjb252ZXJ0cyB0aGUgc2VxdWVuY2UgY2hhbm5lbCBieSBjaGFubmVsIChkaXNjb250aW51b3VzIGxlbmd0aCBmaXhlZCB0byAxIHJhbmspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEF1dG9JbmplY3RlZENvbnY7ICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VsZWN0ZWQgQURDIGdyb3VwIGluamVjdGVkIGF1dG9tYXRpYyBjb252ZXJzaW9uIGFmdGVyIHJlZ3VsYXIgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHVzZSBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiwgZGlzY29udGludW91cyBtb2RlIG11c3QgYmUgZGlzYWJsZWQgKCdEaXNjb250aW51b3VzQ29udk1vZGUnIGFuZCAnSW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUnIHNldCB0byBESVNBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUbyB1c2UgQXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24sIGluamVjdGVkIGdyb3VwIGV4dGVybmFsIHRyaWdnZXJzIG11c3QgYmUgZGlzYWJsZWQgKCdFeHRlcm5hbFRyaWdJbmplY0NvbnYnIHNldCB0byBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEluIGNhc2Ugb2YgRE1BIHVzZWQgd2l0aCByZWd1bGFyIGdyb3VwOiBpZiBETUEgY29uZmlndXJlZCBpbiBub3JtYWwgbW9kZSAoc2luZ2xlIHNob3QpIEpBVVRPIHdpbGwgYmUgc3RvcHBlZCB1cG9uIERNQSB0cmFuc2ZlciBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gbWFpbnRhaW4gSkFVVE8gYWx3YXlzIGVuYWJsZWQsIERNQSBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F1dGlvbjogdGhpcyBzZXR0aW5nIGltcGFjdHMgdGhlIGVudGlyZSBpbmplY3RlZCBncm91cC4gVGhlcmVmb3JlLCBjYWxsIG9mIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIFF1ZXVlSW5qZWN0ZWRDb250ZXh0OyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRleHQgcXVldWUgZmVhdHVyZSBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQsIGluamVjdGVkIHNlcXVlbmNlciZjaGFubmVscyBjb25maWd1cmF0aW9ucyBhcmUgcXVldWVkIG9uIHVwIHRvIDIgY29udGV4dHMuIElmIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGluamVjdGVkIGNvbnRleHQgaXMgc2V0IHdoZW4gcXVldWUgaXMgZnVsbCwgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IGludGVycnVwdGlvbiBhbmQgdGhyb3VnaCBmdW5jdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjaycuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IFRoaXMgZmVhdHVyZSByZXF1ZXN0IHRoYXQgdGhlIHNlcXVlbmNlIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYmVmb3JlIGluamVjdGVkIGNvbnZlcnNpb24gc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgY29uZmlndXJlIGNoYW5uZWxzIHdpdGggYXMgbWFueSBjYWxscyB0byBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgYXMgdGhlICdJbmplY3RlZE5ick9mQ29udmVyc2lvbicgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgbW9kaWZpZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgKGJlZm9yZSBBREMgc3RhcnQgY29udmVyc2lvbiBvciBhZnRlciBBREMgc3RvcCBjb252ZXJzaW9uKS4gKi8KKworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdJbmplY0NvbnY7ICAgICAgICAgLyohPCBTZWxlY3RzIHRoZSBleHRlcm5hbCBldmVudCB1c2VkIHRvIHRyaWdnZXIgdGhlIGNvbnZlcnNpb24gc3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQsIGV4dGVybmFsIHRyaWdnZXJzIGFyZSBkaXNhYmxlZCBhbmQgc29mdHdhcmUgdHJpZ2dlciBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2luamVjdGVkX2V4dGVybmFsX3RyaWdnZXJfc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSBhIGNoYW5uZWwgb24gaW5qZWN0ZWQgZ3JvdXAgY2FuIGltcGFjdCB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlciBjaGFubmVscyBwcmV2aW91c2x5IHNldC4gKi8KKworICB1aW50MzJfdCBFeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlOyAgICAgLyohPCBTZWxlY3RzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGVkZ2Ugb2YgaW5qZWN0ZWQgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX2luamVjdGVkX2V4dGVybmFsX3RyaWdnZXJfZWRnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCwgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXV0aW9uOiB0aGlzIHNldHRpbmcgaW1wYWN0cyB0aGUgZW50aXJlIGluamVjdGVkIGdyb3VwLiBUaGVyZWZvcmUsIGNhbGwgb2YgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgYSBjaGFubmVsIG9uIGluamVjdGVkIGdyb3VwIGNhbiBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygb3RoZXIgY2hhbm5lbHMgcHJldmlvdXNseSBzZXQuICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIEluamVjT3ZlcnNhbXBsaW5nTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBvdmVyc2FtcGxpbmcgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBFTkFCTEUgb3IgRElTQUJMRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gaXMgb25nb2luZyAoYm90aCBBRFNUQVJUIGFuZCBKQURTVEFSVCBjbGVhcmVkKS4gKi8KKworICBBRENfSW5qT3ZlcnNhbXBsaW5nVHlwZURlZiAgSW5qZWNPdmVyc2FtcGxpbmc7IC8qITwgU3BlY2lmaWVzIHRoZSBPdmVyc2FtcGxpbmcgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXRpb246IHRoaXMgc2V0dGluZyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBvdmVyc2FtcGxpbmcgY29uZmlndXJhdGlvbiBpZiBvdmVyc2FtcGxpbmcgYWxyZWFkeSBlbmFibGVkLiAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBtb2RpZmllZCBvbmx5IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnNpb24gaXMgb25nb2luZyAoYm90aCBBRFNUQVJUIGFuZCBKQURTVEFSVCBjbGVhcmVkKS4gKi8KK31BRENfSW5qZWN0aW9uQ29uZlR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEFEQyBFeHRlbmRlZCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19pbmplY3RlZF9leHRlcm5hbF90cmlnZ2VyX3NvdXJjZSBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2VzIGZvciBhbGwgQURDIGluc3RhbmNlcyAqLworI2RlZmluZSBBRENfSU5KRUNURURfU09GVFdBUkVfU1RBUlQgICAgICAgIChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgLyohPCBTb2Z0d2FyZSB0cmlnZ2VycyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHN0YXJ0ICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPICAgICAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPKSAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPMiAgICAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0xIFRSR08yLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfQ0M0ICAgICAgIChMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDQgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9UUkdPICAgICAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIFRSR08uIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEgICAgICAgKExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBUSU0yIGNoYW5uZWwgMSBldmVudCAoY2FwdHVyZSBjb21wYXJlOiBpbnB1dCBjYXB0dXJlIG9yIG91dHB1dCBjYXB0dXJlKS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1ICAgICAoTExfQURDX0lOSl9UUklHX0VYVF9FWFRJX0xJTkUxNSkgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDE1LiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfaW5qZWN0ZWRfZXh0ZXJuYWxfdHJpZ2dlcl9lZGdlIEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIGVkZ2UgKHdoZW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyBzZWxlY3RlZCkKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfTk9ORSAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HICAgICAgICAgKEFEQ19KU1FSX0pFWFRFTl8wKSAgIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gb24gdGhlIHJpc2luZyBlZGdlICAgICAgICAgICAgICAgICAgICovIAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfRkFMTElORyAgICAgICAgKEFEQ19KU1FSX0pFWFRFTl8xKSAgIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gb24gdGhlIGZhbGxpbmcgZWRnZSAgICAgICAgICAgICAgICAgICovIAorI2RlZmluZSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HRkFMTElORyAgKEFEQ19KU1FSX0pFWFRFTikgICAgIC8qITwgSW5qZWN0ZWQgY29udmVyc2lvbnMgaGFyZHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gb24gYm90aCB0aGUgcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovIAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HICBDaGFubmVsIC0gU2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU0lOR0xFX0VOREVEICAgICAgICAgICAgICAgIChMTF9BRENfU0lOR0xFX0VOREVEKSAgICAgICAgIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBzaW5nbGUgZW5kZWQgKGxpdGVyYWwgYWxzbyB1c2VkIHRvIHNldCBjYWxpYnJhdGlvbiBtb2RlKSAqLworI2RlZmluZSBBRENfRElGRkVSRU5USUFMX0VOREVEICAgICAgICAgIChMTF9BRENfRElGRkVSRU5USUFMX0VOREVEKSAgIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBkaWZmZXJlbnRpYWwgKGxpdGVyYWwgYWxzbyB1c2VkIHRvIHNldCBjYWxpYnJhdGlvbiBtb2RlKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfSEFMX0VDX09GRlNFVF9OQiAgQURDIGluc3RhbmNlIC0gT2Zmc2V0IG51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19PRkZTRVRfTk9ORSAgICAgICAgICAgICAgKEFEQ19PRkZTRVRfNCArIDFVKSAvKiE8IEFEQyBvZmZzZXQgZGlzYWJsZWQ6IG5vIG9mZnNldCBjb3JyZWN0aW9uIGZvciB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAoTExfQURDX09GRlNFVF8xKSAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDE6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgQURDX09GRlNFVF8yICAgICAgICAgICAgICAgICAoTExfQURDX09GRlNFVF8yKSAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDI6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgQURDX09GRlNFVF8zICAgICAgICAgICAgICAgICAoTExfQURDX09GRlNFVF8zKSAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDM6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAoTExfQURDX09GRlNFVF80KSAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDQ6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0lOSl9TRVFfUkFOS1MgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlciByYW5rcworICAqIEB7CisgICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzEgICAgICAgICAgICAgICAgKExMX0FEQ19JTkpfUkFOS18xKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAxICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzIgICAgICAgICAgICAgICAgKExMX0FEQ19JTkpfUkFOS18yKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAyICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzMgICAgICAgICAgICAgICAgKExMX0FEQ19JTkpfUkFOS18zKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAzICovCisjZGVmaW5lIEFEQ19JTkpFQ1RFRF9SQU5LXzQgICAgICAgICAgICAgICAgKExMX0FEQ19JTkpfUkFOS180KSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayA0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19IQUxfRUNfR1JPVVBTICBBREMgaW5zdGFuY2UgLSBHcm91cHMKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfUkVHVUxBUl9HUk9VUCAgICAgICAgICAgICAgICAgIChMTF9BRENfR1JPVVBfUkVHVUxBUikgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgKGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgZGV2aWNlcykgKi8KKyNkZWZpbmUgQURDX0lOSkVDVEVEX0dST1VQICAgICAgICAgICAgICAgICAoTExfQURDX0dST1VQX0lOSkVDVEVEKSAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCAobm90IGF2YWlsYWJsZSBvbiBhbGwgU1RNMzIgZGV2aWNlcykqLworI2RlZmluZSBBRENfUkVHVUxBUl9JTkpFQ1RFRF9HUk9VUCAgICAgICAgIChMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRCkgIC8qITwgQURDIGJvdGggZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19DRkdSX2ZpZWxkcyBBREN4IENGR1IgZmllbGRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfRklFTERTICAgIChBRENfQ0ZHUl9BV0QxQ0ggIHwgQURDX0NGR1JfSkFVVE8gICB8IEFEQ19DRkdSX0pBV0QxRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxRU4gIHwgQURDX0NGR1JfQVdEMVNHTCB8IEFEQ19DRkdSX0pRTSAgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSB8IEFEQ19DRkdSX0RJU0NFTiAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BVVRETFkgIHwgQURDX0NGR1JfQ09OVCAgICB8IEFEQ19DRkdSX09WUk1PRCAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRFTiAgIHwgQURDX0NGR1JfRVhUU0VMICB8IEFEQ19DRkdSX0FMSUdOICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRVMgICAgIHwgQURDX0NGR1JfRE1BQ0ZHICB8IEFEQ19DRkdSX0RNQUVOICAgKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIEFEQ19TTVBSMV9maWVsZHMgQURDeCBTTVBSMSBmaWVsZHMKKyAgKiBAeworICAqLworI2RlZmluZSBBRENfU01QUjFfRklFTERTICAgIChBRENfU01QUjFfU01QOSB8IEFEQ19TTVBSMV9TTVA4IHwgQURDX1NNUFIxX1NNUDcgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0IHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMV9TTVAzIHwgQURDX1NNUFIxX1NNUDIgfCBBRENfU01QUjFfU01QMSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjFfU01QMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0NGR1JfZmllbGRzXzIgQURDeCBDRkdSIHN1YiBmaWVsZHMgCisgICogQHsKKyAgKi8KKy8qIEFEQ19DRkdSIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBubyBjb252ZXJzaW9uCisgICAobmVpdGhlciByZWd1bGFyIG5vciBpbmplY3RlZCkgaXMgb24tZ29pbmcgICovCisjZGVmaW5lIEFEQ19DRkdSX0ZJRUxEU18yICAoKEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX0FVVERMWSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9NYWNyb19pbnRlcm5hbF9IQUxfZHJpdmVyIEFEQyBFeHRlbmRlZCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiBNYWNybyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgSEFMIGRyaXZlciB1c2FnZSwgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gICAqLworLyogY29kZSBvZiBmaW5hbCB1c2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQGJyaWVmIFRlc3QgaWYgY29udmVyc2lvbiB0cmlnZ2VyIG9mIGluamVjdGVkIGdyb3VwIGlzIHNvZnR3YXJlIHN0YXJ0CisgICogICAgICAgIG9yIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFNFVCAoc29mdHdhcmUgc3RhcnQpIG9yIFJFU0VUIChleHRlcm5hbCB0cmlnZ2VyKS4KKyAgKi8KKyNkZWZpbmUgQURDX0lTX1NPRlRXQVJFX1NUQVJUX0lOSkVDVEVEKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SlNRUiAmIEFEQ19KU1FSX0pFWFRFTikgPT0gMFVMKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBvciBub3QgQURDIGlzIGluZGVwZW5kZW50LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQG5vdGUgIFdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIG1hY3JvIGFsd2F5cyByZXR1cm5zIFNFVC4gICAKKyAgKiBAcmV0dmFsIFNFVCAoQURDIGlzIGluZGVwZW5kZW50KSBvciBSRVNFVCAoQURDIGlzIG5vdCkuCisgICovCisjZGVmaW5lIEFEQ19JU19JTkRFUEVOREVOVChfX0hBTkRMRV9fKSAgIChTRVQpCisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIHNlbGVjdGVkIGluamVjdGVkIENoYW5uZWwgcmFuay4KKyAgKiBAcGFyYW0gX19DSEFOTkVMTkJfXyBDaGFubmVsIG51bWJlci4KKyAgKiBAcGFyYW0gX19SQU5LTkJfXyBSYW5rIG51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0pTUVJfUksoX19DSEFOTkVMTkJfXywgX19SQU5LTkJfXykgKCgoKF9fQ0hBTk5FTE5CX18pICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSA8PCAoKF9fUkFOS05CX18pICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgQURDIGluamVjdGVkIGNvbnRleHQgcXVldWUKKyAgKiBAcGFyYW0gX19JTkpFQ1RfQ09OVEVYVF9RVUVVRV9NT0RFX18gSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9JTkpFQ1RfQ09OVEVYVF9RVUVVRShfX0lOSkVDVF9DT05URVhUX1FVRVVFX01PREVfXykgKChfX0lOSkVDVF9DT05URVhUX1FVRVVFX01PREVfXykgPDwgQURDX0NGR1JfSlFNX1BvcykKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSBBREMgZGlzY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgZm9yIGluamVjdGVkIGdyb3VwCisgICogQHBhcmFtIF9fSU5KRUNUX0RJU0NPTlRJTlVPVVNfTU9ERV9fIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0NGR1JfSU5KRUNUX0RJU0NDT05USU5VT1VTKF9fSU5KRUNUX0RJU0NPTlRJTlVPVVNfTU9ERV9fKSAoKF9fSU5KRUNUX0RJU0NPTlRJTlVPVVNfTU9ERV9fKSA8PCAgQURDX0NGR1JfSkRJU0NFTl9Qb3MpCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgQURDIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlIGZvciByZWd1bGFyIGdyb3VwCisgICogQHBhcmFtIF9fUkVHX0RJU0NPTlRJTlVPVVNfTU9ERV9fIFJlZ3VsYXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9SRUdfRElTQ09OVElOVU9VUyhfX1JFR19ESVNDT05USU5VT1VTX01PREVfXykgKChfX1JFR19ESVNDT05USU5VT1VTX01PREVfXykgPDwgQURDX0NGR1JfRElTQ0VOX1BvcykKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpbnVvdXMgY29udmVyc2lvbnMgZm9yIHJlZ3VsYXIgZ3JvdXAuCisgICogQHBhcmFtIF9fTkJSX0RJU0NPTlRJTlVPVVNfQ09OVl9fIE51bWJlciBvZiBkaXNjb250aW51b3VzIGNvbnZlcnNpb25zLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTShfX05CUl9ESVNDT05USU5VT1VTX0NPTlZfXykgKCgoX19OQlJfRElTQ09OVElOVU9VU19DT05WX18pIC0gMVVMKSA8PCBBRENfQ0ZHUl9ESVNDTlVNX1BvcykKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgQURDIGF1dG8gZGVsYXkgbW9kZS4KKyAgKiBAcGFyYW0gX19BVVRPV0FJVF9fIEF1dG8gZGVsYXkgYml0IGVuYWJsZSBvciBkaXNhYmxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9BVVRPV0FJVChfX0FVVE9XQUlUX18pICgoX19BVVRPV0FJVF9fKSA8PCBBRENfQ0ZHUl9BVVRETFlfUG9zKQorCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZS4KKyAgKiBAcGFyYW0gX19DT05USU5VT1VTX01PREVfXyBDb250aW51b3VzIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19DRkdSX0NPTlRJTlVPVVMoX19DT05USU5VT1VTX01PREVfXykgKChfX0NPTlRJTlVPVVNfTU9ERV9fKSA8PCBBRENfQ0ZHUl9DT05UX1BvcykKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgQURDIERNQSBjb250aW51b3VzIHJlcXVlc3QuCisgICogQHBhcmFtIF9fRE1BQ09OVFJFUV9NT0RFX18gRE1BIGNvbnRpbnVvdXMgcmVxdWVzdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9ETUFDT05UUkVRKF9fRE1BQ09OVFJFUV9NT0RFX18pICgoX19ETUFDT05UUkVRX01PREVfXykgPDwgIEFEQ19DRkdSX0RNQUNGR19Qb3MpCisKKworLyoqCisgICogQGJyaWVmIFNoaWZ0IHRoZSBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4gCisgICogQG5vdGUgICBPZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMC4KKyAgKiAgICAgICAgIElmIHJlc29sdXRpb24gMTIgYml0cywgbm8gc2hpZnQuCisgICogICAgICAgICBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIGxlZnQuCisgICogICAgICAgICBJZiByZXNvbHV0aW9uIDggYml0cywgc2hpZnQgb2YgNCByYW5rcyBvbiB0aGUgbGVmdC4KKyAgKiAgICAgICAgIElmIHJlc29sdXRpb24gNiBiaXRzLCBzaGlmdCBvZiA2IHJhbmtzIG9uIHRoZSBsZWZ0LgorICAqICAgICAgICAgVGhlcmVmb3JlLCBzaGlmdCA9ICgxMiAtIHJlc29sdXRpb24pID0gMTIgLSAoMTItICgoKFJFU1sxOjBdKSA+PiAzKSoyKSkuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX09GRlNFVF9fIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX09GRlNFVF9TSElGVF9SRVNPTFVUSU9OKF9fSEFORExFX18sIF9fT0ZGU0VUX18pIFwKKyAgICAgICAgKChfX09GRlNFVF9fKSA8PCAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSA+PiAzVUwpICogMlVMKSkKKworLyoqCisgICogQGJyaWVmIFNoaWZ0IHRoZSBBV0QxIHRocmVzaG9sZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uLgorICAqIEBub3RlICBUaHJlc2hvbGRzIGhhdmUgdG8gYmUgbGVmdC1hbGlnbmVkIG9uIGJpdCAxMSwgdGhlIExTQiAocmlnaHQgYml0cykgYXJlIHNldCB0byAwLgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEyIGJpdHMsIG5vIHNoaWZ0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIGxlZnQuCisgICogICAgICAgIElmIHJlc29sdXRpb24gOCBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSBsZWZ0LgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDYgYml0cywgc2hpZnQgb2YgNiByYW5rcyBvbiB0aGUgbGVmdC4KKyAgKiAgICAgICAgVGhlcmVmb3JlLCBzaGlmdCA9ICgxMiAtIHJlc29sdXRpb24pID0gMTIgLSAoMTItICgoKFJFU1sxOjBdKSA+PiAzKSoyKSkuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZQorICAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFZhbHVlIHRvIGJlIHNoaWZ0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgQURDX0FXRDFUSFJFU0hPTERfU0hJRlRfUkVTT0xVVElPTihfX0hBTkRMRV9fLCBfX1RIUkVTSE9MRF9fKSBcCisgICAgICAgICgoX19USFJFU0hPTERfXykgPDwgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1VMKSAqIDJVTCkpCisKKy8qKgorICAqIEBicmllZiBTaGlmdCB0aGUgQVdEMiBhbmQgQVdEMyB0aHJlc2hvbGQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4KKyAgKiBAbm90ZSAgVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgNy4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiAxMiBiaXRzLCBzaGlmdCBvZiA0IHJhbmtzIG9uIHRoZSByaWdodCAodGhlIDQgTFNCIGFyZSBkaXNjYXJkZWQpLgorICAqICAgICAgICBJZiByZXNvbHV0aW9uIDEwIGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIHJpZ2h0ICh0aGUgMiBMU0IgYXJlIGRpc2NhcmRlZCkuCisgICogICAgICAgIElmIHJlc29sdXRpb24gOCBiaXRzLCBubyBzaGlmdC4KKyAgKiAgICAgICAgSWYgcmVzb2x1dGlvbiA2IGJpdHMsIHNoaWZ0IG9mIDIgcmFua3Mgb24gdGhlIGxlZnQgKHRoZSAyIExTQiBhcmUgc2V0IHRvIDApLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gX19USFJFU0hPTERfXyBWYWx1ZSB0byBiZSBzaGlmdGVkCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIEFEQ19BV0QyM1RIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKF9fSEFORExFX18sIF9fVEhSRVNIT0xEX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfUkVTKSAhPSAoQURDX0NGR1JfUkVTXzEgfCBBRENfQ0ZHUl9SRVNfMCkpICAgICAgICAgICAgICAgICAgICA/IFwKKyAgICAoKF9fVEhSRVNIT0xEX18pID4+ICgoNFVMIC0gKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX1JFUykgPj4gM1VMKSAqIDJVTCkpICYgMHgxRlVMKSkgOiBcCisgICAgKChfX1RIUkVTSE9MRF9fKSA8PCAyVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qKgorICAqIEBicmllZiBDbGVhciBDb21tb24gQ29udHJvbCBSZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBBRENfQ0xFQVJfQ09NTU9OX0NPTlRST0xfUkVHSVNURVIoX19IQU5ETEVfXykgQ0xFQVJfQklUKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgoX19IQU5ETEVfXyktPkluc3RhbmNlKS0+Q0NSLCBBRENfQ0NSX0NLTU9ERSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DQ1JfUFJFU0MgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NDUl9WQkFURU4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0NSX1RTRU4gICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DQ1JfVlJFRkVOICkKKworCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5zdGFuY2UgY29ubmVjdGVkIHRvIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFNFVCAoQURDIGluc3RhbmNlIGlzIHZhbGlkKSBvciBSRVNFVCAoQURDIGluc3RhbmNlIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoX19IQU5ETEVfXykgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGluc3RhbmNlIGNvbm5lY3RlZCB0byB0aGUgYmF0dGVyeSB2b2x0YWdlIFZCQVQuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIFNFVCAoQURDIGluc3RhbmNlIGlzIHZhbGlkKSBvciBSRVNFVCAoQURDIGluc3RhbmNlIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIEFEQ19CQVRURVJZX1ZPTFRBR0VfSU5TVEFOQ0UoX19IQU5ETEVfXykgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIGluc3RhbmNlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVlJFRklOVC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICAqIEByZXR2YWwgU0VUIChBREMgaW5zdGFuY2UgaXMgdmFsaWQpIG9yIFJFU0VUIChBREMgaW5zdGFuY2UgaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgQURDX1ZSRUZJTlRfSU5TVEFOQ0UoX19IQU5ETEVfXykgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gQURDMSkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgbGVuZ3RoIG9mIHNjaGVkdWxlZCBpbmplY3RlZCBjb252ZXJzaW9ucyBncm91cC4KKyAgKiBAcGFyYW0gX19MRU5HVEhfXyBudW1iZXIgb2YgcHJvZ3JhbW1lZCBjb252ZXJzaW9ucy4gICAKKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB3aXRoaW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIHByb2dyYW1tYWJsZSBpbmplY3RlZCBjb252ZXJzaW9ucykgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgbnVsbCBvciB0b28gbGFyZ2UpCisgICovCisjZGVmaW5lIElTX0FEQ19JTkpFQ1RFRF9OQl9DT05WKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID49ICgxVSkpICYmICgoX19MRU5HVEhfXykgPD0gKDRVKSkpCisKKy8qKgorICAqIEBicmllZiBDYWxpYnJhdGlvbiBmYWN0b3Igc2l6ZSB2ZXJpZmljYXRpb24gKDcgYml0cyBtYXhpbXVtKS4KKyAgKiBAcGFyYW0gX19DQUxJQlJBVElPTl9GQUNUT1JfXyBDYWxpYnJhdGlvbiBmYWN0b3IgdmFsdWUuCisgICogQHJldHZhbCBTRVQgKF9fQ0FMSUJSQVRJT05fRkFDVE9SX18gaXMgd2l0aGluIHRoZSBhdXRob3JpemVkIHNpemUpIG9yIFJFU0VUIChfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fIGlzIHRvbyBsYXJnZSkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0NBTEZBQ1QoX19DQUxJQlJBVElPTl9GQUNUT1JfXykgKChfX0NBTElCUkFUSU9OX0ZBQ1RPUl9fKSA8PSAoMHg3RlUpKQorCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjaGFubmVsIHNldHRpbmcuCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19DSEFOTkVMX18gcHJvZ3JhbW1lZCBBREMgY2hhbm5lbC4gCisgICogQHJldHZhbCBTRVQgKF9fQ0hBTk5FTF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DSEFOTkVMX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09IEFEQzEpICAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMCkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzgpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE0KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xNikgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE3KSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTgpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF9WUkVGSU5UKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfVkJBVCkpKQorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgY2hhbm5lbCBzZXR0aW5nIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuCisgICogQHBhcmFtIF9fQ0hBTk5FTF9fIHByb2dyYW1tZWQgQURDIGNoYW5uZWwuIAorICAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19ESUZGX0NIQU5ORUwoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICgoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMykgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF80KSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfNikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF83KSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzgpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfOSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzExKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfQ0hBTk5FTF8xMykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19DSEFOTkVMXzE0KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0NIQU5ORUxfMTUpICAgICAgICkKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIHNpbmdsZS1lbmRlZCBpbnB1dCBvciBkaWZmZXJlbnRpYWwgbW9kZSBzZXR0aW5nLgorICAqIEBwYXJhbSBfX1NJTkdfRElGRl9fIHByb2dyYW1tZWQgY2hhbm5lbCBzZXR0aW5nLiAKKyAgKiBAcmV0dmFsIFNFVCAoX19TSU5HX0RJRkZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0lOR19ESUZGX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwoX19TSU5HX0RJRkZfXykgKCgoX19TSU5HX0RJRkZfXykgPT0gQURDX1NJTkdMRV9FTkRFRCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0lOR19ESUZGX18pID09IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvZmZzZXQgbWFuYWdlbWVudCBzZXR0aW5nLgorICAqIEBwYXJhbSBfX09GRlNFVF9OVU1CRVJfXyBBREMgb2Zmc2V0IG1hbmFnZW1lbnQuIAorICAqIEByZXR2YWwgU0VUIChfX09GRlNFVF9OVU1CRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT0ZGU0VUX05VTUJFUl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19PRkZTRVRfTlVNQkVSKF9fT0ZGU0VUX05VTUJFUl9fKSAoKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8xKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8yKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF8zKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09GRlNFVF9OVU1CRVJfXykgPT0gQURDX09GRlNFVF80KSAgICAgICkgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBpbmplY3RlZCBjaGFubmVsIHNldHRpbmcuCisgICogQHBhcmFtIF9fQ0hBTk5FTF9fIHByb2dyYW1tZWQgQURDIGluamVjdGVkIGNoYW5uZWwuIAorICAqIEByZXR2YWwgU0VUIChfX0NIQU5ORUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0hBTk5FTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19JTkpFQ1RFRF9SQU5LKF9fQ0hBTk5FTF9fKSAoKChfX0NIQU5ORUxfXykgPT0gQURDX0lOSkVDVEVEX1JBTktfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IEFEQ19JTkpFQ1RFRF9SQU5LXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBBRENfSU5KRUNURURfUkFOS18zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gQURDX0lOSkVDVEVEX1JBTktfNCkgICApIAorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgaW5qZWN0ZWQgY29udmVyc2lvbnMgZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBBREMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOSlRSSUdfXyBwcm9ncmFtbWVkIEFEQyBpbmplY3RlZCBjb252ZXJzaW9ucyBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEByZXR2YWwgU0VUIChfX0lOSlRSSUdfXyBpcyBhIHZhbGlkIHZhbHVlKSBvciBSRVNFVCAoX19JTkpUUklHX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0VYVFRSSUdJTkpFQyhfX0hBTkRMRV9fLCBfX0lOSlRSSUdfXykgKCgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMV9UUkdPKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX1QxX0NDNCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDJfVFJHTykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTkpUUklHX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ19UMl9DQzEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0lOSlRSSUdfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDX0VYVF9JVDE1KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5KVFJJR19fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNfVDFfVFJHTzIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTkpUUklHX18pID09IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkgICAgICAgKQorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgZWRnZSB0cmlnZ2VyIHNldHRpbmcgZm9yIGluamVjdGVkIGdyb3VwLgorICAqIEBwYXJhbSBfX0VER0VfXyBwcm9ncmFtbWVkIEFEQyBlZGdlIHRyaWdnZXIgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19FREdFX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fRURHRV9fIGlzIGludmFsaWQpCisgICovIAorI2RlZmluZSBJU19BRENfRVhUVFJJR0lOSkVDX0VER0UoX19FREdFX18pICgoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfTk9ORSkgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRURHRV9fKSA9PSBBRENfRVhURVJOQUxUUklHSU5KRUNDT05WX0VER0VfUklTSU5HKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VER0VfXykgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX0ZBTExJTkcpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FREdFX18pID09IEFEQ19FWFRFUk5BTFRSSUdJTkpFQ0NPTlZfRURHRV9SSVNJTkdGQUxMSU5HKSApIAorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIHNldHRpbmcuCisgICogQHBhcmFtIF9fV0FUQ0hET0dfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19XQVRDSERPR19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQVRDSERPR19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTlVNQkVSKF9fV0FUQ0hET0dfXykgKCgoX19XQVRDSERPR19fKSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fV0FUQ0hET0dfXykgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBVENIRE9HX18pID09IEFEQ19BTkFMT0dXQVRDSERPR18zKSAgICkgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZSBzZXR0aW5nLgorICAqIEBwYXJhbSBfX1dBVENIRE9HX01PREVfXyBwcm9ncmFtbWVkIEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9kZSBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1dBVENIRE9HX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fV0FUQ0hET0dfTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19BTkFMT0dfV0FUQ0hET0dfTU9ERShfX1dBVENIRE9HX01PREVfXykgKCgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19OT05FKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfSU5KRUMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfSU5KRUMpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQVRDSERPR19NT0RFX18pID09IEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHSU5KRUMpICAgICAgICkgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBjb252ZXJzaW9uIChyZWd1bGFyIG9yIGluamVjdGVkIG9yIGJvdGgpLgorICAqIEBwYXJhbSBfX0NPTlZFUlNJT05fXyBBREMgY29udmVyc2lvbiBncm91cC4KKyAgKiBAcmV0dmFsIFNFVCAoX19DT05WRVJTSU9OX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlZFUlNJT05fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfQ09OVkVSU0lPTl9HUk9VUChfX0NPTlZFUlNJT05fXykgKCgoX19DT05WRVJTSU9OX18pID09IEFEQ19SRUdVTEFSX0dST1VQKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlZFUlNJT05fXykgPT0gQURDX0lOSkVDVEVEX0dST1VQKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlZFUlNJT05fXykgPT0gQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApICApCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBldmVudCB0eXBlLgorICAqIEBwYXJhbSBfX0VWRU5UX18gQURDIGV2ZW50LgorICAqIEByZXR2YWwgU0VUIChfX0VWRU5UX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0VWRU5UX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0VWRU5UX1RZUEUoX19FVkVOVF9fKSAoKChfX0VWRU5UX18pID09IEFEQ19FT1NNUF9FVkVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FVkVOVF9fKSA9PSBBRENfQVdEX0VWRU5UKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VWRU5UX18pID09IEFEQ19BV0QyX0VWRU5UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRVZFTlRfXykgPT0gQURDX0FXRDNfRVZFTlQpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19FVkVOVF9fKSA9PSBBRENfT1ZSX0VWRU5UKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0VWRU5UX18pID09IEFEQ19KUU9WRl9FVkVOVCkgICkgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8uIAorICAqIEBwYXJhbSBfX1JBVElPX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvLgorICAqIEByZXR2YWwgU0VUIChfX1JBVElPX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fUkFUSU9fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfT1ZFUlNBTVBMSU5HX1JBVElPKF9fUkFUSU9fXykgICAgICAoKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fOCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTYgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMzIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fNjQgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMTI4ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBVElPX18pID09IEFEQ19PVkVSU0FNUExJTkdfUkFUSU9fMjU2ICkpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQuIAorICAqIEBwYXJhbSBfX1NISUZUX18gcHJvZ3JhbW1lZCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0LgorICAqIEByZXR2YWwgU0VUIChfX1NISUZUX18gaXMgYSB2YWxpZCB2YWx1ZSkgb3IgUkVTRVQgKF9fU0hJRlRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19BRENfUklHSFRfQklUX1NISUZUKF9fU0hJRlRfXykgICAgICAgICgoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfMyAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNSAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNiAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfNyAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0hJRlRfXykgPT0gQURDX1JJR0hUQklUU0hJRlRfOCAgICkpCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIEFEQyBvdmVyc2FtcGxpbmcgdHJpZ2dlcmVkIG1vZGUuIAorICAqIEBwYXJhbSBfX01PREVfXyBwcm9ncmFtbWVkIEFEQyBvdmVyc2FtcGxpbmcgdHJpZ2dlcmVkIG1vZGUuIAorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0FEQ19UUklHR0VSRURfT1ZFUlNBTVBMSU5HX01PREUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBBRENfVFJJR0dFUkVETU9ERV9TSU5HTEVfVFJJR0dFUikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQURDX1RSSUdHRVJFRE1PREVfTVVMVElfVFJJR0dFUikgKSAKKworLyoqCisgICogQGJyaWVmIFZlcmlmeSB0aGUgQURDIG92ZXJzYW1wbGluZyByZWd1bGFyIGNvbnZlcnNpb24gcmVzdW1lZCBvciBjb250aW51ZWQgbW9kZS4gCisgICogQHBhcmFtIF9fTU9ERV9fIHByb2dyYW1tZWQgQURDIG92ZXJzYW1wbGluZyByZWd1bGFyIGNvbnZlcnNpb24gcmVzdW1lZCBvciBjb250aW51ZWQgbW9kZS4gCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX1JFR09WRVJTQU1QTElOR19NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gQURDX1JFR09WRVJTQU1QTElOR19DT05USU5VRURfTU9ERSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBBRENfUkVHT1ZFUlNBTVBMSU5HX1JFU1VNRURfTU9ERSkgKSAgICAgICAgICAgICAgCisKKy8qKgorICAqIEBicmllZiBWZXJpZnkgdGhlIERGU0RNIG1vZGUgY29uZmlndXJhdGlvbi4gCisgICogQHBhcmFtIF9fSEFORExFX18gQURDIGhhbmRsZS4gCisgICogQG5vdGUgV2hlbiBETVNERk0gY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgbWFjcm8gc3lzdGVtYXRpY2FsbHkgcmVwb3J0cyBTRVQuIEZvcgorICAqICAgICAgdGhpcyByZWFzb24sIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgYW5kIG5vdCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgKiAgICAgIGRpcmVjdGx5LiAgICAgIAorICAqIEByZXR2YWwgU0VUIChERlNETSBtb2RlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQpIG9yIFJFU0VUIChERlNETSBtb2RlIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfQURDX0RGU0RNQ0ZHX01PREUoX19IQU5ETEVfXykgKFNFVCkKKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgREZTRE0gY29uZmlndXJhdGlvbiBtb2RlLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEFEQyBoYW5kbGUuIAorICAqIEBub3RlIFdoZW4gRE1TREZNIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgdGhlIG1hY3JvIHN5c3RlbWF0aWNhbGx5IHJlcG9ydHMgMHgwIChpLmUgZGlzYWJsZWQpLiAKKyAgKiAgICAgICBGb3IgdGhpcyByZWFzb24sIHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgdGhlIEFEQyBoYW5kbGUgYW5kIG5vdCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgKiAgICAgICBkaXJlY3RseS4gICAgICAKKyAgKiBAcmV0dmFsIERGU0RNIGNvbmZpZ3VyYXRpb24gbW9kZQorICAqLworI2RlZmluZSBBRENfQ0ZHUl9ERlNETShfX0hBTkRMRV9fKSAoMHgwVUwpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBREMgY2FsaWJyYXRpb24gKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgU2luZ2xlRGlmZik7Cit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDRXhfQ2FsaWJyYXRpb25fR2V0VmFsdWUoQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIHVpbnQzMl90IFNpbmdsZURpZmYpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1NldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjLCB1aW50MzJfdCBTaW5nbGVEaWZmLCB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3Rvcik7CisKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFN0YXJ0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9JbmplY3RlZFN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKiBOb24tYmxvY2tpbmcgbW9kZTogSW50ZXJydXB0aW9uICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyogQURDIHJldHJpZXZlIGNvbnZlcnNpb24gdmFsdWUgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHBvbGxpbmcgb3IgaW50ZXJydXB0aW9uICovCit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgSW5qZWN0ZWRSYW5rKTsKKworLyogQURDIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbi1ibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0aW9uKSAqLwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOwordm9pZCAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisKKy8qIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb25zIHN0b3AgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9SZWd1bGFyU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3BfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0RNQShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbChBRENfSGFuZGxlVHlwZURlZiogaGFkYyxBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYqIHNDb25maWdJbmplY3RlZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfRW5hYmxlSW5qZWN0ZWRRdWV1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYyk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9BRENFeF9FbnRlckFEQ0RlZXBQb3dlckRvd25Nb2RlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfQURDX0VYX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfY29tcC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDczZmMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9jb21wLmgKQEAgLTAsMCArMSw3MTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2NvbXAuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09NUCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfQ09NUF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfQ09NUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9leHRpLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIENPTVAKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX1R5cGVzIENPTVAgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENPTVAgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBXaW5kb3dNb2RlOyAgICAgICAgIC8qITwgU2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyIGNvbnNlY3V0aXZlIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEhBTCBDT01QIGRyaXZlciBhbGxvd3MgdG8gc2V0IHdpbmRvdyBtb2RlIGZyb20gYW55IENPTVAgaW5zdGFuY2Ugb2YgdGhlIHBhaXIgb2YgQ09NUCBpbnN0YW5jZXMgY29tcG9zaW5nIHdpbmRvdyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX1dpbmRvd01vZGUgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IEZvciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGNvbXBhcmF0b3IgcG93ZXIgbW9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wYWdhdGlvbiBkZWxheSBhbmQgcG93ZXIgY29uc3VtcHRpb24pLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX1Bvd2VyTW9kZSAqLworCisgIHVpbnQzMl90IElucHV0UGx1czsgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBwbHVzIChub24taW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9JbnB1dFBsdXMgKi8KKworICB1aW50MzJfdCBJbnB1dE1pbnVzOyAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfSW5wdXRNaW51cyAqLworCisgIHVpbnQzMl90IEh5c3RlcmVzaXM7ICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBoeXN0ZXJlc2lzIG1vZGUgb2YgdGhlIGlucHV0IG1pbnVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0h5c3RlcmVzaXMgKi8KKworICB1aW50MzJfdCBPdXRwdXRQb2w7ICAgICAgICAgIC8qITwgU2V0IGNvbXBhcmF0b3Igb3V0cHV0IHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX091dHB1dFBvbGFyaXR5ICovCisKKyAgdWludDMyX3QgQmxhbmtpbmdTcmNlOyAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGJsYW5raW5nIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9CbGFua2luZ1NyY2UgKi8KKworICB1aW50MzJfdCBUcmlnZ2VyTW9kZTsgICAgICAgIC8qITwgU2V0IHRoZSBjb21wYXJhdG9yIG91dHB1dCB0cmlnZ2VyaW5nIEV4dGVybmFsIEludGVycnVwdCBMaW5lIChFWFRJKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9FWFRJX1RyaWdnZXJNb2RlICovCisKK30gQ09NUF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgQ09NUCBzdGF0ZSBtYWNoaW5lOiBIQUwgQ09NUCBzdGF0ZXMgZGVmaW5pdGlvbgorICAqLworI2RlZmluZSBDT01QX1NUQVRFX0JJVEZJRUxEX0xPQ0sgICgweDEwVSkKK3R5cGVkZWYgZW51bQoreworICBIQUxfQ09NUF9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBub3QgeWV0IGluaXRpYWxpemVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ09NUF9TVEFURV9SRVNFVF9MT0NLRUQgICAgICA9IChIQUxfQ09NUF9TVEFURV9SRVNFVCB8IENPTVBfU1RBVEVfQklURklFTERfTE9DSyksIC8qITwgQ09NUCBub3QgeWV0IGluaXRpYWxpemVkIGFuZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCAqLworICBIQUxfQ09NUF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ09NUF9TVEFURV9SRUFEWV9MT0NLRUQgICAgICA9IChIQUxfQ09NUF9TVEFURV9SRUFEWSB8IENPTVBfU1RBVEVfQklURklFTERfTE9DSyksIC8qITwgQ09NUCBpbml0aWFsaXplZCBidXQgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgICAgICAgICAqLworICBIQUxfQ09NUF9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ09NUCBpcyBydW5uaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ09NUF9TVEFURV9CVVNZX0xPQ0tFRCAgICAgICA9IChIQUxfQ09NUF9TVEFURV9CVVNZIHwgQ09NUF9TVEFURV9CSVRGSUVMRF9MT0NLKSAgIC8qITwgQ09NUCBpcyBydW5uaW5nIGFuZCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCAgICAgICAgICAqLworfSBIQUxfQ09NUF9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgQ09NUCBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19DT01QX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIENPTVBfVHlwZURlZiAgICAgICAqSW5zdGFuY2U7ICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICovCisgIENPTVBfSW5pdFR5cGVEZWYgICBJbml0OyAgICAgICAgICAgIC8qITwgQ09NUCByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICBMb2NrOyAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICovCisgIF9fSU8gSEFMX0NPTVBfU3RhdGVUeXBlRGVmICBTdGF0ZTsgIC8qITwgQ09NUCBjb21tdW5pY2F0aW9uIHN0YXRlICovCisgIF9fSU8gdWludDMyX3QgICAgICBFcnJvckNvZGU7ICAgICAgIC8qITwgQ09NUCBlcnJvciBjb2RlICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBUcmlnZ2VyQ2FsbGJhY2spKHN0cnVjdCBfX0NPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOyAgIC8qITwgQ09NUCB0cmlnZ2VyIGNhbGxiYWNrICovCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19DT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsgICAvKiE8IENPTVAgTXNwIEluaXQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7IC8qITwgQ09NUCBNc3AgRGVJbml0IGNhbGxiYWNrICovCisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBDT01QX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgQ09NUCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NPTVBfVFJJR0dFUl9DQl9JRCAgICAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBDT01QIHRyaWdnZXIgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX0NPTVBfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBDT01QIE1zcCBJbml0IGNhbGxiYWNrIElEICovCisgIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgPSAweDAyVSAgIC8qITwgQ09NUCBNc3AgRGVJbml0IGNhbGxiYWNrIElEICovCit9IEhBTF9DT01QX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBDT01QIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBDT01QX0NhbGxiYWNrVHlwZURlZikoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7IC8qITwgcG9pbnRlciB0byBhIENPTVAgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9Db25zdGFudHMgQ09NUCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXJyb3JfQ29kZSBDT01QIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ09NUF9FUlJPUl9OT05FICAgICAgICAgICAgICgweDAwVUwpICAvKiE8IE5vIGVycm9yICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoMHgwMVVMKSAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICovCisjZW5kaWYgLyogVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX1dpbmRvd01vZGUgQ09NUCBXaW5kb3cgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfV0lORE9XTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgV2luZG93IG1vZGUgZGlzYWJsZTogQ29tcGFyYXRvcnMgaW5zdGFuY2VzIHBhaXIgQ09NUDEgYW5kIENPTVAyIGFyZSBpbmRlcGVuZGVudCAqLworI2RlZmluZSBDT01QX1dJTkRPV01PREVfQ09NUDFfSU5QVVRfUExVU19DT01NT04gKENPTVBfQ1NSX1dJTk1PREUpICAgICAvKiE8IFdpbmRvdyBtb2RlIGVuYWJsZTogQ29tcGFyYXRvcnMgaW5zdGFuY2VzIHBhaXIgQ09NUDEgYW5kIENPTVAyIGhhdmUgdGhlaXIgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG9nZXRoZXIuIFRoZSBjb21tb24gaW5wdXQgaXMgQ09NUDEgaW5wdXQgcGx1cyAoQ09NUDIgaW5wdXQgcGx1cyBpcyBubyBtb3JlIGFjY2Vzc2libGUpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX1Bvd2VyTW9kZSBDT01QIHBvd2VyIG1vZGUKKyAgKiBAeworICAqLworLyogTm90ZTogRm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcGFyYXRvciBwb3dlciBtb2RlcyAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIChwcm9wYWdhdGlvbiBkZWxheSBhbmQgcG93ZXIgY29uc3VtcHRpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAvKiE8IEhpZ2ggU3BlZWQgKi8KKyNkZWZpbmUgQ09NUF9QT1dFUk1PREVfTUVESVVNU1BFRUQgICAgIChDT01QX0NTUl9QV1JNT0RFXzApICAgLyohPCBNZWRpdW0gU3BlZWQgKi8KKyNkZWZpbmUgQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUiAgIChDT01QX0NTUl9QV1JNT0RFKSAgICAgLyohPCBVbHRyYS1sb3cgcG93ZXIgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0lucHV0UGx1cyBDT01QIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9QTFVTX0lPMSAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMSAocGluIFBDNSBmb3IgQ09NUDEsIHBpbiBQQjQgZm9yIENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX1BMVVNfSU8yICAgICAgICAgICAgKENPTVBfQ1NSX0lOUFNFTF8wKSAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8yIChwaW4gUEIyIGZvciBDT01QMSwgcGluIFBCNiBmb3IgQ09NUDIpICovCisjaWYgZGVmaW5lZChDT01QX0NTUl9JTlBTRUxfMSkKKyNkZWZpbmUgQ09NUF9JTlBVVF9QTFVTX0lPMyAgICAgICAgICAgIChDT01QX0NTUl9JTlBTRUxfMSkgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMyAocGluIFBBMSBmb3IgQ09NUDEsIHBpbiBQQTMgZm9yIENPTVAyKSAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSW5wdXRNaW51cyBDT01QIGlucHV0IG1pbnVzIChpbnZlcnRpbmcgaW5wdXQpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9TQ0FMRU4gfCBDT01QX0NTUl9CUkdFTikgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMS80IFZyZWZJbnQgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfSU5NU0VMXzAgfCBDT01QX0NTUl9TQ0FMRU4gfCBDT01QX0NTUl9CUkdFTikgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMS8yIFZyZWZJbnQgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8xICAgICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9TQ0FMRU4gfCBDT01QX0NTUl9CUkdFTikgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMy80IFZyZWZJbnQgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UICAgICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzAgfCBDT01QX0NTUl9TQ0FMRU4gICAgICAgICAgICAgICAgICkgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gVnJlZkludCAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgICAgKENPTVBfQ1NSX0lOTVNFTF8yIHwgQ09NUF9DU1JfSU5NU0VMXzEgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQjEgZm9yIENPTVAxLCBwaW4gUEIzIGZvciBDT01QMikgKi8gCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfSU8yICAgICAgICAgICAoQ09NUF9DU1JfSU5NU0VMXzIgfCBDT01QX0NTUl9JTk1TRUxfMSB8IENPTVBfQ1NSX0lOTVNFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIElPMiAocGluIFBDNCBmb3IgQ09NUDEsIHBpbiBQQjcgZm9yIENPTVAyKSAqLworI2RlZmluZSBDT01QX0lOUFVUX01JTlVTX0lPMyAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTUVTRUxfMCB8IENPTVBfQ1NSX0lOTVNFTF8yIHwgQ09NUF9DU1JfSU5NU0VMXzEgfCBDT01QX0NTUl9JTk1TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzMgKHBpbiBQQTAgZm9yIENPTVAxLCBwaW4gUEEyIGZvciBDT01QMikgKi8KKyNkZWZpbmUgQ09NUF9JTlBVVF9NSU5VU19JTzQgICAgICAgICAgIChDT01QX0NTUl9JTk1FU0VMXzEgICAgICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU80IChwaW4gUEE0IGZvciBDT01QMSwgcGluIFBBNCBmb3IgQ09NUDIpICovCisjZGVmaW5lIENPTVBfSU5QVVRfTUlOVVNfSU81ICAgICAgICAgICAoQ09NUF9DU1JfSU5NRVNFTF8xIHwgQ09NUF9DU1JfSU5NRVNFTF8wIHwgQ09NUF9DU1JfSU5NU0VMXzIgfCBDT01QX0NTUl9JTk1TRUxfMSB8IENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIElPNSAocGluIFBBNSBmb3IgQ09NUDEsIHBpbiBQQTUgZm9yIENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0h5c3RlcmVzaXMgQ09NUCBoeXN0ZXJlc2lzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX05PTkUgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQ09NUF9IWVNURVJFU0lTX0xPVyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICBDT01QX0NTUl9IWVNUXzApICAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgbG93ICovCisjZGVmaW5lIENPTVBfSFlTVEVSRVNJU19NRURJVU0gICAgICAgICAoQ09NUF9DU1JfSFlTVF8xICAgICAgICAgICAgICAgICAgKSAgLyohPCBIeXN0ZXJlc2lzIGxldmVsIG1lZGl1bSAqLworI2RlZmluZSBDT01QX0hZU1RFUkVTSVNfSElHSCAgICAgICAgICAgKENPTVBfQ1NSX0hZU1RfMSB8IENPTVBfQ1NSX0hZU1RfMCkgIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfT3V0cHV0UG9sYXJpdHkgQ09NUCBvdXRwdXQgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IGxldmVsIGlzIG5vdCBpbnZlcnRlZCAoY29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuIHRoZSBpbnB1dCBwbHVzIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMpICovCisjZGVmaW5lIENPTVBfT1VUUFVUUE9MX0lOVkVSVEVEICAgICAgICAoQ09NUF9DU1JfUE9MQVJJVFkpICAgIC8qITwgQ09NUCBvdXRwdXQgbGV2ZWwgaXMgaW52ZXJ0ZWQgICAgIChjb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgIHdoZW4gdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cykgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9CbGFua2luZ1NyY2UgIENPTVAgYmxhbmtpbmcgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ09NUF9CTEFOS0lOR1NSQ19OT05FICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgLyohPENvbXBhcmF0b3Igb3V0cHV0IHdpdGhvdXQgYmxhbmtpbmcgKi8KKy8qIE5vdGU6IE91dHB1dCBibGFua2luZyBzb3VyY2UgY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlcyAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1ICAgICAgICAoQ09NUF9DU1JfQkxBTktJTkdfMCkgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0xIE9DNSAoY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlczogQ09NUDEsIENPTVAyKSAqLworI2RlZmluZSBDT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzICAgICAgICAoQ09NUF9DU1JfQkxBTktJTkdfMSkgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGJsYW5raW5nIHNvdXJjZSBUSU0yIE9DMyAoY29tbW9uIHRvIGFsbCBDT01QIGluc3RhbmNlczogQ09NUDEsIENPTVAyKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX091dHB1dExldmVsIENPTVAgT3V0cHV0IExldmVsCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIHZhbHVlcyBhcmUgZml4ZWQgdG8gIjAiIGFuZCAiMSIsICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIENPTVAgcmVnaXN0ZXIgYml0IGlzIG1hbmFnZWQgYnkgSEFMIGZ1bmN0aW9uIHRvIG1hdGNoICAgICAgICAqLworLyogd2l0aCB0aGVzZSB2YWx1ZXMgKGluZGVwZW5kZW50bHkgb2YgYml0IHBvc2l0aW9uIGluIHJlZ2lzdGVyKS4gICAgICAgICAgICAgKi8KKworLyogV2hlbiBvdXRwdXQgcG9sYXJpdHkgaXMgbm90IGludmVydGVkLCBjb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbgorICAgdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBsb3dlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0xPVyAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkKKy8qIFdoZW4gb3V0cHV0IHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgY29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuCisgICB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIGlucHV0IG1pbnVzICovCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0hJR0ggICAgICAgICAgICAgKDB4MDAwMDAwMDFVTCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FWFRJX1RyaWdnZXJNb2RlIENPTVAgb3V0cHV0IHRvIEVYVEkKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX05PTkUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgbm8gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgKi8KKyNkZWZpbmUgQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkcgICAgICAgICAgICAoQ09NUF9FWFRJX0lUIHwgQ09NUF9FWFRJX1JJU0lORykgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIG91dHB1dCB0cmlnZ2VyaW5nIEV4dGVybmFsIEludGVycnVwdCBMaW5lIGV2ZW50IHdpdGggaW50ZXJydXB0aW9uLCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX0ZBTExJTkcgICAgICAgICAgIChDT01QX0VYVElfSVQgfCBDT01QX0VYVElfRkFMTElORykgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24sIG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0lUX1JJU0lOR19GQUxMSU5HICAgIChDT01QX0VYVElfSVQgfCBDT01QX0VYVElfUklTSU5HIHwgQ09NUF9FWFRJX0ZBTExJTkcpICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24sIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfUklTSU5HICAgICAgICAgKENPTVBfRVhUSV9FVkVOVCB8IENPTVBfRVhUSV9SSVNJTkcpICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbiksIG9uIHJpc2luZyBlZGdlICovCisjZGVmaW5lIENPTVBfVFJJR0dFUk1PREVfRVZFTlRfRkFMTElORyAgICAgICAgKENPTVBfRVhUSV9FVkVOVCB8IENPTVBfRVhUSV9GQUxMSU5HKSAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgdHJpZ2dlcmluZyBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSBldmVudCBvbmx5ICh3aXRob3V0IGludGVycnVwdGlvbiksIG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBDT01QX1RSSUdHRVJNT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HIChDT01QX0VYVElfRVZFTlQgfCBDT01QX0VYVElfUklTSU5HIHwgQ09NUF9FWFRJX0ZBTExJTkcpICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IHRyaWdnZXJpbmcgRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgZXZlbnQgb25seSAod2l0aG91dCBpbnRlcnJ1cHRpb24pLCBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9NYWNyb3MgQ09NUCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfSGFuZGxlX01hbmFnZW1lbnQgIENPTVAgSGFuZGxlIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBDT01QIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfQ09NUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgQ09NUCBlcnJvciBjb2RlIChzZXQgaXQgdG8gbm8gZXJyb3IgY29kZSAiSEFMX0NPTVBfRVJST1JfTk9ORSIpLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIENPTVBfQ0xFQVJfRVJST1JDT0RFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkVycm9yQ29kZSA9IEhBTF9DT01QX0VSUk9SX05PTkUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfRU4pCisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIFVzaW5nIHRoaXMgbWFjcm8gaW5kdWNlIEhBTCBDT01QIGhhbmRsZSBzdGF0ZSBtYWNoaW5lIGJlaW5nIG5vCisgICogICAgICAgICBtb3JlIGluIGxpbmUgd2l0aCBDT01QIGluc3RhbmNlIHN0YXRlLgorICAqICAgICAgICAgVG8ga2VlcCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgbWFjaGluZSB1cGRhdGVkLCBpdCBpcyByZWNvbW1lbmRlZAorICAqICAgICAgICAgdG8gdXNlIGZ1bmN0aW9uICJIQUxfQ09NUF9Mb2NrJykiLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9MT0NLKF9fSEFORExFX18pICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9MT0NLKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yIGlzIGxvY2tlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBWYWx1ZSAwIGlmIENPTVAgaW5zdGFuY2UgaXMgbm90IGxvY2tlZCwgdmFsdWUgMSBpZiBDT01QIGluc3RhbmNlIGlzIGxvY2tlZAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0lTX0xPQ0tFRChfX0hBTkRMRV9fKSAgICAgICAgICAgKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNTUiwgQ09NUF9DU1JfTE9DSykgPT0gQ09NUF9DU1JfTE9DSykKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4dGlfTWFuYWdlbWVudCAgQ09NUCBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDEgRVhUSSBsaW5lIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAxX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAxIEVYVEkgbGluZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBDT01QMSBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICBMTF9FWFRJX0dlbmVyYXRlU1dJXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0VOQUJMRV9FVkVOVCgpICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShDT01QX0VYVElfTElORV9DT01QMSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMSBFWFRJIGxpbmUgaW4gZXZlbnQgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMV9FWFRJX0RJU0FCTEVfRVZFTlQoKSAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDEpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQ09NUDEgRVhUSSBsaW5lIGZsYWcgaXMgc2V0LgorICAqIEByZXR2YWwgUkVTRVQgb3IgU0VUCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICBMTF9FWFRJX0lzQWN0aXZlRmxhZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDT01QMSBFWFRJIGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDFfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAxKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgcmlzaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIENPTVAyIEVYVEkgbGluZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ09NUF9DT01QMl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIHJpc2luZyAmIGZhbGxpbmcgZWRnZSB0cmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIENPTVAyIEVYVEkgbGluZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDT01QMiBFWFRJIGxpbmUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfSVQoKSAgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGludGVycnVwdCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfRElTQUJMRV9JVCgpICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhIHNvZnR3YXJlIGludGVycnVwdCBvbiB0aGUgQ09NUDIgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VORVJBVEVfU1dJVCgpICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEoQ09NUF9FWFRJX0xJTkVfQ09NUDIpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ09NUDIgRVhUSSBsaW5lIGluIGV2ZW50IG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NPTVBfQ09NUDJfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKENPTVBfRVhUSV9MSU5FX0NPTVAyKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIENPTVAyIEVYVEkgbGluZSBmbGFnIGlzIHNldC4KKyAgKiBAcmV0dmFsIFJFU0VUIG9yIFNFVAorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfR0VUX0ZMQUcoKSAgICAgICAgICAgICAgTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ09NUDIgRVhUSSBmbGFnLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DT01QX0NPTVAyX0VYVElfQ0xFQVJfRkxBRygpICAgICAgICAgICAgTExfRVhUSV9DbGVhckZsYWdfMF8zMShDT01QX0VYVElfTElORV9DT01QMikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9Qcml2YXRlX0NvbnN0YW50cyBDT01QIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4dGlMaW5lIENPTVAgRVhUSSBMaW5lcworICAqIEB7CisgICovCisjZGVmaW5lIENPTVBfRVhUSV9MSU5FX0NPTVAxICAgICAgICAgICAoTExfRVhUSV9MSU5FXzIwKSAgLyohPCBFWFRJIGxpbmUgMjAgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCAqLworI2RlZmluZSBDT01QX0VYVElfTElORV9DT01QMiAgICAgICAgICAgKExMX0VYVElfTElORV8yMSkgIC8qITwgRVhUSSBsaW5lIDIxIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHRpTGluZSBDT01QIEVYVEkgTGluZXMKKyAgKiBAeworICAqLworI2RlZmluZSBDT01QX0VYVElfSVQgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAgLyohPCBFWFRJIGxpbmUgZXZlbnQgd2l0aCBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0VWRU5UICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVTCkgIC8qITwgRVhUSSBsaW5lIGV2ZW50IG9ubHkgKHdpdGhvdXQgaW50ZXJydXB0aW9uKSAqLworI2RlZmluZSBDT01QX0VYVElfUklTSU5HICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFVMKSAgLyohPCBFWFRJIGxpbmUgZXZlbnQgb24gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgQ09NUF9FWFRJX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjBVTCkgIC8qITwgRVhUSSBsaW5lIGV2ZW50IG9uIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9Qcml2YXRlX01hY3JvcyBDT01QIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0dFVF9FWFRJX0xJTkUgQ09NUCBwcml2YXRlIG1hY3JvcyB0byBnZXQgRVhUSSBsaW5lIGFzc29jaWF0ZWQgd2l0aCBjb21wYXJhdG9ycworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBmb3IgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBzcGVjaWZpZXMgdGhlIENPTVAgaW5zdGFuY2UuCisgICogQHJldHZhbCB2YWx1ZSBvZiBAcmVmIENPTVBfRXh0aUxpbmUKKyAgKi8KKyNkZWZpbmUgQ09NUF9HRVRfRVhUSV9MSU5FKF9fSU5TVEFOQ0VfXykgICAgKCgoX19JTlNUQU5DRV9fKSA9PSBDT01QMSkgPyBDT01QX0VYVElfTElORV9DT01QMSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT01QX0VYVElfTElORV9DT01QMikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9JU19DT01QX0RlZmluaXRpb25zIENPTVAgcHJpdmF0ZSBtYWNyb3MgdG8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycworICAqIEB7CisgICovCisjZGVmaW5lIElTX0NPTVBfV0lORE9XTU9ERShfX1dJTkRPV01PREVfXykgICgoKF9fV0lORE9XTU9ERV9fKSA9PSBDT01QX1dJTkRPV01PREVfRElTQUJMRSkgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dJTkRPV01PREVfXykgPT0gQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OKSAgKQorCisjZGVmaW5lIElTX0NPTVBfUE9XRVJNT0RFKF9fUE9XRVJNT0RFX18pICAgICgoKF9fUE9XRVJNT0RFX18pID09IENPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPV0VSTU9ERV9fKSA9PSBDT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1dFUk1PREVfXykgPT0gQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUikgICkKKworI2RlZmluZSBJU19DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAoKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0lOUFVUX1BMVVNfXykgPT0gQ09NUF9JTlBVVF9QTFVTX0lPMykpCisKKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGNvbXBhcmF0b3IgaW5wdXQgbWludXMgcGFyYW1ldGVycyBhcmUgICAgICAgICAgICovCisvKiAgICAgICB0aGUgc2FtZSBvbiBhbGwgQ09NUCBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSG93ZXZlciwgY29tcGFyYXRvciBpbnN0YW5jZSBrZXB0IGFzIG1hY3JvIHBhcmFtZXRlciBmb3IgICAgICAgICAgICAgKi8KKy8qICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBTVE0zMiBmYW1pbGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0NPTVBfSU5QVVRfTUlOVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfTUlOVVNfXykgKCgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTXzFfMlZSRUZJTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTXzNfNFZSRUZJTlQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPMSkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPMikgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPMykgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPNCkgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBDT01QX0lOUFVUX01JTlVTX0lPNSkpCisKKyNkZWZpbmUgSVNfQ09NUF9IWVNURVJFU0lTKF9fSFlTVEVSRVNJU19fKSAgKCgoX19IWVNURVJFU0lTX18pID09IENPTVBfSFlTVEVSRVNJU19OT05FKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IWVNURVJFU0lTX18pID09IENPTVBfSFlTVEVSRVNJU19MT1cpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IWVNURVJFU0lTX18pID09IENPTVBfSFlTVEVSRVNJU19NRURJVU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IWVNURVJFU0lTX18pID09IENPTVBfSFlTVEVSRVNJU19ISUdIKSkKKworI2RlZmluZSBJU19DT01QX09VVFBVVFBPTChfX1BPTF9fKSAgICAgICAgICAoKChfX1BPTF9fKSA9PSBDT01QX09VVFBVVFBPTF9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTF9fKSA9PSBDT01QX09VVFBVVFBPTF9JTlZFUlRFRCkpCisKKyNkZWZpbmUgSVNfQ09NUF9CTEFOS0lOR1NSQ0UoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBDT01QX0JMQU5LSU5HU1JDX05PTkUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSkgICAgICAgICAgIFwKKyAgIHx8ICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IENPTVBfQkxBTktJTkdTUkNfVElNMl9PQzMpICAgICAgICAgICBcCisgICkKKworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzICovCisvKiAgICAgICBNYWNybyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgc2VyaWVzICovCisjZGVmaW5lIElTX0NPTVBfQkxBTktJTkdTUkNfSU5TVEFOQ0UoX19JTlNUQU5DRV9fLCBfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgIFwKKyAgIChJU19DT01QX0JMQU5LSU5HU1JDRShfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykpCisKKworI2RlZmluZSBJU19DT01QX1RSSUdHRVJNT0RFKF9fTU9ERV9fKSAgICAgICAoKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9OT05FKSAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkcpICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9JVF9GQUxMSU5HKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9JVF9SSVNJTkdfRkFMTElORykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9SSVNJTkcpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9GQUxMSU5HKSAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gQ09NUF9UUklHR0VSTU9ERV9FVkVOVF9SSVNJTkdfRkFMTElORykpCisKKyNkZWZpbmUgSVNfQ09NUF9PVVRQVVRfTEVWRUwoX19PVVRQVVRfTEVWRUxfXykgKCgoX19PVVRQVVRfTEVWRUxfXykgPT0gQ09NUF9PVVRQVVRfTEVWRUxfTE9XKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09VVFBVVF9MRVZFTF9fKSA9PSBDT01QX09VVFBVVF9MRVZFTF9ISUdIKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordm9pZCAgICAgICAgICAgICAgSEFMX0NPTVBfTXNwSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX01zcERlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfUmVnaXN0ZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wLCBIQUxfQ09NUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ09NUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX1VuUmVnaXN0ZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wLCBIQUxfQ09NUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfU3RhcnQoQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdG9wKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordm9pZCAgICAgICAgICAgICAgSEFMX0NPTVBfSVJRSGFuZGxlcihDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfTG9jayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyogQ2FsbGJhY2sgaW4gaW50ZXJydXB0IG1vZGUgKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjayhDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworSEFMX0NPTVBfU3RhdGVUeXBlRGVmIEhBTF9DT01QX0dldFN0YXRlKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOwordWludDMyX3QgICAgICAgICAgICAgIEhBTF9DT01QX0dldEVycm9yKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfQ09NUF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9jb25mX3RlbXBsYXRlLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9jb25mX3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNmViOQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2NvbmZfdGVtcGxhdGUuaApAQCAtMCwwICsxLDM1MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfY29uZi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgY29uZmlndXJhdGlvbiBmaWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9DT05GX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9DT05GX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1vZHVsZSBTZWxlY3Rpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKioKKyAgKiBAYnJpZWYgVGhpcyBpcyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRvIGJlIHVzZWQgaW4gdGhlIEhBTCBkcml2ZXIKKyAgKi8KKyNkZWZpbmUgSEFMX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9BRENfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfQ1JDX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0VYVElfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9HUElPX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9IU0VNX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0lQQ0NfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX0xDRF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1BDRF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfUEtBX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9QV1JfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1FTUElfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1JDQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfUk5HX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1NBSV9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfU1BJX01PRFVMRV9FTkFCTEVECisjZGVmaW5lIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorI2RlZmluZSBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQKKyNkZWZpbmUgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKKworI2RlZmluZSBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAwdQorI2RlZmluZSBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAwdQorI2RlZmluZSBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAwdQorI2RlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAwdQorI2RlZmluZSBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgMHUKKyNkZWZpbmUgVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgICAwdQorI2RlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICAgICAgIDB1CisjZGVmaW5lIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgICAgICAwdQorI2RlZmluZSBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgMHUKKyNkZWZpbmUgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyAgICAgIDB1CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE9zY2lsbGF0b3IgVmFsdWVzIGFkYXB0YXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyoqCisgICogQGJyaWVmIEFkanVzdCB0aGUgdmFsdWUgb2YgRXh0ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0UpIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbi4KKyAgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBSQ0MgSEFMIG1vZHVsZSB0byBjb21wdXRlIHRoZSBzeXN0ZW0gZnJlcXVlbmN5CisgICogICAgICAgICh3aGVuIEhTRSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UsIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIFBMTCkuCisgICovCisKKyNpZiAhZGVmaW5lZCAgKEhTRV9WQUxVRSkKKyAgI2RlZmluZSBIU0VfVkFMVUUgICAgKDMyMDAwMDAwVUwpIC8qITwgVmFsdWUgb2YgdGhlIEV4dGVybmFsIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBIU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoSFNFX1NUQVJUVVBfVElNRU9VVCkKKyAgI2RlZmluZSBIU0VfU1RBUlRVUF9USU1FT1VUICAgICgxMDBVTCkgICAvKiE8IFRpbWUgb3V0IGZvciBIU0Ugc3RhcnQgdXAsIGluIG1zICovCisjZW5kaWYgLyogSFNFX1NUQVJUVVBfVElNRU9VVCAqLworCisvKioKKyAgKiBAYnJpZWYgSW50ZXJuYWwgTXVsdGlwbGUgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IE1TSSByYW5nZSB2YWx1ZSBhZnRlciBSZXNldC4KKyAgKi8KKyNpZiAhZGVmaW5lZCAgKE1TSV9WQUxVRSkKKyAgI2RlZmluZSBNU0lfVkFMVUUgICAgKDQwMDAwMDBVTCkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogTVNJX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgdmFsdWUuCisgICogICAgICAgIFRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgUkNDIEhBTCBtb2R1bGUgdG8gY29tcHV0ZSB0aGUgc3lzdGVtIGZyZXF1ZW5jeQorICAqICAgICAgICAod2hlbiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBQTEwpLgorICAqLworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorICAjZGVmaW5lIEhTSV9WQUxVRSAgICAoMTYwMDAwMDBVTCkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogSFNJX1ZBTFVFICovCisKKy8qKgorICAqIEBicmllZiBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJMSkgdmFsdWUuCisgICovCisjaWYgIWRlZmluZWQgIChMU0kxX1ZBTFVFKSAKKyAjZGVmaW5lIExTSTFfVkFMVUUgICgzMjAwMFVMKSAgICAgICAvKiE8IExTSTEgVHlwaWNhbCBWYWx1ZSBpbiBIeiovCisjZW5kaWYgLyogTFNJMV9WQUxVRSAqLyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFZhbHVlIG9mIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciBpbiBIegorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYWwgdmFsdWUgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4qLworLyoqCisgICogQGJyaWVmIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kyKSB2YWx1ZS4KKyAgKi8KKyNpZiAhZGVmaW5lZCAgKExTSTJfVkFMVUUpIAorICNkZWZpbmUgTFNJMl9WQUxVRSAgKDMyMDAwVUwpICAgICAgIC8qITwgTFNJMiBUeXBpY2FsIFZhbHVlIGluIEh6Ki8KKyNlbmRpZiAvKiBMU0kyX1ZBTFVFICovICAgICAgICAgICAgICAgICAgICAgIC8qITwgVmFsdWUgb2YgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIGluIEh6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhbCB2YWx1ZSBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHZhcmlhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlLiovCisKKy8qKgorICAqIEBicmllZiBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKSB2YWx1ZS4KKyAgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBVQVJULCBSVEMgSEFMIG1vZHVsZSB0byBjb21wdXRlIHRoZSBzeXN0ZW0gZnJlcXVlbmN5CisgICovCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisgICNkZWZpbmUgTFNFX1ZBTFVFICAgICgzMjc2OFVMKSAvKiE8IFZhbHVlIG9mIHRoZSBFeHRlcm5hbCBvc2NpbGxhdG9yIGluIEh6Ki8KKyNlbmRpZiAvKiBMU0VfVkFMVUUgKi8KKworLyoqCisgICogQGJyaWVmIEludGVybmFsIE11bHRpcGxlIFNwZWVkIG9zY2lsbGF0b3IgKEhTSTQ4KSBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICBUaGlzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IEhTSTQ4IHJhbmdlIHZhbHVlIGFmdGVyIFJlc2V0LgorICAqLworI2lmICFkZWZpbmVkIChIU0k0OF9WQUxVRSkKKyAgI2RlZmluZSBIU0k0OF9WQUxVRSAgICAoNDgwMDAwMDBVTCkgLyohPCBWYWx1ZSBvZiB0aGUgSW50ZXJuYWwgb3NjaWxsYXRvciBpbiBIeiovCisjZW5kaWYgLyogSFNJNDhfVkFMVUUgKi8KKyAgIAorI2lmICFkZWZpbmVkIChMU0VfU1RBUlRVUF9USU1FT1VUKQorICAjZGVmaW5lIExTRV9TVEFSVFVQX1RJTUVPVVQgICAgKDUwMDBVTCkgICAvKiE8IFRpbWUgb3V0IGZvciBMU0Ugc3RhcnQgdXAsIGluIG1zICovCisjZW5kaWYgLyogTFNFX1NUQVJUVVBfVElNRU9VVCAqLworCisvKioKKyAgKiBAYnJpZWYgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBTQUkxIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBSQ0MgSEFMIG1vZHVsZSB0byBjb21wdXRlIHRoZSBTQUkxICYgU0FJMiBjbG9jayBzb3VyY2UgCisgICogICAgICAgIGZyZXF1ZW5jeS4KKyAgKi8KKyNpZiAhZGVmaW5lZCAoRVhURVJOQUxfU0FJMV9DTE9DS19WQUxVRSkKKyAgI2RlZmluZSBFWFRFUk5BTF9TQUkxX0NMT0NLX1ZBTFVFICAgICg0ODAwMFVMKSAvKiE8IFZhbHVlIG9mIHRoZSBTQUkxIEV4dGVybmFsIGNsb2NrIHNvdXJjZSBpbiBIeiovCisjZW5kaWYgLyogRVhURVJOQUxfU0FJMV9DTE9DS19WQUxVRSAqLworCisvKiBUaXA6IFRvIGF2b2lkIG1vZGlmeWluZyB0aGlzIGZpbGUgZWFjaCB0aW1lIHlvdSBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgSFNFLAorICAgPT09ICB5b3UgY2FuIGRlZmluZSB0aGUgSFNFIHZhbHVlIGluIHlvdXIgdG9vbGNoYWluIGNvbXBpbGVyIHByZXByb2Nlc3Nvci4gKi8KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFN5c3RlbSBDb25maWd1cmF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KKy8qKgorICAqIEBicmllZiBUaGlzIGlzIHRoZSBIQUwgc3lzdGVtIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgorICAqLworI2RlZmluZSAgVkREX1ZBTFVFICAgICAgICAgICAgICAgICAgICAoMzMwMFVMKSAvKiE8IFZhbHVlIG9mIFZERCBpbiBtdiAqLworI2RlZmluZSAgVElDS19JTlRfUFJJT1JJVFkgICAgICAgICAgICAoKDFVTDw8X19OVklDX1BSSU9fQklUUykgLSAxVUwpIC8qITwgdGljayBpbnRlcnJ1cHQgcHJpb3JpdHkgKGxvd2VzdCBieSBkZWZhdWx0KSAqLworI2RlZmluZSAgVVNFX1JUT1MgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICBQUkVGRVRDSF9FTkFCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgIElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSAgICAgMQorI2RlZmluZSAgREFUQV9DQUNIRV9FTkFCTEUgICAgICAgICAgICAxCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEFzc2VydCBTZWxlY3Rpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisvKioKKyAgKiBAYnJpZWYgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGV4cGFuc2UgdGhlICJhc3NlcnRfcGFyYW0iIG1hY3JvIGluIHRoZQorICAqICAgICAgICBIQUwgZHJpdmVycyBjb2RlCisgICovCisvKiAjZGVmaW5lIFVTRV9GVUxMX0FTU0VSVCAgICAxICovCisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyBTUEkgcGVyaXBoZXJhbCBjb25maWd1cmF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCisKKy8qIENSQyBGRUFUVVJFOiBVc2UgdG8gYWN0aXZhdGUgQ1JDIGZlYXR1cmUgaW5zaWRlIEhBTCBTUEkgRHJpdmVyCisgKiBBY3RpdmF0ZWQ6IENSQyBjb2RlIGlzIHByZXNlbnQgaW5zaWRlIGRyaXZlcgorICogRGVhY3RpdmF0ZWQ6IENSQyBjb2RlIGNsZWFuZWQgZnJvbSBkcml2ZXIKKyAqLworCisjZGVmaW5lIFVTRV9TUElfQ1JDICAgICAgICAgICAgICAgICAgIDFVCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAgKiBAYnJpZWYgSW5jbHVkZSBtb2R1bGUncyBoZWFkZXIgZmlsZQorICAqLworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZG1hLmgiCisjZW5kaWYgLyogSEFMX0RNQV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9hZGMuaCIKKyNlbmRpZiAvKiBIQUxfQURDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQ09NUF9NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9jb21wLmgiCisjZW5kaWYgLyogSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfY29ydGV4LmgiCisjZW5kaWYgLyogSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9jcmMuaCIKKyNlbmRpZiAvKiBIQUxfQ1JDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9jcnlwLmgiCisjZW5kaWYgLyogSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9FWFRJX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMndieHhfaGFsX2V4dGkuaCIKKyNlbmRpZiAvKiBIQUxfRVhUSV9NT0RVTEVfRU5BQkxFRCAqLworICAgCisjaWZkZWYgSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMndieHhfaGFsX2ZsYXNoLmgiCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9ncGlvLmgiCisjZW5kaWYgLyogSEFMX0dQSU9fTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9IU0VNX01PRFVMRV9FTkFCTEVECisgICNpbmNsdWRlICJzdG0zMndieHhfaGFsX2hzZW0uaCIKKyNlbmRpZiAvKiBIQUxfSFNFTV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0kyQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMndieHhfaGFsX2kyYy5oIgorI2VuZGlmIC8qIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9JUENDX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfaXBjYy5oIgorI2VuZGlmIC8qIEhBTF9JUENDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMndieHhfaGFsX2lyZGEuaCIKKyNlbmRpZiAvKiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9pd2RnLmgiCisjZW5kaWYgLyogSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9MQ0RfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9sY2QuaCIKKyNlbmRpZiAvKiBIQUxfTENEX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfbHB0aW0uaCIKKyNlbmRpZiAvKiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9QQ0RfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcGNkLmgiCisjZW5kaWYgLyogSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1BLQV9NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9wa2EuaCIKKyNlbmRpZiAvKiBIQUxfUEtBX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcHdyLmgiCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1FTUElfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9xc3BpLmgiCisjZW5kaWYgLyogSEFMX1FTUElfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKyAgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcmNjLmgiCisjZW5kaWYgLyogSEFMX1JDQ19NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1JOR19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9ybmcuaCIKKyNlbmRpZiAvKiBIQUxfUk5HX01PRFVMRV9FTkFCTEVEICovCisgICAgCisjaWZkZWYgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMndieHhfaGFsX3J0Yy5oIgorI2VuZGlmIC8qIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9TQUlfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9zYWkuaCIKKyNlbmRpZiAvKiBIQUxfU0FJX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfU01BUlRDQVJEX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfc21hcnRjYXJkLmgiCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1NNQlVTX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfc21idXMuaCIKKyNlbmRpZiAvKiBIQUxfU01CVVNfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9TUElfTU9EVUxFX0VOQUJMRUQKKyAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9zcGkuaCIKKyNlbmRpZiAvKiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfdGltLmgiCisjZW5kaWYgLyogSEFMX1RJTV9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1RTQ19NT0RVTEVfRU5BQkxFRAorICAjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF90c2MuaCIKKyNlbmRpZiAvKiBIQUxfVFNDX01PRFVMRV9FTkFCTEVEICovCisKKyNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorICNpbmNsdWRlICJzdG0zMndieHhfaGFsX3VhcnQuaCIKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfdXNhcnQuaCIKKyNlbmRpZiAvKiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworI2lmZGVmIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVECisgI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfd3dkZy5oIgorI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorLyoqCisgICogQGJyaWVmICBUaGUgYXNzZXJ0X3BhcmFtIG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBjaGVjay4KKyAgKiBAcGFyYW0gZXhwciBJZiBleHByIGlzIGZhbHNlLCBpdCBjYWxscyBhc3NlcnRfZmFpbGVkIGZ1bmN0aW9uCisgICogICAgICAgICB3aGljaCByZXBvcnRzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIHNvdXJjZQorICAqICAgICAgICAgbGluZSBudW1iZXIgb2YgdGhlIGNhbGwgdGhhdCBmYWlsZWQuCisgICogICAgICAgICBJZiBleHByIGlzIHRydWUsIGl0IHJldHVybnMgbm8gdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisgICNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgoZXhwcikgPyAodm9pZCkwVSA6IGFzc2VydF9mYWlsZWQoKHVpbnQ4X3QgKilfX0ZJTEVfXywgX19MSU5FX18pKQorLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgdm9pZCBhc3NlcnRfZmFpbGVkKHVpbnQ4X3QqIGZpbGUsIHVpbnQzMl90IGxpbmUpOworI2Vsc2UKKyAgI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmIC8qIFVTRV9GVUxMX0FTU0VSVCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9DT05GX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2NvcnRleC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfY29ydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NmIwOAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2NvcnRleC5oCkBAIC0wLDAgKzEsNDIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jb3J0ZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09SVEVYIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9DT1JURVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0NPUlRFWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKyNpbmNsdWRlICJzdG0zMndiNTV4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWCBDT1JURVgKKyAgKiBAYnJpZWYgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX1R5cGVzIENPUlRFWCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9Jbml0aWFsaXphdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBNUFUgUmVnaW9uIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBEZWZpbml0aW9uCisgICogQGJyaWVmICBNUFUgUmVnaW9uIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSAKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBFbmFibGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fRW5hYmxlICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgTnVtYmVyOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fTnVtYmVyICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90IEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdWludDhfdCBTaXplOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSByZWdpb24gdG8gcHJvdGVjdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9SZWdpb25fU2l6ZSAgICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgU3ViUmVnaW9uRGlzYWJsZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBzdWJyZWdpb24gcHJvdGVjdGlvbiB0byBkaXNhYmxlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICAgKi8KKyAgdWludDhfdCBUeXBlRXh0RmllbGQ7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBURVggZmllbGQgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09SVEVYX01QVV9URVhfTGV2ZWxzICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQ4X3QgQWNjZXNzUGVybWlzc2lvbjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcmVnaW9uIGFjY2VzcyBwZXJtaXNzaW9uIHR5cGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfUmVnaW9uX1Blcm1pc3Npb25fQXR0cmlidXRlcyAqLworICB1aW50OF90IERpc2FibGVFeGVjOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGluc3RydWN0aW9uIGFjY2VzcyBzdGF0dXMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfSW5zdHJ1Y3Rpb25fQWNjZXNzICAgICAgICAgICAqLworICB1aW50OF90IElzU2hhcmVhYmxlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNoYXJlYWJpbGl0eSBzdGF0dXMgb2YgdGhlIHByb3RlY3RlZCByZWdpb24uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX1NoYXJlYWJsZSAgICAgICAgICAgICAqLworICB1aW50OF90IElzQ2FjaGVhYmxlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNhY2hlYWJsZSBzdGF0dXMgb2YgdGhlIHJlZ2lvbiBwcm90ZWN0ZWQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPUlRFWF9NUFVfQWNjZXNzX0NhY2hlYWJsZSAgICAgICAgICAgICAqLworICB1aW50OF90IElzQnVmZmVyYWJsZTsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGJ1ZmZlcmFibGUgc3RhdHVzIG9mIHRoZSBwcm90ZWN0ZWQgcmVnaW9uLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlICAgICAgICAgICAgKi8KK31NUFVfUmVnaW9uX0luaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0NvbnN0YW50cyBDT1JURVggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX1ByZWVtcHRpb25fUHJpb3JpdHlfR3JvdXAgQ09SVEVYIFByZWVtcHRpb24gUHJpb3JpdHkgR3JvdXAKKyAgKiBAeworICAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMCAgICAgICAgICgweDAwMDAwMDA3VSkgLyohPCAwIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJpdHMgZm9yIHN1YnByaW9yaXR5ICovCisjZGVmaW5lIE5WSUNfUFJJT1JJVFlHUk9VUF8xICAgICAgICAgKDB4MDAwMDAwMDZVKSAvKiE8IDEgYml0ICBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgYml0cyBmb3Igc3VicHJpb3JpdHkgKi8KKyNkZWZpbmUgTlZJQ19QUklPUklUWUdST1VQXzIgICAgICAgICAoMHgwMDAwMDAwNVUpIC8qITwgMiBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBiaXRzIGZvciBzdWJwcmlvcml0eSAqLworI2RlZmluZSBOVklDX1BSSU9SSVRZR1JPVVBfMyAgICAgICAgICgweDAwMDAwMDA0VSkgLyohPCAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGJpdCAgZm9yIHN1YnByaW9yaXR5ICovCisjZGVmaW5lIE5WSUNfUFJJT1JJVFlHUk9VUF80ICAgICAgICAgKDB4MDAwMDAwMDNVKSAvKiE8IDQgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYml0ICBmb3Igc3VicHJpb3JpdHkgKi8KKy8qKgorICAqIEB9CisgICovICAKKworLyoqIEBkZWZncm91cCBDT1JURVhfU3lzVGlja19jbG9ja19zb3VyY2UgQ09SVEVYIFN5c1RpY2sgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4ICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEsgICAgICAgICAgICAweDAwMDAwMDA0VQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgKF9fTVBVX1BSRVNFTlQgPT0gMSkKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9IRk5NSV9QUklWREVGX0NvbnRyb2wgQ09SVEVYIE1QVSBIRk5NSSBhbmQgUFJJVklMRUdFRCBBY2Nlc3MgY29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfSEZOTUlfUFJJVkRFRl9OT05FICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSAgTVBVX0hBUkRGQVVMVF9OTUkgICAgICAgICAgICAgICAgKE1QVV9DVFJMX0hGTk1JRU5BX01zaykKKyNkZWZpbmUgIE1QVV9QUklWSUxFR0VEX0RFRkFVTFQgICAgICAgICAgIChNUFVfQ1RSTF9QUklWREVGRU5BX01zaykKKyNkZWZpbmUgIE1QVV9IRk5NSV9QUklWREVGICAgICAgICAgICAgICAgIChNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgfCBNUFVfQ1RSTF9QUklWREVGRU5BX01zaykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fRW5hYmxlIENPUlRFWCBNUFUgUmVnaW9uIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfUkVHSU9OX0VOQUJMRSAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fRElTQUJMRSAgICAgICAgICAgICAgICgodWludDhfdCkweDAwKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0luc3RydWN0aW9uX0FjY2VzcyBDT1JURVggTVBVIEluc3RydWN0aW9uIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgIE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRSAgICgodWludDhfdCkweDAxKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19TaGFyZWFibGUgQ09SVEVYIE1QVSBJbnN0cnVjdGlvbiBBY2Nlc3MgU2hhcmVhYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9BQ0NFU1NfU0hBUkVBQkxFICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSAgTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFICAgICAgICAgKCh1aW50OF90KTB4MDApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfQWNjZXNzX0NhY2hlYWJsZSBDT1JURVggTVBVIEluc3RydWN0aW9uIEFjY2VzcyBDYWNoZWFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19DQUNIRUFCTEUgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9DQUNIRUFCTEUgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICAqIEB9CisgICovCisgIAorLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX0FjY2Vzc19CdWZmZXJhYmxlIENPUlRFWCBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzIEJ1ZmZlcmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX0FDQ0VTU19CVUZGRVJBQkxFICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lICBNUFVfQUNDRVNTX05PVF9CVUZGRVJBQkxFICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9URVhfTGV2ZWxzIENPUlRFWCBNUFUgVEVYIExldmVscworICAqIEB7CisgICovCisjZGVmaW5lICBNUFVfVEVYX0xFVkVMMCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMCkKKyNkZWZpbmUgIE1QVV9URVhfTEVWRUwxICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKQorI2RlZmluZSAgTVBVX1RFWF9MRVZFTDIgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDIpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9NUFVfUmVnaW9uX1NpemUgQ09SVEVYIE1QVSBSZWdpb24gU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzMyQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNjRCICAgICAgICAgICAgICgodWludDhfdCkweDA1KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xMjhCICAgICAgICAgICAgKCh1aW50OF90KTB4MDYpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzI1NkIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNTEyQiAgICAgICAgICAgICgodWludDhfdCkweDA4KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8xS0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MDkpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzJLQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwQSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfNEtCICAgICAgICAgICAgICgodWludDhfdCkweDBCKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV84S0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MEMpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzE2S0IgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwRCkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMzJLQiAgICAgICAgICAgICgodWludDhfdCkweDBFKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV82NEtCICAgICAgICAgICAgKCh1aW50OF90KTB4MEYpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzEyOEtCICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMCkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMjU2S0IgICAgICAgICAgICgodWludDhfdCkweDExKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV81MTJLQiAgICAgICAgICAgKCh1aW50OF90KTB4MTIpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzFNQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMk1CICAgICAgICAgICAgICgodWludDhfdCkweDE0KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV80TUIgICAgICAgICAgICAgKCh1aW50OF90KTB4MTUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzhNQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxNikKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTZNQiAgICAgICAgICAgICgodWludDhfdCkweDE3KQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8zMk1CICAgICAgICAgICAgKCh1aW50OF90KTB4MTgpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzY0TUIgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxOSkKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMTI4TUIgICAgICAgICAgICgodWludDhfdCkweDFBKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yNTZNQiAgICAgICAgICAgKCh1aW50OF90KTB4MUIpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzUxMk1CICAgICAgICAgICAoKHVpbnQ4X3QpMHgxQykKKyNkZWZpbmUgICBNUFVfUkVHSU9OX1NJWkVfMUdCICAgICAgICAgICAgICgodWludDhfdCkweDFEKQorI2RlZmluZSAgIE1QVV9SRUdJT05fU0laRV8yR0IgICAgICAgICAgICAgKCh1aW50OF90KTB4MUUpCisjZGVmaW5lICAgTVBVX1JFR0lPTl9TSVpFXzRHQiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxRikKKy8qKgorICAqIEB9CisgICovCisgICAKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX01QVV9SZWdpb25fUGVybWlzc2lvbl9BdHRyaWJ1dGVzIENPUlRFWCBNUFUgUmVnaW9uIFBlcm1pc3Npb24gQXR0cmlidXRlcyAKKyAgKiBAeworICAqLworI2RlZmluZSAgTVBVX1JFR0lPTl9OT19BQ0NFU1MgICAgICAgICAgICAgKCh1aW50OF90KTB4MDApCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUlcgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9SV19VUk8gICAgICAgICAgICgodWludDhfdCkweDAyKQorI2RlZmluZSAgTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUyAgICAgICAgICAgKCh1aW50OF90KTB4MDMpCisjZGVmaW5lICBNUFVfUkVHSU9OX1BSSVZfUk8gICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fUFJJVl9ST19VUk8gICAgICAgICAgICgodWludDhfdCkweDA2KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTVBVX1JlZ2lvbl9OdW1iZXIgQ09SVEVYIE1QVSBSZWdpb24gTnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMCAgICAgICAgICAgICAgICgodWludDhfdCkweDAwKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVIxICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDEpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjIgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSMyAgICAgICAgICAgICAgICgodWludDhfdCkweDAzKQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI0ICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDQpCisjZGVmaW5lICBNUFVfUkVHSU9OX05VTUJFUjUgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkKKyNkZWZpbmUgIE1QVV9SRUdJT05fTlVNQkVSNiAgICAgICAgICAgICAgICgodWludDhfdCkweDA2KQorI2RlZmluZSAgTVBVX1JFR0lPTl9OVU1CRVI3ICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDcpCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX01hY3JvcyBDT1JURVggRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKHVpbnQzMl90IFByaW9yaXR5R3JvdXApOwordm9pZCBIQUxfTlZJQ19TZXRQcmlvcml0eShJUlFuX1R5cGUgSVJRbix1aW50MzJfdCBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90IFN1YlByaW9yaXR5KTsKK3ZvaWQgSEFMX05WSUNfRW5hYmxlSVJRKElSUW5fVHlwZSBJUlFuKTsKK3ZvaWQgSEFMX05WSUNfRGlzYWJsZUlSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX1N5c3RlbVJlc2V0KHZvaWQpOwordWludDMyX3QgSEFMX1NZU1RJQ0tfQ29uZmlnKHVpbnQzMl90IFRpY2tzTnVtYik7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgQ29ydGV4IGNvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmlvcml0eUdyb3VwLCB1aW50MzJfdCogcFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QqIHBTdWJQcmlvcml0eSk7Cit1aW50MzJfdCBIQUxfTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKHZvaWQpOwordWludDMyX3QgSEFMX05WSUNfR2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbik7Cit2b2lkIEhBTF9OVklDX1NldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pOwordm9pZCBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcodWludDMyX3QgQ0xLU291cmNlKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfSVJRSGFuZGxlcih2b2lkKTsKK3ZvaWQgSEFMX1NZU1RJQ0tfQ2FsbGJhY2sodm9pZCk7CisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxVSkKK3ZvaWQgSEFMX01QVV9FbmFibGUodWludDMyX3QgTVBVX0NvbnRyb2wpOwordm9pZCBIQUxfTVBVX0Rpc2FibGUodm9pZCk7Cit2b2lkIEhBTF9NUFVfQ29uZmlnUmVnaW9uKE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgKk1QVV9Jbml0KTsKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT1JURVhfUHJpdmF0ZV9NYWNyb3MgQ09SVEVYIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTlZJQ19QUklPUklUWV9HUk9VUChHUk9VUCkgKCgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdST1VQKSA9PSBOVklDX1BSSU9SSVRZR1JPVVBfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHUk9VUCkgPT0gTlZJQ19QUklPUklUWUdST1VQXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR1JPVVApID09IE5WSUNfUFJJT1JJVFlHUk9VUF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdST1VQKSA9PSBOVklDX1BSSU9SSVRZR1JPVVBfNCkpICAKKworI2RlZmluZSBJU19OVklDX1BSRUVNUFRJT05fUFJJT1JJVFkoUFJJT1JJVFkpICAoKFBSSU9SSVRZKSA8IDB4MTBVKQorCisjZGVmaW5lIElTX05WSUNfU1VCX1BSSU9SSVRZKFBSSU9SSVRZKSAgICAgICAgICgoUFJJT1JJVFkpIDwgMHgxMFUpCisKKyNkZWZpbmUgSVNfTlZJQ19ERVZJQ0VfSVJRKElSUSkgICAgICAgICAgICAgICAgICAgKChJUlEpID4gU3lzVGlja19JUlFuKQorCisjZGVmaW5lIElTX1NZU1RJQ0tfQ0xLX1NPVVJDRShTT1VSQ0UpICAgICAgICAgICAgICgoKFNPVVJDRSkgPT0gU1lTVElDS19DTEtTT1VSQ0VfSENMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEtfRElWOCkpCisKKyNpZiAoX19NUFVfUFJFU0VOVCA9PSAxKQorI2RlZmluZSBJU19NUFVfUkVHSU9OX0VOQUJMRShTVEFURSkgICAgICAgICAgICAgICAoKChTVEFURSkgPT0gTVBVX1JFR0lPTl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9SRUdJT05fRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTUyhTVEFURSkgICAgICAgICAgKCgoU1RBVEUpID09IE1QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBNUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKFNUQVRFKSAgICAgICAgICAgICgoKFNUQVRFKSA9PSBNUFVfQUNDRVNTX1NIQVJFQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfU0hBUkVBQkxFKSkKKworI2RlZmluZSBJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShTVEFURSkgICAgICAgICAgICAoKChTVEFURSkgPT0gTVBVX0FDQ0VTU19DQUNIRUFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IE1QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKFNUQVRFKSAgICAgICAgICAgKCgoU1RBVEUpID09IE1QVV9BQ0NFU1NfQlVGRkVSQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRSkpCisKKyNkZWZpbmUgSVNfTVBVX1RFWF9MRVZFTChUWVBFKSAgICAgICAgICAgICAgICAgICAgKCgoVFlQRSkgPT0gTVBVX1RFWF9MRVZFTDApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9URVhfTEVWRUwxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfVEVYX0xFVkVMMikpCisKKyNkZWZpbmUgSVNfTVBVX1JFR0lPTl9QRVJNSVNTSU9OX0FUVFJJQlVURShUWVBFKSAgKCgoVFlQRSkgPT0gTVBVX1JFR0lPTl9OT19BQ0NFU1MpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUlcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9SV19VUk8pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFlQRSkgPT0gTVBVX1JFR0lPTl9GVUxMX0FDQ0VTUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBNUFVfUkVHSU9OX1BSSVZfUk8pICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IE1QVV9SRUdJT05fUFJJVl9ST19VUk8pKQorCisjZGVmaW5lIElTX01QVV9SRUdJT05fTlVNQkVSKE5VTUJFUikgICAgICAgICAgICAgICgoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5VTUJFUikgPT0gTVBVX1JFR0lPTl9OVU1CRVI3KSkKKworI2RlZmluZSBJU19NUFVfUkVHSU9OX1NJWkUoU0laRSkgICAgICAgICAgICAgICAgICAoKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMzJCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzY0QikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xMjhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMjU2QikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzUxMkIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8xS0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMktCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzRLQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV84S0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTZLQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzMyS0IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV82NEtCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMTI4S0IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzI1NktCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV81MTJLQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfMU1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzJNQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV80TUIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfOE1CKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzE2TUIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8zMk1CKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNjRNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzEyOE1CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yNTZNQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNTEyTUIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gTVBVX1JFR0lPTl9TSVpFXzFHQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IE1QVV9SRUdJT05fU0laRV8yR0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBNUFVfUkVHSU9OX1NJWkVfNEdCKSkKKworI2RlZmluZSBJU19NUFVfU1VCX1JFR0lPTl9ESVNBQkxFKFNVQlJFR0lPTikgICAgICAoKFNVQlJFR0lPTikgPCAodWludDE2X3QpMHgwMEZGVSkKKyNlbmRpZiAvKiBfX01QVV9QUkVTRU5UICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfQ09SVEVYX0ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9jcmMuaCBiL0luYy9zdG0zMndieHhfaGFsX2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9jcmMuaApAQCAtMCwwICsxLDM0NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfY3JjLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSQyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfQ1JDX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9DUkNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9UeXBlcyBDUkMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENSQyBIQUwgU3RhdGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfQ1JDX1NUQVRFX1JFU0VUICAgICA9IDB4MDBVLCAgLyohPCBDUkMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAqLworICBIQUxfQ1JDX1NUQVRFX1JFQURZICAgICA9IDB4MDFVLCAgLyohPCBDUkMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfQ1JDX1NUQVRFX0JVU1kgICAgICA9IDB4MDJVLCAgLyohPCBDUkMgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAqLworICBIQUxfQ1JDX1NUQVRFX1RJTUVPVVQgICA9IDB4MDNVLCAgLyohPCBDUkMgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworICBIQUxfQ1JDX1NUQVRFX0VSUk9SICAgICA9IDB4MDRVICAgLyohPCBDUkMgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfQ1JDX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIENSQyBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IERlZmF1bHRQb2x5bm9taWFsVXNlOyAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsIGFuZCBpbmRpY2F0ZXMgaWYgZGVmYXVsdCBwb2x5bm9taWFsIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFLCByZXNvcnQgdG8gZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yKyBYICsxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGF0IGNhc2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IEdlbmVyYXRpbmdQb2x5bm9taWFsIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBvdGhlcndpc2Ugc2V0IHRvIERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFLCBHZW5lcmF0aW5nUG9seW5vbWlhbCBhbmQgQ1JDTGVuZ3RoIGZpZWxkcyBtdXN0IGJlIHNldC4gKi8KKworICB1aW50OF90IERlZmF1bHRJbml0VmFsdWVVc2U7ICAgICAgICAvKiE8IFRoaXMgcGFyYW1ldGVyIGlzIGEgdmFsdWUgb2YgQHJlZiBDUkNfRGVmYXVsdF9Jbml0VmFsdWVfVXNlIGFuZCBpbmRpY2F0ZXMgaWYgZGVmYXVsdCBpbml0IHZhbHVlIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIERFRkFVTFRfSU5JVF9WQUxVRV9FTkFCTEUsIHJlc29ydCB0byBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRiB2YWx1ZS4gSW4gdGhhdCBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBJbml0VmFsdWUgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb3RoZXJ3aXNlIHNldCB0byBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSwgIEluaXRWYWx1ZSBmaWVsZCBtdXN0IGJlIHNldC4gKi8KKworICB1aW50MzJfdCBHZW5lcmF0aW5nUG9seW5vbWlhbDsgICAgICAvKiE8IFNldCBDUkMgZ2VuZXJhdGluZyBwb2x5bm9taWFsIGFzIGEgNywgOCwgMTYgb3IgMzItYml0IGxvbmcgdmFsdWUgZm9yIGEgcG9seW5vbWlhbCBkZWdyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkgZXF1YWwgdG8gNywgOCwgMTYgb3IgMzIuIFRoaXMgZmllbGQgaXMgd3JpdHRlbiBpbiBub3JtYWwgcmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNywgWF43ICsgWF42ICsgWF41ICsgWF4yICsgMSBpcyB3cml0dGVuIDB4NjUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbmVlZCB0byBzcGVjaWZ5IGl0IGlmIERlZmF1bHRQb2x5bm9taWFsVXNlIGlzIHNldCB0byBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFLiAgICovCisKKyAgdWludDMyX3QgQ1JDTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBhIHZhbHVlIG9mIEByZWYgQ1JDX1BvbHlub21pYWxfU2l6ZXMgYW5kIGluZGljYXRlcyBDUkMgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGNhbiBiZSBlaXRoZXIgb25lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgICAgICgzMi1iaXQgQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfMTZCICAgICAgICAgICAgICAgICAgKDE2LWJpdCBDUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF84QiAgICAgICAgICAgICAgICAgICAoOC1iaXQgQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfN0IgICAgICAgICAgICAgICAgICAgKDctYml0IENSQykuICovCisKKyAgdWludDMyX3QgSW5pdFZhbHVlOyAgICAgICAgICAgICAgICAgLyohPCBJbml0IHZhbHVlIHRvIGluaXRpYXRlIENSQyBjb21wdXRhdGlvbi4gTm8gbmVlZCB0byBzcGVjaWZ5IGl0IGlmIERlZmF1bHRJbml0VmFsdWVVc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQgdG8gREVGQVVMVF9JTklUX1ZBTFVFX0VOQUJMRS4gICAqLworCisgIHVpbnQzMl90IElucHV0RGF0YUludmVyc2lvbk1vZGU7ICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ0V4X0lucHV0X0RhdGFfSW52ZXJzaW9uIGFuZCBzcGVjaWZpZXMgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FICAgICAgIG5vIGlucHV0IGRhdGEgaW52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUgICAgICAgYnl0ZS13aXNlIGludmVyc2lvbiwgMHgxQTJCM0M0RCBiZWNvbWVzIDB4NThENDNDQjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fSEFMRldPUkQgICBoYWxmd29yZC13aXNlIGludmVyc2lvbiwgMHgxQTJCM0M0RCBiZWNvbWVzIDB4RDQ1OEIyM0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fV09SRCAgICAgICB3b3JkLXdpc2UgaW52ZXJzaW9uLCAweDFBMkIzQzREIGJlY29tZXMgMHhCMjNDRDQ1OCAqLworCisgIHVpbnQzMl90IE91dHB1dERhdGFJbnZlcnNpb25Nb2RlOyAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ0V4X091dHB1dF9EYXRhX0ludmVyc2lvbiBhbmQgc3BlY2lmaWVzIG91dHB1dCBkYXRhIChpLmUuIENSQykgaW52ZXJzaW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFICAgbm8gQ1JDIGludmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUgICAgQ1JDIDB4MTEyMjMzNDQgaXMgY29udmVydGVkIGludG8gMHgyMkNDNDQ4OCAqLworfSBDUkNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgQ1JDIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ1JDX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgKi8KKworICBDUkNfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgIC8qITwgQ1JDIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBDUkMgTG9ja2luZyBvYmplY3QgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfQ1JDX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAvKiE8IENSQyBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgKi8KKworICB1aW50MzJfdCBJbnB1dERhdGFGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qITwgVGhpcyBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSBvZiBAcmVmIENSQ19JbnB1dF9CdWZmZXJfRm9ybWF0IGFuZCBzcGVjaWZpZXMgaW5wdXQgZGF0YSBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfRk9STUFUX0JZVEVTICAgICAgIGlucHV0IGRhdGEgaXMgYSBzdHJlYW0gb2YgYnl0ZXMgKDgtYml0IGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMgICBpbnB1dCBkYXRhIGlzIGEgc3RyZWFtIG9mIGhhbGYtd29yZHMgKDE2LWJpdCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFMgICAgICAgaW5wdXQgZGF0YSBpcyBhIHN0cmVhbSBvZiB3b3JkcyAoMzItYml0IGRhdGEpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgY29uc3RhbnQgQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgZGVmaW5lZCBidXQgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IG9jY3VyIGlmIElucHV0QnVmZmVyRm9ybWF0IGlzIG5vdCBvbmUgb2YgdGhlIHRocmVlIHZhbHVlcyBsaXN0ZWQgYWJvdmUgICovCit9IENSQ19IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0NvbnN0YW50cyBDUkMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfRGVmYXVsdF9Qb2x5bm9taWFsX1ZhbHVlICAgIERlZmF1bHQgQ1JDIGdlbmVyYXRpbmcgcG9seW5vbWlhbAorICAqIEB7CisgICovCisjZGVmaW5lIERFRkFVTFRfQ1JDMzJfUE9MWSAgICAgIDB4MDRDMTFEQjdVICAvKiE8ICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yKyBYICsxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19EZWZhdWx0X0luaXRWYWx1ZSAgICBEZWZhdWx0IENSQyBjb21wdXRhdGlvbiBpbml0aWFsaXphdGlvbiB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIERFRkFVTFRfQ1JDX0lOSVRWQUxVRSAgIDB4RkZGRkZGRkZVICAvKiE8IEluaXRpYWwgQ1JDIGRlZmF1bHQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0RlZmF1bHRfUG9seW5vbWlhbCAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZGVmYXVsdCBwb2x5bm9taWFsIGlzIHVzZWQKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFICAgICAgICgodWludDhfdCkweDAwVSkgIC8qITwgRW5hYmxlIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIDB4MDRDMTFEQjcgICovCisjZGVmaW5lIERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFICAgICAgKCh1aW50OF90KTB4MDFVKSAgLyohPCBEaXNhYmxlIGRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIDB4MDRDMTFEQjcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0RlZmF1bHRfSW5pdFZhbHVlX1VzZSAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZGVmYXVsdCBpbml0IHZhbHVlIGlzIHVzZWQKKyAgKiBAeworICAqLworI2RlZmluZSBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFICAgICAgKCh1aW50OF90KTB4MDBVKSAvKiE8IEVuYWJsZSBpbml0aWFsIENSQyBkZWZhdWx0IHZhbHVlICAqLworI2RlZmluZSBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSAgICAgKCh1aW50OF90KTB4MDFVKSAvKiE8IERpc2FibGUgaW5pdGlhbCBDUkMgZGVmYXVsdCB2YWx1ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfUG9seW5vbWlhbF9TaXplcyBQb2x5bm9taWFsIHNpemVzIHRvIGNvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbAorICAqIEB7CisgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzMyQiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFJlc29ydCB0byBhIDMyLWJpdCBsb25nIGdlbmVyYXRpbmcgcG9seW5vbWlhbCAqLworI2RlZmluZSBDUkNfUE9MWUxFTkdUSF8xNkIgICAgICAgICAgICAgICAgICBDUkNfQ1JfUE9MWVNJWkVfMCAgLyohPCBSZXNvcnQgdG8gYSAxNi1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyNkZWZpbmUgQ1JDX1BPTFlMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAgQ1JDX0NSX1BPTFlTSVpFXzEgIC8qITwgUmVzb3J0IHRvIGEgOC1iaXQgbG9uZyBnZW5lcmF0aW5nIHBvbHlub21pYWwgICovCisjZGVmaW5lIENSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRSAgICAvKiE8IFJlc29ydCB0byBhIDctYml0IGxvbmcgZ2VuZXJhdGluZyBwb2x5bm9taWFsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfUG9seW5vbWlhbF9TaXplX0RlZmluaXRpb25zIENSQyBwb2x5bm9taWFsIHBvc3NpYmxlIHNpemVzIGFjdHVhbCBkZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzMyQiAgICAgMzJVICAgICAgICAgIC8qITwgMzItYml0IGxvbmcgQ1JDICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzE2QiAgICAgMTZVICAgICAgICAgIC8qITwgMTYtYml0IGxvbmcgQ1JDICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzhCICAgICAgIDhVICAgICAgICAgIC8qITwgOC1iaXQgbG9uZyBDUkMgICovCisjZGVmaW5lIEhBTF9DUkNfTEVOR1RIXzdCICAgICAgIDdVICAgICAgICAgIC8qITwgNy1iaXQgbG9uZyBDUkMgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19JbnB1dF9CdWZmZXJfRm9ybWF0IElucHV0IEJ1ZmZlciBGb3JtYXQKKyAgKiBAeworICAqLworLyogV0FSTklORzogQ1JDX0lOUFVUX0ZPUk1BVF9VTkRFRklORUQgaXMgY3JlYXRlZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIGJ1dAorICogYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGluIEhBTF9DUkNfSW5pdCgpIGlmIElucHV0RGF0YUZvcm1hdCBmaWVsZCBpcyBzZXQKKyAqIHRvIENSQ19JTlBVVF9GT1JNQVRfVU5ERUZJTkVEOiB0aGUgZm9ybWF0IE1VU1QgYmUgZGVmaW5lZCBieSB0aGUgdXNlciBmb3IKKyAqIHRoZSBDUkMgQVBJcyB0byBwcm92aWRlIGEgY29ycmVjdCByZXN1bHQgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfVU5ERUZJTkVEICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IFVuZGVmaW5lZCBpbnB1dCBkYXRhIGZvcm1hdCAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgSW5wdXQgZGF0YSBpbiBieXRlIGZvcm1hdCAgICAgICovCisjZGVmaW5lIENSQ19JTlBVVERBVEFfRk9STUFUX0hBTEZXT1JEUyAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBJbnB1dCBkYXRhIGluIGhhbGYtd29yZCBmb3JtYXQgKi8KKyNkZWZpbmUgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNVICAvKiE8IElucHV0IGRhdGEgaW4gd29yZCBmb3JtYXQgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfQWxpYXNlcyBDUkMgQVBJIGFsaWFzZXMKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfQ1JDX0lucHV0X0RhdGFfUmV2ZXJzZSAgIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgICAgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UgZm9yIGludGVyIFNUTTMyIHNlcmllcyBjb21wYXRpYmlsaXR5ICAqLworI2RlZmluZSBIQUxfQ1JDX091dHB1dF9EYXRhX1JldmVyc2UgIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlICAgLyohPCBBbGlhc2VkIHRvIEhBTF9DUkNFeF9PdXRwdXRfRGF0YV9SZXZlcnNlIGZvciBpbnRlciBTVE0zMiBzZXJpZXMgY29tcGF0aWJpbGl0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX01hY3JvcyBDUkMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBDUkMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBSZXNldCBDUkMgRGF0YSBSZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DUkNfRFJfUkVTRVQoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IENSQ19DUl9SRVNFVCkKKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIElOSVQgbm9uLWRlZmF1bHQgdmFsdWUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTklUX18gMzItYml0IGluaXRpYWwgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX0lOSVRJQUxDUkNWQUxVRV9DT05GSUcoX19IQU5ETEVfXywgX19JTklUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JTklUID0gKF9fSU5JVF9fKSkKKworLyoqCisgICogQGJyaWVmIFN0b3JlIGRhdGEgaW4gdGhlIEluZGVwZW5kZW50IERhdGEgKElEKSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHBhcmFtIF9fVkFMVUVfXyAgVmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZSBJRCByZWdpc3RlcgorICAqIEBub3RlICBSZWZlciB0byB0aGUgUmVmZXJlbmNlIE1hbnVhbCB0byBnZXQgdGhlIGF1dGhvcml6ZWQgX19WQUxVRV9fIGxlbmd0aCBpbiBiaXRzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19TRVRfSURSKF9fSEFORExFX18sIF9fVkFMVUVfXykgKFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRFIsIChfX1ZBTFVFX18pKSkKKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIEluZGVwZW5kZW50IERhdGEgKElEKSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQG5vdGUgIFJlZmVyIHRvIHRoZSBSZWZlcmVuY2UgTWFudWFsIHRvIGdldCB0aGUgYXV0aG9yaXplZCBfX1ZBTFVFX18gbGVuZ3RoIGluIGJpdHMKKyAgKiBAcmV0dmFsIFZhbHVlIG9mIHRoZSBJRCByZWdpc3RlcgorICAqLworI2RlZmluZSBfX0hBTF9DUkNfR0VUX0lEUihfX0hBTkRMRV9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklEUikgJiBDUkNfSURSX0lEUikKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCAgQ1JDX1ByaXZhdGVfTWFjcm9zIENSQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfREVGQVVMVF9QT0xZTk9NSUFMKERFRkFVTFQpICgoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFRkFVTFQpID09IERFRkFVTFRfUE9MWU5PTUlBTF9ESVNBQkxFKSkKKworCisjZGVmaW5lIElTX0RFRkFVTFRfSU5JVF9WQUxVRShWQUxVRSkgICgoKFZBTFVFKSA9PSBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBERUZBVUxUX0lOSVRfVkFMVUVfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfQ1JDX1BPTF9MRU5HVEgoTEVOR1RIKSAgICAgKCgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF8zMkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF8xNkIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF84QikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVOR1RIKSA9PSBDUkNfUE9MWUxFTkdUSF83QikpCisKKyNkZWZpbmUgSVNfQ1JDX0lOUFVUREFUQV9GT1JNQVQoRk9STUFUKSAgICAgICAgICAgKCgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9XT1JEUykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgQ1JDIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2NyY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNfSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0RlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7Cit2b2lkIEhBTF9DUkNfTXNwRGVJbml0KENSQ19IYW5kbGVUeXBlRGVmICpoY3JjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLwordWludDMyX3QgSEFMX0NSQ19BY2N1bXVsYXRlKENSQ19IYW5kbGVUeXBlRGVmICpoY3JjLCB1aW50MzJfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCk7Cit1aW50MzJfdCBIQUxfQ1JDX0NhbGN1bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX0NSQ19TdGF0ZVR5cGVEZWYgSEFMX0NSQ19HZXRTdGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9DUkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfY3JjX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9jcmNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzMxNzRjCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfY3JjX2V4LmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2NyY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgSEFMIGV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0NSQ19FWF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfQ1JDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9Db25zdGFudHMgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfSW5wdXRfRGF0YV9JbnZlcnNpb24gSW5wdXQgRGF0YSBJbnZlcnNpb24gTW9kZXMKKyAgKiBAeworICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgTm8gaW5wdXQgZGF0YSBpbnZlcnNpb24gICAgICAgICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFICAgICAgICAgICAgICAgQ1JDX0NSX1JFVl9JTl8wIC8qITwgQnl0ZS13aXNlIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9IQUxGV09SRCAgICAgICAgICAgQ1JDX0NSX1JFVl9JTl8xIC8qITwgSGFsZldvcmQtd2lzZSBpbnB1dCBkYXRhIGludmVyc2lvbiAqLworI2RlZmluZSBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9XT1JEICAgICAgICAgICAgICAgQ1JDX0NSX1JFVl9JTiAgIC8qITwgV29yZC13aXNlIGlucHV0IGRhdGEgaW52ZXJzaW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeF9PdXRwdXRfRGF0YV9JbnZlcnNpb24gT3V0cHV0IERhdGEgSW52ZXJzaW9uIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgQ1JDX09VVFBVVERBVEFfSU5WRVJTSU9OX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IE5vIG91dHB1dCBkYXRhIGludmVyc2lvbiAgICAgICAqLworI2RlZmluZSBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFICAgICAgICAgIENSQ19DUl9SRVZfT1VUICAgIC8qITwgQml0LXdpc2Ugb3V0cHV0IGRhdGEgaW52ZXJzaW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9FeHBvcnRlZF9NYWNyb3MgQ1JDIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IENSQyBvdXRwdXQgcmV2ZXJzYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSAgX19IQUxfQ1JDX09VVFBVVFJFVkVSU0FMX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gQ1JDX0NSX1JFVl9PVVQpCisKKy8qKgorICAqIEBicmllZiAgVW5zZXQgQ1JDIG91dHB1dCByZXZlcnNhbAorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0NSQ19PVVRQVVRSRVZFUlNBTF9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KENSQ19DUl9SRVZfT1VUKSkKKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIG5vbi1kZWZhdWx0IHBvbHlub21pYWwKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgX19QT0xZTk9NSUFMX18gNywgOCwgMTYgb3IgMzItYml0IHBvbHlub21pYWwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQ1JDX1BPTFlOT01JQUxfQ09ORklHKF9fSEFORExFX18sIF9fUE9MWU5PTUlBTF9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UE9MID0gKF9fUE9MWU5PTUlBTF9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNFeF9Qcml2YXRlX01hY3JvcyBDUkMgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NSQ19JTlBVVERBVEFfSU5WRVJTSU9OX01PREUoTU9ERSkgICAgICgoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX05PTkUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0JZVEUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0hBTEZXT1JEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX1dPUkQpKQorCisjZGVmaW5lIElTX0NSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9NT0RFKE1PREUpICAgICgoKE1PREUpID09IENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IENSQ19PVVRQVVREQVRBX0lOVkVSU0lPTl9FTkFCTEUpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgUG9sLCB1aW50MzJfdCBQb2x5TGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IElucHV0UmV2ZXJzZU1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ0V4X091dHB1dF9EYXRhX1JldmVyc2UoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IE91dHB1dFJldmVyc2VNb2RlKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfQ1JDX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2NyeXAuaCBiL0luYy9zdG0zMndieHhfaGFsX2NyeXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE2MzZmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfY3J5cC5oCkBAIC0wLDAgKzEsNjI3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jcnlwLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSWVAgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0NSWVBfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0NSWVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUCBDUllQCisgICogQGJyaWVmIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX1R5cGVzIENSWVAgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ1JZUCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IERhdGFUeXBlOyAgICAgICAgICAgICAgICAgICAvKiE8IDMyLWJpdCBkYXRhLCAxNi1iaXQgZGF0YSwgOC1iaXQgZGF0YSBvciAxLWJpdCBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDUllQX0RhdGFfVHlwZSAqLworICB1aW50MzJfdCBLZXlTaXplOyAgICAgICAgICAgICAgICAgICAgLyohPCBVc2VkIG9ubHkgaW4gQUVTIG1vZGUgOiAxMjgsIDE5MiBvciAyNTYgYml0IGtleSBsZW5ndGggaW4gQ1JZUDEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4IG9yIDI1NiBiaXQga2V5IGxlbmd0aCBpbiBUaW55QUVTIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9LZXlfU2l6ZSAqLworICB1aW50MzJfdCAqcEtleTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiAqLworICB1aW50MzJfdCAqcEluaXRWZWN0OyAgICAgICAgICAgICAgICAgLyohPCBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHVzZWQgYWxzbyBhcyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyIGluIENUUiBtb2RlICovCisgIHVpbnQzMl90IEFsZ29yaXRobTsgICAgICAgICAgICAgICAgICAvKiE8ICBERVMvIFRERVMgQWxnb3JpdGhtIEVDQi9DQkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVMgQWxnb3JpdGhtIEVDQi9DQkMvQ1RSL0dDTSBvciBDQ00KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfQWxnb3JpdGhtX01vZGUgKi8KKyAgdWludDMyX3QgKkhlYWRlcjsgICAgICAgICAgICAgICAgICAgIC8qITwgdXNlZCBvbmx5IGluIEFFUyBHQ00gYW5kIENDTSBBbGdvcml0aG0gZm9yIGF1dGhlbnRpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDTSA6IGFsc28ga25vd24gYXMgQWRkaXRpb25hbCBBdXRoZW50aWNhdGlvbiBEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NNIDogbmFtZWQgQjEgY29tcG9zZWQgb2YgdGhlIGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggYW5kIEFzc29jaWF0ZWQgRGF0YS4gKi8KKyAgdWludDMyX3QgSGVhZGVyU2l6ZTsgICAgICAgICAgICAgICAgIC8qITwgVGhlIHNpemUgb2YgaGVhZGVyIGJ1ZmZlciBpbiB3b3JkICAqLworICB1aW50MzJfdCAqQjA7ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCMCBpcyBmaXJzdCBhdXRoZW50aWNhdGlvbiBibG9jayB1c2VkIG9ubHkgIGluIEFFUyBDQ00gbW9kZSAqLworICB1aW50MzJfdCBEYXRhV2lkdGhVbml0OyAgICAgICAgICAgICAgLyohPCBEYXRhIFdpdGggVW5pdCwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHZhbHVlIG9mIEByZWYgQ1JZUF9EYXRhX1dpZHRoX1VuaXQqLworICB1aW50MzJfdCBLZXlJVkNvbmZpZ1NraXA7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIHNraXAsIHRvIGNvbmZpZyBLZXkgYW5kIEluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIG9ubHkgb25jZSBhbmQgdG8gc2tpcCBjb25maWd1cmF0aW9uIGZvciBjb25zZWN1dGl2ZSBwcm9jZXNzaW5ncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfQ29uZmlndXJhdGlvbl9Ta2lwICovCisKK30gQ1JZUF9Db25maWdUeXBlRGVmOworCisKKy8qKgorICAqIEBicmllZiAgQ1JZUCBTdGF0ZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NSWVBfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgQ1JZUCBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLworICBIQUxfQ1JZUF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBDUllQIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9DUllQX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IENSWVAgQlVTWSwgaW50ZXJuYWwgcHJvY2Vzc2luZyBpcyBvbmdvaW5nICAqLworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisgIEhBTF9DUllQX1NUQVRFX1NVU1BFTkRFRCAgICAgICAgID0gMHgwM1UsICAgLyohPCBDUllQIHN1c3BlbmRlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FICovCit9IEhBTF9DUllQX1NUQVRFVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgSEFMIENSWVAgbW9kZSBzdXNwZW5kIGRlZmluaXRpb25zCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0NSWVBfU1VTUEVORF9OT05FICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBDUllQIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiBub3QgcmVxdWVzdGVkICovCisgIEhBTF9DUllQX1NVU1BFTkQgICAgICAgICAgICAgICAgID0gMHgwMVUgICAgIC8qITwgQ1JZUCBwcm9jZXNzaW5nIHN1c3BlbnNpb24gcmVxdWVzdGVkICAgICAqLworfUhBTF9TdXNwZW5kVHlwZURlZjsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKworLyoqCisgICogQGJyaWVmICBDUllQIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgQUVTX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAvKiE8IEFFUyBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKworICBDUllQX0NvbmZpZ1R5cGVEZWYgICAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBDUllQIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KKworICBGdW5jdGlvbmFsU3RhdGUgICAgICAgICAgICAgICAgICAgQXV0b0tleURlcml2YXRpb247ICAgLyohPCBVc2VkIG9ubHkgaW4gVGlueUFFUyB0byBhbGxvdyB0byBieXBhc3Mgb3Igbm90IGtleSB3cml0ZS11cCBiZWZvcmUgZGVjcnlwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEVOQUJMRS9ESVNBQkxFICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ3J5cEluQnVmZlB0cjsgIC8qITwgUG9pbnRlciB0byBDUllQIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24sIGRlY3J5cHRpb24sLi4uKSBidWZmZXIgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDcnlwT3V0QnVmZlB0cjsgLyohPCBQb2ludGVyIHRvIENSWVAgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwuLi4pIGJ1ZmZlciAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwSGVhZGVyQ291bnQ7ICAgLyohPCBDb3VudGVyIG9mIGhlYWRlciBkYXRhICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBJbkNvdW50OyAgICAgIC8qITwgQ291bnRlciBvZiBpbnB1dCBkYXRhICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBPdXRDb3VudDsgICAgIC8qITwgQ291bnRlciBvZiBvdXRwdXQgZGF0YSAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAvKiE8IGxlbmd0aCBvZiBpbnB1dCBkYXRhIGluIHdvcmRzICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIFBoYXNlOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHBoYXNlICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1haW47ICAgICAgICAgIC8qITwgQ1JZUCBJbiBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWFvdXQ7ICAgICAgICAgLyohPCBDUllQIE91dCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBDUllQIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyAgSEFMX0NSWVBfU1RBVEVUeXBlRGVmICAgICAgIFN0YXRlOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGVycm9yIGNvZGUgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SVZDb25maWc7ICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGZsYWcsIHVzZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGNhbiBiZSBza2lwcGVkICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVzU3VtOyAgICAgICAgIC8qITwgU3VtIG9mIHN1Y2Nlc3NpdmUgcGF5bG9hZHMgbGVuZ3RocyAoaW4gYnl0ZXMpLCBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgc2luZ2xlIHNpZ25hdHVyZSBjb21wdXRhdGlvbiBhZnRlciBzZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzIHByb2Nlc3NpbmcgKi8KKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICB2b2lkICgqSW5DcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAgIC8qITwgQ1JZUCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKk91dENwbHRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgICAvKiE8IENSWVAgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCpFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgICAgICAgLyohPCBDUllQIEVycm9yIGNhbGxiYWNrICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAvKiE8IENSWVAgTXNwIEluaXQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgLyohPCBDUllQIE1zcCBEZUluaXQgY2FsbGJhY2sgICovCisKKyNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisKKyAgX19JTyBIQUxfU3VzcGVuZFR5cGVEZWYgICAgIFN1c3BlbmRSZXF1ZXN0OyAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBzdXNwZW5zaW9uIHJlcXVlc3QgZmxhZyAqLworCisgIENSWVBfQ29uZmlnVHlwZURlZiAgICAgICAgICBJbml0X3NhdmVkOyAgICAgICAgICAgICAgLyohPCBjb3B5IG9mIENSWVAgcmVxdWlyZWQgcGFyYW1ldGVycyB3aGVuIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICpwQ3J5cEluQnVmZlB0cl9zYXZlZDsgICAvKiE8IGNvcHkgb2YgQ1JZUCBpbnB1dCBwb2ludGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgKnBDcnlwT3V0QnVmZlB0cl9zYXZlZDsgIC8qITwgY29weSBvZiBDUllQIG91dHB1dCBwb2ludGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgQ3J5cEluQ291bnRfc2F2ZWQ7ICAgICAgIC8qITwgY29weSBvZiBDUllQIGlucHV0IGRhdGEgY291bnRlciB3aGVuIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIENyeXBPdXRDb3VudF9zYXZlZDsgICAgICAvKiE8IGNvcHkgb2YgQ1JZUCBvdXRwdXQgZGF0YSBjb3VudGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgUGhhc2Vfc2F2ZWQ7ICAgICAgICAgICAgIC8qITwgY29weSBvZiBDUllQIGF1dGhlbnRpY2F0aW9uIHBoYXNlIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICBfX0lPIEhBTF9DUllQX1NUQVRFVHlwZURlZiAgU3RhdGVfc2F2ZWQ7ICAgICAgICAgICAgIC8qITwgY29weSBvZiBDUllQIHBlcmlwaGVyYWwgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBJVl9zYXZlZFs0XTsgICAgICAgICAgICAgLyohPCBjb3B5IG9mIEluaXRpYWxpc2F0aW9uIFZlY3RvciByZWdpc3RlcnMgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgU1VTUHhSX3NhdmVkWzhdOyAgICAgICAgIC8qITwgY29weSBvZiBzdXNwZW5zaW9uIHJlZ2lzdGVycyAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBDUl9zYXZlZDsgICAgICAgICAgICAgICAgLyohPCBjb3B5IG9mIENSWVAgY29udHJvbCByZWdpc3RlciAgd2hlbiBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIEtleV9zYXZlZFs4XTsgICAgICAgICAgICAvKiE8IGNvcHkgb2Yga2V5IHJlZ2lzdGVycyAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBTaXplX3NhdmVkOyAgICAgICAgICAgICAgLyohPCBjb3B5IG9mIGlucHV0IGJ1ZmZlciBzaXplICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgIENyeXBIZWFkZXJDb3VudF9zYXZlZDsgICAvKiE8IGNvcHkgb2YgQ1JZUCBoZWFkZXIgZGF0YSBjb3VudGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgUmVzdW1pbmdGbGFnOyAgICAgICAgICAgIC8qITwgcmVzdW1wdGlvbiBmbGFnIHRvIGJ5cGFzcyBzdGVwcyBhbHJlYWR5IGNhcnJpZWQgb3V0ICovCisKKyAgRnVuY3Rpb25hbFN0YXRlICAgICAgICAgICAgIEF1dG9LZXlEZXJpdmF0aW9uX3NhdmVkOyAvKiE8IGNvcHkgb2YgQ1JZUCBoYW5kbGUgYXV0byBrZXkgZGVyaXZhdGlvbiBwYXJhbWV0ZXIgKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworCit9IENSWVBfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqIEBkZWZncm91cCBIQUxfQ1JZUF9DYWxsYmFja19JRF9lbnVtZXJhdGlvbl9kZWZpbml0aW9uIEhBTCBDUllQIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBDUllQIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgQ1JZUCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEICAgICAgICAgPSAweDAxVSwgICAgIC8qITwgQ1JZUCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgICAgPSAweDAyVSwgICAgLyohPCBDUllQIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgICA9IDB4MDNVLCAgICAvKiE8IENSWVAgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICovCisgIEhBTF9DUllQX0VSUk9SX0NCX0lEICAgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgQ1JZUCBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9DUllQX0NhbGxiYWNrX3BvaW50ZXJfZGVmaW5pdGlvbiBIQUwgQ1JZUCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBDUllQIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKK3R5cGVkZWYgIHZvaWQgKCpwQ1JZUF9DYWxsYmFja1R5cGVEZWYpKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gQ1JZUCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0NvbnN0YW50cyBDUllQIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FcnJvcl9EZWZpbml0aW9uICAgQ1JZUCBFcnJvciBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgTm8gZXJyb3IgICAgICAgICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX1dSSVRFICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IFdyaXRlIGVycm9yICAgICAqLworI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBSZWFkIGVycm9yICAgICAgKi8KKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfRE1BICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgIC8qITwgRE1BIGVycm9yICAgICAgICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX0JVU1kgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAvKiE8IEJ1c3kgZmxhZyBlcnJvciAqLworI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUICAgICAgICAgICAweDAwMDAwMDEwVSAgLyohPCBUaW1lb3V0IGVycm9yICovCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQgICAgIDB4MDAwMDAwMjBVICAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAqLworI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRSAweDAwMDAwMDQwVSAgLyohPCBTZXF1ZW5jZSBhcmUgbm90IHJlc3BlY3RlZCBvbmx5IGZvciBHQ00gb3IgQ0NNICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisjZGVmaW5lICBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICgodWludDMyX3QpMHgwMDAwMDA4MFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9EYXRhX1dpZHRoX1VuaXQgQ1JZUCBEYXRhIFdpZHRoIFVuaXQKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfREFUQVdJRFRIVU5JVF9XT1JEICAgMHgwMDAwMDAwMFUgIC8qITwgQnkgZGVmYXVsdCwgc2l6ZSB1bml0IGlzIHdvcmQgKi8KKyNkZWZpbmUgQ1JZUF9EQVRBV0lEVEhVTklUX0JZVEUgICAweDAwMDAwMDAxVSAgLyohPCBCeSBkZWZhdWx0LCBzaXplIHVuaXQgaXMgYnl0ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfQWxnb3JpdGhtX01vZGUgQ1JZUCBBbGdvcml0aG0gTW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9BRVNfRUNCICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWxlY3Ryb25pYyBjb2RlYm9vayBjaGFpbmluZyBhbGdvcml0aG0gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9BRVNfQ0JDICAgICAgICAgICAgQUVTX0NSX0NITU9EXzAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2lwaGVyIGJsb2NrIGNoYWluaW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9BRVNfQ1RSICAgICAgICAgICAgQUVTX0NSX0NITU9EXzEgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBtb2RlIGNoYWluaW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9BRVNfR0NNX0dNQUMgICAgICAgKEFFU19DUl9DSE1PRF8wIHwgQUVTX0NSX0NITU9EXzEpIC8qITwgR2Fsb2lzIGNvdW50ZXIgbW9kZSAtIEdhbG9pcyBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUgKi8KKyNkZWZpbmUgQ1JZUF9BRVNfQ0NNICAgICAgICAgICAgQUVTX0NSX0NITU9EXzIgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB3aXRoIENpcGhlciBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQX0tleV9TaXplIENSWVAgS2V5IFNpemUKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfS0VZU0laRV8xMjhCICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCAxMjgtYml0IGxvbmcga2V5ICovCisjZGVmaW5lIENSWVBfS0VZU0laRV8yNTZCICAgICAgICAgQUVTX0NSX0tFWVNJWkUgICAgICAgLyohPCAyNTYtYml0IGxvbmcga2V5ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9EYXRhX1R5cGUgQ1JZUCBEYXRhIFR5cGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfREFUQVRZUEVfMzJCICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgMzItYml0IGRhdGEgdHlwZSAobm8gc3dhcHBpbmcpICAgICAgICAqLworI2RlZmluZSBDUllQX0RBVEFUWVBFXzE2QiAgICAgICAgIEFFU19DUl9EQVRBVFlQRV8wICAgICAgIC8qITwgMTYtYml0IGRhdGEgdHlwZSAoaGFsZi13b3JkIHN3YXBwaW5nKSAqLworI2RlZmluZSBDUllQX0RBVEFUWVBFXzhCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRV8xICAgICAgIC8qITwgOC1iaXQgZGF0YSB0eXBlIChieXRlIHN3YXBwaW5nKSAgICAgICAqLworI2RlZmluZSBDUllQX0RBVEFUWVBFXzFCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRSAgICAgICAgIC8qITwgMS1iaXQgZGF0YSB0eXBlIChiaXQgc3dhcHBpbmcpICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfSW50ZXJydXB0ICBDUllQIEludGVycnVwdAorICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9JVF9DQ0ZJRSAgICAgQUVTX0NSX0NDRklFIC8qITwgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBDUllQX0lUX0VSUklFICAgICBBRVNfQ1JfRVJSSUUgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSWVBfSVRfV1JFUlIgICAgIEFFU19TUl9XUkVSUiAgLyohPCBXcml0ZSBFcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9JVF9SREVSUiAgICAgQUVTX1NSX1JERVJSICAvKiE8IFJlYWQgRXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBDUllQX0lUX0NDRiAgICAgICBBRVNfU1JfQ0NGICAgIC8qITwgQ29tcHV0YXRpb24gY29tcGxldGVkICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9GbGFncyBDUllQIEZsYWdzCisgICogQHsKKyAgKi8KKworLyogc3RhdHVzIGZsYWdzICovCisjZGVmaW5lIENSWVBfRkxBR19CVVNZICAgIEFFU19TUl9CVVNZICAgLyohPCBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbiAqLworI2RlZmluZSBDUllQX0ZMQUdfV1JFUlIgICBBRVNfU1JfV1JFUlIgIC8qITwgV3JpdGUgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9GTEFHX1JERVJSICAgQUVTX1NSX1JERVJSICAvKiE8IFJlYWQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSWVBfRkxBR19DQ0YgICAgIEFFU19TUl9DQ0YgICAgLyohPCBDb21wdXRhdGlvbiBjb21wbGV0ZWQgICAgICAgICAgICAqLworLyogY2xlYXJpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgQ1JZUF9DQ0ZfQ0xFQVIgICAgQUVTX0NSX0NDRkMgICAvKiE8IENvbXB1dGF0aW9uIENvbXBsZXRlIEZsYWcgQ2xlYXIgKi8KKyNkZWZpbmUgQ1JZUF9FUlJfQ0xFQVIgICAgQUVTX0NSX0VSUkMgICAvKiE8IEVycm9yIEZsYWcgQ2xlYXIgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9Db25maWd1cmF0aW9uX1NraXAgQ1JZUCBLZXkgYW5kIElWIENvbmZpZ3VyYXRpb24gU2tpcCBNb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBDUllQX0tFWUlWQ09ORklHX0FMV0FZUyAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIHRvIGRvIHN5c3RlbWF0aWNhbGx5ICovCisjZGVmaW5lIENSWVBfS0VZSVZDT05GSUdfT05DRSAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gdG8gZG8gb25seSBvbmNlICAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX01hY3JvcyBDUllQIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgQ1JZUCBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgX19IQUxfQ1JZUF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG97XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0NSWVBfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICggKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUvRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworCisjZGVmaW5lIF9fSEFMX0NSWVBfRU5BQkxFKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIEFFU19DUl9FTikKKyNkZWZpbmUgX19IQUxfQ1JZUF9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAgfkFFU19DUl9FTikKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBzdGF0dXMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0ZMQUdfQlVTWSBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiBDb21wdXRhdGlvbiBDb21wbGV0ZQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0JVU1k6IFRoZSBDUllQIGNvcmUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBibG9jayBvZiBkYXRhCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIGtleSBwcmVwYXJhdGlvbiAoZm9yIEFFUyBkZWNyeXB0aW9uKS4KKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0lGRU06IElucHV0IEZJRk8gaXMgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0lGTkY6IElucHV0IEZJRk8gaXMgbm90IGZ1bGwKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0lOUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nCisgICogICAgICAgICAgICBAYXJnIENSWVBfRkxBR19PRk5FOiBPdXRwdXQgRklGTyBpcyBub3QgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX09GRlU6IE91dHB1dCBGSUZPIGlzIGZ1bGwKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX09VVFJJUzogSW5wdXQgRklGTyBzZXJ2aWNlIHJhdyBpbnRlcnJ1cHQgaXMgcGVuZGluZworICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworCisjZGVmaW5lIENSWVBfRkxBR19NQVNLICAweDAwMDAwMDFGVQorI2RlZmluZSBfX0hBTF9DUllQX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIENSWVAgcGVuZGluZyBzdGF0dXMgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9FUlJfQ0xFQVIgUmVhZCAoUkRFUlIpIG9yIFdyaXRlIEVycm9yIChXUkVSUikgRmxhZyBDbGVhcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfQ0NGX0NMRUFSIENvbXB1dGF0aW9uIENvbXBsZXRlIEZsYWcgKENDRikgQ2xlYXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKworI2RlZmluZSBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0ZMQUdfXykpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIENSWVAgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBDUllQIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2sKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9FUlJJRSBFcnJvciBpbnRlcnJ1cHQgKHVzZWQgZm9yIFJERVJSIGFuZCBXUkVSUikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRklFIENvbXB1dGF0aW9uIENvbXBsZXRlIGludGVycnVwdAorICAqIEByZXR2YWwgU3RhdGUgb2YgaW50ZXJydXB0aW9uIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKworI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBpbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBUaW55QUVTOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiAgQ29tcHV0YXRpb24gQ29tcGxldGUKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIENSWVA6CisgICogICAgICAgICAgICBAYXJnIENSWVBfSVRfSU5JOiBJbnB1dCBGSUZPIHNlcnZpY2UgbWFza2VkIGludGVycnVwdCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9JVF9PVVRJOiBPdXRwdXQgRklGTyBzZXJ2aWNlIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisKKyNkZWZpbmUgX19IQUxfQ1JZUF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIENSWVAgSW50ZXJydXB0LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBDUllQOgorICAqICAgICAgICAgICAgQCBDUllQX0lUX0lOSSA6IElucHV0IEZJRk8gc2VydmljZSBpbnRlcnJ1cHQgbWFzay4KKyAgKiAgICAgICAgICAgIEAgQ1JZUF9JVF9PVVRJIDogT3V0cHV0IEZJRk8gc2VydmljZSBpbnRlcnJ1cHQgbWFzay5DUllQIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKworI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgQ1JZUCBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIENSWVAgSW50ZXJydXB0LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBDUllQOgorICAqICAgICAgICAgICAgQCBDUllQX0lUX0lOSSA6IElucHV0IEZJRk8gc2VydmljZSBpbnRlcnJ1cHQgbWFzay4KKyAgKiAgICAgICAgICAgIEAgQ1JZUF9JVF9PVVRJIDogT3V0cHV0IEZJRk8gc2VydmljZSBpbnRlcnJ1cHQgbWFzay5DUllQIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKworI2RlZmluZSBfX0hBTF9DUllQX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBDUllQIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2NyeXBfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JZUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0luaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkIEhBTF9DUllQX01zcEluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkIEhBTF9DUllQX01zcERlSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1NldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcENSWVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCit2b2lkIEhBTF9DUllQX1Byb2Nlc3NTdXNwZW5kKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU3VzcGVuZChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1Jlc3VtZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKKyNlbmRpZiAvKiBkZWZpbmVkIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworLyogZW5jcnlwdGlvbi9kZWNyeXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCk7CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBJbnRlcnJ1cHQgSGFuZGxlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9DUllQX0lSUUhhbmRsZXIoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwordm9pZCBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit2b2lkIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Cit1aW50MzJfdCBIQUxfQ1JZUF9HZXRFcnJvcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zIENSWVAgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfSVNfQ1JZUF9EZWZpbml0aW9ucyBDUllQIFByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0NSWVBfQUxHT1JJVEhNKEFMR09SSVRITSkgKCgoQUxHT1JJVEhNKSA9PSBDUllQX0FFU19FQ0IpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DVFIpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfR0NNX0dNQUMpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NDTSkpCisKKworI2RlZmluZSBJU19DUllQX0tFWVNJWkUoS0VZU0laRSkoKChLRVlTSVpFKSA9PSBDUllQX0tFWVNJWkVfMTI4QikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEtFWVNJWkUpID09IENSWVBfS0VZU0laRV8yNTZCKSkKKworI2RlZmluZSBJU19DUllQX0RBVEFUWVBFKERBVEFUWVBFKSgoKERBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzMyQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzE2QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzFCKSkKKworI2RlZmluZSBJU19DUllQX0lOSVQoQ09ORklHKSgoKENPTkZJRykgPT0gQ1JZUF9LRVlJVkNPTkZJR19BTFdBWVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05GSUcpID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX0NvbnN0YW50cyBDUllQIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9EZWZpbmVzIENSWVAgUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX0Z1bmN0aW9ucyBDUllQIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9DUllQX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2NyeXBfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX2NyeXBfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0MzBmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfY3J5cF9leC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jcnlwX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENSWVBFeCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9DUllQX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9DUllQX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKworCisvKiogQGRlZmdyb3VwIENSWVBFeCBDUllQRXgKKyAgKiBAYnJpZWYgQ1JZUCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9UeXBlcyBDUllQRXggUHJpdmF0ZSBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQRXggUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9Db25zdGFudHMgQ1JZUEV4IFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfTWFjcm9zIENSWVBFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICogQH0KKyAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9GdW5jdGlvbnMgQ1JZUEV4IFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQRXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUEV4X0FFU0NDTV9HZW5lcmF0ZUF1dGhUQUcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKkF1dGhUYWcsIHVpbnQzMl90IFRpbWVvdXQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLwordm9pZCAgSEFMX0NSWVBFeF9FbmFibGVBdXRvS2V5RGVyaXZhdGlvbihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3ZvaWQgIEhBTF9DUllQRXhfRGlzYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0NSWVBfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfZGVmLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDRhZjJlCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfZGVmLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2RlZi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgSEFMIGNvbW1vbiBkZWZpbmVzLCBlbnVtZXJhdGlvbiwgbWFjcm9zIGFuZAorICAqICAgICAgICAgIHN0cnVjdHVyZXMgZGVmaW5pdGlvbnMuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyV0J4eF9IQUxfREVGCisjZGVmaW5lIF9fU1RNMzJXQnh4X0hBTF9ERUYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKyNpbmNsdWRlICJMZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oIiAgIC8qIEFsaWFzZXMgZmlsZSBmb3Igb2xkIG5hbWVzIGNvbXBhdGliaWxpdHkgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQGJyaWVmICBIQUwgU3RhdHVzIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9PSyAgICAgICA9IDB4MDAsCisgIEhBTF9FUlJPUiAgICA9IDB4MDEsCisgIEhBTF9CVVNZICAgICA9IDB4MDIsCisgIEhBTF9USU1FT1VUICA9IDB4MDMKK30gSEFMX1N0YXR1c1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIExvY2sgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1VOTE9DS0VEID0gMHgwMCwKKyAgSEFMX0xPQ0tFRCAgID0gMHgwMQorfSBIQUxfTG9ja1R5cGVEZWY7CisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgVU5VU0VEKFgpICh2b2lkKVggICAgICAvKiBUbyBhdm9pZCBnY2MvZysrIHdhcm5pbmdzICovCisKKyNkZWZpbmUgSEFMX01BWF9ERUxBWSAgICAgIDB4RkZGRkZGRkZVCisKKyNkZWZpbmUgSEFMX0lTX0JJVF9TRVQoUkVHLCBCSVQpICAgICAgICAgKCgoUkVHKSAmIChCSVQpKSA9PSAoQklUKSkKKyNkZWZpbmUgSEFMX0lTX0JJVF9DTFIoUkVHLCBCSVQpICAgICAgICAgKCgoUkVHKSAmIChCSVQpKSA9PSAwVSkKKworI2RlZmluZSBfX0hBTF9MSU5LRE1BKF9fSEFORExFX18sIF9fUFBQX0RNQV9GSUVMRF9fLCBfX0RNQV9IQU5ETEVfXykgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPl9fUFBQX0RNQV9GSUVMRF9fID0gJihfX0RNQV9IQU5ETEVfXyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0RNQV9IQU5ETEVfXykuUGFyZW50ID0gKF9fSEFORExFX18pOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiBSZXNldCB0aGUgSGFuZGxlJ3MgU3RhdGUgZmllbGQuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIEhhbmRsZS4KKyAgKiBAbm90ZSAgVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBmb3IgdGhlIGZvbGxvd2luZyBwdXJwb3NlOiAKKyAgKiAgICAgICAgICAtIFdoZW4gdGhlIEhhbmRsZSBpcyBkZWNsYXJlZCBhcyBsb2NhbCB2YXJpYWJsZTsgYmVmb3JlIHBhc3NpbmcgaXQgYXMgcGFyYW1ldGVyCisgICogICAgICAgICAgICB0byBIQUxfUFBQX0luaXQoKSBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IGlzIG1hbmRhdG9yeSB0byB1c2UgdGhpcyBtYWNybyAKKyAgKiAgICAgICAgICAgIHRvIHNldCB0byAwIHRoZSBIYW5kbGUncyAiU3RhdGUiIGZpZWxkLgorICAqICAgICAgICAgICAgT3RoZXJ3aXNlLCAiU3RhdGUiIGZpZWxkIG1heSBoYXZlIGFueSByYW5kb20gdmFsdWUgYW5kIHRoZSBmaXJzdCB0aW1lIHRoZSBmdW5jdGlvbiAKKyAgKiAgICAgICAgICAgIEhBTF9QUFBfSW5pdCgpIGlzIGNhbGxlZCwgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIG1pc3NlZAorICAqICAgICAgICAgICAgKGkuZS4gSEFMX1BQUF9Nc3BJbml0KCkgd2lsbCBub3QgYmUgZXhlY3V0ZWQpLgorICAqICAgICAgICAgIC0gV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogaW5zdGVhZCBvZiBjYWxsaW5nCisgICogICAgICAgICAgICBIQUxfUFBQX0RlSW5pdCgpIHRoZW4gSEFMX1BQUF9Jbml0KCksIHVzZXIgY2FuIG1ha2UgYSBjYWxsIHRvIHRoaXMgbWFjcm8gdGhlbiBIQUxfUFBQX0luaXQoKS4KKyAgKiAgICAgICAgICAgIEluIHRoaXMgbGF0ZXIgZnVuY3Rpb24sIHdoZW4gdGhlIEhhbmRsZSdzICJTdGF0ZSIgZmllbGQgaXMgc2V0IHRvIDAsIGl0IHdpbGwgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKyAgKiAgICAgICAgICAgIEhBTF9QUFBfTXNwSW5pdCgpIHdoaWNoIHdpbGwgcmVjb25maWd1cmUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gMCkKKworI2lmIChVU0VfUlRPUyA9PSAxKQorICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworICAjZXJyb3IgIiBVU0VfUlRPUyBzaG91bGQgYmUgMCBpbiB0aGUgY3VycmVudCBIQUwgcmVsZWFzZSAiCisjZWxzZQorICAjZGVmaW5lIF9fSEFMX0xPQ0soX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKF9fSEFORExFX18pLT5Mb2NrID09IEhBTF9MT0NLRUQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhBTF9CVVNZOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Mb2NrID0gSEFMX0xPQ0tFRDsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSAoMCkKKworICAjZGVmaW5lIF9fSEFMX1VOTE9DSyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlICgwKQorI2VuZGlmIC8qIFVTRV9SVE9TICovCisKKyNpZiAgZGVmaW5lZCAoIF9fR05VQ19fICkKKyAgI2lmbmRlZiBfX3dlYWsKKyAgICAjZGVmaW5lIF9fd2VhayAgIF9fYXR0cmlidXRlX18oKHdlYWspKQorICAjZW5kaWYgLyogX193ZWFrICovCisgICNpZm5kZWYgX19wYWNrZWQKKyAgICAjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKQorICAjZW5kaWYgLyogX19wYWNrZWQgKi8KKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisKKy8qIE1hY3JvIHRvIGdldCB2YXJpYWJsZSBhbGlnbmVkIG9uIDQtYnl0ZXMsIGZvciBfX0lDQ0FSTV9fIHRoZSBkaXJlY3RpdmUgIiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9NCIgbXVzdCBiZSB1c2VkIGluc3RlYWQgKi8KKy8qIEdOVSBDb21waWxlciAqLworI2lmIGRlZmluZWQgICAoX19HTlVDX18pCisgICNpZm5kZWYgX19BTElHTl9FTkQKKyAgICAjZGVmaW5lIF9fQUxJR05fRU5EICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpCisgICNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworICAjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyAgICAjZGVmaW5lIF9fQUxJR05fQkVHSU4KKyAgI2VuZGlmIC8qIF9fQUxJR05fQkVHSU4gKi8KKyNlbHNlCisgICNpZm5kZWYgX19BTElHTl9FTkQKKyAgICAjZGVmaW5lIF9fQUxJR05fRU5ECisgICNlbmRpZiAvKiBfX0FMSUdOX0VORCAqLworICAjaWZuZGVmIF9fQUxJR05fQkVHSU4KKyAgICAvKiBBUk0gQ29tcGlsZXIgKi8KKyAgICAjaWYgZGVmaW5lZCAgIChfX0NDX0FSTSkKKyAgICAgICNkZWZpbmUgX19BTElHTl9CRUdJTiAgICBfX2FsaWduKDQpCisgICAgLyogSUFSIENvbXBpbGVyICovCisgICAgI2VsaWYgZGVmaW5lZCAoX19JQ0NBUk1fXykKKyAgICAgICNkZWZpbmUgX19BTElHTl9CRUdJTgorICAgICNlbmRpZiAvKiBfX0NDX0FSTSAqLworICAjZW5kaWYgLyogX19BTElHTl9CRUdJTiAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKy8qKgorICAqIEBicmllZiAgX19SQU1fRlVOQyBkZWZpbml0aW9uCisgICovCisjaWYgZGVmaW5lZCAoIF9fQ0NfQVJNICAgKQorLyogQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0KKyAgIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgdGhlIHRvb2xjaGFpbiBvcHRpb25zLgorICAgRnVuY3Rpb25zIHRoYXQgYXJlIGV4ZWN1dGVkIGluIFJBTSBzaG91bGQgcmVzaWRlIGluIGEgc2VwYXJhdGUgc291cmNlIG1vZHVsZS4KKyAgIFVzaW5nIHRoZSAnT3B0aW9ucyBmb3IgRmlsZScgZGlhbG9nIHlvdSBjYW4gc2ltcGx5IGNoYW5nZSB0aGUgJ0NvZGUgLyBDb25zdCcKKyAgIGFyZWEgb2YgYSBtb2R1bGUgdG8gYSBtZW1vcnkgc3BhY2UgaW4gcGh5c2ljYWwgUkFNLgorICAgQXZhaWxhYmxlIG1lbW9yeSBhcmVhcyBhcmUgZGVjbGFyZWQgaW4gdGhlICdUYXJnZXQnIHRhYiBvZiB0aGUgJ09wdGlvbnMgZm9yIFRhcmdldCcKKyAgIGRpYWxvZy4KKyovCisjZGVmaW5lIF9fUkFNX0ZVTkMKKworI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKQorLyogSUNDQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0KKyAgIFJBTSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgdXNpbmcgYSBzcGVjaWZpYyB0b29sY2hhaW4ga2V5d29yZCAiX19yYW1mdW5jIi4KKyovCisjZGVmaW5lIF9fUkFNX0ZVTkMgX19yYW1mdW5jCisKKyNlbGlmIGRlZmluZWQgICAoICBfX0dOVUNfXyAgKQorLyogR05VIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0KKyAgUkFNIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyBhIHNwZWNpZmljIHRvb2xjaGFpbiBhdHRyaWJ1dGUKKyAgICJfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkiLgorKi8KKyNkZWZpbmUgX19SQU1fRlVOQyBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuUmFtRnVuYyIpKSkKKworI2VuZGlmCisKKy8qKiAKKyAgKiBAYnJpZWYgIF9fTk9JTkxJTkUgZGVmaW5pdGlvbgorICAqLyAKKyNpZiBkZWZpbmVkICggX19DQ19BUk0gICApIHx8IGRlZmluZWQgICAoICBfX0dOVUNfXyAgKQorLyogQVJNICYgR05VQ29tcGlsZXIgCisgICAtLS0tLS0tLS0tLS0tLS0tIAorKi8KKyNkZWZpbmUgX19OT0lOTElORSBfX2F0dHJpYnV0ZV9fICggKG5vaW5saW5lKSApICAKKworI2VsaWYgZGVmaW5lZCAoIF9fSUNDQVJNX18gKQorLyogSUNDQVJNIENvbXBpbGVyCisgICAtLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIF9fTk9JTkxJTkUgX1ByYWdtYSgib3B0aW1pemUgPSBub19pbmxpbmUiKQorCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19fU1RNMzJXQnh4X0hBTF9ERUYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2RtYS5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjMTE2OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2RtYS5oCkBAIC0wLDAgKzEsNjUxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9kbWEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0RNQV9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfRE1BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2RtYS5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRE1BCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX1R5cGVzIERNQSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRE1BIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFJlcXVlc3Q7ICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSByZXF1ZXN0IHNlbGVjdGVkIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfcmVxdWVzdCAqLworCisgIHVpbnQzMl90IERpcmVjdGlvbjsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBkYXRhIHdpbGwgYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gcGVyaXBoZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1lbW9yeSB0byBtZW1vcnkgb3IgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9EYXRhX3RyYW5zZmVyX2RpcmVjdGlvbiAqLworCisgIHVpbnQzMl90IFBlcmlwaEluYzsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBlcmlwaGVyYWwgYWRkcmVzcyByZWdpc3RlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSAqLworCisgIHVpbnQzMl90IE1lbUluYzsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTWVtb3J5X2luY3JlbWVudGVkX21vZGUgKi8KKworICB1aW50MzJfdCBQZXJpcGhEYXRhQWxpZ25tZW50OyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUGVyaXBoZXJhbCBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX1BlcmlwaGVyYWxfZGF0YV9zaXplICovCisKKyAgdWludDMyX3QgTWVtRGF0YUFsaWdubWVudDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE1lbW9yeSBkYXRhIHdpZHRoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX01lbW9yeV9kYXRhX3NpemUgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIERNQXkgQ2hhbm5lbHguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbCAqLworCisgIHVpbnQzMl90IFByaW9yaXR5OyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb2Z0d2FyZSBwcmlvcml0eSBmb3IgdGhlIERNQXkgQ2hhbm5lbHguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfUHJpb3JpdHlfbGV2ZWwgKi8KK30gRE1BX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBETUEgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0RNQV9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBETUEgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgICAqLworICBIQUxfRE1BX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IERNQSBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICovCisgIEhBTF9ETUFfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgIC8qITwgRE1BIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0RNQV9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgLyohPCBETUEgdGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfRE1BX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgRE1BIEVycm9yIENvZGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX0ZVTExfVFJBTlNGRVIgICAgICA9IDB4MDBVLCAgICAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfSEFMRl9UUkFOU0ZFUiAgICAgID0gMHgwMVUgICAgIC8qITwgSGFsZiBUcmFuc2ZlciAgICAgKi8KK30gSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBETUEgQ2FsbGJhY2sgSUQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRE1BX1hGRVJfQ1BMVF9DQl9JRCAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IEZ1bGwgdHJhbnNmZXIgICAgICovCisgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRCAgICAgID0gMHgwMVUsICAgIC8qITwgSGFsZiB0cmFuc2ZlciAgICAgKi8KKyAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEICAgICAgICAgPSAweDAyVSwgICAgLyohPCBFcnJvciAgICAgICAgICAgICAqLworICBIQUxfRE1BX1hGRVJfQUJPUlRfQ0JfSUQgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IEFib3J0ICAgICAgICAgICAgICovCisgIEhBTF9ETUFfWEZFUl9BTExfQ0JfSUQgICAgICAgICAgID0gMHgwNFUgICAgIC8qITwgQWxsICAgICAgICAgICAgICAgKi8KKworfSBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIERNQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYKK3sKKyAgRE1BX0NoYW5uZWxfVHlwZURlZiAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKworICBETUFfSW5pdFR5cGVEZWYgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfRE1BX1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KKworICB2b2lkICAgICAgICAgICAgICAgICAgKlBhcmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyZW50IG9iamVjdCBzdGF0ZSAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogWGZlckNwbHRDYWxsYmFjaykoc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgICAgICAgICovCisKKyAgdm9pZCAoKiBYZmVySGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICAgKi8KKworICB2b2lkICgqIFhmZXJFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19ETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICAgICAgICAgICAqLworCisgIHZvaWQgKCogWGZlckFib3J0Q2FsbGJhY2spKHN0cnVjdCBfX0RNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgdHJhbnNmZXIgYWJvcnQgY2FsbGJhY2sgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBETUFfVHlwZURlZiAgICAgICAgICAgICpEbWFCYXNlQWRkcmVzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIENoYW5uZWwgQmFzZSBBZGRyZXNzICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgQ2hhbm5lbEluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgQ2hhbm5lbCBJbmRleCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAgICAgICAgICAgKkRNQW11eENoYW5uZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKworICBETUFNVVhfQ2hhbm5lbFN0YXR1c19UeXBlRGVmICAgICAqRE1BbXV4Q2hhbm5lbFN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWxzIFN0YXR1cyBCYXNlIEFkZHJlc3MgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIERNQW11eENoYW5uZWxTdGF0dXNNYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUFNVVggQ2hhbm5lbCBTdGF0dXMgTWFzayAgICAgICAgICAgICovCisKKyAgRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAgICAgICAgKkRNQW11eFJlcXVlc3RHZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBCYXNlIEFkZHJlc3MgKi8KKworICBETUFNVVhfUmVxdWVzdEdlblN0YXR1c19UeXBlRGVmICAqRE1BbXV4UmVxdWVzdEdlblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIEFkZHJlc3MgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIERNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgU3RhdHVzIG1hc2sgICovCit9IERNQV9IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQV9FcnJvcl9Db2RlIERNQSBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfVEUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX05PX1hGRVIgICAgICAgICAgIDB4MDAwMDAwMDRVICAgICAgICAgICAgICAgICAgICAgLyohPCBBYm9ydCByZXF1ZXN0ZWQgd2l0aCBubyBYZmVyIG9uZ29pbmcgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9USU1FT1VUICAgICAgICAgICAweDAwMDAwMDIwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFfRVJST1JfTk9UX1NVUFBPUlRFRCAgICAgMHgwMDAwMDEwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BX0VSUk9SX1NZTkMgICAgICAgICAgICAgIDB4MDAwMDAyMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBETUFNVVggc3luYyBvdmVycnVuICBlcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQV9FUlJPUl9SRVFHRU4gICAgICAgICAgICAweDAwMDAwNDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gIGVycm9yICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX3JlcXVlc3QgRE1BIHJlcXVlc3QKKyAgKiBAeworICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX01FTTJNRU0gICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9NRU0yTUVNICAgICAgICAgICAvKiE8IG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMCAgICAgICAgICBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMSAgICAgICAgICBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDEgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMiAgICAgICAgICBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDIgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfR0VORVJBVE9SMyAgICAgICAgICBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMgICAgICAgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDMgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9BREMxICAgICAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfQURDMSAgICAgICAgICAgICAgLyohPCBETUFNVVggQURDMSByZXF1ZXN0ICAgICAgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX1NQSTFfUlggICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9TUEkxX1JYICAgICAgICAgICAvKiE8IERNQU1VWCBTUEkxIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1NQSTFfVFggICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9TUEkxX1RYICAgICAgICAgICAvKiE8IERNQU1VWCBTUEkxIFRYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1NQSTJfUlggICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9TUEkyX1JYICAgICAgICAgICAvKiE8IERNQU1VWCBTUEkyIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1NQSTJfVFggICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9TUEkyX1RYICAgICAgICAgICAvKiE8IERNQU1VWCBTUEkyIFRYIHJlcXVlc3QgICAgICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDMV9SWCAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0kyQzFfUlggICAgICAgICAgIC8qITwgRE1BTVVYIEkyQzEgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDMV9UWCAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0kyQzFfVFggICAgICAgICAgIC8qITwgRE1BTVVYIEkyQzEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDM19SWCAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0kyQzNfUlggICAgICAgICAgIC8qITwgRE1BTVVYIEkyQzMgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfSTJDM19UWCAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0kyQzNfVFggICAgICAgICAgIC8qITwgRE1BTVVYIEkyQzMgVFggcmVxdWVzdCAgICAgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDFfUlggICAgICAgICAgIExMX0RNQU1VWF9SRVFfVVNBUlQxX1JYICAgICAgICAgLyohPCBETUFNVVggVVNBUlQxIFJYIHJlcXVlc3QgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9VU0FSVDFfVFggICAgICAgICAgIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYICAgICAgICAgLyohPCBETUFNVVggVVNBUlQxIFRYIHJlcXVlc3QgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX0xQVUFSVDFfUlggICAgICAgICAgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYICAgICAgICAvKiE8IERNQU1VWCBMUF9VQVJUMV9SWCByZXF1ZXN0ICovCisjZGVmaW5lIERNQV9SRVFVRVNUX0xQVUFSVDFfVFggICAgICAgICAgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYICAgICAgICAvKiE8IERNQU1VWCBMUF9VQVJUMV9SWCByZXF1ZXN0ICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfU0FJMV9BICAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1NBSTFfQSAgICAgICAgICAgIC8qITwgRE1BTVVYIFNBSTEgQSByZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfU0FJMV9CICAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1NBSTFfQiAgICAgICAgICAgIC8qITwgRE1BTVVYIFNBSTEgQiByZXF1ZXN0ICAgICAgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9RVUFEU1BJICAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfUVVBRFNQSSAgICAgICAgICAgLyohPCBETUFNVVggUVVBRFNQSSByZXF1ZXN0ICAgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gxICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX0NIMSAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gyICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX0NIMiAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENIMiByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0gzICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX0NIMyAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ0g0ICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX0NINCAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfVVAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX1VQICAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIFVQICByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfVFJJRyAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX1RSSUcgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIFRSSUcgcmVxdWVzdCAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTFfQ09NICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xX0NPTSAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xIENPTSByZXF1ZXN0ICAgICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDEgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgQ0gxIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDIgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gyICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgQ0gyIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDMgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgQ0gzIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9DSDQgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0ICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgQ0g0IHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfVElNMl9VUCAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX1RJTTJfVVAgICAgICAgICAgIC8qITwgRE1BTVVYIFRJTTIgVVAgIHJlcXVlc3QgICAgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNl9DSDEgICAgICAgICAgIExMX0RNQU1VWF9SRVFfVElNMTZfQ0gxICAgICAgICAgLyohPCBETUFNVVggVElNMTYgQ0gxIHJlcXVlc3QgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9USU0xNl9VUCAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfVElNMTZfVVAgICAgICAgICAgLyohPCBETUFNVVggVElNMTYgVVAgIHJlcXVlc3QgICAqLworCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X0NIMSAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xN19DSDEgICAgICAgICAvKiE8IERNQU1VWCBUSU0xNyBDSDEgcmVxdWVzdCAgICovCisjZGVmaW5lIERNQV9SRVFVRVNUX1RJTTE3X1VQICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9USU0xN19VUCAgICAgICAgICAvKiE8IERNQU1VWCBUSU0xNyBVUCAgcmVxdWVzdCAgICovCisKKyNkZWZpbmUgRE1BX1JFUVVFU1RfQUVTMV9JTiAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0FFUzFfSU4gICAgICAgICAgIC8qITwgRE1BTVVYIEFFUzEgSU4gcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgRE1BX1JFUVVFU1RfQUVTMV9PVVQgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0FFUzFfT1VUICAgICAgICAgIC8qITwgRE1BTVVYIEFFUzEgT1VUIHJlcXVlc3QgICAgKi8KKworI2RlZmluZSBETUFfUkVRVUVTVF9BRVMyX0lOICAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfQUVTMl9JTiAgICAgICAgICAgLyohPCBETUFNVVggQUVTMiBJTiByZXF1ZXN0ICAgICAqLworI2RlZmluZSBETUFfUkVRVUVTVF9BRVMyX09VVCAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfQUVTMl9PVVQgICAgICAgICAgLyohPCBETUFNVVggQUVTMiBPVVQgcmVxdWVzdCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfRGF0YV90cmFuc2Zlcl9kaXJlY3Rpb24gRE1BIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BFUklQSF9UT19NRU1PUlkgICAgICAgICAgICBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgIC8qITwgUGVyaXBoZXJhbCB0byBtZW1vcnkgZGlyZWN0aW9uICovCisjZGVmaW5lIERNQV9NRU1PUllfVE9fUEVSSVBIICAgICAgICAgICAgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIICAvKiE8IE1lbW9yeSB0byBwZXJpcGhlcmFsIGRpcmVjdGlvbiAqLworI2RlZmluZSBETUFfTUVNT1JZX1RPX01FTU9SWSAgICAgICAgICAgIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSAgLyohPCBNZW1vcnkgdG8gbWVtb3J5IGRpcmVjdGlvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX1BlcmlwaGVyYWxfaW5jcmVtZW50ZWRfbW9kZSBETUEgUGVyaXBoZXJhbCBpbmNyZW1lbnRlZCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BJTkNfRU5BQkxFICAgICAgICAgICAgICAgICBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVCAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgRE1BX1BJTkNfRElTQUJMRSAgICAgICAgICAgICAgICBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UICAgICAgIC8qITwgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9NZW1vcnlfaW5jcmVtZW50ZWRfbW9kZSBETUEgTWVtb3J5IGluY3JlbWVudGVkIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfTUlOQ19FTkFCTEUgICAgICAgICAgICAgICAgIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UICAgICAgICAgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRW5hYmxlICAqLworI2RlZmluZSBETUFfTUlOQ19ESVNBQkxFICAgICAgICAgICAgICAgIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQgICAgICAgLyohPCBNZW1vcnkgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUGVyaXBoZXJhbF9kYXRhX3NpemUgRE1BIFBlcmlwaGVyYWwgZGF0YSBzaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BEQVRBQUxJR05fQllURSAgICAgICAgICAgICBMTF9ETUFfUERBVEFBTElHTl9CWVRFICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEJ5dGUgICAgICovCisjZGVmaW5lIERNQV9QREFUQUFMSUdOX0hBTEZXT1JEICAgICAgICAgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBIYWxmV29yZCAqLworI2RlZmluZSBETUFfUERBVEFBTElHTl9XT1JEICAgICAgICAgICAgIExMX0RNQV9QREFUQUFMSUdOX1dPUkQgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogV29yZCAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX01lbW9yeV9kYXRhX3NpemUgRE1BIE1lbW9yeSBkYXRhIHNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9CWVRFICAgICAgICAgICAgIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgICAgIExMX0RNQV9NREFUQUFMSUdOX0hBTEZXT1JEICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBIYWxmV29yZCAqLworI2RlZmluZSBETUFfTURBVEFBTElHTl9XT1JEICAgICAgICAgICAgIExMX0RNQV9NREFUQUFMSUdOX1dPUkQgICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfbW9kZSBETUEgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIERNQV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX01PREVfTk9STUFMICAgICAgICAgICAgICAvKiE8IE5vcm1hbCBtb2RlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0NJUkNVTEFSICAgICAgICAgICAgICAgICAgICBMTF9ETUFfTU9ERV9DSVJDVUxBUiAgICAgICAgICAgIC8qITwgQ2lyY3VsYXIgbW9kZSAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfUHJpb3JpdHlfbGV2ZWwgRE1BIFByaW9yaXR5IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX0xPVyAgICAgICAgICAgICAgICBMTF9ETUFfUFJJT1JJVFlfTE9XICAgICAgICAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBMb3cgICAgICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX01FRElVTSAgICAgICAgICAgICBMTF9ETUFfUFJJT1JJVFlfTUVESVVNICAgICAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBNZWRpdW0gICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX0hJR0ggICAgICAgICAgICAgICBMTF9ETUFfUFJJT1JJVFlfSElHSCAgICAgICAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBIaWdoICAgICAgKi8KKyNkZWZpbmUgRE1BX1BSSU9SSVRZX1ZFUllfSElHSCAgICAgICAgICBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0ggICAgICAgIC8qITwgUHJpb3JpdHkgbGV2ZWwgOiBWZXJ5X0hpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBETUFfaW50ZXJydXB0X2VuYWJsZV9kZWZpbml0aW9ucyBETUEgaW50ZXJydXB0IGVuYWJsZSBkZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIERNQV9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgTExfRE1BX0NDUl9UQ0lFICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCAqLworI2RlZmluZSBETUFfSVRfSFQgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9DQ1JfSFRJRSAgICAgICAgICAgICAgICAgLyohPCBIYWxmIFRyYW5zZmVyIGludGVycnVwdCAgICAgKi8KKyNkZWZpbmUgRE1BX0lUX1RFICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfQ0NSX1RFSUUgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9mbGFnX2RlZmluaXRpb25zIERNQSBmbGFnIGRlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0wxICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGMSAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAxIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEMxICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjEgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQxICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjEgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAxIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEUxICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjEgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0wyICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGMiAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEMyICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjIgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQyICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjIgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEUyICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjIgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0wzICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGMyAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEMzICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjMgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQzICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjMgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEUzICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjMgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0w0ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGNCAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA0IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEM0ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjQgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQ0ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjQgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA0IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEU0ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjQgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0w1ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGNSAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEM1ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjUgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQ1ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjUgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEU1ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjUgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0w2ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGNiAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA2IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEM2ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjYgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQ2ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjYgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEU2ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjYgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfR0w3ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfR0lGNyAgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEM3ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVENJRjcgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfSFQ3ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfSFRJRjcgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA3IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgRE1BX0ZMQUdfVEU3ICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9JU1JfVEVJRjcgICAgICAgICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9FeHBvcnRlZF9NYWNyb3MgRE1BIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IERNQSBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFU0VUKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAgRE1BX0NDUl9FTikKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSICY9ICB+RE1BX0NDUl9FTikKKworCisvKiBJbnRlcnJ1cHQgJiBGbGFnIG1hbmFnZW1lbnQgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnIGluZGV4LgorICAqLworCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfVENfRkxBR19JTkRFWChfX0hBTkRMRV9fKSBcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RDMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpPyBETUFfRkxBR19UQzEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEMyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSk/IERNQV9GTEFHX1RDMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19UQzMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEMzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RDNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpPyBETUFfRkxBR19UQzQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfVEM1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSk/IERNQV9GTEFHX1RDNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfRkxBR19UQzYgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEM2IDpcCisgICBETUFfRkxBR19UQzcpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgaW5kZXguCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9HRVRfSFRfRkxBR19JTkRFWChfX0hBTkRMRV9fKVwKKygoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKT8gRE1BX0ZMQUdfSFQxIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwxKSk/IERNQV9GTEFHX0hUMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpPyBETUFfRkxBR19IVDIgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfSFQyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwzKSk/IERNQV9GTEFHX0hUMyA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpPyBETUFfRkxBR19IVDMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKT8gRE1BX0ZMQUdfSFQ0IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw0KSk/IERNQV9GTEFHX0hUNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpPyBETUFfRkxBR19IVDUgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfSFQ1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw2KSk/IERNQV9GTEFHX0hUNiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNikpPyBETUFfRkxBR19IVDYgOlwKKyAgIERNQV9GTEFHX0hUNykKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBjdXJyZW50IERNQSBDaGFubmVsIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX1RFX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9GTEFHX1RFMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpPyBETUFfRkxBR19URTEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0ZMQUdfVEUyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSk/IERNQV9GTEFHX1RFMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfRkxBR19URTMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKT8gRE1BX0ZMQUdfVEUzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9GTEFHX1RFNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpPyBETUFfRkxBR19URTQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0ZMQUdfVEU1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSk/IERNQV9GTEFHX1RFNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfRkxBR19URTYgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDYpKT8gRE1BX0ZMQUdfVEU2IDpcCisgICBETUFfRkxBR19URTcpCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCBHbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIHNwZWNpZmllZCB0cmFuc2ZlciBlcnJvciBmbGFnIGluZGV4LgorICAqLworI2RlZmluZSBfX0hBTF9ETUFfR0VUX0dJX0ZMQUdfSU5ERVgoX19IQU5ETEVfXylcCisoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSk/IERNQV9JU1JfR0lGMSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpPyBETUFfSVNSX0dJRjEgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIpKT8gRE1BX0lTUl9HSUYyIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSk/IERNQV9JU1JfR0lGMiA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpPyBETUFfSVNSX0dJRjMgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDMpKT8gRE1BX0lTUl9HSUYzIDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSk/IERNQV9JU1JfR0lGNCA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpPyBETUFfSVNSX0dJRjQgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDUpKT8gRE1BX0lTUl9HSUY1IDpcCisgKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSk/IERNQV9JU1JfR0lGNSA6XAorICgodWludDMyX3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpPyBETUFfSVNSX0dJRjYgOlwKKyAoKHVpbnQzMl90KSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDYpKT8gRE1BX0lTUl9HSUY2IDpcCisgICBETUFfSVNSX0dJRjcpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gX19GTEFHX18gR2V0IHRoZSBzcGVjaWZpZWQgZmxhZy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ3g6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXg6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0dMeDogIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgZnJvbSAxIHRvIDcgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbCB4IGZsYWcuCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgRkxBRyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKT8gXAorIChETUEyLT5JU1IgJiAoX19GTEFHX18pKSA6IChETUExLT5JU1IgJiAoX19GTEFHX18pKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRE1BIENoYW5uZWwgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBETUEgaGFuZGxlCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19UQ3g6ICBUcmFuc2ZlciBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0hUeDogIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBETUFfRkxBR19URXg6ICBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIERNQV9GTEFHX0dMeDogIEdsb2JhbCBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgV2hlcmUgeCBjYW4gYmUgZnJvbSAxIHRvIDcgdG8gc2VsZWN0IHRoZSBETUEgQ2hhbm5lbCB4IGZsYWcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0RNQV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCh1aW50MzJfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZSkgPiAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDcpKT8gXAorIChETUEyLT5JRkNSID0gKF9fRkxBR19fKSkgOiAoRE1BMS0+SUZDUiA9IChfX0ZMQUdfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9ETUFfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgRE1BIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX1RDOiAgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKKyAgKiAgICAgICAgICAgIEBhcmcgRE1BX0lUX0hUOiAgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgbWFzaworICAqICAgICAgICAgICAgQGFyZyBETUFfSVRfVEU6ICBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgbWFzaworICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIERNQV9JVCAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSICYgKF9fSU5URVJSVVBUX18pKSkKKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgdW5pdHMgaW4gdGhlIGN1cnJlbnQgRE1BIENoYW5uZWwgdHJhbnNmZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEByZXR2YWwgVGhlIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSB1bml0cyBpbiB0aGUgY3VycmVudCBETUEgQ2hhbm5lbCB0cmFuc2Zlci4KKyAgKi8KKyNkZWZpbmUgX19IQUxfRE1BX0dFVF9DT1VOVEVSKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTkRUUikKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBETUEgSEFMIEV4dGVuc2lvbiBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RtYV9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Jbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9TdGFydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydF9JVChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9MZXZlbENvbXBsZXRlVHlwZURlZiBDb21wbGV0ZUxldmVsLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgSEFMX0RNQV9JUlFIYW5kbGVyKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCB2b2lkICgqIHBDYWxsYmFjaykoRE1BX0hhbmRsZVR5cGVEZWYgKl9oZG1hKSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1VuUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfRE1BX1N0YXRlVHlwZURlZiBIQUxfRE1BX0dldFN0YXRlKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9ETUFfR2V0RXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfTWFjcm9zIERNQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfRE1BX0RJUkVDVElPTihESVJFQ1RJT04pICAgICAgICAgICAgICgoKERJUkVDVElPTikgPT0gRE1BX1BFUklQSF9UT19NRU1PUlkgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChESVJFQ1RJT04pID09IERNQV9NRU1PUllfVE9fUEVSSVBIKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElSRUNUSU9OKSA9PSBETUFfTUVNT1JZX1RPX01FTU9SWSkpCisKKyNkZWZpbmUgSVNfRE1BX0JVRkZFUl9TSVpFKFNJWkUpICAgICAgICAgICAgICAgICgoKFNJWkUpID49IDB4MVUpICYmICgoU0laRSkgPCAweDEwMDAwVSkpCisKKyNkZWZpbmUgSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKFNUQVRFKSAgICAgICgoKFNUQVRFKSA9PSBETUFfUElOQ19FTkFCTEUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IERNQV9QSU5DX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0RNQV9NRU1PUllfSU5DX1NUQVRFKFNUQVRFKSAgICAgICAgICAoKChTVEFURSkgPT0gRE1BX01JTkNfRU5BQkxFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUQVRFKSA9PSBETUFfTUlOQ19ESVNBQkxFKSkKKworCisjZGVmaW5lIElTX0RNQV9BTExfUkVRVUVTVChSRVFVRVNUKSAgICAgICAgICAgICAoKFJFUVVFU1QpIDw9IERNQV9SRVFVRVNUX0FFUzJfT1VUKQorCisjZGVmaW5lIElTX0RNQV9QRVJJUEhFUkFMX0RBVEFfU0laRShTSVpFKSAgICAgICAoKChTSVpFKSA9PSBETUFfUERBVEFBTElHTl9CWVRFKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9QREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0RNQV9NRU1PUllfREFUQV9TSVpFKFNJWkUpICAgICAgICAgICAoKChTSVpFKSA9PSBETUFfTURBVEFBTElHTl9CWVRFKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IERNQV9NREFUQUFMSUdOX1dPUkQgKSkKKworI2RlZmluZSBJU19ETUFfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gRE1BX05PUk1BTCApICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBETUFfQ0lSQ1VMQVIpKQorCisjZGVmaW5lIElTX0RNQV9QUklPUklUWShQUklPUklUWSkgICAgICAgICAgICAgICAoKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX0xPVyApICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJJT1JJVFkpID09IERNQV9QUklPUklUWV9NRURJVU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSSU9SSVRZKSA9PSBETUFfUFJJT1JJVFlfSElHSCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUklPUklUWSkgPT0gRE1BX1BSSU9SSVRZX1ZFUllfSElHSCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0RNQV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9kbWFfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX2RtYV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTMyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9kbWFfZXguaApAQCAtMCwwICsxLDI2NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfZG1hX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIERNQSBIQUwgZXh0ZW5zaW9uIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfRE1BX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9ETUFfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZG1hbXV4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBETUFFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX1R5cGVzIERNQUV4IEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIQUwgRE1BIFN5bmNocm8gZGVmaW5pdGlvbgorICAqLworCisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQU1VWCBTeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU3luY1NpZ25hbElEOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZ2F0aW5nIHRoZSBETUEgcmVxdWVzdCBpbiBwZXJpb2RpYyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BRXhfRE1BTVVYX1N5bmNTaWduYWxJRF9zZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBTeW5jUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUgRE1BIHJlcXVlc3QgaXMgc3luY2hyb25pemVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BRXhfRE1BTVVYX1N5bmNQb2xhcml0eV9zZWxlY3Rpb24gKi8KKworICBGdW5jdGlvbmFsU3RhdGUgU3luY0VuYWJsZTsgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgc3luY2hyb25pemF0aW9uIHNoYWxsIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gdGFrZSB0aGUgdmFsdWUgRU5BQkxFIG9yIERJU0FCTEUqLworCisgIEZ1bmN0aW9uYWxTdGF0ZSBFdmVudEVuYWJsZTsgIC8qITwgU3BlY2lmaWVzIGlmIGFuIGV2ZW50IHNoYWxsIGJlIGdlbmVyYXRlZCBvbmNlIHRoZSBSZXF1ZXN0TnVtYmVyIGlzIHJlYWNoZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIHRha2UgdGhlIHZhbHVlIEVOQUJMRSBvciBESVNBQkxFICovCisKKyAgdWludDMyX3QgUmVxdWVzdE51bWJlcjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCB0aGF0IHdpbGwgYmUgYXV0aG9yaXplZCBhZnRlciBhIHN5bmMgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyICovCisKKworfSBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmOworCisKKy8qKgorICAqIEBicmllZiAgSEFMIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTaWduYWxJRDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElEIG9mIHRoZSBzaWduYWwgdXNlZCBmb3IgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFFeF9ETUFNVVhfU2lnbmFsR2VuZXJhdG9ySURfc2VsZWN0aW9uICovCisKKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIHJlcXVlc3QgaXMgZ2VuZXJhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BRXhfRE1BTVVYX1JlcXVlc3RHZW5lbmVyYXRvclBvbGFyaXR5X3NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IFJlcXVlc3ROdW1iZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBhZnRlciBhIHNpZ25hbCBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIgKi8KKworfSBIQUxfRE1BX011eFJlcXVlc3RHZW5lcmF0b3JDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFFeF9FeHBvcnRlZF9Db25zdGFudHMgRE1BRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFFeF9ETUFNVVhfU3luY1NpZ25hbElEX3NlbGVjdGlvbiBETUFNVVggU3luY1NpZ25hbElEIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTAgICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUwICAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTAgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMSAgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEgICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMSAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkyICAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMiAgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkyICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTMgICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUzICAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTMgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJNCAgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTQgICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNCAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk1ICAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNSAgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk1ICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTYgICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU2ICAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTYgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJNyAgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTcgICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJNyAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEk4ICAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOCAgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEk4ICBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTkgICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU5ICAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTkgIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTAgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxMSAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTEgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxMSBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTEyICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMiAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTEyIElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19FWFRJMTMgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBFWFRJMTMgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0VYVEkxNCAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTQgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIEVYVEkxNCBJVCAgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfRVhUSTE1ICAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNSAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgRVhUSTE1IElUICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfU1lOQ19ETUFNVVgxX0NIMF9FVlQgICAgICAgIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDAgICAgICAgLyohPCAgU3luY2hyb25pemF0aW9uIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwwIEV2ZW50ICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0RNQU1VWDFfQ0gxX0VWVCAgICAgICAgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMSAgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDEgRXZlbnQgICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1NZTkNfTFBUSU0xX09VVCAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUICAgICAgIC8qITwgIFN5bmNocm9uaXphdGlvbiBTaWduYWwgaXMgTFBUSU0xIE9VVCAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9TWU5DX0xQVElNMl9PVVQgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfTFBUSU0yX09VVCAgICAgICAvKiE8ICBTeW5jaHJvbml6YXRpb24gU2lnbmFsIGlzIExQVElNMiBPVVQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFFeF9ETUFNVVhfU3luY1BvbGFyaXR5X3NlbGVjdGlvbiBETUFNVVggU3luY1BvbGFyaXR5IHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9ETUFNVVhfU1lOQ19OT19FVkVOVCAgICAgICAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVCAgICAgICAgICAgIC8qITwgYmxvY2sgc3luY2hyb25pemF0aW9uIGV2ZW50cyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9TWU5DX1JJU0lORyAgICAgICAgICAgICAgICAgIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkcgICAgICAgICAgLyohPCBzeW5jaHJvbml6ZSB3aXRoIHJpc2luZyBlZGdlIGV2ZW50cyAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYX1NZTkNfRkFMTElORyAgICAgICAgICAgICAgICAgTExfRE1BTVVYX1NZTkNfUE9MX0ZBTExJTkcgICAgICAgICAvKiE8IHN5bmNocm9uaXplIHdpdGggZmFsbGluZyBlZGdlIGV2ZW50cyAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORyAgICAgICAgICBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcgIC8qITwgc3luY2hyb25pemUgd2l0aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFFeF9ETUFNVVhfU2lnbmFsR2VuZXJhdG9ySURfc2VsZWN0aW9uIERNQU1VWCBTaWduYWxHZW5lcmF0b3JJRCBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkwICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMCAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMCBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMSAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMSBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkyICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMiAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMiBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkzICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMyAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMyBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk0ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNCAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNCBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk1ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNSAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNSBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk2ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNiAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNiBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk3ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNyAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJNyBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk4ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOCAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJOCBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEk5ICAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOSAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJOSBJVCAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMCAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTAgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMSAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTEgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMiAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTIgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTIgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxMyAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTMgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTMgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNCAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTQgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0VYVEkxNSAgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTUgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBFWFRJMTUgSVQgICAqLworI2RlZmluZSBIQUxfRE1BTVVYMV9SRVFfR0VOX0RNQU1VWDFfQ0gwX0VWVCAgICAgTExfRE1BTVVYX1JFUV9HRU5fRE1BTVVYX0NIMCAgICAvKiE8IFJlcXVlc3QgZ2VuZXJhdG9yIFNpZ25hbCBpcyBETUFNVVgxIENoYW5uZWwwIEV2ZW50ICovCisjZGVmaW5lIEhBTF9ETUFNVVgxX1JFUV9HRU5fRE1BTVVYMV9DSDFfRVZUICAgICBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxICAgIC8qITwgUmVxdWVzdCBnZW5lcmF0b3IgU2lnbmFsIGlzIERNQU1VWDEgQ2hhbm5lbDEgRXZlbnQgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTFfT1VUICAgICAgICAgIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMV9PVVQgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgTFBUSU0xIE9VVCAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWDFfUkVRX0dFTl9MUFRJTTJfT1VUICAgICAgICAgIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMl9PVVQgICAgLyohPCBSZXF1ZXN0IGdlbmVyYXRvciBTaWduYWwgaXMgTFBUSU0yIE9VVCAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFFeF9ETUFNVVhfUmVxdWVzdEdlbmVuZXJhdG9yUG9sYXJpdHlfc2VsZWN0aW9uIERNQU1VWCBSZXF1ZXN0R2VuZW5lcmF0b3JQb2xhcml0eSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQgICAgICAgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQgICAgICAgICAgICAgIC8qITwgYmxvY2sgcmVxdWVzdCBnZW5lcmF0b3IgZXZlbnRzICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORyAgICAgICAgICAgICAgIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkcgICAgICAgICAgICAvKiE8IGdlbmVyYXRlIHJlcXVlc3Qgb24gcmlzaW5nIGVkZ2UgZXZlbnRzICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HICAgICAgICAgICAgICBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfRkFMTElORyAgICAgICAgICAgLyohPCBnZW5lcmF0ZSByZXF1ZXN0IG9uIGZhbGxpbmcgZWRnZSBldmVudHMgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcgICAgICAgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HICAgIC8qITwgZ2VuZXJhdGUgcmVxdWVzdCBvbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBldmVudHMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJFUVVFU1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0NvbmZpZ011eFJlcXVlc3RHZW5lcmF0b3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfRE1BX011eFJlcXVlc3RHZW5lcmF0b3JDb25maWdUeXBlRGVmICpwUmVxdWVzdEdlbmVyYXRvckNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfRGlzYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTWU5DSFJPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9Db25maWdNdXhTeW5jKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX011eFN5bmNDb25maWdUeXBlRGVmICpwU3luY0NvbmZpZyk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BRXhfUHJpdmF0ZV9NYWNyb3MgRE1BRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAYnJpZWYgICAgRE1BRXggcHJpdmF0ZSBtYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX1NJR05BTF9JRChTSUdOQUxfSUQpICAgICAgICAgICAgICAgICAgICAgKChTSUdOQUxfSUQpIDw9IEhBTF9ETUFNVVgxX1NZTkNfTFBUSU0yX09VVCkKKworI2RlZmluZSBJU19ETUFNVVhfU1lOQ19SRVFVRVNUX05VTUJFUihSRVFVRVNUX05VTUJFUikgICAgICAgICAgICgoKFJFUVVFU1RfTlVNQkVSKSA+IDBVKSAmJiAoKFJFUVVFU1RfTlVNQkVSKSA8PSAzMlUpKQorCisjZGVmaW5lIElTX0RNQU1VWF9TWU5DX1BPTEFSSVRZKFBPTEFSSVRZKSAgICAgICAgICAgICAgICAgICAgICAgKCgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19OT19FVkVOVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9TWU5DX1JJU0lORykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBIQUxfRE1BTVVYX1NZTkNfRkFMTElORykgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfU1lOQ19SSVNJTkdfRkFMTElORykpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1NZTkNfU1RBVEUoU1lOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChTWU5DKSA9PSBESVNBQkxFKSAgIHx8ICgoU1lOQykgPT0gRU5BQkxFKSkKKworI2RlZmluZSBJU19ETUFNVVhfU1lOQ19FVkVOVChFVkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKEVWRU5UKSA9PSBESVNBQkxFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFVkVOVCkgPT0gRU5BQkxFKSkKKworI2RlZmluZSBJU19ETUFNVVhfUkVRVUVTVF9HRU5fU0lHTkFMX0lEKFNJR05BTF9JRCkgICAgICAgICAgICAgICgoU0lHTkFMX0lEKSA8PSBIQUxfRE1BTVVYMV9SRVFfR0VOX0xQVElNMl9PVVQpCisKKyNkZWZpbmUgSVNfRE1BTVVYX1JFUVVFU1RfR0VOX1JFUVVFU1RfTlVNQkVSKFJFUVVFU1RfTlVNQkVSKSAgICAoKChSRVFVRVNUX05VTUJFUikgPiAwVSkgJiYgKChSRVFVRVNUX05VTUJFUikgPD0gMzJVKSkKKworI2RlZmluZSBJU19ETUFNVVhfUkVRVUVTVF9HRU5fUE9MQVJJVFkoUE9MQVJJVFkpICAgICAgICAgICAgICAgICgoKFBPTEFSSVRZKSA9PSBIQUxfRE1BTVVYX1JFUV9HRU5fTk9fRVZFTlQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lORykgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBIQUxfRE1BTVVYX1JFUV9HRU5fUklTSU5HX0ZBTExJTkcpKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0RNQV9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9leHRpLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9leHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNDEwZAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2V4dGkuaApAQCAtMCwwICsxLDMyNCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfZXh0aS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBFWFRJIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0VYVElfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0VYVElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJIEVYVEkKKyAgKiBAYnJpZWYgRVhUSSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9UeXBlcyBFWFRJIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfRVhUSV9DT01NT05fQ0JfSUQgICAgICAgICAgPSAweDAwVSwKK30gRVhUSV9DYWxsYmFja0lEVHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgSGFuZGxlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBMaW5lOyAgICAgICAgICAgICAgICAgICAgLyohPCAgRXh0aSBsaW5lIG51bWJlciAqLworICB2b2lkICgqIFBlbmRpbmdDYWxsYmFjaykodm9pZCk7ICAgLyohPCAgRXh0aSBwZW5kaW5nIGNhbGxiYWNrICovCit9IEVYVElfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBFWFRJIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IExpbmU7ICAgICAgLyohPCBUaGUgRXh0aSBsaW5lIHRvIGJlIGNvbmZpZ3VyZWQuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTGluZSAqLworICB1aW50MzJfdCBNb2RlOyAgICAgIC8qITwgVGhlIEV4aXQgTW9kZSB0byBiZSBjb25maWd1cmVkIGZvciBhIGNvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBAcmVmIEVYVElfTW9kZSAqLworICB1aW50MzJfdCBUcmlnZ2VyOyAgIC8qITwgVGhlIEV4dGkgVHJpZ2dlciB0byBiZSBjb25maWd1cmVkLiBUaGlzIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX1RyaWdnZXIgKi8KKyAgdWludDMyX3QgR1BJT1NlbDsgICAvKiE8IFRoZSBFeHRpIEdQSU8gbXVsdGlwbGV4ZXIgc2VsZWN0aW9uIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHBvc3NpYmxlIGZvciBsaW5lIDAgdG8gMTUuIEl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfR1BJT1NlbCAqLworfSBFWFRJX0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfRXhwb3J0ZWRfQ29uc3RhbnRzIEVYVEkgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0xpbmUgIEVYVEkgTGluZQorICAqIEB7CisgICovCisjZGVmaW5lIEVYVElfTElORV8wICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MDB1KQorI2RlZmluZSBFWFRJX0xJTkVfMSAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDAxdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzIgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgwMnUpCisjZGVmaW5lIEVYVElfTElORV8zICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MDN1KQorI2RlZmluZSBFWFRJX0xJTkVfNCAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDA0dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzUgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgwNXUpCisjZGVmaW5lIEVYVElfTElORV82ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MDZ1KQorI2RlZmluZSBFWFRJX0xJTkVfNyAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDA3dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzggICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgwOHUpCisjZGVmaW5lIEVYVElfTElORV85ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MDl1KQorI2RlZmluZSBFWFRJX0xJTkVfMTAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDBBdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzExICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgwQnUpCisjZGVmaW5lIEVYVElfTElORV8xMiAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MEN1KQorI2RlZmluZSBFWFRJX0xJTkVfMTMgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDBEdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE0ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgwRXUpCisjZGVmaW5lIEVYVElfTElORV8xNSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MEZ1KQorI2RlZmluZSBFWFRJX0xJTkVfMTYgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzEgfCAweDEwdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzE3ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgxMXUpCisjZGVmaW5lIEVYVElfTElORV8xOCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MTJ1KQorI2RlZmluZSBFWFRJX0xJTkVfMTkgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzEgfCAweDEzdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzIwICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcxIHwgMHgxNHUpCisjZGVmaW5lIEVYVElfTElORV8yMSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgIHwgRVhUSV9FVkVOVCB8IEVYVElfUkVHMSB8IDB4MTV1KQorI2RlZmluZSBFWFRJX0xJTkVfMjIgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzEgfCAweDE2dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzIzICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCAgICAgICAgICAgICAgRVhUSV9SRUcxIHwgMHgxN3UpCisjZGVmaW5lIEVYVElfTElORV8yNCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMSB8IDB4MTh1KQorI2RlZmluZSBFWFRJX0xJTkVfMjUgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzEgfCAweDE5dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCAgICAgICAgICAgICAgRVhUSV9SRUcxIHwgMHgxQXUpCisjZGVmaW5lIEVYVElfTElORV8yNyAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEIHwgICAgICAgICAgICAgIEVYVElfUkVHMSB8IDB4MUJ1KQorI2RlZmluZSBFWFRJX0xJTkVfMjggICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzEgfCAweDFDdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCAgICAgICAgICAgICAgRVhUSV9SRUcxIHwgMHgxRHUpCisjZGVmaW5lIEVYVElfTElORV8zMCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMSB8IDB4MUV1KQorI2RlZmluZSBFWFRJX0xJTkVfMzEgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzEgfCAweDFGdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzMyICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCAgICAgICAgICAgICAgRVhUSV9SRUcyIHwgMHgwMHUpCisjZGVmaW5lIEVYVElfTElORV8zMyAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MDF1KQorI2RlZmluZSBFWFRJX0xJTkVfMzQgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9SRVNFUlZFRCB8ICAgICAgICAgICAgICBFWFRJX1JFRzIgfCAweDAydSkKKyNkZWZpbmUgRVhUSV9MSU5FXzM1ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCAgICAgICAgICAgICAgRVhUSV9SRUcyIHwgMHgwM3UpCisjZGVmaW5lIEVYVElfTElORV8zNiAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MDR1KQorI2RlZmluZSBFWFRJX0xJTkVfMzcgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzIgfCAweDA1dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzM4ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCAgICAgICAgICAgICAgRVhUSV9SRUcyIHwgMHgwNnUpCisjZGVmaW5lIEVYVElfTElORV8zOSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MDd1KQorI2RlZmluZSBFWFRJX0xJTkVfNDAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICB8IEVYVElfRVZFTlQgfCBFWFRJX1JFRzIgfCAweDA4dSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQxICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgfCBFWFRJX0VWRU5UIHwgRVhUSV9SRUcyIHwgMHgwOXUpCisjZGVmaW5lIEVYVElfTElORV80MiAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MEF1KQorI2RlZmluZSBFWFRJX0xJTkVfNDMgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzIgfCAweDBCdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQ0ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfRElSRUNUICAgfCAgICAgICAgICAgICAgRVhUSV9SRUcyIHwgMHgwQ3UpCisjZGVmaW5lIEVYVElfTElORV80NSAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MER1KQorI2RlZmluZSBFWFRJX0xJTkVfNDYgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgICB8ICAgICAgICAgICAgICBFWFRJX1JFRzIgfCAweDBFdSkKKyNkZWZpbmUgRVhUSV9MSU5FXzQ3ICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfUkVTRVJWRUQgfCAgICAgICAgICAgICAgRVhUSV9SRUcyIHwgMHgwRnUpCisjZGVmaW5lIEVYVElfTElORV80OCAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0RJUkVDVCAgIHwgICAgICAgICAgICAgIEVYVElfUkVHMiB8IDB4MTB1KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX01vZGUgIEVYVEkgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEVYVElfTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1CisjZGVmaW5lIEVYVElfTU9ERV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDF1CisjZGVmaW5lIEVYVElfTU9ERV9FVkVOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJ1CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfVHJpZ2dlciAgRVhUSSBUcmlnZ2VyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRVhUSV9UUklHR0VSX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lORyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMXUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX0ZBTExJTkcgICAgICAgICAgICAgICAgMHgwMDAwMDAwMnUKKyNkZWZpbmUgRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HICAgICAgICAgKEVYVElfVFJJR0dFUl9SSVNJTkcgfCBFWFRJX1RSSUdHRVJfRkFMTElORykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9HUElPU2VsICBFWFRJIEdQSU9TZWwKKyAgKiBAYnJpZWYKKyAgKiBAeworICAqLworI2RlZmluZSBFWFRJX0dQSU9BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBFWFRJX0dQSU9CICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxdQorI2RlZmluZSBFWFRJX0dQSU9DICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAydQorI2RlZmluZSBFWFRJX0dQSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzdQorI2RlZmluZSBFWFRJX0dQSU9FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0dQorI2RlZmluZSBFWFRJX0dQSU9IICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3dQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9Db25zdGFudHMgRVhUSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTGluZSBwcm9wZXJ0eSBkZWZpbml0aW9uCisgICovCisjZGVmaW5lIEVYVElfUFJPUEVSVFlfU0hJRlQgICAgICAgICAgICAgICAgIDI0dQorI2RlZmluZSBFWFRJX0RJUkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMXVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpCisjZGVmaW5lIEVYVElfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICgweDAydUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkKKyNkZWZpbmUgRVhUSV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDA0dUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkgfCBFWFRJX0NPTkZJRykKKyNkZWZpbmUgRVhUSV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDh1TCA8PCBFWFRJX1BST1BFUlRZX1NISUZUKQorI2RlZmluZSBFWFRJX1BST1BFUlRZX01BU0sgICAgICAgICAgICAgICAgICAoRVhUSV9ESVJFQ1QgfCBFWFRJX0NPTkZJRyB8IEVYVElfR1BJTykKKworLyoqCisgICogQGJyaWVmICBFWFRJIEV2ZW50IHByZXNlbmNlIGRlZmluaXRpb24KKyAgKi8KKyNkZWZpbmUgRVhUSV9FVkVOVF9QUkVTRU5DRV9TSElGVCAgICAgICAgICAgMjh1CisjZGVmaW5lIEVYVElfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxdUwgPDwgRVhUSV9FVkVOVF9QUkVTRU5DRV9TSElGVCkKKyNkZWZpbmUgRVhUSV9FVkVOVF9QUkVTRU5DRV9NQVNLICAgICAgICAgICAgKEVYVElfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRVhUSSBSZWdpc3RlciBhbmQgYml0IHVzYWdlCisgICovCisjZGVmaW5lIEVYVElfUkVHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2dQorI2RlZmluZSBFWFRJX1JFRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMHVMIDw8IEVYVElfUkVHX1NISUZUKQorI2RlZmluZSBFWFRJX1JFRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMXVMIDw8IEVYVElfUkVHX1NISUZUKQorI2RlZmluZSBFWFRJX1JFR19NQVNLICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9SRUcxIHwgRVhUSV9SRUcyKQorI2RlZmluZSBFWFRJX1BJTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFGdQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTWFzayBmb3IgaW50ZXJydXB0ICYgZXZlbnQgbW9kZQorICAqLworI2RlZmluZSBFWFRJX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9NT0RFX0VWRU5UIHwgRVhUSV9NT0RFX0lOVEVSUlVQVCkKKworLyoqCisgICogQGJyaWVmICBFWFRJIE1hc2sgZm9yIHRyaWdnZXIgcG9zc2liaWxpdGllcworICAqLworI2RlZmluZSBFWFRJX1RSSUdHRVJfTUFTSyAgICAgICAgICAgICAgICAgICAoRVhUSV9UUklHR0VSX1JJU0lORyB8IEVYVElfVFJJR0dFUl9GQUxMSU5HKQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgTGluZSBudW1iZXIKKyAgKi8KKyNkZWZpbmUgRVhUSV9MSU5FX05CICAgICAgICAgICAgICAgICAgICAgICAgNDl1TAorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX1ByaXZhdGVfTWFjcm9zIEVYVEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19FWFRJX0xJTkUoX19MSU5FX18pICAgICAgICAgICgoKChfX0xJTkVfXykgJiB+KEVYVElfUFJPUEVSVFlfTUFTSyB8IEVYVElfRVZFTlRfUFJFU0VOQ0VfTUFTSyB8IEVYVElfUkVHX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgPT0gMHgwMHUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19MSU5FX18pICYgRVhUSV9QUk9QRVJUWV9NQVNLKSA9PSBFWFRJX0RJUkVDVCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fTElORV9fKSAmIEVYVElfUFJPUEVSVFlfTUFTSykgPT0gRVhUSV9DT05GSUcpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0xJTkVfXykgJiBFWFRJX1BST1BFUlRZX01BU0spID09IEVYVElfR1BJTykpICAgICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19MSU5FX18pICYgKEVYVElfUkVHX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgICAgICA8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoRVhUSV9MSU5FX05CIC8gMzJ1KSA8PCBFWFRJX1JFR19TSElGVCkgfCAoRVhUSV9MSU5FX05CICUgMzJ1KSkpKQorCisjZGVmaW5lIElTX0VYVElfTU9ERShfX0xJTkVfXykgICAgICAgICAgKCgoKF9fTElORV9fKSAmIEVYVElfTU9ERV9NQVNLKSAhPSAweDAwdSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0xJTkVfXykgJiB+RVhUSV9NT0RFX01BU0spID09IDB4MDB1KSkKKworI2RlZmluZSBJU19FWFRJX1RSSUdHRVIoX19MSU5FX18pICAgICAgICgoKF9fTElORV9fKSAmIH5FWFRJX1RSSUdHRVJfTUFTSykgPT0gMHgwMHUpCisKKyNkZWZpbmUgSVNfRVhUSV9QRU5ESU5HX0VER0UoX19MSU5FX18pICAoKF9fTElORV9fKSA9PSBFWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcpCisKKyNkZWZpbmUgSVNfRVhUSV9DT05GSUdfTElORShfX0xJTkVfXykgICAoKChfX0xJTkVfXykgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpCisKKyNkZWZpbmUgSVNfRVhUSV9HUElPX1BPUlQoX19QT1JUX18pICAgICAoKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0gpKQorCisjZGVmaW5lIElTX0VYVElfR1BJT19QSU4oX19QSU5fXykgICAgICAgKChfX1BJTl9fKSA8IDE2dSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9ucyBFWFRJIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEBicmllZiAgICBFWFRJIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9TZXRDb25maWdMaW5lKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIEVYVElfQ29uZmlnVHlwZURlZiAqcEV4dGlDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfR2V0Q29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCBFWFRJX0NvbmZpZ1R5cGVEZWYgKnBFeHRpQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1JlZ2lzdGVyQ2FsbGJhY2soRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCB2b2lkICgqcFBlbmRpbmdDYmZuKSh2b2lkKSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9HZXRIYW5kbGUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRXh0aUxpbmUpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfRVhUSV9JUlFIYW5kbGVyKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpOwordWludDMyX3QgICAgICAgICAgSEFMX0VYVElfR2V0UGVuZGluZyhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFZGdlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9FWFRJX0NsZWFyUGVuZGluZyhFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFZGdlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9FWFRJX0dlbmVyYXRlU1dJKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9FWFRJX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2ZsYXNoLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZGVmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaC5oCkBAIC0wLDAgKzEsOTM4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9mbGFzaC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTEFTSCBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfRkxBU0hfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0ZMQVNIX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX1R5cGVzIEZMQVNIIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBGTEFTSCBFcmFzZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVHlwZUVyYXNlOyAgIC8qITwgTWFzcyBlcmFzZSBvciBwYWdlIGVyYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZMQVNIX1RZUEVfRVJBU0UgKi8KKyAgdWludDMyX3QgUGFnZTsgICAgICAgIC8qITwgSW5pdGlhbCBGbGFzaCBwYWdlIHRvIGVyYXNlIHdoZW4gcGFnZSBlcmFzZSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIChGTEFTSF9QQUdFX05CIC0gMSkgKi8KKyAgdWludDMyX3QgTmJQYWdlczsgICAgIC8qITwgTnVtYmVyIG9mIHBhZ2VzIHRvIGJlIGVyYXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMSBhbmQgKEZMQVNIX1BBR0VfTkIgLSB2YWx1ZSBvZiBpbml0aWFsIHBhZ2UpKi8KK30gRkxBU0hfRXJhc2VJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBGTEFTSCBPcHRpb24gQnl0ZXMgUHJvZ3JhbSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT3B0aW9uVHlwZTsgICAgICAgICAgICAgLyohPCBPcHRpb24gYnl0ZSB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YgQHJlZiBGTEFTSF9PQl9UWVBFICovCisgIHVpbnQzMl90IFdSUEFyZWE7ICAgICAgICAgICAgICAgICAvKiE8IFdyaXRlIHByb3RlY3Rpb24gYXJlYSB0byBiZSBwcm9ncmFtbWVkICh1c2VkIGZvciBPUFRJT05CWVRFX1dSUCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBvbmUgV1JQIGFyZWEgY291bGQgYmUgcHJvZ3JhbW1lZCBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB2YWx1ZSBvZiBAcmVmIEZMQVNIX09CX1dSUF9BUkVBICovCisgIHVpbnQzMl90IFdSUFN0YXJ0T2Zmc2V0OyAgICAgICAgIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBzdGFydCBvZmZzZXQgKHVzZWQgZm9yIE9QVElPTkJZVEVfV1JQKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcyAtIDEpICovCisgIHVpbnQzMl90IFdSUEVuZE9mZnNldDsgICAgICAgICAgIC8qITwgV3JpdGUgcHJvdGVjdGlvbiBlbmQgb2Zmc2V0ICh1c2VkIGZvciBPUFRJT05CWVRFX1dSUCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gV1JQU3RhcnRPZmZzZXQgYW5kIChtYXggbnVtYmVyIG9mIHBhZ2VzIC0gMSkgKi8KKyAgdWludDMyX3QgUkRQTGV2ZWw7ICAgICAgICAgICAgICAgLyohPCBTZXQgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbCAodXNlZCBmb3IgT1BUSU9OQllURV9SRFApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfT0JfUkVBRF9QUk9URUNUSU9OICovCisgIHVpbnQzMl90IFVzZXJUeXBlOyAgICAgICAgICAgICAgIC8qITwgVXNlciBvcHRpb24gYnl0ZShzKSB0byBiZSBjb25maWd1cmVkICh1c2VkIGZvciBPUFRJT05CWVRFX1VTRVIpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEByZWYgRkxBU0hfT0JfVVNFUl9UWVBFICovCisgIHVpbnQzMl90IFVzZXJDb25maWc7ICAgICAgICAgICAgIC8qITwgVmFsdWUgb2YgdGhlIHVzZXIgb3B0aW9uIGJ5dGUgKHVzZWQgZm9yIE9QVElPTkJZVEVfVVNFUikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfQUdDX1RSSU0sIEByZWYgRkxBU0hfT0JfVVNFUl9CT1JfTEVWRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RPUCwgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU1RBTkRCWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25SU1RfU0hVVERPV04sIEByZWYgRkxBU0hfT0JfVVNFUl9JV0RHX1NXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVE9QLCBAcmVmIEZMQVNIX09CX1VTRVJfSVdER19TVEFOREJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIEZMQVNIX09CX1VTRVJfV1dER19TVywgQHJlZiBGTEFTSF9PQl9VU0VSX25CT09UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX1NSQU0yUEUsIEByZWYgRkxBU0hfT0JfVVNFUl9TUkFNMlJTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBGTEFTSF9PQl9VU0VSX25TV0JPT1QwLCBAcmVmIEZMQVNIX09CX1VTRVJfbkJPT1QwICovCisgIHVpbnQzMl90IFBDUk9QQ29uZmlnOyAgICAgICAgICAgIC8qITwgQ29uZmlndXJhdGlvbiBvZiB0aGUgUENST1AgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiB2YWx1ZXMgb2YgQHJlZiBGTEFTSF9PQl9QQ1JPUF9aT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEByZWYgRkxBU0hfT0JfUENST1BfUkRQICovCisgIHVpbnQzMl90IFBDUk9QMUFTdGFydEFkZHI7ICAgICAgIC8qITwgUENST1AgWm9uZSBBIFN0YXJ0IGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLiBJdCByZXByZXNlbnRzIGZpcnN0IGFkZHJlc3Mgb2Ygc3RhcnQgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm90ZWN0LiBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgbXVsdGlwbGUgb2YgUENST1AgZ3JhbnVsYXJpdHkgKi8KKyAgdWludDMyX3QgUENST1AxQUVuZEFkZHI7ICAgICAgICAgLyohPCBQQ1JPUCBab25lIEEgRW5kIGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLiBJdCByZXByZXNlbnRzIGZpcnN0IGFkZHJlc3Mgb2YgZW5kIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdGVjdC4gTWFrZSBzdXJlIHRoaXMgcGFyYW1ldGVyIGlzIG11bHRpcGxlIG9mIFBDUk9QIGdyYW51bGFyaXR5ICovCisgIHVpbnQzMl90IFBDUk9QMUJTdGFydEFkZHI7ICAgICAgIC8qITwgUENST1AgWm9uZSBCIFN0YXJ0IGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLiBJdCByZXByZXNlbnRzIGZpcnN0IGFkZHJlc3Mgb2Ygc3RhcnQgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm90ZWN0LiBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgbXVsdGlwbGUgb2YgUENST1AgZ3JhbnVsYXJpdHkgKi8KKyAgdWludDMyX3QgUENST1AxQkVuZEFkZHI7ICAgICAgICAgLyohPCBQQ1JPUCBab25lIEIgRW5kIGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfUENST1ApLiBJdCByZXByZXNlbnRzIGZpcnN0IGFkZHJlc3Mgb2YgZW5kIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdGVjdC4gTWFrZSBzdXJlIHRoaXMgcGFyYW1ldGVyIGlzIG11bHRpcGxlIG9mIFBDUk9QIGdyYW51bGFyaXR5ICovCisgIHVpbnQzMl90IFNlY3VyZUZsYXNoU3RhcnRBZGRyOyAgIC8qITwgU2VjdXJlIEZsYXNoIHN0YXJ0IGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfU0VDVVJFX01PREUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgb2YgRmxhc2ggYmFuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IENvbnRhaW5zIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBmaXJzdCA0a0IgcGFnZSBvZiB0aGUgc2VjdXJlIEZsYXNoIGFyZWEgKi8KKyAgdWludDMyX3QgU2VjdXJlUkFNMmFTdGFydEFkZHI7ICAgLyohPCBTZWN1cmUgQmFja3VwIFJBTTJhIHN0YXJ0IGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfU0VDVVJFX01PREUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfU1JBTTJBX0FERFJFU1NfUkFOR0UgKi8KKyAgdWludDMyX3QgU2VjdXJlUkFNMmJTdGFydEFkZHI7ICAgLyohPCBTZWN1cmUgbm9uLUJhY2t1cCBSQU0yYiBzdGFydCBhZGRyZXNzICh1c2VkIGZvciBPUFRJT05CWVRFX1NFQ1VSRV9NT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfU1JBTTJCX0FERFJFU1NfUkFOR0UgKi8KKyAgdWludDMyX3QgU2VjdXJlTW9kZTsgICAgICAgICAgICAgLyohPCBTZWN1cmUgbW9kZSBhY3RpdmF0ZWQgb3IgZGVzYWN0aXZhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfT0JfU0VDVVJJVFlfTU9ERSAqLworICB1aW50MzJfdCBDMkJvb3RSZWdpb247ICAgICAgICAgICAvKiE8IENQVTIgU2VjdXJlIEJvb3QgbWVtb3J5IHJlZ2lvbih1c2VkIGZvciBPUFRJT05CWVRFX0MyX0JPT1RfVkVDVCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDMl9GTEFTSF9PQl9CT09UX1JFR0lPTiAqLworICB1aW50MzJfdCBDMlNlY3VyZUJvb3RWZWN0QWRkcjsgICAvKiE8IENQVTIgU2VjdXJlIEJvb3QgcmVzZXQgdmVjdG9yICh1c2VkIGZvciBPUFRJT05CWVRFX0MyX0JPT1RfVkVDVCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIENQVTIgYm9vdCByZXNldCBzdGFydCBhZGRyZXNzIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWxlY3RlZCBtZW1vcnkgcmVnaW9uLiBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgd29yZCBhbGlnbmVkLiAqLworICB1aW50MzJfdCBJUENDZGF0YUJ1ZkFkZHI7ICAgICAgICAvKiE8IElQQ0MgbWFpbGJveCBkYXRhIGJ1ZmZlciBiYXNlIGFkZHJlc3MgKHVzZWQgZm9yIE9QVElPTkJZVEVfSVBDQ19CVUZfQUREUikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIElQQ0MgbWFpbGJveCBkYXRhIGJ1ZmZlciBzdGFydCBhZGRyZXNzIGFyZWEgaW4gU1JBTTIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSBzdXJlIHRoaXMgcGFyYW1ldGVyIGlzIGRvdWJsZS13b3JkIGFsaWduZWQuICAqLworfSBGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZjsKKworLyoqCisqIEBicmllZiAgRkxBU0ggaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSEFMX0xvY2tUeXBlRGVmICAgTG9jazsgICAgICAgICAgICAgIC8qIEZMQVNIIGxvY2tpbmcgb2JqZWN0ICovCisgIHVpbnQzMl90ICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAvKiBGTEFTSCBlcnJvciBjb2RlICovCisgIHVpbnQzMl90ICAgICAgICAgIFByb2NlZHVyZU9uR29pbmc7ICAvKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9jZWR1cmUgaXMgb25nb2luZyBvciBub3QgaW4gSVQgY29udGV4dCAqLworICB1aW50MzJfdCAgICAgICAgICBBZGRyZXNzOyAgICAgICAgICAgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSBhZGRyZXNzIHNlbGVjdGVkIGZvciBwcm9ncmFtIGluIElUIGNvbnRleHQgKi8KKyAgdWludDMyX3QgICAgICAgICAgUGFnZTsgICAgICAgICAgICAgIC8qIEludGVybmFsIHZhcmlhYmxlIHRvIGRlZmluZSB0aGUgY3VycmVudCBwYWdlIHdoaWNoIGlzIGVyYXNpbmcgaW4gSVQgY29udGV4dCAqLworICB1aW50MzJfdCAgICAgICAgICBOYlBhZ2VzVG9FcmFzZTsgICAgLyogSW50ZXJuYWwgdmFyaWFibGUgdG8gc2F2ZSB0aGUgcmVtYWluaW5nIHBhZ2VzIHRvIGVyYXNlIGluIElUIGNvbnRleHQgKi8KK30gRkxBU0hfUHJvY2Vzc1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0NvbnN0YW50cyBGTEFTSCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0tFWVMgRkxBU0ggS2V5cworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0tFWTEgICAgICAgICAgICAgICAgICAgICAgMHg0NTY3MDEyM1UgIC8qITwgRmxhc2gga2V5MSAqLworI2RlZmluZSBGTEFTSF9LRVkyICAgICAgICAgICAgICAgICAgICAgIDB4Q0RFRjg5QUJVICAvKiE8IEZsYXNoIGtleTI6IHVzZWQgd2l0aCBGTEFTSF9LRVkxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdW5sb2NrIHRoZSBGTEFTSCByZWdpc3RlcnMgYWNjZXNzICovCisKKyNkZWZpbmUgRkxBU0hfT1BUS0VZMSAgICAgICAgICAgICAgICAgICAweDA4MTkyQTNCVSAgLyohPCBGbGFzaCBvcHRpb24gYnl0ZSBrZXkxICovCisjZGVmaW5lIEZMQVNIX09QVEtFWTIgICAgICAgICAgICAgICAgICAgMHg0QzVENkU3RlUgIC8qITwgRmxhc2ggb3B0aW9uIGJ5dGUga2V5MjogdXNlZCB3aXRoIEZMQVNIX09QVEtFWTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgb3B0aW9uIGJ5dGVzIG9wZXJhdGlvbnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfTEFURU5DWSBGTEFTSCBMYXRlbmN5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8wICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVUwgICAgICAgIC8qITwgRkxBU0ggWmVybyB3YWl0IHN0YXRlICAgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8xICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8wIC8qITwgRkxBU0ggT25lIHdhaXQgc3RhdGUgICAgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8yICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8xIC8qITwgRkxBU0ggVHdvIHdhaXQgc3RhdGVzICAgKi8KKyNkZWZpbmUgRkxBU0hfTEFURU5DWV8zICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8yIC8qITwgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRkxBR1MgRkxBU0ggRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRU9QICAgICAgICAgICAgICAgICAgRkxBU0hfU1JfRU9QICAgICAgLyohPCBGTEFTSCBFbmQgb2Ygb3BlcmF0aW9uIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19PUEVSUiAgICAgICAgICAgICAgICBGTEFTSF9TUl9PUEVSUiAgICAvKiE8IEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUFJPR0VSUiAgICAgICAgICAgICAgRkxBU0hfU1JfUFJPR0VSUiAgLyohPCBGTEFTSCBQcm9ncmFtbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfV1JQRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfV1JQRVJSICAgLyohPCBGTEFTSCBXcml0ZSBwcm90ZWN0aW9uIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19QR0FFUlIgICAgICAgICAgICAgICBGTEFTSF9TUl9QR0FFUlIgICAvKiE8IEZMQVNIIFByb2dyYW1taW5nIGFsaWdubWVudCBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfU0laRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfU0laRVJSICAgLyohPCBGTEFTSCBTaXplIGVycm9yIGZsYWcgICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUEdTRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfUEdTRVJSICAgLyohPCBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfTUlTRVJSICAgICAgICAgICAgICAgRkxBU0hfU1JfTUlTRVJSICAgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRkFTVEVSUiAgICAgICAgICAgICAgRkxBU0hfU1JfRkFTVEVSUiAgLyohPCBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19PUFROViAgICAgICAgICAgICAgICBGTEFTSF9TUl9PUFROViAgICAvKiE8IEZMQVNIIFVzZXIgT3B0aW9uIE9QVFZBTCBpbmRpY2F0aW9uICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfUkRFUlIgICAgICAgICAgICAgICAgRkxBU0hfU1JfUkRFUlIgICAgLyohPCBGTEFTSCBQQ1JPUCByZWFkIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19PUFRWRVJSICAgICAgICAgICAgICBGTEFTSF9TUl9PUFRWRVJSICAvKiE8IEZMQVNIIE9wdGlvbiB2YWxpZGl0eSBlcnJvciBmbGFnICAqLworI2RlZmluZSBGTEFTSF9GTEFHX0JTWSAgICAgICAgICAgICAgICAgIEZMQVNIX1NSX0JTWSAgICAgIC8qITwgRkxBU0ggQnVzeSBmbGFnICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfQ0ZHQlNZICAgICAgICAgICAgICAgRkxBU0hfU1JfQ0ZHQlNZICAgLyohPCBGTEFTSCBQcm9ncmFtbWluZy9lcmFzZSBjb25maWd1cmF0aW9uIGJ1c3kgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19QRVNEICAgICAgICAgICAgICAgICBGTEFTSF9TUl9QRVNEICAgICAvKiE8IEZMQVNIIFByb2dyYW1taW5nL2VyYXNlIG9wZXJhdGlvbiBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgRkxBU0hfRkxBR19FQ0NDICAgICAgICAgICAgICAgICBGTEFTSF9FQ0NSX0VDQ0MgICAvKiE8IEZMQVNIIEVDQyBjb3JyZWN0aW9uICovCisjZGVmaW5lIEZMQVNIX0ZMQUdfRUNDRCAgICAgICAgICAgICAgICAgRkxBU0hfRUNDUl9FQ0NEICAgLyohPCBGTEFTSCBFQ0MgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgRkxBU0hfRkxBR19TUl9FUlJPUiAgICAgICAgICAgICAoRkxBU0hfRkxBR19PUEVSUiAgIHwgRkxBU0hfRkxBR19QUk9HRVJSIHwgRkxBU0hfRkxBR19XUlBFUlIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX0ZMQUdfUEdBRVJSICB8IEZMQVNIX0ZMQUdfU0laRVJSICB8IEZMQVNIX0ZMQUdfUEdTRVJSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9GTEFHX01JU0VSUiAgfCBGTEFTSF9GTEFHX0ZBU1RFUlIgfCBGTEFTSF9GTEFHX1JERVJSICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfRkxBR19PUFRWRVJSKSAgICAgLyohPCBBbGwgU1IgZXJyb3IgZmxhZ3MgKi8KKworI2RlZmluZSBGTEFTSF9GTEFHX0FMTF9FUlJPUlMgICAgICAgICAgIChGTEFTSF9GTEFHX1NSX0VSUk9SIHwgRkxBU0hfRkxBR19FQ0NDIHwgRkxBU0hfRkxBR19FQ0NEKQorCisvKiogQGRlZmdyb3VwIEZMQVNIX0lOVEVSUlVQVF9ERUZJTklUSU9OIEZMQVNIIEludGVycnVwdHMgRGVmaW5pdGlvbgorICAqIEBicmllZiBGTEFTSCBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX0lUX0VPUCAgICAgICAgICAgICAgICAgICAgRkxBU0hfQ1JfRU9QSUUgICAgIC8qITwgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lIEZMQVNIX0lUX09QRVJSICAgICAgICAgICAgICAgICAgRkxBU0hfQ1JfRVJSSUUgICAgIC8qITwgRXJyb3IgSW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBGTEFTSF9JVF9SREVSUiAgICAgICAgICAgICAgICAgIEZMQVNIX0NSX1JERVJSSUUgICAvKiE8IFBDUk9QIFJlYWQgRXJyb3IgSW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZSBGTEFTSF9JVF9FQ0NDICAgICAgICAgICAgICAgICAgIChGTEFTSF9FQ0NSX0VDQ0NJRSA+PiBGTEFTSF9FQ0NSX0VDQ0NJRV9Qb3MpICAvKiE8IEVDQyBDb3JyZWN0aW9uIEludGVycnVwdCBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRVJST1IgRkxBU0ggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfTk9ORSAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9PUCAgICAgICAgICAgICAgRkxBU0hfRkxBR19PUEVSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfUFJPRyAgICAgICAgICAgIEZMQVNIX0ZMQUdfUFJPR0VSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfV1JQICAgICAgICAgICAgIEZMQVNIX0ZMQUdfV1JQRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9QR0EgICAgICAgICAgICAgRkxBU0hfRkxBR19QR0FFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1NJWiAgICAgICAgICAgICBGTEFTSF9GTEFHX1NJWkVSUgorI2RlZmluZSBIQUxfRkxBU0hfRVJST1JfUEdTICAgICAgICAgICAgIEZMQVNIX0ZMQUdfUEdTRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9NSVMgICAgICAgICAgICAgRkxBU0hfRkxBR19NSVNFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QgICAgICAgICAgICBGTEFTSF9GTEFHX0ZBU1RFUlIKKyNkZWZpbmUgSEFMX0ZMQVNIX0VSUk9SX1JEICAgICAgICAgICAgICBGTEFTSF9GTEFHX1JERVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9PUFRWICAgICAgICAgICAgRkxBU0hfRkxBR19PUFRWRVJSCisjZGVmaW5lIEhBTF9GTEFTSF9FUlJPUl9FQ0NEICAgICAgICAgICAgRkxBU0hfRkxBR19FQ0NECisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX1RZUEVfRVJBU0UgRkxBU0ggRXJhc2UgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1RZUEVFUkFTRV9QQUdFUyAgICAgICAgICAgRkxBU0hfQ1JfUEVSICAvKiE8IFBhZ2VzIGVyYXNlIG9ubHkqLworI2RlZmluZSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFICAgICAgIEZMQVNIX0NSX01FUiAgLyohPCBGbGFzaCBtYXNzIGVyYXNlIGFjdGl2YXRpb24qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9UWVBFX1BST0dSQU0gRkxBU0ggUHJvZ3JhbSBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCAgICBGTEFTSF9DUl9QRyAgICAgLyohPCBQcm9ncmFtIGEgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4qLworI2RlZmluZSBGTEFTSF9UWVBFUFJPR1JBTV9GQVNUICAgICAgICAgIEZMQVNIX0NSX0ZTVFBHICAvKiE8IEZhc3QgcHJvZ3JhbSBhIDY0IHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCBhbm90aGVyIDY0IHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSB3aWxsIGJlIHByb2dyYW1tZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVFlQRSBGTEFTSCBPcHRpb24gQnl0ZXMgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIE9QVElPTkJZVEVfV1JQICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgV1JQIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1BUSU9OQllURV9SRFAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBSRFAgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBPUFRJT05CWVRFX1VTRVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IFVzZXIgb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICovCisjZGVmaW5lIE9QVElPTkJZVEVfUENST1AgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgIC8qITwgUENST1Agb3B0aW9uIGJ5dGUgY29uZmlndXJhdGlvbiAgICAgICAgICAgKi8KKyNkZWZpbmUgT1BUSU9OQllURV9JUENDX0JVRl9BRERSICAgICAgICAweDAwMDAwMDEwVSAgLyohPCBJUENDIG1haWxib3ggYnVmZmVyIGFkZHJlc3MgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPUFRJT05CWVRFX0MyX0JPT1RfVkVDVCAgICAgICAgIDB4MDAwMDAxMDBVICAvKiE8IENQVTIgU2VjdXJlIEJvb3QgcmVzZXQgdmVjdG9yICAgICAgICAgICAgICovCisjZGVmaW5lIE9QVElPTkJZVEVfU0VDVVJFX01PREUgICAgICAgICAgMHgwMDAwMDIwMFUgIC8qITwgU2VjdXJlIG1vZGUgb24gYWN0aXZhdGVkIG9yIG5vdCAgICAgICAgICAgKi8KKyNkZWZpbmUgT1BUSU9OQllURV9BTEwgICAgICAgICAgICAgICAgICAoT1BUSU9OQllURV9XUlAgICB8IE9QVElPTkJZVEVfUkRQICAgICAgICAgICB8IE9QVElPTkJZVEVfVVNFUiAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX1BDUk9QIHwgT1BUSU9OQllURV9JUENDX0JVRl9BRERSIHwgT1BUSU9OQllURV9DMl9CT09UX1ZFQ1QgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTkJZVEVfU0VDVVJFX01PREUpIC8qITwgQWxsIG9wdGlvbiBieXRlIGNvbmZpZ3VyYXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfV1JQX0FSRUEgRkxBU0ggV1JQIEFyZWEKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9XUlBBUkVBX0JBTksxX0FSRUFBICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IEZsYXNoIEFyZWEgQSAqLworI2RlZmluZSBPQl9XUlBBUkVBX0JBTksxX0FSRUFCICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IEZsYXNoIEFyZWEgQiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9SRUFEX1BST1RFQ1RJT04gRkxBU0ggT3B0aW9uIEJ5dGVzIFJlYWQgUHJvdGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1JEUF9MRVZFTF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDBBQVUKKyNkZWZpbmUgT0JfUkRQX0xFVkVMXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMEJCVQorI2RlZmluZSBPQl9SRFBfTEVWRUxfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwQ0NVICAvKiE8IFdhcm5pbmc6IFdoZW4gZW5hYmxpbmcgcmVhZCBwcm90ZWN0aW9uIGxldmVsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCdzIG5vIG1vcmUgcG9zc2libGUgdG8gZ28gYmFjayB0byBsZXZlbCAxIG9yIDAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9UWVBFIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9VU0VSX0JPUl9MRVYgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfQk9SX0xFViAgICAvKiE8IEJPUiByZXNldCBMZXZlbCAqLworI2RlZmluZSBPQl9VU0VSX25SU1RfU1RPUCAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVE9QICAvKiE8IFJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9uUlNUX1NUREJZICAgICAgICAgICAgICBGTEFTSF9PUFRSX25SU1RfU1REQlkgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc3RhbmRieSBtb2RlICovCisjZGVmaW5lIE9CX1VTRVJfblJTVF9TSERXICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uUlNUX1NIRFcgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHNodXRkb3duIG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9JV0RHX1NXICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0lXREdfU1cgICAgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgT0JfVVNFUl9JV0RHX1NUT1AgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0lXREdfU1RPUCAgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGZyZWV6ZSBpbiBzdG9wIG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9JV0RHX1NUREJZICAgICAgICAgICAgICBGTEFTSF9PUFRSX0lXREdfU1REQlkgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGZyZWV6ZSBpbiBzdGFuZGJ5IG1vZGUgKi8KKyNkZWZpbmUgT0JfVVNFUl9XV0RHX1NXICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX1dXREdfU1cgICAgLyohPCBXaW5kb3cgd2F0Y2hkb2cgc2VsZWN0aW9uICovCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QxICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDEgICAgIC8qITwgQm9vdCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9CX1VTRVJfU1JBTTJQRSAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9TUkFNMlBFICAgIC8qITwgU1JBTTIgcGFyaXR5IGNoZWNrIGVuYWJsZSAgICAgKi8KKyNkZWZpbmUgT0JfVVNFUl9TUkFNMlJTVCAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX1NSQU0yUlNUICAgLyohPCBTUkFNMiBlcmFzZSB3aGVuIHN5c3RlbSByZXNldCAqLworI2RlZmluZSBPQl9VU0VSX25TV0JPT1QwICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblNXQk9PVDAgICAvKiE8IFNvZnR3YXJlIEJPT1QwICovCisjZGVmaW5lIE9CX1VTRVJfbkJPT1QwICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDAgICAgIC8qITwgbkJPT1QwIG9wdGlvbiBiaXQgKi8KKyNkZWZpbmUgT0JfVVNFUl9BR0NfVFJJTSAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0FHQ19UUklNICAgLyohPCBBdXRvbWF0aWMgR2FpbiBDb250cm9sIFRyaW1taW5nICovCisjZGVmaW5lIE9CX1VTRVJfQUxMICAgICAgICAgICAgICAgICAgICAgKE9CX1VTRVJfQk9SX0xFViAgICB8IE9CX1VTRVJfblJTVF9TVE9QIHwgT0JfVVNFUl9uUlNUX1NUREJZIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX25SU1RfU0hEVyAgfCBPQl9VU0VSX0lXREdfU1cgICB8IE9CX1VTRVJfSVdER19TVE9QICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JfVVNFUl9JV0RHX1NUREJZIHwgT0JfVVNFUl9XV0RHX1NXICAgfCBPQl9VU0VSX25CT09UMSAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CX1VTRVJfU1JBTTJQRSAgICB8IE9CX1VTRVJfU1JBTTJSU1QgIHwgT0JfVVNFUl9uU1dCT09UMCAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQl9VU0VSX25CT09UMCAgICAgfCBPQl9VU0VSX0FHQ19UUklNKSAgIC8qITwgYWxsIG9wdGlvbiBiaXRzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9BR0NfVFJJTSBGTEFTSCBPcHRpb24gQnl0ZXMgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZworICAqIEB7CisgICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSAwICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzEgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9BR0NfVFJJTV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSAxICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzIgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9BR0NfVFJJTV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSAyICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzMgICAgICAgICAgICAgICAgICAgKEZMQVNIX09QVFJfQUdDX1RSSU1fMSB8IEZMQVNIX09QVFJfQUdDX1RSSU1fMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSAzICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzQgICAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9BR0NfVFJJTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSA0ICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzUgICAgICAgICAgICAgICAgICAgKEZMQVNIX09QVFJfQUdDX1RSSU1fMiB8IEZMQVNIX09QVFJfQUdDX1RSSU1fMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSA1ICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzYgICAgICAgICAgICAgICAgICAgKEZMQVNIX09QVFJfQUdDX1RSSU1fMiB8IEZMQVNIX09QVFJfQUdDX1RSSU1fMSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSA2ICovCisjZGVmaW5lIE9CX0FHQ19UUklNXzcgICAgICAgICAgICAgICAgICAgKEZMQVNIX09QVFJfQUdDX1RSSU1fMiB8IEZMQVNIX09QVFJfQUdDX1RSSU1fMSB8IEZMQVNIX09QVFJfQUdDX1RSSU1fMCkgIC8qITwgQXV0b21hdGljIEdhaW4gQ29udHJvbCBUcmltbWluZyBWYWx1ZSA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfQk9SX0xFVkVMIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIEJPUiBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTF8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IGxldmVsIHRocmVzaG9sZCBpcyBhcm91bmQgMS43ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfMSAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfQk9SX0xFVl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXNldCBsZXZlbCB0aHJlc2hvbGQgaXMgYXJvdW5kIDIuMFYgKi8KKyNkZWZpbmUgT0JfQk9SX0xFVkVMXzIgICAgICAgICAgICAgICAgICBGTEFTSF9PUFRSX0JPUl9MRVZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVzZXQgbGV2ZWwgdGhyZXNob2xkIGlzIGFyb3VuZCAyLjJWICovCisjZGVmaW5lIE9CX0JPUl9MRVZFTF8zICAgICAgICAgICAgICAgICAgKEZMQVNIX09QVFJfQk9SX0xFVl8wIHwgRkxBU0hfT1BUUl9CT1JfTEVWXzEpICAvKiE8IFJlc2V0IGxldmVsIHRocmVzaG9sZCBpcyBhcm91bmQgMi41ViAqLworI2RlZmluZSBPQl9CT1JfTEVWRUxfNCAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfQk9SX0xFVl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXNldCBsZXZlbCB0aHJlc2hvbGQgaXMgYXJvdW5kIDIuOFYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NUT1AgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUmVzZXQgT24gU3RvcAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NUT1BfUlNUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHN0b3AgbW9kZSAgICAqLworI2RlZmluZSBPQl9TVE9QX05PUlNUICAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVE9QICAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdG9wIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgUmVzZXQgT24gU3RhbmRieQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NUQU5EQllfUlNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUmVzZXQgZ2VuZXJhdGVkIHdoZW4gZW50ZXJpbmcgdGhlIHN0YW5kYnkgbW9kZSAgICAqLworI2RlZmluZSBPQl9TVEFOREJZX05PUlNUICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TVERCWSAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzdGFuZGJ5IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9uUlNUX1NIVVRET1dOIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFJlc2V0IE9uIFNodXRkb3duCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfU0hVVERPV05fUlNUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBSZXNldCBnZW5lcmF0ZWQgd2hlbiBlbnRlcmluZyB0aGUgc2h1dGRvd24gbW9kZSAgICAqLworI2RlZmluZSBPQl9TSFVURE9XTl9OT1JTVCAgICAgICAgICAgICAgIEZMQVNIX09QVFJfblJTVF9TSERXICAvKiE8IE5vIHJlc2V0IGdlbmVyYXRlZCB3aGVuIGVudGVyaW5nIHRoZSBzaHV0ZG93biBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX09CX1VTRVJfSVdER19TVyBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBJV0RHIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9JV0RHX0hXICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBIYXJkd2FyZSBpbmRlcGVuZGVudCB3YXRjaGRvZyAqLworI2RlZmluZSBPQl9JV0RHX1NXICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfSVdER19TVyAgLyohPCBTb2Z0d2FyZSBpbmRlcGVuZGVudCB3YXRjaGRvZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX0lXREdfU1RPUCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBJV0RHIE1vZGUgT24gU3RvcAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX0lXREdfU1RPUF9GUkVFWkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgSW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBpcyBmcm96ZW4gaW4gU3RvcCBtb2RlICAqLworI2RlZmluZSBPQl9JV0RHX1NUT1BfUlVOICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfSVdER19TVE9QICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdG9wIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9JV0RHX1NUQU5EQlkgRkxBU0ggT3B0aW9uIEJ5dGVzIFVzZXIgSVdERyBNb2RlIE9uIFN0YW5kYnkKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9JV0RHX1NUREJZX0ZSRUVaRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBJbmRlcGVuZGVudCB3YXRjaGRvZyBjb3VudGVyIGlzIGZyb3plbiBpbiBTdGFuZGJ5IG1vZGUgICovCisjZGVmaW5lIE9CX0lXREdfU1REQllfUlVOICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9JV0RHX1NUREJZICAvKiE8IEluZGVwZW5kZW50IHdhdGNoZG9nIGNvdW50ZXIgaXMgcnVubmluZyBpbiBTdGFuZGJ5IG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9XV0RHX1NXIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFdXREcgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1dXREdfSFcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8IEhhcmR3YXJlIHdpbmRvdyB3YXRjaGRvZyAqLworI2RlZmluZSBPQl9XV0RHX1NXICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfV1dER19TVyAgLyohPCBTb2Z0d2FyZSB3aW5kb3cgd2F0Y2hkb2cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfVVNFUl9TUkFNMlBFIEZMQVNIIE9wdGlvbiBCeXRlcyBTUkFNMiBwYXJpdHkgY2hlY2sKKyAgKiBAeworICAqLworI2RlZmluZSBPQl9TUkFNMl9QQVJJVFlfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBTUkFNMiBwYXJpdHkgY2hlY2sgZW5hYmxlICAqLworI2RlZmluZSBPQl9TUkFNMl9QQVJJVFlfRElTQUJMRSAgICAgICAgIEZMQVNIX09QVFJfU1JBTTJQRSAgLyohPCBTUkFNMiBwYXJpdHkgY2hlY2sgZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX1NSQU0yUlNUIEZMQVNIIE9wdGlvbiBCeXRlcyBTUkFNMiBlcmFzZSB3aGVuIHN5c3RlbSByZXNldAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1NSQU0yX1JTVF9FUkFTRSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBTUkFNMiBlcmFzZWQgd2hlbiBhIHN5c3RlbSByZXNldCAgICAgICAgKi8KKyNkZWZpbmUgT0JfU1JBTTJfUlNUX05PVF9FUkFTRSAgICAgICAgICBGTEFTSF9PUFRSX1NSQU0yUlNUICAvKiE8IFNSQU0yIGlzIG5vdCBlcmFzZWQgd2hlbiBhIHN5c3RlbSByZXNldCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25CT09UMSBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBCT09UMSBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfQk9PVDFfU1JBTSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgLyohPCBFbWJlZGRlZCBTUkFNIGlzIHNlbGVjdGVkIGFzIGJvb3Qgc3BhY2UgKGlmIEJPT1QwPTEpICovCisjZGVmaW5lIE9CX0JPT1QxX1NZU1RFTSAgICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uQk9PVDEgIC8qITwgU3lzdGVtIG1lbW9yeSBpcyBzZWxlY3RlZCBhcyBib290IHNwYWNlIChpZiBCT09UMD0xKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25TV0JPT1QwIEZMQVNIIE9wdGlvbiBCeXRlcyBVc2VyIFNvZnR3YXJlIEJPT1QwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfQk9PVDBfRlJPTV9PQiAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IEJPT1QwIHRha2VuIGZyb20gdGhlIG9wdGlvbiBiaXQgbkJPT1QwICovCisjZGVmaW5lIE9CX0JPT1QwX0ZST01fUElOICAgICAgICAgICAgICAgRkxBU0hfT1BUUl9uU1dCT09UMCAgLyohPCBCT09UMCB0YWtlbiBmcm9tIFBIMy9CT09UMCBwaW4gICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9VU0VSX25CT09UMCBGTEFTSCBPcHRpb24gQnl0ZXMgVXNlciBuQk9PVDAgb3B0aW9uIGJpdAorICAqIEB7CisgICovCisjZGVmaW5lIE9CX0JPT1QwX1JFU0VUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgbkJPT1QwID0gMCAqLworI2RlZmluZSBPQl9CT09UMF9TRVQgICAgICAgICAgICAgICAgICAgIEZMQVNIX09QVFJfbkJPT1QwICAvKiE8IG5CT09UMCA9IDEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfUENST1BfWk9ORSBGTEFTSCBQQ1JPUCBaT05FCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfUENST1BfWk9ORV9BICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgLyohPCBQQ1JPUCBab25lIEEgKi8KKyNkZWZpbmUgT0JfUENST1BfWk9ORV9CICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBQQ1JPUCBab25lIEIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfT0JfUENST1BfUkRQIEZMQVNIIE9wdGlvbiBCeXRlcyBQQ1JPUCBPbiBSRFAgTGV2ZWwgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIE9CX1BDUk9QX1JEUF9OT1RfRVJBU0UgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBQQ1JPUCBhcmVhIGlzIG5vdCBlcmFzZWQgd2hlbiB0aGUgUkRQIGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkZWNyZWFzZWQgZnJvbSBMZXZlbCAxIHRvIExldmVsIDAgKi8KKyNkZWZpbmUgT0JfUENST1BfUkRQX0VSQVNFICAgICAgICAgICAgICBGTEFTSF9QQ1JPUDFBRVJfUENST1BfUkRQICAvKiE8IFBDUk9QIGFyZWEgaXMgZXJhc2VkIHdoZW4gdGhlIFJEUCBsZXZlbCBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlYXNlZCBmcm9tIExldmVsIDEgdG8gTGV2ZWwgMCAoZnVsbCBtYXNzIGVyYXNlKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9PQl9TRUNVUklUWV9NT0RFIE9wdGlvbiBCeXRlcyBGTEFTSCBTZWN1cmUgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNZU1RFTV9OT1RfSU5fU0VDVVJFX01PREUgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgVW5zZWN1cmUgbW9kZTogU2VjdXJpdHkgZGlzYWJsZWQgICovCisjZGVmaW5lIFNZU1RFTV9JTl9TRUNVUkVfTU9ERSAgICAgICAgICAgRkxBU0hfT1BUUl9FU0UgIC8qITwgU2VjdXJlIG1vZGUgIDogU2VjdXJpdHkgZW5hYmxlZCAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEMyX0ZMQVNIX09CX0JPT1RfUkVHSU9OIENQVTIgT3B0aW9uIEJ5dGVzIFJlc2V0IEJvb3QgVmVjdG9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgT0JfQzJfQk9PVF9GUk9NX1NSQU0gICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgLyohPCBDUFUyIGJvb3QgZnJvbSBTcmFtICAqLworI2RlZmluZSBPQl9DMl9CT09UX0ZST01fRkxBU0ggICAgICAgICAgIEZMQVNIX1NSUlZSX0MyT1BUICAvKiE8IENQVTIgYm9vdCBmcm9tIEZsYXNoICovCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSF9TUkFNMkFfQUREUkVTU19SQU5HRSBSQU0yQSBhZGRyZXNzIHJhbmdlIGluIHNlY3VyZSBtb2RlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMCAgICAgICAweDIwMDMwMDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzMDAwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8xICAgICAgIDB4MjAwMzA0MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDMwNDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzIgICAgICAgMHgyMDAzMDgwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzA4MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMyAgICAgICAweDIwMDMwQzAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzMEMwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl80ICAgICAgIDB4MjAwMzEwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDMxMDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzUgICAgICAgMHgyMDAzMTQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzE0MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfNiAgICAgICAweDIwMDMxODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzMTgwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl83ICAgICAgIDB4MjAwMzFDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDMxQzAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzggICAgICAgMHgyMDAzMjAwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzIwMDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfOSAgICAgICAweDIwMDMyNDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzMjQwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8xMCAgICAgIDB4MjAwMzI4MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDMyODAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzExICAgICAgMHgyMDAzMkMwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzJDMDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMTIgICAgICAweDIwMDMzMDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzMzAwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8xMyAgICAgIDB4MjAwMzM0MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDMzNDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzE0ICAgICAgMHgyMDAzMzgwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzM4MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMTUgICAgICAweDIwMDMzQzAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzM0MwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8xNiAgICAgIDB4MjAwMzQwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM0MDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzE3ICAgICAgMHgyMDAzNDQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzQ0MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMTggICAgICAweDIwMDM0ODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzNDgwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8xOSAgICAgIDB4MjAwMzRDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM0QzAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzIwICAgICAgMHgyMDAzNTAwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzUwMDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMjEgICAgICAweDIwMDM1NDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzNTQwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8yMiAgICAgIDB4MjAwMzU4MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM1ODAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzIzICAgICAgMHgyMDAzNUMwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzVDMDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMjQgICAgICAweDIwMDM2MDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzNjAwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8yNSAgICAgIDB4MjAwMzY0MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM2NDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzI2ICAgICAgMHgyMDAzNjgwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzY4MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMjcgICAgICAweDIwMDM2QzAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzNkMwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8yOCAgICAgIDB4MjAwMzcwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM3MDAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX1NUQVJUX1NFQ1VSRV9BRERSXzI5ICAgICAgMHgyMDAzNzQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzc0MDAgLSAweDIwMDM3RkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkFfU1RBUlRfU0VDVVJFX0FERFJfMzAgICAgICAweDIwMDM3ODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzNzgwMCAtIDB4MjAwMzdGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQV9TVEFSVF9TRUNVUkVfQUREUl8zMSAgICAgIDB4MjAwMzdDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM3QzAwIC0gMHgyMDAzN0ZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJBX0ZVTExfVU5TRUNVUkUgICAgICAgICAgICAgMHgyMDA0MDAwMFUgIC8qICBUaGUgUkFNMkEgaXMgYWNjZXNzaWJsZSB0byBNMCBQbHVzIGFuZCBNNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX1NSQU0yQl9BRERSRVNTX1JBTkdFIFJBTTJCIGFkZHJlc3MgcmFuZ2UgaW4gc2VjdXJlIG1vZGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8wICAgICAgIDB4MjAwMzgwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM4MDAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzEgICAgICAgMHgyMDAzODQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzg0MDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMiAgICAgICAweDIwMDM4ODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzODgwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8zICAgICAgIDB4MjAwMzhDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM4QzAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzQgICAgICAgMHgyMDAzOTAwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzkwMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfNSAgICAgICAweDIwMDM5NDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzOTQwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl82ICAgICAgIDB4MjAwMzk4MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDM5ODAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzcgICAgICAgMHgyMDAzOUMwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwMzlDMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfOCAgICAgICAweDIwMDNBMDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzQTAwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl85ICAgICAgIDB4MjAwM0E0MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNBNDAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzEwICAgICAgMHgyMDAzQTgwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0E4MDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMTEgICAgICAweDIwMDNBQzAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzQUMwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8xMiAgICAgIDB4MjAwM0IwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNCMDAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzEzICAgICAgMHgyMDAzQjQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0I0MDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMTQgICAgICAweDIwMDNCODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzQjgwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8xNSAgICAgIDB4MjAwM0JDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNCQzAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzE2ICAgICAgMHgyMDAzQzAwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0MwMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMTcgICAgICAweDIwMDNDNDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzQzQwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8xOCAgICAgIDB4MjAwM0M4MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNDODAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzE5ICAgICAgMHgyMDAzQ0MwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0NDMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMjAgICAgICAweDIwMDNEMDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzRDAwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8yMSAgICAgIDB4MjAwM0Q0MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNENDAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzIyICAgICAgMHgyMDAzRDgwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0Q4MDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMjMgICAgICAweDIwMDNEQzAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzREMwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8yNCAgICAgIDB4MjAwM0UwMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNFMDAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzI1ICAgICAgMHgyMDAzRTQwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0U0MDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMjYgICAgICAweDIwMDNFODAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzRTgwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8yNyAgICAgIDB4MjAwM0VDMDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNFQzAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzI4ICAgICAgMHgyMDAzRjAwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0YwMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfU1RBUlRfU0VDVVJFX0FERFJfMjkgICAgICAweDIwMDNGNDAwVSAgLyogIFdoZW4gaW4gc2VjdXJlIG1vZGUgMHgyMDAzRjQwMCAtIDB4MjAwM0ZGRkYgaXMgYWNjZXNzaWJsZSBvbmx5IGJ5IE0wIFBsdXMgICovCisjZGVmaW5lIFNSQU0yQl9TVEFSVF9TRUNVUkVfQUREUl8zMCAgICAgIDB4MjAwM0Y4MDBVICAvKiAgV2hlbiBpbiBzZWN1cmUgbW9kZSAweDIwMDNGODAwIC0gMHgyMDAzRkZGRiBpcyBhY2Nlc3NpYmxlIG9ubHkgYnkgTTAgUGx1cyAgKi8KKyNkZWZpbmUgU1JBTTJCX1NUQVJUX1NFQ1VSRV9BRERSXzMxICAgICAgMHgyMDAzRkMwMFUgIC8qICBXaGVuIGluIHNlY3VyZSBtb2RlIDB4MjAwM0ZDMDAgLSAweDIwMDNGRkZGIGlzIGFjY2Vzc2libGUgb25seSBieSBNMCBQbHVzICAqLworI2RlZmluZSBTUkFNMkJfRlVMTF9VTlNFQ1VSRSAgICAgICAgICAgICAweDIwMDNGRjAwVSAgLyogIFRoZSBSQU0yQiBpcyBhY2Nlc3NpYmxlIHRvIE0wIFBsdXMgYW5kIE00ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX01hY3JvcyBGTEFTSCBFeHBvcnRlZCBNYWNyb3MKKyAgKiAgQGJyaWVmIG1hY3JvcyB0byBjb250cm9sIEZMQVNIIGZlYXR1cmVzCisgICogIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBGTEFTSCBMYXRlbmN5LgorICAqIEBwYXJhbSBfX0xBVEVOQ1lfXyBGTEFTSCBMYXRlbmN5CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0xBVEVOQ1lfMCBGTEFTSCBaZXJvIHdhaXQgc3RhdGUKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0xBVEVOQ1lfMSBGTEFTSCBPbmUgd2FpdCBzdGF0ZQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8yIEZMQVNIIFR3byB3YWl0IHN0YXRlcworICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8zIEZMQVNIIFRocmVlIHdhaXQgc3RhdGVzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKF9fTEFURU5DWV9fKSAgICBNT0RJRllfUkVHKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZLCAoX19MQVRFTkNZX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgRkxBU0ggTGF0ZW5jeS4KKyAgKiBAcmV0dmFsIEZMQVNIIExhdGVuY3kKKyAgKiAgICAgICAgIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8wIEZMQVNIIFplcm8gd2FpdCBzdGF0ZQorICAqICAgICBAYXJnIEByZWYgRkxBU0hfTEFURU5DWV8xIEZMQVNIIE9uZSB3YWl0IHN0YXRlCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzIgRkxBU0ggVHdvIHdhaXQgc3RhdGVzCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9MQVRFTkNZXzMgRkxBU0ggVGhyZWUgd2FpdCBzdGF0ZXMKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAgICAgICAgICAgICAgIFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9MQVRFTkNZKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggcHJlZmV0Y2ggYnVmZmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9QUkVGRVRDSF9CVUZGRVJfRU5BQkxFKCkgICAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIHByZWZldGNoIGJ1ZmZlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfUFJFRkVUQ0hfQlVGRkVSX0RJU0FCTEUoKSAgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSgpICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZMQVNIIGluc3RydWN0aW9uIGNhY2hlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9ESVNBQkxFKCkgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ0VOKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRkxBU0ggZGF0YSBjYWNoZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9FTkFCTEUoKSAgICAgICAgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRkxBU0ggZGF0YSBjYWNoZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCkgICAgICAgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENFTikKKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgRkxBU0ggaW5zdHJ1Y3Rpb24gQ2FjaGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIEluc3RydWN0aW9uIENhY2hlIGlzIGRpc2FibGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpICAgZG8geyBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDUlNUKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMCkKKworLyoqCisgICogQGJyaWVmICBSZXNldCB0aGUgRkxBU0ggZGF0YSBDYWNoZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgZGF0YSBDYWNoZSBpcyBkaXNhYmxlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9SRVNFVCgpICAgICAgICAgIGRvIHsgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENSU1QpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ1JTVCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfSW50ZXJydXB0IEZMQVNIIEludGVycnVwdHMgTWFjcm9zCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgRkxBU0ggaW50ZXJydXB0cworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZMQVNIIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBGTEFTSCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9FT1AgRW5kIG9mIEZMQVNIIE9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX09QRVJSIEVycm9yIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfUkRFUlIgUENST1AgUmVhZCBFcnJvciBJbnRlcnJ1cHQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VDQ0MgRUNDIENvcnJlY3Rpb24gSW50ZXJydXB0CisgICogQHJldHZhbCBub25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgICBkbyB7IGlmKCgoX19JTlRFUlJVUFRfXykgJiBGTEFTSF9JVF9FQ0NDKSAhPSAwVSkgeyBTRVRfQklUKEZMQVNILT5FQ0NSLCBGTEFTSF9FQ0NSX0VDQ0NJRSk7IH1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19JTlRFUlJVUFRfXykgJiAofkZMQVNIX0lUX0VDQ0MpKSAhPSAwVSkgeyBTRVRfQklUKEZMQVNILT5DUiwgKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpKTsgfVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRkxBU0ggaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIEZMQVNIIGludGVycnVwdAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0lUX0VPUCBFbmQgb2YgRkxBU0ggT3BlcmF0aW9uIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfT1BFUlIgRXJyb3IgSW50ZXJydXB0CisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9JVF9SREVSUiBQQ1JPUCBSZWFkIEVycm9yIEludGVycnVwdAorICAqICAgICBAYXJnIEByZWYgRkxBU0hfSVRfRUNDQyBFQ0MgQ29ycmVjdGlvbiBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRkxBU0hfRElTQUJMRV9JVChfX0lOVEVSUlVQVF9fKSAgIGRvIHsgaWYoKChfX0lOVEVSUlVQVF9fKSAmIEZMQVNIX0lUX0VDQ0MpICE9IDBVKSB7IENMRUFSX0JJVChGTEFTSC0+RUNDUiwgRkxBU0hfRUNDUl9FQ0NDSUUpOyB9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKF9fSU5URVJSVVBUX18pICYgKH5GTEFTSF9JVF9FQ0NDKSkgIT0gMFUpIHsgQ0xFQVJfQklUKEZMQVNILT5DUiwgKChfX0lOVEVSUlVQVF9fKSAmICh+RkxBU0hfSVRfRUNDQykpKTsgfVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRkxBU0ggZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWcgdG8gY2hlY2suCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19FT1AgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QRVJSIEZMQVNIIE9wZXJhdGlvbiBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BST0dFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19XUlBFUlIgRkxBU0ggV3JpdGUgcHJvdGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHQUVSUiBGTEFTSCBQcm9ncmFtbWluZyBhbGlnbm1lbnQgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19TSVpFUlIgRkxBU0ggU2l6ZSBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1BHU0VSUiBGTEFTSCBQcm9ncmFtbWluZyBzZXF1ZW5jZSBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX01JU0VSUiBGTEFTSCBGYXN0IHByb2dyYW1taW5nIGRhdGEgbWlzcyBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0ZBU1RFUlIgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QVE5WIEZMQVNIIFVzZXIgT3B0aW9uIE9QVFZBTCBpbmRpY2F0aW9uCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX1JERVJSIEZMQVNIIFBDUk9QIHJlYWQgIGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfT1BUVkVSUiBGTEFTSCBPcHRpb24gdmFsaWRpdHkgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19CU1kgRkxBU0ggd3JpdGUvZXJhc2Ugb3BlcmF0aW9ucyBpbiBwcm9ncmVzcyBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0NGR0JTWSBQcm9ncmFtbWluZy9lcmFzZSBjb25maWd1cmF0aW9uIGJ1c3kKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfUEVTRCBGTEFTSCBQcm9ncmFtbWluZy9lcmFzZSBvcGVyYXRpb24gc3VzcGVuZGVkCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0VDQ0MgRkxBU0ggb25lIEVDQyBlcnJvciBoYXMgYmVlbiBkZXRlY3RlZCBhbmQgY29ycmVjdGVkCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX0VDQ0QgRkxBU0ggdHdvIEVDQyBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIEZMQVNIX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0dFVF9GTEFHKF9fRkxBR19fKSAgICAgICAgICAoKCgoX19GTEFHX18pICYgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpICE9IDBVKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVBRF9CSVQoRkxBU0gtPkVDQ1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpICA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVBRF9CSVQoRkxBU0gtPlNSLCAgIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpKQorLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRkxBU0gncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIEZMQVNIIGZsYWdzIHRvIGNsZWFyLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfRU9QIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19PUEVSUiBGTEFTSCBPcGVyYXRpb24gZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QUk9HRVJSIEZMQVNIIFByb2dyYW1taW5nIGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfV1JQRVJSIEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QR0FFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgYWxpZ25tZW50IGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfU0laRVJSIEZMQVNIIFNpemUgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19QR1NFUlIgRkxBU0ggUHJvZ3JhbW1pbmcgc2VxdWVuY2UgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19NSVNFUlIgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBkYXRhIG1pc3MgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19GQVNURVJSIEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZXJyb3IgZmxhZworICAqICAgICBAYXJnIEByZWYgRkxBU0hfRkxBR19SREVSUiBGTEFTSCBQQ1JPUCByZWFkICBlcnJvciBmbGFnCisgICogICAgIEBhcmcgQHJlZiBGTEFTSF9GTEFHX09QVFZFUlIgRkxBU0ggT3B0aW9uIHZhbGlkaXR5IGVycm9yIGZsYWcKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfRUNDQyBGTEFTSCBvbmUgRUNDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfRUNDRCBGTEFTSCB0d28gRUNDIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQKKyAgKiAgICAgQGFyZyBAcmVmIEZMQVNIX0ZMQUdfQUxMX0VSUk9SUyBGTEFTSCBBbGwgZXJyb3JzIGZsYWdzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoX19GTEFHX18pICAgICAgICBkbyB7IGlmKCgoX19GTEFHX18pICYgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpICE9IDBVKSB7IFNFVF9CSVQoRkxBU0gtPkVDQ1IsICgoX19GTEFHX18pICYgKEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpKTsgfVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChfX0ZMQUdfXykgJiB+KEZMQVNIX0ZMQUdfRUNDQyB8IEZMQVNIX0ZMQUdfRUNDRCkpICE9IDBVKSB7IFdSSVRFX1JFRyhGTEFTSC0+U1IsICgoX19GTEFHX18pICYgfihGTEFTSF9GTEFHX0VDQ0MgfCBGTEFTSF9GTEFHX0VDQ0QpKSk7IH1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEZMQVNIIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2ZsYXNoX2V4LmgiCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9FeHBvcnRlZF9WYXJpYWJsZXMgRkxBU0ggRXhwb3J0ZWQgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK2V4dGVybiBGTEFTSF9Qcm9jZXNzVHlwZURlZiBwRmxhc2g7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIFByb2dyYW0gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9Qcm9ncmFtX0lUKHVpbnQzMl90IFR5cGVQcm9ncmFtLCB1aW50MzJfdCBBZGRyZXNzLCB1aW50NjRfdCBEYXRhKTsKKy8qIEZMQVNIIElSUSBoYW5kbGVyIG1ldGhvZCAqLwordm9pZCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpOworLyogQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlcyAqLwordm9pZCAgICAgICAgICAgICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKTsKK3ZvaWQgICAgICAgICAgICAgICBIQUxfRkxBU0hfT3BlcmF0aW9uRXJyb3JDYWxsYmFjayh1aW50MzJfdCBSZXR1cm5WYWx1ZSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9VbmxvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX0xvY2sodm9pZCk7CisvKiBPcHRpb24gYnl0ZXMgY29udHJvbCAqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9GTEFTSF9PQl9VbmxvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0ZMQVNIX09CX0xhdW5jaCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCit1aW50MzJfdCBIQUxfRkxBU0hfR2V0RXJyb3Iodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV90eXBlcyBGTEFTSCBQcml2YXRlIFR5cGVzCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9Db25zdGFudHMgRkxBU0ggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBGTEFTSF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpKCooKHVpbnQxNl90ICopRkxBU0hTSVpFX0JBU0UpKSAmICgweDA3RkZVTCkpIDw8IDEwVSkKKyNkZWZpbmUgRkxBU0hfRU5EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgIChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSAtIDFVKQorCisjZGVmaW5lIEZMQVNIX0JBTktfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9TSVpFICAgLyohPCBGTEFTSCBCYW5rIFNpemUgKi8KKyNkZWZpbmUgRkxBU0hfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDBVICAvKiE8IEZMQVNIIFBhZ2UgU2l6ZSwgNCBLQnl0ZXMgKi8KKyNkZWZpbmUgRkxBU0hfUEFHRV9OQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOFUKKyNkZWZpbmUgRkxBU0hfVElNRU9VVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDEwMDBVICAgICAgICAvKiE8IEZMQVNIIEV4ZWN1dGlvbiBUaW1lb3V0LCAxIHMgKi8KKworI2RlZmluZSBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQgICAgICAgICAgMTFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZMQVNIIENvZGUgUmVhZG91dCBQcm90ZWN0aW9uIGdyYW51bGFyaXR5IG9mZnNldCAqLworI2RlZmluZSBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgKDFVTCA8PCBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpICAvKiE8IEZMQVNIIENvZGUgUmVhZG91dCBQcm90ZWN0aW9uIGdyYW51bGFyaXR5LCAyIEtCeXRlcyAqLworCisjZGVmaW5lIEZMQVNIX1RZUEVOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBQcm9ncmFtbWF0aW9uIFByb2NlZHVyZSBPbiBHb2luZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUkFNX01FTU9SWV9TSVpFICBTUkFNIG1lbW9yeSBzaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1JBTV9TRUNVUkVfUEFHRV9HUkFOVUxBUklUWV9PRkZTRVQgICAgIDEwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTZWN1cmUgU1JBTTJBIGFuZCBTUkFNMkIgUHJvdGVjdGlvbiBncmFudWxhcml0eSBvZmZzZXQgKi8KKyNkZWZpbmUgU1JBTV9TRUNVUkVfUEFHRV9HUkFOVUxBUklUWSAgICAgICAgICAgICgxVUwgPDwgRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKSAgLyohPCBTZWN1cmUgU1JBTTJBIGFuZCBTUkFNMkIgUHJvdGVjdGlvbiBncmFudWxhcml0eSwgMUtCeXRlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9NYWNyb3MgRkxBU0ggUHJpdmF0ZSBNYWNyb3MKKyAqICBAeworICovCisjZGVmaW5lIElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoX19WQUxVRV9fKSAgICAgICAgKCgoX19WQUxVRV9fKSA+PSBGTEFTSF9CQVNFKSAmJiAoKF9fVkFMVUVfXykgPD0gKEZMQVNIX0JBU0UgKyBGTEFTSF9TSVpFIC0gMVVMKSkpCisKKyNkZWZpbmUgSVNfRkxBU0hfRkFTVF9QUk9HUkFNX0FERFJFU1MoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID49IEZMQVNIX0JBU0UpICYmICgoX19WQUxVRV9fKSA8PSAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUgLSAyNTZVTCkpICYmICgoKF9fVkFMVUVfXykgJSAyNTZVTCkgPT0gMFVMKSkKKworI2RlZmluZSBJU19GTEFTSF9QUk9HUkFNX01BSU5fTUVNX0FERFJFU1MoX19WQUxVRV9fKSAgICgoKF9fVkFMVUVfXykgPj0gRkxBU0hfQkFTRSkgJiYgKChfX1ZBTFVFX18pIDw9IChGTEFTSF9CQVNFICsgRkxBU0hfU0laRSAtIDhVTCkpICYmICgoKF9fVkFMVUVfXykgJSA4VUwpID09IDBVTCkpCisKKyNkZWZpbmUgSVNfRkxBU0hfUFJPR1JBTV9PVFBfQUREUkVTUyhfX1ZBTFVFX18pICAgICAoKChfX1ZBTFVFX18pID49IE9UUF9BUkVBX0JBU0UpICYmICgoX19WQUxVRV9fKSA8PSAoT1RQX0FSRUFfRU5EX0FERFIgKyAxVUwgLSA4VUwpKSAmJiAoKChfX1ZBTFVFX18pICUgOFVMKSA9PSAwVUwpKQorCisjZGVmaW5lIElTX0ZMQVNIX1BST0dSQU1fQUREUkVTUyhfX1ZBTFVFX18pICAgICAgICAgKElTX0ZMQVNIX1BST0dSQU1fTUFJTl9NRU1fQUREUkVTUyhfX1ZBTFVFX18pIHx8IElTX0ZMQVNIX1BST0dSQU1fT1RQX0FERFJFU1MoX19WQUxVRV9fKSkKKworI2RlZmluZSBJU19GTEFTSF9QQUdFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA8IEZMQVNIX1BBR0VfTkIpCisKKyNkZWZpbmUgSVNfQUREUl9BTElHTkVEXzY0QklUUyhfX1ZBTFVFX18pICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgMHg3VSkgPT0gKDB4MDBVTCkpCisKKyNkZWZpbmUgSVNfRkxBU0hfVFlQRUVSQVNFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVFUkFTRV9QQUdFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gRkxBU0hfVFlQRUVSQVNFX01BU1NFUkFTRSkpCisKKyNkZWZpbmUgSVNfRkxBU0hfVFlQRVBST0dSQU0oX19WQUxVRV9fKSAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpKQorCisjZGVmaW5lIElTX09CX1NGU0FfU1RBUlRfQUREUihfX1ZBTFVFX18pICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA+PSBGTEFTSF9CQVNFKSAmJiAoKF9fVkFMVUVfXykgPD0gRkxBU0hfRU5EX0FERFIpICYmICgoKF9fVkFMVUVfXykgJiB+KHVpbnQzMl90KTB4RkZGVSkgPT0gKF9fVkFMVUVfXykpKQorI2RlZmluZSBJU19PQl9TQlJTQV9TVEFSVF9BRERSKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPj0gU1JBTTJBX0JBU0UpICYmICgoX19WQUxVRV9fKSA8PSAoU1JBTTJBX0JBU0UgKyBTUkFNMkFfU0laRSAtIDFVKSkgJiYgKCgoX19WQUxVRV9fKSAmIH4weDNGRlUpID09IChfX1ZBTFVFX18pKSkKKyNkZWZpbmUgSVNfT0JfU05CUlNBX1NUQVJUX0FERFIoX19WQUxVRV9fKSAgICAgICAgICAoKChfX1ZBTFVFX18pID49IFNSQU0yQl9CQVNFKSAmJiAoKF9fVkFMVUVfXykgPD0gKFNSQU0yQl9CQVNFICsgU1JBTTJCX1NJWkUgLSAxVSkpICYmICgoKF9fVkFMVUVfXykgJiB+MHgzRkZVKSA9PSAoX19WQUxVRV9fKSkpCisjZGVmaW5lIElTX09CX1NFQ1VSRV9NT0RFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBTWVNURU1fSU5fU0VDVVJFX01PREUpIHx8ICgoX19WQUxVRV9fKSA9PSBTWVNURU1fTk9UX0lOX1NFQ1VSRV9NT0RFKSkKKworI2RlZmluZSBJU19PUFRJT05CWVRFKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPD0gKE9QVElPTkJZVEVfV1JQIHwgT1BUSU9OQllURV9SRFAgfCBPUFRJT05CWVRFX1VTRVIgfCBPUFRJT05CWVRFX1BDUk9QIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05CWVRFX0lQQ0NfQlVGX0FERFIgfCBPUFRJT05CWVRFX0MyX0JPT1RfVkVDVCB8IE9QVElPTkJZVEVfU0VDVVJFX01PREUpKSkKKworI2RlZmluZSBJU19PQl9XUlBBUkVBKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgfHwgKChfX1ZBTFVFX18pID09IE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIpKQorCisjZGVmaW5lIElTX09CX1JEUF9MRVZFTChfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBPQl9SRFBfTEVWRUxfMCkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IE9CX1JEUF9MRVZFTF8xKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gT0JfUkRQX0xFVkVMXzIpKQorCisjZGVmaW5lIElTX09CX1VTRVJfVFlQRShfX1ZBTFVFX18pICAgICAgICAgICAgICAgICAgKCgoKF9fVkFMVUVfXykgJiBPQl9VU0VSX0FMTCkgIT0gMFUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH5PQl9VU0VSX0FMTCkgPT0gMFUpKQorCisjZGVmaW5lIElTX09CX1VTRVJfQ09ORklHKF9fVFlQRV9fLCBfX1ZBTFVFX18pICAgICAgKCgoKF9fVFlQRV9fKSAmIE9CX1VTRVJfQk9SX0xFVikgPT0gT0JfVVNFUl9CT1JfTEVWKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoKChfX1ZBTFVFX18pICYgfihPQl9VU0VSX0FMTCAmIH5PQl9VU0VSX0JPUl9MRVYpKSA9PSBPQl9CT1JfTEVWRUxfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH4oT0JfVVNFUl9BTEwgJiB+T0JfVVNFUl9CT1JfTEVWKSkgPT0gT0JfQk9SX0xFVkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+KE9CX1VTRVJfQUxMICYgfk9CX1VTRVJfQk9SX0xFVikpID09IE9CX0JPUl9MRVZFTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihPQl9VU0VSX0FMTCAmIH5PQl9VU0VSX0JPUl9MRVYpKSA9PSBPQl9CT1JfTEVWRUxfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH4oT0JfVVNFUl9BTEwgJiB+T0JfVVNFUl9CT1JfTEVWKSkgPT0gT0JfQk9SX0xFVkVMXzQpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoKChfX1RZUEVfXykgJiBPQl9VU0VSX0FHQ19UUklNKSA9PSBPQl9VU0VSX0FHQ19UUklNKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKCgoX19WQUxVRV9fKSAmIH4oT0JfVVNFUl9BTEwgJiB+T0JfVVNFUl9BR0NfVFJJTSkpID09IE9CX0FHQ19UUklNXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihPQl9VU0VSX0FMTCAmIH5PQl9VU0VSX0FHQ19UUklNKSkgPT0gT0JfQUdDX1RSSU1fMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+KE9CX1VTRVJfQUxMICYgfk9CX1VTRVJfQUdDX1RSSU0pKSA9PSBPQl9BR0NfVFJJTV8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH4oT0JfVVNFUl9BTEwgJiB+T0JfVVNFUl9BR0NfVFJJTSkpID09IE9CX0FHQ19UUklNXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihPQl9VU0VSX0FMTCAmIH5PQl9VU0VSX0FHQ19UUklNKSkgPT0gT0JfQUdDX1RSSU1fNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+KE9CX1VTRVJfQUxMICYgfk9CX1VTRVJfQUdDX1RSSU0pKSA9PSBPQl9BR0NfVFJJTV81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH4oT0JfVVNFUl9BTEwgJiB+T0JfVVNFUl9BR0NfVFJJTSkpID09IE9CX0FHQ19UUklNXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihPQl9VU0VSX0FMTCAmIH5PQl9VU0VSX0FHQ19UUklNKSkgPT0gT0JfQUdDX1RSSU1fNykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgofihfX1RZUEVfXykgJiAoX19WQUxVRV9fKSkgPT0gMFUpKSkKKworI2RlZmluZSBJU19PQl9VU0VSX0FHQ19UUklNTUlORyhfX1ZBTFVFX18pICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gT0JfQUdDX1RSSU1fMCkgfHwgKChfX1ZBTFVFX18pID09IE9CX0FHQ19UUklNXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IE9CX0FHQ19UUklNXzIpIHx8ICgoX19WQUxVRV9fKSA9PSBPQl9BR0NfVFJJTV8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBPQl9BR0NfVFJJTV80KSB8fCAoKF9fVkFMVUVfXykgPT0gT0JfQUdDX1RSSU1fNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gT0JfQUdDX1RSSU1fNikgfHwgKChfX1ZBTFVFX18pID09IE9CX0FHQ19UUklNXzcpKQorCisjZGVmaW5lIElTX09CX1VTRVJfQk9SX0xFVkVMKF9fVkFMVUVfXykgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBPQl9CT1JfTEVWRUxfMCkgfHwgKChfX1ZBTFVFX18pID09IE9CX0JPUl9MRVZFTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBPQl9CT1JfTEVWRUxfMikgfHwgKChfX1ZBTFVFX18pID09IE9CX0JPUl9MRVZFTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBPQl9CT1JfTEVWRUxfNCkpCisKKyNkZWZpbmUgSVNfT0JfUENST1BfQ09ORklHKF9fVkFMVUVfXykgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihPQl9QQ1JPUF9aT05FX0EgfCBPQl9QQ1JPUF9aT05FX0IgfCBPQl9QQ1JPUF9SRFBfRVJBU0UpKSA9PSAwVSkKKworI2RlZmluZSBJU19PQl9JUENDX0JVRl9BRERSKF9fVkFMVUVfXykgICAgICAgICAgICAgIChJU19PQl9TQlJTQV9TVEFSVF9BRERSKF9fVkFMVUVfXykgfHwgSVNfT0JfU05CUlNBX1NUQVJUX0FERFIoX19WQUxVRV9fKSkKKworI2RlZmluZSBJU19PQl9CT09UX1ZFQ1RPUl9BRERSKF9fVkFMVUVfXykgICAgICAgICAgICgoKChfX1ZBTFVFX18pID49IEZMQVNIX0JBU0UpICYmICgoX19WQUxVRV9fKSA8PSAoRkxBU0hfQkFTRSArIEZMQVNIX1NJWkUgLSAxVSkpKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPj0gU1JBTTFfQkFTRSkgJiYgKChfX1ZBTFVFX18pIDw9IChTUkFNMV9CQVNFICsgU1JBTTFfU0laRSAtIDFVKSkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA+PSBTUkFNMkFfQkFTRSkgJiYgKChfX1ZBTFVFX18pIDw9IChTUkFNMkFfQkFTRSArIFNSQU0yQV9TSVpFIC0gMVUpKSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID49IFNSQU0yQl9CQVNFKSAmJiAoKF9fVkFMVUVfXykgPD0gKFNSQU0yQl9CQVNFICsgU1JBTTJCX1NJWkUgLSAxVSkpKSkKKworI2RlZmluZSBJU19PQl9CT09UX1JFR0lPTihfX1ZBTFVFX18pICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gT0JfQzJfQk9PVF9GUk9NX0ZMQVNIKSB8fCAoKF9fVkFMVUVfXykgPT0gT0JfQzJfQk9PVF9GUk9NX1NSQU0pKQorCisjZGVmaW5lIElTX09CX1NFQ1VSRV9DT05GSUcoX19WQUxVRV9fKSAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH4oT0JfU0VDVVJFX0NPTkZJR19NRU1PUlkgfCBPQl9TRUNVUkVfQ09ORklHX0JPT1RfUkVTRVQpKSA9PSAwVSkKKworI2RlZmluZSBJU19GTEFTSF9MQVRFTkNZKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gRkxBU0hfTEFURU5DWV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBGTEFTSF9MQVRFTkNZXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IEZMQVNIX0xBVEVOQ1lfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gRkxBU0hfTEFURU5DWV8zKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0ZMQVNIX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2ZsYXNoX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWUwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaF9leC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9mbGFzaF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTEFTSCBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfRkxBU0hfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0ZMQVNIX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTEFTSEV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEZMQVNIIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfRU1QVFlfQ0hFQ0sgRkxBU0hFeCBFbXB0eSBDaGVjaworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX1BST0dfTk9UX0VNUFRZICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgMXN0IGxvY2F0aW9uIGluIEZsYXNoIGlzIHByb2dyYW1tZWQgKi8KKyNkZWZpbmUgRkxBU0hfUFJPR19FTVBUWSAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfRU1QVFkgLyohPCAxc3QgbG9jYXRpb24gaW4gRmxhc2ggaXMgZW1wdHkgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogRXh0ZW5kZWQgUHJvZ3JhbSBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hFeF9FcmFzZShGTEFTSF9FcmFzZUluaXRUeXBlRGVmICpwRXJhc2VJbml0LCB1aW50MzJfdCAqUGFnZUVycm9yKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlX0lUKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQpOwordWludDMyX3QgICAgICAgICAgSEFMX0ZMQVNIRXhfRmxhc2hFbXB0eUNoZWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX0ZMQVNIRXhfRm9yY2VGbGFzaEVtcHR5KHVpbnQzMl90IEZsYXNoRW1wdHkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfT0JQcm9ncmFtKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X09CR2V0Q29uZmlnKEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmICpwT0JJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9GTEFTSEV4X1N1c3BlbmRPcGVyYXRpb24odm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfRkxBU0hFeF9BbGxvd09wZXJhdGlvbih2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9GTEFTSEV4X0lzT3BlcmF0aW9uU3VzcGVuZGVkKHZvaWQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9Qcml2YXRlX01hY3JvcyBGTEFTSEV4IFByaXZhdGUgTWFjcm9zCisgICogIEB7CisgICovCisjZGVmaW5lIElTX0ZMQVNIX0VNUFRZX0NIRUNLKF9fVkFMVUVfXykgICAgICgoKF9fVkFMVUVfXykgPT0gRkxBU0hfUFJPR19FTVBUWSkgfHwgKChfX1ZBTFVFX18pID09IEZMQVNIX1BST0dfTk9UX0VNUFRZKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMgRkxBU0hFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCit2b2lkICAgICAgICAgICAgICBGTEFTSF9QYWdlRXJhc2UodWludDMyX3QgUGFnZSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9GTEFTSF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9ncGlvLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5NzY0OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2dwaW8uaApAQCAtMCwwICsxLDMwMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfZ3Bpby5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0dQSU9fSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJTyBHUElPCisgICogQGJyaWVmIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfVHlwZXMgR1BJTyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgICBHUElPIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBpbjsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBHUElPIHBpbnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQHJlZiBHUElPX3BpbnMgKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX21vZGUgKi8KKworICB1aW50MzJfdCBQdWxsOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHVsbC11cCBvciBQdWxsLURvd24gYWN0aXZhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fcHVsbCAqLworCisgIHVpbnQzMl90IFNwZWVkOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzcGVlZCBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fc3BlZWQgKi8KKworICB1aW50MzJfdCBBbHRlcm5hdGU7ICAvKiE8IFBlcmlwaGVyYWwgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBzZWxlY3RlZCBwaW5zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT0V4X0FsdGVybmF0ZV9mdW5jdGlvbl9zZWxlY3Rpb24gKi8KK31HUElPX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEdQSU8gQml0IFNFVCBhbmQgQml0IFJFU0VUIGVudW1lcmF0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1BJT19QSU5fUkVTRVQgPSAwVSwKKyAgR1BJT19QSU5fU0VUCit9R1BJT19QaW5TdGF0ZTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU8gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19waW5zIEdQSU8gcGlucworICAqIEB7CisgICovCisjZGVmaW5lIEdQSU9fUElOXzAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKSAgLyogUGluIDAgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMSAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpICAvKiBQaW4gMSBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl8yICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwNCkgIC8qIFBpbiAyIHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzMgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KSAgLyogUGluIDMgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fNCAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApICAvKiBQaW4gNCBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl81ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAyMCkgIC8qIFBpbiA1IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzYgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDQwKSAgLyogUGluIDYgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fNyAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwODApICAvKiBQaW4gNyBzZWxlY3RlZCAgICAqLworI2RlZmluZSBHUElPX1BJTl84ICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDEwMCkgIC8qIFBpbiA4IHNlbGVjdGVkICAgICovCisjZGVmaW5lIEdQSU9fUElOXzkgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKSAgLyogUGluIDkgc2VsZWN0ZWQgICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDA0MDApICAvKiBQaW4gMTAgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xMSAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDgwMCkgIC8qIFBpbiAxMSBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzEyICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKSAgLyogUGluIDEyIHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fMTMgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDIwMDApICAvKiBQaW4gMTMgc2VsZWN0ZWQgICAqLworI2RlZmluZSBHUElPX1BJTl8xNCAgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4NDAwMCkgIC8qIFBpbiAxNCBzZWxlY3RlZCAgICovCisjZGVmaW5lIEdQSU9fUElOXzE1ICAgICAgICAgICAgICAgICgodWludDE2X3QpMHg4MDAwKSAgLyogUGluIDE1IHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgR1BJT19QSU5fQWxsICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweEZGRkYpICAvKiBBbGwgcGlucyBzZWxlY3RlZCAqLworCisjZGVmaW5lIEdQSU9fUElOX01BU0sgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwRkZGRikgLyogUElOIG1hc2sgZm9yIGFzc2VydCB0ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fbW9kZSBHUElPIG1vZGUKKyAgKiBAYnJpZWYgR1BJTyBDb25maWd1cmF0aW9uIE1vZGUKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WDB5ejAwWVoKKyAgKiAgICAgICAgICAgLSBYICA6IEdQSU8gbW9kZSBvciBFWFRJIE1vZGUKKyAgKiAgICAgICAgICAgLSB5ICA6IEV4dGVybmFsIElUIG9yIEV2ZW50IHRyaWdnZXIgZGV0ZWN0aW9uCisgICogICAgICAgICAgIC0geiAgOiBJTyBjb25maWd1cmF0aW9uIG9uIEV4dGVybmFsIElUIG9yIEV2ZW50CisgICogICAgICAgICAgIC0gWSAgOiBPdXRwdXQgdHlwZSAoUHVzaCBQdWxsIG9yIE9wZW4gRHJhaW4pCisgICogICAgICAgICAgIC0gWiAgOiBJTyBEaXJlY3Rpb24gbW9kZSAoSW5wdXQsIE91dHB1dCwgQWx0ZXJuYXRlIG9yIEFuYWxvZykKKyAgKiBAeworICAqLworI2RlZmluZSAgR1BJT19NT0RFX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDB1KSAgIC8qITwgSW5wdXQgRmxvYXRpbmcgTW9kZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX09VVFBVVF9QUCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDF1KSAgIC8qITwgT3V0cHV0IFB1c2ggUHVsbCBNb2RlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX09VVFBVVF9PRCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTF1KSAgIC8qITwgT3V0cHV0IE9wZW4gRHJhaW4gTW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FGX1BQICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJ1KSAgIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIFB1c2ggUHVsbCBNb2RlICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FGX09EICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTJ1KSAgIC8qITwgQWx0ZXJuYXRlIEZ1bmN0aW9uIE9wZW4gRHJhaW4gTW9kZSAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0FOQUxPRyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDN1KSAgIC8qITwgQW5hbG9nIE1vZGUgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAgICAgICAoMHgxMDExMDAwMHUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfRkFMTElORyAgICAgICAgICAgICAgICAgICAoMHgxMDIxMDAwMHUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lICBHUElPX01PREVfSVRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICAoMHgxMDMxMDAwMHUpICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICovCisjZGVmaW5lICBHUElPX01PREVfRVZUX1JJU0lORyAgICAgICAgICAgICAgICAgICAoMHgxMDEyMDAwMHUpICAgLyohPCBFeHRlcm5hbCBFdmVudCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gICAgICAgICAgICAgICAqLworI2RlZmluZSAgR1BJT19NT0RFX0VWVF9GQUxMSU5HICAgICAgICAgICAgICAgICAgKDB4MTAyMjAwMDB1KSAgIC8qITwgRXh0ZXJuYWwgRXZlbnQgTW9kZSB3aXRoIEZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fTU9ERV9FVlRfUklTSU5HX0ZBTExJTkcgICAgICAgICAgICgweDEwMzIwMDAwdSkgICAvKiE8IEV4dGVybmFsIEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcvRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fc3BlZWQgR1BJTyBzcGVlZAorICAqIEBicmllZiBHUElPIE91dHB1dCBNYXhpbXVtIGZyZXF1ZW5jeQorICAqIEB7CisgICovCisjZGVmaW5lICBHUElPX1NQRUVEX0ZSRVFfTE9XICAgICAgICAoMHgwMDAwMDAwMHUpICAvKiE8IExvdyBzcGVlZCAgICAgICAqLworI2RlZmluZSAgR1BJT19TUEVFRF9GUkVRX01FRElVTSAgICAgKDB4MDAwMDAwMDF1KSAgLyohPCBNZWRpdW0gc3BlZWQgICAgKi8KKyNkZWZpbmUgIEdQSU9fU1BFRURfRlJFUV9ISUdIICAgICAgICgweDAwMDAwMDAydSkgIC8qITwgSGlnaCBzcGVlZCAgICAgICovCisjZGVmaW5lICBHUElPX1NQRUVEX0ZSRVFfVkVSWV9ISUdIICAoMHgwMDAwMDAwM3UpICAvKiE8IFZlcnkgaGlnaCBzcGVlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworIC8qKiBAZGVmZ3JvdXAgR1BJT19wdWxsIEdQSU8gcHVsbAorICAgKiBAYnJpZWYgR1BJTyBQdWxsLVVwIG9yIFB1bGwtRG93biBBY3RpdmF0aW9uCisgICAqIEB7CisgICAqLworI2RlZmluZSAgR1BJT19OT1BVTEwgICAgICAgICgweDAwMDAwMDAwdSkgICAvKiE8IE5vIFB1bGwtdXAgb3IgUHVsbC1kb3duIGFjdGl2YXRpb24gICovCisjZGVmaW5lICBHUElPX1BVTExVUCAgICAgICAgKDB4MDAwMDAwMDF1KSAgIC8qITwgUHVsbC11cCBhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEdQSU9fUFVMTERPV04gICAgICAoMHgwMDAwMDAwMnUpICAgLyohPCBQdWxsLWRvd24gYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9NYWNyb3MgR1BJTyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworICAKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEVYVEkgbGluZSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtIF9fRVhUSV9MSU5FX18gc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0VYVElfTElORV9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VUX0ZMQUcoX19FWFRJX0xJTkVfXykgICAgICAgKEVYVEktPlBSMSAmIChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgRVhUSSdzIGxpbmUgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgZmxhZ3MgdG8gY2xlYXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfQ0xFQVJfRkxBRyhfX0VYVElfTElORV9fKSAgICAgKEVYVEktPlBSMSA9IChfX0VYVElfTElORV9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGlzIGFzc2VydGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSgwLi4xNSkKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19FWFRJX0xJTkVfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0dFVF9JVChfX0VYVElfTElORV9fKSAgICAgICAgIChFWFRJLT5QUjEgJiAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIEVYVEkncyBsaW5lIHBlbmRpbmcgYml0cy4KKyAgKiBAcGFyYW0gX19FWFRJX0xJTkVfXyBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKF9fRVhUSV9MSU5FX18pICAgICAgIChFWFRJLT5QUjEgPSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEBwYXJhbSBfX0VYVElfTElORV9fIHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlKDAuLjE1KQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9HUElPX0VYVElfR0VORVJBVEVfU1dJVChfX0VYVElfTElORV9fKSAgKEVYVEktPlNXSUVSMSB8PSAoX19FWFRJX0xJTkVfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9NYWNyb3MgR1BJTyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX0dQSU9fUElOX0FDVElPTihBQ1RJT04pICAoKChBQ1RJT04pID09IEdQSU9fUElOX1JFU0VUKSB8fCAoKEFDVElPTikgPT0gR1BJT19QSU5fU0VUKSkKKworI2RlZmluZSBJU19HUElPX1BJTihfX1BJTl9fKSAgICAgICAgKCgoKHVpbnQzMl90KShfX1BJTl9fKSAmIEdQSU9fUElOX01BU0spICE9IDB4MDB1KSAmJlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdCkoX19QSU5fXykgJiB+R1BJT19QSU5fTUFTSykgPT0gMHgwMHUpKQorCisjZGVmaW5lIElTX0dQSU9fTU9ERShfX01PREVfXykgICAgICAoKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lOUFVUKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX09VVFBVVF9QUCkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX09VVFBVVF9PRCkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FGX1BQKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FGX09EKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lORykgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX0ZBTExJTkcpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9SSVNJTkcpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9GQUxMSU5HKSAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0VWVF9SSVNJTkdfRkFMTElORykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gR1BJT19NT0RFX0FOQUxPRykpCisKKyNkZWZpbmUgSVNfR1BJT19TUEVFRChfX1NQRUVEX18pICAgICgoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX0xPVykgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NQRUVEX18pID09IEdQSU9fU1BFRURfRlJFUV9NRURJVU0pICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TUEVFRF9fKSA9PSBHUElPX1NQRUVEX0ZSRVFfSElHSCkgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1BFRURfXykgPT0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSCkpCisKKyNkZWZpbmUgSVNfR1BJT19QVUxMKF9fUFVMTF9fKSAgICAgICgoKF9fUFVMTF9fKSA9PSBHUElPX05PUFVMTCkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFVMTF9fKSA9PSBHUElPX1BVTExVUCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BVTExfXykgPT0gR1BJT19QVUxMRE9XTikpCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIEdQSU8gSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZ3Bpb19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworICAgICAKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgICAgICAgICAgICBIQUxfR1BJT19Jbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCBHUElPX0luaXRUeXBlRGVmICpHUElPX0luaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fRGVJbml0KEdQSU9fVHlwZURlZiAgKkdQSU94LCB1aW50MzJfdCBHUElPX1Bpbik7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKyAgIAorLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dQSU9fUGluU3RhdGUgICAgIEhBTF9HUElPX1JlYWRQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4sIEdQSU9fUGluU3RhdGUgUGluU3RhdGUpOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fVG9nZ2xlUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9HUElPX0xvY2tQaW4oR1BJT19UeXBlRGVmKiBHUElPeCwgdWludDE2X3QgR1BJT19QaW4pOwordm9pZCAgICAgICAgICAgICAgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9HUElPX0VYVElfQ2FsbGJhY2sodWludDE2X3QgR1BJT19QaW4pOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAKKworLyoqCisgICogQH0KKyAgKi8gIAorICAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0dQSU9fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfZ3Bpb19leC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfZ3Bpb19leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDNkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9ncGlvX2V4LmgKQEAgLTAsMCArMSw0MDggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2dwaW9fZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgR1BJTyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9HUElPX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9HUElPX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeCBHUElPRXgKKyAgKiBAYnJpZWYgR1BJTyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPRXhfRXhwb3J0ZWRfQ29uc3RhbnRzIEdQSU9FeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9FeF9BbHRlcm5hdGVfZnVuY3Rpb25fc2VsZWN0aW9uIEdQSU9FeCBBbHRlcm5hdGUgZnVuY3Rpb24gc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKworCisgLyogVGhlIHRhYmxlIGJlbG93IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBwZXIgcG9ydC4KKyAgKiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHlvdXJzZWxmIHRvIHRoZSBwcm9kdWN0IGRhdGEgc2hlZXQuCisgICoKKyAgKi8KKworIC8qICAgICB8ICAgQUYwICAgIHwgICBBRjEgICAgfCAgIEFGMiAgICB8ICAgQUYzICAgIHwgICBBRjQgICAgfCAgIEFGNSAgICB8ICAgQUY2ICAgIHwgICBBRjcgICAgfAorICAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogICAgIHxTWVNfQUYgICAgfFRJTSAgICAgICB8VElNICAgICAgIHxTUEkvU0FJL1RJfEkyQyAgICAgICB8IEkyQyAgICAgIHwgUkYgICAgICAgfCAgVVNBUlQgICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQQTAgfCAgICAgICAgICB8VElNMl9DSDEgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjIgICB8ICAgICAgICAgIHwKKyAgKiBQQTEgfCAgICAgICAgICB8VElNMl9DSDIgIHwgICAgICAgICAgfCAgICAgICAgICB8STJDMV9TTUJBIHxTUEkxX1NDSyAgfFJGX0RUQjMgICB8ICAgICAgICAgIHwKKyAgKiBQQTIgfCAgICAgICAgICB8VElNMl9DSDMgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjQgICB8ICAgICAgICAgIHwKKyAgKiBQQTMgfCAgICAgICAgICB8VElNMl9DSDQgIHwgICAgICAgICAgfFNBSTFfQ0sxICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjUgICB8ICAgICAgICAgIHwKKyAgKiBQQTQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX05TUyAgfFJGX0RUQjYgICB8ICAgICAgICAgIHwKKyAgKiBQQTUgfCAgICAgICAgICB8VElNMl9DSDEgIHxUSU0yX0VUUiAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX1NDSyAgfFJGX0RUQjcgICB8ICAgICAgICAgIHwKKyAgKiBQQTYgfCAgICAgICAgICB8VElNMV9CS0lOIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX01JU08gfFJGX0RUQjggICB8ICAgICAgICAgIHwKKyAgKiBQQTcgfCAgICAgICAgICB8VElNMV9DSDFOIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TQ0wgIHxTUEkxX01PU0kgfFJGX0RUQjkgICB8ICAgICAgICAgIHwKKyAgKiBQQTggfE1DTyAgICAgICB8VElNMV9DSDEgIHwgICAgICAgICAgfFNBSTFfQ0syICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjEyICB8VVNBUlQxX0NLIHwKKyAgKiBQQTkgfCAgICAgICAgICB8VElNMl9DSDIgIHwgICAgICAgICAgfFNBSTFfREkyICB8STJDMV9TQ0wgIHxTUEkyX1NDSyAgfFJGX0RUQjEzICB8VVNBUlQxX1RYIHwKKyAgKiBQQTEwfCAgICAgICAgICB8VElNMl9DSDMgIHwgICAgICAgICAgfFNBSTFfREkxICB8STJDMV9TREEgIHwgICAgICAgICAgfFJGX0RUQjE0ICB8VVNBUlQxX1JYIHwKKyAgKiBQQTExfCAgICAgICAgICB8VElNMl9DSDQgIHxUSU0xX0JLSU4yfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX01JU08gfFJGX0RUQjE1ICB8VVNBUlQxX0NUU3wKKyAgKiBQQTEyfCAgICAgICAgICB8VElNMl9FVFIgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX01PU0kgfFJGX01JU08gICB8VVNBUlQxX1JUU3wKKyAgKiBQQTEzfEpUTVNfU1dESU98ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQTE0fEpUQ0tfU1dDTEt8TFBUSU0xX09VVHwgICAgICAgICAgfCAgICAgICAgICB8STJDMV9TTUJBIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQTE1fEpUREkgICAgICB8VElNMl9DSDEgIHxUSU0yX0VUUiAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX05TUyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQQjAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjEgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjIgfFJUQ19PVVQgICB8TFBUSU0xX09VVHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TTUJBIHxTUEkxX05TUyAgfFJGX0RUQjEwICB8ICAgICAgICAgIHwKKyAgKiBQQjMgfEpURE8gICAgICB8VElNMl9DSDIgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkxX1NDSyAgfCAgICAgICAgICB8VVNBUlQxX1JUU3wKKyAgKiBQQjQgfE5KVFJTVCAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TREEgIHxTUEkxX01JU08gfCAgICAgICAgICB8VVNBUlQxX0NUU3wKKyAgKiBQQjUgfCAgICAgICAgICB8TFBUSU0xX0lOMXwgICAgICAgICAgfCAgICAgICAgICB8STJDMV9TTUJBIHxTUEkxX01PU0kgfFJGX01PU0kgICB8VVNBUlQxX0NLIHwKKyAgKiBQQjYgfCAgICAgICAgICB8TFBUSU0xX0VUUnwgICAgICAgICAgfCAgICAgICAgICB8STJDMV9TQ0wgIHwgICAgICAgICAgfFJGX1NDSyAgICB8VVNBUlQxX1RYIHwKKyAgKiBQQjcgfCAgICAgICAgICB8TFBUSU0xX0lOMnwgICAgICAgICAgfFRJTTFfQktJTiB8STJDMV9TREEgIHwgICAgICAgICAgfFJGX0RUQjExICB8VVNBUlQxX1JYIHwKKyAgKiBQQjggfCAgICAgICAgICB8VElNMV9DSDJOIHwgICAgICAgICAgfFNBSTFfQ0sxICB8STJDMV9TQ0wgIHwgICAgICAgICAgfFJGX0RUQjE2ICB8ICAgICAgICAgIHwKKyAgKiBQQjkgfCAgICAgICAgICB8VElNMV9DSDNOIHwgICAgICAgICAgfFNBSTFfREkyICB8STJDMV9TREEgIHxTUEkyX05TUyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjEwfCAgICAgICAgICB8VElNMl9DSDMgIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TQ0wgIHxTUEkyX1NDSyAgfFJGX0RUQjE4ICB8ICAgICAgICAgIHwKKyAgKiBQQjExfCAgICAgICAgICB8VElNMl9DSDQgIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TREEgIHwgICAgICAgICAgfFJGX0RUQjE3ICB8ICAgICAgICAgIHwKKyAgKiBQQjEyfCAgICAgICAgICB8VElNMV9CS0lOIHwgICAgICAgICAgfFRJTTFfQktJTiB8STJDM19TTUJBIHxTUEkyX05TUyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjEzfCAgICAgICAgICB8VElNMV9DSDFOIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TQ0wgIHxTUEkyX1NDSyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjE0fCAgICAgICAgICB8VElNMV9DSDJOIHwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TREEgIHxTUEkyX01JU08gfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQjE1fFJUQ19SRUZJTiB8VElNMV9DSDNOIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkyX01PU0kgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQQzAgfCAgICAgICAgICB8TFBUSU0xX0lOMXwgICAgICAgICAgfCAgICAgICAgICB8STJDM19TQ0wgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzEgfCAgICAgICAgICB8TFBUSU0xX09VVHwgICAgICAgICAgfFNQSTJfTU9TSSB8STJDM19TREEgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzIgfCAgICAgICAgICB8TFBUSU0xX0lOMnwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkyX01JU08gfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzMgfCAgICAgICAgICB8TFBUSU0xX0VUUnwgICAgICAgICAgfFNBSTFfREkxICB8ICAgICAgICAgIHxTUEkyX01PU0kgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzUgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFNBSTFfREkzICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzYgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzcgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzggfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzkgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFRJTTFfQktJTiB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzEwfFRSQUNFRDEgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzExfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzEyfFRSQUNFRDMgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzEzfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQQzE0fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjAgICB8ICAgICAgICAgIHwKKyAgKiBQQzE1fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX0RUQjEgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQRDAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkyX05TUyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDEgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkyX1NDSyAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDIgfFRSQUNFRDIgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDMgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFNQSTJfU0NLICB8ICAgICAgICAgIHxTUEkyX01JU08gfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxTUEkyX01PU0kgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDUgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDYgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFNBSTFfREkxICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDcgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDggfCAgICAgICAgICB8ICAgICAgICAgIHxUSU0xX0JLSU4yfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDkgfFRSQUNFRDAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDEwfFRSSUdfSU8gICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDExfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDEyfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDEzfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDE0fCAgICAgICAgICB8VElNMV9DSDEgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRDE1fCAgICAgICAgICB8VElNMV9DSDIgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQRTAgfCAgICAgICAgICB8VElNMV9FVFIgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRTEgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRTIgfFRSQUNFRDIgICB8ICAgICAgICAgIHwgICAgICAgICAgfFNBSTFfQ0sxICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRTMgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRTQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgKiBQSDAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQSDEgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQRTIgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAgKiBQSDMgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfFJGX05TUyAgICB8ICAgICAgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18qLworCisKKyAvKiAgICAgfCAgIEFGOCAgICB8ICAgQUY5ICAgIHwgICBBRjEwICAgfCAgIEFGMTEgICB8ICBBRjEyICAgIHwgIEFGMTMgICAgfCBBRjE0ICAgICB8IEFGMTUgICAgIHwKKyAgKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAqICAgICB8TFBVQVJUMSAgIHxUU0MgICAgICAgfFVTQi9RVUFEU1B8TENEICAgICAgIHxDT01QL1RJTSAgfFNBSSAgICAgICB8VElNICAgICAgIHxFVkVOVE9VVCAgfAorICAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEEwIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfENPTVAxX09VVCB8U0FJMV9FX0NMS3xUSU0yX0VUUiAgfEVWRU5UT1VUICB8CisgICogUEExIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMCAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEEyIHxMUFVBUlQxX1RYfCAgICAgICAgICB8UVNQSV9OQ1MgIHxMQ0RfU0VHMSAgfENPTVAyX09VVCB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEEzIHxMUFVBUlQxX1JYfCAgICAgICAgICB8UVNQSV9DTEsgIHxMQ0RfU0VHMiAgfCAgICAgICAgICB8U0FJMV9DTEtfQXwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEE0IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9GU19CIHxMUFRJTTJfT1VUfEVWRU5UT1VUICB8CisgICogUEE1IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfRVRSfEVWRU5UT1VUICB8CisgICogUEE2IHxMUFVBUlQxX0NUfCAgICAgICAgICB8UVNQSV9JTzMgIHxMQ0RfU0VHMyAgfFRJTTFfQktJTiB8ICAgICAgICAgIHxUSU0xNl9DSDEgfEVWRU5UT1VUICB8CisgICogUEE3IHwgICAgICAgICAgfCAgICAgICAgICB8UVNQSV9JTzIgIHxMQ0RfU0VHNCAgfENPTVAyX09VVCB8ICAgICAgICAgIHxUSU0xN19DSDEgfEVWRU5UT1VUICB8CisgICogUEE4IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfQ09NMCAgfCAgICAgICAgICB8U0FJMV9TQ0tfQXxMUFRJTTJfT1VUfEVWRU5UT1VUICB8CisgICogUEE5IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfQ09NMSAgfCAgICAgICAgICB8U0FJMV9GU19BIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEExMHwgICAgICAgICAgfCAgICAgICAgICB8VVNCX0NSU19TWXxMQ0RfQ09NMiAgfCAgICAgICAgICB8U0FJMV9TRF9BIHxUSU0xN19CS0lOfEVWRU5UT1VUICB8CisgICogUEExMXwgICAgICAgICAgfCAgICAgICAgICB8VVNCX0RNICAgIHwgICAgICAgICAgfFRJTTFfQktJTjJ8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEExMnwgICAgICAgICAgfCAgICAgICAgICB8VVNCX0RQICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEExM3xJUl9PVVQgICAgfCAgICAgICAgICB8VVNCX05PRSAgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9TRF9CIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEExNHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9GU19CIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEExNXwgICAgICAgICAgfFRTQ19HM19JTzF8ICAgICAgICAgIHxMQ0RfU0VHMTcgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEIwIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHNSAgfENPTVAxX09VVCB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxIHxMUFVBUlQxX1JUfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHNiAgfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfSU4xfEVWRU5UT1VUICB8CisgICogUEIyIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfVkxDRCAgfCAgICAgICAgICB8U0FJMV9FX0NMS3wgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIzIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHNyAgfCAgICAgICAgICB8U0FJMV9TQ0tfQnwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEI0IHwgICAgICAgICAgfFRTQ19HMl9JTzF8ICAgICAgICAgIHxMQ0RfU0VHOCAgfCAgICAgICAgICB8U0FJMV9DTEtfQnxUSU0xN19CS0lOfEVWRU5UT1VUICB8CisgICogUEI1IHwgICAgICAgICAgfFRTQ19HMl9JTzJ8ICAgICAgICAgIHxMQ0RfU0VHOSAgfENPTVAyX09VVCB8U0FJMV9TRF9CIHxUSU0xNl9CS0lOfEVWRU5UT1VUICB8CisgICogUEI2IHwgICAgICAgICAgfFRTQ19HMl9JTzN8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9GU19CIHxUSU0xNl9DSDFOfEVWRU5UT1VUICB8CisgICogUEI3IHwgICAgICAgICAgfFRTQ19HMl9JTzR8ICAgICAgICAgIHxMQ0RfU0VHMjEgfCAgICAgICAgICB8ICAgICAgICAgIHxUSU0xN19DSDFOfEVWRU5UT1VUICB8CisgICogUEI4IHwgICAgICAgICAgfCAgICAgICAgICB8UVNQSV9JTzEgIHxMQ0RfU0VHMTYgfCAgICAgICAgICB8U0FJMV9DTEtfQXxUSU0xNl9DSDEgfEVWRU5UT1VUICB8CisgICogUEI5IHxJUl9PVVQgICAgfFRTQ19HN19JTzR8UVNQSV9JTzAgIHxMQ0RfQ09NMyAgfCAgICAgICAgICB8U0FJMV9GU19BIHxUSU0xN19DSDEgfEVWRU5UT1VUICB8CisgICogUEIxMHxMUFVBUlQxX1JYfFRTQ19TWU5DICB8UVNQSV9DTEsgIHxMQ0RfU0VHMTAgfENPTVAxX09VVCB8U0FJMV9TQ0tfQXwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxMXxMUFVBUlQxX1RYfCAgICAgICAgICB8UVNQSV9OQ1MgIHxMQ0RfU0VHMTEgfENPTVAyX09VVCB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxMnxMUFVBUlQxX1JUfFRTQ19HMV9JTzF8ICAgICAgICAgIHxMQ0RfU0VHMTIgfCAgICAgICAgICB8U0FJMV9GU19BIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxM3xMUFVBUlQxX0NUfFRTQ19HMV9JTzJ8ICAgICAgICAgIHxMQ0RfU0VHMTMgfCAgICAgICAgICB8U0FJMV9TQ0tfQXwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxNHwgICAgICAgICAgfFRTQ19HMV9JTzN8ICAgICAgICAgIHxMQ0RfU0VHMTQgfCAgICAgICAgICB8U0FJMV9DTEtfQXwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEIxNXwgICAgICAgICAgfFRTQ19HMV9JTzR8ICAgICAgICAgIHxMQ0RfU0VHMTUgfCAgICAgICAgICB8U0FJMV9TRF9BIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEMwIHxMUFVBUlQxX1JYfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMTggfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfSU4xfEVWRU5UT1VUICB8CisgICogUEMxIHxMUFVBUlQxX1RYfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMTkgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMyIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMjAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMzIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfVkxDRCAgfCAgICAgICAgICB8U0FJMV9TRF9BIHxMUFRJTTJfRVRSfEVWRU5UT1VUICB8CisgICogUEM0IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMjIgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEM1IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMjMgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEM2IHwgICAgICAgICAgfFRTQ19HNF9JTzF8ICAgICAgICAgIHxMQ0RfU0VHMjQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEM3IHwgICAgICAgICAgfFRTQ19HNF9JTzJ8ICAgICAgICAgIHxMQ0RfU0VHMjUgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEM4IHwgICAgICAgICAgfFRTQ19HNF9JTzN8ICAgICAgICAgIHxMQ0RfU0VHMjYgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEM5IHwgICAgICAgICAgfFRTQ19HNF9JTzR8VVNCX05PRSAgIHxMQ0RfU0VHMjcgfCAgICAgICAgICB8U0FJMV9TQ0tfQnwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxMHwgICAgICAgICAgfFRTQ19HM19JTzJ8ICAgICAgICAgIHxMQ0RfQ3hfU0V4fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxMXwgICAgICAgICAgfFRTQ19HM19JTzN8ICAgICAgICAgIHxMQ0RfQ3hfU0V4fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxMnwgICAgICAgICAgfFRTQ19HM19JTzR8ICAgICAgICAgIHxMQ0RfQ3hfU0V4fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxM3wgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxNHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEMxNXwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEQwIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQxIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQyIHwgICAgICAgICAgfFRTQ19TWU5DICB8ICAgICAgICAgIHxMQ0RfQ3hfU0V4fCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQzIHwgICAgICAgICAgfCAgICAgICAgICB8UVNQSV9OQ1MgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ0IHwgICAgICAgICAgfFRTQ19HNV9JTzF8UVNQSV9JTzAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ1IHwgICAgICAgICAgfFRTQ19HNV9JTzJ8UVNQSV9JTzEgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9DTEtfQnwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ2IHwgICAgICAgICAgfFRTQ19HNV9JTzN8UVNQSV9JTzIgIHwgICAgICAgICAgfCAgICAgICAgICB8U0FJMV9TRF9BIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ3IHwgICAgICAgICAgfFRTQ19HNV9JTzR8UVNQSV9JTzMgIHxMQ0RfU0VHMzkgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ4IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMjggfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQ5IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMjkgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQxMHwgICAgICAgICAgfFRTQ19HNl9JTzF8ICAgICAgICAgIHxMQ0RfU0VHMzAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQxMXwgICAgICAgICAgfFRTQ19HNl9JTzJ8ICAgICAgICAgIHxMQ0RfU0VHMzEgfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfRVRSfEVWRU5UT1VUICB8CisgICogUEQxMnwgICAgICAgICAgfFRTQ19HNl9JTzN8ICAgICAgICAgIHxMQ0RfU0VHMzIgfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfSU4xfEVWRU5UT1VUICB8CisgICogUEQxM3wgICAgICAgICAgfFRTQ19HNl9JTzR8ICAgICAgICAgIHxMQ0RfU0VHMzMgfCAgICAgICAgICB8ICAgICAgICAgIHxMUFRJTTJfT1VUfEVWRU5UT1VUICB8CisgICogUEQxNHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMzQgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEQxNXwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHxMQ0RfU0VHMzUgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEUwIHwgICAgICAgICAgfFRTQ19HN19JTzN8ICAgICAgICAgIHxMQ0RfU0VHMzYgfCAgICAgICAgICB8ICAgICAgICAgIHxUSU0xNl9DSDEgfEVWRU5UT1VUICB8CisgICogUEUxIHwgICAgICAgICAgfFRTQ19HN19JTzJ8ICAgICAgICAgIHxMQ0RfU0VHMzcgfCAgICAgICAgICB8ICAgICAgICAgIHxUSU0xN19DSDEgfEVWRU5UT1VUICB8CisgICogUEUyIHwgICAgICAgICAgfFRTQ19HN19JTzF8ICAgICAgICAgIHxMQ0RfU0VHMzggfCAgICAgICAgICB8U0FJMV9DTEtfQXwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEUzIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEU0IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgICogUEgwIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEgxIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEUyIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICogUEgzIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfEVWRU5UT1VUICB8CisgICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMCBzZWxlY3Rpb24KKyAgKi8KKworI2RlZmluZSBHUElPX0FGMF9NQ08gICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBNQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0xTQ08gICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IExTQ08gQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfSlRNU19TV0RJTyAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgSlRNUy1TV0RJTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9KVENLX1NXQ0xLICAgICgodWludDhfdCkweDAwKSAgLyohPCBKVENLLVNXQ0xLIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX0pUREkgICAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IEpUREkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfUlRDX09VVCAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgUkNUX09VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9KVERfVFJBQ0UgICAgICgodWludDhfdCkweDAwKSAgLyohPCBKVERPLVRSQUNFU1dPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX05KVFJTVCAgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IE5KVFJTVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfUlRDX1JFRklOICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgUlRDX1JFRklOIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRUQwICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBUUkFDRUQwIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSQUNFRDEgICAgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRSQUNFRDEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0VEMiAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgVFJBQ0VEMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9UUkFDRUQzICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBUUkFDRUQzIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYwX1RSSUdfSU5PVVQgICAgKCh1aW50OF90KTB4MDApICAvKiE8IFRSSUdfSU5PVVQgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjBfVFJBQ0VDSyAgICAgICAoKHVpbnQ4X3QpMHgwMCkgIC8qITwgVFJBQ0VDSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMF9TWVMgICAgICAgICAgICgodWludDhfdCkweDAwKSAgLyohPCBTeXN0ZW0gRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAvKioKKyAgKiBAYnJpZWYgICBBRiAxIHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGMV9USU0xICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgVElNMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjFfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDEpICAvKiE8IFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGMV9MUFRJTTEgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgIC8qITwgTFBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgICovCisKKy8qKgorICAqIEBicmllZiAgIEFGIDIgc2VsZWN0aW9uCisgICovCisKKyNkZWZpbmUgR1BJT19BRjJfVElNMiAgICAgICAgICAgKCh1aW50OF90KTB4MDIpICAvKiE8IFRJTTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgICovCisjZGVmaW5lIEdQSU9fQUYyX1RJTTEgICAgICAgICAgICgodWludDhfdCkweDAyKSAgLyohPCBUSU0xIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICAgKi8KKy8qKgorICAqIEBicmllZiAgIEFGIDMgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYzX1NBSTEgICAgICAgICAgICgodWludDhfdCkweDAzKSAgLyohPCBTQUkxX0NLMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjNfU1BJMiAgICAgICAgICAgKCh1aW50OF90KTB4MDMpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjNfVElNMSAgICAgICAgICAgKCh1aW50OF90KTB4MDMpICAvKiE8IFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgNCBzZWxlY3Rpb24KKyAgKi8KKyNkZWZpbmUgR1BJT19BRjRfSTJDMSAgICAgICAgICAgKCh1aW50OF90KTB4MDQpICAvKiE8IEkyQzEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICAqLworI2RlZmluZSBHUElPX0FGNF9JMkMzICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNCkgIC8qITwgSTJDMyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA1IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNV9TUEkxICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNSkgIC8qITwgU1BJMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjVfU1BJMiAgICAgICAgICAgKCh1aW50OF90KTB4MDUpICAvKiE8IFNQSTIgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAgICovCisvKioKKyAgKiBAYnJpZWYgICBBRiA2IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGNl9NQ08gICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgTUNPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgICovCisjZGVmaW5lIEdQSU9fQUY2X0xTQ08gICAgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBMU0NPIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCMCAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEIxICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjIgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEIyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCMyAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEI0ICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjUgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEI1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCNiAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEI3ICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjggICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEI4IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCOSAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjkgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEIxMCAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCMTAgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjExICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEIxMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCMTIgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjEyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEIxMyAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCMTMgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjE0ICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEIxNCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCMTUgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjE1IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9EVEIxNiAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfRFRCMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX0RUQjE3ICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9EVEIxNyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfRFRCMTggICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX0RUQjE4IEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9NSVNPICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfTUlTTyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICovCisjZGVmaW5lIEdQSU9fQUY2X1JGX01PU0kgICAgICAgICgodWludDhfdCkweDA2KSAgLyohPCBSRl9NT1NJIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgKi8KKyNkZWZpbmUgR1BJT19BRjZfUkZfU0NLICAgICAgICAgKCh1aW50OF90KTB4MDYpICAvKiE8IFJGX1NDSyBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAqLworI2RlZmluZSBHUElPX0FGNl9SRl9OU1MgICAgICAgICAoKHVpbnQ4X3QpMHgwNikgIC8qITwgUkZfTlNTIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICovCisvKioKKyAgKiBAYnJpZWYgICBBRiA3IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGN19VU0FSVDEgICAgICAgICAoKHVpbnQ4X3QpMHgwNykgIC8qITwgVVNBUlQxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA4IHNlbGVjdGlvbgorICAqLworI2RlZmluZSBHUElPX0FGOF9MUFVBUlQxICAgICAgICAoKHVpbnQ4X3QpMHgwOCkgIC8qITwgTFBVQVJUMSBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisjZGVmaW5lIEdQSU9fQUY4X0lSICAgICAgICAgICAgICgodWludDhfdCkweDA4KSAgLyohPCBJUiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgICBBRiA5IHNlbGVjdGlvbgorICAqLworICNkZWZpbmUgR1BJT19BRjlfVFNDICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOSkgIC8qITwgVFNDIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKworLyoqCisgICogQGJyaWVmICAgQUYgMTAgc2VsZWN0aW9uCisgICovCisjZGVmaW5lIEdQSU9fQUYxMF9RVUFEU1BJICAgICAgICgodWludDhfdCkweDBhKSAgLyohPCBRVUFEU1BJIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAqLworI2RlZmluZSBHUElPX0FGMTBfVVNCICAgICAgICAgICAoKHVpbnQ4X3QpMHgwYSkgIC8qITwgVVNCIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKworLyoqCisgICAqIEBicmllZiAgIEFGIDExIHNlbGVjdGlvbgorICAgKi8KKyNkZWZpbmUgR1BJT19BRjExX0xDRCAgICAgICAgICAgKCh1aW50OF90KTB4MGIpICAvKiE8IExDRCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisKKy8qKgorICogQGJyaWVmICAgQUYgMTIgc2VsZWN0aW9uCisgKi8KKyNkZWZpbmUgR1BJT19BRjEyX0NPTVAxICAgICAgICAgKCh1aW50OF90KTB4MGMpICAvKiE8IENPTVAxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjEyX0NPTVAyICAgICAgICAgKCh1aW50OF90KTB4MGMpICAvKiE8IENPTVAyIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKyNkZWZpbmUgR1BJT19BRjEyX1RJTTEgICAgICAgICAgKCh1aW50OF90KTB4MGMpICAvKiE8IFRJTTEgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworCisvKioKKyAqIEBicmllZiAgIEFGIDEzIHNlbGVjdGlvbgorICovCisjZGVmaW5lIEdQSU9fQUYxM19TQUkxICAgICAgICAgICgodWludDhfdCkweDBkKSAgLyohPCBTQUkxIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAgKi8KKworLyoqCisgKiBAYnJpZWYgICBBRiAxNCBzZWxlY3Rpb24KKyAqLworI2RlZmluZSBHUElPX0FGMTRfVElNMiAgICAgICAgICAoKHVpbnQ4X3QpMHgwZSkgIC8qITwgVElNMiBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICAqLworI2RlZmluZSBHUElPX0FGMTRfVElNMTYgICAgICAgICAoKHVpbnQ4X3QpMHgwZSkgIC8qITwgVElNMTYgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMTRfVElNMTcgICAgICAgICAoKHVpbnQ4X3QpMHgwZSkgIC8qITwgVElNMTcgQWx0ZXJuYXRlIEZ1bmN0aW9uIG1hcHBpbmcgICAgICAqLworI2RlZmluZSBHUElPX0FGMTRfTFBUSU0yICAgICAgICAoKHVpbnQ4X3QpMHgwZSkgIC8qITwgTFBUSU0yIEFsdGVybmF0ZSBGdW5jdGlvbiBtYXBwaW5nICAgICAqLworCisKKy8qKgorKiBAYnJpZWYgICBBRiAxNSBzZWxlY3Rpb24KKyovCisKKyNkZWZpbmUgR1BJT19BRjE1X0VWRU5UT1VUICAgICAgICAgICgodWludDhfdCkweDBmKSAgLyohPCBFVkVOVE9VVCBBbHRlcm5hdGUgRnVuY3Rpb24gbWFwcGluZyAgICAgICovCisKKyNkZWZpbmUgSVNfR1BJT19BRihBRikgICAgICAgICAgICAgICgoQUYpIDw9ICh1aW50OF90KTB4MGYpCisKKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9FeF9FeHBvcnRlZF9NYWNyb3MgR1BJT0V4IEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT0V4X0dldF9Qb3J0X0luZGV4IEdQSU9FeCBHZXQgUG9ydCBJbmRleAorKiBAeworICAqLworCisjZGVmaW5lIEdQSU9fR0VUX0lOREVYKF9fR1BJT3hfXykgICAgKCgoX19HUElPeF9fKSA9PSAoR1BJT0EpKT8gMHVMIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0IpKT8gMXVMIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0MpKT8gMnVMIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0QpKT8gM3VMIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HUElPeF9fKSA9PSAoR1BJT0UpKT8gNHVMIDogN3VMKQorCisgLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9HUElPX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2hzZW0uaCBiL0luYy9zdG0zMndieHhfaGFsX2hzZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ4MTY0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfaHNlbS5oCkBAIC0wLDAgKzEsMjEwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9oc2VtLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEhTRU0gSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0hTRU1fSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0hTRU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICAqIEB7CisgICAqLworCisvKiogQGFkZHRvZ3JvdXAgSFNFTQorICAgKiBAeworICAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFNFTV9FeHBvcnRlZF9NYWNyb3MgSFNFTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNlbUlEIHRvIG1hc2sgaGVscGVyIE1hY3JvLgorICAqIEBwYXJhbSAgX19TRU1JRF9fOiBzZW1hcGhvcmUgSUQgZnJvbSAwIHRvIDMxCisgICogQHJldHZhbCBTZW1hcGhvcmUgTWFzay4KKyAgKi8KKyNkZWZpbmUgX19IQUxfSFNFTV9TRU1JRF9UT19NQVNLKF9fU0VNSURfXykgKDEgPDwgKF9fU0VNSURfXykpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIEhTRU0gaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fU0VNX01BU0tfXzogc2VtYXBob3JlcyBNYXNrCisgICogQHJldHZhbCBOb25lLgorICAqLworI2lmIGRlZmluZWQoRFVBTF9DT1JFKQorI2RlZmluZSBfX0hBTF9IU0VNX0VOQUJMRV9JVChfX1NFTV9NQVNLX18pICgoKChTQ0ItPkNQVUlEICYgMHgwMDAwMDBGMCkgPj4gNCApPT0gMHg3KSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhTRU0tPkMxSUVSIHw9IChfX1NFTV9NQVNLX18pKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhTRU0tPkMySUVSIHw9IChfX1NFTV9NQVNLX18pKSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0hTRU1fRU5BQkxFX0lUKF9fU0VNX01BU0tfXykgKEhTRU0tPklFUiB8PSAoX19TRU1fTUFTS19fKSkKKyNlbmRpZiAvKiBEVUFMX0NPUkUgKi8KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBIU0VNIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX1NFTV9NQVNLX186IHNlbWFwaG9yZXMgTWFzaworICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNpZiBkZWZpbmVkKERVQUxfQ09SRSkKKyNkZWZpbmUgX19IQUxfSFNFTV9ESVNBQkxFX0lUKF9fU0VNX01BU0tfXykgKCgoKFNDQi0+Q1BVSUQgJiAweDAwMDAwMEYwKSA+PiA0ICk9PSAweDcpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhTRU0tPkMxSUVSICY9IH4oX19TRU1fTUFTS19fKSkgOiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSFNFTS0+QzJJRVIgJj0gfihfX1NFTV9NQVNLX18pKSkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0hTRU1fRElTQUJMRV9JVChfX1NFTV9NQVNLX18pIChIU0VNLT5JRVIgJj0gfihfX1NFTV9NQVNLX18pKQorI2VuZGlmIC8qIERVQUxfQ09SRSAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90IGZvciBzZW1hcGhvcmVzIHNwZWNpZmllZCBieSBhIG1hc2suCisgICogQHBhcmFtICBfX1NFTV9NQVNLX186IHNlbWFwaG9yZXMgTWFzaworICAqIEByZXR2YWwgc2VtYXBob3JlcyBNYXNrIDogU2VtYXBob3JlcyB3aGVyZSBhbiBpbnRlcnJ1cHQgb2NjdXJyZWQuCisgICovCisjaWYgZGVmaW5lZChEVUFMX0NPUkUpCisjZGVmaW5lIF9fSEFMX0hTRU1fR0VUX0lUKF9fU0VNX01BU0tfXykgKCgoKFNDQi0+Q1BVSUQgJiAweDAwMDAwMEYwKSA+PiA0ICk9PSAweDcpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VNX01BU0tfXykgJiBIU0VNLT5DMU1JU1IpIDogICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTV9NQVNLX18pICYgSFNFTS0+QzJNSVNSMSkpCisjZWxzZQorI2RlZmluZSBfX0hBTF9IU0VNX0dFVF9JVChfX1NFTV9NQVNLX18pICgoX19TRU1fTUFTS19fKSAmIEhTRU0tPk1JU1IpCisjZW5kaWYgLyogRFVBTF9DT1JFICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZW1hcGhvcmVzIHJlbGVhc2Ugc3RhdHVzIGZsYWdzLgorICAqIEBwYXJhbSAgX19TRU1fTUFTS19fOiBzZW1hcGhvcmVzIE1hc2sKKyAgKiBAcmV0dmFsIHNlbWFwaG9yZXMgTWFzayA6IFNlbWFwaG9yZXMgd2hlcmUgUmVsZWFzZSBmbGFncyByaXNlLgorICAqLworI2lmIGRlZmluZWQoRFVBTF9DT1JFKQorI2RlZmluZSBfX0hBTF9IU0VNX0dFVF9GTEFHKF9fU0VNX01BU0tfXykgKCgoKFNDQi0+Q1BVSUQgJiAweDAwMDAwMEYwKSA+PiA0ICk9PSAweDcpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1NFTV9NQVNLX18pICYgSFNFTS0+QzFJU1IgOiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1NFTV9NQVNLX18pICYgSFNFTS0+QzJJU1IpCisjZWxzZQorI2RlZmluZSBfX0hBTF9IU0VNX0dFVF9GTEFHKF9fU0VNX01BU0tfXykgKChfX1NFTV9NQVNLX18pICYgSFNFTS0+SVNSKQorI2VuZGlmIC8qIERVQUxfQ09SRSAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFycyB0aGUgSFNFTSBJbnRlcnJ1cHQgZmxhZ3MuCisgICogQHBhcmFtICBfX1NFTV9NQVNLX186IHNlbWFwaG9yZXMgTWFzaworICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNpZiBkZWZpbmVkKERVQUxfQ09SRSkKKyNkZWZpbmUgX19IQUxfSFNFTV9DTEVBUl9GTEFHKF9fU0VNX01BU0tfXykgKCgoKFNDQi0+Q1BVSUQgJiAweDAwMDAwMEYwKSA+PiA0ICk9PSAweDcpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhTRU0tPkMxSUNSIHw9IChfX1NFTV9NQVNLX18pKSA6ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSFNFTS0+QzJJQ1IgfD0gKF9fU0VNX01BU0tfXykpKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfSFNFTV9DTEVBUl9GTEFHKF9fU0VNX01BU0tfXykgKEhTRU0tPklDUiB8PSAoX19TRU1fTUFTS19fKSkKKyNlbmRpZiAvKiBEVUFMX0NPUkUgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFNFTV9FeHBvcnRlZF9GdW5jdGlvbnMgSFNFTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSFNFTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFRha2UgYW5kIFJlbGVhc2UgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEhTRU0gVGFrZSBhbmQgUmVsZWFzZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBIU0VNIHNlbWFwaG9yZSB0YWtlIChsb2NrKSB1c2luZyAyLVN0ZXAgIG1ldGhvZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9IU0VNX1Rha2UodWludDMyX3QgU2VtSUQsIHVpbnQzMl90IFByb2Nlc3NJRCk7CisvKiBIU0VNIHNlbWFwaG9yZSBmYXN0IHRha2UgKGxvY2spIHVzaW5nIDEtU3RlcCAgbWV0aG9kICoqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9IU0VNX0Zhc3RUYWtlKHVpbnQzMl90IFNlbUlEKTsKKy8qIEhTRU0gQ2hlY2sgc2VtYXBob3JlIHN0YXRlIFRha2VuIG9yIG5vdCAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfSFNFTV9Jc1NlbVRha2VuKHVpbnQzMl90IFNlbUlEKTsKKy8qIEhTRU0gUmVsZWFzZSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICBIQUxfSFNFTV9SZWxlYXNlKHVpbnQzMl90IFNlbUlELCB1aW50MzJfdCBQcm9jZXNzSUQpOworLyogSFNFTSBSZWxlYXNlIEFsbCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0hTRU1fUmVsZWFzZUFsbCh1aW50MzJfdCBLZXksIHVpbnQzMl90IENvcmVJRCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIU0VNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSFNFTSBTZXQgYW5kIEdldCBLZXkgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEhTRU0gU2V0IGFuZCBHZXQgS2V5IGZ1bmN0aW9ucy4KKyAgKiBAeworICAqLworLyogSFNFTSBTZXQgQ2xlYXIgS2V5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgIEhBTF9IU0VNX1NldENsZWFyS2V5KHVpbnQzMl90IEtleSk7CisvKiBIU0VNIEdldCBDbGVhciBLZXkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX0hTRU1fR2V0Q2xlYXJLZXkodm9pZCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSFNFTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQGJyaWVmICAgSFNFTSBOb3RpZmljYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEhTRU0gQWN0aXZhdGUgSFNFTSBOb3RpZmljYXRpb24gKFdoZW4gYSBzZW1hcGhvcmUgaXMgcmVsZWFzZWQpICkgKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9IU0VNX0FjdGl2YXRlTm90aWZpY2F0aW9uKHVpbnQzMl90IFNlbU1hc2spOworLyogSFNFTSBEZWFjdGl2YXRlIEhTRU0gTm90aWZpY2F0aW9uIChXaGVuIGEgc2VtYXBob3JlIGlzIHJlbGVhc2VkKSAgKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0hTRU1fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbih1aW50MzJfdCBTZW1NYXNrKTsKKy8qIEhTRU0gRnJlZSBDYWxsYmFjayAoV2hlbiBhIHNlbWFwaG9yZSBpcyByZWxlYXNlZCkgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9IU0VNX0ZyZWVDYWxsYmFjayh1aW50MzJfdCBTZW1NYXNrKTsKKy8qIEhTRU0gSVJRIEhhbmRsZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9IU0VNX0lSUUhhbmRsZXIodm9pZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhTRU1fUHJpdmF0ZV9NYWNyb3MgSFNFTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfSFNFTV9TRU1JRChfX1NFTUlEX18pICgoX19TRU1JRF9fKSA8PSBIU0VNX1NFTUlEX01BWCApCisKKyNkZWZpbmUgSVNfSFNFTV9QUk9DRVNTSUQoX19QUk9DRVNTSURfXykgKChfX1BST0NFU1NJRF9fKSA8PSBIU0VNX1BST0NFU1NJRF9NQVggKQorCisjZGVmaW5lIElTX0hTRU1fS0VZKF9fS0VZX18pICgoX19LRVlfXykgPD0gSFNFTV9DTEVBUl9LRVlfTUFYICkKKworI2RlZmluZSBJU19IU0VNX0NPUkVJRChfX0NPUkVJRF9fKSAoKChfX0NPUkVJRF9fKSA9PSBIU0VNX0NQVTFfQ09SRUlEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09SRUlEX18pID09IEhTRU1fQ1BVMl9DT1JFSUQpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0hTRU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfaTJjLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q3ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfaTJjLmgKQEAgLTAsMCArMSw3ODIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2kyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJMkMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0kyQ19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfSTJDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfVHlwZXMgSTJDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfQ29uZmlndXJhdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBJMkMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSTJDIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEkyQ19USU1JTkdSX3JlZ2lzdGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIEkyQyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIFJlZmVyZW5jZSBtYW51YWwgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZmlyc3QgZGV2aWNlIG93biBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIGlmIDctYml0IG9yIDEwLWJpdCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfQUREUkVTU0lOR19NT0RFICovCisKKyAgdWludDMyX3QgRHVhbEFkZHJlc3NNb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfRFVBTF9BRERSRVNTSU5HX01PREUgKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIDctYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczJNYXNrczsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFja25vd2xlZGdlIG1hc2sgYWRkcmVzcyBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfT1dOX0FERFJFU1MyX01BU0tTICovCisKKyAgdWludDMyX3QgR2VuZXJhbENhbGxNb2RlOyAgICAgLyohPCBTcGVjaWZpZXMgaWYgZ2VuZXJhbCBjYWxsIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfR0VORVJBTF9DQUxMX0FERFJFU1NJTkdfTU9ERSAqLworCisgIHVpbnQzMl90IE5vU3RyZXRjaE1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIG5vc3RyZXRjaCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX05PU1RSRVRDSF9NT0RFICovCisKK30gSTJDX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9zdGF0ZV9zdHJ1Y3R1cmVfZGVmaW5pdGlvbiBIQUwgc3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBub3RlICBIQUwgSTJDIFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6XG4KKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb25cbgorICAqICAgICAgICAgICAgIDAwIDogTm8gRXJyb3JcbgorICAqICAgICAgICAgICAgIDAxIDogQWJvcnQgKEFib3J0IHVzZXIgcmVxdWVzdCBvbiBnb2luZylcbgorICAqICAgICAgICAgICAgIDEwIDogVGltZW91dFxuCisgICogICAgICAgICAgICAgMTEgOiBFcnJvclxuCisgICogICAgICAgICAgYjUgICAgIFBlcmlwaGVyYWwgaW5pdGlhbGl6YXRpb24gc3RhdHVzXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChwZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZClcbgorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChwZXJpcGhlcmFsIGluaXRpYWxpemVkIGFuZCByZWFkeSB0byB1c2UuIEhBTCBJMkMgSW5pdCBmdW5jdGlvbiBjYWxsZWQpXG4KKyAgKiAgICAgICAgICBiNCAgICAgKG5vdCB1c2VkKVxuCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDBcbgorICAqICAgICAgICAgIGIzXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IG9yIEJ1c3kgKE5vIExpc3RlbiBtb2RlIG9uZ29pbmcpXG4KKyAgKiAgICAgICAgICAgICAxICA6IExpc3RlbiAocGVyaXBoZXJhbCBpbiBBZGRyZXNzIExpc3RlbiBNb2RlKVxuCisgICogICAgICAgICAgYjIgICAgIEludHJpbnNpYyBwcm9jZXNzIHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5XG4KKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKHBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKVxuCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlXG4KKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZylcbgorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoUnggb3BlcmF0aW9uIG9uZ29pbmcpXG4KKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGVcbgorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKVxuCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMkNfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IHlldCBJbml0aWFsaXplZCAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDIwVSwgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDI0VSwgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgPSAweDIxVSwgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAgICAgICAgICAgPSAweDIyVSwgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfTElTVEVOICAgICAgICAgICAgPSAweDI4VSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgaXMgb25nb2luZyAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4gICAgPSAweDI5VSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgYW5kIERhdGEgVHJhbnNtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4gICAgPSAweDJBVSwgICAvKiE8IEFkZHJlc3MgTGlzdGVuIE1vZGUgYW5kIERhdGEgUmVjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfQUJPUlQgICAgICAgICAgICAgPSAweDYwVSwgICAvKiE8IEFib3J0IHVzZXIgcmVxdWVzdCBvbmdvaW5nICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweEEwVSwgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9JMkNfU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweEUwVSAgICAvKiE8IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX0kyQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX21vZGVfc3RydWN0dXJlX2RlZmluaXRpb24gSEFMIG1vZGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBNb2RlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBJMkMgTW9kZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOlxuCisgICogICAgICAgICAgYjcgICAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwXG4KKyAgKiAgICAgICAgICBiNlxuCisgICogICAgICAgICAgICAgMCAgOiBOb25lXG4KKyAgKiAgICAgICAgICAgICAxICA6IE1lbW9yeSAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1lbW9yeSBNb2RlKVxuCisgICogICAgICAgICAgYjVcbgorICAqICAgICAgICAgICAgIDAgIDogTm9uZVxuCisgICogICAgICAgICAgICAgMSAgOiBTbGF2ZSAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIFNsYXZlIE1vZGUpXG4KKyAgKiAgICAgICAgICBiNFxuCisgICogICAgICAgICAgICAgMCAgOiBOb25lXG4KKyAgKiAgICAgICAgICAgICAxICA6IE1hc3RlciAoSEFMIEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1hc3RlciBNb2RlKVxuCisgICogICAgICAgICAgYjMtYjItYjEtYjAgIChub3QgdXNlZClcbgorICAqICAgICAgICAgICAgIHh4eHggOiBTaG91bGQgYmUgc2V0IHRvIDAwMDAKKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMkNfTU9ERV9OT05FICAgICAgICAgICAgICAgPSAweDAwVSwgICAvKiE8IE5vIEkyQyBjb21tdW5pY2F0aW9uIG9uIGdvaW5nICAgICAgICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9NQVNURVIgICAgICAgICAgICAgPSAweDEwVSwgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1hc3RlciBNb2RlICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9TTEFWRSAgICAgICAgICAgICAgPSAweDIwVSwgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIFNsYXZlIE1vZGUgICAgICAgICovCisgIEhBTF9JMkNfTU9ERV9NRU0gICAgICAgICAgICAgICAgPSAweDQwVSAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIGlzIGluIE1lbW9yeSBNb2RlICAgICAgICovCisKK30gSEFMX0kyQ19Nb2RlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXJyb3JfQ29kZV9kZWZpbml0aW9uIEkyQyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEkyQyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX05PTkUgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfQkVSUiAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBCRVJSIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9BUkxPICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IEFSTE8gZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX0FGICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgQUNLRiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfT1ZSICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9ETUEgICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICovCisjZGVmaW5lIEhBTF9JMkNfRVJST1JfU0laRSAgICAgICgweDAwMDAwMDQwVSkgICAgLyohPCBTaXplIE1hbmFnZW1lbnQgZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU0gKDB4MDAwMDAwODBVKSAgICAvKiE8IERNQSBQYXJhbWV0ZXIgRXJyb3IgICAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAoMHgwMDAwMDEwMFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAqLworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2RlZmluZSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU0gICAgICgweDAwMDAwMjAwVSkgICAgLyohPCBJbnZhbGlkIFBhcmFtZXRlcnMgZXJyb3IgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19oYW5kbGVfU3RydWN0dXJlX2RlZmluaXRpb24gSTJDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSTJDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmCit7CisgIEkyQ19UeXBlRGVmICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAvKiE8IEkyQyByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCisKKyAgSTJDX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgIC8qITwgSTJDIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIEkyQyB0cmFuc2ZlciBidWZmZXIgICAgICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgIFhmZXJTaXplOyAgICAgICAvKiE8IEkyQyB0cmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgWGZlckNvdW50OyAgICAgIC8qITwgSTJDIHRyYW5zZmVyIGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBYZmVyT3B0aW9uczsgICAgLyohPCBJMkMgc2VxdWFudGlhbCB0cmFuc2ZlciBvcHRpb25zLCB0aGlzIHBhcmFtZXRlciBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYSB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUyAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIFByZXZpb3VzU3RhdGU7ICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIFByZXZpb3VzIHN0YXRlICAgICAgICAgICovCisKKyAgSEFMX1N0YXR1c1R5cGVEZWYoKlhmZXJJU1IpKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpOyAgLyohPCBJMkMgdHJhbnNmZXIgSVJRIGhhbmRsZXIgZnVuY3Rpb24gcG9pbnRlciAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hdHg7ICAgICAgICAvKiE8IEkyQyBUeCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWFyeDsgICAgICAgIC8qITwgSTJDIFJ4IERNQSBoYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgLyohPCBJMkMgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0kyQ19TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgICAgICAvKiE8IEkyQyBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfSTJDX01vZGVUeXBlRGVmICAgTW9kZTsgICAgICAgICAgIC8qITwgSTJDIGNvbW11bmljYXRpb24gbW9kZSAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgLyohPCBJMkMgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIEFkZHJFdmVudENvdW50OyAvKiE8IEkyQyBBZGRyZXNzIEV2ZW50IGNvdW50ZXIgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogTWFzdGVyVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgIC8qITwgSTJDIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBNYXN0ZXJSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgLyohPCBJMkMgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIFNsYXZlVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAvKiE8IEkyQyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogU2xhdmVSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgIC8qITwgSTJDIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBMaXN0ZW5DcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAgLyohPCBJMkMgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1lbVR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBNZW1vcnkgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogTWVtUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAgIC8qITwgSTJDIE1lbW9yeSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAgICAgLyohPCBJMkMgRXJyb3IgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7ICAgICAgICAgICAgICAvKiE8IEkyQyBBYm9ydCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBBZGRyQ2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgIC8qITwgSTJDIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2sgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOyAgICAgICAgICAgICAgICAvKiE8IEkyQyBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsgICAgICAgICAgICAgIC8qITwgSTJDIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gSTJDX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBJMkMgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9JMkNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAwVSwgICAgLyohPCBJMkMgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX0kyQ19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgICAgICA9IDB4MDFVLCAgICAvKiE8IEkyQyBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAqLworICBIQUxfSTJDX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgID0gMHgwMlUsICAgIC8qITwgSTJDIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9JMkNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgPSAweDAzVSwgICAgLyohPCBJMkMgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAgKi8KKyAgSEFMX0kyQ19MSVNURU5fQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDRVLCAgICAvKiE8IEkyQyBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX01FTV9UWF9DT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwNVUsICAgIC8qITwgSTJDIE1lbW9yeSBUeCBUcmFuc2ZlciBjYWxsYmFjayBJRCAgICAgICAgICAgICovCisgIEhBTF9JMkNfTUVNX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDA2VSwgICAgLyohPCBJMkMgTWVtb3J5IFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX0kyQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IEkyQyBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX0FCT1JUX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgSTJDIEFib3J0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgSEFMX0kyQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDlVLCAgICAvKiE8IEkyQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwQVUgICAgIC8qITwgSTJDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICovCisKK30gSEFMX0kyQ19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgSTJDIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBJMkNfQ2FsbGJhY2tUeXBlRGVmKShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7IC8qITwgcG9pbnRlciB0byBhbiBJMkMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwSTJDX0FkZHJDYWxsYmFja1R5cGVEZWYpKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsgLyohPCBwb2ludGVyIHRvIGFuIEkyQyBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9Db25zdGFudHMgSTJDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX1hGRVJPUFRJT05TICBJMkMgU2VxdWVudGlhbCBUcmFuc2ZlciBPcHRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUkyQ19TT0ZURU5EX01PREUpCisjZGVmaW5lIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSAgICAgICAgKCh1aW50MzJfdCkoSTJDX1JFTE9BRF9NT0RFIHwgSTJDX1NPRlRFTkRfTU9ERSkpCisjZGVmaW5lIEkyQ19ORVhUX0ZSQU1FICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoSTJDX1JFTE9BRF9NT0RFIHwgSTJDX1NPRlRFTkRfTU9ERSkpCisjZGVmaW5lIEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSAgICAgICAgKCh1aW50MzJfdClJMkNfQVVUT0VORF9NT0RFKQorI2RlZmluZSBJMkNfTEFTVF9GUkFNRSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpSTJDX0FVVE9FTkRfTU9ERSkKKyNkZWZpbmUgSTJDX0xBU1RfRlJBTUVfTk9fU1RPUCAgICAgICAgICAoKHVpbnQzMl90KUkyQ19TT0ZURU5EX01PREUpCisKKy8qIExpc3Qgb2YgWGZlck9wdGlvbnMgaW4gdXNhZ2Ugb2YgOgorICogMS0gUmVzdGFydCBjb25kaXRpb24gaW4gYWxsIHVzZSBjYXNlcyAoZGlyZWN0aW9uIGNoYW5nZSBvciBub3QpCisgKi8KKyNkZWZpbmUgIEkyQ19PVEhFUl9GUkFNRSAgICAgICAgICAgICAgICAoMHgwMDAwMDBBQVUpCisjZGVmaW5lICBJMkNfT1RIRVJfQU5EX0xBU1RfRlJBTUUgICAgICAgKDB4MDAwMEFBMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfQUREUkVTU0lOR19NT0RFIEkyQyBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19EVUFMX0FERFJFU1NJTkdfTU9ERSBJMkMgRHVhbCBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRFVBTEFERFJFU1NfRElTQUJMRSAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJDX0RVQUxBRERSRVNTX0VOQUJMRSAgICAgICAgICBJMkNfT0FSMl9PQTJFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfT1dOX0FERFJFU1MyX01BU0tTIEkyQyBPd24gQWRkcmVzczIgTWFza3MKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfT0EyX05PTUFTSyAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDEgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzAyICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBJMkNfT0EyX01BU0swMyAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDQgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lIEkyQ19PQTJfTUFTSzA1ICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBJMkNfT0EyX01BU0swNiAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgSTJDX09BMl9NQVNLMDcgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19HRU5FUkFMX0NBTExfQUREUkVTU0lOR19NT0RFIEkyQyBHZW5lcmFsIENhbGwgQWRkcmVzc2luZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0dFTkVSQUxDQUxMX0RJU0FCTEUgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUgICAgICAgICAgSTJDX0NSMV9HQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19OT1NUUkVUQ0hfTU9ERSBJMkMgTm8tU3RyZXRjaCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX05PU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEkyQ19OT1NUUkVUQ0hfRU5BQkxFICAgICAgICAgICAgSTJDX0NSMV9OT1NUUkVUQ0gKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX01FTU9SWV9BRERSRVNTX1NJWkUgSTJDIE1lbW9yeSBBZGRyZXNzIFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfTUVNQUREX1NJWkVfOEJJVCAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJDX01FTUFERF9TSVpFXzE2QklUICAgICAgICAgICAoMHgwMDAwMDAwMlUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19YRkVSRElSRUNUSU9OIEkyQyBUcmFuc2ZlciBEaXJlY3Rpb24gTWFzdGVyIFBvaW50IG9mIFZpZXcKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRElSRUNUSU9OX1RSQU5TTUlUICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSTJDX0RJUkVDVElPTl9SRUNFSVZFICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19SRUxPQURfRU5EX01PREUgSTJDIFJlbG9hZCBFbmQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lICBJMkNfUkVMT0FEX01PREUgICAgICAgICAgICAgICAgSTJDX0NSMl9SRUxPQUQKKyNkZWZpbmUgIEkyQ19BVVRPRU5EX01PREUgICAgICAgICAgICAgICBJMkNfQ1IyX0FVVE9FTkQKKyNkZWZpbmUgIEkyQ19TT0ZURU5EX01PREUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19TVEFSVF9TVE9QX01PREUgSTJDIFN0YXJ0IG9yIFN0b3AgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lICBJMkNfTk9fU1RBUlRTVE9QICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgSTJDX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUT1ApCisjZGVmaW5lICBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikKKyNkZWZpbmUgIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24gSTJDIEludGVycnVwdCBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgSTJDIEludGVycnVwdCBkZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFhYWFhYCisgICogICAgICAgICAgIC0gWFhYWFhYWFggIDogSW50ZXJydXB0IGNvbnRyb2wgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIEkyQ19JVF9FUlJJICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9FUlJJRQorI2RlZmluZSBJMkNfSVRfVENJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVENJRQorI2RlZmluZSBJMkNfSVRfU1RPUEkgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfU1RPUElFCisjZGVmaW5lIEkyQ19JVF9OQUNLSSAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OQUNLSUUKKyNkZWZpbmUgSTJDX0lUX0FERFJJICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0FERFJJRQorI2RlZmluZSBJMkNfSVRfUlhJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfUlhJRQorI2RlZmluZSBJMkNfSVRfVFhJICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVFhJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRmxhZ19kZWZpbml0aW9uIEkyQyBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhFCisjZGVmaW5lIEkyQ19GTEFHX1RYSVMgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWElTCisjZGVmaW5lIEkyQ19GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9SWE5FCisjZGVmaW5lIEkyQ19GTEFHX0FERFIgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BRERSCisjZGVmaW5lIEkyQ19GTEFHX0FGICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9OQUNLRgorI2RlZmluZSBJMkNfRkxBR19TVE9QRiAgICAgICAgICAgICAgICAgIEkyQ19JU1JfU1RPUEYKKyNkZWZpbmUgSTJDX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDCisjZGVmaW5lIEkyQ19GTEFHX1RDUiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UQ1IKKyNkZWZpbmUgSTJDX0ZMQUdfQkVSUiAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JFUlIKKyNkZWZpbmUgSTJDX0ZMQUdfQVJMTyAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FSTE8KKyNkZWZpbmUgSTJDX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX09WUgorI2RlZmluZSBJMkNfRkxBR19QRUNFUlIgICAgICAgICAgICAgICAgIEkyQ19JU1JfUEVDRVJSCisjZGVmaW5lIEkyQ19GTEFHX1RJTUVPVVQgICAgICAgICAgICAgICAgSTJDX0lTUl9USU1FT1VUCisjZGVmaW5lIEkyQ19GTEFHX0FMRVJUICAgICAgICAgICAgICAgICAgSTJDX0lTUl9BTEVSVAorI2RlZmluZSBJMkNfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQlVTWQorI2RlZmluZSBJMkNfRkxBR19ESVIgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfRElSCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9NYWNyb3MgSTJDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgSTJDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfSTJDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9JMkNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBJMkMgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0VSUkkgIEVycm9ycyBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RDSSAgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9OQUNLSSBOQUNLIHJlY2VpdmVkIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfQUREUkkgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfVFhJICAgVFggaW50ZXJydXB0IGVuYWJsZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBJMkMgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH4oX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJDIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJMkMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1NUT1BJIFNUT1AgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19JVF9SWEkgICBSWCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9JMkNfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RYRSAgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RYSVMgICAgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1JYTkUgICAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FERFIgICAgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FGICAgICAgQWNrbm93bGVkZ2UgZmFpbHVyZSByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfVEMgICAgICBUcmFuc2ZlciBjb21wbGV0ZSAobWFzdGVyIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfVENSICAgICBUcmFuc2ZlciBjb21wbGV0ZSByZWxvYWQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19CRVJSICAgIEJ1cyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FSTE8gICAgQXJiaXRyYXRpb24gbG9zdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1BFQ0VSUiAgUEVDIGVycm9yIGluIHJlY2VwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RJTUVPVVQgVGltZW91dCBvciBUbG93IGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0JVU1kgICAgQnVzIGJ1c3kKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19ESVIgICAgIFRyYW5zZmVyIGRpcmVjdGlvbiAoc2xhdmUgbW9kZSkKKyAgKgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgSTJDX0ZMQUdfTUFTSyAgKDB4MDAwMUZGRkZVKQorI2RlZmluZSBfX0hBTF9JMkNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIEkyQyBwZW5kaW5nIGZsYWdzIHdoaWNoIGFyZSBjbGVhcmVkIGJ5IHdyaXRpbmcgMSBpbiBhIHNwZWNpZmljIGJpdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfVFhFICAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQUREUiAgICBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQUYgICAgICBBY2tub3dsZWRnZSBmYWlsdXJlIHJlY2VpdmVkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJMkNfRkxBR19CRVJSICAgIEJ1cyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX0FSTE8gICAgQXJiaXRyYXRpb24gbG9zdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1BFQ0VSUiAgUEVDIGVycm9yIGluIHJlY2VwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEkyQ19GTEFHX1RJTUVPVVQgVGltZW91dCBvciBUbG93IGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSTJDX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0ZMQUdfXykgPT0gSTJDX0ZMQUdfVFhFKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgfD0gKF9fRkxBR19fKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEkyQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEkyQyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0kyQ19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCAgSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBJMkNfQ1IxX1BFKSkKKworLyoqIEBicmllZiAgR2VuZXJhdGUgYSBOb24tQWNrbm93bGVkZ2UgSTJDIHBlcmlwaGVyYWwgaW4gU2xhdmUgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMkMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMkNfR0VORVJBVEVfTkFDSyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgSTJDX0NSMl9OQUNLKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgSTJDIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2kyY19leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19Nc3BJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19Nc3BEZUluaXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfUmVnaXN0ZXJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgSEFMX0kyQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSTJDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19VblJlZ2lzdGVyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHBJMkNfQWRkckNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0lzRGV2aWNlUmVhZHkoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQzMl90IFRyaWFscywgdWludDMyX3QgVGltZW91dCk7CisKKy8qKioqKioqIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9SZWFkX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9TZXFfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19FbmFibGVMaXN0ZW5fSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19EaXNhYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX0Fib3J0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzKTsKKworLyoqKioqKiogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIEkyQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBub24gYmxvY2tpbmcgbW9kZXMgKEludGVycnVwdCBhbmQgRE1BKSAqLwordm9pZCBIQUxfSTJDX0VWX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX0VSX0lSUUhhbmRsZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsKK3ZvaWQgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOwordm9pZCBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3ZvaWQgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUsIE1vZGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9JMkNfU3RhdGVUeXBlRGVmIEhBTF9JMkNfR2V0U3RhdGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworSEFMX0kyQ19Nb2RlVHlwZURlZiAgSEFMX0kyQ19HZXRNb2RlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3VpbnQzMl90ICAgICAgICAgICAgIEhBTF9JMkNfR2V0RXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9Db25zdGFudHMgSTJDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfTWFjcm8gSTJDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19JMkNfQUREUkVTU0lOR19NT0RFKE1PREUpICAgICgoKE1PREUpID09IEkyQ19BRERSRVNTSU5HTU9ERV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX0FERFJFU1NJTkdNT0RFXzEwQklUKSkKKworI2RlZmluZSBJU19JMkNfRFVBTF9BRERSRVNTKEFERFJFU1MpICAgICgoKEFERFJFU1MpID09IEkyQ19EVUFMQUREUkVTU19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUykgPT0gSTJDX0RVQUxBRERSRVNTX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfSTJDX09XTl9BRERSRVNTMl9NQVNLKE1BU0spICAoKChNQVNLKSA9PSBJMkNfT0EyX05PTUFTSykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzAyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEkyQ19PQTJfTUFTSzA1KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gSTJDX09BMl9NQVNLMDYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBJMkNfT0EyX01BU0swNykpCisKKyNkZWZpbmUgSVNfSTJDX0dFTkVSQUxfQ0FMTChDQUxMKSAgICAgICAoKChDQUxMKSA9PSBJMkNfR0VORVJBTENBTExfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENBTEwpID09IEkyQ19HRU5FUkFMQ0FMTF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19OT19TVFJFVENIKFNUUkVUQ0gpICAgICAgKCgoU1RSRVRDSCkgPT0gSTJDX05PU1RSRVRDSF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RSRVRDSCkgPT0gSTJDX05PU1RSRVRDSF9FTkFCTEUpKQorCisjZGVmaW5lIElTX0kyQ19NRU1BRERfU0laRShTSVpFKSAgICAgICAgKCgoU0laRSkgPT0gSTJDX01FTUFERF9TSVpFXzhCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBJMkNfTUVNQUREX1NJWkVfMTZCSVQpKQorCisjZGVmaW5lIElTX1RSQU5TRkVSX01PREUoTU9ERSkgICAgICAgICAgKCgoTU9ERSkgPT0gSTJDX1JFTE9BRF9NT0RFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBJMkNfQVVUT0VORF9NT0RFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gSTJDX1NPRlRFTkRfTU9ERSkpCisKKyNkZWZpbmUgSVNfVFJBTlNGRVJfUkVRVUVTVChSRVFVRVNUKSAgICAoKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RPUCkgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfTk9fU1RBUlRTVE9QKSkKKworI2RlZmluZSBJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICAoKChSRVFVRVNUKSA9PSBJMkNfRklSU1RfRlJBTUUpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19ORVhUX0ZSQU1FKSAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gSTJDX0xBU1RfRlJBTUUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEkyQ19MQVNUX0ZSQU1FX05PX1NUT1ApICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfSTJDX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSkKKworI2RlZmluZSBJU19JMkNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICgoKFJFUVVFU1QpID09IEkyQ19PVEhFUl9GUkFNRSkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBJMkNfT1RIRVJfQU5EX0xBU1RfRlJBTUUpKQorCisjZGVmaW5lIEkyQ19SRVNFVF9DUjIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KShJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX0hFQUQxMFIgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBJMkNfR0VUX0FERFJfTUFUQ0goX19IQU5ETEVfXykgICAgICAgICAgICAoKHVpbnQxNl90KSgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgSTJDX0lTUl9BRERDT0RFKSA+PiAxNlUpKQorI2RlZmluZSBJMkNfR0VUX0RJUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBJMkNfSVNSX0RJUikgPj4gMTZVKSkKKyNkZWZpbmUgSTJDX0dFVF9TVE9QX01PREUoX19IQU5ETEVfXykgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIEkyQ19DUjJfQVVUT0VORCkKKyNkZWZpbmUgSTJDX0dFVF9PV05fQUREUkVTUzEoX19IQU5ETEVfXykgICAgICAgICAgKCh1aW50MTZfdCkoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+T0FSMSAmIEkyQ19PQVIxX09BMSkpCisjZGVmaW5lIEkyQ19HRVRfT1dOX0FERFJFU1MyKF9fSEFORExFX18pICAgICAgICAgICgodWludDE2X3QpKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk9BUjIgJiBJMkNfT0FSMl9PQTIpKQorCisjZGVmaW5lIElTX0kyQ19PV05fQUREUkVTUzEoQUREUkVTUzEpICAgICAgICAgICAgICgoQUREUkVTUzEpIDw9IDB4MDAwMDAzRkZVKQorI2RlZmluZSBJU19JMkNfT1dOX0FERFJFU1MyKEFERFJFU1MyKSAgICAgICAgICAgICAoKEFERFJFU1MyKSA8PSAodWludDE2X3QpMHgwMEZGVSkKKworI2RlZmluZSBJMkNfTUVNX0FERF9NU0IoX19BRERSRVNTX18pICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50MTZfdCkoKCh1aW50MTZfdCkoKF9fQUREUkVTU19fKSAmICh1aW50MTZfdCkoMHhGRjAwVSkpKSA+PiA4VSkpKQorI2RlZmluZSBJMkNfTUVNX0FERF9MU0IoX19BRERSRVNTX18pICAgICAgICAgICAgICAoKHVpbnQ4X3QpKCh1aW50MTZfdCkoKF9fQUREUkVTU19fKSAmICh1aW50MTZfdCkoMHgwMEZGVSkpKSkKKworI2RlZmluZSBJMkNfR0VORVJBVEVfU1RBUlQoX19BRERNT0RFX18sX19BRERSRVNTX18pICgoKF9fQURETU9ERV9fKSA9PSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCkgPyAodWludDMyX3QpKCgoKHVpbnQzMl90KShfX0FERFJFU1NfXykgJiAoSTJDX0NSMl9TQUREKSkgfCAoSTJDX0NSMl9TVEFSVCkgfCAoSTJDX0NSMl9BVVRPRU5EKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEkyQ19DUjJfU0FERCkpIHwgKEkyQ19DUjJfQUREMTApIHwgKEkyQ19DUjJfU1RBUlQpKSAmICh+STJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBJMkNfQ0hFQ0tfRkxBRyhfX0lTUl9fLCBfX0ZMQUdfXykgICAgICAgICAoKCgoX19JU1JfXykgJiAoKF9fRkxBR19fKSAmIEkyQ19GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIEkyQ19GTEFHX01BU0spKSA/IFNFVCA6IFJFU0VUKQorI2RlZmluZSBJMkNfQ0hFQ0tfSVRfU09VUkNFKF9fQ1IxX18sIF9fSVRfXykgICAgICAoKCgoX19DUjFfXykgJiAoX19JVF9fKSkgPT0gKF9fSVRfXykpID8gU0VUIDogUkVTRVQpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvbnMgSTJDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHN0bTMyd2J4eF9oYWxfaTJjLmMgZmlsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9JMkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfaTJjX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9pMmNfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQzMDExCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfaTJjX2V4LmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2kyY19leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJMkMgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0kyQ19FWF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfSTJDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBJMkMgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9BbmFsb2dfRmlsdGVyIEkyQyBFeHRlbmRlZCBBbmFsb2cgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEUgICAgICAgIEkyQ19DUjFfQU5GT0ZGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0Zhc3RNb2RlUGx1cyBJMkMgRXh0ZW5kZWQgRmFzdCBNb2RlIFBsdXMKKyAgKiBAeworICAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX1BCNiAgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI2X0ZNUCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNiAgICAgICAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX1BCNyAgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI3X0ZNUCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNyAgICAgICAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX1BCOCAgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI4X0ZNUCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOCAgICAgICAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX1BCOSAgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkNfUEI5X0ZNUCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOSAgICAgICAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX0kyQzEgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkMxX0ZNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzEgcGlucyAqLworI2RlZmluZSBJMkNfRkFTVE1PREVQTFVTX0kyQzMgICAgICAgICAgIFNZU0NGR19DRkdSMV9JMkMzX0ZNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzMgcGlucyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNFeF9FeHBvcnRlZF9GdW5jdGlvbnMgSTJDIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ0V4X0VuYWJsZVdha2VVcChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfRGlzYWJsZVdha2VVcChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7Cit2b2lkIEhBTF9JMkNFeF9FbmFibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK3ZvaWQgSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKTsKKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDRXhfUHJpdmF0ZV9Db25zdGFudHMgSTJDIEV4dGVuZGVkIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDRXhfUHJpdmF0ZV9NYWNybyBJMkMgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19JMkNfQU5BTE9HX0ZJTFRFUihGSUxURVIpICAgICgoKEZJTFRFUikgPT0gSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklMVEVSKSA9PSBJMkNfQU5BTE9HRklMVEVSX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0kyQ19ESUdJVEFMX0ZJTFRFUihGSUxURVIpICAgKChGSUxURVIpIDw9IDB4MDAwMDAwMEZVKQorCisjZGVmaW5lIElTX0kyQ19GQVNUTU9ERVBMVVMoX19DT05GSUdfXykgKCgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI2KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI2KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX1BCNykpICA9PSBJMkNfRkFTVE1PREVQTFVTX1BCNykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19QQjgpKSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjgpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgKEkyQ19GQVNUTU9ERVBMVVNfUEI5KSkgID09IEkyQ19GQVNUTU9ERVBMVVNfUEI5KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIChJMkNfRkFTVE1PREVQTFVTX0kyQzEpKSA9PSBJMkNfRkFTVE1PREVQTFVTX0kyQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19DT05GSUdfXykgJiAoSTJDX0ZBU1RNT0RFUExVU19JMkMzKSkgPT0gSTJDX0ZBU1RNT0RFUExVU19JMkMzKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ0V4X1ByaXZhdGVfRnVuY3Rpb25zIEkyQyBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdG0zMndieHhfaGFsX2kyY19leC5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0kyQ19FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9pcGNjLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9pcGNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2YzkxNgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX2lwY2MuaApAQCAtMCwwICsxLDI2MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfaXBjYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBNYWlsYm94IEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0lQQ0NfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0lQQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElQQ0MgSVBDQworICAqIEBicmllZiBJUENDIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJUENDX0V4cG9ydGVkX0NvbnN0YW50cyBJUENDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVBDQ19DaGFubmVsIElQQ0MgQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF8xIDB4MDAwMDAwMDBVCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF8yIDB4MDAwMDAwMDFVCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF8zIDB4MDAwMDAwMDJVCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF80IDB4MDAwMDAwMDNVCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF81IDB4MDAwMDAwMDRVCisjZGVmaW5lIElQQ0NfQ0hBTk5FTF82IDB4MDAwMDAwMDVVCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUENDX0V4cG9ydGVkX1R5cGVzIElQQ0MgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSEFMIElQQ0MgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0lQQ0NfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgSVBDQyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLworICBIQUxfSVBDQ19TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBJUENDIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9JUENDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUgICAvKiE8IElQQ0MgaW50ZXJuYWwgcHJvY2Vzc2luZyBpcyBvbmdvaW5nICAgKi8KK30gSEFMX0lQQ0NfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIElQQ0MgY2hhbm5lbCBkaXJlY3Rpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBJUENDX0NIQU5ORUxfRElSX1RYICA9IDB4MDBVLCAgLyohPCBDaGFubmVsIGRpcmVjdGlvbiBUeCBpcyB1c2VkIGJ5IGFuIE1DVSB0byB0cmFuc21pdCAqLworICBJUENDX0NIQU5ORUxfRElSX1JYICA9IDB4MDFVICAgLyohPCBDaGFubmVsIGRpcmVjdGlvbiBSeCBpcyB1c2VkIGJ5IGFuIE1DVSB0byByZWNlaXZlICovCit9IElQQ0NfQ0hBTk5FTERpclR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSVBDQyBjaGFubmVsIHN0YXR1cyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIElQQ0NfQ0hBTk5FTF9TVEFUVVNfRlJFRSAgICAgICA9IDB4MDBVLCAgLyohPCBNZWFucyB0aGF0IGEgbmV3IG1zZyBjYW4gYmUgcG9zdGVkIG9uIHRoYXQgY2hhbm5lbCAqLworICBJUENDX0NIQU5ORUxfU1RBVFVTX09DQ1VQSUVEICAgPSAweDAxVSAgIC8qITwgQW4gTUNVIGhhcyBwb3N0ZWQgYSBtc2cgdGhlIG90aGVyIE1DVSBoYXNuJ3QgcmV0cmlldmVkICovCit9IElQQ0NfQ0hBTk5FTFN0YXR1c1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSVBDQyBoYW5kbGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fSVBDQ19IYW5kbGVUeXBlRGVmCit7CisgIElQQ0NfVHlwZURlZiAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAvKiE8IElQQ0MgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLworICB2b2lkICgqIENoYW5uZWxDYWxsYmFja1J4W0lQQ0NfQ0hBTk5FTF9OVU1CRVJdKShzdHJ1Y3QgX19JUENDX0hhbmRsZVR5cGVEZWYgKmhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUnggQ2FsbGJhY2sgcmVnaXN0cmF0aW9uIHRhYmxlICovCisgIHZvaWQgKCogQ2hhbm5lbENhbGxiYWNrVHhbSVBDQ19DSEFOTkVMX05VTUJFUl0pKHN0cnVjdCBfX0lQQ0NfSGFuZGxlVHlwZURlZiAqaGlwY2MsIHVpbnQzMl90IENoYW5uZWxJbmRleCwgSVBDQ19DSEFOTkVMRGlyVHlwZURlZiBDaGFubmVsRGlyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUeCBDYWxsYmFjayByZWdpc3RyYXRpb24gdGFibGUgKi8KKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrUmVxdWVzdDsgLyohPCBTdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxsYmFjayBub3RpZmljYXRpb24gYnkgY2hhbm5lbCAqLworICBfX0lPIEhBTF9JUENDX1N0YXRlVHlwZURlZiAgICAgIFN0YXRlOyAgICAgICAgIC8qITwgSVBDQyBTdGF0ZTogaW5pdGlhbGl6ZWQgb3Igbm90ICovCit9IElQQ0NfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBJUENDIGNhbGxiYWNrIHR5cGVkZWYKKyAgKi8KK3R5cGVkZWYgdm9pZCBDaGFubmVsQ2IoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYywgdWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUENDX0V4cG9ydGVkX01hY3JvcyBJUENDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElQQ0MgSGFuZGxlCisgICogQHBhcmFtICBfX0NIRElSRUNUSU9OX18gc3BlY2lmaWVzIHRoZSBjaGFubmVscyBEaXJlY3Rpb24KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElQQ0NfQ0hBTk5FTF9ESVJfVFggVHJhbnNtaXQgY2hhbm5lbCBmcmVlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUENDX0NIQU5ORUxfRElSX1JYIFJlY2VpdmUgY2hhbm5lbCBvY2N1cGllZCBpbnRlcnJ1cHQgZW5hYmxlCisgICovCisjZGVmaW5lIF9fSEFMX0lQQ0NfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fQ0hESVJFQ1RJT05fXykgXAorICAgICAgICAgICAgKCgoX19DSERJUkVDVElPTl9fKSA9PSBJUENDX0NIQU5ORUxfRElSX1JYKSA/IFwKKyAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QzFDUiB8PSBJUENDX0MxQ1JfUlhPSUUpIDogXAorICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DMUNSIHw9IElQQ0NfQzFDUl9UWEZJRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUENDIEhhbmRsZQorICAqIEBwYXJhbSAgX19DSERJUkVDVElPTl9fIHNwZWNpZmllcyB0aGUgY2hhbm5lbHMgRGlyZWN0aW9uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUENDX0NIQU5ORUxfRElSX1RYIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVBDQ19DSEFOTkVMX0RJUl9SWCBSZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGVuYWJsZQorICAqLworI2RlZmluZSBfX0hBTF9JUENDX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19DSERJUkVDVElPTl9fKSBcCisgICAgICAgICAgICAoKChfX0NIRElSRUNUSU9OX18pID09IElQQ0NfQ0hBTk5FTF9ESVJfUlgpID8gXAorICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DMUNSICY9IH5JUENDX0MxQ1JfUlhPSUUpIDogXAorICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DMUNSICY9IH5JUENDX0MxQ1JfVFhGSUUpKQorCisvKioKKyAgKiBAYnJpZWYgIE1hc2sgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVBDQyBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fQ0hESVJFQ1RJT05fXyBzcGVjaWZpZXMgdGhlIGNoYW5uZWxzIERpcmVjdGlvbgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVBDQ19DSEFOTkVMX0RJUl9UWCBUcmFuc21pdCBjaGFubmVsIGZyZWUgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElQQ0NfQ0hBTk5FTF9ESVJfUlggUmVjZWl2ZSBjaGFubmVsIG9jY3VwaWVkIGludGVycnVwdCBlbmFibGUKKyAgKiBAcGFyYW0gIF9fQ0hJTkRFWF9fIHNwZWNpZmllcyB0aGUgY2hhbm5lbHMgbnVtYmVyOgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzE6IElQQ0MgQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8yOiBJUENDIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMzogSVBDQyBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzQ6IElQQ0MgQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF81OiBJUENDIENoYW5uZWwgNQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNjogSVBDQyBDaGFubmVsIDYKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVBDQ19NQVNLX0NIQU5ORUxfSVQoX19IQU5ETEVfXywgX19DSERJUkVDVElPTl9fLCBfX0NISU5ERVhfXykgXAorICAgICAgICAgICAgKCgoX19DSERJUkVDVElPTl9fKSA9PSBJUENDX0NIQU5ORUxfRElSX1JYKSA/IFwKKyAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QzFNUiB8PSAoSVBDQ19DMU1SX0NIMU9NX01zayA8PCAoX19DSElOREVYX18pKSkgOiBcCisgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkMxTVIgfD0gKElQQ0NfQzFNUl9DSDFGTV9Nc2sgPDwgKF9fQ0hJTkRFWF9fKSkpKQorCisvKioKKyAgKiBAYnJpZWYgIFVubWFzayB0aGUgc3BlY2lmaWVkIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUENDIEhhbmRsZQorICAqIEBwYXJhbSAgX19DSERJUkVDVElPTl9fIHNwZWNpZmllcyB0aGUgY2hhbm5lbHMgRGlyZWN0aW9uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUENDX0NIQU5ORUxfRElSX1RYIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVBDQ19DSEFOTkVMX0RJUl9SWCBSZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGVuYWJsZQorICAqIEBwYXJhbSAgX19DSElOREVYX18gc3BlY2lmaWVzIHRoZSBjaGFubmVscyBudW1iZXI6CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMTogSVBDQyBDaGFubmVsIDEKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzI6IElQQ0MgQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8zOiBJUENDIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNDogSVBDQyBDaGFubmVsIDQKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzU6IElQQ0MgQ2hhbm5lbCA1CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF82OiBJUENDIENoYW5uZWwgNgorICAqLworI2RlZmluZSBfX0hBTF9JUENDX1VOTUFTS19DSEFOTkVMX0lUKF9fSEFORExFX18sIF9fQ0hESVJFQ1RJT05fXywgX19DSElOREVYX18pIFwKKyAgICAgICAgICAgICgoKF9fQ0hESVJFQ1RJT05fXykgPT0gSVBDQ19DSEFOTkVMX0RJUl9SWCkgPyBcCisgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkMxTVIgJj0gfihJUENDX0MxTVJfQ0gxT01fTXNrIDw8IChfX0NISU5ERVhfXykpKSA6IFwKKyAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QzFNUiAmPSB+KElQQ0NfQzFNUl9DSDFGTV9Nc2sgPDwgKF9fQ0hJTkRFWF9fKSkpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJUENDX0V4cG9ydGVkX0Z1bmN0aW9ucyBJUENDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgSVBDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEB7CisgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUENDX0luaXQoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVBDQ19EZUluaXQoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYyk7Cit2b2lkIEhBTF9JUENDX01zcEluaXQoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYyk7Cit2b2lkIEhBTF9JUENDX01zcERlSW5pdChJUENDX0hhbmRsZVR5cGVEZWYgKmhpcGNjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVBDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIENvbW11bmljYXRpb24gZnVuY3Rpb25zCisgKiAgQHsKKyAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVBDQ19BY3RpdmF0ZU5vdGlmaWNhdGlvbihJUENDX0hhbmRsZVR5cGVEZWYgKmhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpciwgQ2hhbm5lbENiIGNiKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUENDX0RlQWN0aXZhdGVOb3RpZmljYXRpb24oSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYywgdWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpOworSVBDQ19DSEFOTkVMU3RhdHVzVHlwZURlZiBIQUxfSVBDQ19HZXRDaGFubmVsU3RhdHVzKElQQ0NfSGFuZGxlVHlwZURlZiBjb25zdCAqY29uc3QgaGlwY2MsIHVpbnQzMl90IENoYW5uZWxJbmRleCwgSVBDQ19DSEFOTkVMRGlyVHlwZURlZiBDaGFubmVsRGlyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUENDX05vdGlmeUNQVShJUENDX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcik7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElQQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAeworICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9JUENDX1N0YXRlVHlwZURlZiBIQUxfSVBDQ19HZXRTdGF0ZShJUENDX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhpcGNjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVBDQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIFBlcmlwaGVyYWwgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogIEB7CisgKi8KKy8qIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbiBibG9ja2luZyBtb2RlcyAgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfSVBDQ19UWF9JUlFIYW5kbGVyKElQQ0NfSGFuZGxlVHlwZURlZiAgICpjb25zdCBoaXBjYyk7Cit2b2lkIEhBTF9JUENDX1JYX0lSUUhhbmRsZXIoSVBDQ19IYW5kbGVUeXBlRGVmICpjb25zdCBoaXBjYyk7Cit2b2lkIEhBTF9JUENDX1R4Q2FsbGJhY2soSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYywgdWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpOwordm9pZCBIQUxfSVBDQ19SeENhbGxiYWNrKElQQ0NfSGFuZGxlVHlwZURlZiAqaGlwY2MsIHVpbnQzMl90IENoYW5uZWxJbmRleCwgSVBDQ19DSEFOTkVMRGlyVHlwZURlZiBDaGFubmVsRGlyKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0lQQ0NfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfaXJkYS5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfaXJkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMmRlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9pcmRhLmgKQEAgLTAsMCArMSw5NTQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2lyZGEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVJEQSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfSVJEQV9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfSVJEQV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVJEQQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfVHlwZXMgSVJEQSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBJUkRBIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBtZW1iZXIgY29uZmlndXJlcyB0aGUgSVJEQSBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZCByYXRlIHJlZ2lzdGVyIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXIgPSAoKHVzYXJ0X2tlcl9ja3ByZXMpIC8gKChoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVzYXJ0X2tlcl9ja3ByZXMgaXMgdGhlIElSREEgaW5wdXQgY2xvY2sgZGl2aWRlZCBieSBhIHByZXNjYWxlciAqLworCisgIHVpbnQzMl90IFdvcmRMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGluIGEgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX1dvcmRfTGVuZ3RoICovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVJEQV9QYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBXaGVuIHBhcml0eSBpcyBlbmFibGVkLCB0aGUgY29tcHV0ZWQgcGFyaXR5IGlzIGluc2VydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIE1TQiBwb3NpdGlvbiBvZiB0aGUgdHJhbnNtaXR0ZWQgZGF0YSAoOXRoIGJpdCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA5IGRhdGEgYml0czsgOHRoIGJpdCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQgbGVuZ3RoIGlzIHNldCB0byA4IGRhdGEgYml0cykuICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX1RyYW5zZmVyX01vZGUgKi8KKworICB1aW50OF90ICBQcmVzY2FsZXI7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIHZhbHVlIGZvciBkaXZpZGluZyB0aGUgVUFSVC9VU0FSVCBzb3VyY2UgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY2hpZXZlIGxvdy1wb3dlciBmcmVxdWVuY3kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgUHJlc2NhbGVyIHZhbHVlIDAgaXMgZm9yYmlkZGVuICovCisKKyAgdWludDE2X3QgUG93ZXJNb2RlOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIElSREEgcG93ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIElSREFfTG93X1Bvd2VyICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgSVJEQSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJUkRBX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IElSREFfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgSVJEQSBTdGF0ZSBkZWZpbml0aW9uCisgICogQG5vdGUgIEhBTCBJUkRBIFN0YXRlIHZhbHVlIGlzIGEgY29tYmluYXRpb24gb2YgMiBkaWZmZXJlbnQgc3Vic3RhdGVzOiBnU3RhdGUgYW5kIFJ4U3RhdGUgKHNlZSBAcmVmIElSREFfU3RhdGVfRGVmaW5pdGlvbikuCisgICogICAgICAgIC0gZ1N0YXRlIGNvbnRhaW5zIElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnbG9iYWwgSGFuZGxlIG1hbmFnZW1lbnQKKyAgKiAgICAgICAgICBhbmQgYWxzbyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFR4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgZ1N0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIEVycm9yIGluZm9ybWF0aW9uCisgICogICAgICAgICAgICAgMDAgOiBObyBFcnJvcgorICAqICAgICAgICAgICAgIDAxIDogKE5vdCBVc2VkKQorICAqICAgICAgICAgICAgIDEwIDogVGltZW91dAorICAqICAgICAgICAgICAgIDExIDogRXJyb3IKKyAgKiAgICAgICAgICBiNSAgICAgSVAgaW5pdGlsaXNhdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKElQIG5vdCBpbml0aWFsaXplZC4gSEFMIElSREEgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKElQIGJ1c3kgd2l0aCBzb21lIGNvbmZpZ3VyYXRpb24gb3IgaW50ZXJuYWwgb3BlcmF0aW9ucykKKyAgKiAgICAgICAgICBiMSAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwCisgICogICAgICAgICAgYjAgICAgIFR4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgLSBSeFN0YXRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBSeFN0YXRlIHZhbHVlIGNvZGluZyBmb2xsb3cgYmVsb3cgZGVzY3JpYmVkIGJpdG1hcCA6CisgICogICAgICAgICAgYjctYjYgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiNSAgICAgSVAgaW5pdGlsaXNhdGlvbiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAwICA6IFJlc2V0IChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgICAgMSAgOiBJbml0IGRvbmUgKElQIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9JUkRBX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIElSREEgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMiAgICAgID0gMHgwMVUsICAgIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9IU0kgICAgICAgID0gMHgwMlUsICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9MU0UgICAgICAgID0gMHgxMFUsICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQgID0gMHgyMFUgICAgIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAgICAgKi8KK30gSVJEQV9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmICAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAvKiE8IFVTQVJUIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgKi8KKworICBJUkRBX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBJUkRBIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJUkRBIFR4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAvKiE8IElSREEgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgICAgLyohPCBJUkRBIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBJUkRBIFJ4IHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAvKiE8IElSREEgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgICAgLyohPCBJUkRBIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE1hc2s7ICAgICAgICAgICAgIC8qITwgVVNBUlQgUlggUkRSIHJlZ2lzdGVyIG1hc2sgICAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGRtYXR4OyAgICAgICAgICAvKiE8IElSREEgVHggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgKmhkbWFyeDsgICAgICAgICAgLyohPCBJUkRBIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX0lSREFfU3RhdGVUeXBlRGVmICAgIGdTdGF0ZTsgICAgICAvKiE8IElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBnbG9iYWwgSGFuZGxlIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gSEFMX0lSREFfU3RhdGVUeXBlRGVmICAgIFJ4U3RhdGU7ICAgICAvKiE8IElSREEgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9JUkRBX1N0YXRlVHlwZURlZiAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAvKiE8IElSREEgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgIC8qITwgSVJEQSBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgIC8qITwgSVJEQSBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogUnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgICAgICAgIC8qITwgSVJEQSBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgIC8qITwgSVJEQSBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAgICAgIC8qITwgSVJEQSBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgIC8qITwgSVJEQSBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7IC8qITwgSVJEQSBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19JUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsgIC8qITwgSVJEQSBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0lSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgICAgICAgICAgLyohPCBJUkRBIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7ICAgICAgICAgLyohPCBJUkRBIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfSBJUkRBX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgSVJEQSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0lSREFfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBJUkRBIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9JUkRBX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgSVJEQSBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IElSREEgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX0lSREFfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBJUkRBIFJ4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9JUkRBX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgSVJEQSBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9BQk9SVF9DT01QTEVURV9DQl9JRCAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IElSREEgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX0lSREFfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBJUkRBIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9JUkRBX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgID0gMHgwN1UsICAgIC8qITwgSVJEQSBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworCisgIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgSVJEQSBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAqLworICBIQUxfSVJEQV9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDlVICAgICAvKiE8IElSREEgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgSVJEQSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwSVJEQV9DYWxsYmFja1R5cGVEZWYpKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOyAgLyohPCBwb2ludGVyIHRvIGFuIElSREEgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9FeHBvcnRlZF9Db25zdGFudHMgSVJEQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElSREFfU3RhdGVfRGVmaW5pdGlvbiBJUkRBIFN0YXRlIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyNFUgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWV9UWCAgICAgICAgICAgICAgMHgwMDAwMDAyMVUgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX0lSREFfU1RBVEVfQlVTWV9SWCAgICAgICAgICAgICAgMHgwMDAwMDAyMlUgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgUnhTdGF0ZSBvbmx5ICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX0JVU1lfVFhfUlggICAgICAgICAgIDB4MDAwMDAwMjNVICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBhbmQgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgcmVzdWx0IG9mIGNvbWJpbmF0aW9uIChPcikgYmV0d2VlbiBnU3RhdGUgYW5kIFJ4U3RhdGUgdmFsdWVzICovCisjZGVmaW5lIEhBTF9JUkRBX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICAgIDB4MDAwMDAwQTBVICAgLyohPCBUaW1lb3V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfSVJEQV9TVEFURV9FUlJPUiAgICAgICAgICAgICAgICAweDAwMDAwMEUwVSAgIC8qITwgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfRXJyb3JfRGVmaW5pdGlvbiBJUkRBIEVycm9yIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX05PTkUgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfUEUgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ORSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX0ZFICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgICAgICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0lSREFfRVJST1JfT1JFICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9ETUEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICovCisjZGVmaW5lIEhBTF9JUkRBX0VSUk9SX0JVU1kgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgICAgICAgIC8qITwgQnVzeSBFcnJvciAgICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAgICAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1dvcmRfTGVuZ3RoIElSREEgV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAvKiE8IDctYml0IGxvbmcgZnJhbWUgKi8KKyNkZWZpbmUgSVJEQV9XT1JETEVOR1RIXzhCICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCA4LWJpdCBsb25nIGZyYW1lICovCisjZGVmaW5lIElSREFfV09SRExFTkdUSF85QiAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9NMCAgIC8qITwgOS1iaXQgbG9uZyBmcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX1Bhcml0eSBJUkRBIFBhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gcGFyaXR5ICAgKi8KKyNkZWZpbmUgSVJEQV9QQVJJVFlfRVZFTiAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSAgICAgICAgICAgICAgICAgICAgLyohPCBFdmVuIHBhcml0eSAqLworI2RlZmluZSBJUkRBX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfVHJhbnNmZXJfTW9kZSBJUkRBIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX01PREVfUlggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBJUkRBX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgLyohPCBUWCBtb2RlICAgICAgICAqLworI2RlZmluZSBJUkRBX01PREVfVFhfUlggICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1RFIHxVU0FSVF9DUjFfUkUpICAgLyohPCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0xvd19Qb3dlciBJUkRBIExvdyBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIElSREFfUE9XRVJNT0RFX05PUk1BTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgSVJEQSBub3JtYWwgcG93ZXIgbW9kZSAqLworI2RlZmluZSBJUkRBX1BPV0VSTU9ERV9MT1dQT1dFUiAgICAgICAgICAgICBVU0FSVF9DUjNfSVJMUCAgICAvKiE8IElSREEgbG93IHBvd2VyIG1vZGUgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9DbG9ja1ByZXNjYWxlciAgQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWMSAgICAweDAwMDAwMDAwVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrICAgICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYyICAgIDB4MDAwMDAwMDFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMiAgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjQgICAgMHgwMDAwMDAwMlUgIC8qITwgZmNsa19wcmVzID0gZmNsay80ICAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWNiAgICAweDAwMDAwMDAzVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzYgICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVY4ICAgIDB4MDAwMDAwMDRVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvOCAgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjEwICAgMHgwMDAwMDAwNVUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMCAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWMTIgICAweDAwMDAwMDA2VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYxNiAgIDB4MDAwMDAwMDdVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTYgICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjMyICAgMHgwMDAwMDAwOFUgIC8qITwgZmNsa19wcmVzID0gZmNsay8zMiAgKi8KKyNkZWZpbmUgSVJEQV9QUkVTQ0FMRVJfRElWNjQgICAweDAwMDAwMDA5VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzY0ICAqLworI2RlZmluZSBJUkRBX1BSRVNDQUxFUl9ESVYxMjggIDB4MDAwMDAwMEFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTI4ICovCisjZGVmaW5lIElSREFfUFJFU0NBTEVSX0RJVjI1NiAgMHgwMDAwMDAwQlUgIC8qITwgZmNsa19wcmVzID0gZmNsay8yNTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9TdGF0ZSBJUkRBIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITwgSVJEQSBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgSVJEQV9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1VFICAgIC8qITwgSVJEQSBlbmFibGVkICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Nb2RlICBJUkRBIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgQXNzb2NpYXRlZCBVQVJUIGRpc2FibGVkIGluIElSREEgbW9kZSAqLworI2RlZmluZSBJUkRBX01PREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfSVJFTiAgIC8qITwgQXNzb2NpYXRlZCBVQVJUIGVuYWJsZWQgaW4gSVJEQSBtb2RlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX09uZV9CaXQgIElSREEgT25lIEJpdCBTYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgIC8qITwgT25lLWJpdCBzYW1wbGluZyBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRSAgICAgICAgICBVU0FSVF9DUjNfT05FQklUICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9ETUFfVHggSVJEQSBETUEgVHgKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0RNQV9UWF9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IElSREEgRE1BIFRYIGRpc2FibGVkICovCisjZGVmaW5lIElSREFfRE1BX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ETUFUICAgIC8qITwgSVJEQSBETUEgVFggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9ETUFfUnggIElSREEgRE1BIFJ4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9ETUFfUlhfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBJUkRBIERNQSBSWCBkaXNhYmxlZCAqLworI2RlZmluZSBJUkRBX0RNQV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfRE1BUiAgICAvKiE8IElSREEgRE1BIFJYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElSREFfUmVxdWVzdF9QYXJhbWV0ZXJzIElSREEgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9BVVRPQkFVRF9SRVFVRVNUICAgICAgICAgICAgVVNBUlRfUlFSX0FCUlJRICAgICAgICAvKiE8IEF1dG8tQmF1ZCBSYXRlIFJlcXVlc3QgICAgICAqLworI2RlZmluZSBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgIC8qITwgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QgICovCisjZGVmaW5lIElSREFfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgIFVTQVJUX1JRUl9UWEZSUSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9GbGFncyBJUkRBIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0ZMQUdfUkVBQ0sgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAvKiE8IElSREEgcmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgSVJEQSB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBJUkRBIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfQUJSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRiAgICAgICAgICAvKiE8IElSREEgYXV0byBCYXVkIHJhdGUgZmxhZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19BQlJFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJFICAgICAgICAgIC8qITwgSVJEQSBhdXRvIEJhdWQgcmF0ZSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBJUkRBIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IElSREEgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgSVJEQSByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX09SRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBJUkRBIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0ZMQUdfTkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAvKiE8IElSREEgbm9pc2UgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElSREFfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgSVJEQSBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9GTEFHX1BFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBJUkRBIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0ludGVycnVwdF9kZWZpbml0aW9uIElSREEgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBJUkRBX0lUX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAvKiE8IElSREEgUGFyaXR5IGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3VSAgICAgLyohPCBJUkRBIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIElSREFfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNlUgICAgIC8qITwgSVJEQSBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBJUkRBX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAvKiE8IElSREEgUmVhZCBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgSVJEQV9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgLyohPCBJUkRBIElkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwMDAwMDBYWFlZWVlZYgorICAgICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDViaXRzKQorICAgICAgICAgICAgIC0gWFggIDogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAoMmJpdHMpCisgICAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgLSAxMDogQ1IyIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyICovCisjZGVmaW5lIElSREFfSVRfRVJSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgICAgLyohPCBJUkRBIEVycm9yIGludGVycnVwdGlvbiAgICAgICAgKi8KKworLyogICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMDAwMDAwMDBiCisgICAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykgKi8KKyNkZWZpbmUgSVJEQV9JVF9PUkUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwVSAgICAgIC8qITwgSVJEQSBPdmVycnVuIGVycm9yIGludGVycnVwdGlvbiAqLworI2RlZmluZSBJUkRBX0lUX05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDBVICAgICAgLyohPCBJUkRBIE5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICovCisjZGVmaW5lIElSREFfSVRfRkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgICAvKiE8IElSREEgRnJhbWUgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9JVF9DTEVBUl9GbGFncyAgIElSREEgSW50ZXJydXB0aW9uIENsZWFyIEZsYWdzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9QRUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgLyohPCBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX0ZFRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAvKiE8IEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZyAgICAgICAgICovCisjZGVmaW5lIElSREFfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgIC8qITwgTm9pc2UgRXJyb3IgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgKi8KKyNkZWZpbmUgSVJEQV9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAqLworI2RlZmluZSBJUkRBX0NMRUFSX0lETEVGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAvKiE8IElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnICAgICovCisjZGVmaW5lIElSREFfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9JbnRlcnJ1cHRpb25fTWFzayAgICBJUkRBIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIElSREFfSVRfTUFTSyAgMHgwMDFGVSAgLyohPCBJUkRBIEludGVycnVwdGlvbnMgZmxhZ3MgbWFzayAgKi8KKyNkZWZpbmUgSVJEQV9DUl9NQVNLICAweDAwRTBVICAvKiE8IElSREEgY29udHJvbCByZWdpc3RlciBtYXNrICAgICAqLworI2RlZmluZSBJUkRBX0NSX1BPUyAgIDVVICAgICAgIC8qITwgSVJEQSBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIElSREFfSVNSX01BU0sgMHgxRjAwVSAgLyohPCBJUkRBIElTUiByZWdpc3RlciBtYXNrICAgICAgICAgKi8KKyNkZWZpbmUgSVJEQV9JU1JfUE9TICA4VSAgICAgICAvKiE8IElSREEgSVNSIHJlZ2lzdGVyIHBvc2l0aW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgKiBAfQorICovCisKKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9FeHBvcnRlZF9NYWNyb3MgSVJEQSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBJUkRBIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSVJEQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisjZGVmaW5lIF9fSEFMX0lSREFfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0lSREFfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVTRVQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbmRpZiAvKlVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgICovCisKKy8qKiBAYnJpZWYgIEZsdXNoIHRoZSBJUkRBIERSIHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0ZMVVNIX0RSUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgSVJEQV9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBJUkRBIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfUEVGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9GRUYKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX05FRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfT1JFRgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfVENGCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9JRExFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgSVJEQSBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIElSREFfQ0xFQVJfUEVGKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBJUkRBX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBJUkRBIElETEUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgSVJEQV9DTEVBUl9JRExFRikKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19SRUFDSyBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX1RFQUNLIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0JVU1kgIEJ1c3kgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19BQlJGICBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19BQlJFICBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX09SRSAgIE92ZXJSdW4gRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19ORSAgICBOb2lzZSBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9GTEFHX0ZFICAgIEZyYW1pbmcgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfRkxBR19QRSAgICBQYXJpdHkgRXJyb3IgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBJUkRBIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJUkRBIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UWEUgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UQyAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1BFICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRVJSICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0NSX01BU0spID4+IElSREFfQ1JfUE9TKSA9PSAxKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMik/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSVJEQSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSVJEQSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUlhORSBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfSURMRSBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9FUlIgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIElSREFfQ1JfTUFTSykgPj4gSVJEQV9DUl9QT1MpID09IDEpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIElSREFfQ1JfTUFTSykgPj4gSVJEQV9DUl9QT1MpID09IDIpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgSVJEQSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9UWEUgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RDICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9SWE5FIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9JRExFIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9PUkUgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX05FIE5vaXNlIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfRkUgRnJhbWluZyBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1BFIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lTUl9NQVNLKT4+IElSREFfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBJUkRBIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1RYRSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfVEMgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX1JYTkUgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0lETEUgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0lUX0VSUiBGcmFtaW5nLCBvdmVycnVuIG9yIG5vaXNlIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfSVRfUEUgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMVUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMlUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgodWludDMyX3QpMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIElSREFfSVRfTUFTSykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBJUkRBIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfUEVGIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9GRUYgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9DTEVBUl9ORUYgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfQ0xFQVJfT1JFRiBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0NMRUFSX1RDRiBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9ICh1aW50MzJfdCkoX19JVF9DTEVBUl9fKSkKKworCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBJUkRBIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX0FVVE9CQVVEX1JFUVVFU1QgQXV0by1CYXVkIFJhdGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBJUkRBX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfU0VORF9SRVEoX19IQU5ETEVfXywgX19SRVFfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAodWludDE2X3QpKF9fUkVRX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIElSREEgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JUkRBX09ORV9CSVRfU0FNUExFX0VOQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzfD0gVVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgSVJEQSBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSVJEQSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAgVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSVJEQV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAgflVTQVJUX0NSMV9VRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBDb21wdXRlIHRoZSBtYXNrIHRvIGFwcGx5IHRvIHJldHJpZXZlIHRoZSByZWNlaXZlZCBkYXRhCisgICogICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHdvcmQgbGVuZ3RoIGFuZCB0byB0aGUgcGFyaXR5IGJpdHMgYWN0aXZhdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUsIHRoZSBtYXNrIHRvIGFwcGx5IHRvIHRoZSBhc3NvY2lhdGVkIFVBUlQgUkRSIHJlZ2lzdGVyIGlzIHN0b3JlZCBpbiAoX19IQU5ETEVfXyktPk1hc2sgZmllbGQuCisgICovCisjZGVmaW5lIElSREFfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkYgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF83QikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0YgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDNGIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAwMFU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKy8qKiBAYnJpZWYgIEVuc3VyZSB0aGF0IElSREEgQmF1ZCByYXRlIGlzIGxlc3Mgb3IgZXF1YWwgdG8gbWF4aW11bSB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fQkFVRFJBVEVfXyBzcGVjaWZpZXMgdGhlIElSREEgQmF1ZHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEByZXR2YWwgVHJ1ZSBvciBGYWxzZQorICAqLworI2RlZmluZSBJU19JUkRBX0JBVURSQVRFKF9fQkFVRFJBVEVfXykgKChfX0JBVURSQVRFX18pIDwgMTE1MjAxVSkKKworLyoqIEBicmllZiAgRW5zdXJlIHRoYXQgSVJEQSBwcmVzY2FsZXIgdmFsdWUgaXMgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gMC4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gc3BlY2lmaWVzIHRoZSBJUkRBIHByZXNjYWxlciB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHJldHZhbCBUcnVlIG9yIEZhbHNlCisgICovCisjZGVmaW5lIElTX0lSREFfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoX19QUkVTQ0FMRVJfXykgPiAwVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIElSREEgZnJhbWUgbGVuZ3RoLgorICAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID09IElSREFfV09SRExFTkdUSF83QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IElSREFfV09SRExFTkdUSF84QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IElSREFfV09SRExFTkdUSF85QikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGZyYW1lIHBhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJJVFlfXyBJUkRBIGZyYW1lIHBhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9QQVJJVFkoX19QQVJJVFlfXykgKCgoX19QQVJJVFlfXykgPT0gSVJEQV9QQVJJVFlfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBJUkRBX1BBUklUWV9FVkVOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IElSREFfUEFSSVRZX09ERCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGNvbW11bmljYXRpb24gbW9kZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19NT0RFX18gSVJEQSBjb21tdW5pY2F0aW9uIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9UWF9SWF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgKH4oKHVpbnQzMl90KShJUkRBX01PREVfVFhfUlgpKSkpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHBvd2VyIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgcG93ZXIgbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1BPV0VSTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IElSREFfUE9XRVJNT0RFX0xPV1BPV0VSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gSVJEQV9QT1dFUk1PREVfTk9STUFMKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgY2xvY2sgUHJlc2NhbGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NMT0NLUFJFU0NBTEVSX18gSVJEQSBjbG9jayBQcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX0NMT0NLUFJFU0NBTEVSKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgKCgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVYyKSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjQpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWNikgICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVY4KSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjEwKSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWMTIpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVYxNikgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjMyKSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gSVJEQV9QUkVTQ0FMRVJfRElWNjQpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBJUkRBX1BSRVNDQUxFUl9ESVYxMjgpIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IElSREFfUFJFU0NBTEVSX0RJVjI1NikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUQVRFX18gSVJEQSBzdGF0ZSBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gSVJEQV9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IElSREFfU1RBVEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgYXNzb2NpYXRlZCBVQVJUL1VTQVJUIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIElSREEgYXNzb2NpYXRlZCBVQVJUL1VTQVJUIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9NT0RFKF9fTU9ERV9fKSAgKCgoX19NT0RFX18pID09IElSREFfTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBJUkRBX01PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgc2FtcGxpbmcgcmF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PTkVCSVRfXyBJUkRBIHNhbXBsaW5nIHJhdGUuCisgICogQHJldHZhbCBTRVQgKF9fT05FQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX09ORUJJVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0lSREFfT05FX0JJVF9TQU1QTEUoX19PTkVCSVRfXykgICAgICAoKChfX09ORUJJVF9fKSA9PSBJUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT05FQklUX18pID09IElSREFfT05FX0JJVF9TQU1QTEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgRE1BIFRYIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BVFhfXyBJUkRBIERNQSBUWCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBJUkRBX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gSVJEQV9ETUFfVFhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IElSREEgRE1BIFJYIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fRE1BUlhfXyBJUkRBIERNQSBSWCBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVJYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVJYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfSVJEQV9ETUFfUlgoX19ETUFSWF9fKSAoKChfX0RNQVJYX18pID09IElSREFfRE1BX1JYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQVJYX18pID09IElSREFfRE1BX1JYX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIHJlcXVlc3QgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSQU1fXyBJUkRBIHJlcXVlc3QuCisgICogQHJldHZhbCBTRVQgKF9fUEFSQU1fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSQU1fXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19JUkRBX1JFUVVFU1RfUEFSQU1FVEVSKF9fUEFSQU1fXykgKCgoX19QQVJBTV9fKSA9PSBJUkRBX0FVVE9CQVVEX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gSVJEQV9SWERBVEFfRkxVU0hfUkVRVUVTVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBJUkRBX1RYREFUQV9GTFVTSF9SRVFVRVNUKSkKKy8qKgorICogQH0KKyAqLworCisvKiBJbmNsdWRlIElSREEgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfaXJkYV9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zIElSREEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0luaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9EZUluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX01zcEluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX01zcERlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSVJEQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1VuUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVHJhbnNtaXRfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RNQVBhdXNlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BUmVzdW1lKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfRE1BU3RvcChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCit2b2lkIEhBTF9JUkRBX0lSUUhhbmRsZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9SeENwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3ZvaWQgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Cit2b2lkIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordm9pZCBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIEBhZGR0b2dyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX0lSREFfU3RhdGVUeXBlRGVmIEhBTF9JUkRBX0dldFN0YXRlKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwordWludDMyX3QgICAgICAgICAgICAgIEhBTF9JUkRBX0dldEVycm9yKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9JUkRBX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX2lyZGFfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX2lyZGFfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2E0ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfaXJkYV9leC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9pcmRhX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIElSREEgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0lSREFfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0lSREFfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXggSVJEQUV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBJUkRBRXhfUHJpdmF0ZV9NYWNyb3MgSVJEQUV4IFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBJUkRBIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCisgICogQHJldHZhbCBJUkRBIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCisgICovCisjZGVmaW5lIElSREFfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgICBcCisgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0lSREFfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfaXdkZy5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfaXdkZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDA1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9pd2RnLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2l3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfSVdER19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfSVdER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREcgSVdERworICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfVHlwZXMgSVdERyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSVdERyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAvKiE8IFNlbGVjdCB0aGUgcHJlc2NhbGVyIG9mIHRoZSBJV0RHLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSVdER19QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBSZWxvYWQ7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwRkZGICovCisKKyAgdWludDMyX3QgV2luZG93OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bi1jb3VudGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwRkZGICovCisKK30gSVdER19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBJV0RHIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSVdER19UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAqLworCisgIElXREdfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgLyohPCBJV0RHIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KK30gSVdER19IYW5kbGVUeXBlRGVmOworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfQ29uc3RhbnRzIElXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX1ByZXNjYWxlciBJV0RHIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgSVdER19QUl9QUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gOCAgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgSVdER19QUl9QUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMTYgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzMyICAgICAgICAgICAgICAgKElXREdfUFJfUFJfMSB8IElXREdfUFJfUFJfMCkgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMzIgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzY0ICAgICAgICAgICAgICAgSVdER19QUl9QUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gNjQgICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMCkgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMTI4ICovCisjZGVmaW5lIElXREdfUFJFU0NBTEVSXzI1NiAgICAgICAgICAgICAgKElXREdfUFJfUFJfMiB8IElXREdfUFJfUFJfMSkgICAgICAgICAgICAgICAgICAgLyohPCBJV0RHIHByZXNjYWxlciBzZXQgdG8gMjU2ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19XaW5kb3dfb3B0aW9uIElXREcgV2luZG93IG9wdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIElXREdfV0lORE9XX0RJU0FCTEUgICAgICAgICAgICAgSVdER19XSU5SX1dJTgorLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0V4cG9ydGVkX01hY3JvcyBJV0RHIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJV0RHIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JV0RHX1NUQVJUKF9fSEFORExFX18pICAgICAgICAgICAgICAgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfRU5BQkxFKQorCisvKioKKyAgKiBAYnJpZWYgIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIKKyAgKiAgICAgICAgICh3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgJiBJV0RHX1dJTlIgcmVnaXN0ZXJzIGRpc2FibGVkKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoX19IQU5ETEVfXykgICAgICAgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9SRUxPQUQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zICBJV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24vU3RhcnQgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JV0RHX0luaXQoSVdER19IYW5kbGVUeXBlRGVmICpoaXdkZyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19SZWZyZXNoKElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19Qcml2YXRlX0NvbnN0YW50cyBJV0RHIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJV0RHIEtleSBSZWdpc3RlciBCaXRNYXNrCisgICovCisjZGVmaW5lIElXREdfS0VZX1JFTE9BRCAgICAgICAgICAgICAgICAgMHgwMDAwQUFBQXUgIC8qITwgSVdERyBSZWxvYWQgQ291bnRlciBFbmFibGUgICAqLworI2RlZmluZSBJV0RHX0tFWV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMENDQ0N1ICAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSAgICAweDAwMDA1NTU1dSAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBFbmFibGUgICovCisjZGVmaW5lIElXREdfS0VZX1dSSVRFX0FDQ0VTU19ESVNBQkxFICAgMHgwMDAwMDAwMHUgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRGlzYWJsZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX1ByaXZhdGVfTWFjcm9zIElXREcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBJV0RHIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJV0RHX0VOQUJMRV9XUklURV9BQ0NFU1MoX19IQU5ETEVfXykgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5LUiwgSVdER19LRVlfV1JJVEVfQUNDRVNTX0VOQUJMRSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIElXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElXREdfRElTQUJMRV9XUklURV9BQ0NFU1MoX19IQU5ETEVfXykgV1JJVEVfUkVHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPktSLCBJV0RHX0tFWV9XUklURV9BQ0NFU1NfRElTQUJMRSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gIElXREcgcHJlc2NhbGVyIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICAgICAgKCgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl84KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzE2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBJV0RHX1BSRVNDQUxFUl82NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IElXREdfUFJFU0NBTEVSXzEyOCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gSVdER19QUkVTQ0FMRVJfMjU2KSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHJlbG9hZCB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fUkVMT0FEX18gIElXREcgcmVsb2FkIHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfUkVMT0FEKF9fUkVMT0FEX18pICAgICAgICAgICAgKChfX1JFTE9BRF9fKSA8PSBJV0RHX1JMUl9STCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayBJV0RHIHdpbmRvdyB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fV0lORE9XX18gIElXREcgd2luZG93IHZhbHVlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX0lXREdfV0lORE9XKF9fV0lORE9XX18pICAgICAgICAgICAgKChfX1dJTkRPV19fKSA8PSBJV0RHX1dJTlJfV0lOKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0lXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfbGNkLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9sY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc3Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfbGNkLmgKQEAgLTAsMCArMSw3NjggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2xjZC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBMQ0QgQ29udHJvbGxlciBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9MQ0RfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX0xDRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBMQ0QKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfVHlwZXMgTENEIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExDRCBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBMQ0QgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgRGl2aWRlcjsgICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBEaXZpZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9EaXZpZGVyICovCisgIHVpbnQzMl90IER1dHk7ICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBMQ0QgRHV0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfRHV0eSAqLworICB1aW50MzJfdCBCaWFzOyAgICAgICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIEJpYXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0JpYXMgKi8KKyAgdWludDMyX3QgVm9sdGFnZVNvdXJjZTsgICAvKiE8IFNlbGVjdHMgdGhlIExDRCBWb2x0YWdlIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfVm9sdGFnZV9Tb3VyY2UgKi8KKyAgdWludDMyX3QgQ29udHJhc3Q7ICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBDb250cmFzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfQ29udHJhc3QgKi8KKyAgdWludDMyX3QgRGVhZFRpbWU7ICAgICAgICAvKiE8IENvbmZpZ3VyZXMgdGhlIExDRCBEZWFkIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0RlYWRUaW1lICovCisgIHVpbnQzMl90IFB1bHNlT25EdXJhdGlvbjsgLyohPCBDb25maWd1cmVzIHRoZSBMQ0QgUHVsc2UgT24gRHVyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX1B1bHNlT25EdXJhdGlvbiAqLworICB1aW50MzJfdCBIaWdoRHJpdmU7ICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIGxvdyByZXNpc3RhbmNlIGRpdmlkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0hpZ2hEcml2ZSAqLworICB1aW50MzJfdCBCbGlua01vZGU7ICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIEJsaW5rIE1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlIG9mIEByZWYgTENEX0JsaW5rTW9kZSAqLworICB1aW50MzJfdCBCbGlua0ZyZXF1ZW5jeTsgIC8qITwgQ29uZmlndXJlcyB0aGUgTENEIEJsaW5rIGZyZXF1ZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgb2YgQHJlZiBMQ0RfQmxpbmtGcmVxdWVuY3kgKi8KKyAgdWludDMyX3QgTXV4U2VnbWVudDsgICAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIG11eCBzZWdtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIExDRF9NdXhTZWdtZW50ICovCit9IExDRF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBMQ0QgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0xDRF9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDAsICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgeWV0IEluaXRpYWxpemVkICovCisgIEhBTF9MQ0RfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxLCAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgKi8KKyAgSEFMX0xDRF9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDIsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIEhBTF9MQ0RfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgKi8KKyAgSEFMX0xDRF9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDQgICAgIC8qITwgRXJyb3IgKi8KK30gSEFMX0xDRF9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIExDRF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgIC8qIExDRCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCisKKyAgTENEX0luaXRUeXBlRGVmICAgICAgICAgICAgICAgSW5pdDsgICAgICAgLyogTENEIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgIExvY2s7ICAgICAgIC8qIExvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyBIQUxfTENEX1N0YXRlVHlwZURlZiAgICAgU3RhdGU7ICAgICAgLyogTENEIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAvKiBMQ0QgRXJyb3IgY29kZSAqLworCit9IExDRF9IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0NvbnN0YW50cyBMQ0QgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCAgTENEX0Vycm9yQ29kZSBMQ0QgRXJyb3IgQ29kZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9MQ0RfRVJST1JfTk9ORSAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0xDRF9FUlJPUl9GQ1JTRiAgICAgICgweDAwMDAwMDAxVSkgICAgLyohPCBTeW5jaHJvIGZsYWcgdGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfTENEX0VSUk9SX1VEUiAgICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IFVwZGF0ZSBkaXNwbGF5IHJlcXVlc3QgZmxhZyB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lIEhBTF9MQ0RfRVJST1JfVUREICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgVXBkYXRlIGRpc3BsYXkgZG9uZSBmbGFnIHRpbWVvdXQgZXJyb3IgKi8KKyNkZWZpbmUgSEFMX0xDRF9FUlJPUl9FTlMgICAgICAgICgweDAwMDAwMDA4VSkgICAgLyohPCBMQ0QgZW5hYmxlZCBzdGF0dXMgZmxhZyB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lIEhBTF9MQ0RfRVJST1JfUkRZICAgICAgICAoMHgwMDAwMDAxMFUpICAgIC8qITwgTENEIEJvb3N0ZXIgcmVhZHkgdGltZW91dCBlcnJvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfUHJlc2NhbGVyIExDRCBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzEgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsgICAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMiAgICAgICAgKDB4MDA0MDAwMDBVKSAgLyohPCBDTEtQUyA9IExDRENMSy8yICAgICAgKi8KKyNkZWZpbmUgTENEX1BSRVNDQUxFUl80ICAgICAgICAoMHgwMDgwMDAwMFUpICAvKiE8IENMS1BTID0gTENEQ0xLLzQgICAgICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzggICAgICAgICgweDAwQzAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvOCAgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTYgICAgICAgKDB4MDEwMDAwMDBVKSAgLyohPCBDTEtQUyA9IExDRENMSy8xNiAgICAgKi8KKyNkZWZpbmUgTENEX1BSRVNDQUxFUl8zMiAgICAgICAoMHgwMTQwMDAwMFUpICAvKiE8IENMS1BTID0gTENEQ0xLLzMyICAgICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzY0ICAgICAgICgweDAxODAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNjQgICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTI4ICAgICAgKDB4MDFDMDAwMDBVKSAgLyohPCBDTEtQUyA9IExDRENMSy8xMjggICAgKi8KKyNkZWZpbmUgTENEX1BSRVNDQUxFUl8yNTYgICAgICAoMHgwMjAwMDAwMFUpICAvKiE8IENMS1BTID0gTENEQ0xLLzI1NiAgICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzUxMiAgICAgICgweDAyNDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNTEyICAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfMTAyNCAgICAgKDB4MDI4MDAwMDBVKSAgLyohPCBDTEtQUyA9IExDRENMSy8xMDI0ICAgKi8KKyNkZWZpbmUgTENEX1BSRVNDQUxFUl8yMDQ4ICAgICAoMHgwMkMwMDAwMFUpICAvKiE8IENMS1BTID0gTENEQ0xLLzIwNDggICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzQwOTYgICAgICgweDAzMDAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvNDA5NiAgICovCisjZGVmaW5lIExDRF9QUkVTQ0FMRVJfODE5MiAgICAgKDB4MDM0MDAwMDBVKSAgLyohPCBDTEtQUyA9IExDRENMSy84MTkyICAgKi8KKyNkZWZpbmUgTENEX1BSRVNDQUxFUl8xNjM4NCAgICAoMHgwMzgwMDAwMFUpICAvKiE8IENMS1BTID0gTENEQ0xLLzE2Mzg0ICAqLworI2RlZmluZSBMQ0RfUFJFU0NBTEVSXzMyNzY4ICAgICgweDAzQzAwMDAwVSkgIC8qITwgQ0xLUFMgPSBMQ0RDTEsvMzI3NjggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9EaXZpZGVyIExDRCBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMTYgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMTYgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMTcgICAgKDB4MDAwNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMTcgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMTggICAgKDB4MDAwODAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMTggKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMTkgICAgKDB4MDAwQzAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMTkgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjAgICAgKDB4MDAxMDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjAgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjEgICAgKDB4MDAxNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjEgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjIgICAgKDB4MDAxODAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjIgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjMgICAgKDB4MDAxQzAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjMgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjQgICAgKDB4MDAyMDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjQgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjUgICAgKDB4MDAyNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjUgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjYgICAgKDB4MDAyODAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjYgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjcgICAgKDB4MDAyQzAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjcgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjggICAgKDB4MDAzMDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjggKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMjkgICAgKDB4MDAzNDAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMjkgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMzAgICAgKDB4MDAzODAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMzAgKi8KKyNkZWZpbmUgTENEX0RJVklERVJfMzEgICAgKDB4MDAzQzAwMDBVKSAgLyohPCBMQ0QgZnJlcXVlbmN5ID0gQ0xLUFMvMzEgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBMQ0RfRHV0eSBMQ0QgRHV0eQorICAqIEB7CisgICovCisjZGVmaW5lIExDRF9EVVRZX1NUQVRJQyAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhdGljIGR1dHkgKi8KKyNkZWZpbmUgTENEX0RVVFlfMV8yICAgICAgICAgICAgICAgICAgICAoTENEX0NSX0RVVFlfMCkgICAgICAgICAgICAgICAgICAgLyohPCAxLzIgZHV0eSAgICAqLworI2RlZmluZSBMQ0RfRFVUWV8xXzMgICAgICAgICAgICAgICAgICAgIChMQ0RfQ1JfRFVUWV8xKSAgICAgICAgICAgICAgICAgICAvKiE8IDEvMyBkdXR5ICAgICovCisjZGVmaW5lIExDRF9EVVRZXzFfNCAgICAgICAgICAgICAgICAgICAgKChMQ0RfQ1JfRFVUWV8xIHwgTENEX0NSX0RVVFlfMCkpIC8qITwgMS80IGR1dHkgICAgKi8KKyNkZWZpbmUgTENEX0RVVFlfMV84ICAgICAgICAgICAgICAgICAgICAoTENEX0NSX0RVVFlfMikgICAgICAgICAgICAgICAgICAgLyohPCAxLzggZHV0eSAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIExDRF9CaWFzIExDRCBCaWFzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX0JJQVNfMV80ICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgMS80IEJpYXMgKi8KKyNkZWZpbmUgTENEX0JJQVNfMV8yICAgICAgICAgICAgICAgICAgICBMQ0RfQ1JfQklBU18wIC8qITwgMS8yIEJpYXMgKi8KKyNkZWZpbmUgTENEX0JJQVNfMV8zICAgICAgICAgICAgICAgICAgICBMQ0RfQ1JfQklBU18xIC8qITwgMS8zIEJpYXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX1ZvbHRhZ2VfU291cmNlIExDRCBWb2x0YWdlIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExDRF9WT0xUQUdFU09VUkNFX0lOVEVSTkFMICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBJbnRlcm5hbCB2b2x0YWdlIHNvdXJjZSBmb3IgdGhlIExDRCAqLworI2RlZmluZSBMQ0RfVk9MVEFHRVNPVVJDRV9FWFRFUk5BTCAgICAgIExDRF9DUl9WU0VMICAgIC8qITwgRXh0ZXJuYWwgdm9sdGFnZSBzb3VyY2UgZm9yIHRoZSBMQ0QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0ludGVycnVwdHMgTENEIEludGVycnVwdHMKKyAgKiBAeworICAqLworI2RlZmluZSBMQ0RfSVRfU09GICAgICAgICAgICAgICAgICAgICAgIExDRF9GQ1JfU09GSUUKKyNkZWZpbmUgTENEX0lUX1VERCAgICAgICAgICAgICAgICAgICAgICBMQ0RfRkNSX1VERElFCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9QdWxzZU9uRHVyYXRpb24gTENEIFB1bHNlIE9uIER1cmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX1BVTFNFT05EVVJBVElPTl8wICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgT04gZHVyYXRpb24gPSAwIHB1bHNlICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzEgICAgICAgICAgIChMQ0RfRkNSX1BPTl8wKSAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDEvQ0tfUFMgICovCisjZGVmaW5lIExDRF9QVUxTRU9ORFVSQVRJT05fMiAgICAgICAgICAgKExDRF9GQ1JfUE9OXzEpICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIE9OIGR1cmF0aW9uID0gMi9DS19QUyAgKi8KKyNkZWZpbmUgTENEX1BVTFNFT05EVVJBVElPTl8zICAgICAgICAgICAoTENEX0ZDUl9QT05fMSB8IExDRF9GQ1JfUE9OXzApIC8qITwgUHVsc2UgT04gZHVyYXRpb24gPSAzL0NLX1BTICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzQgICAgICAgICAgIChMQ0RfRkNSX1BPTl8yKSAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDQvQ0tfUFMgICovCisjZGVmaW5lIExDRF9QVUxTRU9ORFVSQVRJT05fNSAgICAgICAgICAgKExDRF9GQ1JfUE9OXzIgfCBMQ0RfRkNSX1BPTl8wKSAvKiE8IFB1bHNlIE9OIGR1cmF0aW9uID0gNS9DS19QUyAgKi8KKyNkZWZpbmUgTENEX1BVTFNFT05EVVJBVElPTl82ICAgICAgICAgICAoTENEX0ZDUl9QT05fMiB8IExDRF9GQ1JfUE9OXzEpIC8qITwgUHVsc2UgT04gZHVyYXRpb24gPSA2L0NLX1BTICAqLworI2RlZmluZSBMQ0RfUFVMU0VPTkRVUkFUSU9OXzcgICAgICAgICAgIChMQ0RfRkNSX1BPTikgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBPTiBkdXJhdGlvbiA9IDcvQ0tfUFMgICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgTENEX0RlYWRUaW1lIExDRCBEZWFkIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGRlYWQgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMSAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9uZSBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMiAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMSkgICAgICAgICAgICAgICAgICAvKiE8IFR3byBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfMyAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMSB8IExDRF9GQ1JfREVBRF8wKSAvKiE8IFRocmVlIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZSAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNCAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMikgICAgICAgICAgICAgICAgICAvKiE8IEZvdXIgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNSAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMiB8IExDRF9GQ1JfREVBRF8wKSAvKiE8IEZpdmUgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNiAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQURfMiB8IExDRF9GQ1JfREVBRF8xKSAvKiE8IFNpeCBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUgICAqLworI2RlZmluZSBMQ0RfREVBRFRJTUVfNyAgICAgICAgICAgICAgICAgIChMQ0RfRkNSX0RFQUQpICAgICAgICAgICAgICAgICAgICAvKiE8IFNldmVuIFBoYXNlIGJldHdlZW4gZGlmZmVyZW50IGNvdXBsZSBvZiBGcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfQmxpbmtNb2RlIExDRCBCbGluayBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTENEX0JMSU5LTU9ERV9PRkYgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAvKiE8IEJsaW5rIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExDRF9CTElOS01PREVfU0VHMF9DT00wICAgICAgICAgKExDRF9GQ1JfQkxJTktfMCkgICAgICAgLyohPCBCbGluayBlbmFibGVkIG9uIFNFR1swXSwgQ09NWzBdICgxIHBpeGVsKSAgICAgICAgICAqLworI2RlZmluZSBMQ0RfQkxJTktNT0RFX1NFRzBfQUxMQ09NICAgICAgIChMQ0RfRkNSX0JMSU5LXzEpICAgICAgIC8qITwgQmxpbmsgZW5hYmxlZCBvbiBTRUdbMF0sIGFsbCBDT00gKHVwIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggcGl4ZWxzIGFjY29yZGluZyB0byB0aGUgcHJvZ3JhbW1lZCBkdXR5KSAgICAgICAgICAqLworI2RlZmluZSBMQ0RfQkxJTktNT0RFX0FMTFNFR19BTExDT00gICAgIChMQ0RfRkNSX0JMSU5LKSAgICAgICAgIC8qITwgQmxpbmsgZW5hYmxlZCBvbiBhbGwgU0VHIGFuZCBhbGwgQ09NIChhbGwgcGl4ZWxzKSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0JsaW5rRnJlcXVlbmN5IExDRCBCbGluayBGcmVxdWVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWOCAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC84ICAgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxNiAgICAgICAgKExDRF9GQ1JfQkxJTktGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzE2ICAgKi8KKyNkZWZpbmUgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjMyICAgICAgICAoTENEX0ZDUl9CTElOS0ZfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMQ0QvMzIgICAqLworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNjQgICAgICAgIChMQ0RfRkNSX0JMSU5LRl8xIHwgTENEX0ZDUl9CTElOS0ZfMCkgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC82NCAgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxMjggICAgICAgKExDRF9GQ1JfQkxJTktGXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzEyOCAgKi8KKyNkZWZpbmUgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjI1NiAgICAgICAoTENEX0ZDUl9CTElOS0ZfMiB8TENEX0ZDUl9CTElOS0ZfMCkgIC8qITwgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMQ0QvMjU2ICAqLworI2RlZmluZSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNTEyICAgICAgIChMQ0RfRkNSX0JMSU5LRl8yIHxMQ0RfRkNSX0JMSU5LRl8xKSAgLyohPCBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxDRC81MTIgICovCisjZGVmaW5lIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYxMDI0ICAgICAgKExDRF9GQ1JfQkxJTktGKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTENELzEwMjQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0NvbnRyYXN0IExDRCBDb250cmFzdAorICAqIEB7CisgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuNjBWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzEgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18wKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuNzNWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzIgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18xKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuODZWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzMgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18xIHwgTENEX0ZDUl9DQ18wKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDIuOTlWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzQgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yKSAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuMTJWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzUgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yIHwgTENEX0ZDUl9DQ18wKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuMjZWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzYgICAgICAgICAgICAgICAoTENEX0ZDUl9DQ18yIHwgTENEX0ZDUl9DQ18xKSAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuNDBWICAgICovCisjZGVmaW5lIExDRF9DT05UUkFTVExFVkVMXzcgICAgICAgICAgICAgICAoTENEX0ZDUl9DQykgICAgICAgICAgICAgICAgICAvKiE8IE1heGltdW0gVm9sdGFnZSA9IDMuNTVWICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9SQU1SZWdpc3RlciBMQ0QgUkFNUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSMCAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDAgICovCisjZGVmaW5lIExDRF9SQU1fUkVHSVNURVIxICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMSAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlUpIC8qITwgTENEIFJBTSBSZWdpc3RlciAyICAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSMyAgICAgICAgICAgICAgICgweDAwMDAwMDAzVSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDMgICovCisjZGVmaW5lIExDRF9SQU1fUkVHSVNURVI0ICAgICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNCAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjUgICAgICAgICAgICAgICAoMHgwMDAwMDAwNVUpIC8qITwgTENEIFJBTSBSZWdpc3RlciA1ICAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSNiAgICAgICAgICAgICAgICgweDAwMDAwMDA2VSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDYgICovCisjZGVmaW5lIExDRF9SQU1fUkVHSVNURVI3ICAgICAgICAgICAgICAgKDB4MDAwMDAwMDdVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgNyAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjggICAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpIC8qITwgTENEIFJBTSBSZWdpc3RlciA4ICAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSOSAgICAgICAgICAgICAgICgweDAwMDAwMDA5VSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDkgICovCisjZGVmaW5lIExDRF9SQU1fUkVHSVNURVIxMCAgICAgICAgICAgICAgKDB4MDAwMDAwMEFVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTAgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjExICAgICAgICAgICAgICAoMHgwMDAwMDAwQlUpIC8qITwgTENEIFJBTSBSZWdpc3RlciAxMSAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSMTIgICAgICAgICAgICAgICgweDAwMDAwMDBDVSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDEyICovCisjZGVmaW5lIExDRF9SQU1fUkVHSVNURVIxMyAgICAgICAgICAgICAgKDB4MDAwMDAwMERVKSAvKiE8IExDRCBSQU0gUmVnaXN0ZXIgMTMgKi8KKyNkZWZpbmUgTENEX1JBTV9SRUdJU1RFUjE0ICAgICAgICAgICAgICAoMHgwMDAwMDAwRVUpIC8qITwgTENEIFJBTSBSZWdpc3RlciAxNCAqLworI2RlZmluZSBMQ0RfUkFNX1JFR0lTVEVSMTUgICAgICAgICAgICAgICgweDAwMDAwMDBGVSkgLyohPCBMQ0QgUkFNIFJlZ2lzdGVyIDE1ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9IaWdoRHJpdmUgTENEIEhpZ2ggRHJpdmUKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9ISUdIRFJJVkVfRElTQUJMRSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDApICAgICAgICAvKiE8IEhpZ2ggZHJpdmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTENEX0hJR0hEUklWRV9FTkFCTEUgICAgICAgICAgICAgIChMQ0RfRkNSX0hEKSAgICAgICAgICAgICAgICAgIC8qITwgSGlnaCBkcml2ZSBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfTXV4U2VnbWVudCBMQ0QgTXV4IFNlZ21lbnQKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9NVVhTRUdNRU5UX0RJU0FCTEUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAvKiE8IFNFRyBwaW4gbXVsdGlwbGV4aW5nIGRpc2FibGVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQ0RfTVVYU0VHTUVOVF9FTkFCTEUgICAgICAgICAgICAgKExDRF9DUl9NVVhfU0VHKSAgICAgICAgICAgICAgLyohPCBTRUdbMzE6MjhdIGFyZSBtdWx0aXBsZXhlZCB3aXRoIFNFR1s0Mzo0MF0gICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0ZsYWdfRGVmaW5pdGlvbiBMQ0QgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExDRF9GTEFHX0VOUyAgICAgICAgICAgICAgICAgICAgTENEX1NSX0VOUyAgIC8qITwgTENEIGVuYWJsZWQgc3RhdHVzICovCisjZGVmaW5lIExDRF9GTEFHX1NPRiAgICAgICAgICAgICAgICAgICAgTENEX1NSX1NPRiAgIC8qITwgU3RhcnQgb2YgZnJhbWUgZmxhZyAqLworI2RlZmluZSBMQ0RfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgIExDRF9TUl9VRFIgICAvKiE8IFVwZGF0ZSBkaXNwbGF5IHJlcXVlc3QgKi8KKyNkZWZpbmUgTENEX0ZMQUdfVUREICAgICAgICAgICAgICAgICAgICBMQ0RfU1JfVUREICAgLyohPCBVcGRhdGUgZGlzcGxheSBkb25lICovCisjZGVmaW5lIExDRF9GTEFHX1JEWSAgICAgICAgICAgICAgICAgICAgTENEX1NSX1JEWSAgIC8qITwgUmVhZHkgZmxhZyAqLworI2RlZmluZSBMQ0RfRkxBR19GQ1JTRiAgICAgICAgICAgICAgICAgIExDRF9TUl9GQ1JTUiAvKiE8IExDRCBGcmFtZSBDb250cm9sIFJlZ2lzdGVyIFN5bmNocm9uaXphdGlvbiBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfTWFjcm9zIExDRCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IExDRCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MQ0RfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9MQ0RfU1RBVEVfUkVTRVQpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgTENEIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MQ0RfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfTENERU4pCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIExDRCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfTENERU4pCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgbG93IHJlc2lzdGFuY2UgZGl2aWRlci4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQG5vdGUgICBEaXNwbGF5cyB3aXRoIGhpZ2ggaW50ZXJuYWwgcmVzaXN0YW5jZSBtYXkgbmVlZCBhIGxvbmdlciBkcml2ZSB0aW1lIHRvCisgICogICAgICAgICBhY2hpZXZlIHNhdGlzZmFjdG9yeSBjb250cmFzdC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgaW4gdGhpcyBjYXNlIGlmCisgICogICAgICAgICBzb21lIGFkZGl0aW9uYWwgcG93ZXIgY29uc3VtcHRpb24gY2FuIGJlIHRvbGVyYXRlZC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBtb2RlIGlzIGVuYWJsZWQsIHRoZSBQdWxzZU9uIER1cmF0aW9uIChQT04pIGhhdmUgdG8gYmUKKyAgKiAgICAgICAgIHByb2dyYW1tZWQgdG8gMS9DS19QUyAoTENEX1BVTFNFT05EVVJBVElPTl8xKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0hJR0hEUklWRVJfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkZDUiwgTENEX0ZDUl9IRCk7IFwKKyAgICAgICAgICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIGxvdyByZXNpc3RhbmNlIGRpdmlkZXIuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MQ0RfSElHSERSSVZFUl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX0hEKTsgXAorICAgICAgICAgICAgICAgICAgICBMQ0RfV2FpdEZvclN5bmNocm8oX19IQU5ETEVfXyk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHZvbHRhZ2Ugb3V0cHV0IGJ1ZmZlciBmb3IgaGlnaGVyIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9WT0xUQUdFX0JVRkZFUl9FTkFCTEUoX19IQU5ETEVfXykgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBMQ0RfQ1JfQlVGRU4pCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHZvbHRhZ2Ugb3V0cHV0IGJ1ZmZlciBmb3IgaGlnaGVyIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9WT0xUQUdFX0JVRkZFUl9ESVNBQkxFKF9fSEFORExFX18pICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIExDRF9DUl9CVUZFTikKKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIExDRCBwdWxzZSBvbiBkdXJhdGlvbi4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHBhcmFtIF9fRFVSQVRJT05fXyBzcGVjaWZpZXMgdGhlIExDRCBwdWxzZSBvbiBkdXJhdGlvbiBpbiB0ZXJtcyBvZgorICAqICAgICAgICAgQ0tfUFMgKHByZXNjYWxlZCBMQ0QgY2xvY2sgcGVyaW9kKSBwdWxzZXMuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fMDogMCBwdWxzZQorICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fMTogUHVsc2UgT04gZHVyYXRpb24gPSAxL0NLX1BTCisgICogICAgIEBhcmcgTENEX1BVTFNFT05EVVJBVElPTl8yOiBQdWxzZSBPTiBkdXJhdGlvbiA9IDIvQ0tfUFMKKyAgKiAgICAgQGFyZyBMQ0RfUFVMU0VPTkRVUkFUSU9OXzM6IFB1bHNlIE9OIGR1cmF0aW9uID0gMy9DS19QUworICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fNDogUHVsc2UgT04gZHVyYXRpb24gPSA0L0NLX1BTCisgICogICAgIEBhcmcgTENEX1BVTFNFT05EVVJBVElPTl81OiBQdWxzZSBPTiBkdXJhdGlvbiA9IDUvQ0tfUFMKKyAgKiAgICAgQGFyZyBMQ0RfUFVMU0VPTkRVUkFUSU9OXzY6IFB1bHNlIE9OIGR1cmF0aW9uID0gNi9DS19QUworICAqICAgICBAYXJnIExDRF9QVUxTRU9ORFVSQVRJT05fNzogUHVsc2UgT04gZHVyYXRpb24gPSA3L0NLX1BTCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9QVUxTRU9ORFVSQVRJT05fQ09ORklHKF9fSEFORExFX18sIF9fRFVSQVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX1BPTiwgKF9fRFVSQVRJT05fXykpOyBcCisgICAgICAgICAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMQ0QgZGVhZCB0aW1lLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gX19ERUFEVElNRV9fIHNwZWNpZmllcyB0aGUgTENEIGRlYWQgdGltZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzA6IE5vIGRlYWQgVGltZQorICAqICAgICBAYXJnIExDRF9ERUFEVElNRV8xOiBPbmUgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzI6IFR3byBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUKKyAgKiAgICAgQGFyZyBMQ0RfREVBRFRJTUVfMzogVGhyZWUgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzQ6IEZvdXIgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzU6IEZpdmUgUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogICAgIEBhcmcgTENEX0RFQURUSU1FXzY6IFNpeCBQaGFzZSBiZXR3ZWVuIGRpZmZlcmVudCBjb3VwbGUgb2YgRnJhbWUKKyAgKiAgICAgQGFyZyBMQ0RfREVBRFRJTUVfNzogU2V2ZW4gUGhhc2UgYmV0d2VlbiBkaWZmZXJlbnQgY291cGxlIG9mIEZyYW1lCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9ERUFEVElNRV9DT05GSUcoX19IQU5ETEVfXywgX19ERUFEVElNRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IsIExDRF9GQ1JfREVBRCwgKF9fREVBRFRJTUVfXykpOyBcCisgICAgICAgICAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTENEIGNvbnRyYXN0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gX19DT05UUkFTVF9fIHNwZWNpZmllcyB0aGUgTENEIENvbnRyYXN0LgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF8wOiBNYXhpbXVtIFZvbHRhZ2UgPSAyLjYwVgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzE6IE1heGltdW0gVm9sdGFnZSA9IDIuNzNWCisgICogICAgIEBhcmcgTENEX0NPTlRSQVNUTEVWRUxfMjogTWF4aW11bSBWb2x0YWdlID0gMi44NlYKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF8zOiBNYXhpbXVtIFZvbHRhZ2UgPSAyLjk5VgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzQ6IE1heGltdW0gVm9sdGFnZSA9IDMuMTJWCisgICogICAgIEBhcmcgTENEX0NPTlRSQVNUTEVWRUxfNTogTWF4aW11bSBWb2x0YWdlID0gMy4yNVYKKyAgKiAgICAgQGFyZyBMQ0RfQ09OVFJBU1RMRVZFTF82OiBNYXhpbXVtIFZvbHRhZ2UgPSAzLjM4VgorICAqICAgICBAYXJnIExDRF9DT05UUkFTVExFVkVMXzc6IE1heGltdW0gVm9sdGFnZSA9IDMuNTFWCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9DT05UUkFTVF9DT05GSUcoX19IQU5ETEVfXywgX19DT05UUkFTVF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RkNSLCBMQ0RfRkNSX0NDLCAoX19DT05UUkFTVF9fKSk7ICBcCisgICAgICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTENEIEJsaW5rIG1vZGUgYW5kIEJsaW5rIGZyZXF1ZW5jeS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHBhcmFtIF9fQkxJTktNT0RFX18gc3BlY2lmaWVzIHRoZSBMQ0QgYmxpbmsgbW9kZS4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgTENEX0JMSU5LTU9ERV9PRkY6ICAgICAgICAgICBCbGluayBkaXNhYmxlZAorICAqICAgICBAYXJnIExDRF9CTElOS01PREVfU0VHMF9DT00wOiAgICAgQmxpbmsgZW5hYmxlZCBvbiBTRUdbMF0sIENPTVswXSAoMSBwaXhlbCkKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktNT0RFX1NFRzBfQUxMQ09NOiAgIEJsaW5rIGVuYWJsZWQgb24gU0VHWzBdLCBhbGwgQ09NICh1cCB0byA4CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgYWNjb3JkaW5nIHRvIHRoZSBwcm9ncmFtbWVkIGR1dHkpCisgICogICAgIEBhcmcgTENEX0JMSU5LTU9ERV9BTExTRUdfQUxMQ09NOiBCbGluayBlbmFibGVkIG9uIGFsbCBTRUcgYW5kIGFsbCBDT00KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGwgcGl4ZWxzKQorICAqIEBwYXJhbSBfX0JMSU5LRlJFUVVFTkNZX18gc3BlY2lmaWVzIHRoZSBMQ0QgYmxpbmsgZnJlcXVlbmN5LgorICAqICAgICBAYXJnIExDRF9CTElOS0ZSRVFVRU5DWV9ESVY4OiAgICBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxjZC84CisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjE2OiAgIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzE2CisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjMyOiAgIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzMyCisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjY0OiAgIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzY0CisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEyODogIFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzEyOAorICAqICAgICBAYXJnIExDRF9CTElOS0ZSRVFVRU5DWV9ESVYyNTY6ICBUaGUgQmxpbmsgZnJlcXVlbmN5ID0gZkxjZC8yNTYKKyAgKiAgICAgQGFyZyBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNTEyOiAgVGhlIEJsaW5rIGZyZXF1ZW5jeSA9IGZMY2QvNTEyCisgICogICAgIEBhcmcgTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEwMjQ6IFRoZSBCbGluayBmcmVxdWVuY3kgPSBmTGNkLzEwMjQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0JMSU5LX0NPTkZJRyhfX0hBTkRMRV9fLCBfX0JMSU5LTU9ERV9fLCBfX0JMSU5LRlJFUVVFTkNZX18pICAgICAgICAgXAorICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTU9ESUZZX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IsIChMQ0RfRkNSX0JMSU5LRiB8IExDRF9GQ1JfQkxJTkspLCAoKF9fQkxJTktNT0RFX18pIHwgKF9fQkxJTktGUkVRVUVOQ1lfXykpKTsgXAorICAgICAgICAgICAgICAgIExDRF9XYWl0Rm9yU3luY2hybyhfX0hBTkRMRV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgTENEIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBMQ0QgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgTENEX0lUX1NPRjogU3RhcnQgb2YgRnJhbWUgSW50ZXJydXB0CisgICogICAgIEBhcmcgTENEX0lUX1VERDogVXBkYXRlIERpc3BsYXkgRG9uZSBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkZDUiwgKF9fSU5URVJSVVBUX18pKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBMQ0QgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIExDRCBpbnRlcnJ1cHQgc291cmNlIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgTENEX0lUX1NPRjogU3RhcnQgb2YgRnJhbWUgSW50ZXJydXB0CisgICogICAgIEBhcmcgTENEX0lUX1VERDogVXBkYXRlIERpc3BsYXkgRG9uZSBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IsIChfX0lOVEVSUlVQVF9fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgTENEX1dhaXRGb3JTeW5jaHJvKF9fSEFORExFX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTENEIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBMQ0QgSGFuZGxlLgorICAqIEBwYXJhbSBfX0lUX18gc3BlY2lmaWVzIHRoZSBMQ0QgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgQGFyZyBMQ0RfSVRfU09GOiBTdGFydCBvZiBGcmFtZSBJbnRlcnJ1cHQKKyAgKiAgICAgICAgQGFyZyBMQ0RfSVRfVUREOiBVcGRhdGUgRGlzcGxheSBEb25lIEludGVycnVwdC4KKyAgKiBAbm90ZSBJZiB0aGUgZGV2aWNlIGlzIGluIFNUT1AgbW9kZSAoUENMSyBub3QgcHJvdmlkZWQpIFVERCB3aWxsIG5vdAorICAqICAgICAgICAgIGdlbmVyYXRlIGFuIGludGVycnVwdCBldmVuIGlmIFVERElFID0gMS4KKyAgKiAgICAgICAgICBJZiB0aGUgZGlzcGxheSBpcyBub3QgZW5hYmxlZCB0aGUgVUREIGludGVycnVwdCB3aWxsIG5ldmVyIG9jY3VyLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fSVRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSVRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IpICYgKF9fSVRfXykpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBMQ0QgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgTENEIEhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICBAYXJnIExDRF9GTEFHX0VOUzogTENEIEVuYWJsZWQgZmxhZy4gSXQgaW5kaWNhdGVzIHRoZSBMQ0QgY29udHJvbGxlciBzdGF0dXMuCisgICogQG5vdGUgIFRoZSBFTlMgYml0IGlzIHNldCBpbW1lZGlhdGVseSB3aGVuIHRoZSBMQ0RFTiBiaXQgaW4gdGhlIExDRF9DUgorICAqICAgICAgICAgICAgIGdvZXMgZnJvbSAwIHRvIDEuIE9uIGRlYWN0aXZhdGlvbiBpdCByZWZsZWN0cyB0aGUgcmVhbCBzdGF0dXMgb2YKKyAgKiAgICAgICAgICAgICBMQ0Qgc28gaXQgYmVjb21lcyAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgZGlzcGxheWVkIGZyYW1lLgorICAqICAgICAgICBAYXJnIExDRF9GTEFHX1NPRjogU3RhcnQgb2YgRnJhbWUgZmxhZy4gVGhpcyBmbGFnIGlzIHNldCBieSBoYXJkd2FyZSBhdAorICAqICAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgZnJhbWUsIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGRpc3BsYXkgZGF0YSBpcworICAqICAgICAgICAgICAgIHVwZGF0ZWQuCisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfVURSOiBVcGRhdGUgRGlzcGxheSBSZXF1ZXN0IGZsYWcuCisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfVUREOiBVcGRhdGUgRGlzcGxheSBEb25lIGZsYWcuCisgICogICAgICAgIEBhcmcgTENEX0ZMQUdfUkRZOiBTdGVwX3VwIGNvbnZlcnRlciBSZWFkeSBmbGFnLiBJdCBpbmRpY2F0ZXMgdGhlIHN0YXR1cworICAqICAgICAgICAgICAgIG9mIHRoZSBzdGVwLXVwIGNvbnZlcnRlci4KKyAgKiAgICAgICAgQGFyZyBMQ0RfRkxBR19GQ1JTRjogTENEIEZyYW1lIENvbnRyb2wgUmVnaXN0ZXIgU3luY2hyb25pemF0aW9uIEZsYWcuCisgICogICAgICAgICAgICAgVGhpcyBmbGFnIGlzIHNldCBieSBoYXJkd2FyZSBlYWNoIHRpbWUgdGhlIExDRF9GQ1IgcmVnaXN0ZXIgaXMgdXBkYXRlZAorICAqICAgICAgICAgICAgIGluIHRoZSBMQ0RDTEsgZG9tYWluLgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX0xDRF9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgTENEIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIExDRCBIYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgQGFyZyBMQ0RfRkxBR19TT0Y6IFN0YXJ0IG9mIEZyYW1lIEludGVycnVwdAorICAqICAgICAgICBAYXJnIExDRF9GTEFHX1VERDogVXBkYXRlIERpc3BsYXkgRG9uZSBJbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTENEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICBXUklURV9SRUcoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0xSLCAoX19GTEFHX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqIEBhZGR0b2dyb3VwIExDRF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBtZXRob2RzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIExDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9MQ0RfRGVJbml0KExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgIEhBTF9MQ0RfSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7Cit2b2lkICAgICAgICAgICAgICAgICBIQUxfTENEX01zcEluaXQoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpOwordm9pZCAgICAgICAgICAgICAgICAgSEFMX0xDRF9Nc3BEZUluaXQoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgICBIQUxfTENEX1dyaXRlKExDRF9IYW5kbGVUeXBlRGVmICpobGNkLCB1aW50MzJfdCBSQU1SZWdpc3RlckluZGV4LCB1aW50MzJfdCBSQU1SZWdpc3Rlck1hc2ssIHVpbnQzMl90IERhdGEpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgSEFMX0xDRF9DbGVhcihMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7CitIQUxfU3RhdHVzVHlwZURlZiAgICBIQUxfTENEX1VwZGF0ZURpc3BsYXlSZXF1ZXN0KExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgbWV0aG9kcyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworSEFMX0xDRF9TdGF0ZVR5cGVEZWYgSEFMX0xDRF9HZXRTdGF0ZShMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfTENEX0dldEVycm9yKExDRF9IYW5kbGVUeXBlRGVmICpobGNkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExDRF9Qcml2YXRlX01hY3JvcyBMQ0QgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xDRF9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8xKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl84KSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMTYpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzMyKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl82NCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMTI4KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzI1NikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl81MTIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfMTAyNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzIwNDgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl80MDk2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IExDRF9QUkVTQ0FMRVJfODE5MikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBMQ0RfUFJFU0NBTEVSXzE2Mzg0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gTENEX1BSRVNDQUxFUl8zMjc2OCkpCisKKyNkZWZpbmUgSVNfTENEX0RJVklERVIoX19ESVZJREVSX18pICgoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzE3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMTgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8xOSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzIwKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzIzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzI2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMjcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8yOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZJREVSX18pID09IExDRF9ESVZJREVSXzI5KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVklERVJfXykgPT0gTENEX0RJVklERVJfMzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWSURFUl9fKSA9PSBMQ0RfRElWSURFUl8zMSkpCisKKyNkZWZpbmUgSVNfTENEX0RVVFkoX19EVVRZX18pICgoKF9fRFVUWV9fKSA9PSBMQ0RfRFVUWV9TVEFUSUMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RVVFlfXykgPT0gTENEX0RVVFlfMV8yKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EVVRZX18pID09IExDRF9EVVRZXzFfMykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVUWV9fKSA9PSBMQ0RfRFVUWV8xXzQpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RVVFlfXykgPT0gTENEX0RVVFlfMV84KSkKKworI2RlZmluZSBJU19MQ0RfQklBUyhfX0JJQVNfXykgKCgoX19CSUFTX18pID09IExDRF9CSUFTXzFfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSUFTX18pID09IExDRF9CSUFTXzFfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CSUFTX18pID09IExDRF9CSUFTXzFfMykpCisKKyNkZWZpbmUgSVNfTENEX1ZPTFRBR0VfU09VUkNFKFNPVVJDRSkgKCgoU09VUkNFKSA9PSBMQ0RfVk9MVEFHRVNPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTT1VSQ0UpID09IExDRF9WT0xUQUdFU09VUkNFX0VYVEVSTkFMKSkKKworCisjZGVmaW5lIElTX0xDRF9QVUxTRV9PTl9EVVJBVElPTihfX0RVUkFUSU9OX18pICgoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRFVSQVRJT05fXykgPT0gTENEX1BVTFNFT05EVVJBVElPTl83KSkKKworI2RlZmluZSBJU19MQ0RfREVBRF9USU1FKF9fVElNRV9fKSAoKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IExDRF9ERUFEVElNRV8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRV9fKSA9PSBMQ0RfREVBRFRJTUVfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IExDRF9ERUFEVElNRV80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRV9fKSA9PSBMQ0RfREVBRFRJTUVfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVfXykgPT0gTENEX0RFQURUSU1FXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USU1FX18pID09IExDRF9ERUFEVElNRV83KSkKKworI2RlZmluZSBJU19MQ0RfQkxJTktfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IExDRF9CTElOS01PREVfT0ZGKSAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBMQ0RfQkxJTktNT0RFX1NFRzBfQ09NMCkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gTENEX0JMSU5LTU9ERV9TRUcwX0FMTENPTSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IExDRF9CTElOS01PREVfQUxMU0VHX0FMTENPTSkpCisKKyNkZWZpbmUgSVNfTENEX0JMSU5LX0ZSRVFVRU5DWShfX0ZSRVFVRU5DWV9fKSAoKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRVUVOQ1lfXykgPT0gTENEX0JMSU5LRlJFUVVFTkNZX0RJVjE2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRlJFUVVFTkNZX18pID09IExDRF9CTElOS0ZSRVFVRU5DWV9ESVYzMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRVUVOQ1lfXykgPT0gTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEyOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRlJFUVVFTkNZX18pID09IExDRF9CTElOS0ZSRVFVRU5DWV9ESVYyNTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0ZSRVFVRU5DWV9fKSA9PSBMQ0RfQkxJTktGUkVRVUVOQ1lfRElWNTEyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19GUkVRVUVOQ1lfXykgPT0gTENEX0JMSU5LRlJFUVVFTkNZX0RJVjEwMjQpKQorCisjZGVmaW5lIElTX0xDRF9DT05UUkFTVChfX0NPTlRSQVNUX18pICgoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRSQVNUX18pID09IExDRF9DT05UUkFTVExFVkVMXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUkFTVF9fKSA9PSBMQ0RfQ09OVFJBU1RMRVZFTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRSQVNUX18pID09IExDRF9DT05UUkFTVExFVkVMXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05UUkFTVF9fKSA9PSBMQ0RfQ09OVFJBU1RMRVZFTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJBU1RfXykgPT0gTENEX0NPTlRSQVNUTEVWRUxfNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTlRSQVNUX18pID09IExDRF9DT05UUkFTVExFVkVMXzcpKQorCisjZGVmaW5lIElTX0xDRF9SQU1fUkVHSVNURVIoX19SRUdJU1RFUl9fKSAoKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIwKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIzKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVI2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSNykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVI5KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIxMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SRUdJU1RFUl9fKSA9PSBMQ0RfUkFNX1JFR0lTVEVSMTMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkVHSVNURVJfXykgPT0gTENEX1JBTV9SRUdJU1RFUjE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JFR0lTVEVSX18pID09IExDRF9SQU1fUkVHSVNURVIxNSkpCisKKyNkZWZpbmUgSVNfTENEX0hJR0hfRFJJVkUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExDRF9ISUdIRFJJVkVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTENEX0hJR0hEUklWRV9FTkFCTEUpKQorCisjZGVmaW5lIElTX0xDRF9NVVhfU0VHTUVOVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTENEX01VWFNFR01FTlRfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTENEX01VWFNFR01FTlRfRElTQUJMRSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTENEX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgICAgIExDRF9XYWl0Rm9yU3luY2hybyhMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX0xDRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9scHRpbS5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfbHB0aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YzNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfbHB0aW0uaApAQCAtMCwwICsxLDc2MCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfbHB0aW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTFBUSU0gSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX0xQVElNX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9MUFRJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBUSU0xKSB8fCBkZWZpbmVkIChMUFRJTTIpCisKKy8qKiBAYWRkdG9ncm91cCBMUFRJTQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX1R5cGVzIExQVElNIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBMUFRJTSBDbG9jayBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFNvdXJjZTsgICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfU291cmNlICAgKi8KKworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvdW50ZXIgY2xvY2sgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9DbG9ja19QcmVzY2FsZXIgKi8KKworfSBMUFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gQ2xvY2sgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQb2xhcml0eTsgICAgICAvKiE8IFNlbGVjdHMgdGhlIHBvbGFyaXR5IG9mIHRoZSBhY3RpdmUgZWRnZSBmb3IgdGhlIGNvdW50ZXIgdW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIFVMUFRJTSBpbnB1dCBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSB3aGVuIFVsdHJhIGxvdyBwb3dlciBjbG9jayBzb3VyY2UgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IElmIHRoZSBwb2xhcml0eSBpcyBjb25maWd1cmVkIG9uICdib3RoIGVkZ2VzJywgYW4gYXV4aWxpYXJ5IGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob25lIG9mIHRoZSBMb3cgcG93ZXIgb3NjaWxsYXRvcikgbXVzdCBiZSBhY3RpdmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0Nsb2NrX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgU2FtcGxlVGltZTsgICAgIC8qITwgU2VsZWN0cyB0aGUgY2xvY2sgc2FtcGxpbmcgdGltZSB0byBjb25maWd1cmUgdGhlIGNsb2NrIGdsaXRjaCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgd2hlbiBVbHRyYSBsb3cgcG93ZXIgY2xvY2sgc291cmNlIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0Nsb2NrX1NhbXBsZV9UaW1lICovCisKK30gTFBUSU1fVUxQQ2xvY2tDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIExQVElNIFRyaWdnZXIgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTb3VyY2U7ICAgICAgICAvKiE8IFNlbGVjdHMgdGhlIFRyaWdnZXIgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX1RyaWdnZXJfU291cmNlICovCisKKyAgdWludDMyX3QgQWN0aXZlRWRnZTsgICAgLyohPCBTZWxlY3RzIHRoZSBUcmlnZ2VyIGFjdGl2ZSBlZGdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgd2hlbiBhbiBleHRlcm5hbCB0cmlnZ2VyIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fRXh0ZXJuYWxfVHJpZ2dlcl9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IFNhbXBsZVRpbWU7ICAgIC8qITwgU2VsZWN0cyB0aGUgdHJpZ2dlciBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgY2xvY2sgZ2xpdGNoIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gYW4gZXh0ZXJuYWwgdHJpZ2dlciBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX1RyaWdnZXJfU2FtcGxlX1RpbWUgICovCit9IExQVElNX1RyaWdnZXJDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIExQVElNIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBMUFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgICAgIENsb2NrOyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBwYXJhbWV0ZXJzICovCisKKyAgTFBUSU1fVUxQQ2xvY2tDb25maWdUeXBlRGVmICBVbHRyYUxvd1Bvd2VyQ2xvY2s7ICAvKiE8IFNwZWNpZmllcyB0aGUgVWx0cmEgTG93IFBvd2VyIGNsb2NrIHBhcmFtZXRlcnMgKi8KKworICBMUFRJTV9UcmlnZ2VyQ29uZmlnVHlwZURlZiAgIFRyaWdnZXI7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUcmlnZ2VyIHBhcmFtZXRlcnMgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIE91dHB1dFBvbGFyaXR5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBPdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9PdXRwdXRfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZU1vZGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBvZiB0aGUgYXV0b3JlbG9hZCBhbmQgdGhlIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgaXMgZG9uZSBpbW1lZGlhdGVseSBvciBhZnRlciB0aGUgZW5kIG9mIGN1cnJlbnQgcGVyaW9kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fVXBkYXRpbmdfTW9kZSAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgQ291bnRlclNvdXJjZTsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBlYWNoIGludGVybmFsIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZWFjaCBleHRlcm5hbCBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0NvdW50ZXJfU291cmNlICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBJbnB1dDFTb3VyY2U7ICAgICAgICAvKiE8IFNwZWNpZmllcyBzb3VyY2Ugc2VsZWN0ZWQgZm9yIGlucHV0MSAoR1BJTyBvciBjb21wYXJhdG9yIG91dHB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9JbnB1dDFfU291cmNlICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBJbnB1dDJTb3VyY2U7ICAgICAgICAvKiE8IFNwZWNpZmllcyBzb3VyY2Ugc2VsZWN0ZWQgZm9yIGlucHV0MiAoR1BJTyBvciBjb21wYXJhdG9yIG91dHB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IGZvciBlbmNvZGVyIGZlYXR1cmUgc28gaXMgdXNlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIExQVElNMSBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX0lucHV0Ml9Tb3VyY2UgKi8KK30gTFBUSU1fSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIExQVElNIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX0xQVElNX1NUQVRFX1JFU0VUICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9MUFRJTV9TVEFURV9SRUFEWSAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAqLworICBIQUxfTFBUSU1fU1RBVEVfQlVTWSAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEFuIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9TVEFURV9FUlJPUiAgICAgICAgICAgID0gMHgwNFUgICAgIC8qITwgSW50ZXJuYWwgUHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworfSBIQUxfTFBUSU1fU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIExQVElNIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordHlwZWRlZiBzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBMUFRJTV9UeXBlRGVmICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICovCisKKyAgTFBUSU1fSW5pdFR5cGVEZWYgICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgTFBUSU0gcmVxdWlyZWQgcGFyYW1ldGVycyAqLworCisgIEhBTF9TdGF0dXNUeXBlRGVmICAgICAgICAgICAgICBTdGF0dXM7ICAgICAgICAgICAvKiE8IExQVElNIHBlcmlwaGVyYWwgc3RhdHVzICAgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBMUFRJTSBsb2NraW5nIG9iamVjdCAgICAgICovCisKKyAgX19JTyAgSEFMX0xQVElNX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAgICAgIC8qITwgTFBUSU0gcGVyaXBoZXJhbCBzdGF0ZSAgICAqLworCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAgICAgIC8qITwgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAqLworICB2b2lkICgqIENvbXBhcmVNYXRjaENhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAvKiE8IENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgIC8qITwgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBUcmlnZ2VyQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgICAgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayAgICAqLworICB2b2lkICgqIENvbXBhcmVXcml0ZUNhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAvKiE8IENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgICAgICovCisgIHZvaWQgKCogQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgIC8qITwgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBEaXJlY3Rpb25VcENhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAgLyohPCBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgICAqLworICB2b2lkICgqIERpcmVjdGlvbkRvd25DYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAvKiE8IERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICovCisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gTFBUSU1fSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgTFBUSU0gQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgICAgICAgID0gMHgwMVUsICAgIC8qITwgTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEICAgID0gMHgwMlUsICAgIC8qITwgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEID0gMHgwM1UsICAgIC8qITwgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEICAgICAgICAgID0gMHgwNFUsICAgIC8qITwgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgSUQgICAgICovCisgIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEICAgID0gMHgwNVUsICAgIC8qITwgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEID0gMHgwNlUsICAgIC8qITwgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgSUQgICovCisgIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgICAgID0gMHgwN1UsICAgIC8qITwgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRCAgICAgICAgICovCisgIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCAgID0gMHgwOFUsICAgIC8qITwgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElEICAgICAgICovCit9IEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgVElNIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBMUFRJTV9DYWxsYmFja1R5cGVEZWYpKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAvKiE8IHBvaW50ZXIgdG8gdGhlIExQVElNIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfQ29uc3RhbnRzIExQVElNIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ2xvY2tfU291cmNlIExQVElNIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX0NMT0NLU09VUkNFX0FQQkNMT0NLX0xQT1NDICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0gICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS1NFTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19QcmVzY2FsZXIgTFBUSU0gQ2xvY2sgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzAKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMCB8IExQVElNX0NGR1JfUFJFU0NfMSkKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjE2ICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMgorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMzIgICAgICAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMCB8IExQVElNX0NGR1JfUFJFU0NfMikKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjY0ICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzEgfCBMUFRJTV9DRkdSX1BSRVNDXzIpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYxMjggICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX091dHB1dF9Qb2xhcml0eSBMUFRJTSBPdXRwdXQgUG9sYXJpdHkKKyAgKiBAeworICAqLworCisjZGVmaW5lIExQVElNX09VVFBVVFBPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9PVVRQVVRQT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ2xvY2tfU2FtcGxlX1RpbWUgTFBUSU0gQ2xvY2sgU2FtcGxlIFRpbWUKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTiAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfQ0tGTFRfMAorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8xCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX0NLRkxUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0Nsb2NrX1BvbGFyaXR5IExQVElNIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgICBMUFRJTV9DRkdSX0NLUE9MXzAKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkdfRkFMTElORyAgICAgIExQVElNX0NGR1JfQ0tQT0xfMQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9UcmlnZ2VyX1NvdXJjZSBMUFRJTSBUcmlnZ2VyIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUgICAgICAgICAgICAgICAweDAwMDBGRkZGVQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8xICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8wCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMiAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzMgICAgICAgICAgICAgICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8wIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzEpCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNCAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMgorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzUgICAgICAgICAgICAgICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8wIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzIpCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfNiAgICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzEgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMikKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV83ICAgICAgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FeHRlcm5hbF9UcmlnZ2VyX1BvbGFyaXR5IExQVElNIEV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9BQ1RJVkVFREdFX1JJU0lORyAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8wCisjZGVmaW5lIExQVElNX0FDVElWRUVER0VfRkFMTElORyAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR0VOXzEKKyNkZWZpbmUgTFBUSU1fQUNUSVZFRURHRV9SSVNJTkdfRkFMTElORyAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fVHJpZ2dlcl9TYW1wbGVfVGltZSBMUFRJTSBUcmlnZ2VyIFNhbXBsZSBUaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTiAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMAorI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV80VFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8xCisjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfVFJHRkxUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX1VwZGF0aW5nX01vZGUgTFBUSU0gVXBkYXRpbmcgTW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgTFBUSU1fVVBEQVRFX0lNTUVESUFURSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX1VQREFURV9FTkRPRlBFUklPRCAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRUxPQUQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fQ291bnRlcl9Tb3VyY2UgTFBUSU0gQ291bnRlciBTb3VyY2UKKyAgKiBAeworICAqLworCisjZGVmaW5lIExQVElNX0NPVU5URVJTT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DT1VOVE1PREUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fSW5wdXQxX1NvdXJjZSBMUFRJTSBJbnB1dDEgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9JTlBVVDFTT1VSQ0VfR1BJTyAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgRm9yIExQVElNMSBhbmQgTFBUSU0yICovCisjZGVmaW5lIExQVElNX0lOUFVUMVNPVVJDRV9DT01QMSAgICAgICAgIExQVElNX09SX09SXzAgLyohPCBGb3IgTFBUSU0xIGFuZCBMUFRJTTIgKi8KKyNkZWZpbmUgTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAyICAgICAgICAgTFBUSU1fT1JfT1JfMSAvKiE8IEZvciBMUFRJTTIgKi8KKyNkZWZpbmUgTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAxX0NPTVAyICAgTFBUSU1fT1JfT1IgICAvKiE8IEZvciBMUFRJTTIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fSW5wdXQyX1NvdXJjZSBMUFRJTSBJbnB1dDIgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9JTlBVVDJTT1VSQ0VfR1BJTyAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAvKiE8IEZvciBMUFRJTTEgKi8KKyNkZWZpbmUgTFBUSU1fSU5QVVQyU09VUkNFX0NPTVAyICAgICAgICBMUFRJTV9PUl9PUl8xICAgICAgICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0xICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0ZsYWdfRGVmaW5pdGlvbiBMUFRJTSBGbGFncyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMUFRJTV9GTEFHX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9ET1dOCisjZGVmaW5lIExQVElNX0ZMQUdfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX1VQCisjZGVmaW5lIExQVElNX0ZMQUdfQVJST0sgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0FSUk9LCisjZGVmaW5lIExQVElNX0ZMQUdfQ01QT0sgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0NNUE9LCisjZGVmaW5lIExQVElNX0ZMQUdfRVhUVFJJRyAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0VYVFRSSUcKKyNkZWZpbmUgTFBUSU1fRkxBR19BUlJNICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQVJSTQorI2RlZmluZSBMUFRJTV9GTEFHX0NNUE0gICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9DTVBNCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0ludGVycnVwdHNfRGVmaW5pdGlvbiBMUFRJTSBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMUFRJTV9JVF9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9ET1dOSUUKKyNkZWZpbmUgTFBUSU1fSVRfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfVVBJRQorI2RlZmluZSBMUFRJTV9JVF9BUlJPSyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9BUlJPS0lFCisjZGVmaW5lIExQVElNX0lUX0NNUE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0NNUE9LSUUKKyNkZWZpbmUgTFBUSU1fSVRfRVhUVFJJRyAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfRVhUVFJJR0lFCisjZGVmaW5lIExQVElNX0lUX0FSUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0FSUk1JRQorI2RlZmluZSBMUFRJTV9JVF9DTVBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBNSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX01hY3JvcyBMUFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IExQVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX0xQVElNX1NUQVRFX1JFU0VUOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayAgID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRShfX0hBTkRMRV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoTFBUSU1fQ1JfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgcmVxdWlyZWQgdG8gc29sdmUgTFBUSU0gZGlzYWJsZSBIVyBsaW1pdGF0aW9uLgorICAqICAgICAgICAgUGxlYXNlIGNoZWNrIEVycmF0YSBTaGVldCBFUzAzMzUgZm9yIG1vcmUgZGV0YWlscyB1bmRlciAiTUNVIG1heSByZW1haW4KKyAgKiAgICAgICAgIHN0dWNrIGluIExQVElNIGludGVycnVwdCB3aGVuIGVudGVyaW5nIFN0b3AgbW9kZSIgc2VjdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRShfX0hBTkRMRV9fKSAgIExQVElNX0Rpc2FibGUoX19IQU5ETEVfXykKKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gcGVyaXBoZXJhbCBpbiBDb250aW51b3VzIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX0NOVFNUUlQpCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBwZXJpcGhlcmFsIGluIHNpbmdsZSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKF9fSEFORExFX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBMUFRJTV9DUl9TTkdTVFJUKQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBMUFRJTSBDb3VudGVyIHJlZ2lzdGVyIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9SRVNFVF9DT1VOVEVSKF9fSEFORExFX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBMUFRJTV9DUl9DT1VOVFJTVCkKKworLyoqCisgICogQGJyaWVmICBSZXNldCBhZnRlciByZWFkIG9mIHRoZSBMUFRJTSBDb3VudGVyIHJlZ2lzdGVyIGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fUkVTRVRfQ09VTlRFUl9BRlRFUlJFQUQoX19IQU5ETEVfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX1JTVEFSRSkKKworLyoqCisgICogQGJyaWVmICBXcml0ZSB0aGUgcGFzc2VkIHBhcmFtZXRlciBpbiB0aGUgQXV0b3JlbG9hZCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX1ZBTFVFX18gQXV0b3JlbG9hZCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChfX0hBTkRMRV9fICwgX19WQUxVRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkFSUiA9ICAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBXcml0ZSB0aGUgcGFzc2VkIHBhcmFtZXRlciBpbiB0aGUgQ29tcGFyZSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX1ZBTFVFX18gQ29tcGFyZSB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChfX0hBTkRMRV9fICwgX19WQUxVRV9fKSAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNNUCA9ICAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTFBUSU0gZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIExQVElNIGZsYWcgdG8gY2hlY2sKKyAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19BUlJPSyAgIDogQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19DTVBPSyAgIDogQ29tcGFyZSByZWdpc3RlciB1cGRhdGUgT0sgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19FWFRUUklHIDogRXh0ZXJuYWwgdHJpZ2dlciBlZGdlIGV2ZW50IEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBGbGFnLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgZmxhZyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgTFBUSU0gZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gTFBUSU0gZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19BUlJPSyAgIDogQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19DTVBPSyAgIDogQ29tcGFyZSByZWdpc3RlciB1cGRhdGUgT0sgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19FWFRUUklHIDogRXh0ZXJuYWwgdHJpZ2dlciBlZGdlIGV2ZW50IEZsYWcuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBGbGFnLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgID0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBMUFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIHNldC4KKyAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJST0sgICA6IEF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QT0sgICA6IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRVhUVFJJRyA6IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggSW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgTFBUSU0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIExQVElNIGludGVycnVwdCB0byBzZXQuCisgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZjoKKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfRE9XTiAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX1VQICAgICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk9LICAgOiBBdXRvcmVsb2FkIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE9LICAgOiBDb21wYXJlIHJlZ2lzdGVyIHVwZGF0ZSBPSyBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0VYVFRSSUcgOiBFeHRlcm5hbCB0cmlnZ2VyIGVkZ2UgZXZlbnQgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJNICAgIDogQXV0b3JlbG9hZCBtYXRjaCBJbnRlcnJ1cHQuCisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0NNUE0gICAgOiBDb21wYXJlIG1hdGNoIEludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICAmPSAofihfX0lOVEVSUlVQVF9fKSkpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIExQVElNIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIGNoZWNrLgorICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CisgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9BUlJPSyAgIDogQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBPSyAgIDogQ29tcGFyZSByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9FWFRUUklHIDogRXh0ZXJuYWwgdHJpZ2dlciBlZGdlIGV2ZW50IEludGVycnVwdC4KKyAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0LgorICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQuCisgICogQHJldHZhbCBJbnRlcnJ1cHQgc3RhdHVzLgorICAqLworCisjZGVmaW5lIF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBMUFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0luaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogTVNQIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX0xQVElNX01zcEluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX01zcERlSW5pdChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBQV00gTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPbmUgUHVsc2UgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU2V0IG9uY2UgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRW5jb2RlciBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRpbWUgb3V0ICBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDb3VudGVyIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIFJlYWRpbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBIQUxfTFBUSU1fUmVhZENvdW50ZXIoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQXV0b1JlbG9hZChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordWludDMyX3QgSEFMX0xQVElNX1JlYWRDb21wYXJlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIExQVElNIElSUSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9MUFRJTV9JUlFIYW5kbGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qIENhbGxCYWNrIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwordm9pZCBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKK3ZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7Cit2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwaHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBMUFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHBodGltLCBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9MUFRJTV9TdGF0ZVR5cGVEZWYgSEFMX0xQVElNX0dldFN0YXRlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVHlwZXMgTFBUSU0gUHJpdmF0ZSBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVmFyaWFibGVzIExQVElNIFByaXZhdGUgVmFyaWFibGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9Db25zdGFudHMgTFBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9Qcml2YXRlX01hY3JvcyBMUFRJTSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfU09VUkNFKF9fU09VUkNFX18pICAgICAgICgoKF9fU09VUkNFX18pID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MpKQorCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMSAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjIgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY0ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWOCAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjE2ICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYzMiApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWNjQgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShfX1BSRVNDQUxFUl9fKSAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMSkKKworI2RlZmluZSBJU19MUFRJTV9PVVRQVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgKCgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9PVVRQVVRQT0xBUklUWV9MT1cgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX09VVFBVVFBPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTEVUSU1FX18pID09IExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUykpCisKKyNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0NMT0NLUE9MQVJJVFlfRkFMTElORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HKSkKKworI2RlZmluZSBJU19MUFRJTV9UUkdfU09VUkNFKF9fVFJJR19fKSAgICAgICAgICAgKCgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzcpKQorCisjZGVmaW5lIElTX0xQVElNX0VYVF9UUkdfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HICAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfRkFMTElORyAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HX0ZBTExJTkcgKSkKKworI2RlZmluZSBJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICkpCisKKyNkZWZpbmUgSVNfTFBUSU1fVVBEQVRFX01PREUoX19NT0RFX18pICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBMUFRJTV9VUERBVEVfSU1NRURJQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gTFBUSU1fVVBEQVRFX0VORE9GUEVSSU9EKSkKKworI2RlZmluZSBJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgKCgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQVVUT1JFTE9BRChfX0FVVE9SRUxPQURfXykgICAgICgoX19BVVRPUkVMT0FEX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9DT01QQVJFKF9fQ09NUEFSRV9fKSAgICAgICAgICAgKChfX0NPTVBBUkVfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX1BFUklPRChfX1BFUklPRF9fKSAgICAgICAgICAgICAoKF9fUEVSSU9EX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9QVUxTRShfX1BVTFNFX18pICAgICAgICAgICAgICAgKChfX1BVTFNFX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9JTlBVVDFfU09VUkNFKF9fSU5TVEFOQ0VfXywgX19TT1VSQ0VfXykgIFwKKyAgICAoKCgoX19JTlNUQU5DRV9fKSA9PSBMUFRJTTEpICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMVNPVVJDRV9HUElPKSB8fCAgICAgICAgXAorICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDFTT1VSQ0VfQ09NUDEpKSkgICAgICAgIFwKKyAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gTFBUSU0yKSAmJiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDFTT1VSQ0VfR1BJTykgfHwgICAgICAgIFwKKyAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fSU5QVVQxU09VUkNFX0NPTVAxKSB8fCAgICAgICBcCisgICAgICAoKF9fU09VUkNFX18pID09IExQVElNX0lOUFVUMVNPVVJDRV9DT01QMikgfHwgICAgICAgXAorICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDFTT1VSQ0VfQ09NUDFfQ09NUDIpKSkpCisKKyNkZWZpbmUgSVNfTFBUSU1fSU5QVVQyX1NPVVJDRShfX0lOU1RBTkNFX18sIF9fU09VUkNFX18pICBcCisgICAgICgoKF9fSU5TVEFOQ0VfXykgPT0gTFBUSU0xKSAmJiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9JTlBVVDJTT1VSQ0VfR1BJTykgfHwgICAgICAgIFwKKyAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fSU5QVVQyU09VUkNFX0NPTVAyKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgTFBUSU1fRGlzYWJsZShMUFRJTV9IYW5kbGVUeXBlRGVmICpscHRpbSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBUSU0xIHx8IExQVElNMiAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfTFBUSU1fSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfcGNkLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9wY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTdmMTBmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfcGNkLmgKQEAgLTAsMCArMSw5NDEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3BjZC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQQ0QgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1BDRF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfUENEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF91c2IuaCIKKworI2lmIGRlZmluZWQgKFVTQikKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBDRAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9UeXBlcyBQQ0QgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBDRCBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9QQ0RfU1RBVEVfUkVTRVQgICA9IDB4MDAsCisgIEhBTF9QQ0RfU1RBVEVfUkVBRFkgICA9IDB4MDEsCisgIEhBTF9QQ0RfU1RBVEVfRVJST1IgICA9IDB4MDIsCisgIEhBTF9QQ0RfU1RBVEVfQlVTWSAgICA9IDB4MDMsCisgIEhBTF9QQ0RfU1RBVEVfVElNRU9VVCA9IDB4MDQKK30gUENEX1N0YXRlVHlwZURlZjsKKworLyogRGV2aWNlIExQTSBzdXNwZW5kIHN0YXRlICovCit0eXBlZGVmIGVudW0KK3sKKyAgTFBNX0wwID0gMHgwMCwgLyogb24gKi8KKyAgTFBNX0wxID0gMHgwMSwgLyogTFBNIEwxIHNsZWVwICovCisgIExQTV9MMiA9IDB4MDIsIC8qIHN1c3BlbmQgKi8KKyAgTFBNX0wzID0gMHgwMywgLyogb2ZmICovCit9IFBDRF9MUE1fU3RhdGVUeXBlRGVmOworCit0eXBlZGVmIGVudW0KK3sKKyAgUENEX0xQTV9MMF9BQ1RJVkUgPSAweDAwLCAvKiBvbiAqLworICBQQ0RfTFBNX0wxX0FDVElWRSA9IDB4MDEsIC8qIExQTSBMMSBzbGVlcCAqLworfSBQQ0RfTFBNX01zZ1R5cGVEZWY7CisKK3R5cGVkZWYgZW51bQoreworICBQQ0RfQkNEX0VSUk9SICAgICAgICAgICAgICAgICAgICAgPSAweEZGLAorICBQQ0RfQkNEX0NPTlRBQ1RfREVURUNUSU9OICAgICAgICAgPSAweEZFLAorICBQQ0RfQkNEX1NURF9ET1dOU1RSRUFNX1BPUlQgICAgICAgPSAweEZELAorICBQQ0RfQkNEX0NIQVJHSU5HX0RPV05TVFJFQU1fUE9SVCAgPSAweEZDLAorICBQQ0RfQkNEX0RFRElDQVRFRF9DSEFSR0lOR19QT1JUICAgPSAweEZCLAorICBQQ0RfQkNEX0RJU0NPVkVSWV9DT01QTEVURUQgICAgICAgPSAweDAwLAorCit9IFBDRF9CQ0RfTXNnVHlwZURlZjsKKworCisKKworCit0eXBlZGVmIFVTQl9UeXBlRGVmICAgICAgICBQQ0RfVHlwZURlZjsKK3R5cGVkZWYgVVNCX0NmZ1R5cGVEZWYgICAgIFBDRF9Jbml0VHlwZURlZjsKK3R5cGVkZWYgVVNCX0VQVHlwZURlZiAgICAgIFBDRF9FUFR5cGVEZWY7CisKKworLyoqCisgICogQGJyaWVmICBQQ0QgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKK3R5cGVkZWYgc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBQQ0RfVHlwZURlZiAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICovCisgIFBDRF9Jbml0VHlwZURlZiAgICAgICAgIEluaXQ7ICAgICAgICAvKiE8IFBDRCByZXF1aXJlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8KKyAgX19JTyB1aW50OF90ICAgICAgICAgICAgVVNCX0FkZHJlc3M7IC8qITwgVVNCIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworICBQQ0RfRVBUeXBlRGVmICAgICAgICAgICBJTl9lcFs4XTsgICAvKiE8IElOIGVuZHBvaW50IHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKyAgUENEX0VQVHlwZURlZiAgICAgICAgICAgT1VUX2VwWzhdOyAgLyohPCBPVVQgZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICovCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgIExvY2s7ICAgICAgICAvKiE8IFBDRCBwZXJpcGhlcmFsIHN0YXR1cyAgICAgICAgICAgICAgKi8KKyAgX19JTyBQQ0RfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgIC8qITwgUENEIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICAqLworICBfX0lPICB1aW50MzJfdCAgICAgICAgICBFcnJvckNvZGU7ICAgLyohPCBQQ0QgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgIFNldHVwWzEyXTsgICAvKiE8IFNldHVwIHBhY2tldCBidWZmZXIgICAgICAgICAgICAgICAgKi8KKyAgUENEX0xQTV9TdGF0ZVR5cGVEZWYgICAgTFBNX1N0YXRlOyAgIC8qITwgTFBNIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICBCRVNMOworCisKKyAgdWludDMyX3QgbHBtX2FjdGl2ZTsgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIExpbmsgUG93ZXIgTWFuYWdlbWVudCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICAgICAgICAqLworCisgIHVpbnQzMl90IGJhdHRlcnlfY2hhcmdpbmdfYWN0aXZlOyAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIEJhdHRlcnkgY2hhcmdpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFICAgICAgICAqLworICB2b2lkICAgICAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgLyohPCBQb2ludGVyIHRvIHVwcGVyIHN0YWNrIEhhbmRsZXIgKi8KKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIHZvaWQgKCogU09GQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIFNPRiBjYWxsYmFjayAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFNldHVwU3RhZ2VDYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0IgT1RHIFBDRCBTZXR1cCBTdGFnZSBjYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBSZXNldENhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgUmVzZXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisgIHZvaWQgKCogU3VzcGVuZENhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIFN1c3BlbmQgY2FsbGJhY2sgICAgICAgICAgICAqLworICB2b2lkICgqIFJlc3VtZUNhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0IgT1RHIFBDRCBSZXN1bWUgY2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBDb25uZWN0Q2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgQ29ubmVjdCBjYWxsYmFjayAgICAgICAgICAgICovCisgIHZvaWQgKCogRGlzY29ubmVjdENhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIERpc2Nvbm5lY3QgY2FsbGJhY2sgICAgICAgICAqLworCisgIHZvaWQgKCogRGF0YU91dFN0YWdlQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsgICAgICAvKiE8IFVTQiBPVEcgUENEIERhdGEgT1VUIFN0YWdlIGNhbGxiYWNrICAgICAqLworICB2b2lkICgqIERhdGFJblN0YWdlQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsgICAgICAgLyohPCBVU0IgT1RHIFBDRCBEYXRhIElOIFN0YWdlIGNhbGxiYWNrICAgICAgKi8KKyAgdm9pZCAoKiBJU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsgIC8qITwgVVNCIE9URyBQQ0QgSVNPIE9VVCBJbmNvbXBsZXRlIGNhbGxiYWNrICovCisgIHZvaWQgKCogSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsgICAvKiE8IFVTQiBPVEcgUENEIElTTyBJTiBJbmNvbXBsZXRlIGNhbGxiYWNrICAqLworICB2b2lkICgqIEJDRENhbGxiYWNrKShzdHJ1Y3QgX19QQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0JDRF9Nc2dUeXBlRGVmIG1zZyk7ICAgICAgLyohPCBVU0IgT1RHIFBDRCBCQ0QgY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBMUE1DYWxsYmFjaykoc3RydWN0IF9fUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9MUE1fTXNnVHlwZURlZiBtc2cpOyAgICAgIC8qITwgVVNCIE9URyBQQ0QgTFBNIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNCIE9URyBQQ0QgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1BDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBPVEcgUENEIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBQQ0RfSGFuZGxlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBQQ0QgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcGNkX2V4LmgiCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9Db25zdGFudHMgUENEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX1NwZWVkIFBDRCBTcGVlZAorICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9TUEVFRF9GVUxMICAgICAgICAgICAgICAgMlUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX1BIWV9Nb2R1bGUgUENEIFBIWSBNb2R1bGUKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfUEhZX1VMUEkgICAgICAgICAgICAgICAgIDFVCisjZGVmaW5lIFBDRF9QSFlfRU1CRURERUQgICAgICAgICAgICAgMlUKKyNkZWZpbmUgUENEX1BIWV9VVE1JICAgICAgICAgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXJyb3JfQ29kZV9kZWZpbml0aW9uIFBDRCBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFBDRCBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisjZGVmaW5lICBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX01hY3JvcyBQQ0QgRXhwb3J0ZWQgTWFjcm9zCisgKiAgQGJyaWVmIG1hY3JvcyB0byBoYW5kbGUgaW50ZXJydXB0cyBhbmQgc3BlY2lmaWMgY2xvY2sgY29uZmlndXJhdGlvbnMKKyAqIEB7CisgKi8KKworCisjZGVmaW5lIF9fSEFMX1BDRF9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpVVNCX0VuYWJsZUdsb2JhbEludCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSkKKyNkZWZpbmUgX19IQUxfUENEX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClVU0JfRGlzYWJsZUdsb2JhbEludCAoKF9fSEFORExFX18pLT5JbnN0YW5jZSkKKyNkZWZpbmUgX19IQUxfUENEX0dFVF9GTEFHKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgICAgICAgICAoKFVTQl9SZWFkSW50ZXJydXB0cygoX19IQU5ETEVfXyktPkluc3RhbmNlKSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorI2RlZmluZSBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNUUikgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworI2RlZmluZSBfX0hBTF9VU0JfV0FLRVVQX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPklNUjEgfD0gVVNCX1dBS0VVUF9FWFRJX0xJTkUKKyNkZWZpbmUgX19IQUxfVVNCX1dBS0VVUF9FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJLT5JTVIxICY9IH4oVVNCX1dBS0VVUF9FWFRJX0xJTkUpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9Jbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Nc3BEZUluaXQoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19JRF9lbnVtZXJhdGlvbl9kZWZpbml0aW9uIEhBTCBVU0IgT1RHIFBDRCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgVVNCIE9URyBQQ0QgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1BDRF9TT0ZfQ0JfSUQgICAgICAgICAgPSAweDAxLCAgICAgIC8qITwgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEICAgPSAweDAyLCAgICAgIC8qITwgVVNCIFBDRCBTZXR1cCBTdGFnZSBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1BDRF9SRVNFVF9DQl9JRCAgICAgICAgPSAweDAzLCAgICAgIC8qITwgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX1BDRF9TVVNQRU5EX0NCX0lEICAgICAgPSAweDA0LCAgICAgIC8qITwgVVNCIFBDRCBTdXNwZW5kIGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1BDRF9SRVNVTUVfQ0JfSUQgICAgICAgPSAweDA1LCAgICAgIC8qITwgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX1BDRF9DT05ORUNUX0NCX0lEICAgICAgPSAweDA2LCAgICAgIC8qITwgVVNCIFBDRCBDb25uZWN0IGNhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEICA9IDB4MDcsICAgICAgLyohPCBVU0IgUENEIERpc2Nvbm5lY3QgY2FsbGJhY2sgSUQgICAqLworCisgIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCAgICAgID0gMHgwOCwgICAgICAvKiE8IFVTQiBQQ0QgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEICAgID0gMHgwOSAgICAgICAvKiE8IFVTQiBQQ0QgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICovCisKK30gSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1BDRF9DYWxsYmFja19wb2ludGVyX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFVTQiBPVEcgUENEIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKK3R5cGVkZWYgdm9pZCAoKnBQQ0RfQ2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gVVNCIE9URyBQQ0QgY2FsbGJhY2sgZnVuY3Rpb24gICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZikoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgICAgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIERhdGEgT1VUIFN0YWdlIGNhbGxiYWNrICAgICAqLwordHlwZWRlZiB2b2lkICgqcFBDRF9EYXRhSW5TdGFnZUNhbGxiYWNrVHlwZURlZikoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pOyAgICAgICAgIC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBEYXRhIElOIFN0YWdlIGNhbGxiYWNrICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfSXNvT3V0SW5jcGx0Q2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7ICAgICAgICAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgSVNPIE9VVCBJbmNvbXBsZXRlIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7ICAgICAgICAgLyohPCBwb2ludGVyIHRvIFVTQiBPVEcgUENEIElTTyBJTiBJbmNvbXBsZXRlIGNhbGxiYWNrICAqLwordHlwZWRlZiB2b2lkICgqcFBDRF9McG1DYWxsYmFja1R5cGVEZWYpKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBQQ0RfTFBNX01zZ1R5cGVEZWYgbXNnKTsgICAgICAgIC8qITwgcG9pbnRlciB0byBVU0IgT1RHIFBDRCBMUE0gY2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdm9pZCAoKnBQQ0RfQmNkQ2FsbGJhY2tUeXBlRGVmKShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0JDRF9Nc2dUeXBlRGVmIG1zZyk7ICAgICAgICAvKiE8IHBvaW50ZXIgdG8gVVNCIE9URyBQQ0QgQkNEIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUENEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJEYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgcFBDRF9EYXRhT3V0U3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVySXNvT3V0SW5jcGx0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfSXNvT3V0SW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckJjZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0JjZENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVyQmNkQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJMcG1DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU3RvcChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfSVJRSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDRF9TT0ZDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK3ZvaWQgSEFMX1BDRF9Db25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOwordm9pZCBIQUxfUENEX0Rpc2Nvbm5lY3RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7Cit2b2lkIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7Cit2b2lkIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwbnVtKTsKK3ZvaWQgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZDb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2RGlzY29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1NldEFkZHJlc3MoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgYWRkcmVzcyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pOwordWludDMyX3QgICAgICAgICAgSEFMX1BDRF9FUF9HZXRSeENvdW50KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9TZXRTdGFsbChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX0ZsdXNoKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9BY3RpdmF0ZVJlbW90ZVdha2V1cChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCitQQ0RfU3RhdGVUeXBlRGVmIEhBTF9QQ0RfR2V0U3RhdGUoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfQ29uc3RhbnRzIFBDRCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFVTQl9FWFRJX0xpbmVfSW50ZXJydXB0IFVTQiBFWFRJIGxpbmUgaW50ZXJydXB0CisgICogQHsKKyAgKi8KKworCisjZGVmaW5lICBVU0JfV0FLRVVQX0VYVElfTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MVUgPDwgMjgpICAvKiE8IFVTQiBGUyBFWFRJIExpbmUgV2FrZVVwIEludGVycnVwdCAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VQMF9NUFMgUENEIEVQMCBNUFMKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfRVAwTVBTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUDBDVExfTVBTXzY0CisjZGVmaW5lIFBDRF9FUDBNUFNfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVQMENUTF9NUFNfMzIKKyNkZWZpbmUgUENEX0VQME1QU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVAwQ1RMX01QU18xNgorI2RlZmluZSBQQ0RfRVAwTVBTXzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUDBDVExfTVBTXzgKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VORFAgUENEIEVORFAKKyAgKiBAeworICAqLworI2RlZmluZSBQQ0RfRU5EUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIFBDRF9FTkRQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgUENEX0VORFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBQQ0RfRU5EUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNVCisjZGVmaW5lIFBDRF9FTkRQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNFUKKyNkZWZpbmUgUENEX0VORFA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1VQorI2RlZmluZSBQQ0RfRU5EUDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDZVCisjZGVmaW5lIFBDRF9FTkRQNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgN1UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0VORFBfS2luZCBQQ0QgRW5kcG9pbnQgS2luZAorICAqIEB7CisgICovCisjZGVmaW5lIFBDRF9TTkdfQlVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgUENEX0RCTF9CVUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUENEX1ByaXZhdGVfTWFjcm9zIFBDRCBQcml2YXRlIE1hY3JvcworICogQHsKKyAqLworCisvKioqKioqKioqKioqKioqKioqKiogIEJpdCBkZWZpbml0aW9uIGZvciBVU0JfQ09VTlRuX1JYIHJlZ2lzdGVyICAqKioqKioqKioqKioqLworI2RlZmluZSBVU0JfQ05UUlhfTkJMS19NU0sgICAgICAgICAgICAgICAgICAgICgweDFGVSA8PCAxMCkKKyNkZWZpbmUgVVNCX0NOVFJYX0JMU0laRSAgICAgICAgICAgICAgICAgICAgICAoMHgxVSA8PCAxNSkKKworLyogU2V0RU5EUE9JTlQgKi8KKyNkZWZpbmUgUENEX1NFVF9FTkRQT0lOVChVU0J4LCBiRXBOdW0sIHdSZWdWYWx1ZSkgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkgPSAodWludDE2X3QpKHdSZWdWYWx1ZSkpCisKKy8qIEdldEVORFBPSU5UICovCisjZGVmaW5lIFBDRF9HRVRfRU5EUE9JTlQoVVNCeCwgYkVwTnVtKSAgICAgICAgICAgICgqKF9fSU8gdWludDE2X3QgKikoJihVU0J4KS0+RVAwUiArICgoYkVwTnVtKSAqIDJVKSkpCisKKy8qIEVORFBPSU5UIHRyYW5zZmVyICovCisjZGVmaW5lIFVTQl9FUDBTdGFydFhmZXIgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9FUFN0YXJ0WGZlcgorCisvKioKKyAgKiBAYnJpZWYgIHNldHMgdGhlIHR5cGUgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyKGJpdHMgRVBfVFlQRVsxOjBdKQorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdUeXBlIEVuZHBvaW50IFR5cGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBUWVBFKFVTQngsIGJFcE51bSwgd1R5cGUpIChQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUF9UX01BU0spIHwgKHdUeXBlKSB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfQ1RSX1JYKSkpCisKKy8qKgorICAqIEBicmllZiAgZ2V0cyB0aGUgdHlwZSBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIoYml0cyBFUF9UWVBFWzE6MF0pCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgRW5kcG9pbnQgVHlwZQorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQVFlQRShVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQX1RfRklFTEQpCisKKy8qKgorICAqIEBicmllZiBmcmVlIGJ1ZmZlciB1c2VkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJlYWxpemluZyBpdCB0byB0aGUgbGluZQorICAqICAgICAgICAgdG9nZ2xlcyBiaXQgU1dfQlVGIGluIHRoZSBkb3VibGUgYnVmZmVyZWQgZW5kcG9pbnQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gVVNCeCBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgIGJFcE51bSwgYkRpcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfRnJlZVVzZXJCdWZmZXIoVVNCeCwgYkVwTnVtLCBiRGlyKSBkbyB7IFwKKyAgaWYgKChiRGlyKSA9PSAwVSkgXAorICB7IFwKKyAgICAvKiBPVVQgZG91YmxlIGJ1ZmZlcmVkIGVuZHBvaW50ICovIFwKKyAgICBQQ0RfVFhfRFRPRygoVVNCeCksIChiRXBOdW0pKTsgXAorICB9IFwKKyAgZWxzZSBpZiAoKGJEaXIpID09IDFVKSBcCisgIHsgXAorICAgIC8qIElOIGRvdWJsZSBidWZmZXJlZCBlbmRwb2ludCAqLyBcCisgICAgUENEX1JYX0RUT0coKFVTQngpLCAoYkVwTnVtKSk7IFwKKyAgfSBcCit9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgc2V0cyB0aGUgc3RhdHVzIGZvciB0eCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0pLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdTdGF0ZSBuZXcgc3RhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgYkVwTnVtLCB3U3RhdGUpIGRvIHsgXAorICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBUWF9EVE9HTUFTSzsgXAorICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovIFwKKyAgIGlmICgoVVNCX0VQVFhfRFRPRzEgJiAod1N0YXRlKSkhPSAwVSkgXAorICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMTsgXAorICAgfSBcCisgICAvKiB0b2dnbGUgc2Vjb25kIGJpdCA/ICAqLyBcCisgICBpZiAoKFVTQl9FUFRYX0RUT0cyICYgKHdTdGF0ZSkpIT0gMFUpIFwKKyAgIHsgXAorICAgICAgX3dSZWdWYWwgXj0gVVNCX0VQVFhfRFRPRzI7IFwKKyAgIH0gXAorICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9UWF9TVEFUVVMgKi8KKworLyoqCisgICogQGJyaWVmICBzZXRzIHRoZSBzdGF0dXMgZm9yIHJ4IHRyYW5zZmVyIChiaXRzIFNUQVRfVFhbMTowXSkKKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3U3RhdGUgbmV3IHN0YXRlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGJFcE51bSx3U3RhdGUpIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX0RUT0dNQVNLOyBcCisgICAgLyogdG9nZ2xlIGZpcnN0IGJpdCA/ICovIFwKKyAgICBpZiAoKFVTQl9FUFJYX0RUT0cxICYgKHdTdGF0ZSkpIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMTsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlKSkhPSAwVSkgXAorICAgIHsgXAorICAgICAgIF93UmVnVmFsIF49IFVTQl9FUFJYX0RUT0cyOyBcCisgICAgfSBcCisgICAgUENEX1NFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pLCAoX3dSZWdWYWwgfCBVU0JfRVBfQ1RSX1JYIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9SWF9TVEFUVVMgKi8KKworLyoqCisgICogQGJyaWVmICBzZXRzIHRoZSBzdGF0dXMgZm9yIHJ4ICYgdHggKGJpdHMgU1RBVF9UWFsxOjBdICYgU1RBVF9SWFsxOjBdKQorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdTdGF0ZXJ4IG5ldyBzdGF0ZS4KKyAgKiBAcGFyYW0gIHdTdGF0ZXR4IG5ldyBzdGF0ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9UWFJYX1NUQVRVUyhVU0J4LCBiRXBOdW0sIHdTdGF0ZXJ4LCB3U3RhdGV0eCkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgKFVTQl9FUFJYX0RUT0dNQVNLIHwgVVNCX0VQVFhfU1RBVCk7IFwKKyAgICAvKiB0b2dnbGUgZmlyc3QgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzEgJiAod1N0YXRlcngpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMTsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBzZWNvbmQgYml0ID8gKi8gXAorICAgIGlmICgoVVNCX0VQUlhfRFRPRzIgJiAod1N0YXRlcngpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBSWF9EVE9HMjsgXAorICAgIH0gXAorICAgIC8qIHRvZ2dsZSBmaXJzdCBiaXQgPyAqLyBcCisgICAgaWYgKChVU0JfRVBUWF9EVE9HMSAmICh3U3RhdGV0eCkpIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgIF93UmVnVmFsIF49IFVTQl9FUFRYX0RUT0cxOyBcCisgICAgfSBcCisgICAgLyogdG9nZ2xlIHNlY29uZCBiaXQgPyAgKi8gXAorICAgIGlmICgoVVNCX0VQVFhfRFRPRzIgJiAod1N0YXRldHgpKSE9IDBVKSBcCisgICAgeyBcCisgICAgICBfd1JlZ1ZhbCBePSBVU0JfRVBUWF9EVE9HMjsgXAorICAgIH0gXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYKSk7IFwKKyAgfSB3aGlsZSgwKSAvKiBQQ0RfU0VUX0VQX1RYUlhfU1RBVFVTICovCisKKy8qKgorICAqIEBicmllZiAgZ2V0cyB0aGUgc3RhdHVzIGZvciB0eC9yeCB0cmFuc2ZlciAoYml0cyBTVEFUX1RYWzE6MF0KKyAgKiAgICAgICAgIC9TVEFUX1JYWzE6MF0pCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFRYX1NUQVQpCisjZGVmaW5lIFBDRF9HRVRfRVBfUlhfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICgodWludDE2X3QpUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUFJYX1NUQVQpCisKKy8qKgorICAqIEBicmllZiAgc2V0cyBkaXJlY3RseSB0aGUgVkFMSUQgdHgvcngtc3RhdHVzIGludG8gdGhlIGVuZHBvaW50IHJlZ2lzdGVyCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX1RYX1ZBTElEKFVTQngsIGJFcE51bSkgICAgICAoUENEX1NFVF9FUF9UWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSwgVVNCX0VQX1RYX1ZBTElEKSkKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9WQUxJRChVU0J4LCBiRXBOdW0pICAgICAgKFBDRF9TRVRfRVBfUlhfU1RBVFVTKChVU0J4KSwgKGJFcE51bSksIFVTQl9FUF9SWF9WQUxJRCkpCisKKy8qKgorICAqIEBicmllZiAgY2hlY2tzIHN0YWxsIGNvbmRpdGlvbiBpbiBhbiBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBUUlVFID0gZW5kcG9pbnQgaW4gc3RhbGwgY29uZGl0aW9uLgorICAqLworI2RlZmluZSBQQ0RfR0VUX0VQX1RYX1NUQUxMX1NUQVRVUyhVU0J4LCBiRXBOdW0pIChQQ0RfR0VUX0VQX1RYX1NUQVRVUygoVVNCeCksIChiRXBOdW0pKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9FUF9UWF9TVEFMTCkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9TVEFMTF9TVEFUVVMoVVNCeCwgYkVwTnVtKSAoUENEX0dFVF9FUF9SWF9TVEFUVVMoKFVTQngpLCAoYkVwTnVtKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBVU0JfRVBfUlhfU1RBTEwpCisKKy8qKgorICAqIEBicmllZiAgc2V0ICYgY2xlYXIgRVBfS0lORCBiaXQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0tJTkQoVVNCeCwgYkVwTnVtKSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MTZfdCBfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlggfCBVU0JfRVBfQ1RSX1RYIHwgVVNCX0VQX0tJTkQpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfS0lORCAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9FUF9LSU5EKFVTQngsIGJFcE51bSkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDE2X3QgX3dSZWdWYWw7IFwKKyAgICBcCisgICAgX3dSZWdWYWwgPSBQQ0RfR0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSkpICYgVVNCX0VQS0lORF9NQVNLOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9DTEVBUl9FUF9LSU5EICovCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgU1RBVFVTX09VVCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgICAgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9PVVRfU1RBVFVTKFVTQngsIGJFcE51bSkgICAgIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0cy9jbGVhcnMgZGlyZWN0bHkgRVBfS0lORCBiaXQgaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGKFVTQngsIGJFcE51bSkgICAgICAgICAgUENEX1NFVF9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisjZGVmaW5lIFBDRF9DTEVBUl9FUF9EQlVGKFVTQngsIGJFcE51bSkgICAgICAgIFBDRF9DTEVBUl9FUF9LSU5EKChVU0J4KSwgKGJFcE51bSkpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIGJpdCBDVFJfUlggLyBDVFJfVFggaW4gdGhlIGVuZHBvaW50IHJlZ2lzdGVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0NMRUFSX1JYX0VQX0NUUihVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmICgweDdGRkZVICYgVVNCX0VQUkVHX01BU0spOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1JYX0VQX0NUUiAqLworCisjZGVmaW5lIFBDRF9DTEVBUl9UWF9FUF9DVFIoVVNCeCwgYkVwTnVtKSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MTZfdCBfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ1ZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiAoMHhGRjdGVSAmIFVTQl9FUFJFR19NQVNLKTsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd1JlZ1ZhbCB8IFVTQl9FUF9DVFJfUlgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9DTEVBUl9UWF9FUF9DVFIgKi8KKworLyoqCisgICogQGJyaWVmICBUb2dnbGVzIERUT0dfUlggLyBEVE9HX1RYIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfUlhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93RVBWYWw7IFwKKyAgICBcCisgICAgX3dFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd0VQVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfRFRPR19SWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1JYX0RUT0cgKi8KKworI2RlZmluZSBQQ0RfVFhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93RVBWYWw7IFwKKyAgICBcCisgICAgX3dFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSzsgXAorICAgIFwKKyAgICBQQ0RfU0VUX0VORFBPSU5UKChVU0J4KSwgKGJFcE51bSksIChfd0VQVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFggfCBVU0JfRVBfRFRPR19UWCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1RYX0RUT0cgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXJzIERUT0dfUlggLyBEVE9HX1RYIGJpdCBpbiB0aGUgZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKTsgXAorICAgIFwKKyAgICBpZiAoKF93UmVnVmFsICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKVwKKyAgICB7IFwKKyAgICAgIFBDRF9SWF9EVE9HKChVU0J4KSwgKGJFcE51bSkpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1JYX0RUT0cgKi8KKworI2RlZmluZSBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBiRXBOdW0pIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKTsgXAorICAgIFwKKyAgICBpZiAoKF93UmVnVmFsICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKVwKKyAgICB7IFwKKyAgICAgIFBDRF9UWF9EVE9HKChVU0J4KSwgKGJFcE51bSkpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NMRUFSX1RYX0RUT0cgKi8KKworLyoqCisgICogQGJyaWVmICBTZXRzIGFkZHJlc3MgaW4gYW4gZW5kcG9pbnQgcmVnaXN0ZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkFkZHIgQWRkcmVzcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9BRERSRVNTKFVTQngsIGJFcE51bSwgYkFkZHIpIGRvIHsgXAorICAgIHJlZ2lzdGVyIHVpbnQxNl90IF93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnVmFsID0gKFBDRF9HRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSkgJiBVU0JfRVBSRUdfTUFTSykgfCAoYkFkZHIpOyBcCisgICAgXAorICAgIFBDRF9TRVRfRU5EUE9JTlQoKFVTQngpLCAoYkVwTnVtKSwgKF93UmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfQUREUkVTUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldHMgYWRkcmVzcyBpbiBhbiBlbmRwb2ludCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDhfdCkoUENEX0dFVF9FTkRQT0lOVCgoVVNCeCksIChiRXBOdW0pKSAmIFVTQl9FUEFERFJfRklFTEQpKQorCisjZGVmaW5lIFBDRF9FUF9UWF9DTlQoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90ICopKCgoKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFICsgKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDJVKSAqIFBNQV9BQ0NFU1MpICsgKCh1aW50MzJfdCkoVVNCeCkgKyAweDQwMFUpKSkKKyNkZWZpbmUgUENEX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0pICgodWludDE2X3QgKikoKCgodWludDMyX3QpKFVTQngpLT5CVEFCTEUgKyAoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogUE1BX0FDQ0VTUykgKyAoKHVpbnQzMl90KShVU0J4KSArIDB4NDAwVSkpKQorCisvKioKKyAgKiBAYnJpZWYgIHNldHMgYWRkcmVzcyBvZiB0aGUgdHgvcnggYnVmZmVyLgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcGFyYW0gIHdBZGRyIGFkZHJlc3MgdG8gYmUgc2V0IChtdXN0IGJlIHdvcmQgYWxpZ25lZCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBiRXBOdW0sIHdBZGRyKSBkbyB7IFwKKyAgcmVnaXN0ZXIgdWludDE2X3QgKl93UmVnVmFsOyBcCisgIHJlZ2lzdGVyIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdClVU0J4OyBcCisgIFwKKyAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAqX3dSZWdWYWwgPSAoKHdBZGRyKSA+PiAxKSA8PCAxOyBcCit9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfVFhfQUREUkVTUyAqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfUlhfQUREUkVTUyhVU0J4LCBiRXBOdW0sIHdBZGRyKSBkbyB7IFwKKyAgcmVnaXN0ZXIgdWludDE2X3QgKl93UmVnVmFsOyBcCisgIHJlZ2lzdGVyIHVpbnQzMl90IF93UmVnQmFzZSA9ICh1aW50MzJfdClVU0J4OyBcCisgIFwKKyAgX3dSZWdCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyA0VSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgKl93UmVnVmFsID0gKCh3QWRkcikgPj4gMSkgPDwgMTsgXAorfSB3aGlsZSgwKSAvKiBQQ0RfU0VUX0VQX1JYX0FERFJFU1MgKi8KKworLyoqCisgICogQGJyaWVmICBHZXRzIGFkZHJlc3Mgb2YgdGhlIHR4L3J4IGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfQUREUkVTUyhVU0J4LCBiRXBOdW0pICgodWludDE2X3QpKlBDRF9FUF9UWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSkpKQorI2RlZmluZSBQQ0RfR0VUX0VQX1JYX0FERFJFU1MoVVNCeCwgYkVwTnVtKSAoKHVpbnQxNl90KSpQQ0RfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgICogQGJyaWVmICBTZXRzIGNvdW50ZXIgb2YgcnggYnVmZmVyIHdpdGggbm8uIG9mIGJsb2Nrcy4KKyAgKiBAcGFyYW0gIHBkd1JlZyBSZWdpc3RlciBwb2ludGVyCisgICogQHBhcmFtICB3Q291bnQgQ291bnRlci4KKyAgKiBAcGFyYW0gIHdOQmxvY2tzIG5vLiBvZiBCbG9ja3MuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9DQUxDX0JMSzMyKHBkd1JlZywgd0NvdW50LCB3TkJsb2NrcykgZG8geyBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDU7IFwKKyAgICAqKHBkd1JlZykgPSAodWludDE2X3QpKCgod05CbG9ja3MpIDw8IDEwKSB8IFVTQl9DTlRSWF9CTFNJWkUpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX0NBTENfQkxLMzIgKi8KKworI2RlZmluZSBQQ0RfQ0FMQ19CTEsyKHBkd1JlZywgd0NvdW50LCB3TkJsb2NrcykgZG8geyBcCisgICAgKHdOQmxvY2tzKSA9ICh3Q291bnQpID4+IDE7IFwKKyAgICBpZiAoKCh3Q291bnQpICYgMHgxVSkgIT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICh3TkJsb2NrcykrKzsgXAorICAgIH0gXAorICAgICoocGR3UmVnKSA9ICh1aW50MTZfdCkoKHdOQmxvY2tzKSA8PCAxMCk7IFwKKyAgfSB3aGlsZSgwKSAvKiBQQ0RfQ0FMQ19CTEsyICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9DTlRfUlhfUkVHKHBkd1JlZywgd0NvdW50KSAgZG8geyBcCisgICAgdWludDMyX3Qgd05CbG9ja3M7IFwKKyAgICBpZiAoKHdDb3VudCkgPT0gMFUpIFwKKyAgICB7IFwKKyAgICAgICoocGR3UmVnKSAmPSAodWludDE2X3QpflVTQl9DTlRSWF9OQkxLX01TSzsgXAorICAgICAgKihwZHdSZWcpIHw9IFVTQl9DTlRSWF9CTFNJWkU7IFwKKyAgICB9IFwKKyAgICBlbHNlIGlmKCh3Q291bnQpIDwgNjJVKSBcCisgICAgeyBcCisgICAgICBQQ0RfQ0FMQ19CTEsyKChwZHdSZWcpLCAod0NvdW50KSwgd05CbG9ja3MpOyBcCisgICAgfSBcCisgICAgZWxzZSBcCisgICAgeyBcCisgICAgICBQQ0RfQ0FMQ19CTEszMigocGR3UmVnKSwod0NvdW50KSwgd05CbG9ja3MpOyBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9DTlRfUlhfUkVHICovCisKKyNkZWZpbmUgUENEX1NFVF9FUF9SWF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCB3Q291bnQpIGRvIHsgXAorICAgICByZWdpc3RlciB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgIHVpbnQxNl90ICpwZHdSZWc7IFwKKyAgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7IFwKKyAgICBwZHdSZWcgPSAodWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgMlUpICogUE1BX0FDQ0VTUykpOyBcCisgICAgUENEX1NFVF9FUF9DTlRfUlhfUkVHKHBkd1JlZywgKHdDb3VudCkpOyBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBzZXRzIGNvdW50ZXIgZm9yIHRoZSB0eC9yeCBidWZmZXIuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgd0NvdW50IENvdW50ZXIgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9TRVRfRVBfVFhfQ05UKFVTQngsIGJFcE51bSwgd0NvdW50KSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MzJfdCBfd1JlZ0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgdWludDE2X3QgKl93UmVnVmFsOyBcCisgICAgXAorICAgIF93UmVnQmFzZSArPSAodWludDMyX3QpKFVTQngpLT5CVEFCTEU7IFwKKyAgICBfd1JlZ1ZhbCA9ICh1aW50MTZfdCAqKShfd1JlZ0Jhc2UgKyAweDQwMFUgKyAoKCgodWludDMyX3QpKGJFcE51bSkgKiA4VSkgKyAyVSkgKiBQTUFfQUNDRVNTKSk7IFwKKyAgICAqX3dSZWdWYWwgPSAodWludDE2X3QpKHdDb3VudCk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBQQ0RfU0VUX0VQX1JYX0NOVChVU0J4LCBiRXBOdW0sIHdDb3VudCkgZG8geyBcCisgICAgcmVnaXN0ZXIgdWludDMyX3QgX3dSZWdCYXNlID0gKHVpbnQzMl90KShVU0J4KTsgXAorICAgIHVpbnQxNl90ICpfd1JlZ1ZhbDsgXAorICAgIFwKKyAgICBfd1JlZ0Jhc2UgKz0gKHVpbnQzMl90KShVU0J4KS0+QlRBQkxFOyBcCisgICAgX3dSZWdWYWwgPSAodWludDE2X3QgKikoX3dSZWdCYXNlICsgMHg0MDBVICsgKCgoKHVpbnQzMl90KShiRXBOdW0pICogOFUpICsgNlUpICogUE1BX0FDQ0VTUykpOyBcCisgICAgUENEX1NFVF9FUF9DTlRfUlhfUkVHKF93UmVnVmFsLCAod0NvdW50KSk7IFwKK30gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBnZXRzIGNvdW50ZXIgb2YgdGhlIHR4IGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfVFhfQ05UKFVTQngsIGJFcE51bSkgICAgICAgICgodWludDMyX3QpKCpQQ0RfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSkpKSAmIDB4M2ZmVSkKKyNkZWZpbmUgUENEX0dFVF9FUF9SWF9DTlQoVVNCeCwgYkVwTnVtKSAgICAgICAgKCh1aW50MzJfdCkoKlBDRF9FUF9SWF9DTlQoKFVTQngpLCAoYkVwTnVtKSkpICYgMHgzZmZVKQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgYnVmZmVyIDAvMSBhZGRyZXNzIGluIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3QnVmMEFkZHIgYnVmZmVyIDAgYWRkcmVzcy4KKyAgKiBAcmV0dmFsIENvdW50ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSwgd0J1ZjBBZGRyKSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX1RYX0FERFJFU1MoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYwQWRkcikpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9EQlVGMF9BRERSICovCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQUREUihVU0J4LCBiRXBOdW0sIHdCdWYxQWRkcikgZG8geyBcCisgICAgUENEX1NFVF9FUF9SWF9BRERSRVNTKChVU0J4KSwgKGJFcE51bSksICh3QnVmMUFkZHIpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfREJVRjFfQUREUiAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldHMgYWRkcmVzc2VzIGluIGEgZG91YmxlIGJ1ZmZlciBlbmRwb2ludC4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHBhcmFtICB3QnVmMEFkZHI6IGJ1ZmZlciAwIGFkZHJlc3MuCisgICogQHBhcmFtICB3QnVmMUFkZHIgPSBidWZmZXIgMSBhZGRyZXNzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQUREUihVU0J4LCBiRXBOdW0sIHdCdWYwQWRkciwgd0J1ZjFBZGRyKSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYwX0FERFIoKFVTQngpLCAoYkVwTnVtKSwgKHdCdWYwQWRkcikpOyBcCisgICAgUENEX1NFVF9FUF9EQlVGMV9BRERSKChVU0J4KSwgKGJFcE51bSksICh3QnVmMUFkZHIpKTsgXAorICB9IHdoaWxlKDApIC8qIFBDRF9TRVRfRVBfREJVRl9BRERSICovCisKKy8qKgorICAqIEBicmllZiAgR2V0cyBidWZmZXIgMC8xIGFkZHJlc3Mgb2YgYSBkb3VibGUgYnVmZmVyIGVuZHBvaW50LgorICAqIEBwYXJhbSAgVVNCeCBVU0IgcGVyaXBoZXJhbCBpbnN0YW5jZSByZWdpc3RlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgYkVwTnVtIEVuZHBvaW50IE51bWJlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMF9BRERSKFVTQngsIGJFcE51bSkgICAgKFBDRF9HRVRfRVBfVFhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9BRERSKFVTQngsIGJFcE51bSkgICAgKFBDRF9HRVRfRVBfUlhfQUREUkVTUygoVVNCeCksIChiRXBOdW0pKSkKKworLyoqCisgICogQGJyaWVmICBHZXRzIGJ1ZmZlciAwLzEgYWRkcmVzcyBvZiBhIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQuCisgICogQHBhcmFtICBVU0J4IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICBiRXBOdW0gRW5kcG9pbnQgTnVtYmVyLgorICAqIEBwYXJhbSAgYkRpciBlbmRwb2ludCBkaXIgIEVQX0RCVUZfT1VUID0gT1VUCisgICogICAgICAgICBFUF9EQlVGX0lOICA9IElOCisgICogQHBhcmFtICB3Q291bnQ6IENvdW50ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgYkVwTnVtLCBiRGlyLCB3Q291bnQpIGRvIHsgXAorICAgIGlmICgoYkRpcikgPT0gMFUpIFwKKyAgICAgIC8qIE9VVCBlbmRwb2ludCAqLyBcCisgICAgeyBcCisgICAgICBQQ0RfU0VUX0VQX1JYX0RCVUYwX0NOVCgoVVNCeCksIChiRXBOdW0pLCAod0NvdW50KSk7IFwKKyAgICB9IFwKKyAgICBlbHNlIFwKKyAgICB7IFwKKyAgICAgIGlmICgoYkRpcikgPT0gMVUpIFwKKyAgICAgIHsgXAorICAgICAgICAvKiBJTiBlbmRwb2ludCAqLyBcCisgICAgICAgIFBDRF9TRVRfRVBfVFhfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogU2V0RVBEYmxCdWYwQ291bnQqLworCisjZGVmaW5lIFBDRF9TRVRfRVBfREJVRjFfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSBkbyB7IFwKKyAgICByZWdpc3RlciB1aW50MzJfdCBfd0Jhc2UgPSAodWludDMyX3QpKFVTQngpOyBcCisgICAgdWludDE2X3QgKl93RVBSZWdWYWw7IFwKKyAgICBcCisgICAgaWYgKChiRGlyKSA9PSAwVSkgXAorICAgIHsgXAorICAgICAgLyogT1VUIGVuZHBvaW50ICovIFwKKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSksICh3Q291bnQpKTsgXAorICAgIH0gXAorICAgIGVsc2UgXAorICAgIHsgXAorICAgICAgaWYgKChiRGlyKSA9PSAxVSkgXAorICAgICAgeyBcCisgICAgICAgIC8qIElOIGVuZHBvaW50ICovIFwKKyAgICAgICAgX3dCYXNlICs9ICh1aW50MzJfdCkoVVNCeCktPkJUQUJMRTsgXAorICAgICAgICBfd0VQUmVnVmFsID0gKHVpbnQxNl90ICopKF93QmFzZSArIDB4NDAwVSArICgoKCh1aW50MzJfdCkoYkVwTnVtKSAqIDhVKSArIDZVKSAqIFBNQV9BQ0NFU1MpKTsgXAorICAgICAgICAqX3dFUFJlZ1ZhbCA9ICh1aW50MTZfdCkod0NvdW50KTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkgLyogU2V0RVBEYmxCdWYxQ291bnQgKi8KKworI2RlZmluZSBQQ0RfU0VUX0VQX0RCVUZfQ05UKFVTQngsIGJFcE51bSwgYkRpciwgd0NvdW50KSBkbyB7IFwKKyAgICBQQ0RfU0VUX0VQX0RCVUYwX0NOVCgoVVNCeCksIChiRXBOdW0pLCAoYkRpciksICh3Q291bnQpKTsgXAorICAgIFBDRF9TRVRfRVBfREJVRjFfQ05UKChVU0J4KSwgKGJFcE51bSksIChiRGlyKSwgKHdDb3VudCkpOyBcCisgIH0gd2hpbGUoMCkgLyogUENEX1NFVF9FUF9EQlVGX0NOVCAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXRzIGJ1ZmZlciAwLzEgcngvdHggY291bnRlciBmb3IgZG91YmxlIGJ1ZmZlcmluZy4KKyAgKiBAcGFyYW0gIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGJFcE51bSBFbmRwb2ludCBOdW1iZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFBDRF9HRVRfRVBfREJVRjBfQ05UKFVTQngsIGJFcE51bSkgICAgIChQQ0RfR0VUX0VQX1RYX0NOVCgoVVNCeCksIChiRXBOdW0pKSkKKyNkZWZpbmUgUENEX0dFVF9FUF9EQlVGMV9DTlQoVVNCeCwgYkVwTnVtKSAgICAgKFBDRF9HRVRfRVBfUlhfQ05UKChVU0J4KSwgKGJFcE51bSkpKQorCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChVU0IpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1BDRF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9wY2RfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX3BjZF9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9wY2RfZXguaApAQCAtMCwwICsxLDkzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9wY2RfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUENEIEhBTCBFeHRlbnNpb24gbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfUENEX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9QQ0RfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQgKFVTQikKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQQ0RFeAorICAqIEB7CisgICovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQQ0RFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBhZGR0b2dyb3VwIFBDREV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKworCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX1BDREV4X1BNQUNvbmZpZyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVwX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9raW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG1hYWRyZXNzKTsKKworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0RlQWN0aXZhdGVMUE0oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpOworCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9BY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfRGVBY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7Cit2b2lkIEhBTF9QQ0RFeF9CQ0RfVkJVU0RldGVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKK3ZvaWQgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZyk7Cit2b2lkIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9QQ0RfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfcGthLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9wa2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ3OTUyCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfcGthLmgKQEAgLTAsMCArMSw1NTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3BrYS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQS0EgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1BLQV9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfUEtBX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICogQHsKKyAqLworCisjaWYgZGVmaW5lZChQS0EpICYmIGRlZmluZWQoSEFMX1BLQV9NT0RVTEVfRU5BQkxFRCkKKworLyoqIEBhZGR0b2dyb3VwIFBLQQorICogQHsKKyAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQS0FfRXhwb3J0ZWRfVHlwZXMgUEtBIEV4cG9ydGVkIFR5cGVzCisgKiBAeworICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX3N0YXRlX3N0cnVjdHVyZV9kZWZpbml0aW9uIEhBTCBzdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1BLQV9TVEFURV9SRVNFVCAgID0gMHgwMFUsICAvKiE8IFBLQSBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLworICBIQUxfUEtBX1NUQVRFX1JFQURZICAgPSAweDAxVSwgIC8qITwgUEtBIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9QS0FfU1RBVEVfQlVTWSAgICA9IDB4MDJVLCAgLyohPCBQS0EgaW50ZXJuYWwgcHJvY2Vzc2luZyBpcyBvbmdvaW5nICAgKi8KKyAgSEFMX1BLQV9TVEFURV9FUlJPUiAgID0gMHgwM1UsICAvKiE8IFBLQSBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworfQorSEFMX1BLQV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiAoVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKiogQGRlZmdyb3VwIEhBTF9jYWxsYmFja19pZCBIQUwgY2FsbGJhY2sgSUQgZW51bWVyYXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9QS0FfT1BFUkFUSU9OX0NPTVBMRVRFX0NCX0lEICAgICAgPSAweDAwVSwgICAgLyohPCBQS0EgRW5kIG9mIG9wZXJhdGlvbiBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1BLQV9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFBLQSBFcnJvciBjYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfUEtBX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgUEtBIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9QS0FfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDAzVSAgICAgLyohPCBQS0EgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgKi8KK30gSEFMX1BLQV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKiogQGRlZmdyb3VwIFBLQV9FcnJvcl9Db2RlX2RlZmluaXRpb24gUEtBIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgUEtBIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9QS0FfRVJST1JfTk9ORSAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgSEFMX1BLQV9FUlJPUl9BRERSRVJSICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBIQUxfUEtBX0VSUk9SX1JBTUVSUiAgICAoMHgwMDAwMDAwMlUpCisjZGVmaW5lIEhBTF9QS0FfRVJST1JfVElNRU9VVCAgICgweDAwMDAwMDA0VSkKKyNkZWZpbmUgSEFMX1BLQV9FUlJPUl9PUEVSQVRJT04gKDB4MDAwMDAwMDhVKQorI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX1BLQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLICAoMHgwMDAwMDAxMFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAqLworI2VuZGlmIC8qIFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBLQV9oYW5kbGVfU3RydWN0dXJlX2RlZmluaXRpb24gUEtBIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgUEtBIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdCBfX1BLQV9IYW5kbGVUeXBlRGVmCit7CisgIFBLQV9UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCisgIF9fSU8gSEFMX1BLQV9TdGF0ZVR5cGVEZWYgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgIC8qITwgUEtBIHN0YXRlICovCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgICAgIC8qITwgUEtBIEVycm9yIGNvZGUgKi8KKyNpZiAoVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogT3BlcmF0aW9uQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19QS0FfSGFuZGxlVHlwZURlZiAqaHBrYSk7IC8qITwgUEtBIEVuZCBvZiBvcGVyYXRpb24gY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19QS0FfSGFuZGxlVHlwZURlZiAqaHBrYSk7ICAgICAgICAgLyohPCBQS0EgRXJyb3IgY2FsbGJhY2sgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpOyAgICAgICAvKiE8IFBLQSBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1BLQV9IYW5kbGVUeXBlRGVmICpocGthKTsgICAgIC8qITwgUEtBIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgKi8KKyNlbmRpZiAgLyogVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IFBLQV9IYW5kbGVUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKiBAZGVmZ3JvdXAgUEtBX0NhbGxiYWNrX2RlZmluaXRpb24gUEtBIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEBicmllZiAgUEtBIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmICB2b2lkICgqcFBLQV9DYWxsYmFja1R5cGVEZWYpKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsgLyohPCBQb2ludGVyIHRvIGEgUEtBIGNhbGxiYWNrIGZ1bmN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqIEBkZWZncm91cCBQS0FfT3BlcmF0aW9uIFBLQSBvcGVyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIElucHV0IGFuZCBvdXRwdXQgZGF0YSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IHNjYWxhck11bFNpemU7ICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50IGluIHNjYWxhck11bCBhcnJheSAqLworICB1aW50MzJfdCBtb2R1bHVzU2l6ZTsgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBtb2R1bHVzLCBjb2VmQSwgcG9pbnRYIGFuZCBwb2ludFkgYXJyYXlzICovCisgIHVpbnQzMl90IGNvZWZTaWduOyAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnZlIGNvZWZmaWNpZW50IGEgc2lnbiAqLworICBjb25zdCB1aW50OF90ICpjb2VmQTsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGNvZWZmaWNpZW50IHxhfCAoQXJyYXkgb2YgbW9kdWx1c1NpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKm1vZHVsdXM7ICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gY3VydmUgbW9kdWx1cyB2YWx1ZSBwIChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcG9pbnRYOyAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludCBQIGNvb3JkaW5hdGUgeFAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwb2ludFk7ICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHBvaW50IFAgY29vcmRpbmF0ZSB5UCAoQXJyYXkgb2YgbW9kdWx1c1NpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKnNjYWxhck11bDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gc2NhbGFyIG11bHRpcGxpZXIgayAgIChBcnJheSBvZiBzY2FsYXJNdWxTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50MzJfdCAqcE1vbnRnb21lcnlQYXJhbTsgICAgLyohPCBQb2ludGVyIHRvIE1vbnRnb21lcnkgcGFyYW1ldGVyICAoQXJyYXkgb2YgbW9kdWx1c1NpemUvNCBlbGVtZW50cykgKi8KK30gUEtBX0VDQ011bEZhc3RNb2RlSW5UeXBlRGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBzY2FsYXJNdWxTaXplOyAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBzY2FsYXJNdWwgYXJyYXkgKi8KKyAgdWludDMyX3QgbW9kdWx1c1NpemU7ICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gbW9kdWx1cywgY29lZkEsIHBvaW50WCBhbmQgcG9pbnRZIGFycmF5cyAqLworICB1aW50MzJfdCBjb2VmU2lnbjsgICAgICAgICAgICAgICAgICAgLyohPCBDdXJ2ZSBjb2VmZmljaWVudCBhIHNpZ24gKi8KKyAgY29uc3QgdWludDhfdCAqY29lZkE7ICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBjdXJ2ZSBjb2VmZmljaWVudCB8YXwgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICptb2R1bHVzOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIG1vZHVsdXMgdmFsdWUgcCAoQXJyYXkgb2YgbW9kdWx1c1NpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKnBvaW50WDsgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnQgUCBjb29yZGluYXRlIHhQIChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcG9pbnRZOyAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludCBQIGNvb3JkaW5hdGUgeVAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpzY2FsYXJNdWw7ICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHNjYWxhciBtdWx0aXBsaWVyIGsgICAoQXJyYXkgb2Ygc2NhbGFyTXVsU2l6ZSBlbGVtZW50cykgKi8KK30gUEtBX0VDQ011bEluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgbW9kdWx1c1NpemU7ICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gY29lZkEsIGNvZWZCLCBtb2R1bHVzLCBwb2ludFggYW5kIHBvaW50WSBhcnJheXMgKi8KKyAgdWludDMyX3QgY29lZlNpZ247ICAgICAgICAgICAgICAgICAgIC8qITwgQ3VydmUgY29lZmZpY2llbnQgYSBzaWduICovCisgIGNvbnN0IHVpbnQ4X3QgKmNvZWZBOyAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gY3VydmUgY29lZmZpY2llbnQgfGF8IChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqY29lZkI7ICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBjdXJ2ZSBjb2VmZmljaWVudCBiICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICptb2R1bHVzOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIG1vZHVsdXMgdmFsdWUgcCAoQXJyYXkgb2YgbW9kdWx1c1NpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKnBvaW50WDsgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnQgUCBjb29yZGluYXRlIHhQIChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcG9pbnRZOyAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludCBQIGNvb3JkaW5hdGUgeVAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworfSBQS0FfUG9pbnRDaGVja0luVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcG9wQSBhcnJheSAqLworICBjb25zdCB1aW50OF90ICpwT3BEcDsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9wZXJhbmQgZFAgICAoQXJyYXkgb2Ygc2l6ZS8yIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwT3BEcTsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9wZXJhbmQgZFEgICAoQXJyYXkgb2Ygc2l6ZS8yIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwT3BRaW52OyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9wZXJhbmQgcWludiAoQXJyYXkgb2Ygc2l6ZS8yIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwUHJpbWVQOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHByaW1lIHAgICAgICAoQXJyYXkgb2Ygc2l6ZS8yIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwUHJpbWVROyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHByaW1lIFEgICAgICAoQXJyYXkgb2Ygc2l6ZS8yIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwb3BBOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9wZXJhbmQgQSAgICAoQXJyYXkgb2Ygc2l6ZSBlbGVtZW50cykgKi8KK30gUEtBX1JTQUNSVEV4cEluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgcHJpbWVPcmRlclNpemU7ICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcHJpbWVPcmRlciBhcnJheSAqLworICB1aW50MzJfdCBtb2R1bHVzU2l6ZTsgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBtb2R1bHVzIGFycmF5ICovCisgIHVpbnQzMl90IGNvZWZTaWduOyAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnZlIGNvZWZmaWNpZW50IGEgc2lnbiAqLworICBjb25zdCB1aW50OF90ICpjb2VmOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGNvZWZmaWNpZW50IHxhfCAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICptb2R1bHVzOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIG1vZHVsdXMgdmFsdWUgcCAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpiYXNlUG9pbnRYOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGJhc2UgcG9pbnQgeEcgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpiYXNlUG9pbnRZOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGJhc2UgcG9pbnQgeUcgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwUHViS2V5Q3VydmVQdFg7ICAgICAgLyohPCBQb2ludGVyIHRvIHB1YmxpYy1rZXkgY3VydmUgcG9pbnQgeFEgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwUHViS2V5Q3VydmVQdFk7ICAgICAgLyohPCBQb2ludGVyIHRvIHB1YmxpYy1rZXkgY3VydmUgcG9pbnQgeVEgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpSU2lnbjsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHNpZ25hdHVyZSBwYXJ0IHIgICAgICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpTU2lnbjsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHNpZ25hdHVyZSBwYXJ0IHMgICAgICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpoYXNoOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGhhc2ggb2YgdGhlIG1lc3NhZ2UgZSAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwcmltZU9yZGVyOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9yZGVyIG9mIHRoZSBjdXJ2ZSBuICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworfSBQS0FfRUNEU0FWZXJpZkluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgcHJpbWVPcmRlclNpemU7ICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcHJpbWVPcmRlciBhcnJheSAqLworICB1aW50MzJfdCBtb2R1bHVzU2l6ZTsgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBtb2R1bHVzIGFycmF5ICovCisgIHVpbnQzMl90IGNvZWZTaWduOyAgICAgICAgICAgICAgICAgICAvKiE8IEN1cnZlIGNvZWZmaWNpZW50IGEgc2lnbiAqLworICBjb25zdCB1aW50OF90ICpjb2VmOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGNvZWZmaWNpZW50IHxhfCAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICptb2R1bHVzOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIG1vZHVsdXMgdmFsdWUgcCAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICppbnRlZ2VyOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHJhbmRvbSBpbnRlZ2VyIGsgICAgICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpiYXNlUG9pbnRYOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGJhc2UgcG9pbnQgeEcgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpiYXNlUG9pbnRZOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGN1cnZlIGJhc2UgcG9pbnQgeUcgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpoYXNoOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIGhhc2ggb2YgdGhlIG1lc3NhZ2UgICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwcml2YXRlS2V5OyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHByaXZhdGUga2V5IGQgICAgICAgICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwcmltZU9yZGVyOyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG9yZGVyIG9mIHRoZSBjdXJ2ZSBuICAgICAgKEFycmF5IG9mIHByaW1lT3JkZXJTaXplIGVsZW1lbnRzKSAqLworfSBQS0FfRUNEU0FTaWduSW5UeXBlRGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90ICpSU2lnbjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHNpZ25hdHVyZSBwYXJ0IHIgICAgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworICB1aW50OF90ICpTU2lnbjsgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHNpZ25hdHVyZSBwYXJ0IHMgICAgICAgICAgKEFycmF5IG9mIG1vZHVsdXNTaXplIGVsZW1lbnRzKSAqLworfSBQS0FfRUNEU0FTaWduT3V0VHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCAqcHRYOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludCBQIGNvb3JkaW5hdGUgeFAgICAgIChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KKyAgdWludDhfdCAqcHRZOyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludCBQIGNvb3JkaW5hdGUgeVAgICAgIChBcnJheSBvZiBtb2R1bHVzU2l6ZSBlbGVtZW50cykgKi8KK30gUEtBX0VDRFNBU2lnbk91dEV4dFBhcmFtVHlwZURlZiwgUEtBX0VDQ011bE91dFR5cGVEZWY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IGV4cFNpemU7ICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50IGluIHBFeHAgYXJyYXkgKi8KKyAgdWludDMyX3QgT3BTaXplOyAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcE9wMSBhbmQgcE1vZCBhcnJheXMgKi8KKyAgY29uc3QgdWludDhfdCAqcEV4cDsgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBFeHBvbmVudCAgICAgICAgICAgICAoQXJyYXkgb2YgZXhwU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcE9wMTsgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBPcGVyYW5kICAgICAgICAgICAgICAoQXJyYXkgb2YgT3BTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50OF90ICpwTW9kOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIG1vZHVsdXMgICAgICAgICAgICAgIChBcnJheSBvZiBPcFNpemUgZWxlbWVudHMpICovCit9IFBLQV9Nb2RFeHBJblR5cGVEZWY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IGV4cFNpemU7ICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50IGluIHBFeHAgYW5kIHBNb250Z29tZXJ5UGFyYW0gYXJyYXlzICovCisgIHVpbnQzMl90IE9wU2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50IGluIHBPcDEgYW5kIHBNb2QgYXJyYXlzICovCisgIGNvbnN0IHVpbnQ4X3QgKnBFeHA7ICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gRXhwb25lbnQgICAgICAgICAgICAgKEFycmF5IG9mIGV4cFNpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKnBPcDE7ICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gT3BlcmFuZCAgICAgICAgICAgICAgKEFycmF5IG9mIE9wU2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcE1vZDsgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBtb2R1bHVzICAgICAgICAgICAgICAoQXJyYXkgb2YgT3BTaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50MzJfdCAqcE1vbnRnb21lcnlQYXJhbTsgICAgLyohPCBQb2ludGVyIHRvIE1vbnRnb21lcnkgcGFyYW1ldGVyIChBcnJheSBvZiBleHBTaXplLzQgZWxlbWVudHMpICovCit9IFBLQV9Nb2RFeHBGYXN0TW9kZUluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcE9wMSBhcnJheSAqLworICBjb25zdCB1aW50OF90ICpwT3AxOyAgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIE9wZXJhbmQgKEFycmF5IG9mIHNpemUgZWxlbWVudHMpICovCit9IFBLQV9Nb250Z29tZXJ5UGFyYW1JblR5cGVEZWY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbGVtZW50IGluIHBPcDEgYW5kIHBPcDIgYXJyYXlzICovCisgIGNvbnN0IHVpbnQzMl90ICpwT3AxOyAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gT3BlcmFuZCAxIChBcnJheSBvZiBzaXplIGVsZW1lbnRzKSAqLworICBjb25zdCB1aW50MzJfdCAqcE9wMjsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIE9wZXJhbmQgMiAoQXJyYXkgb2Ygc2l6ZSBlbGVtZW50cykgKi8KK30gUEtBX0FkZEluVHlwZURlZiwgUEtBX1N1YkluVHlwZURlZiwgUEtBX011bEluVHlwZURlZiwgUEtBX0NtcEluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcE9wMSBhcnJheSAqLworICBjb25zdCB1aW50MzJfdCAqcE9wMTsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIE9wZXJhbmQgMSAgICAgICAoQXJyYXkgb2Ygc2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDhfdCAqcE1vZDsgICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBtb2R1bHVzIHZhbHVlIG4gKEFycmF5IG9mIHNpemUqNCBlbGVtZW50cykgKi8KK30gUEtBX01vZEludkluVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT3BTaXplOyAgICAgICAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVsZW1lbnQgaW4gcE9wMSBhcnJheSAqLworICB1aW50MzJfdCBtb2RTaXplOyAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBwTW9kIGFycmF5ICovCisgIGNvbnN0IHVpbnQzMl90ICpwT3AxOyAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gT3BlcmFuZCAxICAgICAgIChBcnJheSBvZiBPcFNpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgKnBNb2Q7ICAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gbW9kdWx1cyB2YWx1ZSBuIChBcnJheSBvZiBtb2RTaXplIGVsZW1lbnRzKSAqLworfSBQS0FfTW9kUmVkSW5UeXBlRGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgZWxlbWVudCBpbiBwT3AxIGFuZCBwT3AyIGFycmF5cyAqLworICBjb25zdCB1aW50MzJfdCAqcE9wMTsgICAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIE9wZXJhbmQgMSAoQXJyYXkgb2Ygc2l6ZSBlbGVtZW50cykgKi8KKyAgY29uc3QgdWludDMyX3QgKnBPcDI7ICAgICAgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBPcGVyYW5kIDIgKEFycmF5IG9mIHNpemUgZWxlbWVudHMpICovCisgIGNvbnN0IHVpbnQ4X3QgICpwT3AzOyAgICAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gT3BlcmFuZCAzIChBcnJheSBvZiBzaXplKjQgZWxlbWVudHMpICovCit9IFBLQV9Nb2RBZGRJblR5cGVEZWYsIFBLQV9Nb2RTdWJJblR5cGVEZWYsIFBLQV9Nb250Z29tZXJ5TXVsSW5UeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQS0FfRXhwb3J0ZWRfQ29uc3RhbnRzIFBLQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBLQV9Nb2RlIFBLQSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUEtBX01PREVfTU9OVEdPTUVSWV9QQVJBTSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBQS0FfTU9ERV9NT0RVTEFSX0VYUCAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFBLQV9NT0RFX01PRFVMQVJfRVhQX0ZBU1RfTU9ERSAgICAgICAgICAgICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgUEtBX01PREVfRUNDX01VTCAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjBVKQorI2RlZmluZSBQS0FfTU9ERV9FQ0NfTVVMX0ZBU1RfTU9ERSAgICAgICAgICAgICAgICAoMHgwMDAwMDAyMlUpCisjZGVmaW5lIFBLQV9NT0RFX0VDRFNBX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDI0VSkKKyNkZWZpbmUgUEtBX01PREVfRUNEU0FfVkVSSUZJQ0FUSU9OICAgICAgICAgICAgICAgKDB4MDAwMDAwMjZVKQorI2RlZmluZSBQS0FfTU9ERV9QT0lOVF9DSEVDSyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyOFUpCisjZGVmaW5lIFBLQV9NT0RFX1JTQV9DUlRfRVhQICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA3VSkKKyNkZWZpbmUgUEtBX01PREVfTU9EVUxBUl9JTlYgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKQorI2RlZmluZSBQS0FfTU9ERV9BUklUSE1FVElDX0FERCAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwOVUpCisjZGVmaW5lIFBLQV9NT0RFX0FSSVRITUVUSUNfU1VCICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBBVSkKKyNkZWZpbmUgUEtBX01PREVfQVJJVEhNRVRJQ19NVUwgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMEJVKQorI2RlZmluZSBQS0FfTU9ERV9DT01QQVJJU09OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwQ1UpCisjZGVmaW5lIFBLQV9NT0RFX01PRFVMQVJfUkVEICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBEVSkKKyNkZWZpbmUgUEtBX01PREVfTU9EVUxBUl9BREQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMEVVKQorI2RlZmluZSBQS0FfTU9ERV9NT0RVTEFSX1NVQiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwRlUpCisjZGVmaW5lIFBLQV9NT0RFX01PTlRHT01FUllfTVVMICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24gUEtBIEludGVycnVwdCBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgUEtBIEludGVycnVwdCBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUEtBX0lUX1BST0NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtBX0NSX1BST0NFTkRJRQorI2RlZmluZSBQS0FfSVRfQUREUkVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS0FfQ1JfQUREUkVSUklFCisjZGVmaW5lIFBLQV9JVF9SQU1FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQV9DUl9SQU1FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQS0FfRmxhZ19kZWZpbml0aW9uIFBLQSBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBQS0FfRkxBR19QUk9DRU5EICAgICAgICAgICAgICAgICAgICAgICAgICBQS0FfU1JfUFJPQ0VOREYKKyNkZWZpbmUgUEtBX0ZMQUdfQUREUkVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgUEtBX1NSX0FERFJFUlJGCisjZGVmaW5lIFBLQV9GTEFHX1JBTUVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQV9TUl9SQU1FUlJGCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBLQV9FeHBvcnRlZF9NYWNyb3MgUEtBIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IFBLQSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUEtBIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfUEtBX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUEtBX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9QS0FfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1BLQV9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBQS0EgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFBLQSBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUFJPQ0VORCBFbmQgT2YgT3BlcmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfQUREUkVSUiBBZGRyZXNzIGVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUkFNRVJSIFJBTSBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BLQV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFBLQSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUEtBIEhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUFJPQ0VORCBFbmQgT2YgT3BlcmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfQUREUkVSUiBBZGRyZXNzIGVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUkFNRVJSIFJBTSBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BLQV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBLQSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFBLQSBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBQS0EgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUFJPQ0VORCBFbmQgT2YgT3BlcmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfQUREUkVSUiBBZGRyZXNzIGVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQS0FfSVRfUkFNRVJSIFJBTSBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkKKyAgKi8KKyNkZWZpbmUgX19IQUxfUEtBX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUEtBIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBQS0EgSGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUEtBX0ZMQUdfUFJPQ0VORCBFbmQgT2YgT3BlcmF0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgUEtBX0ZMQUdfQUREUkVSUiBBZGRyZXNzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgUEtBX0ZMQUdfUkFNRVJSIFJBTSBlcnJvcgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoU0VUIG9yIFJFU0VUKQorICAqLworI2RlZmluZSBfX0hBTF9QS0FfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUikgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgUEtBIHBlbmRpbmcgZmxhZ3Mgd2hpY2ggYXJlIGNsZWFyZWQgYnkgd3JpdGluZyAxIGluIGEgc3BlY2lmaWMgYml0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFBLQSBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBLQV9GTEFHX1BST0NFTkQgRW5kIE9mIE9wZXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBLQV9GTEFHX0FERFJFUlIgQWRkcmVzcyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBLQV9GTEFHX1JBTUVSUiBSQU0gZXJyb3IKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUEtBX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0xSRlIgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBQS0EgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBQS0EgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BLQV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsICBQS0FfQ1JfRU4pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgUEtBIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUEtBIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QS0FfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIFBLQV9DUl9FTikpCisKKy8qKiBAYnJpZWYgIFN0YXJ0IGEgUEtBIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBQS0EgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BLQV9TVEFSVChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsICBQS0FfQ1JfU1RBUlQpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQS0FfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBLQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0luaXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9EZUluaXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BLQV9Nc3BJbml0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QS0FfTXNwRGVJbml0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKKworI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1JlZ2lzdGVyQ2FsbGJhY2soUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIEhBTF9QS0FfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFBLQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfVW5SZWdpc3RlckNhbGxiYWNrKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBIQUxfUEtBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUEtBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEhpZ2ggTGV2ZWwgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vZEV4cChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEV4cEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RFeHBfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RFeHBJblR5cGVEZWYgKmluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kRXhwRmFzdE1vZGUoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RFeHBGYXN0TW9kZUluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RFeHBGYXN0TW9kZV9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEV4cEZhc3RNb2RlSW5UeXBlRGVmICppbik7Cit2b2lkIEhBTF9QS0FfTW9kRXhwX0dldFJlc3VsdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDhfdCAqcFJlcyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfRUNEU0FTaWduKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNEU0FTaWduSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0VDRFNBU2lnbl9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBU2lnbkluVHlwZURlZiAqaW4pOwordm9pZCBIQUxfUEtBX0VDRFNBU2lnbl9HZXRSZXN1bHQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0RTQVNpZ25PdXRUeXBlRGVmICpvdXQsIFBLQV9FQ0RTQVNpZ25PdXRFeHRQYXJhbVR5cGVEZWYgKm91dEV4dCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfRUNEU0FWZXJpZihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBVmVyaWZJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfRUNEU0FWZXJpZl9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBVmVyaWZJblR5cGVEZWYgKmluKTsKK3VpbnQzMl90IEhBTF9QS0FfRUNEU0FWZXJpZl9Jc1ZhbGlkU2lnbmF0dXJlKFBLQV9IYW5kbGVUeXBlRGVmIGNvbnN0ICpjb25zdCBocGthKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9SU0FDUlRFeHAoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9SU0FDUlRFeHBJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfUlNBQ1JURXhwX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfUlNBQ1JURXhwSW5UeXBlRGVmICppbik7Cit2b2lkIEhBTF9QS0FfUlNBQ1JURXhwX0dldFJlc3VsdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDhfdCAqcFJlcyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfUG9pbnRDaGVjayhQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1BvaW50Q2hlY2tJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfUG9pbnRDaGVja19JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1BvaW50Q2hlY2tJblR5cGVEZWYgKmluKTsKK3VpbnQzMl90IEhBTF9QS0FfUG9pbnRDaGVja19Jc09uQ3VydmUoUEtBX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhwa2EpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0VDQ011bChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDQ011bEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0NNdWxfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0NNdWxJblR5cGVEZWYgKmluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfRUNDTXVsRmFzdE1vZGUoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0NNdWxGYXN0TW9kZUluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0NNdWxGYXN0TW9kZV9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDQ011bEZhc3RNb2RlSW5UeXBlRGVmICppbik7Cit2b2lkIEhBTF9QS0FfRUNDTXVsX0dldFJlc3VsdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDQ011bE91dFR5cGVEZWYgKm91dCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfQWRkKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfQWRkSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0FkZF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0FkZEluVHlwZURlZiAqaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9TdWIoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9TdWJJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfU3ViX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfU3ViSW5UeXBlRGVmICppbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0NtcChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0NtcEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9DbXBfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9DbXBJblR5cGVEZWYgKmluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTXVsKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTXVsSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX011bF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX011bEluVHlwZURlZiAqaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RBZGQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RBZGRJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kQWRkX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kQWRkSW5UeXBlRGVmICppbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vZFN1YihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZFN1YkluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RTdWJfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RTdWJJblR5cGVEZWYgKmluKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kSW52KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kSW52SW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vZEludl9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEludkluVHlwZURlZiAqaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RSZWQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RSZWRJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kUmVkX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kUmVkSW5UeXBlRGVmICppbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vbnRnb21lcnlNdWwoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb250Z29tZXJ5TXVsSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vbnRnb21lcnlNdWxfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb250Z29tZXJ5TXVsSW5UeXBlRGVmICppbik7Cit2b2lkIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIHVpbnQzMl90ICpwUmVzKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW0oUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb250Z29tZXJ5UGFyYW1JblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9udGdvbWVyeVBhcmFtX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9udGdvbWVyeVBhcmFtSW5UeXBlRGVmICppbik7Cit2b2lkIEhBTF9QS0FfTW9udGdvbWVyeVBhcmFtX0dldFJlc3VsdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgKnBSZXMpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0Fib3J0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKK3ZvaWQgSEFMX1BLQV9SQU1SZXNldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSk7Cit2b2lkIEhBTF9QS0FfT3BlcmF0aW9uQ3BsdENhbGxiYWNrKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKK3ZvaWQgSEFMX1BLQV9FcnJvckNhbGxiYWNrKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKK3ZvaWQgSEFMX1BLQV9JUlFIYW5kbGVyKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQS0FfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1BLQV9TdGF0ZVR5cGVEZWYgSEFMX1BLQV9HZXRTdGF0ZShQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfUEtBX0dldEVycm9yKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFBLQSkgJiYgZGVmaW5lZChIQUxfUEtBX01PRFVMRV9FTkFCTEVEKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9QS0FfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfcHdyLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9wd3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGYwYmMzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfcHdyLmgKQEAgLTAsMCArMSw0OTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3B3ci5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQV1IgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfUFdSX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9QV1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qIEluY2x1ZGUgbG93IGxldmVsIGRyaXZlciAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9wd3IuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZXh0aS5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUiBQV1IKKyAgKiBAYnJpZWYgUFdSIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX1R5cGVzIFBXUiBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUFdSIFBWRCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQVkRMZXZlbDsgICAgICAgLyohPCBQVkRMZXZlbDogU3BlY2lmaWVzIHRoZSBQVkQgZGV0ZWN0aW9uIGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUl9QVkRfZGV0ZWN0aW9uX2xldmVsLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAvKiE8IE1vZGU6IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUl9QVkRfTW9kZS4gKi8KK31QV1JfUFZEVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX0V4cG9ydGVkX0NvbnN0YW50cyBQV1IgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX2RldGVjdGlvbl9sZXZlbCAgUG93ZXIgVm9sdGFnZSBEZXRlY3RvciBMZXZlbCBzZWxlY3Rpb24KKyAgKiBAbm90ZSAgICAgUmVmZXIgZGF0YXNoZWV0IGZvciBzZWxlY3Rpb24gdm9sdGFnZSB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8wICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi4wIFYgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzEgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfQ1IyX1BMU18wKSAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjIgViAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfMiAgICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgUFdSX0NSMl9QTFNfMSAgICAgICAgICAgICAgICApICAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuNCBWICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF8zICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICBQV1JfQ1IyX1BMU18xIHwgUFdSX0NSMl9QTFNfMCkgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi41IFYgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzQgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgLyohPCBQVkQgdGhyZXNob2xkIGFyb3VuZCAyLjYgViAqLworI2RlZmluZSBQV1JfUFZETEVWRUxfNSAgICAgICAgICAgICAgICAgIChQV1JfQ1IyX1BMU18yICAgICAgICAgICAgICAgICB8IFBXUl9DUjJfUExTXzApICAvKiE8IFBWRCB0aHJlc2hvbGQgYXJvdW5kIDIuOCBWICovCisjZGVmaW5lIFBXUl9QVkRMRVZFTF82ICAgICAgICAgICAgICAgICAgKFBXUl9DUjJfUExTXzIgfCBQV1JfQ1IyX1BMU18xICAgICAgICAgICAgICAgICkgIC8qITwgUFZEIHRocmVzaG9sZCBhcm91bmQgMi45IFYgKi8KKyNkZWZpbmUgUFdSX1BWRExFVkVMXzcgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMiB8IFBXUl9DUjJfUExTXzEgfCBQV1JfQ1IyX1BMU18wKSAgLyohPCBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAoY29tcGFyZWQgaW50ZXJuYWxseSB0byBWUkVGSU5UKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUFZEX01vZGUgIFBXUiBQVkQgaW50ZXJydXB0IGFuZCBldmVudCBtb2RlCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE9uIFNUTTMyV0Igc2VyaWUsIHBvd2VyIFBWRCBldmVudCBpcyBub3QgYXZhaWxhYmxlIG9uIEFJRUMgbGluZXMgICAgICovCisvKiAgICAgICAob25seSBpbnRlcnJ1cHRpb24gaXMgYXZhaWxhYmxlIHRocm91Z2ggQUlFQyBsaW5lIDE2KS4gICAgICAgICAgICAgICAqLworI2RlZmluZSBQV1JfUFZEX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXNpYyBtb2RlIGlzIHVzZWQgKi8KKworI2RlZmluZSBQV1JfUFZEX01PREVfSVRfUklTSU5HICAgICAgICAgICAgICAoUFZEX01PREVfSVQgfCBQVkRfUklTSU5HX0VER0UpICAgICAgICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9JVF9GQUxMSU5HICAgICAgICAgICAgIChQVkRfTU9ERV9JVCB8IFBWRF9GQUxMSU5HX0VER0UpICAgICAgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVkRfTU9ERV9JVF9SSVNJTkdfRkFMTElORyAgICAgIChQVkRfTU9ERV9JVCB8IFBWRF9SSVNJTkdfRkFMTElOR19FREdFKSAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogTm90ZTogT24gU1RNMzJXQiBzZXJpZSwgcG93ZXIgUFZEIGV2ZW50IGlzIG5vdCBhdmFpbGFibGUgb24gQUlFQyBsaW5lcyAgICAgKi8KKy8qICAgICAgIChvbmx5IGludGVycnVwdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCBBSUVDIGxpbmUgMTYpLiAgICAgICAgICAgICAgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xvd19Qb3dlcl9Nb2RlX1NlbGVjdGlvbiAgUFdSIExvdyBQb3dlciBNb2RlIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUk1PREVfU1RPUDAgICAgICAgICAgICAgICgweDAwMDAwMDAwdSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIDA6IHN0b3AgbW9kZSB3aXRoIG1haW4gcmVndWxhdG9yICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUk1PREVfU1RPUDEgICAgICAgICAgICAgIChQV1JfQ1IxX0xQTVNfMCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBTdG9wIDE6IHN0b3AgbW9kZSB3aXRoIGxvdyBwb3dlciByZWd1bGF0b3IgKi8KKyNkZWZpbmUgUFdSX0xPV1BPV0VSTU9ERV9TVE9QMiAgICAgICAgICAgICAgKFBXUl9DUjFfTFBNU18xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN0b3AgMjogc3RvcCBtb2RlIHdpdGggbG93IHBvd2VyIHJlZ3VsYXRvciBhbmQgVkREMTJJIGludGVycnVwdGlibGUgZGlnaXRhbCBjb3JlIGRvbWFpbiBzdXBwbHkgT0ZGIChsZXNzIHBlcmlwaGVyYWxzIGFjdGl2YXRlZCB0aGFuIGxvdyBwb3dlciBtb2RlIHN0b3AgMSB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24pKi8KKyNkZWZpbmUgUFdSX0xPV1BPV0VSTU9ERV9TVEFOREJZICAgICAgICAgICAgKFBXUl9DUjFfTFBNU18wIHwgUFdSX0NSMV9MUE1TXzEpICAgICAvKiE8IFN0YW5kYnkgbW9kZSAqLworI2RlZmluZSBQV1JfTE9XUE9XRVJNT0RFX1NIVVRET1dOICAgICAgICAgICAoUFdSX0NSMV9MUE1TXzIpICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2h1dGRvd24gbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUmVndWxhdG9yX3N0YXRlX2luX1NMRUVQX1NUT1BfbW9kZSAgUFdSIHJlZ3VsYXRvciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX01BSU5SRUdVTEFUT1JfT04gICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgIC8qITwgUmVndWxhdG9yIGluIG1haW4gbW9kZSAgICAgICovCisjZGVmaW5lIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiAgICAgICAgICAgIChQV1JfQ1IxX0xQUikgICAgICAgICAgICAgICAvKiE8IFJlZ3VsYXRvciBpbiBsb3ctcG93ZXIgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfU0xFRVBfbW9kZV9lbnRyeSAgUFdSIFNMRUVQIG1vZGUgZW50cnkKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfU0xFRVBFTlRSWV9XRkkgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMSkgICAgICAgICAvKiE8IFdhaXQgRm9yIEludGVycnVwdGlvbiBpbnN0cnVjdGlvbiB0byBlbnRlciBTbGVlcCBtb2RlICovCisjZGVmaW5lIFBXUl9TTEVFUEVOVFJZX1dGRSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyKSAgICAgICAgIC8qITwgV2FpdCBGb3IgRXZlbnQgaW5zdHJ1Y3Rpb24gdG8gZW50ZXIgU2xlZXAgbW9kZSAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1NUT1BfbW9kZV9lbnRyeSAgUFdSIFNUT1AgbW9kZSBlbnRyeQorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9TVE9QRU5UUllfV0ZJICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxKSAgICAgICAgIC8qITwgV2FpdCBGb3IgSW50ZXJydXB0aW9uIGluc3RydWN0aW9uIHRvIGVudGVyIFN0b3AgbW9kZSAqLworI2RlZmluZSBQV1JfU1RPUEVOVFJZX1dGRSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMikgICAgICAgICAvKiE8IFdhaXQgRm9yIEV2ZW50IGluc3RydWN0aW9uIHRvIGVudGVyIFN0b3AgbW9kZSAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyoqIEBkZWZncm91cCBQV1JfUHJpdmF0ZV9EZWZpbmVzIFBXUiBQcml2YXRlIERlZmluZXMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9QVkRfRVhUSV9MSU5FICBQV1IgUFZEIGV4dGVybmFsIGludGVycnVwdCBsaW5lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0VYVElfTElORV9QVkQgIChMTF9FWFRJX0xJTkVfMTYpICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNiBDb25uZWN0ZWQgdG8gdGhlIFBXUiBQVkQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1BWRF9Nb2RlX01hc2sgUFdSIFBWRCBNb2RlIE1hc2sKKyAgKiBAeworICAqLworLyogTm90ZTogT24gU1RNMzJXQiBzZXJpZSwgcG93ZXIgUFZEIGV2ZW50IGlzIG5vdCBhdmFpbGFibGUgb24gQUlFQyBsaW5lcyAgICAgKi8KKy8qICAgICAgIChvbmx5IGludGVycnVwdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCBBSUVDIGxpbmUgMTYpLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBWRF9NT0RFX0lUICAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKSAgLyohPCBNYXNrIGZvciBpbnRlcnJ1cHRpb24geWllbGRlZCBieSBQVkQgdGhyZXNob2xkIGNyb3NzaW5nICovCisjZGVmaW5lIFBWRF9SSVNJTkdfRURHRSAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgLyohPCBNYXNrIGZvciByaXNpbmcgZWRnZSBzZXQgYXMgUFZEIHRyaWdnZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBWRF9GQUxMSU5HX0VER0UgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBNYXNrIGZvciBmYWxsaW5nIGVkZ2Ugc2V0IGFzIFBWRCB0cmlnZ2VyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBWRF9SSVNJTkdfRkFMTElOR19FREdFICAgKDB4MDAwMDAwMDNVKSAgLyohPCBNYXNrIGZvciByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgc2V0IGFzIFBWRCB0cmlnZ2VyICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfTWFjcm9zICBQV1IgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgb3Igbm90IGEgc3BlY2lmaWMgUFdSIGZsYWcgaXMgc2V0LgorICAqIEBwYXJhbSBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICoKKyAgKiAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNSMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMSAgV2FrZSBVcCBGbGFnIDEuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDEuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMiAgV2FrZSBVcCBGbGFnIDIuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDIuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGMyAgV2FrZSBVcCBGbGFnIDMuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDMuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGNCAgV2FrZSBVcCBGbGFnIDQuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDQuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfV1VGNSAgV2FrZSBVcCBGbGFnIDUuIEluZGljYXRlcyB0aGF0IGEgd2FrZXVwIGV2ZW50CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlY2VpdmVkIGZyb20gdGhlIFdLVVAgcGluIDUuCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19CSFdGICAgICAgQkxFX0hvc3QgV2FrZVVwIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19GUkNCWVBJICAgU01QUyBGb3JjZWQgaW4gQnlwYXNzIEludGVycnVwdCBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUkZQSEFTRUkgIFJhZGlvIFBoYXNlIEludGVycnVwdCBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfQkxFQUNUSSAgIEJMRSBBY3Rpdml0eSBJbnRlcnJ1cHQgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHXzgwMkFDVEkgICA4MDIuMTUuNCBBY3Rpdml0eSBJbnRlcnJ1cHQgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX0hPTERDMkkgICBDUFUyIG9uLUhvbGQgSW50ZXJydXB0IEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUZJICAgICAgV2FrZS1VcCBGbGFnIEludGVybmFsLiBTZXQgd2hlbiBhIHdha2V1cCBpcyBkZXRlY3RlZCBvbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJuYWwgd2FrZXVwIGxpbmUuCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19TTVBTUkRZRiAgU01QUyBSZWFkeSBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfU01QU0JZUEYgIFNNUFMgQnlwYXNzIEZsYWcKKyAgKgorICAqICAgICAgICAgICAgLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU1IyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19SRUdMUFMgTG93IFBvd2VyIFJlZ3VsYXRvciBTdGFydGVkLiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3ctcG93ZXIgcmVndWxhdG9yIGlzIHJlYWR5LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1JFR0xQRiBMb3cgUG93ZXIgUmVndWxhdG9yIEZsYWcuIEluZGljYXRlcyB3aGV0aGVyIHRoZSAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdG9yIGlzIHJlYWR5IGluIG1haW4gbW9kZSBvciBpcyBpbiBsb3ctcG93ZXIgbW9kZS4gCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19WT1NGICAgVm9sdGFnZSBTY2FsaW5nIEZsYWcuIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkgCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzZWxlY3RlZCB2b2x0YWdlIHJhbmdlIG9yIGlzIHN0aWxsIGNoYW5naW5nIHRvIHRoZSByZXF1aXJlZCB2b2x0YWdlIGxldmVsLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1BWRE8gICBQb3dlciBWb2x0YWdlIERldGVjdG9yIE91dHB1dC4gSW5kaWNhdGVzIHdoZXRoZXIgVkREIHZvbHRhZ2UgaXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgb3IgYWJvdmUgdGhlIHNlbGVjdGVkIFBWRCB0aHJlc2hvbGQuCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19QVk1PMSBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyBPdXRwdXQgMS4gSW5kaWNhdGVzIHdoZXRoZXIgVkREVVNCIHZvbHRhZ2UgaXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWxvdyBvciBhYm92ZSBQVk0xIHRocmVzaG9sZCAoYXBwbGljYWJsZSB3aGVuIFVTQiBmZWF0dXJlIGlzIHN1cHBvcnRlZCkuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUFZNTzMgUGVyaXBoZXJhbCBWb2x0YWdlIE1vbml0b3JpbmcgT3V0cHV0IDMuIEluZGljYXRlcyB3aGV0aGVyIFZEREEgdm9sdGFnZSBpcworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGJlbG93IG9yIGFib3ZlIFBWTTMgdGhyZXNob2xkLiAKKyAgKgorICAqICAgICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVYVFNDUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1NUT1AgICAgICAgICAgICAgIFN5c3RlbSBTdG9wIEZsYWcgZm9yIENQVTEuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfU0IgICAgICAgICAgICAgICAgU3lzdGVtIFN0YW5kYnkgRmxhZyBmb3IgQ1BVMS4gIAorICAqCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfQzJTVE9QICAgICAgICAgICAgU3lzdGVtIFN0b3AgRmxhZyBmb3IgQ1BVMi4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DMlNCICAgICAgICAgICAgICBTeXN0ZW0gU3RhbmRieSBGbGFnIGZvciBDUFUyLiAgCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DUklUSUNBTF9SRl9QSEFTRSBDcml0aWNhbCByYWRpbyBzeXN0ZW0gcGhhc2UgZmxhZy4gIAorICAqCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfQzFERUVQU0xFRVAgICAgICAgQ1BVMSBEZWVwU2xlZXAgRmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DMkRFRVBTTEVFUCAgICAgICBDUFUyIERlZXBTbGVlcCBGbGFnLiAgCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLyAgCisjZGVmaW5lIF9fSEFMX1BXUl9HRVRfRkxBRyhfX0ZMQUdfXykgICggKCgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPj4gNVUpID09IDFVKSAgP1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBXUi0+U1IxICYgKDFVIDw8ICgoX19GTEFHX18pICYgMzFVKSkpIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPj4gNVUpID09IDJVKSkgP1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBXUi0+U1IyICYgKDFVIDw8ICgoX19GTEFHX18pICYgMzFVKSkpIDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQV1ItPkVYVFNDUiAmICgxVSA8PCAoKF9fRkxBR19fKSAmIDMxVSkpKSApICkKKworCisvKiogQGJyaWVmICBDbGVhciBhIHNwZWNpZmljIFBXUiBmbGFnLgorICAqIEBub3RlICAgQ2xlYXJpbmcgb2YgZmxhZ3Mge1BXUl9GTEFHX1NUT1AsIFBXUl9GTEFHX1NCfQorICAqICAgICAgICAgYW5kIGZsYWdzIHtQV1JfRkxBR19DMlNUT1AsIFBXUl9GTEFHX0MyU0J9IGFyZSBncm91cGVkOgorICAqICAgICAgICAgY2xlYXJpbmcgb2Ygb25lIGZsYWcgYWxzbyBjbGVhcnMgdGhlIG90aGVyIG9uZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICoKKyAgKiAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNDUiAoU1JSKS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYxICBXYWtlIFVwIEZsYWcgMS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYyICBXYWtlIFVwIEZsYWcgMi4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMi4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUYzICBXYWtlIFVwIEZsYWcgMy4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gMy4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUY0ICBXYWtlIFVwIEZsYWcgNC4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNC4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVUY1ICBXYWtlIFVwIEZsYWcgNS4gSW5kaWNhdGVzIHRoYXQgYSB3YWtldXAgZXZlbnQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgV0tVUCBwaW4gNS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19XVSAgICBFbmNvbXBhc3NlcyBhbGwgZml2ZSBXYWtlIFVwIEZsYWdzLgorICAqCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfQkhXRiAgICAgIENsZWFyIEJMRV9Ib3N0IFdha2V1cCBGbGFnLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX0ZSQ0JZUEkgICBDbGVhciBTTVBTIEZvcmNlZCBpbiBCeXBhc3MgSW50ZXJydXB0IEZsYWcuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQUdfUkZQSEFTRUkgIFJGIFBoYXNlIEludGVycnVwdCBDbGVhci4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19CTEVBQ1RJICAgQkxFIEFjdGl2aXR5IEludGVycnVwdCBDbGVhci4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR184MDJBQ1RJICAgODAyLjE1LjQuIEFjdGl2aXR5IEludGVycnVwdCBDbGVhci4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19IT0xEQzJJICAgQ1BVMiBvbi1Ib2xkIEludGVycnVwdCBDbGVhci4KKyAgKgorICAqICAgICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVYVFNDUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1NUT1AgICAgICBTeXN0ZW0gU3RvcCBGbGFnIGZvciBDUFUxLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9GTEFHX1NCICAgICAgICBTeXN0ZW0gU3RhbmRieSBGbGFnIGZvciBDUFUxLiAgCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DMlNUT1AgICAgU3lzdGVtIFN0b3AgRmxhZyBmb3IgQ1BVMi4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DMlNCICAgICAgU3lzdGVtIFN0YW5kYnkgRmxhZyBmb3IgQ1BVMi4gCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBR19DUklUSUNBTF9SRl9QSEFTRSAgUkYgcGhhc2UgRmxhZy4KKyAgKgorICAqIEByZXR2YWwgTm9uZSAgIAorICAqLworI2RlZmluZSBfX0hBTF9QV1JfQ0xFQVJfRkxBRyhfX0ZMQUdfXykgICAoICgoKCh1aW50OF90KShfX0ZMQUdfXykpID4+IDVVKSA9PSAxVSkgP1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKCh1aW50OF90KShfX0ZMQUdfXykpID09IFBXUl9GTEFHX1dVKSA/XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFdSLT5TQ1IgID0gKF9fRkxBR19fKSkgOiAoUFdSLT5TQ1IgPSAoMVUgPDwgKChfX0ZMQUdfXykgJiAzMVUpKSkgKSA6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoKHVpbnQ4X3QpKF9fRkxBR19fKSkgPT0gUFdSX0ZMQUdfQ1JJVElDQUxfUkZfUEhBU0UpID9cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQgKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0NDUlBGKSA6ICggKCgoKHVpbnQ4X3QpKChfX0ZMQUdfXykpICYgMzFVKSA8PSBQV1JfRVhUU0NSX0MxU1RPUEZfUG9zKSA/XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUIChQV1ItPkVYVFNDUiwgUFdSX0VYVFNDUl9DMUNTU0YpOiBTRVRfQklUIChQV1ItPkVYVFNDUiwgUFdSX0VYVFNDUl9DMkNTU0YpKSApICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9JVCgpICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEMyIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSUMyX0VOQUJMRV9JVCgpICAgTExfQzJfRVhUSV9FbmFibGVJVF8wXzMxKFBXUl9FWFRJX0xJTkVfUFZEKQorCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEMxIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCkgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoUFdSX0VYVElfTElORV9QVkQpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IEMyIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSUMyX0RJU0FCTEVfSVQoKSAgTExfQzJfRVhUSV9EaXNhYmxlSVRfMF8zMShQV1JfRVhUSV9MSU5FX1BWRCkKKworLyogTm90ZTogT24gU1RNMzJXQiBzZXJpZSwgcG93ZXIgUFZEIGV2ZW50IGlzIG5vdCBhdmFpbGFibGUgb24gQUlFQyBsaW5lcyAgICAgKi8KKy8qICAgICAgIChvbmx5IGludGVycnVwdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCBBSUVDIGxpbmUgMTYpLiAgICAgICAgICAgICAgICovCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWRCBmbGFnIHBvbGFyaXR5IGlzIGludmVydGVkIGNvbXBhcmVkIHRvIEVYVEkgbGluZSwgdGhlcmVmb3JlCisgICogICAgICAgIEVYVEkgcmlzaW5nIGFuZCBmYWxsaW5nIGxvZ2ljIGVkZ2VzIGFyZSBpbnZlcnRlZCB2ZXJzdXMgUFZEIHZvbHRhZ2UgZWRnZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKFBXUl9FWFRJX0xJTkVfUFZEKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgVHJpZ2dlci4KKyAgKiBAbm90ZSAgUFZEIGZsYWcgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRVhUSSBsaW5lLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgRVhUSSByaXNpbmcgYW5kIGZhbGxpbmcgbG9naWMgZWRnZXMgYXJlIGludmVydGVkIHZlcnN1cyBQVkQgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWRCBmbGFnIHBvbGFyaXR5IGlzIGludmVydGVkIGNvbXBhcmVkIHRvIEVYVEkgbGluZSwgdGhlcmVmb3JlCisgICogICAgICAgIEVYVEkgcmlzaW5nIGFuZCBmYWxsaW5nIGxvZ2ljIGVkZ2VzIGFyZSBpbnZlcnRlZCB2ZXJzdXMgUFZEIHZvbHRhZ2UgZWRnZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoUFdSX0VYVElfTElORV9QVkQpCisKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWRCBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICAqIEBub3RlICBQVkQgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWRCB2b2x0YWdlIGVkZ2VzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18wXzMxKFBXUl9FWFRJX0xJTkVfUFZEKQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBQVkQgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZEIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWRF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZEX0VYVElfR0VORVJBVEVfU1dJVCgpIExMX0VYVElfR2VuZXJhdGVTV0lfMF8zMShQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBQVkQgRVhUSSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQuCisgICogQHJldHZhbCBFWFRJIFBWRCBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgIExMX0VYVElfUmVhZEZsYWdfMF8zMShQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBQVkQgRVhUSSBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWRF9FWFRJX0NMRUFSX0ZMQUcoKSAgTExfRVhUSV9DbGVhckZsYWdfMF8zMShQV1JfRVhUSV9MSU5FX1BWRCkKKworLyoqCisgICogQH0KKyAgKi8KKyAgCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUFdSX1ByaXZhdGVfTWFjcm9zICBQV1IgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX1BXUl9QVkRfTEVWRUwoTEVWRUwpICgoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfMCkgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzIpIHx8ICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF8zKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTEVWRUwpID09IFBXUl9QVkRMRVZFTF80KSB8fCAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfNSl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExFVkVMKSA9PSBQV1JfUFZETEVWRUxfNikgfHwgKChMRVZFTCkgPT0gUFdSX1BWRExFVkVMXzcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIElTX1BXUl9QVkRfTU9ERShNT0RFKSAgKCgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX05PUk1BTCkgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVkRfTU9ERV9JVF9SSVNJTkcpICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBQV1JfUFZEX01PREVfSVRfRkFMTElORykgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWRF9NT0RFX0lUX1JJU0lOR19GQUxMSU5HKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyNkZWZpbmUgSVNfUFdSX1JFR1VMQVRPUihSRUdVTEFUT1IpICAgICAgICAgICAgICAgKCgoUkVHVUxBVE9SKSA9PSBQV1JfTUFJTlJFR1VMQVRPUl9PTikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRUdVTEFUT1IpID09IFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTikpCisKKworI2RlZmluZSBJU19QV1JfU0xFRVBfRU5UUlkoRU5UUlkpICAgICAgICAgICAgICAgICAoKChFTlRSWSkgPT0gUFdSX1NMRUVQRU5UUllfV0ZJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVOVFJZKSA9PSBQV1JfU0xFRVBFTlRSWV9XRkUpKQorCisjZGVmaW5lIElTX1BXUl9TVE9QX0VOVFJZKEVOVFJZKSAgICAgICAgICAgICAgICAgICgoKEVOVFJZKSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFTlRSWSkgPT0gUFdSX1NUT1BFTlRSWV9XRkUpKQorLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBQV1IgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcHdyX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnMgIFBXUiBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGVJbml0KHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0VuYWJsZUJrVXBBY2Nlc3Modm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSX0NvbmZpZ1BWRChQV1JfUFZEVHlwZURlZiAqc0NvbmZpZ1BWRCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKTsKKworLyogV2FrZVVwIHBpbnMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpblBvbGFyaXR5KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW54KTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSh1aW50MzJfdCBSZWd1bGF0b3IsIHVpbnQ4X3QgU1RPUEVudHJ5KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUodWludDMyX3QgUmVndWxhdG9yLCB1aW50OF90IFNMRUVQRW50cnkpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbnRlclNUQU5EQllNb2RlKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX1BWRENhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUl9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVNsZWVwT25FeGl0KHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSX0VuYWJsZVNFVk9uUGVuZCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JfRGlzYWJsZVNFVk9uUGVuZCh2b2lkKTsKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1BXUl9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9wd3JfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX3B3cl9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTE5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9wd3JfZXguaApAQCAtMCwwICsxLDg4NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcHdyX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFBXUiBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9QV1JfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1BXUl9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeCBQV1JFeAorICAqIEBicmllZiBQV1IgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfVHlwZXMgUFdSIEV4dGVuZGVkIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQV1IgUFZNIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBWTVR5cGU7ICAgLyohPCBQVk1UeXBlOiBTcGVjaWZpZXMgd2hpY2ggdm9sdGFnZSBpcyBtb25pdG9yZWQgYW5kIGFnYWluc3Qgd2hpY2ggdGhyZXNob2xkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUFdSRXhfUFZNX1R5cGUuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9QVk1fMSBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAxIGVuYWJsZTogVkREVVNCIHZlcnN1cyAxLjIgViAoYXBwbGljYWJsZSB3aGVuIFVTQiBmZWF0dXJlIGlzIHN1cHBvcnRlZCkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9QVk1fMyBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAzIGVuYWJsZTogVkREQSB2ZXJzdXMgMS42MiBWLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAvKiE8IE1vZGU6IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JFeF9QVk1fTW9kZS4gKi8KKyAgdWludDMyX3QgV2FrZXVwVGFyZ2V0OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBXYWtldXAgVGFyZ2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQV1JFeF9XYWtlVXBUYXJnZXRfRGVmaW5pdGlvbiAqLworfVBXUl9QVk1UeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFBXUiBTTVBTIHN0ZXAgZG93biBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTdGFydHVwQ3VycmVudDsgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUFdSRXhfU01QU19TVEFSVFVQX0NVUlJFTlQuICovCisgIAorICB1aW50MzJfdCBPdXRwdXRWb2x0YWdlOyAgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgb3V0cHV0IHZvbHRhZ2Ugc2NhbGluZyB2b2x0YWdlIGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFBXUkV4X1NNUFNfT1VUUFVUX1ZPTFRBR0VfTEVWRUwgKi8KK31QV1JfU01QU1R5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfQ29uc3RhbnRzICBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9XVVBfUG9sYXJpdHkgU2hpZnQgdG8gYXBwbHkgdG8gcmV0cmlldmUgcG9sYXJpdHkgaW5mb3JtYXRpb24gZnJvbSBQV1JfV0FLRVVQX1BJTnlfeHh4IGNvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQgICAgICAgICAgICAgICAgICAweDA1VSAgIC8qITwgSW50ZXJuYWwgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB3YWtldXAgcGluIHBvbGFyaXR5ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfV2FrZVVwX1BpbnMgIFBXUiB3YWtlLXVwIHBpbnMKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjFfSElHSCAgICAgICAgICAgIFBXUl9DUjNfRVdVUDEgIC8qITwgV2FrZXVwIHBpbiAxICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMl9ISUdIICAgICAgICAgICAgUFdSX0NSM19FV1VQMiAgLyohPCBXYWtldXAgcGluIDIgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4zX0hJR0ggICAgICAgICAgICBQV1JfQ1IzX0VXVVAzICAvKiE8IFdha2V1cCBwaW4gMyAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfSElHSCAgICAgICAgICAgIFBXUl9DUjNfRVdVUDQgIC8qITwgV2FrZXVwIHBpbiA0ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElONV9ISUdIICAgICAgICAgICAgUFdSX0NSM19FV1VQNSAgLyohPCBXYWtldXAgcGluIDUgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjFfTE9XICAgICAgICAgICAgICgoUFdSX0NSNF9XUDE8PFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQMSkgLyohPCBXYWtldXAgcGluIDEgKHdpdGggbG93IGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjJfTE9XICAgICAgICAgICAgICgoUFdSX0NSNF9XUDI8PFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQMikgLyohPCBXYWtldXAgcGluIDIgKHdpdGggbG93IGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjNfTE9XICAgICAgICAgICAgICgoUFdSX0NSNF9XUDM8PFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQMykgLyohPCBXYWtldXAgcGluIDMgKHdpdGggbG93IGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjRfTE9XICAgICAgICAgICAgICgoUFdSX0NSNF9XUDQ8PFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQNCkgLyohPCBXYWtldXAgcGluIDQgKHdpdGggbG93IGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjVfTE9XICAgICAgICAgICAgICgoUFdSX0NSNF9XUDU8PFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpIHwgUFdSX0NSM19FV1VQNSkgLyohPCBXYWtldXAgcGluIDUgKHdpdGggbG93IGxldmVsIHBvbGFyaXR5KSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogTGl0ZXJhbHMga2VwdCBmb3IgbGVnYWN5IHB1cnBvc2UgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU4xICAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVAxICAvKiE8IFdha2V1cCBwaW4gMSAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjIgICAgICAgICAgICAgICAgIFBXUl9DUjNfRVdVUDIgIC8qITwgV2FrZXVwIHBpbiAyICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisjZGVmaW5lIFBXUl9XQUtFVVBfUElOMyAgICAgICAgICAgICAgICAgUFdSX0NSM19FV1VQMyAgLyohPCBXYWtldXAgcGluIDMgKHdpdGggaGlnaCBsZXZlbCBwb2xhcml0eSkgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUF9QSU40ICAgICAgICAgICAgICAgICBQV1JfQ1IzX0VXVVA0ICAvKiE8IFdha2V1cCBwaW4gNCAod2l0aCBoaWdoIGxldmVsIHBvbGFyaXR5KSAqLworI2RlZmluZSBQV1JfV0FLRVVQX1BJTjUgICAgICAgICAgICAgICAgIFBXUl9DUjNfRVdVUDUgIC8qITwgV2FrZXVwIHBpbiA1ICh3aXRoIGhpZ2ggbGV2ZWwgcG9sYXJpdHkpICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfUElOX1BvbGFyaXR5IFBXUkV4IFBpbiBQb2xhcml0eSBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1BJTl9QT0xBUklUWV9ISUdIIDB4MDAwMDAwMDBVCisjZGVmaW5lIFBXUl9QSU5fUE9MQVJJVFlfTE9XICAweDAwMDAwMDAxVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fVHlwZSBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyB0eXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1BWTV8xICAgICAgICAgICAgICAgICAgUFdSX0NSMl9QVk1FMSAgLyohPCBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAxIGVuYWJsZTogVkREVVNCIHZlcnN1cyAxLjIgViAoYXBwbGljYWJsZSB3aGVuIFVTQiBmZWF0dXJlIGlzIHN1cHBvcnRlZCkgKi8KKyNkZWZpbmUgUFdSX1BWTV8zICAgICAgICAgICAgICAgICAgUFdSX0NSMl9QVk1FMyAgLyohPCBQZXJpcGhlcmFsIFZvbHRhZ2UgTW9uaXRvcmluZyAzIGVuYWJsZTogVkREQSB2ZXJzdXMgMS42MiBWICovCisvKioKKyAgKiBAfQorICAqLyAgCisgIAorLyoqIEBkZWZncm91cCBQV1JFeF9QVk1fTW9kZSAgUFdSIFBWTSBpbnRlcnJ1cHQgYW5kIGV2ZW50IG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfUFZNX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpIC8qITwgYmFzaWMgbW9kZSBpcyB1c2VkICovCisKKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0lUX1JJU0lORyAgICAgICAgICAgICAgKFBWTV9NT0RFX0lUIHwgUFZNX1JJU0lOR19FREdFKSAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggUmlzaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0lUX0ZBTExJTkcgICAgICAgICAgICAgKFBWTV9NT0RFX0lUIHwgUFZNX0ZBTExJTkdfRURHRSkgICAgICAgICAgICAvKiE8IEV4dGVybmFsIEludGVycnVwdCBNb2RlIHdpdGggRmFsbGluZyBlZGdlIHRyaWdnZXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFBXUl9QVk1fTU9ERV9JVF9SSVNJTkdfRkFMTElORyAgICAgIChQVk1fTU9ERV9JVCB8IFBWTV9SSVNJTkdfRkFMTElOR19FREdFKSAgICAgLyohPCBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kZSB3aXRoIFJpc2luZy9GYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKworI2RlZmluZSBQV1JfUFZNX01PREVfRVZFTlRfUklTSU5HICAgICAgICAgICAoUFZNX01PREVfRVZUIHwgUFZNX1JJU0lOR19FREdFKSAgICAgICAgICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBSaXNpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworI2RlZmluZSBQV1JfUFZNX01PREVfRVZFTlRfRkFMTElORyAgICAgICAgICAoUFZNX01PREVfRVZUIHwgUFZNX0ZBTExJTkdfRURHRSkgICAgICAgICAvKiE8IEV2ZW50IE1vZGUgd2l0aCBGYWxsaW5nIGVkZ2UgdHJpZ2dlciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUFdSX1BWTV9NT0RFX0VWRU5UX1JJU0lOR19GQUxMSU5HICAgKFBWTV9NT0RFX0VWVCB8IFBWTV9SSVNJTkdfRkFMTElOR19FREdFKSAgLyohPCBFdmVudCBNb2RlIHdpdGggUmlzaW5nL0ZhbGxpbmcgZWRnZSB0cmlnZ2VyIGRldGVjdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9GbGFzaF9Qb3dlckRvd24gIEZsYXNoIFBvd2VyIERvd24gbW9kZXMKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfRkxBU0hQRF9MUFJVTiAgICAgICAgICAgICAgICAgICBQV1JfQ1IxX0ZQRFIgICAgIC8qITwgRW5hYmxlIEZsYXNoIHBvd2VyIGRvd24gaW4gbG93IHBvd2VyIHJ1biBtb2RlICovCisjZGVmaW5lIFBXUl9GTEFTSFBEX0xQU0xFRVAgICAgICAgICAgICAgICAgIFBXUl9DUjFfRlBEUyAgICAgLyohPCBFbmFibGUgRmxhc2ggcG93ZXIgZG93biBpbiBsb3cgcG93ZXIgc2xlZXAgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9SZWd1bGF0b3JfVm9sdGFnZV9TY2FsZSAgUFdSIFJlZ3VsYXRvciB2b2x0YWdlIHNjYWxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSAgICAgICBQV1JfQ1IxX1ZPU18wICAgICAvKiE8IFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCByYW5nZSAxIG1vZGUsIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gNjQgTUh6ICovCisjZGVmaW5lIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTIgICAgICAgUFdSX0NSMV9WT1NfMSAgICAgLyohPCBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMiBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMCBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDE2IE1IeiAqLworLyoqCisgICogQH0KKyAgKi8KKworICAKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfVkJBVF9CYXR0ZXJ5X0NoYXJnaW5nX1NlbGVjdGlvbiBQV1IgYmF0dGVyeSBjaGFyZ2luZyByZXNpc3RvciBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl81ICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBWQkFUIGNoYXJnaW5nIHRocm91Z2ggYSA1IGtPaG1zIHJlc2lzdG9yICAgKi8KKyNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfMV81ICAgICAgICBQV1JfQ1I0X1ZCUlMgICAgICAgICAgIC8qITwgVkJBVCBjaGFyZ2luZyB0aHJvdWdoIGEgMS41IGtPaG1zIHJlc2lzdG9yICovCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfVkJBVF9CYXR0ZXJ5X0NoYXJnaW5nIFBXUiBiYXR0ZXJ5IGNoYXJnaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0JBVFRFUllfQ0hBUkdJTkdfRElTQUJMRSAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBQV1JfQkFUVEVSWV9DSEFSR0lOR19FTkFCTEUgICAgICAgICBQV1JfQ1I0X1ZCRQorLyoqCisgICogQH0KKyAgKi8gCisgIAorLyoqIEBkZWZncm91cCBQV1JFeF9HUElPX0JpdF9OdW1iZXIgR1BJTyBiaXQgbnVtYmVyIGZvciBJL08gc2V0dGluZyBpbiBzdGFuZGJ5L3NodXRkb3duIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMCAgIFBXUl9QVUNSQ19QQzAgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAwICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMSAgIFBXUl9QVUNSQ19QQzEgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMiAgIFBXUl9QVUNSQ19QQzIgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAyICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMyAgIFBXUl9QVUNSQ19QQzMgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAzICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfNCAgIFBXUl9QVUNSQ19QQzQgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA0ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfNSAgIFBXUl9QVUNSQ19QQzUgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA1ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfNiAgIFBXUl9QVUNSQ19QQzYgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA2ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfNyAgIFBXUl9QVUNSQ19QQzcgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA3ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfOCAgIFBXUl9QVUNSQ19QQzggICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA4ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfOSAgIFBXUl9QVUNSQ19QQzkgICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiA5ICAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTAgIFBXUl9QVUNSQ19QQzEwICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxMCAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTEgIFBXUl9QVUNSQ19QQzExICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxMSAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTIgIFBXUl9QVUNSQ19QQzEyICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxMiAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTMgIFBXUl9QVUNSQ19QQzEzICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxNCAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTQgIFBXUl9QRENSQ19QQzE0ICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxNCAqLworI2RlZmluZSBQV1JfR1BJT19CSVRfMTUgIFBXUl9QVUNSQ19QQzE1ICAgLyohPCBHUElPIHBvcnQgSS9PIHBpbiAxNSAqLworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFBXUkV4X0dQSU8gR1BJTyBwb3J0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX0dQSU9fQSAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBHUElPIHBvcnQgQSAqLworI2RlZmluZSBQV1JfR1BJT19CICAgMHgwMDAwMDAwMVUgICAgICAvKiE8IEdQSU8gcG9ydCBCICovCisjZGVmaW5lIFBXUl9HUElPX0MgICAweDAwMDAwMDAyVSAgICAgIC8qITwgR1BJTyBwb3J0IEMgKi8KKyNkZWZpbmUgUFdSX0dQSU9fRCAgIDB4MDAwMDAwMDNVICAgICAgLyohPCBHUElPIHBvcnQgRCAqLworI2RlZmluZSBQV1JfR1BJT19FICAgMHgwMDAwMDAwNFUgICAgICAvKiE8IEdQSU8gcG9ydCBFICovCisjZGVmaW5lIFBXUl9HUElPX0ggICAweDAwMDAwMDA3VSAgICAgIC8qITwgR1BJTyBwb3J0IEggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfQk9SX0NPTkZJR1VSQVRJT04gQk9SIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfQk9SX1NZU1RFTV9SRVNFVCAgICAgICAgICAgIChMTF9QV1JfQk9SX1NZU1RFTV9SRVNFVCkgICAgICAvKiE8IEJPUiB3aWxsIGdlbmVyYXRlIGEgc3lzdGVtIHJlc2V0ICAqLworI2RlZmluZSBQV1JfQk9SX1NNUFNfRk9SQ0VfQllQQVNTICAgICAgIChMTF9QV1JfQk9SX1NNUFNfRk9SQ0VfQllQQVNTKSAvKiE8IEJPUiB3aWxsIGZvciBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgaW4gYnlwYXNzIG1vZGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfU01QU19PUEVSQVRJTkdfTU9ERVMgU01QUyBzdGVwIGRvd24gY29udmVydGVyIG9wZXJhdGluZyBtb2RlcworICAqIEB7CisgICovCisvKiBOb3RlOiBMaXRlcmFscyB2YWx1ZXMgYXJlIGRlZmluZWQgZnJvbSByZWdpc3RlciBTUjIgYml0cyBTTVBTRiBhbmQgU01QU0JGICAqLworLyogICAgICAgYnV0IHRoZXkgYXJlIGFsc28gdXNlZCBhcyByZWdpc3RlciBDUjUgYml0cyBTTVBTRU4gYW5kIFNNUFNCRU4sICAgICAgKi8KKy8qICAgICAgIGFzIHVzZWQgYnkgYWxsIFNNUFMgb3BlcmF0aW5nIG1vZGUgZnVuY3Rpb25zIHRhcmdldHRpbmcgZGlmZmVyZW50ICAgICovCisvKiAgICAgICByZWdpc3RlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIkxMX1BXUl9TTVBTX1NldE1vZGUoKSIsICJMTF9QV1JfU01QU19HZXRNb2RlKCkiICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCAiTExfUFdSX1NNUFNfR2V0RWZmZWN0aXZlTW9kZSgpIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBXUl9TTVBTX0JZUEFTUyAgICAgICAgICAgICAgICAgKFBXUl9TUjJfU01QU0JGKSAvKiE8IFNNUFMgc3RlcCBkb3duIGluIGJ5cGFzcyBtb2RlICAqLworI2RlZmluZSBQV1JfU01QU19TVEVQX0RPV04gICAgICAgICAgICAgIChQV1JfU1IyX1NNUFNGKSAgLyohPCBTTVBTIHN0ZXAgZG93biBpbiBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcDAuIElmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBzdG9wMSwgc3RvcDIsIHN0YW5kYnksIHNodXRkb3duLCB0aGVuIFNNUFMgaXMgZm9yY2VkIGluIG1vZGUgb3BlbiB0byBwcmVzZXJ2ZSBlbmVyZ3kgc3RvcmVkIGluIGRlY291cGxpbmcgY2FwYWNpdG9yIGFzIGxvbmcgYXMgcG9zc2libGUuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X1NNUFNfU1RBUlRVUF9DVVJSRU5UIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF84ME1BICAgKDB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCA4MG1BICovCisjZGVmaW5lIFBXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xMDBNQSAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTU0NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCAxMDBtQSAqLworI2RlZmluZSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTIwTUEgICggICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTU0NfMSAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgMTIwbUEgKi8KKyNkZWZpbmUgUFdSX1NNUFNfU1RBUlRVUF9DVVJSRU5UXzE0ME1BICAoICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1NDXzEgfCBQV1JfQ1I1X1NNUFNTQ18wKSAvKiE8IFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IDE0MG1BICovCisjZGVmaW5lIFBXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xNjBNQSAgKFBXUl9DUjVfU01QU1NDXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCAxNjBtQSAqLworI2RlZmluZSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTgwTUEgIChQV1JfQ1I1X1NNUFNTQ18yIHwgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1NDXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgMTgwbUEgKi8KKyNkZWZpbmUgUFdSX1NNUFNfU1RBUlRVUF9DVVJSRU5UXzIwME1BICAoUFdSX0NSNV9TTVBTU0NfMiB8IFBXUl9DUjVfU01QU1NDXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IDIwMG1BICovCisjZGVmaW5lIFBXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8yMjBNQSAgKFBXUl9DUjVfU01QU1NDXzIgfCBQV1JfQ1I1X1NNUFNTQ18xIHwgUFdSX0NSNV9TTVBTU0NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCAyMjBtQSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9TTVBTX09VVFBVVF9WT0xUQUdFX0xFVkVMIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBvdXRwdXQgdm9sdGFnZSBzY2FsaW5nIHZvbHRhZ2UgbGV2ZWwKKyAgKiBAeworICAqLworLyogTm90ZTogU01QUyB2b2x0YWdlIGlzIHRyaW1tZWQgZHVyaW5nIGRldmljZSBwcm9kdWN0aW9uIHRvIGNvbnRyb2wKKyAgICAgICAgIHRoZSBhY3R1YWwgdm9sdGFnZSBsZXZlbCB2YXJpYXRpb24gZnJvbSBkZXZpY2UgdG8gZGV2aWNlLiAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjIwICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjIwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjI1ICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjI1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjMwICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18xICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjMwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjM1ICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18xIHwgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjM1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjQwICAoICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjQwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjQ1ICAoICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMiB8ICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjQ1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjUwICAoICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMiB8IFBXUl9DUjVfU01QU1ZPU18xICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjUwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjU1ICAoICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMiB8IFBXUl9DUjVfU01QU1ZPU18xIHwgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjU1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjYwICAoUFdSX0NSNV9TTVBTVk9TXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjYwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjY1ICAoUFdSX0NSNV9TTVBTVk9TXzMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjY1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjcwICAoUFdSX0NSNV9TTVBTVk9TXzMgfCAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18xICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjcwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjc1ICAoUFdSX0NSNV9TTVBTVk9TXzMgfCAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18xIHwgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjc1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjgwICAoUFdSX0NSNV9TTVBTVk9TXzMgfCBQV1JfQ1I1X1NNUFNWT1NfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjgwViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjg1ICAoUFdSX0NSNV9TTVBTVk9TXzMgfCBQV1JfQ1I1X1NNUFNWT1NfMiB8ICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjg1ViAqLworI2RlZmluZSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjkwICAoUFdSX0NSNV9TTVBTVk9TXzMgfCBQV1JfQ1I1X1NNUFNWT1NfMiB8IFBXUl9DUjVfU01QU1ZPU18xICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBvdXRwdXQgdm9sdGFnZSAxLjkwViAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9GbGFnICBQV1IgU3RhdHVzIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwIDAwMDAgMFhYWSBZWVlZYgorICAqICAgICAgICAgICAtIFkgWVlZWSAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBYWCByZWdpc3RlciAoNSBiaXRzKQorICAqICAgICAgICAgICAtIFhYICA6IFN0YXR1cyByZWdpc3RlciAoMiBiaXRzKQorICAqICAgICAgICAgICAgICAgICAtIDAxOiBTUjEgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDogU1IyIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTE6IEMyX1NDUiByZWdpc3RlcgorICAqICAgICAgICBUaGUgb25seSBleGNlcHRpb24gaXMgUFdSX0ZMQUdfV1VGLCBlbmNvbXBhc3NpbmcgYWxsCisgICogICAgICAgIHdha2UtdXAgZmxhZ3MgYW5kIHNldCB0byBQV1JfU1IxX1dVRi4gICAgCisgICogQHsKKyAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TUjEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgUFdSX0ZMQUdfV1VGMSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAyMFUpICAgLyohPCBXYWtldXAgZXZlbnQgb24gd2FrZXVwIHBpbiAxICovCisjZGVmaW5lIFBXUl9GTEFHX1dVRjIgICAgICAgICAgICAgICAgICAgICAgICgweDAwMjFVKSAgIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gMiAqLworI2RlZmluZSBQV1JfRkxBR19XVUYzICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDIyVSkgICAvKiE8IFdha2V1cCBldmVudCBvbiB3YWtldXAgcGluIDMgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfV1VGNCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAyM1UpICAgLyohPCBXYWtldXAgZXZlbnQgb24gd2FrZXVwIHBpbiA0ICovCisjZGVmaW5lIFBXUl9GTEFHX1dVRjUgICAgICAgICAgICAgICAgICAgICAgICgweDAwMjRVKSAgIC8qITwgV2FrZXVwIGV2ZW50IG9uIHdha2V1cCBwaW4gNSAqLworI2RlZmluZSBQV1JfRkxBR19XVSAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfU1IxX1dVRiAgICAgICAgICAvKiE8IEVuY29tcGFzcyB3YWtldXAgZXZlbnQgb24gYWxsIHdha2V1cCBwaW5zICovCisKKyNkZWZpbmUgUFdSX0ZMQUdfQkhXRiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAyOFUpICAgLyohPCBCTEVfSG9zdCBXYWtlVXAgRmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19GUkNCWVBJICAgICAgICAgICAgICAgICAgICAoMHgwMDI5VSkgICAvKiE8IFNNUFMgRm9yY2VkIGluIEJ5cGFzcyBJbnRlcnJ1cHQgRmxhZyAqLworCisjZGVmaW5lIFBXUl9GTEFHX1JGUEhBU0VJICAgICAgICAgICAgICAgICAgICgweDAwMkJVKSAgIC8qITwgUmFkaW8gUGhhc2UgSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfQkxFQUNUSSAgICAgICAgICAgICAgICAgICAgKDB4MDAyQ1UpICAgLyohPCBCTEUgQWN0aXZpdHkgSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfODAyQUNUSSAgICAgICAgICAgICAgICAgICAgKDB4MDAyRFUpICAgLyohPCA4MDIuMTUuNCBBY3Rpdml0eSBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19IT0xEQzJJICAgICAgICAgICAgICAgICAgICAoMHgwMDJFVSkgICAvKiE8IENQVTIgb24tSG9sZCBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19XVUZJICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDJGVSkgICAvKiE8IFdha2V1cCBvbiBpbnRlcm5hbCB3YWtldXAgbGluZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU1IyLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFBXUl9GTEFHX1NNUFNSRFlGICAgICAgICAgICAgICAgICAgICgweDAwNDBVKSAgIC8qITwgU01QUyBSZWFkeSBGbGFnICovCisjZGVmaW5lIFBXUl9GTEFHX1NNUFNCWVBGICAgICAgICAgICAgICAgICAgICgweDAwNDFVKSAgIC8qITwgU01QUyBCeXBhc3MgRmxhZyAqLworCisjZGVmaW5lIFBXUl9GTEFHX1JFR0xQUyAgICAgICAgICAgICAgICAgICAgICgweDAwNDhVKSAgIC8qITwgTG93LXBvd2VyIHJlZ3VsYXRvciBzdGFydCBmbGFnICovCisjZGVmaW5lIFBXUl9GTEFHX1JFR0xQRiAgICAgICAgICAgICAgICAgICAgICgweDAwNDlVKSAgIC8qITwgTG93LXBvd2VyIHJlZ3VsYXRvciBmbGFnICovCisKKyNkZWZpbmUgUFdSX0ZMQUdfVk9TRiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0QVUpICAgLyohPCBWb2x0YWdlIHNjYWxpbmcgZmxhZyAqLworI2RlZmluZSBQV1JfRkxBR19QVkRPICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDRCVSkgICAvKiE8IFBvd2VyIFZvbHRhZ2UgRGV0ZWN0b3Igb3V0cHV0IGZsYWcgKi8KKworI2RlZmluZSBQV1JfRkxBR19QVk1PMSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDRDVSkgICAvKiE8IFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAxIG91dHB1dCBmbGFnICovCisjZGVmaW5lIFBXUl9GTEFHX1BWTU8zICAgICAgICAgICAgICAgICAgICAgICgweDAwNEVVKSAgIC8qITwgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDMgb3V0cHV0IGZsYWcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FWFRTQ1ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBQV1JfRkxBR19TQiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDY4VSkgICAvKiE8IFN5c3RlbSBTdGFuZGJ5IGZsYWcgZm9yIENQVTEgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA2OVUpICAgLyohPCBTeXN0ZW0gU3RvcCBmbGFnIGZvciBDUFUxICovCisKKyNkZWZpbmUgUFdSX0ZMQUdfQzJTQiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA2QVUpICAgLyohPCBTeXN0ZW0gU3RhbmRieSBmbGFnIGZvciBDUFUyICovCisjZGVmaW5lIFBXUl9GTEFHX0MyU1RPUCAgICAgICAgICAgICAgICAgICAgICgweDAwNkJVKSAgIC8qITwgU3lzdGVtIFN0b3AgZmxhZyBmb3IgQ1BVMiAqLworCisjZGVmaW5lIFBXUl9GTEFHX0NSSVRJQ0FMX1JGX1BIQVNFICAgICAgICAgICgweDAwNkRVKSAgIC8qITwgQ3JpdGljYWwgcmFkaW8gc3lzdGVtIHBoYXNlIGZsYWcgKi8KKyNkZWZpbmUgUFdSX0ZMQUdfQzFERUVQU0xFRVAgICAgICAgICAgICAgICAgKDB4MDA2RVUpICAgLyohPCBDUFUxIERlZXBTbGVlcCBGbGFnICovCisjZGVmaW5lIFBXUl9GTEFHX0MyREVFUFNMRUVQICAgICAgICAgICAgICAgICgweDAwNkZVKSAgIC8qITwgQ1BVMiBEZWVwU2xlZXAgRmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JFeF9XYWtlVXBUYXJnZXRfRGVmaW5pdGlvbiBQV1IgV2FrZXVwIFRhcmdldCBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUFdSX1dBS0VVUFRBUkdFVF9DUFUxICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgUFdSX1dBS0VVUFRBUkdFVF9DUFUyICAgICAgICAgICgweDAwMDAwMDAyVSkKKyNkZWZpbmUgUFdSX1dBS0VVUFRBUkdFVF9BTExfQ1BVICAgICAgIChQV1JfV0FLRVVQVEFSR0VUX0NQVTEgfCBQV1JfV0FLRVVQVEFSR0VUX0NQVTIpCisjZGVmaW5lIFBXUl9XQUtFVVBUQVJHRVRfUkYgICAgICAgICAgICAoMHgwMDAwMDAwNFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUkV4X0NvcmVfU2VsZWN0IFBXUkV4IENvcmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFBXUl9DT1JFX0NQVTEgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFBXUl9DT1JFX0NQVTIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVUpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiogQGRlZmdyb3VwIFBXUl9Qcml2YXRlX0RlZmluZXMgUFdSIFByaXZhdGUgRGVmaW5lcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSRXhfUFZNX0VYVElfTElORSBQV1IgUFZNIGV4dGVybmFsIGludGVycnVwdHMgbGluZXMKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfRVhUSV9MSU5FX1BWTTEgIChMTF9FWFRJX0xJTkVfMzEpICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDMxIENvbm5lY3RlZCB0byBQVk0xICovCisjZGVmaW5lIFBXUl9FWFRJX0xJTkVfUFZNMyAgKExMX0VYVElfTElORV8zMykgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMzMgQ29ubmVjdGVkIHRvIFBWTTMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX1BWTV9Nb2RlX01hc2sgUFdSIFBWTSBNb2RlIE1hc2sKKyAgKiBAeworICAqLworLyogTm90ZTogT24gU1RNMzJXQiBzZXJpZSwgcG93ZXIgUFZEIGV2ZW50IGlzIG5vdCBhdmFpbGFibGUgb24gQUlFQyBsaW5lcyAgICAgKi8KKy8qICAgICAgIChvbmx5IGludGVycnVwdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCBBSUVDIGxpbmUgMTYpLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBWTV9NT0RFX0lUICAgICAgICAgICAgICAgKDB4MDAwMTAwMDBVKSAgLyohPCBNYXNrIGZvciBpbnRlcnJ1cHRpb24geWllbGRlZCBieSBQVk0gdGhyZXNob2xkIGNyb3NzaW5nICovCisjZGVmaW5lIFBWTV9NT0RFX0VWVCAgICAgICAgICAgICAgKDB4MDAwMjAwMDBVKSAgLyohPCBNYXNrIGZvciBldmVudCB5aWVsZGVkIGJ5IFBWTSB0aHJlc2hvbGQgY3Jvc3NpbmcgKi8KKyNkZWZpbmUgUFZNX1JJU0lOR19FREdFICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IE1hc2sgZm9yIHJpc2luZyBlZGdlIHNldCBhcyBQVk0gdHJpZ2dlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFZNX0ZBTExJTkdfRURHRSAgICAgICAgICAoMHgwMDAwMDAwMlUpICAvKiE8IE1hc2sgZm9yIGZhbGxpbmcgZWRnZSBzZXQgYXMgUFZNIHRyaWdnZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFZNX1JJU0lOR19GQUxMSU5HX0VER0UgICAoMHgwMDAwMDAwM1UpICAvKiE8IE1hc2sgZm9yIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyBzZXQgYXMgUFZNIHRyaWdnZXIgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUkV4X0V4cG9ydGVkX01hY3JvcyBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgTWFjcm9zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IEMxIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX0lUKCkgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJQzJfRU5BQkxFX0lUKCkgICBMTF9DMl9FWFRJX0VuYWJsZUlUXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0lUKCkgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgQzIgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSUMyX0RJU0FCTEVfSVQoKSAgTExfQzJfRVhUSV9EaXNhYmxlSVRfMF8zMShQV1JfRVhUSV9MSU5FX1BWTTEpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXZlbnQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRVZFTlQoKSAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShQV1JfRVhUSV9MSU5FX1BWTTEpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWTTEgRXZlbnQgQzIgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSUMyX0VOQUJMRV9FVkVOVCgpICAgTExfQzJfRVhUSV9FbmFibGVFdmVudF8wXzMxKFBXUl9FWFRJX0xJTkVfUFZNMSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXZlbnQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0VWRU5UKCkgIExMX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMSBFdmVudCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJQzJfRElTQUJMRV9FVkVOVCgpICBMTF9DMl9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKFBXUl9FWFRJX0xJTkVfUFZNMSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMSBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWTTEgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWTTEgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKFBXUl9FWFRJX0xJTkVfUFZNMSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTEgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEBub3RlICBQVk0xIGZsYWcgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRVhUSSBsaW5lLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgRVhUSSByaXNpbmcgYW5kIGZhbGxpbmcgbG9naWMgZWRnZXMgYXJlIGludmVydGVkIHZlcnN1cyBQVk0xIHZvbHRhZ2UgZWRnZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWTTEgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWTTEgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWTTEgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWTTEgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKFBXUl9FWFRJX0xJTkVfUFZNMSkKKworLyoqCisgICogQGJyaWVmICBQVk0xIEVYVEkgbGluZSBjb25maWd1cmF0aW9uOiBzZXQgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0xIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHNlbGVjdGVkIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9HRU5FUkFURV9TV0lUKCkgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKFBXUl9FWFRJX0xJTkVfUFZNMSkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQVk0xIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIEVYVEkgUFZNMSBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTFfRVhUSV9HRVRfRkxBRygpICBMTF9FWFRJX1JlYWRGbGFnXzBfMzEoUFdSX0VYVElfTElORV9QVk0xKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFBWTTEgRVhUSSBmbGFnLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNMV9FWFRJX0NMRUFSX0ZMQUcoKSAgTExfRVhUSV9DbGVhckZsYWdfMF8zMShQV1JfRVhUSV9MSU5FX1BWTTEpCisKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfSVQoKSAgIExMX0VYVElfRW5hYmxlSVRfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJQzJfRU5BQkxFX0lUKCkgICBMTF9DMl9FWFRJX0VuYWJsZUlUXzMyXzYzKFBXUl9FWFRJX0xJTkVfUFZNMykKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IEMxIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9JVCgpICBMTF9FWFRJX0Rpc2FibGVJVF8zMl82MyhQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJQzJfRElTQUJMRV9JVCgpICBMTF9DMl9FWFRJX0Rpc2FibGVJVF8zMl82MyhQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWTTMgRXZlbnQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfRVZFTlQoKSAgIExMX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0zIEV2ZW50IEMyIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElDMl9FTkFCTEVfRVZFTlQoKSAgIExMX0MyX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFdmVudCBDMSBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRVZFTlQoKSAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFdmVudCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJQzJfRElTQUJMRV9FVkVOVCgpICBMTF9DMl9FWFRJX0Rpc2FibGVFdmVudF8zMl82MyhQV1JfRVhUSV9MSU5FX1BWTTMpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEBub3RlICBQVk0zIGZsYWcgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRVhUSSBsaW5lLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgRVhUSSByaXNpbmcgYW5kIGZhbGxpbmcgbG9naWMgZWRnZXMgYXJlIGludmVydGVkIHZlcnN1cyBQVk0zIHZvbHRhZ2UgZWRnZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWTTMgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWTTMgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCkgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQVk0zIEV4dGVuZGVkIEludGVycnVwdCBGYWxsaW5nIFRyaWdnZXIuCisgICogQG5vdGUgIFBWTTMgZmxhZyBwb2xhcml0eSBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBFWFRJIGxpbmUsIHRoZXJlZm9yZQorICAqICAgICAgICBFWFRJIHJpc2luZyBhbmQgZmFsbGluZyBsb2dpYyBlZGdlcyBhcmUgaW52ZXJ0ZWQgdmVyc3VzIFBWTTMgdm9sdGFnZSBlZGdlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCkgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzMyXzYzKFBXUl9FWFRJX0xJTkVfUFZNMykKKworCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUFZNMyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICAqIEBub3RlICBQVk0zIGZsYWcgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRVhUSSBsaW5lLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgRVhUSSByaXNpbmcgYW5kIGZhbGxpbmcgbG9naWMgZWRnZXMgYXJlIGludmVydGVkIHZlcnN1cyBQVk0zIHZvbHRhZ2UgZWRnZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKSAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMzJfNjMoUFdSX0VYVElfTElORV9QVk0zKQorCisvKioKKyAgKiBAYnJpZWYgIFBWTTMgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb246IHNldCByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBWTTMgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyAmIEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gc2VsZWN0ZWQgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9QV1JfUFZNM19FWFRJX0dFTkVSQVRFX1NXSVQoKSBMTF9FWFRJX0dlbmVyYXRlU1dJXzMyXzYzKFBXUl9FWFRJX0xJTkVfUFZNMykKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQVk0zIEVYVEkgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcmV0dmFsIEVYVEkgUFZNMyBMaW5lIFN0YXR1cy4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9HRVRfRkxBRygpICBMTF9FWFRJX1JlYWRGbGFnXzMyXzYzKFBXUl9FWFRJX0xJTkVfUFZNMykKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBQVk0zIEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1BWTTNfRVhUSV9DTEVBUl9GTEFHKCkgIExMX0VYVElfQ2xlYXJGbGFnXzMyXzYzKFBXUl9FWFRJX0xJTkVfUFZNMykKKworCisvKioKKyAgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZS4KKyAgKiBAcGFyYW0gX19SRUdVTEFUT1JfXyBzcGVjaWZpZXMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBhY2hpZXZlCisgICogICAgICAgICBhIHRyYWRlb2ZmIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSAgUmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHJhbmdlIDEgbW9kZSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDY0IE1Iei4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyICBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMiBtb2RlLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjAgViwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTYgTUh6LgorICAqIEBub3RlICBUaGlzIG1hY3JvIGlzIHNpbWlsYXIgdG8gSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpIEFQSSBidXQgZG9lc24ndCBjaGVjaworICAqICAgICAgICB3aGV0aGVyIG9yIG5vdCBWT1NGIGZsYWcgaXMgY2xlYXJlZCB3aGVuIG1vdmluZyBmcm9tIHJhbmdlIDIgdG8gcmFuZ2UgMS4gVXNlcgorICAqICAgICAgICBtYXkgcmVzb3J0IHRvIF9fSEFMX1BXUl9HRVRfRkxBRygpIG1hY3JvIHRvIGNoZWNrIFZPU0YgYml0IHJlc2V0dGluZy4gICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUFdSX1ZPTFRBR0VTQ0FMSU5HX0NPTkZJRyhfX1JFR1VMQVRPUl9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIChfX1JFR1VMQVRPUl9fKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWcgPSBSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9WT1MpOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgV2FrZXVwIEJMRSBjb250cm9sbGVyIGZyb20gaXRzIHNsZWVwIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgd2hlbiA4MDIuMTUuNCBjb250cm9sbGVyCisgICogICAgICAgICBleGl0IGl0cyBzbGVlcCBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DMl9QV1JfV0FLRVVQX0JMRSgpIExMX0MyX1BXUl9XYWtlVXBfQkxFKCkKKworLyoqCisgICogQGJyaWVmICBXYWtldXAgODAyLjE1LjQgY29udHJvbGxlciBmcm9tIGl0cyBzbGVlcCBtb2RlCisgICogQG5vdGUgICBUaGlzIGJpdCBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHdoZW4gODAyLjE1LjQgY29udHJvbGxlcgorICAqICAgICAgICAgZXhpdCBpdHMgc2xlZXAgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQzJfUFdSX1dBS0VVUF84MDJfMTVfNCgpIExMX0MyX1BXUl9XYWtlVXBfODAyXzE1XzQoKQorCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCAgUFdSRXhfUHJpdmF0ZV9NYWNyb3MgICBQV1IgRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX1BXUl9XQUtFVVBfUElOKFBJTikgKCgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjFfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU4yX0hJR0gpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOM19ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUElOKSA9PSBQV1JfV0FLRVVQX1BJTjRfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBJTikgPT0gUFdSX1dBS0VVUF9QSU41X0hJR0gpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMV9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOMl9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElOM19MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElONF9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQSU4pID09IFBXUl9XQUtFVVBfUElONV9MT1cpKQorCisjZGVmaW5lIElTX1BXUl9XQUtFVVBfUElOX1BPTEFSSVRZKFBPTEFSSVRZKSAgKCgoUE9MQVJJVFkpID09IFBXUl9QSU5fUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTEFSSVRZKSA9PSBQV1JfUElOX1BPTEFSSVRZX0xPVykpCisKKworI2RlZmluZSBJU19QV1JfUFZNX1RZUEUoVFlQRSkgKCgoVFlQRSkgPT0gUFdSX1BWTV8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRZUEUpID09IFBXUl9QVk1fMykpCisKKyNkZWZpbmUgSVNfUFdSX1BWTV9NT0RFKE1PREUpICAoKChNT0RFKSA9PSBQV1JfUFZNX01PREVfTk9STUFMKSAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX0lUX1JJU0lORykgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9JVF9GQUxMSU5HKSAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfSVRfUklTSU5HX0ZBTExJTkcpICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUFdSX1BWTV9NT0RFX0VWRU5UX1JJU0lORykgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFBXUl9QVk1fTU9ERV9FVkVOVF9GQUxMSU5HKSAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBQV1JfUFZNX01PREVfRVZFTlRfUklTSU5HX0ZBTExJTkcpKSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBJU19QV1JfRkxBU0hfUE9XRVJET1dOKF9fTU9ERV9fKSAgICAoKCgoX19NT0RFX18pICYgKFBXUl9GTEFTSFBEX0xQUlVOIHwgUFdSX0ZMQVNIUERfTFBTTEVFUCkpICE9IDB4MDB1KSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX01PREVfXykgJiB+KFBXUl9GTEFTSFBEX0xQUlVOIHwgUFdSX0ZMQVNIUERfTFBTTEVFUCkpID09IDB4MDB1KSkKKworI2RlZmluZSBJU19QV1JfVk9MVEFHRV9TQ0FMSU5HX1JBTkdFKFJBTkdFKSAoKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQU5HRSkgPT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMikpCisKKworI2RlZmluZSBJU19QV1JfQkFUVEVSWV9SRVNJU1RPUl9TRUxFQ1QoUkVTSVNUT1IpICgoKFJFU0lTVE9SKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19SRVNJU1RPUl81KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNJU1RPUikgPT0gUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfMV81KSkgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSVNfUFdSX0JBVFRFUllfQ0hBUkdJTkcoQ0hBUkdJTkcpICgoKENIQVJHSU5HKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19ESVNBQkxFKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQVJHSU5HKSA9PSBQV1JfQkFUVEVSWV9DSEFSR0lOR19FTkFCTEUpKSAKKworCisjZGVmaW5lIElTX1BXUl9HUElPX0JJVF9OVU1CRVIoQklUX05VTUJFUikgKCgoQklUX05VTUJFUikgJiBHUElPX1BJTl9NQVNLKSAhPSAodWludDMyX3QpMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIElTX1BXUl9HUElPKEdQSU8pICgoKEdQSU8pID09IFBXUl9HUElPX0EpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHUElPKSA9PSBQV1JfR1BJT19CKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR1BJTykgPT0gUFdSX0dQSU9fQykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEdQSU8pID09IFBXUl9HUElPX0QpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHUElPKSA9PSBQV1JfR1BJT19FKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoR1BJTykgPT0gUFdSX0dQSU9fSCkpCisKKyNkZWZpbmUgSVNfUFdSX1NNUFNfTU9ERShTTVBTX01PREUpICgoKFNNUFNfTU9ERSkgPT0gUFdSX1NNUFNfQllQQVNTKSAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfTU9ERSkgPT0gUFdSX1NNUFNfU1RFUF9ET1dOKSkKKworI2RlZmluZSBJU19QV1JfU01QU19TVEFSVFVQX0NVUlJFTlQoU01QU19TVEFSVFVQX0NVUlJFTlQpICgoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfODBNQSkgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTAwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTIwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTQwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTYwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTgwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMjAwTUEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfU1RBUlRVUF9DVVJSRU5UKSA9PSBQV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMjIwTUEpKQorCisjZGVmaW5lIElTX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFKFNNUFNfT1VUUFVUX1ZPTFRBR0UpICgoKFNNUFNfT1VUUFVUX1ZPTFRBR0UpID09IFBXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMjApIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTTVBTX09VVFBVVF9WT0xUQUdFKSA9PSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjI1KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU01QU19PVVRQVVRfVk9MVEFHRSkgPT0gUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVYzMCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfT1VUUFVUX1ZPTFRBR0UpID09IFBXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMzUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTTVBTX09VVFBVVF9WT0xUQUdFKSA9PSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjQwKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU01QU19PVVRQVVRfVk9MVEFHRSkgPT0gUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY0NSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfT1VUUFVUX1ZPTFRBR0UpID09IFBXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTApIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTTVBTX09VVFBVVF9WT0xUQUdFKSA9PSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjU1KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU01QU19PVVRQVVRfVk9MVEFHRSkgPT0gUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY2MCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfT1VUUFVUX1ZPTFRBR0UpID09IFBXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNjUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTTVBTX09VVFBVVF9WT0xUQUdFKSA9PSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjcwKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU01QU19PVVRQVVRfVk9MVEFHRSkgPT0gUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY3NSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNNUFNfT1VUUFVUX1ZPTFRBR0UpID09IFBXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWODApIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTTVBTX09VVFBVVF9WT0xUQUdFKSA9PSBQV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjg1KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU01QU19PVVRQVVRfVk9MVEFHRSkgPT0gUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY5MCkpCisKKyNkZWZpbmUgSVNfUFdSX0NPUkUoQ1BVKSAgKCgoQ1BVKSA9PSBQV1JfQ09SRV9DUFUxKSB8fCAoKENQVSkgPT0gUFdSX0NPUkVfQ1BVMikpCisKKyNkZWZpbmUgSVNfUFdSX0NPUkVfSE9MRF9SRUxFQVNFKENQVSkgICgoQ1BVKSA9PSBQV1JfQ09SRV9DUFUyKQorCisvKioKKyAgKiBAfQorICAqLworICAKKworLyoqIEBhZGR0b2dyb3VwIFBXUkV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBQV1IgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqIEB7CisgICovCisKKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90ICAgICAgICAgIEhBTF9QV1JFeF9HZXRWb2x0YWdlUmFuZ2Uodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUJhdHRlcnlDaGFyZ2luZyh1aW50MzJfdCBSZXNpc3RvclNlbGVjdGlvbik7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUJhdHRlcnlDaGFyZ2luZyh2b2lkKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVZkZFVTQih2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlVmRkVVNCKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlSW50ZXJuYWxXYWtlVXBMaW5lKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVJbnRlcm5hbFdha2VVcExpbmUodm9pZCk7CisKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVCT1JIX1NNUFNCeXBhc3NJVCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlQk9SSF9TTVBTQnlwYXNzSVQodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlUkZQaGFzZUlUKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVSRlBoYXNlSVQodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlQkxFQWN0aXZpdHlJVCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlQkxFQWN0aXZpdHlJVCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGU4MDJBY3Rpdml0eUlUKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGU4MDJBY3Rpdml0eUlUKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUhPTERDMklUKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVIT0xEQzJJVCh2b2lkKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0hvbGRDb3JlKHVpbnQzMl90IENQVSk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfUmVsZWFzZUNvcmUodWludDMyX3QgQ1BVKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsVXAodWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsVXAodWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcik7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfU2V0Qk9SQ29uZmlnKHVpbnQzMl90IEJPUkNvbmZpZ3VyYXRpb24pOwordWludDMyX3QgICAgICAgICAgSEFMX1BXUkV4X0dldEJPUkNvbmZpZyh2b2lkKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVNSQU1SZXRlbnRpb24odm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVNSQU1SZXRlbnRpb24odm9pZCk7CisKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVGbGFzaFBvd2VyRG93bih1aW50MzJfdCBQb3dlck1vZGUpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0Rpc2FibGVGbGFzaFBvd2VyRG93bih1aW50MzJfdCBQb3dlck1vZGUpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW5hYmxlUFZNMSh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlUFZNMSh2b2lkKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVBWTTModm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZVBWTTModm9pZCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9Db25maWdQVk0oUFdSX1BWTVR5cGVEZWYgKnNDb25maWdQVk0pOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29uZmlnU01QUyhQV1JfU01QU1R5cGVEZWYgKnNDb25maWdTTVBTKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9TTVBTX1NldE1vZGUodWludDMyX3QgT3BlcmF0aW5nTW9kZSk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUFdSRXhfU01QU19HZXRFZmZlY3RpdmVNb2RlKHZvaWQpOworCisvKiBXYWtlVXAgcGlucyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSwgdWludDMyX3Qgd2FrZXVwVGFyZ2V0KTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9QV1JFeF9HZXRXYWtldXBGbGFnKHVpbnQzMl90IFdha2VVcEZsYWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0NsZWFyV2FrZXVwRmxhZyh1aW50MzJfdCBXYWtlVXBGbGFnKTsKKworLyogTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSh2b2lkKTsKKwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VudGVyU1RPUDBNb2RlKHVpbnQ4X3QgU1RPUEVudHJ5KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9QV1JFeF9FbnRlclNUT1AxTW9kZSh1aW50OF90IFNUT1BFbnRyeSk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfRW50ZXJTVE9QMk1vZGUodWludDhfdCBTVE9QRW50cnkpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X0VudGVyU0hVVERPV05Nb2RlKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUFdSRXhfUFZNMUNhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTNDYWxsYmFjayh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9QV1JfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfcXNwaS5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfcXNwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NGJkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9xc3BpLmgKQEAgLTAsMCArMSw3MDggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3FzcGkuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUVNQSSBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1FTUElfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1FTUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKyNpZiBkZWZpbmVkKFFVQURTUEkpIHx8IGRlZmluZWQoUVVBRFNQSTEpIHx8IGRlZmluZWQoUVVBRFNQSTIpCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBRU1BJCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9UeXBlcyBRU1BJIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBRU1BJIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENsb2NrUHJlc2NhbGVyOyAgICAgLyogU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgZmFjdG9yIGZvciBnZW5lcmF0aW5nIGNsb2NrIGJhc2VkIG9uIHRoZSBBSEIgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1ICovCisgIHVpbnQzMl90IEZpZm9UaHJlc2hvbGQ7ICAgICAgLyogU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBGSUZPICh1c2VkIG9ubHkgaW4gaW5kaXJlY3QgbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDE2ICovCisgIHVpbnQzMl90IFNhbXBsZVNoaWZ0aW5nOyAgICAgLyogU3BlY2lmaWVzIHRoZSBTYW1wbGUgU2hpZnQuIFRoZSBkYXRhIGlzIHNhbXBsZWQgMS8yIGNsb2NrIGN5Y2xlIGRlbGF5IGxhdGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSBpbiBhY2NvdW50IGV4dGVybmFsIHNpZ25hbCBkZWxheXMuIChJdCBzaG91bGQgYmUgUVNQSV9TQU1QTEVfU0hJRlRJTkdfTk9ORSBpbiBERFIgbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfU2FtcGxlU2hpZnRpbmcgKi8KKyAgdWludDMyX3QgRmxhc2hTaXplOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEZsYXNoIFNpemUuIEZsYXNoU2l6ZSsxIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgdG8gYWRkcmVzcyB0aGUgZmxhc2ggbWVtb3J5LiBUaGUgZmxhc2ggY2FwYWNpdHkgY2FuIGJlIHVwIHRvIDRHQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzZWQgdXNpbmcgMzIgYml0cykgaW4gaW5kaXJlY3QgbW9kZSwgYnV0IHRoZSBhZGRyZXNzYWJsZSBzcGFjZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS1tYXBwZWQgbW9kZSBpcyBsaW1pdGVkIHRvIDI1Nk1CCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMzEgKi8KKyAgdWludDMyX3QgQ2hpcFNlbGVjdEhpZ2hUaW1lOyAvKiBTcGVjaWZpZXMgdGhlIENoaXAgU2VsZWN0IEhpZ2ggVGltZS4gQ2hpcFNlbGVjdEhpZ2hUaW1lKzEgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjbG9jayBjeWNsZXMgd2hpY2ggdGhlIGNoaXAgc2VsZWN0IG11c3QgcmVtYWluIGhpZ2ggYmV0d2VlbiBjb21tYW5kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2hpcFNlbGVjdEhpZ2hUaW1lICovCisgIHVpbnQzMl90IENsb2NrTW9kZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBDbG9jayBNb2RlLiBJdCBpbmRpY2F0ZXMgdGhlIGxldmVsIHRoYXQgY2xvY2sgdGFrZXMgYmV0d2VlbiBjb21tYW5kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2xvY2tNb2RlICovCit9UVNQSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIEhBTCBRU1BJIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9RU1BJX1NUQVRFX1JFU0VUICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBub3QgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1FTUElfU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAgICAqLworICBIQUxfUVNQSV9TVEFURV9CVVNZICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFBlcmlwaGVyYWwgaW4gaW5kaXJlY3QgbW9kZSBhbmQgYnVzeSAgICAgICAgICAgICAgICAgICovCisgIEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFggID0gMHgxMlUsICAgIC8qITwgUGVyaXBoZXJhbCBpbiBpbmRpcmVjdCBtb2RlIHdpdGggdHJhbnNtaXNzaW9uIG9uZ29pbmcgKi8KKyAgSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWCAgPSAweDIyVSwgICAgLyohPCBQZXJpcGhlcmFsIGluIGluZGlyZWN0IG1vZGUgd2l0aCByZWNlcHRpb24gb25nb2luZyAgICAqLworICBIQUxfUVNQSV9TVEFURV9CVVNZX0FVVE9fUE9MTElORyA9IDB4NDJVLCAgICAvKiE8IFBlcmlwaGVyYWwgaW4gYXV0byBwb2xsaW5nIG1vZGUgb25nb2luZyAgICAgICAgICAgICAgICovCisgIEhBTF9RU1BJX1NUQVRFX0JVU1lfTUVNX01BUFBFRCAgID0gMHg4MlUsICAgIC8qITwgUGVyaXBoZXJhbCBpbiBtZW1vcnkgbWFwcGVkIG1vZGUgb25nb2luZyAgICAgICAgICAgICAgKi8KKyAgSEFMX1FTUElfU1RBVEVfQUJPUlQgICAgICAgICAgICAgPSAweDA4VSwgICAgLyohPCBQZXJpcGhlcmFsIHdpdGggYWJvcnQgcmVxdWVzdCBvbmdvaW5nICAgICAgICAgICAgICAgICAqLworICBIQUxfUVNQSV9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgICAvKiE8IFBlcmlwaGVyYWwgaW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9SEFMX1FTUElfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFFTUEkgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fUVNQSV9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZgoreworICBRVUFEU1BJX1R5cGVEZWYgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAvKiBRU1BJIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICovCisgIFFTUElfSW5pdFR5cGVEZWYgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qIFFTUEkgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgLyogUG9pbnRlciB0byBRU1BJIFR4IHRyYW5zZmVyIEJ1ZmZlciAqLworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAvKiBRU1BJIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgIC8qIFFTUEkgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgLyogUG9pbnRlciB0byBRU1BJIFJ4IHRyYW5zZmVyIEJ1ZmZlciAqLworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgICAvKiBRU1BJIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgIC8qIFFTUEkgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgKi8KKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgKmhkbWE7ICAgICAgICAgICAgLyogUVNQSSBSeC9UeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAqLworICBfX0lPIEhBTF9Mb2NrVHlwZURlZiAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gSEFMX1FTUElfU3RhdGVUeXBlRGVmIFN0YXRlOyAgICAgICAgICAgIC8qIFFTUEkgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgKi8KKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyogUVNQSSBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBUaW1lb3V0OyAgICAgICAgICAvKiBUaW1lb3V0IGZvciB0aGUgUVNQSSBtZW1vcnkgYWNjZXNzICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKSAgICAgICAgKHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKSAgICAoc3RydWN0IF9fUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CisgIHZvaWQgKCogRmlmb1RocmVzaG9sZENhbGxiYWNrKShzdHJ1Y3QgX19RU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKyAgdm9pZCAoKiBDbWRDcGx0Q2FsbGJhY2spICAgICAgKHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKSAgICAgICAoc3RydWN0IF9fUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spICAgICAgIChzdHJ1Y3QgX19RU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKyAgdm9pZCAoKiBSeEhhbGZDcGx0Q2FsbGJhY2spICAgKHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworICB2b2lkICgqIFR4SGFsZkNwbHRDYWxsYmFjaykgICAoc3RydWN0IF9fUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CisgIHZvaWQgKCogU3RhdHVzTWF0Y2hDYWxsYmFjaykgIChzdHJ1Y3QgX19RU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKyAgdm9pZCAoKiBUaW1lT3V0Q2FsbGJhY2spICAgICAgKHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKSAgICAgIChzdHJ1Y3QgX19RU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykgICAgKHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworI2VuZGlmCit9UVNQSV9IYW5kbGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFFTUEkgQ29tbWFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgSW5zdHJ1Y3Rpb247ICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEluc3RydWN0aW9uIHRvIGJlIHNlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSAoOC1iaXQpIGJldHdlZW4gMHgwMCBhbmQgMHhGRiAqLworICB1aW50MzJfdCBBZGRyZXNzOyAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgQWRkcmVzcyB0byBiZSBzZW50IChTaXplIGZyb20gMSB0byA0IGJ5dGVzIGFjY29yZGluZyBBZGRyZXNzU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSAoMzItYml0cykgYmV0d2VlbiAweDAgYW5kIDB4RkZGRkZGRkYgKi8KKyAgdWludDMyX3QgQWx0ZXJuYXRlQnl0ZXM7ICAgICAvKiBTcGVjaWZpZXMgdGhlIEFsdGVybmF0ZSBCeXRlcyB0byBiZSBzZW50IChTaXplIGZyb20gMSB0byA0IGJ5dGVzIGFjY29yZGluZyBBbHRlcm5hdGVCeXRlc1NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgKDMyLWJpdHMpIGJldHdlZW4gMHgwIGFuZCAweEZGRkZGRkZGICovCisgIHVpbnQzMl90IEFkZHJlc3NTaXplOyAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBBZGRyZXNzIFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQWRkcmVzc1NpemUgKi8KKyAgdWludDMyX3QgQWx0ZXJuYXRlQnl0ZXNTaXplOyAvKiBTcGVjaWZpZXMgdGhlIEFsdGVybmF0ZSBCeXRlcyBTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX0FsdGVybmF0ZUJ5dGVzU2l6ZSAqLworICB1aW50MzJfdCBEdW1teUN5Y2xlczsgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgTnVtYmVyIG9mIER1bW15IEN5Y2xlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAzMSAqLworICB1aW50MzJfdCBJbnN0cnVjdGlvbk1vZGU7ICAgIC8qIFNwZWNpZmllcyB0aGUgSW5zdHJ1Y3Rpb24gTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9JbnN0cnVjdGlvbk1vZGUgKi8KKyAgdWludDMyX3QgQWRkcmVzc01vZGU7ICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEFkZHJlc3MgTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9BZGRyZXNzTW9kZSAqLworICB1aW50MzJfdCBBbHRlcm5hdGVCeXRlTW9kZTsgIC8qIFNwZWNpZmllcyB0aGUgQWx0ZXJuYXRlIEJ5dGVzIE1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQWx0ZXJuYXRlQnl0ZXNNb2RlICovCisgIHVpbnQzMl90IERhdGFNb2RlOyAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBEYXRhIE1vZGUgKHVzZWQgZm9yIGR1bW15IGN5Y2xlcyBhbmQgZGF0YSBwaGFzZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX0RhdGFNb2RlICovCisgIHVpbnQzMl90IE5iRGF0YTsgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4gKFRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAoMCBtZWFucyB1bmRlZmluZWQgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgZW5kIG9mIG1lbW9yeSkqLworICB1aW50MzJfdCBEZHJNb2RlOyAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgZG91YmxlIGRhdGEgcmF0ZSBtb2RlIGZvciBhZGRyZXNzLCBhbHRlcm5hdGUgYnl0ZSBhbmQgZGF0YSBwaGFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9EZHJNb2RlICovCisgIHVpbnQzMl90IFNJT09Nb2RlOyAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBzZW5kIGluc3RydWN0aW9uIG9ubHkgb25jZSBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX1NJT09Nb2RlICovCit9UVNQSV9Db21tYW5kVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBRU1BJIEF1dG8gUG9sbGluZyBtb2RlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE1hdGNoOyAgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBtYXNrZWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBhIG1hdGNoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkZGRkZGICovCisgIHVpbnQzMl90IE1hc2s7ICAgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBtYXNrIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHN0YXR1cyBieXRlcyByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAqLworICB1aW50MzJfdCBJbnRlcnZhbDsgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIHR3byByZWFkIGR1cmluZyBhdXRvbWF0aWMgcG9sbGluZyBwaGFzZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRiAqLworICB1aW50MzJfdCBTdGF0dXNCeXRlc1NpemU7ICAgIC8qIFNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgc3RhdHVzIGJ5dGVzIHJlY2VpdmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAxIGFuZCA0ICovCisgIHVpbnQzMl90IE1hdGNoTW9kZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBtZXRob2QgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgYSBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfTWF0Y2hNb2RlICovCisgIHVpbnQzMl90IEF1dG9tYXRpY1N0b3A7ICAgICAgLyogU3BlY2lmaWVzIGlmIGF1dG9tYXRpYyBwb2xsaW5nIGlzIHN0b3BwZWQgYWZ0ZXIgYSBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQXV0b21hdGljU3RvcCAqLworfVFTUElfQXV0b1BvbGxpbmdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFFTUEkgTWVtb3J5IE1hcHBlZCBtb2RlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWVPdXRQZXJpb2Q7ICAgICAgLyogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2xvY2sgdG8gd2FpdCB3aGVuIHRoZSBGSUZPIGlzIGZ1bGwgYmVmb3JlIHRvIHJlbGVhc2UgdGhlIGNoaXAgc2VsZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkYgKi8KKyAgdWludDMyX3QgVGltZU91dEFjdGl2YXRpb247ICAvKiBTcGVjaWZpZXMgaWYgdGhlIHRpbWVvdXQgY291bnRlciBpcyBlbmFibGVkIHRvIHJlbGVhc2UgdGhlIGNoaXAgc2VsZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9UaW1lT3V0QWN0aXZhdGlvbiAqLworfVFTUElfTWVtb3J5TWFwcGVkVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBRU1BJIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfUVNQSV9FUlJPUl9DQl9JRCAgICAgICAgICA9IDB4MDBVLCAgLyohPCBRU1BJIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgKi8KKyAgSEFMX1FTUElfQUJPUlRfQ0JfSUQgICAgICAgICAgPSAweDAxVSwgIC8qITwgUVNQSSBBYm9ydCBDYWxsYmFjayBJRCAgICAgICAgICAgICovCisgIEhBTF9RU1BJX0ZJRk9fVEhSRVNIT0xEX0NCX0lEID0gMHgwMlUsICAvKiE8IFFTUEkgRklGTyBUaHJlc2hvbGQgQ2FsbGJhY2sgSUQgICAqLworICBIQUxfUVNQSV9DTURfQ1BMVF9DQl9JRCAgICAgICA9IDB4MDNVLCAgLyohPCBRU1BJIENvbW1hbmQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1FTUElfUlhfQ1BMVF9DQl9JRCAgICAgICAgPSAweDA0VSwgIC8qITwgUVNQSSBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICovCisgIEhBTF9RU1BJX1RYX0NQTFRfQ0JfSUQgICAgICAgID0gMHgwNVUsICAvKiE8IFFTUEkgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAqLworICBIQUxfUVNQSV9SWF9IQUxGX0NQTFRfQ0JfSUQgICA9IDB4MDZVLCAgLyohPCBRU1BJIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1FTUElfVFhfSEFMRl9DUExUX0NCX0lEICAgPSAweDA3VSwgIC8qITwgUVNQSSBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICovCisgIEhBTF9RU1BJX1NUQVRVU19NQVRDSF9DQl9JRCAgID0gMHgwOFUsICAvKiE8IFFTUEkgU3RhdHVzIE1hdGNoIENhbGxiYWNrIElEICAgICAqLworICBIQUxfUVNQSV9USU1FT1VUX0NCX0lEICAgICAgICA9IDB4MDlVLCAgLyohPCBRU1BJIFRpbWVvdXQgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKworICBIQUxfUVNQSV9NU1BfSU5JVF9DQl9JRCAgICAgICA9IDB4MEFVLCAgLyohPCBRU1BJIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgKi8KKyAgSEFMX1FTUElfTVNQX0RFSU5JVF9DQl9JRCAgICAgPSAweDBCMCAgIC8qITwgUVNQSSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICovCit9SEFMX1FTUElfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFFTUEkgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHZvaWQgKCpwUVNQSV9DYWxsYmFja1R5cGVEZWYpKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0NvbnN0YW50cyBRU1BJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9FcnJvckNvZGUgUVNQSSBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9RU1BJX0VSUk9SX1RSQU5TRkVSICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBUcmFuc2ZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfRE1BICAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNICAgIDB4MDAwMDAwMDhVIC8qITwgSW52YWxpZCBwYXJhbWV0ZXJzIGVycm9yICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAweDAwMDAwMDEwVSAvKiE8IEludmFsaWQgY2FsbGJhY2sgZXJyb3IgICAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfU2FtcGxlU2hpZnRpbmcgUVNQSSBTYW1wbGUgU2hpZnRpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX1NBTVBMRV9TSElGVElOR19OT05FICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgLyohPE5vIGNsb2NrIGN5Y2xlIHNoaWZ0IHRvIHNhbXBsZSBkYXRhKi8KKyNkZWZpbmUgUVNQSV9TQU1QTEVfU0hJRlRJTkdfSEFMRkNZQ0xFICgodWludDMyX3QpUVVBRFNQSV9DUl9TU0hJRlQpIC8qITwxLzIgY2xvY2sgY3ljbGUgc2hpZnQgdG8gc2FtcGxlIGRhdGEqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX0NoaXBTZWxlY3RIaWdoVGltZSBRU1BJIENoaXBTZWxlY3QgSGlnaCBUaW1lCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfMV9DWUNMRSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMSBjbG9jayBjeWNsZSBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfMl9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMiBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzNfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMSkgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDMgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV80X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzAgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA0IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNV9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8yKSAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgNSBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzZfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMiB8IFFVQURTUElfRENSX0NTSFRfMCkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDYgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV83X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA3IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfOF9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgOCBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfQ2xvY2tNb2RlIFFTUEkgQ2xvY2sgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFFTUElfQ0xPQ0tfTU9ERV8wICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPENsayBzdGF5cyBsb3cgd2hpbGUgbkNTIGlzIHJlbGVhc2VkKi8KKyNkZWZpbmUgUVNQSV9DTE9DS19NT0RFXzMgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ0tNT0RFKSAvKiE8Q2xrIGdvZXMgaGlnaCB3aGlsZSBuQ1MgaXMgcmVsZWFzZWQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX0FkZHJlc3NTaXplIFFTUEkgQWRkcmVzcyBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUVNQSV9BRERSRVNTXzhfQklUUyAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITw4LWJpdCBhZGRyZXNzKi8KKyNkZWZpbmUgUVNQSV9BRERSRVNTXzE2X0JJVFMgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQURTSVpFXzApIC8qITwxNi1iaXQgYWRkcmVzcyovCisjZGVmaW5lIFFTUElfQUREUkVTU18yNF9CSVRTICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FEU0laRV8xKSAvKiE8MjQtYml0IGFkZHJlc3MqLworI2RlZmluZSBRU1BJX0FERFJFU1NfMzJfQklUUyAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BRFNJWkUpICAgLyohPDMyLWJpdCBhZGRyZXNzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9BbHRlcm5hdGVCeXRlc1NpemUgUVNQSSBBbHRlcm5hdGUgQnl0ZXMgU2l6ZQorICAqIEB7CisgICovCisjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTXzhfQklUUyAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8OC1iaXQgYWx0ZXJuYXRlIGJ5dGVzKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfMTZfQklUUyAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJTSVpFXzApIC8qITwxNi1iaXQgYWx0ZXJuYXRlIGJ5dGVzKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfMjRfQklUUyAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJTSVpFXzEpIC8qITwyNC1iaXQgYWx0ZXJuYXRlIGJ5dGVzKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfMzJfQklUUyAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJTSVpFKSAgIC8qITwzMi1iaXQgYWx0ZXJuYXRlIGJ5dGVzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9JbnN0cnVjdGlvbk1vZGUgUVNQSSBJbnN0cnVjdGlvbiBNb2RlCisqIEB7CisqLworI2RlZmluZSBRU1BJX0lOU1RSVUNUSU9OX05PTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8Tm8gaW5zdHJ1Y3Rpb24qLworI2RlZmluZSBRU1BJX0lOU1RSVUNUSU9OXzFfTElORSAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9JTU9ERV8wKSAvKiE8SW5zdHJ1Y3Rpb24gb24gYSBzaW5nbGUgbGluZSovCisjZGVmaW5lIFFTUElfSU5TVFJVQ1RJT05fMl9MSU5FUyAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0lNT0RFXzEpIC8qITxJbnN0cnVjdGlvbiBvbiB0d28gbGluZXMqLworI2RlZmluZSBRU1BJX0lOU1RSVUNUSU9OXzRfTElORVMgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9JTU9ERSkgICAvKiE8SW5zdHJ1Y3Rpb24gb24gZm91ciBsaW5lcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc01vZGUgUVNQSSBBZGRyZXNzIE1vZGUKKyogQHsKKyovCisjZGVmaW5lIFFTUElfQUREUkVTU19OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8Tm8gYWRkcmVzcyovCisjZGVmaW5lIFFTUElfQUREUkVTU18xX0xJTkUgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FETU9ERV8wKSAvKiE8QWRkcmVzcyBvbiBhIHNpbmdsZSBsaW5lKi8KKyNkZWZpbmUgUVNQSV9BRERSRVNTXzJfTElORVMgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQURNT0RFXzEpIC8qITxBZGRyZXNzIG9uIHR3byBsaW5lcyovCisjZGVmaW5lIFFTUElfQUREUkVTU180X0xJTkVTICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FETU9ERSkgICAvKiE8QWRkcmVzcyBvbiBmb3VyIGxpbmVzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9BbHRlcm5hdGVCeXRlc01vZGUgUVNQSSBBbHRlcm5hdGUgQnl0ZXMgTW9kZQorKiBAeworKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITxObyBhbHRlcm5hdGUgYnl0ZXMqLworI2RlZmluZSBRU1BJX0FMVEVSTkFURV9CWVRFU18xX0xJTkUgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BQk1PREVfMCkgLyohPEFsdGVybmF0ZSBieXRlcyBvbiBhIHNpbmdsZSBsaW5lKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfMl9MSU5FUyAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJNT0RFXzEpIC8qITxBbHRlcm5hdGUgYnl0ZXMgb24gdHdvIGxpbmVzKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfNF9MSU5FUyAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJNT0RFKSAgIC8qITxBbHRlcm5hdGUgYnl0ZXMgb24gZm91ciBsaW5lcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfRGF0YU1vZGUgUVNQSSBEYXRhIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX0RBVEFfTk9ORSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8Tm8gZGF0YSovCisjZGVmaW5lIFFTUElfREFUQV8xX0xJTkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0RNT0RFXzApIC8qITxEYXRhIG9uIGEgc2luZ2xlIGxpbmUqLworI2RlZmluZSBRU1BJX0RBVEFfMl9MSU5FUyAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ETU9ERV8xKSAvKiE8RGF0YSBvbiB0d28gbGluZXMqLworI2RlZmluZSBRU1BJX0RBVEFfNF9MSU5FUyAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ETU9ERSkgICAvKiE8RGF0YSBvbiBmb3VyIGxpbmVzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJNb2RlIFFTUEkgRERSIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX0REUl9NT0RFX0RJU0FCTEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8RG91YmxlIGRhdGEgcmF0ZSBtb2RlIGRpc2FibGVkKi8KKyNkZWZpbmUgUVNQSV9ERFJfTU9ERV9FTkFCTEUgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfRERSTSkgLyohPERvdWJsZSBkYXRhIHJhdGUgbW9kZSBlbmFibGVkKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9TSU9PTW9kZSBRU1BJIFNlbmQgSW5zdHJ1Y3Rpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFFTUElfU0lPT19JTlNUX0VWRVJZX0NNRCAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgIC8qITxTZW5kIGluc3RydWN0aW9uIG9uIGV2ZXJ5IHRyYW5zYWN0aW9uKi8KKyNkZWZpbmUgUVNQSV9TSU9PX0lOU1RfT05MWV9GSVJTVF9DTUQgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfU0lPTykgLyohPFNlbmQgaW5zdHJ1Y3Rpb24gb25seSBmb3IgdGhlIGZpcnN0IGNvbW1hbmQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX01hdGNoTW9kZSBRU1BJIE1hdGNoIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX01BVENIX01PREVfQU5EICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPEFORCBtYXRjaCBtb2RlIGJldHdlZW4gdW5tYXNrZWQgYml0cyovCisjZGVmaW5lIFFTUElfTUFUQ0hfTU9ERV9PUiAgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfUE1NKSAvKiE8T1IgbWF0Y2ggbW9kZSBiZXR3ZWVuIHVubWFza2VkIGJpdHMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX0F1dG9tYXRpY1N0b3AgUVNQSSBBdXRvbWF0aWMgU3RvcAorICAqIEB7CisgICovCisjZGVmaW5lIFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIG9ubHkgd2l0aCBhYm9ydCBvciBRU1BJIGRpc2FibGluZyovCisjZGVmaW5lIFFTUElfQVVUT01BVElDX1NUT1BfRU5BQkxFICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfQVBNUykgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBtYXRjaCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfVGltZU91dEFjdGl2YXRpb24gUVNQSSBUaW1lb3V0IEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITxUaW1lb3V0IGNvdW50ZXIgZGlzYWJsZWQsIG5DUyByZW1haW5zIGFjdGl2ZSovCisjZGVmaW5lIFFTUElfVElNRU9VVF9DT1VOVEVSX0VOQUJMRSAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfVENFTikgLyohPFRpbWVvdXQgY291bnRlciBlbmFibGVkLCBuQ1MgcmVsZWFzZWQgd2hlbiB0aW1lb3V0IGV4cGlyZXMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX0ZsYWdzIFFTUEkgRmxhZ3MKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9CVVNZIC8qITxCdXN5IGZsYWc6IG9wZXJhdGlvbiBpcyBvbmdvaW5nKi8KKyNkZWZpbmUgUVNQSV9GTEFHX1RPICAgICAgICAgICAgICAgICAgIFFVQURTUElfU1JfVE9GICAvKiE8VGltZW91dCBmbGFnOiB0aW1lb3V0IG9jY3VycyBpbiBtZW1vcnktbWFwcGVkIG1vZGUqLworI2RlZmluZSBRU1BJX0ZMQUdfU00gICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9TTUYgIC8qITxTdGF0dXMgbWF0Y2ggZmxhZzogcmVjZWl2ZWQgZGF0YSBtYXRjaGVzIGluIGF1dG9wb2xsaW5nIG1vZGUqLworI2RlZmluZSBRU1BJX0ZMQUdfRlQgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9GVEYgIC8qITxGaWZvIHRocmVzaG9sZCBmbGFnOiBGaWZvIHRocmVzaG9sZCByZWFjaGVkIG9yIGRhdGEgbGVmdCBhZnRlciByZWFkIGZyb20gbWVtb3J5IGlzIGNvbXBsZXRlKi8KKyNkZWZpbmUgUVNQSV9GTEFHX1RDICAgICAgICAgICAgICAgICAgIFFVQURTUElfU1JfVENGICAvKiE8VHJhbnNmZXIgY29tcGxldGUgZmxhZzogcHJvZ3JhbW1lZCBudW1iZXIgb2YgZGF0YSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgb3IgdGhlIHRyYW5zZmVyIGhhcyBiZWVuIGFib3J0ZWQqLworI2RlZmluZSBRU1BJX0ZMQUdfVEUgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9URUYgIC8qITxUcmFuc2ZlciBlcnJvciBmbGFnOiBpbnZhbGlkIGFkZHJlc3MgaXMgYmVpbmcgYWNjZXNzZWQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBRU1BJX0ludGVycnVwdHMgUVNQSSBJbnRlcnJ1cHRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUVNQSV9JVF9UTyAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfVE9JRSAvKiE8SW50ZXJydXB0IG9uIHRoZSB0aW1lb3V0IGZsYWcqLworI2RlZmluZSBRU1BJX0lUX1NNICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9TTUlFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHN0YXR1cyBtYXRjaCBmbGFnKi8KKyNkZWZpbmUgUVNQSV9JVF9GVCAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfRlRJRSAvKiE8SW50ZXJydXB0IG9uIHRoZSBmaWZvIHRocmVzaG9sZCBmbGFnKi8KKyNkZWZpbmUgUVNQSV9JVF9UQyAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfVENJRSAvKiE8SW50ZXJydXB0IG9uIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnKi8KKyNkZWZpbmUgUVNQSV9JVF9URSAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfVEVJRSAvKiE8SW50ZXJydXB0IG9uIHRoZSB0cmFuc2ZlciBlcnJvciBmbGFnKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9UaW1lb3V0X2RlZmluaXRpb24gUVNQSSBUaW1lb3V0IGRlZmluaXRpb24KKyAgKiBAYnJpZWYgUVNQSSBUaW1lb3V0IGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgNTAwMFUgLyogNSBzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX01hY3JvcyBRU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmIFJlc2V0IFFTUEkgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IFFTUEkgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1FTUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1FTUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgUVNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1FTUElfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0VOKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBRU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUVNQSV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9FTikKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgUVNQSSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UTzogUVNQSSBUaW1lb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1NNOiBRU1BJIFN0YXR1cyBtYXRjaCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9GVDogUVNQSSBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UQzogUVNQSSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9URTogUVNQSSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUVNQSV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKKworCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgUVNQSSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVE86IFFTUEkgVGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9TTTogUVNQSSBTdGF0dXMgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfRlQ6IFFTUEkgRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVEM6IFFTUEkgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVEU6IFFTUEkgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1FTUElfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVE86IFFTUEkgVGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9TTTogUVNQSSBTdGF0dXMgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfRlQ6IFFTUEkgRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVEM6IFFTUEkgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVEU6IFFTUEkgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9RU1BJX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzZWxlY3RlZCBRU1BJIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfQlVTWTogUVNQSSBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RPOiAgIFFTUEkgVGltZW91dCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19TTTogICBRU1BJIFN0YXR1cyBtYXRjaCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19GVDogICBRU1BJIEZJRk8gdGhyZXNob2xkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RDOiAgIFFTUEkgVHJhbnNmZXIgY29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEU6ICAgUVNQSSBUcmFuc2ZlciBlcnJvciBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1FTUElfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAoKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSLCAoX19GTEFHX18pKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgUVNQSSdzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RPOiBRU1BJIFRpbWVvdXQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfU006IFFTUEkgU3RhdHVzIG1hdGNoIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RDOiBRU1BJIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RFOiBRU1BJIFRyYW5zZmVyIGVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUVNQSV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgIFdSSVRFX1JFRygoX19IQU5ETEVfXyktPkluc3RhbmNlLT5GQ1IsIChfX0ZMQUdfXykpCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX0luaXQgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9EZUluaXQgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfTXNwSW5pdCAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX01zcERlSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFFTUEkgSVJRIGhhbmRsZXIgbWV0aG9kICovCit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfSVJRSGFuZGxlcihRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKworLyogUVNQSSBpbmRpcmVjdCBtb2RlICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfQ29tbWFuZCAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX1RyYW5zbWl0ICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX1JlY2VpdmUgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX0NvbW1hbmRfSVQgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9UcmFuc21pdF9JVCAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9SZWNlaXZlX0lUICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9UcmFuc21pdF9ETUEgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9SZWNlaXZlX0RNQSAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKTsKKworLyogUVNQSSBzdGF0dXMgZmxhZyBwb2xsaW5nIG1vZGUgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9BdXRvUG9sbGluZyAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX0F1dG9Qb2xsaW5nX0lUKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgUVNQSV9BdXRvUG9sbGluZ1R5cGVEZWYgKmNmZyk7CisKKy8qIFFTUEkgbWVtb3J5LW1hcHBlZCBtb2RlICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfTWVtb3J5TWFwcGVkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgUVNQSV9NZW1vcnlNYXBwZWRUeXBlRGVmICpjZmcpOworCisvKiBDYWxsYmFjayBmdW5jdGlvbnMgaW4gbm9uLWJsb2NraW5nIG1vZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX0Vycm9yQ2FsbGJhY2sgICAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjayAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfRmlmb1RocmVzaG9sZENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworCisvKiBRU1BJIGluZGlyZWN0IG1vZGUgKi8KK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfUVNQSV9DbWRDcGx0Q2FsbGJhY2sgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2sgICAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrICAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfUVNQSV9SeEhhbGZDcGx0Q2FsbGJhY2sgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfVHhIYWxmQ3BsdENhbGxiYWNrICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworCisvKiBRU1BJIHN0YXR1cyBmbGFnIHBvbGxpbmcgbW9kZSAqLwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX1N0YXR1c01hdGNoQ2FsbGJhY2sgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKworLyogUVNQSSBtZW1vcnktbWFwcGVkIG1vZGUgKi8KK3ZvaWQgICAgICAgICAgICAgICAgICBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2sgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CisKKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyogUVNQSSBjYWxsYmFjayByZWdpc3RlcmluZy91bnJlZ2lzdGVyaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfUmVnaXN0ZXJDYWxsYmFjayAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIEhBTF9RU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSWQsIHBRU1BJX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBIQUxfUVNQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lkKTsKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1FTUElfU3RhdGVUeXBlRGVmIEhBTF9RU1BJX0dldFN0YXRlICAgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit1aW50MzJfdCAgICAgICAgICAgICAgSEFMX1FTUElfR2V0RXJyb3IgICAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9BYm9ydCAgICAgICAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX0Fib3J0X0lUICAgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfU2V0VGltZW91dCAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfUVNQSV9TZXRGaWZvVGhyZXNob2xkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IFRocmVzaG9sZCk7Cit1aW50MzJfdCAgICAgICAgICAgICAgSEFMX1FTUElfR2V0Rmlmb1RocmVzaG9sZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfTWFjcm9zIFFTUEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19RU1BJX0NMT0NLX1BSRVNDQUxFUihQUkVTQ0FMRVIpICgoUFJFU0NBTEVSKSA8PSAweEZGVSkKKworI2RlZmluZSBJU19RU1BJX0ZJRk9fVEhSRVNIT0xEKFRIUikgICAgICAgICgoKFRIUikgPiAwVSkgJiYgKChUSFIpIDw9IDE2VSkpCisKKyNkZWZpbmUgSVNfUVNQSV9TU0hJRlQoU1NISUZUKSAgICAgICAgICAgICAoKChTU0hJRlQpID09IFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTU0hJRlQpID09IFFTUElfU0FNUExFX1NISUZUSU5HX0hBTEZDWUNMRSkpCisKKyNkZWZpbmUgSVNfUVNQSV9GTEFTSF9TSVpFKEZTSVpFKSAgICAgICAgICAoKChGU0laRSkgPD0gMzFVKSkKKworI2RlZmluZSBJU19RU1BJX0NTX0hJR0hfVElNRShDU0hUSU1FKSAgICAgICgoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzFfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV8yX0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfM19DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzRfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV81X0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfNl9DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzdfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV84X0NZQ0xFKSkKKworI2RlZmluZSBJU19RU1BJX0NMT0NLX01PREUoQ0xLTU9ERSkgICAgICAgICgoKENMS01PREUpID09IFFTUElfQ0xPQ0tfTU9ERV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xLTU9ERSkgPT0gUVNQSV9DTE9DS19NT0RFXzMpKQorCisjZGVmaW5lIElTX1FTUElfSU5TVFJVQ1RJT04oSU5TVFJVQ1RJT04pICAgKChJTlNUUlVDVElPTikgPD0gMHhGRlUpCisKKyNkZWZpbmUgSVNfUVNQSV9BRERSRVNTX1NJWkUoQUREUl9TSVpFKSAgICAoKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU184X0JJVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfMTZfQklUUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzI0X0JJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU18zMl9CSVRTKSkKKworI2RlZmluZSBJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKFNJWkUpICgoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzhfQklUUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18xNl9CSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMjRfQklUUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzMyX0JJVFMpKQorCisjZGVmaW5lIElTX1FTUElfRFVNTVlfQ1lDTEVTKERDWSkgICAgICAgICAgKChEQ1kpIDw9IDMxVSkKKworI2RlZmluZSBJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoTU9ERSkgICAgICgoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fMV9MSU5FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fMl9MSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9BRERSRVNTX01PREUoTU9ERSkgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU18xX0xJTkUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BRERSRVNTXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMV9MSU5FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU180X0xJTkVTKSkKKworI2RlZmluZSBJU19RU1BJX0RBVEFfTU9ERShNT0RFKSAgICAgICAgICAgICgoKE1PREUpID09IFFTUElfREFUQV9OT05FKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzFfTElORSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfMl9MSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfREFUQV80X0xJTkVTKSkKKworI2RlZmluZSBJU19RU1BJX0REUl9NT0RFKEREUl9NT0RFKSAgICAgICAgICgoKEREUl9NT0RFKSA9PSBRU1BJX0REUl9NT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERFJfTU9ERSkgPT0gUVNQSV9ERFJfTU9ERV9FTkFCTEUpKQorCisjZGVmaW5lIElTX1FTUElfU0lPT19NT0RFKFNJT09fTU9ERSkgICAgICAgKCgoU0lPT19NT0RFKSA9PSBRU1BJX1NJT09fSU5TVF9FVkVSWV9DTUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSU9PX01PREUpID09IFFTUElfU0lPT19JTlNUX09OTFlfRklSU1RfQ01EKSkKKworI2RlZmluZSBJU19RU1BJX0lOVEVSVkFMKElOVEVSVkFMKSAgICAgICAgICgoSU5URVJWQUwpIDw9IFFVQURTUElfUElSX0lOVEVSVkFMKQorCisjZGVmaW5lIElTX1FTUElfU1RBVFVTX0JZVEVTX1NJWkUoU0laRSkgICAgKCgoU0laRSkgPj0gMVUpICYmICgoU0laRSkgPD0gNFUpKQorCisjZGVmaW5lIElTX1FTUElfTUFUQ0hfTU9ERShNT0RFKSAgICAgICAgICAgKCgoTU9ERSkgPT0gUVNQSV9NQVRDSF9NT0RFX0FORCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfTUFUQ0hfTU9ERV9PUikpCisKKyNkZWZpbmUgSVNfUVNQSV9BVVRPTUFUSUNfU1RPUChBUE1TKSAgICAgICAoKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfUVNQSV9USU1FT1VUX0FDVElWQVRJT04oVENFTikgICAoKChUQ0VOKSA9PSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVENFTikgPT0gUVNQSV9USU1FT1VUX0NPVU5URVJfRU5BQkxFKSkKKworI2RlZmluZSBJU19RU1BJX1RJTUVPVVRfUEVSSU9EKFBFUklPRCkgICAgICgoUEVSSU9EKSA8PSAweEZGRkZVKQorLyoqCisqIEB9CisqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUVVBRFNQSSkgfHwgZGVmaW5lZChRVUFEU1BJMSkgfHwgZGVmaW5lZChRVUFEU1BJMikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfUVNQSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9yY2MuaCBiL0luYy9zdG0zMndieHhfaGFsX3JjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGRhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9yY2MuaApAQCAtMCwwICsxLDI4MjAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3JjYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSQ0MgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfUkNDX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfcmNjLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2J1cy5oIgorCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZpbmVzIHVzZWQgZm9yIEZsYWdzICovCisjZGVmaW5lIENSX1JFR19JTkRFWCAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgQkRDUl9SRUdfSU5ERVggICAgICAgICAgICAyVQorI2RlZmluZSBDU1JfUkVHX0lOREVYICAgICAgICAgICAgIDNVCisjZGVmaW5lIENSUkNSX1JFR19JTkRFWCAgICAgICAgICAgNFUKKworI2RlZmluZSBSQ0NfRkxBR19NQVNLICAgICAgICAgICAgIDB4MUZVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSVNfUkNDX09TQ0lMTEFUT1JUWVBFKF9fT1NDSUxMQVRPUl9fKSAoKChfX09TQ0lMTEFUT1JfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpICA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSAgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX01TSSkgID09IFJDQ19PU0NJTExBVE9SVFlQRV9NU0kpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fT1NDSUxMQVRPUl9fKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kxKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX09TQ0lMTEFUT1JfXykgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMikgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19PU0NJTExBVE9SX18pICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpKQorCisKKyNkZWZpbmUgSVNfUkNDX0hTRShfX0hTRV9fKSAgKCgoX19IU0VfXykgPT0gUkNDX0hTRV9PRkYpIHx8ICgoX19IU0VfXykgPT0gUkNDX0hTRV9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hTRV9fKSA9PSBSQ0NfSFNFX0JZUEFTUykpCisKKyNkZWZpbmUgSVNfUkNDX0xTRShfX0xTRV9fKSAgKCgoX19MU0VfXykgPT0gUkNDX0xTRV9PRkYpIHx8ICgoX19MU0VfXykgPT0gUkNDX0xTRV9PTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xTRV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykpCisKKyNkZWZpbmUgSVNfUkNDX0hTSShfX0hTSV9fKSAgKCgoX19IU0lfXykgPT0gUkNDX0hTSV9PRkYpIHx8ICgoX19IU0lfXykgPT0gUkNDX0hTSV9PTikpCisKKyNkZWZpbmUgSVNfUkNDX0hTSV9DQUxJQlJBVElPTl9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAodWludDMyX3QpMTI3VSkKKworI2RlZmluZSBJU19SQ0NfTFNJKF9fTFNJX18pICAoKChfX0xTSV9fKSA9PSBSQ0NfTFNJX09GRikgfHwgKChfX0xTSV9fKSA9PSBSQ0NfTFNJX09OKSkKKworI2RlZmluZSBJU19SQ0NfTFNJMl9DQUxJQlJBVElPTl9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAodWludDMyX3QpMTVVKQorCisKKyNkZWZpbmUgSVNfUkNDX01TSShfX01TSV9fKSAgKCgoX19NU0lfXykgPT0gUkNDX01TSV9PRkYpIHx8ICgoX19NU0lfXykgPT0gUkNDX01TSV9PTikpCisKKworI2RlZmluZSBJU19SQ0NfTVNJQ0FMSUJSQVRJT05fVkFMVUUoX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPD0gKHVpbnQzMl90KTI1NVUpCisKKworI2RlZmluZSBJU19SQ0NfSFNJNDgoX19IU0k0OF9fKSAgKCgoX19IU0k0OF9fKSA9PSBSQ0NfSFNJNDhfT0ZGKSB8fCAoKF9fSFNJNDhfXykgPT0gUkNDX0hTSTQ4X09OKSkKKworCisjZGVmaW5lIElTX1JDQ19QTEwoX19QTExfXykgKCgoX19QTExfXykgPT0gUkNDX1BMTF9OT05FKSB8fCgoX19QTExfXykgPT0gUkNDX1BMTF9PRkYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BMTF9fKSA9PSBSQ0NfUExMX09OKSkKKworI2RlZmluZSBJU19SQ0NfUExMU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfTVNJKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfSFNJKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19QTExTT1VSQ0VfSFNFKSkKKworI2RlZmluZSBJU19SQ0NfUExMTV9WQUxVRShfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSBSQ0NfUExMTV9ESVY4KQorCisjZGVmaW5lIElTX1JDQ19QTExOX1ZBTFVFKF9fVkFMVUVfXykgKCg4VSA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IDg2VSkpCisKKyNkZWZpbmUgSVNfUkNDX1BMTFBfVkFMVUUoX19WQUxVRV9fKSAoKFJDQ19QTExQX0RJVjIgPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSBSQ0NfUExMUF9ESVYzMikpCisKKyNkZWZpbmUgSVNfUkNDX1BMTFFfVkFMVUUoX19WQUxVRV9fKSAoKFJDQ19QTExRX0RJVjIgPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSBSQ0NfUExMUV9ESVY4KSkKKworI2RlZmluZSBJU19SQ0NfUExMUl9WQUxVRShfX1ZBTFVFX18pICgoUkNDX1BMTFJfRElWMiA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IFJDQ19QTExSX0RJVjgpKQorCisjZGVmaW5lIElTX1JDQ19QTExTQUkxQ0xPQ0tPVVRfVkFMVUUoX19WQUxVRV9fKSAoKCgoKF9fVkFMVUVfXykgJiBSQ0NfUExMU0FJMV9BRENDTEspID09IFJDQ19QTExTQUkxX0FEQ0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFJDQ19QTExTQUkxX1NBSTFDTEspID09IFJDQ19QTExTQUkxX1NBSTFDTEspICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgUkNDX1BMTFNBSTFfVVNCQ0xLKSA9PSBSQ0NfUExMU0FJMV9VU0JDTEspICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgUkNDX1BMTFNBSTFfUk5HQ0xLKSA9PSBSQ0NfUExMU0FJMV9STkdDTEspKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgfihSQ0NfUExMU0FJMV9BRENDTEt8UkNDX1BMTFNBSTFfU0FJMUNMS3xSQ0NfUExMU0FJMV9VU0JDTEt8UkNDX1BMTFNBSTFfUk5HQ0xLKSkgPT0gMFUpKQorCisjZGVmaW5lIElTX1JDQ19NU0lfQ0xPQ0tfUkFOR0UoX19SQU5HRV9fKSAoKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV8wKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV8zKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV82KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfNykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1JBTkdFX18pID09IFJDQ19NU0lSQU5HRV85KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SQU5HRV9fKSA9PSBSQ0NfTVNJUkFOR0VfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUkFOR0VfXykgPT0gUkNDX01TSVJBTkdFXzExKSkKKworI2RlZmluZSBJU19SQ0NfQ0xPQ0tUWVBFKF9fQ0xLX18pICAoKDFVIDw9IChfX0NMS19fKSkgJiYgKChfX0NMS19fKSA8PSAoUkNDX0NMT0NLVFlQRV9TWVNDTEsgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NMT0NLVFlQRV9IQ0xLICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0xPQ0tUWVBFX1BDTEsxIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19DTE9DS1RZUEVfUENMSzIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0NMT0NLVFlQRV9IQ0xLMiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQ0xPQ0tUWVBFX0hDTEs0KSkpCisKKyNkZWZpbmUgSVNfUkNDX1NZU0NMS1NPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX01TSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TWVNDTEtTT1VSQ0VfSFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSykpCisKKyNkZWZpbmUgSVNfUkNDX0hDTEt4KF9fSENMS19fKSAoKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxKSAgIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMikgICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNCkgICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjUpICAgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVY2KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjgpICAgfHwgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYxMCkgIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hDTEtfXykgPT0gUkNDX1NZU0NMS19ESVYzMikgIHx8ICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWNjQpICB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjEyOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQ0xLX18pID09IFJDQ19TWVNDTEtfRElWMjU2KSB8fCAoKF9fSENMS19fKSA9PSBSQ0NfU1lTQ0xLX0RJVjUxMikpCisKKyNkZWZpbmUgSVNfUkNDX1BDTEt4KF9fUENMS19fKSAoKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMSkgfHwgKChfX1BDTEtfXykgPT0gUkNDX0hDTEtfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVY0KSB8fCAoKF9fUENMS19fKSA9PSBSQ0NfSENMS19ESVY4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQ0xLX18pID09IFJDQ19IQ0xLX0RJVjE2KSkKKworI2RlZmluZSBJU19SQ0NfUlRDQ0xLU09VUkNFKF9fU09VUkNFX18pICgoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19SVENDTEtTT1VSQ0VfTFNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JUQ0NMS1NPVVJDRV9MU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMikpCisKKyNkZWZpbmUgSVNfUkNDX01DTyhfX01DT1hfXykgKCAoKF9fTUNPWF9fKSA9PSBSQ0NfTUNPMSkgfHwgKChfX01DT1hfXykgPT0gUkNDX01DTzIpIHx8ICgoX19NQ09YX18pID09IFJDQ19NQ08zKSApCisKKyNkZWZpbmUgSVNfUkNDX01DTzFTT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTk9DTE9DSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9TWVNDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTVNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0hTSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9IU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfUExMQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19NQ08xU09VUkNFX0xTSTEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfTFNJMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTUNPMVNPVVJDRV9MU0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX01DTzFTT1VSQ0VfSFNJNDgpKQorCisjZGVmaW5lIElTX1JDQ19NQ08yU09VUkNFKF9fU09VUkNFX18pIElTX1JDQ19NQ08xU09VUkNFKChfX1NPVVJDRV9fKSkKKyNkZWZpbmUgSVNfUkNDX01DTzNTT1VSQ0UoX19TT1VSQ0VfXykgSVNfUkNDX01DTzFTT1VSQ0UoKF9fU09VUkNFX18pKQorCisKKyNkZWZpbmUgSVNfUkNDX01DT0RJVihfX0RJVl9fKSAoKChfX0RJVl9fKSA9PSBSQ0NfTUNPRElWXzEpIHx8ICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX01DT0RJVl80KSB8fCAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19NQ09ESVZfMTYpKQorCisKKworCisjZGVmaW5lIElTX1JDQ19MU0VfRFJJVkUoX19EUklWRV9fKSAoKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9MT1cpICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1MT1cpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9NRURJVU1ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RSSVZFX18pID09IFJDQ19MU0VEUklWRV9ISUdIKSkKKworI2RlZmluZSBJU19SQ0NfU1RPUF9XQUtFVVBDTE9DSyhfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9UeXBlcyBSQ0MgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgUkNDIFBMTCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQTExTdGF0ZTsgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFBMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgUExMU291cmNlOyAgLyohPCBSQ0NfUExMU291cmNlOiBQTEwgZW50cnkgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExfQ2xvY2tfU291cmNlICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExNOyAgICAgICAvKiE8IFBMTE06IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMTV9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgUExMTjsgICAgICAgLyohPCBQTExOOiBNdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gb3V0cHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gODYgICAgKi8KKworICB1aW50MzJfdCBQTExQOyAgICAgICAvKiE8IFBMTFA6IERpdmlzaW9uIGZhY3RvciBmb3IgU0FJICYgQURDIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBQTExROyAgICAgICAvKiE8IFBMTFE6IERpdmlzaW9uIGZhY3RvciBmb3IgIFJORyBhbmQgVVNCIGNsb2Nrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMUV9DbG9ja19EaXZpZGVyICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgUExMUjsgICAgICAgLyohPCBQTExSOiBEaXZpc2lvbiBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgaGF2ZSB0byBzZXQgdGhlIFBMTFIgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBub3QgZXhjZWVkIG1heCBmcmVxdWVuY3kgNjRNSFouCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFJfQ2xvY2tfRGl2aWRlciAgICAgICAgICAgICAqLworCit9IFJDQ19QTExJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSQ0MgSW50ZXJuYWwvRXh0ZXJuYWwgT3NjaWxsYXRvciAoSFNFLCBIU0ksIEhTSTQ4LCBNU0ksIExTRSBhbmQgTFNJKSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPc2NpbGxhdG9yVHlwZTsgICAgICAgLyohPCBUaGUgb3NjaWxsYXRvcnMgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfT3NjaWxsYXRvcl9UeXBlICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgSFNFU3RhdGU7ICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgSFNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19IU0VfQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBMU0VTdGF0ZTsgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xTRV9Db25maWcgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEhTSVN0YXRlOyAgICAgICAgICAgICAvKiE8IFRoZSBuZXcgc3RhdGUgb2YgdGhlIEhTSS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfSFNJX0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgSFNJQ2FsaWJyYXRpb25WYWx1ZTsgIC8qITwgVGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlIChkZWZhdWx0IGlzIEByZWYgUkNDX0hTSUNBTElCUkFUSU9OX0RFRkFVTFQpLiovCisKKyAgdWludDMyX3QgTFNJU3RhdGU7ICAgICAgICAgICAgIC8qITwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNJLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MU0lfQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBMU0kyQ2FsaWJyYXRpb25WYWx1ZTsgIC8qITwgVGhlIExTSTIgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAgICAgKi8KKworICB1aW50MzJfdCBNU0lTdGF0ZTsgICAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBNU0kuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX01TSV9Db25maWcgKi8KKworICB1aW50MzJfdCBNU0lDYWxpYnJhdGlvblZhbHVlOyAgLyohPCBUaGUgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgKGRlZmF1bHQgaXMgQHJlZiBSQ0NfTVNJQ0FMSUJSQVRJT05fREVGQVVMVCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRiAqLworCisgIHVpbnQzMl90IE1TSUNsb2NrUmFuZ2U7ICAgICAgICAvKiE8IFRoZSBNU0kgZnJlcXVlbmN5IHJhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19NU0lfQ2xvY2tfUmFuZ2UgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBIU0k0OFN0YXRlOyAgICAgICAgICAgLyohPCBUaGUgbmV3IHN0YXRlIG9mIHRoZSBIU0k0OCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0hTSTQ4X0NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAqLworCisgIFJDQ19QTExJbml0VHlwZURlZiBQTEw7ICAgICAgICAvKiE8IE1haW4gUExMIHN0cnVjdHVyZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IFJDQ19Pc2NJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSQ0MgU3lzdGVtLCBBSEIgYW5kIEFQQiBidXNzZXMgY2xvY2sgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tUeXBlOyAgICAgICAgICAgICAvKiE8IFRoZSBjbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBSQ0NfU3lzdGVtX0Nsb2NrX1R5cGUgICAgICAqLworCisgIHVpbnQzMl90IFNZU0NMS1NvdXJjZTsgICAgICAgICAgLyohPCBUaGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZSAgICAqLworCisgIHVpbnQzMl90IEFIQkNMS0RpdmlkZXI7ICAgICAgICAgLyohPCBUaGUgQUhCeCBjbG9jayAoSENMSzEpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19BSEJ4X0Nsb2NrX1NvdXJjZSAgICAgICAqLworCisgIHVpbnQzMl90IEFQQjFDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMSBjbG9jayAoUENMSzEpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfQVBCeF9DbG9ja19Tb3VyY2UgICAgICAqLworCisgIHVpbnQzMl90IEFQQjJDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMiBjbG9jayAoUENMSzIpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfQVBCeF9DbG9ja19Tb3VyY2UgICAgICAqLworCisgIHVpbnQzMl90IEFIQkNMSzJEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQUhCIGNsb2NrIChIQ0xLMikgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0FIQnhfQ2xvY2tfU291cmNlICAgICAgKi8KKworICB1aW50MzJfdCBBSEJDTEs0RGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFIQiBzaGFyZWQgY2xvY2sgKEhDTEs0KSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfQUhCeF9DbG9ja19Tb3VyY2UgICAgICAgKi8KKworfSBSQ0NfQ2xrSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9Db25zdGFudHMgUkNDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1RpbWVvdXRfVmFsdWUgVGltZW91dCBWYWx1ZXMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfREJQX1RJTUVPVVRfVkFMVUUgICAgICAgICAgMlUgICAgICAgICAgICAgICAgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgICovCisjZGVmaW5lIFJDQ19MU0VfVElNRU9VVF9WQUxVRSAgICAgICAgICBMU0VfU1RBUlRVUF9USU1FT1VUICAvKiBMU0UgdGltZW91dCBpbiBtcyAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX09zY2lsbGF0b3JfVHlwZSBPc2NpbGxhdG9yIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTk9ORSAgICAgICAgMHgwMDAwMDAwMFUgICAvKiE8IE9zY2lsbGF0b3IgY29uZmlndXJhdGlvbiB1bmNoYW5nZWQgICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgICAgICAgICAweDAwMDAwMDAxVSAgIC8qITwgSFNFIHRvIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSAgICAgICAgIDB4MDAwMDAwMDJVICAgLyohPCBIU0kgdG8gY29uZmlndXJlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFICAgICAgICAgMHgwMDAwMDAwNFUgICAvKiE8IExTRSB0byBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kxICAgICAgICAweDAwMDAwMDA4VSAgIC8qITwgTFNJMSB0byBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIgICAgICAgIDB4MDAwMDAwMTBVICAgLyohPCBMU0kyIHRvIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJICAgICAgICAgMHgwMDAwMDAyMFUgICAvKiE8IE1TSSB0byBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCAgICAgICAweDAwMDAwMDQwVSAgIC8qITwgSFNJNDggdG8gY29uZmlndXJlICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9Db25maWcgSFNFIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IU0VfT0ZGICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgY2xvY2sgZGVhY3RpdmF0aW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0hTRV9PTiAgICAgICAgICAgICAgICAgICAgIFJDQ19DUl9IU0VPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBjbG9jayBhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ0NfSFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NSX0hTRUJZUCB8IFJDQ19DUl9IU0VPTikpIC8qITwgRXh0ZXJuYWwgY2xvY2sgc291cmNlIGZvciBIU0UgY2xvY2sgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0VfQ29uZmlnIExTRSBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFNFX09GRiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExTRSBjbG9jayBkZWFjdGl2YXRpb24gKi8KKyNkZWZpbmUgUkNDX0xTRV9PTiAgICAgICAgICAgICAgICAgICAgIFJDQ19CRENSX0xTRU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMU0UgY2xvY2sgYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNFX0JZUEFTUyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0JEQ1JfTFNFQllQIHwgUkNDX0JEQ1JfTFNFT04pKSAvKiE8IEV4dGVybmFsIGNsb2NrIHNvdXJjZSBmb3IgTFNFIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19IU0lfQ29uZmlnIEhTSSBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSFNJX09GRiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgSFNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfSFNJX09OICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX0hTSU9OIC8qITwgSFNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKworI2RlZmluZSBSQ0NfSFNJQ0FMSUJSQVRJT05fREVGQVVMVCAgICAgNjRVICAgICAgICAgIC8qITwgRGVmYXVsdCBIU0kgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xTSV9Db25maWcgTFNJIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MU0lfT0ZGICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTFNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTFNJX09OICAgICAgICAgICAgICAgICAgICAgKFJDQ19DU1JfTFNJMU9OIHwgUkNDX0NTUl9MU0kyT04pICAvKiE8IExTSTEgb3IgTFNJMiBjbG9jayBhY3RpdmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NU0lfQ29uZmlnIE1TSSBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTVNJX09GRiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgTVNJIGNsb2NrIGRlYWN0aXZhdGlvbiAqLworI2RlZmluZSBSQ0NfTVNJX09OICAgICAgICAgICAgICAgICAgICAgUkNDX0NSX01TSU9OIC8qITwgTVNJIGNsb2NrIGFjdGl2YXRpb24gKi8KKworI2RlZmluZSBSQ0NfTVNJQ0FMSUJSQVRJT05fREVGQVVMVCAgICAgMFUgICAvKiE8IERlZmF1bHQgTVNJIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTSTQ4X0NvbmZpZyBIU0k0OCBDb25maWcKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSFNJNDhfT0ZGICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgSFNJNDggY2xvY2sgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19IU0k0OF9PTiAgICAgICAgICAgICAgICAgICBSQ0NfQ1JSQ1JfSFNJNDhPTiAgLyohPCBIU0k0OCBjbG9jayBhY3RpdmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTF9Db25maWcgUExMIENvbmZpZworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19QTExfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IFBMTCBjb25maWd1cmF0aW9uIHVuY2hhbmdlZCAqLworI2RlZmluZSBSQ0NfUExMX09GRiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBQTEwgZGVhY3RpdmF0aW9uICovCisjZGVmaW5lIFJDQ19QTExfT04gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IFBMTCBhY3RpdmF0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIgUExMTSBDbG9jayBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWMSAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExNX0RJVl8xIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAxICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVYyICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTE1fRElWXzIgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDIgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjMgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMTV9ESVZfMyAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMyAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWNCAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExNX0RJVl80IC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA0ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY1ICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTE1fRElWXzUgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDUgICovCisjZGVmaW5lIFJDQ19QTExNX0RJVjYgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMTV9ESVZfNiAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gNiAgKi8KKyNkZWZpbmUgUkNDX1BMTE1fRElWNyAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExNX0RJVl83IC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSA3ICAqLworI2RlZmluZSBSQ0NfUExMTV9ESVY4ICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTE1fRElWXzggLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIgUExMUCBDbG9jayBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMiAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMiAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMyAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8zICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNCAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl80ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNCAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNSAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl81ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNSAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNiAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl82ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNiAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWNyAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl83ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gNyAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWOCAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl84ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gOCAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWOSAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl85ICAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gOSAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xMCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTEgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xMSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTEgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTIgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xMiAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTIgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTMgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xMyAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTMgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTQgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xNCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTQgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTUgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xNSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTUgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTYgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xNiAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTYgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTcgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xNyAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTcgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTggICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xOCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTggKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMTkgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8xOSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMTkgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yMCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjEgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yMSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjEgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjIgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yMiAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjIgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjMgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yMyAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjMgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjQgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yNCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjQgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjUgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yNSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjUgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjYgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yNiAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjYgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjcgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yNyAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjcgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjggICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yOCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjggKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMjkgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8yOSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMjkgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMzAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8zMCAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzAgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMzEgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8zMSAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzEgKi8KKyNkZWZpbmUgUkNDX1BMTFBfRElWMzIgICAgICAgICAgICAgICAgIExMX1JDQ19QTExQX0RJVl8zMiAvKiE8IFBMTFAgZGl2aXNpb24gZmFjdG9yID0gMzIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1BMTFFfQ2xvY2tfRGl2aWRlciBQTExRIENsb2NrIERpdmlkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMUV9ESVYyICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFFfRElWXzIgIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSAyICovCisjZGVmaW5lIFJDQ19QTExRX0RJVjMgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMUV9ESVZfMyAgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDMgKi8KKyNkZWZpbmUgUkNDX1BMTFFfRElWNCAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExRX0RJVl80ICAvKiE8IFBMTFEgZGl2aXNpb24gZmFjdG9yID0gNCAqLworI2RlZmluZSBSQ0NfUExMUV9ESVY1ICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFFfRElWXzUgIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA1ICovCisjZGVmaW5lIFJDQ19QTExRX0RJVjYgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMUV9ESVZfNiAgLyohPCBQTExRIGRpdmlzaW9uIGZhY3RvciA9IDYgKi8KKyNkZWZpbmUgUkNDX1BMTFFfRElWNyAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExRX0RJVl83ICAvKiE8IFBMTFEgZGl2aXNpb24gZmFjdG9yID0gNyAqLworI2RlZmluZSBSQ0NfUExMUV9ESVY4ICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFFfRElWXzggIC8qITwgUExMUSBkaXZpc2lvbiBmYWN0b3IgPSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIgUExMUiBDbG9jayBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWMiAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExSX0RJVl8yICAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gMiAqLworI2RlZmluZSBSQ0NfUExMUl9ESVYzICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFJfRElWXzMgIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSAzICovCisjZGVmaW5lIFJDQ19QTExSX0RJVjQgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMUl9ESVZfNCAgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDQgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWNSAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExSX0RJVl81ICAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gNSAqLworI2RlZmluZSBSQ0NfUExMUl9ESVY2ICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFJfRElWXzYgIC8qITwgUExMUiBkaXZpc2lvbiBmYWN0b3IgPSA2ICovCisjZGVmaW5lIFJDQ19QTExSX0RJVjcgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMUl9ESVZfNyAgLyohPCBQTExSIGRpdmlzaW9uIGZhY3RvciA9IDcgKi8KKyNkZWZpbmUgUkNDX1BMTFJfRElWOCAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExSX0RJVl84ICAvKiE8IFBMTFIgZGl2aXNpb24gZmFjdG9yID0gOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMX0Nsb2NrX1NvdXJjZSBQTEwgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9OT05FICAgICAgICAgICAgIExMX1JDQ19QTExTT1VSQ0VfTk9ORSAvKiE8IE5vIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgICovCisjZGVmaW5lIFJDQ19QTExTT1VSQ0VfTVNJICAgICAgICAgICAgICBMTF9SQ0NfUExMU09VUkNFX01TSSAgLyohPCBNU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfUExMU09VUkNFX0hTSSAgICAgICAgICAgICAgTExfUkNDX1BMTFNPVVJDRV9IU0kgIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX1BMTFNPVVJDRV9IU0UgICAgICAgICAgICAgIExMX1JDQ19QTExTT1VSQ0VfSFNFICAvKiE8IEhTRSBjbG9jayBzZWxlY3RlZCBhcyBQTEwgZW50cnkgY2xvY2sgc291cmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19QTExfQ2xvY2tfT3V0cHV0IFBMTCBDbG9jayBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMX1NZU0NMSyAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUkVOICAgICAgLyohPCBQTExDTEsgc2VsZWN0aW9uIGZyb20gbWFpbiBQTEwgKi8KKyNkZWZpbmUgUkNDX1BMTF9VU0JDTEsgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFFFTiAgICAgIC8qITwgUExMVVNCQ0xLIHNlbGVjdGlvbiBmcm9tIG1haW4gUExMICovCisjZGVmaW5lIFJDQ19QTExfUk5HQ0xLICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRRU4gICAgICAvKiE8IFBMTFJOR0NMSyBzZWxlY3Rpb24gZnJvbSBtYWluIFBMTCAqLworI2RlZmluZSBSQ0NfUExMX1NBSTFDTEsgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUEVOICAgICAgLyohPCBQTExTQUkxQ0xLIHNlbGVjdGlvbiBmcm9tIG1haW4gUExMICovCisjZGVmaW5lIFJDQ19QTExfQURDQ0xLICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExQRU4gICAgICAvKiE8IFBMTEFEQ0NMSyBzZWxlY3Rpb24gZnJvbSBtYWluIFBMTCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfUExMU0FJMV9DbG9ja19PdXRwdXQgUExMU0FJMSBDbG9jayBPdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUExMU0FJMV9BRENDTEsgICAgICAgICAgICAgUkNDX1BMTFNBSTFDRkdSX1BMTFJFTiAgICAgICAgLyohPCBQTExBRENDTEsgc2VsZWN0aW9uIGZyb20gUExMU0FJMSAqLworI2RlZmluZSBSQ0NfUExMU0FJMV9VU0JDTEsgICAgICAgICAgICAgUkNDX1BMTFNBSTFDRkdSX1BMTFFFTiAgICAgICAgLyohPCBVU0JDTEsgc2VsZWN0aW9uIGZyb20gUExMU0FJMSAqLworI2RlZmluZSBSQ0NfUExMU0FJMV9STkdDTEsgICAgICAgICAgICAgUkNDX1BMTFNBSTFDRkdSX1BMTFFFTiAgICAgICAvKiE8IFJOR0NMSyBzZWxlY3Rpb24gZnJvbSBQTExTQUkxICovCisjZGVmaW5lIFJDQ19QTExTQUkxX1NBSTFDTEsgICAgICAgICAgICBSQ0NfUExMU0FJMUNGR1JfUExMUEVOICAgICAgIC8qITwgUExMU0FJMUNMSyBzZWxlY3Rpb24gZnJvbSBQTExTQUkxICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NU0lfQ2xvY2tfUmFuZ2UgTVNJIENsb2NrIFJhbmdlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzAgICAgICAgICAgICAgICAgIExMX1JDQ19NU0lSQU5HRV8wICAvKiE8IE1TSSA9IDEwMCBLSHogICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV8xICAgICAgICAgICAgICAgICBMTF9SQ0NfTVNJUkFOR0VfMSAgLyohPCBNU0kgPSAyMDAgS0h6ICAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfMiAgICAgICAgICAgICAgICAgTExfUkNDX01TSVJBTkdFXzIgIC8qITwgTVNJID0gNDAwIEtIeiAgKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzMgICAgICAgICAgICAgICAgIExMX1JDQ19NU0lSQU5HRV8zICAvKiE8IE1TSSA9IDgwMCBLSHogICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV80ICAgICAgICAgICAgICAgICBMTF9SQ0NfTVNJUkFOR0VfNCAgLyohPCBNU0kgPSAxIE1IeiAgICAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfNSAgICAgICAgICAgICAgICAgTExfUkNDX01TSVJBTkdFXzUgIC8qITwgTVNJID0gMiBNSHogICAgKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzYgICAgICAgICAgICAgICAgIExMX1JDQ19NU0lSQU5HRV82ICAvKiE8IE1TSSA9IDQgTUh6ICAgICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV83ICAgICAgICAgICAgICAgICBMTF9SQ0NfTVNJUkFOR0VfNyAgLyohPCBNU0kgPSA4IE1IeiAgICAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfOCAgICAgICAgICAgICAgICAgTExfUkNDX01TSVJBTkdFXzggIC8qITwgTVNJID0gMTYgTUh6ICAgKi8KKyNkZWZpbmUgUkNDX01TSVJBTkdFXzkgICAgICAgICAgICAgICAgIExMX1JDQ19NU0lSQU5HRV85ICAvKiE8IE1TSSA9IDI0IE1IeiAgICovCisjZGVmaW5lIFJDQ19NU0lSQU5HRV8xMCAgICAgICAgICAgICAgICBMTF9SQ0NfTVNJUkFOR0VfMTAgLyohPCBNU0kgPSAzMiBNSHogICAqLworI2RlZmluZSBSQ0NfTVNJUkFOR0VfMTEgICAgICAgICAgICAgICAgTExfUkNDX01TSVJBTkdFXzExIC8qITwgTVNJID0gNDggTUh6ICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1N5c3RlbV9DbG9ja19UeXBlIFN5c3RlbSBDbG9jayBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9TWVNDTEsgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IFNZU0NMSyB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9IQ0xLICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAvKiE8IEhDTEsgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfUENMSzEgICAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBQQ0xLMSB0byBjb25maWd1cmUgKi8KKyNkZWZpbmUgUkNDX0NMT0NLVFlQRV9QQ0xLMiAgICAgICAgICAgIDB4MDAwMDAwMDhVICAvKiE8IFBDTEsyIHRvIGNvbmZpZ3VyZSAqLworI2RlZmluZSBSQ0NfQ0xPQ0tUWVBFX0hDTEsyICAgICAgICAgICAgMHgwMDAwMDAyMFUgIC8qITwgSENMSzIgdG8gY29uZmlndXJlICovCisjZGVmaW5lIFJDQ19DTE9DS1RZUEVfSENMSzQgICAgICAgICAgICAweDAwMDAwMDQwVSAgLyohPCBIQ0xLNCB0byBjb25maWd1cmUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1N5c3RlbV9DbG9ja19Tb3VyY2UgU3lzdGVtIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfTVNJICAgICAgICAgICBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9NU0kgICAgLyohPCBNU0kgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX0hTSSAgICAgICAgICAgTExfUkNDX1NZU19DTEtTT1VSQ0VfSFNJICAgIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9IU0UgICAgICAgICAgIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRSAgICAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLICAgICAgICBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9QTEwgICAgLyohPCBQTEwgc2VsZWN0aW9uIGFzIHN5c3RlbSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfU3lzdGVtX0Nsb2NrX1NvdXJjZV9TdGF0dXMgU3lzdGVtIENsb2NrIFNvdXJjZSBTdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0kgICAgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX01TSSAgIC8qITwgTVNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSAgICBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJICAgLyohPCBIU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFICAgIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0UgICAvKiE8IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEsgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX1BMTCAgIC8qITwgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEJ4X0Nsb2NrX1NvdXJjZSBBSEIgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYxICAgICAgICAgICAgICAgIExMX1JDQ19TWVNDTEtfRElWXzEgICAgIC8qITwgU1lTQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMiAgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl8yICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVYzICAgICAgICAgICAgICAgIExMX1JDQ19TWVNDTEtfRElWXzMgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMyAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjQgICAgICAgICAgICAgICAgTExfUkNDX1NZU0NMS19ESVZfNCAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNSAgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl81ICAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDUgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY2ICAgICAgICAgICAgICAgIExMX1JDQ19TWVNDTEtfRElWXzYgICAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNiAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjggICAgICAgICAgICAgICAgTExfUkNDX1NZU0NMS19ESVZfOCAgICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMTAgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl8xMCAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEwICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMTYgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl8xNiAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMzIgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl8zMiAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWNjQgICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl82NCAgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIFJDQ19TWVNDTEtfRElWMTI4ICAgICAgICAgICAgICBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjggICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBSQ0NfU1lTQ0xLX0RJVjI1NiAgICAgICAgICAgICAgTExfUkNDX1NZU0NMS19ESVZfMjU2ICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyNTYgKi8KKyNkZWZpbmUgUkNDX1NZU0NMS19ESVY1MTIgICAgICAgICAgICAgIExMX1JDQ19TWVNDTEtfRElWXzUxMiAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNTEyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEJ4X0Nsb2NrX1NvdXJjZSBBUEIxIENsb2NrIFNvdXJjZQorKiBAeworKi8KKyNkZWZpbmUgUkNDX0hDTEtfRElWMSAgICAgICAgICAgICAgICAgIExMX1JDQ19BUEIxX0RJVl8xICAgIC8qITwgSENMSyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfSENMS19ESVYyICAgICAgICAgICAgICAgICAgTExfUkNDX0FQQjFfRElWXzIgICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBSQ0NfSENMS19ESVY0ICAgICAgICAgICAgICAgICAgTExfUkNDX0FQQjFfRElWXzQgICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSQ0NfSENMS19ESVY4ICAgICAgICAgICAgICAgICAgTExfUkNDX0FQQjFfRElWXzggICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfSENMS19ESVYxNiAgICAgICAgICAgICAgICAgTExfUkNDX0FQQjFfRElWXzE2ICAgLyohPCBIQ0xLIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1JUQ19DbG9ja19Tb3VyY2UgUlRDIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9ORSAgICAgICAgICAgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTk9ORSAgICAgICAvKiE8IE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTFNFICAgICAgICAgICAgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFICAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTFNJICAgICAgICAgICAgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJICAgICAgICAvKiE8IExTSSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICAgICAgTExfUkNDX1JUQ19DTEtTT1VSQ0VfSFNFX0RJVjMyICAvKiE8IEhTRSBvc2NpbGxhdG9yIGNsb2NrIGRpdmlkZWQgYnkgMzIgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DT19JbmRleCBNQ08gSW5kZXgKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTUNPMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBNQ08xIGluZGV4ICovCisjZGVmaW5lIFJDQ19NQ08yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IE1DTzIgaW5kZXggKi8KKyNkZWZpbmUgUkNDX01DTzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgIC8qITwgTUNPMyBpbmRleCAqLworCisjZGVmaW5lIFJDQ19NQ08gICAgICAgICAgICAgICAgICAgICAgICBSQ0NfTUNPMSAgICAgICAgICAgICAvKiE8IE1DTzEgdG8gYmUgY29tcGxpYW50IHdpdGggb3RoZXIgZmFtaWxpZXMgd2l0aCAxIE1DTyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19NQ08xX0Nsb2NrX1NvdXJjZSBNQ08xIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgICAgICAgICBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICAgICAgIC8qITwgTUNPMSBvdXRwdXQgZGlzYWJsZWQsIG5vIGNsb2NrIG9uIE1DTzEgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfU1lTQ0xLICAgICAgICAgIExMX1JDQ19NQ08xU09VUkNFX1NZU0NMSyAgICAgICAgICAgLyohPCBTWVNDTEsgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX01TSSAgICAgICAgICAgICBMTF9SQ0NfTUNPMVNPVVJDRV9NU0kgICAgICAgICAgICAgIC8qITwgTVNJIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9IU0kgICAgICAgICAgICAgTExfUkNDX01DTzFTT1VSQ0VfSFNJICAgICAgICAgICAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNFICAgICAgICAgICAgIExMX1JDQ19NQ08xU09VUkNFX0hTRSAgICAgICAgICAgICAgLyohPCBIU0UgYWZ0ZXIgc3RhYmlsaXphdGlvbiBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfUExMQ0xLICAgICAgICAgIExMX1JDQ19NQ08xU09VUkNFX1BMTENMSyAgICAgICAgICAgLyohPCBQTExDTEsgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIFJDQ19NQ08xU09VUkNFX0xTSTEgICAgICAgICAgICBMTF9SQ0NfTUNPMVNPVVJDRV9MU0kxICAgICAgICAgICAgIC8qITwgTFNJMSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfTFNJMiAgICAgICAgICAgIExMX1JDQ19NQ08xU09VUkNFX0xTSTIgICAgICAgICAgICAgLyohPCBMU0kyIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBSQ0NfTUNPMVNPVVJDRV9MU0UgICAgICAgICAgICAgTExfUkNDX01DTzFTT1VSQ0VfTFNFICAgICAgICAgICAgICAvKiE8IExTRSBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNJNDggICAgICAgICAgIExMX1JDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgICAgICAgLyohPCBIU0k0OCBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgUkNDX01DTzFTT1VSQ0VfSFNFX0JFRk9SRV9TVEFCIExMX1JDQ19NQ08xU09VUkNFX0hTRV9CRUZPUkVfU1RBQiAgLyohPCBIU0UgYmVmb3JlIHN0YWJpbGl6YXRpb24gc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX01DT3hfQ2xvY2tfUHJlc2NhbGVyIE1DTyBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTUNPRElWXzEgICAgICAgICAgICAgICAgICAgTExfUkNDX01DTzFfRElWXzEgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBub3QgZGl2aWRlZCAqLworI2RlZmluZSBSQ0NfTUNPRElWXzIgICAgICAgICAgICAgICAgICAgTExfUkNDX01DTzFfRElWXzIgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX01DT0RJVl80ICAgICAgICAgICAgICAgICAgIExMX1JDQ19NQ08xX0RJVl80ICAgICAgICAgICAgICAgICAgLyohPCBNQ08gZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJDQ19NQ09ESVZfOCAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTUNPMV9ESVZfOCAgICAgICAgICAgICAgICAgIC8qITwgTUNPIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBSQ0NfTUNPRElWXzE2ICAgICAgICAgICAgICAgICAgTExfUkNDX01DTzFfRElWXzE2ICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19IU0VBTVBUSFJFU0hPTEQgSFNFIGJpYXMgY3VycmVudCBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfSFNFQU1QVEhSRVNIT0xEXzFfMiAgICAgICBMTF9SQ0NfSFNFQU1QVEhSRVNIT0xEXzFfMiAgICAgICAgICAgLyohPCBIU0UgYmlhcyBjdXJyZW50IGZhY3RvciAxLzIgKi8KKyNkZWZpbmUgUkNDX0hTRUFNUFRIUkVTSE9MRF8zXzQgICAgICAgTExfUkNDX0hTRUFNUFRIUkVTSE9MRF8zXzQgICAgICAgICAgIC8qITwgSFNFIGJpYXMgY3VycmVudCBmYWN0b3IgMy80ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0hTRV9DVVJSRU5UTUFYIEhTRSBjdXJyZW50IG1heCBsaW1pdAorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19IU0VfQ1VSUkVOVE1BWF8wICAgICAgICAgICBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMCAgICAgICAgICAgICAvKiE8IEhTRSBjdXJyZW50IG1heCBsaW1pdCAwLjE4IG1BL1YgKi8KKyNkZWZpbmUgUkNDX0hTRV9DVVJSRU5UTUFYXzEgICAgICAgICAgIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF8xICAgICAgICAgICAgIC8qITwgSFNFIGN1cnJlbnQgbWF4IGxpbWl0IDAuNTcgbUEvViAqLworI2RlZmluZSBSQ0NfSFNFX0NVUlJFTlRNQVhfMiAgICAgICAgICAgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzIgICAgICAgICAgICAgLyohPCBIU0UgY3VycmVudCBtYXggbGltaXQgMC43OCBtQS9WICovCisjZGVmaW5lIFJDQ19IU0VfQ1VSUkVOVE1BWF8zICAgICAgICAgICBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMyAgICAgICAgICAgICAvKiE8IEhTRSBjdXJyZW50IG1heCBsaW1pdCAxLjEzIG1BL1YgKi8KKyNkZWZpbmUgUkNDX0hTRV9DVVJSRU5UTUFYXzQgICAgICAgICAgIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF80ICAgICAgICAgICAgIC8qITwgSFNFIGN1cnJlbnQgbWF4IGxpbWl0IDAuNjEgbUEvViAqLworI2RlZmluZSBSQ0NfSFNFX0NVUlJFTlRNQVhfNSAgICAgICAgICAgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzUgICAgICAgICAgICAgLyohPCBIU0UgY3VycmVudCBtYXggbGltaXQgMS42NSBtQS9WICovCisjZGVmaW5lIFJDQ19IU0VfQ1VSUkVOVE1BWF82ICAgICAgICAgICBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfNiAgICAgICAgICAgICAvKiE8IEhTRSBjdXJyZW50IG1heCBsaW1pdCAyLjEyIG1BL1YgKi8KKyNkZWZpbmUgUkNDX0hTRV9DVVJSRU5UTUFYXzcgICAgICAgICAgIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF83ICAgICAgICAgICAgIC8qITwgSFNFIGN1cnJlbnQgbWF4IGxpbWl0IDIuODQgbUEvViAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19JbnRlcnJ1cHQgSW50ZXJydXB0cworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JVF9MU0kxUkRZICAgICAgICAgICAgICAgICBMTF9SQ0NfQ0lGUl9MU0kxUkRZRiAgICAgLyohPCBMU0kxIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0kyUkRZICAgICAgICAgICAgICAgICBMTF9SQ0NfQ0lGUl9MU0kyUkRZRiAgICAgLyohPCBMU0kyIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9MU0VSRFkgICAgICAgICAgICAgICAgICBMTF9SQ0NfQ0lGUl9MU0VSRFlGICAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX01TSVJEWSAgICAgICAgICAgICAgICAgIExMX1JDQ19DSUZSX01TSVJEWUYgICAgICAvKiE8IE1TSSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNJUkRZICAgICAgICAgICAgICAgICAgTExfUkNDX0NJRlJfSFNJUkRZRiAgICAgIC8qITwgSFNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJDQ19JVF9IU0VSRFkgICAgICAgICAgICAgICAgICBMTF9SQ0NfQ0lGUl9IU0VSRFlGICAgICAgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0lUX1BMTFJEWSAgICAgICAgICAgICAgICAgIExMX1JDQ19DSUZSX1BMTFJEWUYgICAgICAvKiE8IFBMTCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfUExMU0FJMVJEWSAgICAgICAgICAgICAgTExfUkNDX0NJRlJfUExMU0FJMVJEWUYgIC8qITwgUExMU0FJMSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNFQ1NTICAgICAgICAgICAgICAgICAgTExfUkNDX0NJRlJfQ1NTRiAgICAgICAgIC8qITwgSFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfTFNFQ1NTICAgICAgICAgICAgICAgICAgTExfUkNDX0NJRlJfTFNFQ1NTRiAgICAgIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBSQ0NfSVRfSFNJNDhSRFkgICAgICAgICAgICAgICAgTExfUkNDX0NJRlJfSFNJNDhSRFlGICAgIC8qITwgSFNJNDggUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfRmxhZyBGbGFncworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogWFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBYWFggIDogUmVnaXN0ZXIgaW5kZXgKKyAgKiAgICAgICAgICAgICAgICAgLSAwMDE6IENSIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMDEwOiBCRENSIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMDExOiBDU1IgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMDA6IENSUkNSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKy8qIEZsYWdzIGluIHRoZSBDUiByZWdpc3RlciAqLworI2RlZmluZSBSQ0NfRkxBR19NU0lSRFkgICAgICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX01TSVJEWV9Qb3MpICAgICAgLyohPCBNU0kgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19IU0lSRFkgICAgICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX0hTSVJEWV9Qb3MpICAgICAgLyohPCBIU0kgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19IU0VSRFkgICAgICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX0hTRVJEWV9Qb3MpICAgICAgLyohPCBIU0UgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19QTExSRFkgICAgICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX1BMTFJEWV9Qb3MpICAgICAgLyohPCBQTEwgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19QTExTQUkxUkRZICAgICAgICAgICAgKChDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NSX1BMTFNBSTFSRFlfUG9zKSAgLyohPCBQTExTQUkxIFJlYWR5IGZsYWcgKi8KKworLyogRmxhZ3MgaW4gdGhlIEJEQ1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNFUkRZICAgICAgICAgICAgICAgICgoQkRDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0JEQ1JfTFNFUkRZX1BvcykgIC8qITwgTFNFIFJlYWR5IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNFQ1NTRCAgICAgICAgICAgICAgICgoQkRDUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0JEQ1JfTFNFQ1NTRF9Qb3MpIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBmYWlsdXJlIGRldGVjdGlvbiBmbGFnICovCisKKy8qIEZsYWdzIGluIHRoZSBDU1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfTFNJMVJEWSAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0xTSTFSRFlfUG9zKSAgIC8qITwgTFNJMSBSZWFkeSBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX0xTSTJSRFkgICAgICAgICAgICAgICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9MU0kyUkRZX1BvcykgICAvKiE8IExTSTIgUmVhZHkgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19PQkxSU1QgICAgICAgICAgICAgICAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfT0JMUlNURl9Qb3MpICAgLyohPCBPcHRpb24gQnl0ZSBMb2FkZXIgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19QSU5SU1QgICAgICAgICAgICAgICAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfUElOUlNURl9Qb3MpICAgLyohPCBQaW4gcmVzZXQgZmxhZyAoTlJTVCBwaW4pICovCisjZGVmaW5lIFJDQ19GTEFHX0JPUlJTVCAgICAgICAgICAgICAgICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9CT1JSU1RGX1BvcykgICAvKiE8IEJPUiByZXNldCBmbGFnICovCisjZGVmaW5lIFJDQ19GTEFHX1NGVFJTVCAgICAgICAgICAgICAgICAoKENTUl9SRUdfSU5ERVggPDwgNVUpIHwgUkNDX0NTUl9TRlRSU1RGX1BvcykgICAvKiE8IFNvZnR3YXJlIFJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSVdER1JTVCAgICAgICAgICAgICAgICgoQ1NSX1JFR19JTkRFWCA8PCA1VSkgfCBSQ0NfQ1NSX0lXREdSU1RGX1BvcykgIC8qITwgV2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19XV0RHUlNUICAgICAgICAgICAgICAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfV1dER1JTVEZfUG9zKSAgLyohPCBXaW5kb3cgd2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSQ0NfRkxBR19MUFdSUlNUICAgICAgICAgICAgICAgKChDU1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DU1JfTFBXUlJTVEZfUG9zKSAgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworCisvKiBGbGFncyBpbiB0aGUgQ1JSQ1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkNDX0ZMQUdfSFNJNDhSRFkgICAgICAgICAgICAgICgoQ1JSQ1JfUkVHX0lOREVYIDw8IDVVKSB8IFJDQ19DUlJDUl9IU0k0OFJEWV9Qb3MpIC8qITwgSFNJNDggUmVhZHkgZmxhZyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0VEcml2ZV9Db25maWcgTFNFIERyaXZlIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfTE9XICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFRFJJVkVfTE9XICAgICAgICAgICAgLyohPCBMU0UgbG93IGRyaXZlIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUkNDX0xTRURSSVZFX01FRElVTUxPVyAgICAgICAgICAgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVyAgICAgIC8qITwgTFNFIG1lZGl1bSBsb3cgZHJpdmUgY2FwYWJpbGl0eSAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgICBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgLyohPCBMU0UgbWVkaXVtIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eSAqLworI2RlZmluZSBSQ0NfTFNFRFJJVkVfSElHSCAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFRFJJVkVfSElHSCAgICAgICAgICAgLyohPCBMU0UgaGlnaCBkcml2ZSBjYXBhYmlsaXR5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19TdG9wX1dha2VVcENsb2NrIFdha2UtVXAgZnJvbSBTVE9QIENsb2NrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJICAgICAgIExMX1JDQ19TVE9QX1dBS0VVUENMT0NLX01TSSAgICAgICAvKiE8IE1TSSBzZWxlY3Rpb24gYWZ0ZXIgd2FrZS11cCBmcm9tIFNUT1AgKi8KKyNkZWZpbmUgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJICAgICAgIExMX1JDQ19TVE9QX1dBS0VVUENMT0NLX0hTSSAgICAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYWZ0ZXIgd2FrZS11cCBmcm9tIFNUT1AgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX01hY3JvcyBSQ0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFIQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjEgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0NMS19FTkFCTEUoKSAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0RJU0FCTEUoKSAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMV9HUlAxX1BFUklQSF9DUkMpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMV9HUlAxX1BFUklQSF9UU0MpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjJfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZSBBSEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIyIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUoKSAgICAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0NMS19FTkFCTEUoKSAgICAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9BREMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMxX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9BRVMxKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIzX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFIQjMgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUoKSAgICAgICAgIExMX0FIQjNfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkpCisjZGVmaW5lIF9fSEFMX1JDQ19QS0FfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0FIQjNfR1JQMV9FbmFibGVDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMikKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFKCkgICAgICAgICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfSFNFTV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9IU0VNKQorI2RlZmluZSBfX0hBTF9SQ0NfSVBDQ19DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9JUENDKQorI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSCkKKworI2RlZmluZSBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfRElTQUJMRSgpICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfUVVBRFNQSSkKKyNkZWZpbmUgX19IQUxfUkNDX1BLQV9DTEtfRElTQUJMRSgpICAgICAgICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9STkcpCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VNX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9IU0VNKQorI2RlZmluZSBfX0hBTF9SQ0NfSVBDQ19DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQQjEgcGVyaXBoZXJhbCBjbG9jay4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19SVENBUEJfQ0xLX0VOQUJMRSgpICAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQikKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERykKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfTENEKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfRU5BQkxFKCkgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19FTkFCTEUoKSAgICAgICAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2soTExfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NMS19FTkFCTEUoKSAgICAgICAgIExMX0FQQjFfR1JQMl9FbmFibGVDbG9jayhMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfRElTQUJMRSgpICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MQ0RfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9MQ0QpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9VU0IpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9DTEtfRElTQUJMRSgpICAgICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9jayhMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX0RJU0FCTEUoKSAgICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9jayhMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19FbmFibGVfRGlzYWJsZSBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19FTkFCTEUoKSAgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNykKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfQ0xLX0RJU0FCTEUoKSAgICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xNl9DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3KQorI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9QZXJpcGhlcmFsX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0lTX0NMS19FTkFCTEVEKCkgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSkpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0lTX0NMS19ESVNBQkxFRCgpICAgICEoTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMSkpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICEoTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKSkKKyNkZWZpbmUgX19IQUxfUkNDX1RTQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCMV9HUlAxX1BFUklQSF9UU0MpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9JU19DTEtfRU5BQkxFRCgpICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9JU19DTEtfRU5BQkxFRCgpICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gpCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIShMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICEoTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0lTX0NMS19ESVNBQkxFRCgpICAgICAgIShMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfRElTQUJMRUQoKSAgICAgICEoTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gpKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQykpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkpCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIzX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIzIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjMgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19RVUFEU1BJX0lTX0NMS19FTkFCTEVEKCkgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUEtBX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfUEtBKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTMl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMikKKyNkZWZpbmUgX19IQUxfUkNDX1JOR19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX1JORykKKyNkZWZpbmUgX19IQUxfUkNDX0hTRU1fSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX0hTRU0pCisjZGVmaW5lIF9fSEFMX1JDQ19JUENDX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9JUENDKQorI2RlZmluZSBfX0hBTF9SQ0NfRkxBU0hfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gpCisKKyNkZWZpbmUgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICEoTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfUVVBRFNQSSkpCisjZGVmaW5lIF9fSEFMX1JDQ19QS0FfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAhKExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSkpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgIShMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9STkcpKQorI2RlZmluZSBfX0hBTF9SQ0NfSFNFTV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQUhCM19HUlAxX1BFUklQSF9IU0VNKSkKKyNkZWZpbmUgX19IQUxfUkNDX0lQQ0NfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICEoTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAhKExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MQ0RfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMikKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9VU0IpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICBMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIpKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIpKQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICAhKExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCkpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMikpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSkpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgICEoTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAgIShMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAxX1BFUklQSF9VU0IpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkpCisKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2soTExfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAhKExMX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jayhMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3KQorI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgIShMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgIShMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTZfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAhKExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgIShMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNykpCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZSBBSEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJETUExX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkRNQTJfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9DTEtfRU5BQkxFKCkgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMV9DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJDUkNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVFNDX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMl9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9DTEtfRElTQUJMRSgpICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1JBTTFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSQ19DTEtfRElTQUJMRSgpICAgICAgICAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVFNDX0NMS19ESVNBQkxFKCkgICAgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfVFNDKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX1BlcmlwaGVyYWxfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQUhCMiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMiBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0FfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0JfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0NfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0RfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0VfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0hfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPSCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQURDX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BREMpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQV9DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0JfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9DX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRF9DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0VfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9IX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRENfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BREMpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzFfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FFUzEpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjNfQ2xvY2tfRW5hYmxlX0Rpc2FibGUgQUhCMyBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMyBwZXJpcGhlcmFsIGNsb2NrLgorICAqIEBub3RlICAgQWZ0ZXIgcmVzZXQsIHRoZSBwZXJpcGhlcmFsIGNsb2NrICh1c2VkIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZSBhY2Nlc3MpCisgICogICAgICAgICBpcyBkaXNhYmxlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGhhcyB0byBlbmFibGUgdGhpcyBjbG9jayBiZWZvcmUKKyAgKiAgICAgICAgIHVzaW5nIGl0LgorICAqIEB7CisgICovCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyUEtBX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQUVTMl9DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJOR19DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCM19HUlAxX1BFUklQSF9STkcpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkhTRU1fQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQUhCM19HUlAxX1BFUklQSF9IU0VNKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJUENDX0NMS19FTkFCTEUoKSAgICAgICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyRkxBU0hfQ0xLX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlBLQV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUEtBKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMyX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJOR19DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJIU0VNX0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0hTRU0pCisjZGVmaW5lIF9fSEFMX1JDQ19DMklQQ0NfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyRkxBU0hfQ0xLX0RJU0FCTEUoKSAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQUhCM19HUlAxX1BFUklQSF9GTEFTSCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMV9DbG9ja19FbmFibGVfRGlzYWJsZSBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIxIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJSVENBUEJfQ0xLX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMQ0RfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1BJMl9DTEtfRU5BQkxFKCkgICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMxX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkkyQzNfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0MyQ1JTX0NMS19FTkFCTEUoKSAgICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlVTQl9DTEtfRU5BQkxFKCkgICAgICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVVNCKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFRJTTFfQ0xLX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFRJTTJfQ0xLX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjFfR1JQMl9FbmFibGVDbG9jayhMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBVQVJUMV9DTEtfRU5BQkxFKCkgICAgICAgICBMTF9DMl9BUEIxX0dSUDJfRW5hYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJUQ0FQQl9DTEtfRElTQUJMRSgpICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMl9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTENEX0NMS19ESVNBQkxFKCkgICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTENEKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkyX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMxX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMzX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMzKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJDUlNfQ0xLX0RJU0FCTEUoKSAgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlVTQl9DTEtfRElTQUJMRSgpICAgICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBUSU0xX0NMS19ESVNBQkxFKCkgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMl9DTEtfRElTQUJMRSgpICAgICAgICAgTExfQzJfQVBCMV9HUlAyX0Rpc2FibGVDbG9jayhMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBVQVJUMV9DTEtfRElTQUJMRSgpICAgICAgICBMTF9DMl9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19FbmFibGVfRGlzYWJsZSBBUEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xX0NMS19FTkFCTEUoKSAgICAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNBUlQxX0NMS19FTkFCTEUoKSAgICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE2X0NMS19FTkFCTEUoKSAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE3X0NMS19FTkFCTEUoKSAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNBSTFfQ0xLX0VOQUJMRSgpICAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkxX0NMS19ESVNBQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TUEkxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJVU0FSVDFfQ0xLX0RJU0FCTEUoKSAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE2X0NMS19ESVNBQkxFKCkgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xN19DTEtfRElTQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xNykKKyNkZWZpbmUgX19IQUxfUkNDX0MyU0FJMV9DTEtfRElTQUJMRSgpICAgICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCM19DbG9ja19FbmFibGVfRGlzYWJsZSBBUEIzIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBUEIzIHBlcmlwaGVyYWwgY2xvY2suCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJCTEVfQ0xLX0VOQUJMRSgpICAgICAgICAgICBMTF9DMl9BUEIzX0dSUDFfRW5hYmxlQ2xvY2soTExfQzJfQVBCM19HUlAxX1BFUklQSF9CTEUpCisjZGVmaW5lIF9fSEFMX1JDQ19DMjgwMl9DTEtfRU5BQkxFKCkgICAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9FbmFibGVDbG9jayhMTF9DMl9BUEIzX0dSUDFfUEVSSVBIXzgwMikKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJCTEVfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BUEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfQkxFKQorI2RlZmluZSBfX0hBTF9SQ0NfQzI4MDJfQ0xLX0RJU0FCTEUoKSAgICAgICAgICBMTF9DMl9BUEIzX0dSUDFfRGlzYWJsZUNsb2NrKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfODAyKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfUGVyaXBoZXJhbF9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMSBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJETUExX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkRNQTJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgTExfQzJfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9JU19DTEtfRU5BQkxFRCgpICAgICBMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMV9JU19DTEtfRU5BQkxFRCgpICAgICAgIExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJDUkNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVFNDX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICBMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAhKExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJETUEyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQzJfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkRNQU1VWDFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgIShMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1JBTTFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQ1JDX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRTQ19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgIShMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBSEIyIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9BX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9CX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9DX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9EX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9FX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9IX0lTX0NMS19FTkFCTEVEKCkgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFEQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQURDKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FFUzEpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0FfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0JfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0NfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0RfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0VfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0hfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQURDX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FEQykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgIShMTF9DMl9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMyBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJQS0FfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICBMTF9DMl9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCM19HUlAxX1BFUklQSF9QS0EpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJOR19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgIExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1JORykKKyNkZWZpbmUgX19IQUxfUkNDX0MySFNFTV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSFNFTSkKKyNkZWZpbmUgX19IQUxfUkNDX0MySVBDQ19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyRkxBU0hfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyUEtBX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgIShMTF9DMl9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQUhCM19HUlAxX1BFUklQSF9QS0EpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMyX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAhKExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJSTkdfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAhKExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1JORykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkhTRU1fSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICEoTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSFNFTSkpCisjZGVmaW5lIF9fSEFMX1JDQ19DMklQQ0NfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICEoTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkZMQVNIX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIxX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIxIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJUQ0FQQl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0yX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1RJTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxDRF9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTENEKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkyX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkkyQzFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MySTJDM19JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMzKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJDUlNfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0NSUykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNCX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9VU0IpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMl9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgTExfQzJfQVBCMV9HUlAyX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFVBUlQxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgIExMX0MyX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyUlRDQVBCX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICEoTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVElNMikpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxDRF9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xDRCkpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAhKExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgIShMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMxKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MySTJDM19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICEoTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSU19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0NSUykpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlVTQl9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1VTQikpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAhKExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBUSU0yX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICEoTExfQzJfQVBCMV9HUlAyX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBVQVJUMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICEoTExfQzJfQVBCMV9HUlAyX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCMl9DbG9ja19FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgKHVzZWQgZm9yIHJlZ2lzdGVycyByZWFkL3dyaXRlIGFjY2VzcykKKyAgKiAgICAgICAgIGlzIGRpc2FibGVkIGFuZCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgaGFzIHRvIGVuYWJsZSB0aGlzIGNsb2NrIGJlZm9yZQorICAqICAgICAgICAgdXNpbmcgaXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNBUlQxX0lTX0NMS19FTkFCTEVEKCkgICAgICAgICBMTF9DMl9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE2X0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE3X0lTX0NMS19FTkFCTEVEKCkgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNBSTFfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU0FJMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkxX0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgICEoIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJVU0FSVDFfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICEoIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE2X0lTX0NMS19ESVNBQkxFRCgpICAgICAgICAgISggTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xN19JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICEoIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3KSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU0FJMV9JU19DTEtfRElTQUJMRUQoKSAgICAgICAgICAhKCBMTF9DMl9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ19BUEIzX0Nsb2NrX0VuYWJsZV9EaXNhYmxlX1N0YXR1cyBBUEIzIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlZCBvciBEaXNhYmxlZCBTdGF0dXMKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIEFQQjMgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEFmdGVyIHJlc2V0LCB0aGUgcGVyaXBoZXJhbCBjbG9jayAodXNlZCBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGUgYWNjZXNzKQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBoYXMgdG8gZW5hYmxlIHRoaXMgY2xvY2sgYmVmb3JlCisgICogICAgICAgICB1c2luZyBpdC4KKyAgKiBAeworICAqLworCisjZGVmaW5lIF9fSEFMX1JDQ19DMkJMRV9JU19DTEtfRU5BQkxFRCgpICAgICAgICAgICAgTExfQzJfQVBCM19HUlAxX0lzRW5hYmxlZENsb2NrKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfQkxFKQorI2RlZmluZSBfX0hBTF9SQ0NfQzI4MDJfSVNfQ0xLX0VOQUJMRUQoKSAgICAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayhMTF9DMl9BUEIzX0dSUDFfUEVSSVBIXzgwMikKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJCTEVfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgIShMTF9DMl9BUEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCM19HUlAxX1BFUklQSF9CTEUpKQorI2RlZmluZSBfX0hBTF9SQ0NfQzI4MDJfSVNfQ0xLX0RJU0FCTEVEKCkgICAgICAgICAgIShMTF9DMl9BUEIzX0dSUDFfSXNFbmFibGVkQ2xvY2soTExfQzJfQVBCM19HUlAxX1BFUklQSF84MDIpKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfRm9yY2VfUmVsZWFzZV9SZXNldCBBSEIxIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBSEIxIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FIQjFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9BTEwpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9GT1JDRV9SRVNFVCgpICAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKQorI2RlZmluZSBfX0hBTF9SQ0NfVFNDX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBMTF9BSEIxX0dSUDFfRm9yY2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQykKKworCisjZGVmaW5lIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9BTEwpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0RNQU1VWDFfUkVMRUFTRV9SRVNFVCgpICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9DUkMpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9UU0MpCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMl9Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFIQjIgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFIQjIgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQUhCMl9GT1JDRV9SRVNFVCgpICAgICAgICAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9CX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQykKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9FX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPSCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19GT1JDRV9SRVNFVCgpICAgICAgICAgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9BREMpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMxX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQUhCMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQUxMKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfUkVMRUFTRV9SRVNFVCgpICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQl9SRUxFQVNFX1JFU0VUKCkgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfUkVMRUFTRV9SRVNFVCgpICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRV9SRUxFQVNFX1JFU0VUKCkgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQURDKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFIQjMgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFIQjMgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQUhCM19GT1JDRV9SRVNFVCgpICAgICAgICAgICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX1FVQURTUElfRk9SQ0VfUkVTRVQoKSAgICAgICAgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUEtBX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9BRVMyKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX1JORykKKyNkZWZpbmUgX19IQUxfUkNDX0hTRU1fRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQUhCM19HUlAxX0ZvcmNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9IU0VNKQorI2RlZmluZSBfX0hBTF9SQ0NfSVBDQ19GT1JDRV9SRVNFVCgpICAgICAgICAgICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX0lQQ0MpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9GT1JDRV9SRVNFVCgpICAgICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gpCisKKyNkZWZpbmUgX19IQUxfUkNDX0FIQjNfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX1FVQURTUElfUkVMRUFTRV9SRVNFVCgpICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkpCisjZGVmaW5lIF9fSEFMX1JDQ19QS0FfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9QS0EpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMyX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9BRVMyKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfSFNFTV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjNfR1JQMV9QRVJJUEhfSFNFTSkKKyNkZWZpbmUgX19IQUxfUkNDX0lQQ0NfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX0lQQ0MpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9SRUxFQVNFX1JFU0VUKCkgICAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIxIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIxIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMUxfRk9SQ0VfUkVTRVQoKSAgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9GT1JDRV9SRVNFVCgpICAgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19GT1JDRV9SRVNFVCgpICAgICAgICAgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMUhfRk9SQ0VfUkVTRVQoKSAgICAgICAgICBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfRk9SQ0VfUkVTRVQoKSAgICAgICAgTExfQVBCMV9HUlAyX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0ZPUkNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVCgpIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JDQ19BUEIxTF9GT1JDRV9SRVNFVCgpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SQ0NfQVBCMUhfRk9SQ0VfUkVTRVQoKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMUxfUkVMRUFTRV9SRVNFVCgpICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfQUxMKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9SRUxFQVNFX1JFU0VUKCkgICAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMUhfUkVMRUFTRV9SRVNFVCgpICAgICAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfQUxMKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBVQVJUMV9SRUxFQVNFX1JFU0VUKCkgICAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9SRUxFQVNFX1JFU0VUKCkgICAgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCMV9SRUxFQVNFX1JFU0VUKCkgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUkNDX0FQQjFMX1JFTEVBU0VfUkVTRVQoKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUkNDX0FQQjFIX1JFTEVBU0VfUkVTRVQoKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfRm9yY2VfUmVsZWFzZV9SZXNldCBBUEIyIFBlcmlwaGVyYWwgRm9yY2UgUmVsZWFzZSBSZXNldAorICAqIEBicmllZiAgRm9yY2Ugb3IgcmVsZWFzZSBBUEIyIHBlcmlwaGVyYWwgcmVzZXQuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BTEwpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0ZPUkNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIyX0dSUDFfRm9yY2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0ZPUkNFX1JFU0VUKCkgICAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNykKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfRk9SQ0VfUkVTRVQoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19BUEIyX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9BTEwpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9SRUxFQVNFX1JFU0VUKCkgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X1JFTEVBU0VfUkVTRVQoKSAgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfUkVMRUFTRV9SRVNFVCgpICAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX1JFTEVBU0VfUkVTRVQoKSAgICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQVBCM19Gb3JjZV9SZWxlYXNlX1Jlc2V0IEFQQjMgUGVyaXBoZXJhbCBGb3JjZSBSZWxlYXNlIFJlc2V0CisgICogQGJyaWVmICBGb3JjZSBvciByZWxlYXNlIEFQQjMgcGVyaXBoZXJhbCByZXNldC4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQVBCM19GT1JDRV9SRVNFVCgpICAgICAgICAgICBMTF9BUEIzX0dSUDFfRm9yY2VSZXNldChMTF9BUEIzX0dSUDFfUEVSSVBIX0FMTCkKKyNkZWZpbmUgX19IQUxfUkNDX1JGX0ZPUkNFX1JFU0VUKCkgICAgICAgICAgICAgTExfQVBCM19HUlAxX0ZvcmNlUmVzZXQoTExfQVBCM19HUlAxX1BFUklQSF9SRikKKworI2RlZmluZSBfX0hBTF9SQ0NfQVBCM19SRUxFQVNFX1JFU0VUKCkgICAgICAgICBMTF9BUEIzX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjNfR1JQMV9QRVJJUEhfQUxMKQorI2RlZmluZSBfX0hBTF9SQ0NfUkZfUkVMRUFTRV9SRVNFVCgpICAgICAgICAgICBMTF9BUEIzX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjNfR1JQMV9QRVJJUEhfUkYpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FIQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQUhCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUEyX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0NMS19TTEVFUF9FTkFCTEUoKSAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCMV9HUlAxX1BFUklQSF9DUkMpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQykKKworI2RlZmluZSBfX0hBTF9SQ0NfRE1BMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0NMS19TTEVFUF9ESVNBQkxFKCkgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxKQorI2RlZmluZSBfX0hBTF9SQ0NfU1JBTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCMV9HUlAxX1BFUklQSF9DUkMpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCMV9HUlAxX1BFUklQSF9UU0MpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9DTEtfU0xFRVBfRU5BQkxFKCkgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1JBTTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSQ19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBMTF9DMl9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVFNDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfVFNDKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkRNQTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUExKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJETUEyX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9DTEtfU0xFRVBfRElTQUJMRSgpIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNSQU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCMV9HUlAxX1BFUklQSF9TUkFNMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJDUkNfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUU0NfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfVFNDKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19BSEIyX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlIEFIQjIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFIQjIgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCMl9HUlAxX1BFUklQSF9BRVMxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9DX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPRF9DTEtfU0xFRVBfRElTQUJMRSgpICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9IX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gpCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQV9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQl9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQ19DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRF9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRV9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPSF9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRENfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyQUVTMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9BX0NMS19TTEVFUF9ESVNBQkxFKCkgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQl9DTEtfU0xFRVBfRElTQUJMRSgpICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0NfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9EX0NMS19TTEVFUF9ESVNBQkxFKCkgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRV9DTEtfU0xFRVBfRElTQUJMRSgpICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0hfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFEQ19DTEtfU0xFRVBfRElTQUJMRSgpICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FEQykKKyNkZWZpbmUgX19IQUxfUkNDX0MyQUVTMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQUVTMSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZSBBSEIzIFBlcmlwaGVyYWwgQ2xvY2sgU2xlZXAgRW5hYmxlIERpc2FibGUKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1FVQURTUElfQ0xLX1NMRUVQX0VOQUJMRSgpICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUEtBX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9BRVMyKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BSEIzX0dSUDFfUEVSSVBIX1JORykKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9TUkFNMikKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSCkKKworI2RlZmluZSBfX0hBTF9SQ0NfUVVBRFNQSV9DTEtfU0xFRVBfRElTQUJMRSgpICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJKQorI2RlZmluZSBfX0hBTF9SQ0NfUEtBX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQUhCM19HUlAxX1BFUklQSF9QS0EpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMyX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIzX0dSUDFfUEVSSVBIX1JORykKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FIQjNfR1JQMV9QRVJJUEhfU1JBTTIpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9DTEtfU0xFRVBfRElTQUJMRSgpICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlBLQV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUEtBKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMyX0NMS19TTEVFUF9FTkFCTEUoKSAgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJOR19DTEtfU0xFRVBfRU5BQkxFKCkgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMl9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1NSQU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJGTEFTSF9DTEtfU0xFRVBfRU5BQkxFKCkgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlBLQV9DTEtfU0xFRVBfRElTQUJMRSgpICAgIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1BLQSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQUVTMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfQUVTMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyUk5HX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUk5HKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMl9DTEtfU0xFRVBfRElTQUJMRSgpICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQUhCM19HUlAxX1BFUklQSF9TUkFNMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyRkxBU0hfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfTENEKQorI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERykKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUykKKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFRJTTJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpCisKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfTENEX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERykKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMzX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMikKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0yX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVElNMikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTENEX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyUlRDQVBCX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1BJMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkkyQzFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMzX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMykKKyNkZWZpbmUgX19IQUxfUkNDX0MyQ1JTX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0NSUykKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNCX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBUSU0xX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBVQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICBMTF9DMl9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMl9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgTExfQzJfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMl9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMQ0RfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xDRCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyUlRDQVBCX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfU1BJMikKKyNkZWZpbmUgX19IQUxfUkNDX0MySTJDMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMzX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0kyQzMpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSU19DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfQ1JTKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJVU0JfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1VTQikKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBUSU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVUFSVDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgTExfQzJfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBUSU0yX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICBMTF9DMl9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGUgQVBCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZSBEaXNhYmxlCisgICogQGJyaWVmICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX1NQSTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKQorI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNikKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE3X0NMS19TTEVFUF9ESVNBQkxFKCkgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNykKKyNkZWZpbmUgX19IQUxfUkNDX1NBSTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkxX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICAgIExMX0MyX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNBUlQxX0NMS19TTEVFUF9FTkFCTEUoKSAgICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMTZfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2KQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xN19DTEtfU0xFRVBfRU5BQkxFKCkgICAgICAgIExMX0MyX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNBSTFfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1BJMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TUEkxKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJVU0FSVDFfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMTZfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xNikKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMTdfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xNykKKyNkZWZpbmUgX19IQUxfUkNDX0MyU0FJMV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAoTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMV9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMSBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIxIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0RNQTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUEyU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19ETUFNVVgxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQU1VWDFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1NSQU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfU1JBTTFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0NSQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfQ1JDU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19UU0NfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX1RTQ1NNRU4pICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19ETUExX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0RNQTFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0RNQTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFJDQ19BSEIxU01FTlJfRE1BMlNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfRE1BTVVYMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9ETUFNVVgxU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX1NSQU0xU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DUkNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QUhCMVNNRU5SLCBSQ0NfQUhCMVNNRU5SX0NSQ1NNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVFNDX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjFTTUVOUiwgUkNDX0FIQjFTTUVOUl9UU0NTTUVOKSA9PSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJETUExX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBSQ0NfQzJBSEIxU01FTlJfRE1BMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJETUEyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBSQ0NfQzJBSEIxU01FTlJfRE1BMlNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJETUFNVVgxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgIChSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBSQ0NfQzJBSEIxU01FTlJfRE1BTVVYMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBSQ0NfQzJBSEIxU01FTlJfU1JBTTFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQ1JDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX0NSQ1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUU0NfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBSQ0NfQzJBSEIxU01FTlJfVFNDU01FTikgIT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX0RNQTFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX0RNQTJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyRE1BTVVYMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX0RNQU1VWDFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1JBTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX1NSQU0xU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSQ19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QzJBSEIxU01FTlIsIFJDQ19DMkFIQjFTTUVOUl9DUkNTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVFNDX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjFTTUVOUiwgUkNDX0MyQUhCMVNNRU5SX1RTQ1NNRU4pID09IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCMl9DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMiBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIyIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9BX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9CU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0NTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0dQSU9EX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRFNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0dQSU9FU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19HUElPSF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFJDQ19BSEIyU01FTlJfR1BJT0hTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0FEQ19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRENTTUVOKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QUhCMlNNRU5SLCBSQ0NfQUhCMlNNRU5SX0FFUzFTTUVOKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0FfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0JfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQlNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0NfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPQ1NNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0RfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRFNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0VfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPRVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfR1BJT0hfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9HUElPSFNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQURDX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRENTTUVOKSAgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQUVTMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjJTTUVOUiwgUkNDX0FIQjJTTUVOUl9BRVMxU01FTikgPT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0FfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFJDQ19DMkFIQjJTTUVOUl9HUElPQVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0dQSU9CU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9DX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBSQ0NfQzJBSEIyU01FTlJfR1BJT0NTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0RfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFJDQ19DMkFIQjJTTUVOUl9HUElPRFNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0dQSU9FU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9IX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBSQ0NfQzJBSEIyU01FTlJfR1BJT0hTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQURDX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFJDQ19DMkFIQjJTTUVOUl9BRENTTUVOKSAgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0FFUzFTTUVOKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPQV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0dQSU9BU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9CX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBSQ0NfQzJBSEIyU01FTlJfR1BJT0JTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0NfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFJDQ19DMkFIQjJTTUVOUl9HUElPQ1NNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJHUElPRF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0dQSU9EU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkdQSU9FX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBSQ0NfQzJBSEIyU01FTlJfR1BJT0VTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyR1BJT0hfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFJDQ19DMkFIQjJTTUVOUl9HUElPSFNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRENfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUkNDX0MyQUhCMlNNRU5SX0FEQ1NNRU4pICAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBSQ0NfQzJBSEIyU01FTlJfQUVTMVNNRU4pID09IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQUhCM19DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQUhCMyBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1FVQURTUElfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9RVUFEU1BJU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19QS0FfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfUEtBU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19BRVMyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfQUVTMlNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfUk5HX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1JOR1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1JBTTJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1NSQU0yU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19GTEFTSF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfRkxBU0hTTUVOKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfUVVBRFNQSV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgKFJFQURfQklUKFJDQy0+QUhCM1NNRU5SLCBSQ0NfQUhCM1NNRU5SX1FVQURTUElTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1BLQV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9QS0FTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0FFUzJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9BRVMyU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfUk5HU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUkFNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5BSEIzU01FTlIsIFJDQ19BSEIzU01FTlJfU1JBTTJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0ZMQVNIX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgIChSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUkNDX0FIQjNTTUVOUl9GTEFTSFNNRU4pID09IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlBLQV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCM1NNRU5SLCBSQ0NfQzJBSEIzU01FTlJfUEtBU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkFFUzJfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCM1NNRU5SLCBSQ0NfQzJBSEIzU01FTlJfQUVTMlNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJSTkdfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUkNDX0MyQUhCM1NNRU5SX1JOR1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUkFNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUkNDX0MyQUhCM1NNRU5SX1NSQU0yU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkZMQVNIX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgIChSRUFEX0JJVChSQ0MtPkMyQUhCM1NNRU5SLCBSQ0NfQzJBSEIzU01FTlJfRkxBU0hTTUVOKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfQzJQS0FfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUkNDX0MyQUhCM1NNRU5SX1BLQVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJBRVMyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUkNDX0MyQUhCM1NNRU5SX0FFUzJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyUk5HX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgKFJFQURfQklUKFJDQy0+QzJBSEIzU01FTlIsIFJDQ19DMkFIQjNTTUVOUl9STkdTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1JBTTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgKFJFQURfQklUKFJDQy0+QzJBSEIzU01FTlIsIFJDQ19DMkFIQjNTTUVOUl9TUkFNMlNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJGTEFTSF9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAoUkVBRF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUkNDX0MyQUhCM1NNRU5SX0ZMQVNIU01FTikgPT0gUkVTRVQpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjFfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjEgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0yX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1RJTTJTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0xDRF9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfTENEU01FTikgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfUlRDQVBCX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9SVENBUEJTTUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1dXREdTTUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkyX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1NQSTJTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9JMkMzU01FTikgIT0gUkVTRVQpCisjaWYgZGVmaW5lZChDUlMpCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0NSU1NNRU4pICAhPSBSRVNFVCkKKyNlbmRpZiAvKiBDUlMgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1VTQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfVVNCU01FTikgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9MUFRJTTFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVUFSVDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBVQVJUMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIyLCBSQ0NfQVBCMVNNRU5SMl9MUFRJTTJTTUVOKSAhPSBSRVNFVCkKKworI2RlZmluZSBfX0hBTF9SQ0NfVElNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9USU0yU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19MQ0RfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0xDRFNNRU4pICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1JUQ0FQQl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfUlRDQVBCU01FTikgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9XV0RHU01FTikgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9TUEkyU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19JMkMxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX0kyQzFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0kyQzNfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfSTJDM1NNRU4pID09IFJFU0VUKQorI2lmIGRlZmluZWQoQ1JTKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIxU01FTlIxLCBSQ0NfQVBCMVNNRU5SMV9DUlNTTUVOKSAgPT0gUkVTRVQpCisjZW5kaWYgLyogQ1JTICovCisjZGVmaW5lIF9fSEFMX1JDQ19VU0JfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFJDQ19BUEIxU01FTlIxX1VTQlNNRU4pICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMSwgUkNDX0FQQjFTTUVOUjFfTFBUSU0xU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFJDQ19BUEIxU01FTlIyX0xQVUFSVDFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMl9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUkNDX0FQQjFTTUVOUjJfTFBUSU0yU01FTikgPT0gUkVTRVQpCisKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfVElNMlNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMQ0RfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9MQ0RTTUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlJUQ0FQQl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX1JUQ0FQQlNNRU4pICAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyU1BJMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfU1BJMlNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9JMkMxU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkkyQzNfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX0kyQzNTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyQ1JTX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfQ1JTU01FTikgICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJVU0JfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9VU0JTTUVOKSAgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX0xQVElNMVNNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFVBUlQxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMiwgUkNDX0MyQVBCMVNNRU5SMl9MUFVBUlQxU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkxQVElNMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIyLCBSQ0NfQzJBUEIxU01FTlIyX0xQVElNMlNNRU4pICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX1RJTTJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyTENEX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfTENEU01FTikgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJSVENBUEJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9SVENBUEJTTUVOKSAgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX1NQSTJTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MySTJDMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfSTJDMVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJJMkMzX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9JMkMzU01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMkNSU19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIxLCBSQ0NfQzJBUEIxU01FTlIxX0NSU1NNRU4pICA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNCX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFJDQ19DMkFQQjFTTUVOUjFfVVNCU01FTikgID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFRJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUkNDX0MyQVBCMVNNRU5SMV9MUFRJTTFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyTFBVQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjFTTUVOUjIsIFJDQ19DMkFQQjFTTUVOUjJfTFBVQVJUMVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJMUFRJTTJfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMiwgUkNDX0MyQVBCMVNNRU5SMl9MUFRJTTJTTUVOKSA9PSBSRVNFVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0FQQjJfQ2xvY2tfU2xlZXBfRW5hYmxlX0Rpc2FibGVfU3RhdHVzIEFQQjIgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGVkIG9yIERpc2FibGVkIFN0YXR1cworICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBnYXRpbmcgaW4gU0xFRVAgbW9kZSBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyIHJlZHVjZQorICAqICAgICAgICAgcG93ZXIgY29uc3VtcHRpb24uCisgICogQG5vdGUgICBBZnRlciB3YWtldXAgZnJvbSBTTEVFUCBtb2RlLCB0aGUgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIGFnYWluLgorICAqIEBub3RlICAgQnkgZGVmYXVsdCwgYWxsIHBlcmlwaGVyYWwgY2xvY2tzIGFyZSBlbmFibGVkIGR1cmluZyBTTEVFUCBtb2RlLgorICAqIEB7CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TUEkxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9TUEkxU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19VU0FSVDFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE2U01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xN19JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xN1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU0FJMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU0FJMVNNRU4pICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19USU0xX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfVElNMVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfU1BJMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1NQSTFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1VTQVJUMV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9VU0FSVDFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX1RJTTE2X0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkFQQjJTTUVOUiwgUkNDX0FQQjJTTUVOUl9USU0xNlNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfVElNMTdfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBSQ0NfQVBCMlNNRU5SX1RJTTE3U01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5BUEIyU01FTlIsIFJDQ19BUEIyU01FTlJfU0FJMVNNRU4pID09IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9USU0xU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNQSTFfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9TUEkxU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlVTQVJUMV9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9VU0FSVDFTTUVOKSAhPSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMTZfSVNfQ0xLX1NMRUVQX0VOQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjJTTUVOUiwgUkNDX0MyQVBCMlNNRU5SX1RJTTE2U01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTE3X0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9USU0xN1NNRU4pICE9IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTQUkxX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMlNNRU5SLCBSQ0NfQzJBUEIyU01FTlJfU0FJMVNNRU4pICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMlRJTTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMlNNRU5SLCBSQ0NfQzJBUEIyU01FTlJfVElNMVNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJTUEkxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjJTTUVOUiwgUkNDX0MyQVBCMlNNRU5SX1NQSTFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVVNBUlQxX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9VU0FSVDFTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyVElNMTZfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFJDQ19DMkFQQjJTTUVOUl9USU0xNlNNRU4pID09IFJFU0VUKQorI2RlZmluZSBfX0hBTF9SQ0NfQzJUSU0xN19JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjJTTUVOUiwgUkNDX0MyQVBCMlNNRU5SX1RJTTE3U01FTikgPT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMlNBSTFfSVNfQ0xLX1NMRUVQX0RJU0FCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCMlNNRU5SLCBSQ0NfQzJBUEIyU01FTlJfU0FJMVNNRU4pID09IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQzJBUEIzX0Nsb2NrX1NsZWVwX0VuYWJsZV9EaXNhYmxlIEFQQjMgUGVyaXBoZXJhbCBDbG9jayBTbGVlcCBFbmFibGUgRGlzYWJsZQorICAqIEBicmllZiAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQQjMgcGVyaXBoZXJhbCBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAbm90ZSAgIFBlcmlwaGVyYWwgY2xvY2sgZ2F0aW5nIGluIFNMRUVQIG1vZGUgY2FuIGJlIHVzZWQgdG8gZnVydGhlciByZWR1Y2UKKyAgKiAgICAgICAgIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqIEBub3RlICAgQWZ0ZXIgd2FrZXVwIGZyb20gU0xFRVAgbW9kZSwgdGhlIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBhZ2Fpbi4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIGFsbCBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZW5hYmxlZCBkdXJpbmcgU0xFRVAgbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQzJCTEVfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfQkxFKQorI2RlZmluZSBfX0hBTF9SQ0NfQzI4MDJfQ0xLX1NMRUVQX0VOQUJMRSgpICAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9FbmFibGVDbG9ja1NsZWVwKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfODAyKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkJMRV9DTEtfU0xFRVBfRElTQUJMRSgpICAgICAgICAgTExfQzJfQVBCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfQkxFKQorI2RlZmluZSBfX0hBTF9SQ0NfQzI4MDJfQ0xLX1NMRUVQX0RJU0FCTEUoKSAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcChMTF9DMl9BUEIzX0dSUDFfUEVSSVBIXzgwMikKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0MyQVBCM19DbG9ja19TbGVlcF9FbmFibGVfRGlzYWJsZV9TdGF0dXMgQVBCMyBQZXJpcGhlcmFsIENsb2NrIFNsZWVwIEVuYWJsZWQgb3IgRGlzYWJsZWQgU3RhdHVzCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBBUEIzIHBlcmlwaGVyYWwgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUgaXMgZW5hYmxlZCBvciBub3QuCisgICogQG5vdGUgICBQZXJpcGhlcmFsIGNsb2NrIGdhdGluZyBpbiBTTEVFUCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIgcmVkdWNlCisgICogICAgICAgICBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiBAbm90ZSAgIEFmdGVyIHdha2V1cCBmcm9tIFNMRUVQIG1vZGUsIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgYWdhaW4uCisgICogQG5vdGUgICBCeSBkZWZhdWx0LCBhbGwgcGVyaXBoZXJhbCBjbG9ja3MgYXJlIGVuYWJsZWQgZHVyaW5nIFNMRUVQIG1vZGUuCisgICogQHsKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0MyQkxFX0lTX0NMS19TTEVFUF9FTkFCTEVEKCkgICAgICAgICAgIChSRUFEX0JJVChSQ0MtPkMyQVBCM1NNRU5SLCBSQ0NfQzJBUEIzU01FTlJfQkxFU01FTikgIT0gUkVTRVQpCisjZGVmaW5lIF9fSEFMX1JDQ19DMjgwMl9JU19DTEtfU0xFRVBfRU5BQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjNTTUVOUiwgUkNDX0MyQVBCM1NNRU5SXzgwMlNNRU4pICE9IFJFU0VUKQorCisjZGVmaW5lIF9fSEFMX1JDQ19DMkJMRV9JU19DTEtfU0xFRVBfRElTQUJMRUQoKSAgICAgICAgICAgKFJFQURfQklUKFJDQy0+QzJBUEIzU01FTlIsIFJDQ19DMkFQQjNTTUVOUl9CTEVTTUVOKSA9PSBSRVNFVCkKKyNkZWZpbmUgX19IQUxfUkNDX0MyODAyX0lTX0NMS19TTEVFUF9ESVNBQkxFRCgpICAgICAgICAgICAoUkVBRF9CSVQoUkNDLT5DMkFQQjNTTUVOUiwgUkNDX0MyQVBCM1NNRU5SXzgwMlNNRU4pID09IFJFU0VUKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfQmFja3VwX0RvbWFpbl9SZXNldCBSQ0MgQmFja3VwIERvbWFpbiBSZXNldAorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBmb3JjZSBvciByZWxlYXNlIHRoZSBCYWNrdXAgZG9tYWluIHJlc2V0LgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIFJUQyBwZXJpcGhlcmFsIChpbmNsdWRpbmcgdGhlIGJhY2t1cCByZWdpc3RlcnMpCisgICogICAgICAgICBhbmQgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGluIFJDQ19DU1IgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGUgQktQU1JBTSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyByZXNldC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX0ZPUkNFKCkgICBMTF9SQ0NfRm9yY2VCYWNrdXBEb21haW5SZXNldCgpCisjZGVmaW5lIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9SRUxFQVNFKCkgTExfUkNDX1JlbGVhc2VCYWNrdXBEb21haW5SZXNldCgpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX1JUQ19DbG9ja19Db25maWd1cmF0aW9uIFJDQyBSVEMgQ2xvY2sgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgUlRDIGNsb2NrLgorICAqIEBub3RlICAgQXMgdGhlIFJUQyBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bworICAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcKKyAgKiAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uIGJlZm9yZSB0byBjb25maWd1cmUgdGhlIFJUQworICAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuCisgICogQG5vdGUgICBUaGVzZSBtYWNyb3MgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBSVEMgY2xvY2sgc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSAgICAgICAgIExMX1JDQ19FbmFibGVSVEMoKQorI2RlZmluZSBfX0hBTF9SQ0NfUlRDX0RJU0FCTEUoKSAgICAgICAgTExfUkNDX0Rpc2FibGVSVEMoKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkuCisgICogQG5vdGUgICBUaGUgSFNJIGlzIHN0b3BwZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QLCBTVEFOREJZIG9yIFNIVVRET1dOIG1vZGVzLgorICAqICAgICAgICAgSXQgaXMgZW5hYmxlZCBieSBoYXJkd2FyZSBhdG8gZm9yY2UgdGhlIEhTSSBvc2NpbGxhdG9yIE9OIHdoZW4gU1RPUFdVQ0s9MQorICAqICAgICAgICAgb3IgSFNJQVNGUyA9IDEgd2hlbiBsZWF2aW5nIFN0b3AgbW9kZXMsIG9yIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiB0aGUgSFNFCisgICogICAgICAgICBjcnlzdGFsIG9zY2lsbGF0b3IgYW5kIFNlY3VyaXR5IFN5c3RlbSBDU1MgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBIU0ksIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0lSRFkKKyAgKiAgICAgICAgIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBIU0kgY2xvY2sgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcworICAqICAgICAgICAgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCkgIExMX1JDQ19IU0lfRW5hYmxlKCkKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGRpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4KKyAgKiBAbm90ZSAgIEhTSSBjYW4gbm90IGJlIHN0b3BwZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLiBJbiB0aGlzIGNhc2UsCisgICogICAgICAgICB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2Ugb2YgdGhlIHN5c3RlbSBjbG9jayB0aGVuIHN0b3AgdGhlIEhTSS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIEhTSSBpcyBzdG9wcGVkLCBIU0lSRFkgZmxhZyBnb2VzIGxvdyBhZnRlciA2IEhTSSBvc2NpbGxhdG9yCisgICogICAgICAgICBjbG9jayBjeWNsZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfRElTQUJMRSgpIExMX1JDQ19IU0lfRGlzYWJsZSgpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGFkanVzdCB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLgorICAqIEBub3RlICAgVGhlIGNhbGlicmF0aW9uIGlzIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIHZhcmlhdGlvbnMgaW4gdm9sdGFnZQorICAqICAgICAgICAgYW5kIHRlbXBlcmF0dXJlIHRoYXQgaW5mbHVlbmNlIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGludGVybmFsIEhTSSBSQy4KKyAgKiBAcGFyYW0gIF9fSFNJQ0FMSUJSQVRJT05WQUxVRV9fIHNwZWNpZmllcyB0aGUgY2FsaWJyYXRpb24gdHJpbW1pbmcgdmFsdWUKKyAgKiAgICAgICAgIChkZWZhdWx0IGlzIFJDQ19IU0lDQUxJQlJBVElPTl9ERUZBVUxUKS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fZGF0YT0wIGFuZCBNYXhfRGF0YT0xMjcuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoX19IU0lDQUxJQlJBVElPTlZBTFVFX18pICBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcoX19IU0lDQUxJQlJBVElPTlZBTFVFX18pCisKKy8qKgorICAqIEBicmllZiAgICBNYWNyb3MgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHdha2V1cCB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpCisgICogICAgICAgICAgIGluIHBhcmFsbGVsIHRvIHRoZSBJbnRlcm5hbCBNdWx0aSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIHVzZWQgYXQgc3lzdGVtIHdha2V1cC4KKyAgKiBAbm90ZSAgICAgVGhlIGVuYWJsZSBvZiB0aGlzIGZ1bmN0aW9uIGhhcyBub3QgZWZmZWN0IG9uIHRoZSBIU0lPTiBiaXQuCisgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lBVVRPTUFUSUNfU1RBUlRfRU5BQkxFKCkgICBMTF9SQ0NfSFNJX0VuYWJsZUF1dG9Gcm9tU3RvcCgpCisjZGVmaW5lIF9fSEFMX1JDQ19IU0lBVVRPTUFUSUNfU1RBUlRfRElTQUJMRSgpICBMTF9SQ0NfSFNJX0Rpc2FibGVBdXRvRnJvbVN0b3AoKQorCisvKioKKyAgKiBAYnJpZWYgICAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBmb3JjZSBvZiB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpCisgICogICAgICAgICAgIGluIFNUT1AgbW9kZSB0byBiZSBxdWlja2x5IGF2YWlsYWJsZSBhcyBrZXJuZWwgY2xvY2sgZm9yIFVTQVJUcyBhbmQgSTJDcy4KKyAgKiBAbm90ZSAgICAgS2VlcGluZyB0aGUgSFNJIE9OIGluIFNUT1AgbW9kZSBhbGxvd3MgdG8gYXZvaWQgc2xvd2luZyBkb3duIHRoZSBjb21tdW5pY2F0aW9uCisgICogICAgICAgICAgIHNwZWVkIGJlY2F1c2Ugb2YgdGhlIEhTSSBzdGFydHVwIHRpbWUuCisgICogQG5vdGUgICAgIFRoZSBlbmFibGUgb2YgdGhpcyBmdW5jdGlvbiBoYXMgbm90IGVmZmVjdCBvbiB0aGUgSFNJT04gYml0LgorICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNJU1RPUF9FTkFCTEUoKSAgICAgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlKCkKKyNkZWZpbmUgX19IQUxfUkNDX0hTSVNUT1BfRElTQUJMRSgpICAgIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUoKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKS4KKyAgKiBAbm90ZSAgIFRoZSBNU0kgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogICAgICAgICBJdCBpcyB1c2VkIChlbmFibGVkIGJ5IGhhcmR3YXJlKSBhcyBzeXN0ZW0gY2xvY2sgc291cmNlIGFmdGVyCisgICogICAgICAgICBzdGFydHVwIGZyb20gUmVzZXQsIHdha2V1cCBmcm9tIFNUT1AgYW5kIFNUQU5EQlkgbW9kZSwgb3IgaW4gY2FzZQorICAqICAgICAgICAgb2YgZmFpbHVyZSBvZiB0aGUgSFNFIHVzZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBhcyBzeXN0ZW0gY2xvY2sKKyAgKiAgICAgICAgIChpZiB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIENTUyBpcyBlbmFibGVkKS4KKyAgKiBAbm90ZSAgIE1TSSBjYW4gbm90IGJlIHN0b3BwZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byBzZWxlY3QgYW5vdGhlciBzb3VyY2Ugb2YgdGhlIHN5c3RlbQorICAqICAgICAgICAgY2xvY2sgdGhlbiBzdG9wIHRoZSBNU0kuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTVNJLCB0aGUgYXBwbGljYXRpb24gc29mdHdhcmUgc2hvdWxkIHdhaXQgb24KKyAgKiAgICAgICAgIE1TSVJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgTVNJIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuCisgICogICAgICAgICBiZSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQG5vdGUgICBXaGVuIHRoZSBNU0kgaXMgc3RvcHBlZCwgTVNJUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIgNiBNU0kgb3NjaWxsYXRvcgorICAqICAgICAgICAgY2xvY2sgY3ljbGVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTVNJX0VOQUJMRSgpICBMTF9SQ0NfTVNJX0VuYWJsZSgpCisjZGVmaW5lIF9fSEFMX1JDQ19NU0lfRElTQUJMRSgpIExMX1JDQ19NU0lfRGlzYWJsZSgpCisKKy8qKiBAYnJpZWYgIE1hY3JvIEFkanVzdHMgdGhlIEludGVybmFsIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2FsaWJyYXRpb24gdmFsdWUuCisgICogQG5vdGUgICBUaGUgY2FsaWJyYXRpb24gaXMgdXNlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgdmFyaWF0aW9ucyBpbiB2b2x0YWdlCisgICogICAgICAgICBhbmQgdGVtcGVyYXR1cmUgdGhhdCBpbmZsdWVuY2UgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgaW50ZXJuYWwgTVNJIFJDLgorICAqICAgICAgICAgUmVmZXIgdG8gdGhlIEFwcGxpY2F0aW9uIE5vdGUgQU4zMzAwIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvCisgICogICAgICAgICBjYWxpYnJhdGUgdGhlIE1TSS4KKyAgKiBAcGFyYW0gIF9fTVNJQ0FMSUJSQVRJT05WQUxVRV9fICBzcGVjaWZpZXMgdGhlIGNhbGlicmF0aW9uIHRyaW1taW5nIHZhbHVlCisgICogICAgICAgICAoZGVmYXVsdCBpcyBAcmVmIFJDQ19NU0lDQUxJQlJBVElPTl9ERUZBVUxUKS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19NU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoX19NU0lDQUxJQlJBVElPTlZBTFVFX18pICBMTF9SQ0NfTVNJX1NldENhbGliVHJpbW1pbmcoX19NU0lDQUxJQlJBVElPTlZBTFVFX18pCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gY29uZmlndXJlcyB0aGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSBpbiBydW4gbW9kZQorICAqIEBub3RlICAgICBBZnRlciByZXN0YXJ0IGZyb20gUmVzZXQgLCB0aGUgTVNJIGNsb2NrIGlzIGFyb3VuZCA0IE1Iei4KKyAgKiAgICAgICAgICAgQWZ0ZXIgc3RvcCB0aGUgc3RhcnR1cCBjbG9jayBjYW4gYmUgTVNJIChhdCBhbnkgb2YgaXRzIHBvc3NpYmxlCisgICogICAgICAgICAgIGZyZXF1ZW5jaWVzLCB0aGUgb25lIHRoYXQgd2FzIHVzZWQgYmVmb3JlIGVudGVyaW5nIHN0b3AgbW9kZSkgb3IgSFNJLgorICAqICAgICAgICAgIEFmdGVyIFN0YW5kYnkgaXRzIGZyZXF1ZW5jeSBjYW4gYmUgc2VsZWN0ZWQgYmV0d2VlbiA0IHBvc3NpYmxlIHZhbHVlcworICAqICAgICAgICAgICgxLCAyLCA0IG9yIDggTUh6KS4KKyAgKiBAbm90ZSAgICAgTVNJUkFOR0UgY2FuIGJlIG1vZGlmaWVkIHdoZW4gTVNJIGlzIE9GRiAoTVNJT049MCkgb3Igd2hlbiBNU0kgaXMgcmVhZHkKKyAgKiAgICAgICAgICAoTVNJUkRZPTEpLgorICAqIEBub3RlICAgIFRoZSBNU0kgY2xvY2sgcmFuZ2UgYWZ0ZXIgcmVzZXQgY2FuIGJlIG1vZGlmaWVkIG9uIHRoZSBmbHkuCisgICogQHBhcmFtICBfX01TSVJBTkdFVkFMVUVfXyAgc3BlY2lmaWVzIHRoZSBNU0kgY2xvY2sgcmFuZ2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMCAgTVNJIGNsb2NrIGlzIGFyb3VuZCAxMDAgS0h6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzEgIE1TSSBjbG9jayBpcyBhcm91bmQgMjAwIEtIegorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8yICBNU0kgY2xvY2sgaXMgYXJvdW5kIDQwMCBLSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMyAgTVNJIGNsb2NrIGlzIGFyb3VuZCA4MDAgS0h6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzQgIE1TSSBjbG9jayBpcyBhcm91bmQgMSBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNSAgTVNJIGNsb2NrIGlzIGFyb3VuZCAyTUh6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzYgIE1TSSBjbG9jayBpcyBhcm91bmQgNE1IeiAoZGVmYXVsdCBhZnRlciBSZXNldCkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNyAgTVNJIGNsb2NrIGlzIGFyb3VuZCA4ICBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfOCAgTVNJIGNsb2NrIGlzIGFyb3VuZCAxNiBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfOSAgTVNJIGNsb2NrIGlzIGFyb3VuZCAyNCBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMTAgTVNJIGNsb2NrIGlzIGFyb3VuZCAzMiBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMTEgTVNJIGNsb2NrIGlzIGFyb3VuZCA0OCBNSHoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX01TSV9SQU5HRV9DT05GSUcoX19NU0lSQU5HRVZBTFVFX18pICBMTF9SQ0NfTVNJX1NldFJhbmdlKF9fTVNJUkFOR0VWQUxVRV9fKQorCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgSW50ZXJuYWwgTXVsdGkgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSBpbiBydW4gbW9kZQorICAqIEByZXR2YWwgTVNJIGNsb2NrIHJhbmdlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzAgICBNU0kgY2xvY2sgaXMgYXJvdW5kIDEwMCBLSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMSAgIE1TSSBjbG9jayBpcyBhcm91bmQgMjAwIEtIegorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8yICAgTVNJIGNsb2NrIGlzIGFyb3VuZCA0MDAgS0h6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzMgICBNU0kgY2xvY2sgaXMgYXJvdW5kIDgwMCBLSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNCAgIE1TSSBjbG9jayBpcyBhcm91bmQgMSBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNSAgIE1TSSBjbG9jayBpcyBhcm91bmQgMiBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNiAgIE1TSSBjbG9jayBpcyBhcm91bmQgNCBNSHogICAoZGVmYXVsdCBhZnRlciBSZXNldCkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfNyAgIE1TSSBjbG9jayBpcyBhcm91bmQgOCBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfOCAgIE1TSSBjbG9jayBpcyBhcm91bmQgMTYgTUh6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01TSVJBTkdFXzkgICBNU0kgY2xvY2sgaXMgYXJvdW5kIDI0IE1IegorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NU0lSQU5HRV8xMCAgTVNJIGNsb2NrIGlzIGFyb3VuZCAzMiBNSHoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTVNJUkFOR0VfMTEgIE1TSSBjbG9jayBpcyBhcm91bmQgNDggTUh6CisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfTVNJX1JBTkdFKCkgICAgTExfUkNDX01TSV9HZXRSYW5nZSgpCisKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJMSkuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNJMSwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgICogICAgICAgICBMU0kxUkRZIGZsYWcgdG8gYmUgc2V0IGluZGljYXRpbmcgdGhhdCBMU0kxIGNsb2NrIGlzIHN0YWJsZSBhbmQgY2FuCisgICogICAgICAgICBiZSB1c2VkIHRvIGNsb2NrIHRoZSBJV0RHIGFuZC9vciB0aGUgUlRDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNJMV9FTkFCTEUoKSAgICAgICAgIExMX1JDQ19MU0kxX0VuYWJsZSgpCisjZGVmaW5lIF9fSEFMX1JDQ19MU0kxX0RJU0FCTEUoKSAgICAgICAgTExfUkNDX0xTSTFfRGlzYWJsZSgpCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSTIpLgorICAqIEBub3RlICAgQWZ0ZXIgZW5hYmxpbmcgdGhlIExTSTIsIHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbgorICAqICAgICAgICAgTFNJMlJEWSBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgTFNJMiBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCB0byBjbG9jayB0aGUgSVdERyBhbmQvb3IgdGhlIFJUQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTSTJfRU5BQkxFKCkgICAgICAgICBMTF9SQ0NfTFNJMl9FbmFibGUoKQorI2RlZmluZSBfX0hBTF9SQ0NfTFNJMl9ESVNBQkxFKCkgICAgICAgIExMX1JDQ19MU0kyX0Rpc2FibGUoKQorCisvKiogQGJyaWVmICBNYWNybyB0byBhZGp1c3QgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kyKSBjYWxpYnJhdGlvbiB2YWx1ZS4KKyAgKiBAbm90ZSAgIFRoZSBjYWxpYnJhdGlvbiBpcyB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSB2YXJpYXRpb25zIGluIHZvbHRhZ2UKKyAgKiAgICAgICAgIGFuZCB0ZW1wZXJhdHVyZSB0aGF0IGluZmx1ZW5jZSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBpbnRlcm5hbCBIU0kgUkMuCisgICogQHBhcmFtICBfX0xTSTJUUklNTUlOR1ZBTFVFX18gc3BlY2lmaWVzIHRoZSBjYWxpYnJhdGlvbiB0cmltbWluZyB2YWx1ZQorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9kYXRhPTAgYW5kIE1heF9EYXRhPTE1LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNJMl9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChfX0xTSTJUUklNTUlOR1ZBTFVFX18pICBMTF9SQ0NfTFNJMl9TZXRUcmltbWluZyhfX0xTSTJUUklNTUlOR1ZBTFVFX18pCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTRSkuCisgICogQG5vdGUgICBUcmFuc2l0aW9uIEhTRSBCeXBhc3MgdG8gSFNFIE9uIGFuZCBIU0UgT24gdG8gSFNFIEJ5cGFzcyBhcmUgbm90CisgICogICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtYWNyby4gVXNlciBzaG91bGQgcmVxdWVzdCBhIHRyYW5zaXRpb24gdG8gSFNFIE9mZgorICAqICAgICAgICAgZmlyc3QgYW5kIHRoZW4gSFNFIE9uIG9yIEhTRSBCeXBhc3MuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgSFNFIChSQ0NfSFNFX09OIG9yIFJDQ19IU0VfQnlwYXNzKSwgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBIU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IEhTRSBjbG9jaworICAqICAgICAgICAgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUExMIGFuZC9vciBzeXN0ZW0gY2xvY2suCisgICogQG5vdGUgICBIU0Ugc3RhdGUgY2FuIG5vdCBiZSBjaGFuZ2VkIGlmIGl0IGlzIHVzZWQgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUKKyAgKiAgICAgICAgIFBMTCBhcyBzeXN0ZW0gY2xvY2suIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gc2VsZWN0IGFub3RoZXIgc291cmNlCisgICogICAgICAgICBvZiB0aGUgc3lzdGVtIGNsb2NrIHRoZW4gY2hhbmdlIHRoZSBIU0Ugc3RhdGUgKGV4LiBkaXNhYmxlIGl0KS4KKyAgKiBAbm90ZSAgIFRoZSBIU0UgaXMgc3RvcHBlZCBieSBoYXJkd2FyZSB3aGVuIGVudGVyaW5nIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHJlc2V0IHRoZSBDU1NPTiBiaXQsIHNvIGlmIHRoZSBjbG9jayBzZWN1cml0eSBzeXN0ZW0oQ1NTKQorICAqICAgICAgICAgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCB5b3UgaGF2ZSB0byBlbmFibGUgaXQgYWdhaW4gYWZ0ZXIgY2FsbGluZyB0aGlzCisgICogICAgICAgICBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fU1RBVEVfXyAgc3BlY2lmaWVzIHRoZSBuZXcgc3RhdGUgb2YgdGhlIEhTRS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0hTRV9PRkYgIFR1cm4gT0ZGIHRoZSBIU0Ugb3NjaWxsYXRvciwgSFNFUkRZIGZsYWcgZ29lcyBsb3cgYWZ0ZXIKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgSFNFIG9zY2lsbGF0b3IgY2xvY2sgY3ljbGVzLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfT04gIFR1cm4gT04gdGhlIEhTRSBvc2NpbGxhdG9yLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQllQQVNTICBIU0Ugb3NjaWxsYXRvciBieXBhc3NlZCB3aXRoIGV4dGVybmFsIGNsb2NrLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhfX1NUQVRFX18pICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaWYoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9PTikgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoKF9fU1RBVEVfXykgPT0gUkNDX0hTRV9CWVBBU1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcygpOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19IU0VfRGlzYWJsZSgpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBIU0UgUHJlc2NhbGVyCisgICogQG5vdGUgICBIU0UgZGl2MiBjb3VsZCBiZSB1c2VkIGFzIFN5c2NsayBvciBQTEwgZW50cnkgaW4gUmFuZ2UyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VfRElWMl9FTkFCTEUoKSAgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlRGl2MigpCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VfRElWMl9ESVNBQkxFKCkgICAgICAgIExMX1JDQ19IU0VfRGlzYWJsZURpdjIoKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgRXh0ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTRSkuCisgICogQG5vdGUgICBUcmFuc2l0aW9ucyBMU0UgQnlwYXNzIHRvIExTRSBPbiBhbmQgTFNFIE9uIHRvIExTRSBCeXBhc3MgYXJlIG5vdAorICAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWFjcm8uIFVzZXIgc2hvdWxkIHJlcXVlc3QgYSB0cmFuc2l0aW9uIHRvIExTRSBPZmYKKyAgKiAgICAgICAgIGZpcnN0IGFuZCB0aGVuIExTRSBPbiBvciBMU0UgQnlwYXNzLgorICAqIEBub3RlICAgQXMgdGhlIExTRSBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bworICAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcKKyAgKiAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uIGJlZm9yZSB0byBjb25maWd1cmUgdGhlIExTRQorICAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuCisgICogQG5vdGUgICBBZnRlciBlbmFibGluZyB0aGUgTFNFIChSQ0NfTFNFX09OIG9yIFJDQ19MU0VfQllQQVNTKSwgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICBzb2Z0d2FyZSBzaG91bGQgd2FpdCBvbiBMU0VSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IExTRSBjbG9jaworICAqICAgICAgICAgaXMgc3RhYmxlIGFuZCBjYW4gYmUgdXNlZCB0byBjbG9jayB0aGUgUlRDLgorICAqIEBwYXJhbSAgX19TVEFURV9fICBzcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgTFNFLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFX09GRiAgVHVybiBPRkYgdGhlIExTRSBvc2NpbGxhdG9yLCBMU0VSRFkgZmxhZyBnb2VzIGxvdyBhZnRlcgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiBMU0Ugb3NjaWxsYXRvciBjbG9jayBjeWNsZXMuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRV9PTiAgVHVybiBPTiB0aGUgTFNFIG9zY2lsbGF0b3IuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTRV9CWVBBU1MgIExTRSBvc2NpbGxhdG9yIGJ5cGFzc2VkIHdpdGggZXh0ZXJuYWwgY2xvY2suCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VfQ09ORklHKF9fU1RBVEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaWYoKF9fU1RBVEVfXykgPT0gUkNDX0xTRV9PTikgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZSgpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigoX19TVEFURV9fKSA9PSBSQ0NfTFNFX0JZUEFTUykgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZUJ5cGFzcygpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFX0VuYWJsZSgpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGUoKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGVCeXBhc3MoKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIDQ4TUh6IG9zY2lsbGF0b3IgKEhTSTQ4KS4KKyAgKiBAbm90ZSAgIFRoZSBIU0k0OCBpcyBzdG9wcGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBIU0k0OCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uIEhTSTQ4UkRZCisgICogICAgICAgICBmbGFnIHRvIGJlIHNldCBpbmRpY2F0aW5nIHRoYXQgSFNJNDggY2xvY2sgaXMgc3RhYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0hTSTQ4X0VOQUJMRSgpICBMTF9SQ0NfSFNJNDhfRW5hYmxlKCkKKyNkZWZpbmUgX19IQUxfUkNDX0hTSTQ4X0RJU0FCTEUoKSBMTF9SQ0NfSFNJNDhfRGlzYWJsZSgpCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBjb25maWd1cmUgSFNFIHNlbnNlIGFtcGxpZmllciB0aHJlc2hvbGQuCisgICogQG5vdGUgICB0byBjb25maWd1cmUgSFNFIHNlbnNlIGFtcGxpZmllciwgZmlyc3QgZGlzYWJsZSBIU0UKKyAgKiAgICAgICAgIHVzaW5nIEByZWYgX19IQUxfUkNDX0hTRV9DT05GSUcoUkNDX0hTRV9PRkYpIG1hY3JvLgorICAqCisgICogQHBhcmFtICBfX0hTRV9BTVBUSFJFU19fICBzcGVjaWZpZXMgdGhlIEhTRSBzZW5zZSBhbXBsaWZpZXIgdGhyZXNob2xkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSFNFQU1QVEhSRVNIT0xEXzFfMiAgSFNFIGJpYXMgY3VycmVudCBmYWN0b3IgMS8yLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VBTVBUSFJFU0hPTERfM180ICBIU0UgYmlhcyBjdXJyZW50IGZhY3RvciAzLzQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VfQU1QQ09ORklHKF9fSFNFX0FNUFRIUkVTX18pICBMTF9SQ0NfSFNFX1NldFNlbnNlQW1wbGlmaWVyKF9fSFNFX0FNUFRIUkVTX18pCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBjb25maWd1cmUgSFNFIGN1cnJlbnQgY29udHJvbC4KKyAgKiBAbm90ZSAgIHRvIGNvbmZpZ3VyZSBIU0UgY3VycmVudCBjb250cm9sLCBmaXJzdCBkaXNhYmxlIEhTRQorICAqICAgICAgICAgdXNpbmcgQHJlZiBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhSQ0NfSFNFX09GRikgbWFjcm8uCisgICoKKyAgKiBAcGFyYW0gIF9fSFNFX0NVUlJFTlRNQVhfXyAgc3BlY2lmaWVzIHRoZSBIU0UgY3VycmVudCBtYXggbGltaXQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF8wICBIU0UgY3VycmVudCBtYXggbGltaXQgMC4xOCBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF8xICBIU0UgY3VycmVudCBtYXggbGltaXQgMC41NyBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF8yICBIU0UgY3VycmVudCBtYXggbGltaXQgMC43OCBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF8zICBIU0UgY3VycmVudCBtYXggbGltaXQgMS4xMyBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF80ICBIU0UgY3VycmVudCBtYXggbGltaXQgMC42MSBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF81ICBIU0UgY3VycmVudCBtYXggbGltaXQgMS42NSBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF82ICBIU0UgY3VycmVudCBtYXggbGltaXQgMi4xMiBtQS9WLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19IU0VfQ1VSUkVOVE1BWF83ICBIU0UgY3VycmVudCBtYXggbGltaXQgMi44NCBtQS9WLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSFNFX0NVUlJFTlRDT05GSUcoX19IU0VfQ1VSUkVOVE1BWF9fKSAgTExfUkNDX0hTRV9TZXRDdXJyZW50Q29udHJvbChfX0hTRV9DVVJSRU5UTUFYX18pCisKKy8qKiBAYnJpZWYgIE1hY3JvcyB0byBjb25maWd1cmUgSFNFIGNhcGFjaXRvciB0dW5pbmcuCisgICogQG5vdGUgICB0byBjb25maWd1cmUgSFNFIGN1cnJlbnQgY29udHJvbCwgZmlyc3QgZGlzYWJsZSBIU0UKKyAgKiAgICAgICAgIHVzaW5nIF9fSEFMX1JDQ19IU0VfQ09ORklHKFJDQ19IU0VfT0ZGKSBtYWNyby4KKyAgKgorICAqIEBwYXJhbSAgX19IU0VfTE9BRF9DQVBBQ0lUQU5DRV9fICBzcGVjaWZpZXMgdGhlIEhTRSBjYXBhY2l0b3IgdmFsdWUuCisgICogICAgICAgICBUaGlzIFZhbHVlIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19IU0VfQ0FQQUNJVE9SVFVOSU5HKF9fSFNFX0xPQURfQ0FQQUNJVEFOQ0VfXykgIExMX1JDQ19IU0VfU2V0Q2FwYWNpdG9yVHVuaW5nKF9fSFNFX0xPQURfQ0FQQUNJVEFOQ0VfXykKKworCisvKiogQGJyaWVmICBNYWNyb3MgdG8gY29uZmlndXJlIHRoZSBSVEMgY2xvY2sgKFJUQ0NMSykuCisgICogQG5vdGUgICBBcyB0aGUgUlRDIGNsb2NrIGNvbmZpZ3VyYXRpb24gYml0cyBhcmUgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kIHdyaXRlCisgICogICAgICAgICBhY2Nlc3MgaXMgZGVuaWVkIHRvIHRoaXMgZG9tYWluIGFmdGVyIHJlc2V0LCB5b3UgaGF2ZSB0byBlbmFibGUgd3JpdGUKKyAgKiAgICAgICAgIGFjY2VzcyB1c2luZyB0aGUgUG93ZXIgQmFja3VwIEFjY2VzcyBtYWNybyBiZWZvcmUgdG8gY29uZmlndXJlCisgICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZSAodG8gYmUgZG9uZSBvbmNlIGFmdGVyIHJlc2V0KS4KKyAgKiBAbm90ZSAgIE9uY2UgdGhlIFJUQyBjbG9jayBpcyBjb25maWd1cmVkIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVubGVzcyB0aGUKKyAgKiAgICAgICAgIEJhY2t1cCBkb21haW4gaXMgcmVzZXQgdXNpbmcgQHJlZiBfX0hBTF9SQ0NfQkFDS1VQUkVTRVRfRk9SQ0UoKSBtYWNybywgb3IgYnkKKyAgKiAgICAgICAgIGEgUG93ZXIgT24gUmVzZXQgKFBPUikuCisgICoKKyAgKiBAcGFyYW0gIF9fUlRDX0NMS1NPVVJDRV9fICBzcGVjaWZpZXMgdGhlIFJUQyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOioKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgIG5vbmUgY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNJICBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZAorICAqCisgICogQG5vdGUgICBJZiB0aGUgTFNFIG9yIExTSSBpcyB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UsIHRoZSBSVEMgY29udGludWVzIHRvCisgICogICAgICAgICB3b3JrIGluIFNUT1AgYW5kIFNUQU5EQlkgbW9kZXMsIGFuZCBjYW4gYmUgdXNlZCBhcyB3YWtldXAgc291cmNlLgorICAqICAgICAgICAgSG93ZXZlciwgd2hlbiB0aGUgSFNFIGNsb2NrIGlzIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgdGhlIFJUQworICAqICAgICAgICAgY2Fubm90IGJlIHVzZWQgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSBmb3IgUlRDIGlzIDFNSHogKHdoZW4gdXNpbmcgSFNFIGFzCisgICogICAgICAgICBSVEMgY2xvY2sgc291cmNlKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JUQ19DT05GSUcoX19SVENfQ0xLU09VUkNFX18pICBMTF9SQ0NfU2V0UlRDQ2xvY2tTb3VyY2UoX19SVENfQ0xLU09VUkNFX18pCisKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBSVEMgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUlRDQ0xLU09VUkNFX05PTkUgIG5vbmUgY2xvY2sgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNFICBMU0Ugc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfTFNJICBMU0kgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrLgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjMyICBIU0UgY2xvY2sgZGl2aWRlZCBieSAzMiBzZWxlY3RlZAorICAqLworI2RlZmluZSAgX19IQUxfUkNDX0dFVF9SVENfU09VUkNFKCkgTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlKCkKKworLyoqIEBicmllZiAgTWFjcm9zIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBtYWluIFBMTC4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsaW5nIHRoZSBtYWluIFBMTCwgdGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIHNob3VsZCB3YWl0IG9uCisgICogICAgICAgICBQTExSRFkgZmxhZyB0byBiZSBzZXQgaW5kaWNhdGluZyB0aGF0IFBMTCBjbG9jayBpcyBzdGFibGUgYW5kIGNhbgorICAqICAgICAgICAgYmUgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqIEBub3RlICAgVGhlIG1haW4gUExMIGNhbiBub3QgYmUgZGlzYWJsZWQgaWYgaXQgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogQG5vdGUgICBUaGUgbWFpbiBQTEwgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMX0VOQUJMRSgpICAgICAgICAgTExfUkNDX1BMTF9FbmFibGUoKQorI2RlZmluZSBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKSAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlKCkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBQTEwgY2xvY2sgc291cmNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fUExMU09VUkNFX18gIHNwZWNpZmllcyB0aGUgUExMIGVudHJ5IGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX01TSSAgTVNJIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNFICBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiBAbm90ZSAgIFRoaXMgY2xvY2sgc291cmNlIGlzIGNvbW1vbiBmb3IgdGhlIG1haW4gUExMIGFuZCBhdWRpbyBQTEwgKFBMTCBhbmQgUExMU0FJMSkuCisgICogQHJldHZhbCBOb25lCisgICoKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9QTExTT1VSQ0VfQ09ORklHKF9fUExMU09VUkNFX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIChfX1BMTFNPVVJDRV9fKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBQTEwgbXVsdGlwbGljYXRpb24gZmFjdG9yLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fUExMTV9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jaworICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIFJDQ19QTExNX0Nsb2NrX0RpdmlkZXIuCisgICogQG5vdGUgICBZb3UgaGF2ZSB0byBzZXQgdGhlIFBMTE0gcGFyYW1ldGVyIGNvcnJlY3RseSB0byBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0CisgICogICAgICAgICBmcmVxdWVuY3kgcmFuZ2VzIGZyb20gNCB0byAxNiBNSHouIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNlbGVjdCBhIGZyZXF1ZW5jeQorICAqICAgICAgICAgb2YgMTYgTUh6IHRvIGxpbWl0IFBMTCBqaXR0ZXIuCisgICogQHJldHZhbCBOb25lCisgICoKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTF9QTExNX0NPTkZJRyhfX1BMTE1fXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTE0sIChfX1BMTE1fXykpCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBtYWluIFBMTCBjbG9jayBzb3VyY2UsIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBmYWN0b3JzLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBtYWluIFBMTCBpcyBkaXNhYmxlZC4KKyAgKgorICAqIEBwYXJhbSAgX19QTExTT1VSQ0VfXyAgc3BlY2lmaWVzIHRoZSBQTEwgZW50cnkgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9OT05FICBObyBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX01TSSAgTVNJIG9zY2lsbGF0b3IgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGNsb2NrIGVudHJ5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNPVVJDRV9IU0kgIEhTSSBvc2NpbGxhdG9yIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBjbG9jayBlbnRyeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTT1VSQ0VfSFNFICBIU0Ugb3NjaWxsYXRvciBjbG9jayBzZWxlY3RlZCBhcyBQTEwgY2xvY2sgZW50cnkKKyAgKiBAbm90ZSAgIFRoaXMgY2xvY2sgc291cmNlIGlzIGNvbW1vbiBmb3IgdGhlIG1haW4gUExMIGFuZCBhdWRpbyBQTEwgKFBMTCBhbmQgUExMU0FJMSkuCisgICoKKyAgKiBAcGFyYW0gIF9fUExMTV9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBSQ0NfUExMTV9DbG9ja19EaXZpZGVyLgorICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExNIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTyBpbnB1dAorICAqICAgICAgICAgZnJlcXVlbmN5IHJhbmdlcyBmcm9tIDQgdG8gMTYgTUh6LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZWxlY3QgYSBmcmVxdWVuY3kKKyAgKiAgICAgICAgIG9mIDE2IE1IeiB0byBsaW1pdCBQTEwgaml0dGVyLgorICAqCisgICogQHBhcmFtICBfX1BMTE5fXyAgc3BlY2lmaWVzIHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gb3V0cHV0IGNsb2NrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDggYW5kIDg2LgorICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExOIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTworICAqICAgICAgICAgb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6LgorICAqCisgICogQHBhcmFtICBfX1BMTFBfXyAgc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIEFEQyBhbmQgU0FJMSBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExQX0Nsb2NrX0RpdmlkZXIuCisgICoKKyAgKiBAcGFyYW0gIF9fUExMUV9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgVVNCIGFuZCBSTkcgY2xvY2tzLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFFfQ2xvY2tfRGl2aWRlcgorICAqIEBub3RlICAgSWYgdGhlIFVTQiBGUyBpcyB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBoYXZlIHRvIHNldCB0aGUKKyAgKiAgICAgICAgIFBMTFEgcGFyYW1ldGVyIGNvcnJlY3RseSB0byBoYXZlIDQ4IE1IeiBjbG9jayBmb3IgdGhlIFVTQi4gSG93ZXZlciwKKyAgKiAgICAgICAgIHRoZSBSTkcgbmVlZCBhIGZyZXF1ZW5jeSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDQ4IE1IeiB0byB3b3JrCisgICogICAgICAgICBjb3JyZWN0bHkuCisgICoKKyAgKiBAcGFyYW0gIF9fUExMUl9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgdGhlIG1haW4gc3lzdGVtIGNsb2NrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIKKyAgKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMUiBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIG5vdCBleGNlZWQgNjRNSFouCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExfQ09ORklHKF9fUExMU09VUkNFX18sIF9fUExMTV9fLCBfX1BMTE5fXywgX19QTExQX18sIF9fUExMUV9fLF9fUExMUl9fICkgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyggUkNDLT5QTExDRkdSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFNSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QTExDRkdSX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMUiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgKF9fUExMU09VUkNFX18pICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpIChfX1BMTE1fXykgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoKF9fUExMTl9fKSA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkgKF9fUExMUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpIChfX1BMTFFfXykgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSAoX19QTExSX18pKSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX05PTkUgTm8gb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX01TSSBNU0kgb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTSSBIU0kgb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU09VUkNFX0hTRSBIU0Ugb3NjaWxsYXRvciBpcyB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpICBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIGVhY2ggY2xvY2sgb3V0cHV0IChSQ0NfUExMX1NZU0NMSywgUkNDX1BMTF9VU0JDTEssIFJDQ19QTExfU0FJMUNMSykKKyAgKiBAbm90ZSAgIEVuYWJsaW5nL2Rpc2FibGluZyBjbG9jayBvdXRwdXRzIFJDQ19QTExfU0FJMUNMSyBhbmQgUkNDX1BMTF9VU0JDTEsgY2FuIGJlIGRvbmUgYXQgYW55dGltZQorICAqICAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byBzdG9wIHRoZSBQTEwgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlci4gQnV0IFJDQ19QTExfU1lTQ0xLIGNhbm5vdAorICAqICAgICAgICAgYmUgc3RvcHBlZCBpZiB1c2VkIGFzIFN5c3RlbSBDbG9jay4KKyAgKiBAcGFyYW0gIF9fUExMQ0xPQ0tPVVRfXyAgc3BlY2lmaWVzIHRoZSBQTEwgY2xvY2sgdG8gYmUgb3V0cHV0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1NBSTFDTEsgIFRoaXMgY2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIFNBSQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfQURDQ0xLICBUaGlzIGNsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciBBREMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1VTQkNMSyAgVGhpcyBDbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFVTQiBGUyAoNDggTUh6KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfUk5HQ0xLICBUaGlzIGNsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciBSTkcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1NZU0NMSyAgVGhpcyBDbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoIHNwZWVkIHN5c3RlbSBjbG9jayAodXAgdG8gNjRNSHopCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKF9fUExMQ0xPQ0tPVVRfXykgICBTRVRfQklUKFJDQy0+UExMQ0ZHUiwgKF9fUExMQ0xPQ0tPVVRfXykpCisKKyNkZWZpbmUgX19IQUxfUkNDX1BMTENMS09VVF9ESVNBQkxFKF9fUExMQ0xPQ0tPVVRfXykgIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBvdXRwdXQgZW5hYmxlIHN0YXR1cyAoUkNDX1BMTF9TWVNDTEssIFJDQ19QTExfVVNCQ0xLLCBSQ0NfUExMX1NBSTFDTEspCisgICogQHBhcmFtICBfX1BMTENMT0NLT1VUX18gIHNwZWNpZmllcyB0aGUgb3V0cHV0IFBMTCBjbG9jayB0byBiZSBjaGVja2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF9TQUkxQ0xLICBUaGlzIGNsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYWNjdXJhdGUgY2xvY2sgdG8gYWNoaWV2ZSBoaWdoLXF1YWxpdHkgYXVkaW8gcGVyZm9ybWFuY2Ugb24gU0FJIGludGVyZmFjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfQURDQ0xLICBzYW1lCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTF9VU0JDTEsgIFRoaXMgQ2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0IgRlMgKDQ4IE1IeikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMX1JOR0NMSyAgc2FtZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExfU1lTQ0xLICBUaGlzIENsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhpZ2ggc3BlZWQgc3lzdGVtIGNsb2NrICh1cCB0byA2NE1IeikKKyAgKiBAcmV0dmFsIFNFVCAvIFJFU0VUCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUExMQ0xLT1VUX0NPTkZJRyhfX1BMTENMT0NLT1VUX18pICBSRUFEX0JJVChSQ0MtPlBMTENGR1IsIChfX1BMTENMT0NLT1VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gIF9fU1lTQ0xLU09VUkNFX18gIHNwZWNpZmllcyB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9NU0kgTVNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0kgSFNJIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9IU0UgSFNFIG9zY2lsbGF0b3IgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9QTExDTEsgUExMIG91dHB1dCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TWVNDTEtfQ09ORklHKF9fU1lTQ0xLU09VUkNFX18pICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlKF9fU1lTQ0xLU09VUkNFX18pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgY2xvY2sgc291cmNlIHVzZWQgYXMgc3lzdGVtIGNsb2NrLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSB1c2VkIGFzIHN5c3RlbSBjbG9jay4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUKKyAgKiAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0kgTVNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrLgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jay4KKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRSBIU0UgdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEsgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAgTExfUkNDX0dldFN5c0Nsa1NvdXJjZSgpCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBFeHRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNFKSBkcml2ZSBjYXBhYmlsaXR5LgorICAqIEBub3RlICAgQXMgdGhlIExTRSBpcyBpbiB0aGUgQmFja3VwIGRvbWFpbiBhbmQgd3JpdGUgYWNjZXNzIGlzIGRlbmllZCB0bworICAqICAgICAgICAgdGhpcyBkb21haW4gYWZ0ZXIgcmVzZXQsIHlvdSBoYXZlIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdXNpbmcKKyAgKiAgICAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpIGZ1bmN0aW9uIGJlZm9yZSB0byBjb25maWd1cmUgdGhlIExTRQorICAqICAgICAgICAgKHRvIGJlIGRvbmUgb25jZSBhZnRlciByZXNldCkuCisgICogQHBhcmFtICBfX0xTRURSSVZFX18gIHNwZWNpZmllcyB0aGUgbmV3IHN0YXRlIG9mIHRoZSBMU0UgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9MT1cgIExTRSBvc2NpbGxhdG9yIGxvdyBkcml2ZSBjYXBhYmlsaXR5LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0VEUklWRV9NRURJVU1MT1cgIExTRSBvc2NpbGxhdG9yIG1lZGl1bSBsb3cgZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgTFNFIG9zY2lsbGF0b3IgbWVkaXVtIGhpZ2ggZHJpdmUgY2FwYWJpbGl0eS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNFRFJJVkVfSElHSCAgTFNFIG9zY2lsbGF0b3IgaGlnaCBkcml2ZSBjYXBhYmlsaXR5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFRFJJVkVfQ09ORklHKF9fTFNFRFJJVkVfXykgIExMX1JDQ19MU0VfU2V0RHJpdmVDYXBhYmlsaXR5KF9fTFNFRFJJVkVfXykKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIHdha2UgdXAgZnJvbSBzdG9wIGNsb2NrLgorICAqIEBwYXJhbSAgX19TVE9QV1VDTEtfXyAgc3BlY2lmaWVzIHRoZSBjbG9jayBzb3VyY2UgdXNlZCBhZnRlciB3YWtlIHVwIGZyb20gc3RvcC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfTVNJICBNU0kgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TVE9QX1dBS0VVUENMT0NLX0hTSSAgSFNJIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1dBS0VVUFNUT1BfQ0xLX0NPTkZJRyhfX1NUT1BXVUNMS19fKSAgTExfUkNDX1NldENsa0FmdGVyV2FrZUZyb21TdG9wKF9fU1RPUFdVQ0xLX18pCisKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBNQ08gY2xvY2suCisgICogQHBhcmFtICBfX01DT0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgTUNPIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX05PQ0xPQ0sgIE1DTyBvdXRwdXQgZGlzYWJsZWQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsgIFN5c3RlbSAgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX01TSSAgICAgTVNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgICAgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICAgICBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZWUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIE1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kxICAgIExTSTEgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0xTSTIgICAgTFNJMiBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfTFNFICAgICBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTSTQ4ICAgIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKworICAqIEBwYXJhbSAgX19NQ09ESVZfXyBzcGVjaWZpZXMgdGhlIE1DTyBjbG9jayBwcmVzY2FsZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzEgICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgMQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMiAgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DT0RJVl80ICAgTUNPIGNsb2NrIHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzggICBNQ08gY2xvY2sgc291cmNlIGlzIGRpdmlkZWQgYnkgOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMTYgIE1DTyBjbG9jayBzb3VyY2UgaXMgZGl2aWRlZCBieSAxNgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTUNPMV9DT05GSUcoX19NQ09DTEtTT1VSQ0VfXywgX19NQ09ESVZfXykgIExMX1JDQ19Db25maWdNQ08oKF9fTUNPQ0xLU09VUkNFX18pLCAoX19NQ09ESVZfXykpCisKKworLyoqIEBkZWZncm91cCBSQ0NfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudAorICAqIEBicmllZiBtYWNyb3MgdG8gbWFuYWdlIHRoZSBzcGVjaWZpZWQgUkNDIEZsYWdzIGFuZCBpbnRlcnJ1cHRzLgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSQ0MgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSTFSRFkgICAgIExTSTEgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VSRFkgICAgICBMU0UgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9NU0lSRFkgICAgICBIU0kgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgICAgICBIU0kgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0VSRFkgICAgICBIU0UgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExSRFkgICAgICBNYWluIFBMTCByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFNBSTFSRFkgIFBMTFNBSTEgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgICAgICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJNDhSRFkgUExMSFNJNDggcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0kyUkRZICAgICBMU0kyIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0VOQUJMRV9JVChfX0lOVEVSUlVQVF9fKSBTRVRfQklUKFJDQy0+Q0lFUiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmIERpc2FibGUgUkNDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIHNwZWNpZmllcyB0aGUgUkNDIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0kxUkRZICAgICBMU0kxIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICAgICAgTFNFIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTVNJUkRZICAgICAgSFNJIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNJUkRZICAgICAgSFNJIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZICAgICAgSFNFIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICAgICAgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9QTExTQUkxUkRZICBQTExTQUkxIHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFQ1NTICAgICAgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZICAgIFBMTEhTSTQ4IHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNJMlJEWSAgICAgTFNJMiByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19ESVNBQkxFX0lUKF9fSU5URVJSVVBUX18pIENMRUFSX0JJVChSQ0MtPkNJRVIsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgUkNDIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKFBlcmZvcm0gQnl0ZSBhY2Nlc3MgdG8gUkNDX0NJQ1JbMTc6MF0KKyAgKiAgICAgICAgIGJpdHMgdG8gY2xlYXIgdGhlIHNlbGVjdGVkIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSTFSRFkgIExTSTEgcmVhZHkgaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRVJEWSAgIExTRSByZWFkeSBpbnRlcnJ1cHQgY2xlYXIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTVNJUkRZICAgSFNJIHJlYWR5IGludGVycnVwdCBjbGVhcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgICBIU0kgcmVhZHkgaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRVJEWSAgIEhTRSByZWFkeSBpbnRlcnJ1cHQgY2xlYXIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfUExMUkRZICAgTWFpbiBQTEwgcmVhZHkgaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgIFBMTFNBSTEgcmVhZHkgaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTRUNTUyAgIEhTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTRUNTUyAgIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGNsZWFyCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZIFBMTEhTSTQ4IHJlYWR5IGludGVycnVwdCBjbGVhcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0kyUkRZICBMU0kyIHJlYWR5IGludGVycnVwdCBjbGVhcgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ0xFQVJfSVQoX19JTlRFUlJVUFRfXykgKFJDQy0+Q0lDUiA9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgUkNDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBSQ0MgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSTFSRFkgIExTSTEgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfTFNFUkRZICAgTFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX01TSVJEWSAgIEhTSSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9IU0lSRFkgICBIU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFUkRZICAgSFNFIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgIE1haW4gUExMIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX1BMTFJEWSAgIFBMTFNBSTEgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSVRfSFNFQ1NTICAgSFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JVF9MU0VDU1MgICBMU0UgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0hTSTQ4UkRZIFBMTEhTSTQ4IHJlYWR5IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0lUX0xTSTJSRFkgIExTSTIgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSVQoX19JTlRFUlJVUFRfXykgKChSQ0MtPkNJRlIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiBTZXQgUk1WRiBiaXQgdG8gY2xlYXIgdGhlIHJlc2V0IGZsYWdzLgorICAqICAgICAgICBUaGUgcmVzZXQgZmxhZ3MgYXJlOiBSQ0NfRkxBR19PQkxSU1QsIFJDQ19GTEFHX1BJTlJTVCwgUkNDX0ZMQUdfQk9SUlNULAorICAqICAgICAgICBSQ0NfRkxBR19TRlRSU1QsIFJDQ19GTEFHX0lXREdSU1QsIFJDQ19GTEFHX1dXREdSU1QgYW5kIFJDQ19GTEFHX0xQV1JSU1QuCisgICogQHJldHZhbCBOb25lCisgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NMRUFSX1JFU0VUX0ZMQUdTKCkgTExfUkNDX0NsZWFyUmVzZXRGbGFncygpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIFJDQyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0ZMQUdfXyAgc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19NU0lSRFkgIE1TSSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNJUkRZICBIU0kgb3NjaWxsYXRvciBjbG9jayByZWFkeQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0hTRVJEWSAgSFNFIG9zY2lsbGF0b3IgY2xvY2sgcmVhZHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19QTExSRFkgIE1haW4gUExMIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfUExMUkRZICBQTExTQUkxIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfSFNJNDhSRFkgIEhTSTQ4IGNsb2NrIHJlYWR5IGZvciBkZXZpY2VzIHdpdGggSFNJNDgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19MU0VSRFkgIExTRSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNFQ1NTRCAgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGZhaWx1cmUgb24gTFNFIG9zY2lsbGF0b3IgZGV0ZWN0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNJMVJEWSAgTFNJMSBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFNJMlJEWSAgTFNJMiBvc2NpbGxhdG9yIGNsb2NrIHJlYWR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfQk9SUlNUICBCT1IgcmVzZXQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfRkxBR19PQkxSU1QgIE9CTFJTVCByZXNldAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX1BJTlJTVCAgUGluIHJlc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfU0ZUUlNUICBTb2Z0d2FyZSByZXNldAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19GTEFHX0lXREdSU1QgIEluZGVwZW5kZW50IFdhdGNoZG9nIHJlc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfV1dER1JTVCAgV2luZG93IFdhdGNoZG9nIHJlc2V0CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0ZMQUdfTFBXUlJTVCAgTG93IFBvd2VyIHJlc2V0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9GTEFHKF9fRkxBR19fKSAoKCgoKCgoX19GTEFHX18pID4+IDVVKSA9PSBDUl9SRUdfSU5ERVgpID8gUkNDLT5DUiA6ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0ZMQUdfXykgPj4gNVUpID09IENSUkNSX1JFR19JTkRFWCkgPyBSQ0MtPkNSUkNSIDogICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fRkxBR19fKSA+PiA1VSkgPT0gQkRDUl9SRUdfSU5ERVgpID8gUkNDLT5CRENSIDogICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0ZMQUdfXykgPj4gNVUpID09IENTUl9SRUdfSU5ERVgpID8gUkNDLT5DU1IgOiBSQ0MtPkNJRlIpKSkpICYgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxVSA8PCAoKF9fRkxBR19fKSAmIFJDQ19GTEFHX01BU0spKSkgIT0gUkVTRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFJDQyBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9yY2NfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX0RlSW5pdCh2b2lkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfT3NjQ29uZmlnKFJDQ19Pc2NJbml0VHlwZURlZiAqUkNDX09zY0luaXRTdHJ1Y3QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19DbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCBGTGF0ZW5jeSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfTUNPQ29uZmlnKHVpbnQzMl90IFJDQ19NQ094LCB1aW50MzJfdCBSQ0NfTUNPU291cmNlLCB1aW50MzJfdCBSQ0NfTUNPRGl2KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfRW5hYmxlQ1NTKHZvaWQpOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEodm9pZCk7CisKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0SENMS0ZyZXEodm9pZCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldEhDTEsyRnJlcSh2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0SENMSzRGcmVxKHZvaWQpOworCit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDX0dldFBDTEsxRnJlcSh2b2lkKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SQ0NfR2V0UENMSzJGcmVxKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDX0dldE9zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgKlJDQ19Pc2NJbml0U3RydWN0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoUkNDX0Nsa0luaXRUeXBlRGVmICpSQ0NfQ2xrSW5pdFN0cnVjdCwgdWludDMyX3QgKnBGTGF0ZW5jeSk7CisvKiBMU0UgJiBIU0UgQ1NTIE5NSSBJUlEgaGFuZGxlciAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19OTUlfSVJRSGFuZGxlcih2b2lkKTsKKy8qIFVzZXIgQ2FsbGJhY2tzIGluIG5vbiBibG9ja2luZyBtb2RlIChJVCBtb2RlKSAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ19DU1NDYWxsYmFjayh2b2lkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfUkNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfcmNjX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9yY2NfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBmNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfcmNjX2V4LmgKQEAgLTAsMCArMSwxNTE0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9yY2NfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUkNDIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1JDQ19FWF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfUkNDX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2Nycy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9leHRpLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3B3ci5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXgKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworLyogQ1JTIElUIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgIFJDQ19DUlNfSVRfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NSU19JVF9UUklNT1ZGIHwgUkNDX0NSU19JVF9TWU5DRVJSIHwgUkNDX0NSU19JVF9TWU5DTUlTUykpCisKKy8qIENSUyBGbGFnIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX0VSUk9SX01BU0sgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoUkNDX0NSU19GTEFHX1RSSU1PVkYgfCBSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUiB8IFJDQ19DUlNfRkxBR19TWU5DTUlTUykpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIElTX1JDQ19MU0NPKF9fTFNDT1hfXykgKCAoKF9fTFNDT1hfXykgPT0gUkNDX0xTQ08xKSB8fCAoKF9fTFNDT1hfXykgPT0gUkNDX0xTQ08yKSB8fCAoKF9fTFNDT1hfXykgPT0gUkNDX0xTQ08zKSApCisKKyNkZWZpbmUgSVNfUkNDX0xTQ09TT1VSQ0UoX19TT1VSQ0VfXykgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0xTQ09TT1VSQ0VfTFNJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MU0NPU09VUkNFX0xTRSkpCisKKworI2RlZmluZSBJU19SQ0NfUEVSSVBIQ0xPQ0soX19TRUxFQ1RJT05fXykgIFwKKyAgICAgICAgICAgICAgICgoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSAgID09IFJDQ19QRVJJUEhDTEtfVVNBUlQxKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFVBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzEpICAgICAgPT0gUkNDX1BFUklQSENMS19JMkMxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0kyQzMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSAgID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKSAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19MUFRJTTIpICAgPT0gUkNDX1BFUklQSENMS19MUFRJTTIpICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSAgICAgID09IFJDQ19QRVJJUEhDTEtfVVNCKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19STkcpICAgICAgPT0gUkNDX1BFUklQSENMS19STkcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgICA9PSBSQ0NfUEVSSVBIQ0xLX0FEQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKChfX1NFTEVDVElPTl9fKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSAgICAgID09IFJDQ19QRVJJUEhDTEtfUlRDKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoKF9fU0VMRUNUSU9OX18pICYgUkNDX1BFUklQSENMS19SRldBS0VVUCkgPT0gUkNDX1BFUklQSENMS19SRldBS0VVUCl8fCBcCisgICAgICAgICAgICAgICAgKCgoX19TRUxFQ1RJT05fXykgJiBSQ0NfUEVSSVBIQ0xLX1NNUFMpICAgICA9PSBSQ0NfUEVSSVBIQ0xLX1NNUFMpKQorCisjZGVmaW5lIElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzIpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQVJUMUNMS1NPVVJDRV9MU0UpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJKSkKKworCisjZGVmaW5lIElTX1JDQ19MUFVBUlQxQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSykgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9IU0kpKQorCisKKyNkZWZpbmUgSVNfUkNDX0kyQzFDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLKXx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMxQ0xLU09VUkNFX0hTSSkpCisKKyNkZWZpbmUgSVNfUkNDX0kyQzNDTEtTT1VSQ0UoX19TT1VSQ0VfXykgICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLKXx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19JMkMzQ0xLU09VUkNFX0hTSSkpCisKKworI2RlZmluZSBJU19SQ0NfU0FJMUNMSyhfX1NPVVJDRV9fKSAgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX1BMTFNBSTEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TQUkxQ0xLU09VUkNFX1BMTCkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfSFNJKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1NBSTFDTEtTT1VSQ0VfUElOKSkKKworCisjZGVmaW5lIElTX1JDQ19MUFRJTTFDTEsoX19TT1VSQ0VfXykgIFwKKyAgICAgICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSzEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJKSAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMUNMS1NPVVJDRV9IU0kpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSkpCisKKyNkZWZpbmUgSVNfUkNDX0xQVElNMkNMSyhfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMkNMS1NPVVJDRV9QQ0xLMSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0xQVElNMkNMS1NPVVJDRV9MU0kpICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfTFBUSU0yQ0xLU09VUkNFX0hTSSkgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFKSkKKworI2RlZmluZSBJU19SQ0NfUk5HQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX0NMSzQ4KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19STkdDTEtTT1VSQ0VfTFNJKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfUk5HQ0xLU09VUkNFX0xTRSkpCisKKyNkZWZpbmUgSVNfUkNDX1VTQkNMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQkNMS1NPVVJDRV9IU0k0OCkgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTFNBSTEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19VU0JDTEtTT1VSQ0VfUExMKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1VTQkNMS1NPVVJDRV9NU0kpKQorCisKKyNkZWZpbmUgSVNfUkNDX0FEQ0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQ0NMS1NPVVJDRV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDQ0xLU09VUkNFX1BMTCkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX0FEQ0NMS1NPVVJDRV9QTExTQUkxKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQURDQ0xLU09VUkNFX1NZU0NMSykpCisKKyNkZWZpbmUgSVNfUkNDX1JGV0tQQ0xLU09VUkNFKF9fU09VUkNFX18pICBcCisgICAgICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfUkZXS1BDTEtTT1VSQ0VfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JGV0tQQ0xLU09VUkNFX0xTRSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JGV0tQQ0xLU09VUkNFX0xTSSkgfHwgXAorICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gUkNDX1JGV0tQQ0xLU09VUkNFX0hTRV9ESVYxMDI0KSkKKworI2RlZmluZSBJU19SQ0NfU01QU0NMS0RJVihfX0RJVl9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19ESVZfXykgPT0gUkNDX1NNUFNDTEtESVZfUkFOR0UwKSB8fCBcCisgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfU01QU0NMS0RJVl9SQU5HRTEpIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19TTVBTQ0xLRElWX1JBTkdFMikgfHwgXAorICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX1NNUFNDTEtESVZfUkFOR0UzKSkKKworI2RlZmluZSBJU19SQ0NfU01QU0NMS1NPVVJDRShfX1NPVVJDRV9fKSAgXAorICAgICAgICAgICAgICAgKCgoX19TT1VSQ0VfXykgPT0gUkNDX1NNUFNDTEtTT1VSQ0VfSFNJKSAgICB8fCBcCisgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfU01QU0NMS1NPVVJDRV9NU0kpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFJDQ19TTVBTQ0xLU09VUkNFX0hTRSkpCisKKyNkZWZpbmUgSVNfUkNDX1BMTFNBSTFOX1ZBTFVFKF9fVkFMVUVfXykgICAoKDhVIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gODZVKSkKKworI2RlZmluZSBJU19SQ0NfUExMU0FJMVBfVkFMVUUoX19WQUxVRV9fKSAgICgoUkNDX1BMTFBfRElWMiA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IFJDQ19QTExQX0RJVjMyKSkKKworI2RlZmluZSBJU19SQ0NfUExMU0FJMVFfVkFMVUUoX19WQUxVRV9fKSAgICgoUkNDX1BMTFFfRElWMiA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IFJDQ19QTExRX0RJVjgpKQorCisjZGVmaW5lIElTX1JDQ19QTExTQUkxUl9WQUxVRShfX1ZBTFVFX18pICAgKChSQ0NfUExMUl9ESVYyIDw9IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gUkNDX1BMTFJfRElWOCkpCisKKyNkZWZpbmUgSVNfUkNDX1RSSU1PU0MoX19WQUxVRV9fKSAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19TWU5DX1NPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX0dQSU8pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX0xTRSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBSQ0NfQ1JTX1NZTkNfU09VUkNFX1VTQikpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19TWU5DX0RJVihfX0RJVl9fKSAgICAgICAoKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMSkgIHx8ICgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjQpICB8fCAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVY4KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFJDQ19DUlNfU1lOQ19ESVYxNikgfHwgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBSQ0NfQ1JTX1NZTkNfRElWNjQpIHx8ICgoX19ESVZfXykgPT0gUkNDX0NSU19TWU5DX0RJVjEyOCkpCisKKyNkZWZpbmUgSVNfUkNDX0NSU19TWU5DX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgKCgoX19QT0xBUklUWV9fKSA9PSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gUkNDX0NSU19TWU5DX1BPTEFSSVRZX0ZBTExJTkcpKQorCisjZGVmaW5lIElTX1JDQ19DUlNfUkVMT0FEVkFMVUUoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA8PSAweEZGRkZVKSkKKworI2RlZmluZSBJU19SQ0NfQ1JTX0VSUk9STElNSVQoX19WQUxVRV9fKSAgICgoKF9fVkFMVUVfXykgPD0gMHhGRlUpKQorCisjZGVmaW5lIElTX1JDQ19DUlNfSFNJNDhDQUxJQlJBVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPD0gMHgzRlUpKQorCisjZGVmaW5lIElTX1JDQ19DUlNfRlJFUUVSUk9SRElSKF9fRElSX18pICAgKCgoX19ESVJfXykgPT0gUkNDX0NSU19GUkVRRVJST1JESVJfVVApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJUl9fKSA9PSBSQ0NfQ1JTX0ZSRVFFUlJPUkRJUl9ET1dOKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9FeHBvcnRlZF9UeXBlcyBSQ0NFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUExMU0FJMSBDbG9jayBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBQTExOOyAgICAgICAgICAgICAvKiE8IFBMTE46IHNwZWNpZmllcyB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTExTQUkxIFZDTyBvdXRwdXQgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTggYW5kIE1heF9EYXRhPTg2LiAqLworCisgIHVpbnQzMl90IFBMTFA7ICAgICAgICAgICAgIC8qITwgUExMUDogc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFNBSSBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMUF9DbG9ja19EaXZpZGVyICovCisKKyAgdWludDMyX3QgUExMUTsgICAgICAgICAgICAgLyohPCBQTExROiBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgVVNCL1JORyBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUExMUV9DbG9ja19EaXZpZGVyICovCisKKyAgdWludDMyX3QgUExMUjsgICAgICAgICAgICAgLyohPCBQTExSOiBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgQURDIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19QTExSX0Nsb2NrX0RpdmlkZXIgKi8KKworICB1aW50MzJfdCBQTExTQUkxQ2xvY2tPdXQ7ICAvKiE8IFBMTFNBSTFDbG9ja091dDogc3BlY2lmaWVzIFBMTFNBSTEgb3V0cHV0IGNsb2NrIHRvIGJlIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX1BMTFNBSTFfQ2xvY2tfT3V0cHV0ICovCit9IFJDQ19QTExTQUkxSW5pdFR5cGVEZWY7CisKKworLyoqCisgICogQGJyaWVmICBSQ0MgZXh0ZW5kZWQgY2xvY2tzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQZXJpcGhDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFRoZSBFeHRlbmRlZCBDbG9jayB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfUGVyaXBoX0Nsb2NrX1NlbGVjdGlvbiAqLworCisKKyAgUkNDX1BMTFNBSTFJbml0VHlwZURlZiBQTExTQUkxOyAgLyohPCBQTExTQUkxIHN0cnVjdHVyZSBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gUExMU0FJMSBpcyBzZWxlY3RlZCBhcyBDbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBmb3IgU0FJLCBVU0IvUk5HIG9yIEFEQyAqLworCisgIHVpbnQzMl90IFVzYXJ0MUNsb2NrU2VsZWN0aW9uOyAgIC8qITwgU3BlY2lmaWVzIFVTQVJUMSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0FSVDFfQ2xvY2tfU291cmNlICovCisKKworICB1aW50MzJfdCBMcHVhcnQxQ2xvY2tTZWxlY3Rpb247ICAvKiE8IFNwZWNpZmllcyBMUFVBUlQxIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0xQVUFSVDFfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgSTJjMUNsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBTcGVjaWZpZXMgSTJDMSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IEkyYzNDbG9ja1NlbGVjdGlvbjsgICAgIC8qITwgU3BlY2lmaWVzIEkyQzMgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfSTJDM19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBMcHRpbTFDbG9ja1NlbGVjdGlvbjsgICAvKiE8IFNwZWNpZmllcyBMUFRJTTEgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IExwdGltMkNsb2NrU2VsZWN0aW9uOyAgIC8qITwgU3BlY2lmaWVzIExQVElNMiBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9MUFRJTTJfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgU2FpMUNsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBTcGVjaWZpZXMgU0FJMSBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9TQUkxX0Nsb2NrX1NvdXJjZSAqLworCisKKyAgdWludDMyX3QgVXNiQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgVVNCIGNsb2NrIHNvdXJjZSAod2FybmluZzogc2FtZSBzb3VyY2UgZm9yIFJORykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9VU0JfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgUm5nQ2xvY2tTZWxlY3Rpb247ICAgICAgLyohPCBTcGVjaWZpZXMgUk5HIGNsb2NrIHNvdXJjZSAod2FybmluZzogc2FtZSBzb3VyY2UgZm9yIFVTQikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9STkdfQ2xvY2tfU291cmNlICovCisKKworICB1aW50MzJfdCBBZGNDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBBREMgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0FEQ19DbG9ja19Tb3VyY2UgKi8KKworICB1aW50MzJfdCBSVENDbG9ja1NlbGVjdGlvbjsgICAgICAvKiE8IFNwZWNpZmllcyBSVEMgY2xvY2sgc291cmNlIChhbHNvIHVzZWQgZm9yIExDRCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfUlRDX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFJGV2FrZVVwQ2xvY2tTZWxlY3Rpb247IC8qITwgU3BlY2lmaWVzIFJGIFdha2UtdXAgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfUkZXS1BfQ2xvY2tfU291cmNlICovCisKKyAgdWludDMyX3QgU21wc0Nsb2NrU2VsZWN0aW9uOyAgICAgLyohPCBTcGVjaWZpZXMgU01QUyBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9TTVBTX0Nsb2NrX1NvdXJjZSAqLworCisgIHVpbnQzMl90IFNtcHNEaXZTZWxlY3Rpb247ICAgICAgIC8qITwgU3BlY2lmaWVzIFNNUFMgY2xvY2sgZGl2aXNpb24gZmFjdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfU01QU19DbG9ja19EaXZpZGVyICovCisKK30gUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmOworCisKKy8qKgorICAqIEBicmllZiBSQ0NfQ1JTIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlcjsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBvZiB0aGUgU1lOQyBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0NSU19TeW5jaHJvRGl2aWRlciAqLworCisgIHVpbnQzMl90IFNvdXJjZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1N5bmNocm9Tb3VyY2UgKi8KKworICB1aW50MzJfdCBQb2xhcml0eTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBwb2xhcml0eSBmb3IgdGhlIFNZTkMgc2lnbmFsIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1N5bmNocm9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IFJlbG9hZFZhbHVlOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbiB0aGUgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgd2l0aCBlYWNoIFNZTkMgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgY2FsY3VsYXRlZCBpbiB1c2luZyBtYWNybyBfX0hBTF9SQ0NfQ1JTX1JFTE9BRFZBTFVFX0NBTENVTEFURShfX0ZUQVJHRVRfXywgX19GU1lOQ19fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRiBvciBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX1JlbG9hZFZhbHVlRGVmYXVsdCAuKi8KKworICB1aW50MzJfdCBFcnJvckxpbWl0VmFsdWU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB1c2VkIHRvIGV2YWx1YXRlIHRoZSBjYXB0dXJlZCBmcmVxdWVuY3kgZXJyb3IgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRiBvciBhIHZhbHVlIG9mIEByZWYgUkNDRXhfQ1JTX0Vycm9yTGltaXREZWZhdWx0ICovCisKKyAgdWludDMyX3QgSFNJNDhDYWxpYnJhdGlvblZhbHVlOyAvKiE8IFNwZWNpZmllcyBhIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRvIHRoZSBIU0k0OCBvc2NpbGxhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4M0Ygb3IgYSB2YWx1ZSBvZiBAcmVmIFJDQ0V4X0NSU19IU0k0OENhbGlicmF0aW9uRGVmYXVsdCAqLworCit9IFJDQ19DUlNJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIFJDQ19DUlMgU3luY2hyb25pemF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBSZWxvYWRWYWx1ZTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBsb2FkZWQgaW4gdGhlIENvdW50ZXIgcmVsb2FkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRiAqLworCisgIHVpbnQzMl90IEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZTsgLyohPCBTcGVjaWZpZXMgdmFsdWUgbG9hZGVkIGluIEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4M0YgKi8KKworICB1aW50MzJfdCBGcmVxRXJyb3JDYXB0dXJlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSB2YWx1ZSBsb2FkZWQgaW4gdGhlIC5GRUNBUCwgdGhlIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0IFNZTkMgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGICovCisKKyAgdWludDMyX3QgRnJlcUVycm9yRGlyZWN0aW9uOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgdmFsdWUgbG9hZGVkIGluIHRoZSAuRkVESVIsIHRoZSBjb3VudGluZyBkaXJlY3Rpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgZXJyb3IgY291bnRlciBsYXRjaGVkIGluIHRoZSB0aW1lIG9mIHRoZSBsYXN0IFNZTkMgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBzaG93cyB3aGV0aGVyIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGJlbG93IG9yIGFib3ZlIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NFeF9DUlNfRnJlcUVycm9yRGlyZWN0aW9uKi8KKworfSBSQ0NfQ1JTU3luY2hyb0luZm9UeXBlRGVmOworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0NvbnN0YW50cyBSQ0NFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MU0NPX0luZGV4IExTQ08gSW5kZXgKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFNDTzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgTFNDTzEgaW5kZXggKi8KKyNkZWZpbmUgUkNDX0xTQ08yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IExTQ08yIGluZGV4ICovCisjZGVmaW5lIFJDQ19MU0NPMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgICAgICAgICAgLyohPCBMU0NPMyBpbmRleCAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xTQ09fQ2xvY2tfU291cmNlIExvdyBTcGVlZCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFNDT1NPVVJDRV9MU0kgICAgICAgICAgICAgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTSSAgICAgIC8qITwgTFNJIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworI2RlZmluZSBSQ0NfTFNDT1NPVVJDRV9MU0UgICAgICAgICAgICAgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRSAgICAgIC8qITwgTFNFIHNlbGVjdGlvbiBmb3IgbG93IHNwZWVkIGNsb2NrIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9QZXJpcGhfQ2xvY2tfU2VsZWN0aW9uIFBlcmlwaCBDbG9jayBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQxIFBlcmlwaGVyYWwgQ2xvY2sgU2VsZWN0aW9uICAgICAgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19MUFVBUlQxICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAvKiE8IExQVUFSVDEgUGVyaXBoZXJhbCBDbG9jayBTZWxlY3Rpb24gICAgICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfSTJDMSAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgLyohPCBJMkMxIFBlcmlwaGVyYWwgQ2xvY2sgU2VsZWN0aW9uICAgICAgICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAgICAgICAgICAgICAgICAgIC8qITwgSTJDMyBQZXJpcGhlcmFsIENsb2NrIFNlbGVjdGlvbiAgICAgICAgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19MUFRJTTEgICAgICAgICAgIDB4MDAwMDAwMTBVICAgICAgICAgICAgICAgICAgICAvKiE8IExQVElNMSBQZXJpcGhlcmFsIENsb2NrIFNlbGVjdGlvbiAgICAgICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfTFBUSU0yICAgICAgICAgICAweDAwMDAwMDIwVSAgICAgICAgICAgICAgICAgICAgLyohPCBMUFRJTTIgUGVyaXBoZXJhbCBDbG9jayBTZWxlY3Rpb24gICAgICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NBSTEgICAgICAgICAgICAgMHgwMDAwMDA0MFUgICAgICAgICAgICAgICAgICAgIC8qITwgU0FJMSBQZXJpcGhlcmFsIENsb2NrIFNlbGVjdGlvbiAgICAgICAgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19VU0IgICAgICAgICAgICAgIDB4MDAwMDAxMDBVICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBQZXJpcGhlcmFsIENsb2NrIFNlbGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUk5HICAgICAgICAgICAgICAweDAwMDAwMjAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgUGVyaXBoZXJhbCBDbG9jayBTZWxlY3Rpb24gICAgICAgICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX0FEQyAgICAgICAgICAgICAgMHgwMDAwMDQwMFUgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIFBlcmlwaGVyYWwgQ2xvY2sgU2VsZWN0aW9uICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX1BFUklQSENMS19SVEMgICAgICAgICAgICAgIDB4MDAwMDA4MDBVICAgICAgICAgICAgICAgICAgICAvKiE8IFJUQyBQZXJpcGhlcmFsIENsb2NrIFNlbGVjdGlvbiAgICAgICAgICovCisjZGVmaW5lIFJDQ19QRVJJUEhDTEtfUkZXQUtFVVAgICAgICAgICAweDAwMDAxMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBSRiBXYWtldXAgUGVyaXBoZXJhbCBDbG9jayBTZWxlY3Rpb24gICAqLworI2RlZmluZSBSQ0NfUEVSSVBIQ0xLX1NNUFMgICAgICAgICAgICAgMHgwMDAwMjAwMFUgICAgICAgICAgICAgICAgICAgIC8qITwgU01QU1MgUGVyaXBoZXJhbCBDbG9jayBTZWxlY3Rpb24gICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNBUlQxX0Nsb2NrX1NvdXJjZSBVU0FSVDEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiAgICAgIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1BDTEsyICAvKiE8IEFQQjIgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMSBjbG9jayovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLICAgICBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsgLyohPCBTWVNDTEsgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMSBjbG9jayovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICAgICAgICBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMSBjbG9jayovCisjZGVmaW5lIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICAgICBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgVVNBUlQgMSBjbG9jayovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTFBVQVJUMV9DbG9ja19Tb3VyY2UgTFBVQVJUMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9QQ0xLMSAgICAgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxICAvKiE8IEFQQjEgY2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUIDEgY2xvY2sqLworI2RlZmluZSBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9TWVNDTEsgICAgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSyAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBMUFVBUlQgMSBjbG9jayovCisjZGVmaW5lIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSSAgICAgICBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJICAgIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVUFSVCAxIGNsb2NrKi8KKyNkZWZpbmUgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfTFNFICAgICAgIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0UgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTFBVQVJUIDEgY2xvY2sqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9JMkMxX0Nsb2NrX1NvdXJjZSBJMkMxIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX1BDTEsxICAgICAgICBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzEgICAgLyohPCBBUEIxIGNsb2NrIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICAgICAgIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9TWVNDTEsgICAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrICovCisjZGVmaW5lIFJDQ19JMkMxQ0xLU09VUkNFX0hTSSAgICAgICAgICBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJICAgICAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0kyQzNfQ2xvY2tfU291cmNlIEkyQzMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0kyQzNDTEtTT1VSQ0VfUENMSzEgICAgICAgIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMSAgIC8qITwgQVBCMSBjbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrICovCisjZGVmaW5lIFJDQ19JMkMzQ0xLU09VUkNFX1NZU0NMSyAgICAgICBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLICAvKiE8IFNZU0NMSyBjbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrICovCisjZGVmaW5lIFJDQ19JMkMzQ0xLU09VUkNFX0hTSSAgICAgICAgICBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJICAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfU0FJMV9DbG9ja19Tb3VyY2UgU0FJMSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfU0FJMUNMS1NPVVJDRV9QTExTQUkxICAgICAgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTFNBSTEgIC8qITwgUExMU0FJICJQIiBjbG9jayBzZWxlY3RlZCBhcyBTQUkxIGNsb2NrICAqLworI2RlZmluZSBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwgICAgICAgICAgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTCAgICAgIC8qITwgUExMICJQIiBjbG9jayBzZWxlY3RlZCBhcyBTQUkxIGNsb2NrICAgICAqLworI2RlZmluZSBSQ0NfU0FJMUNMS1NPVVJDRV9IU0kgICAgICAgICAgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSSAgICAgIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFNBSTEgY2xvY2sgICAgICAgICAqLworI2RlZmluZSBSQ0NfU0FJMUNMS1NPVVJDRV9QSU4gICAgICAgICAgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BJTiAgICAgIC8qITwgRXh0ZXJuYWwgUElOIGNsb2NrIHNlbGVjdGVkIGFzIFNBSTEgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfTFBUSU0xX0Nsb2NrX1NvdXJjZSBMUFRJTTEgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgICAgIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxICAvKiE8IEFQQjEgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICovCisjZGVmaW5lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfTFNJICAgICAgICBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0kgICAgLyohPCBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICAqLworI2RlZmluZSBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgICAgICAgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJICAgIC8qITwgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMUNMS1NPVVJDRV9MU0UgICAgICAgIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTRSAgICAvKiE8IExTRSBjbG9jayBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0xQVElNMl9DbG9ja19Tb3VyY2UgTFBUSU0yIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSzEgICAgICBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9QQ0xLMSAgLyohPCBBUEIxIGNsb2NrIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jayAqLworI2RlZmluZSBSQ0NfTFBUSU0yQ0xLU09VUkNFX0xTSSAgICAgICAgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNJICAgIC8qITwgTFNJIGNsb2NrIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAgKi8KKyNkZWZpbmUgUkNDX0xQVElNMkNMS1NPVVJDRV9IU0kgICAgICAgIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0hTSSAgICAvKiE8IEhTSSBjbG9jayBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sgICovCisjZGVmaW5lIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFICAgICAgICBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9MU0UgICAgLyohPCBMU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9STkdfQ2xvY2tfU291cmNlIFJORyBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfUk5HQ0xLU09VUkNFX0NMSzQ4ICAgICAgICAgTExfUkNDX1JOR19DTEtTT1VSQ0VfQ0xLNDggICAgIC8qITwgQ0xLNDggZGl2aWRlZCBieSAzIHNlbGVjdGVkIGFzIFJORyBDbG9jayAqLworI2RlZmluZSBSQ0NfUk5HQ0xLU09VUkNFX0xTSSAgICAgICAgICAgTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNJICAgICAgIC8qITwgTFNJIHNlbGVjdGVkIGFzIEFEQyBjbG9jayovCisjZGVmaW5lIFJDQ19STkdDTEtTT1VSQ0VfTFNFICAgICAgICAgICBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9MU0UgICAgICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgQURDIGNsb2NrKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfVVNCX0Nsb2NrX1NvdXJjZSBVU0IgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX0hTSTQ4ICAgICAgICAgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDggICAgIC8qITwgSFNJNDggY2xvY2sgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrICAgICAgICovCisjZGVmaW5lIFJDQ19VU0JDTEtTT1VSQ0VfUExMU0FJMSAgICAgICBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTExTQUkxICAgLyohPCBQTExTQUkxICJRIiBjbG9jayBzZWxlY3RlZCBhcyBVU0IgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1VTQkNMS1NPVVJDRV9QTEwgICAgICAgICAgIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTCAgICAgICAvKiE8IFBMTCAiUSIgY2xvY2sgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrICAgICAqLworI2RlZmluZSBSQ0NfVVNCQ0xLU09VUkNFX01TSSAgICAgICAgICAgTExfUkNDX1VTQl9DTEtTT1VSQ0VfTVNJICAgICAgIC8qITwgTVNJIGNsb2NrIHNlbGVjdGVkIGFzIFVTQiBjbG9jayAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQURDX0Nsb2NrX1NvdXJjZSBBREMgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfQURDQ0xLU09VUkNFX05PTkUgICAgICAgICAgTExfUkNDX0FEQ19DTEtTT1VSQ0VfTk9ORSAgICAgIC8qITwgTm9uZSBjbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sgICAgICAgICovCisjZGVmaW5lIFJDQ19BRENDTEtTT1VSQ0VfUExMU0FJMSAgICAgICBMTF9SQ0NfQURDX0NMS1NPVVJDRV9QTExTQUkxICAgLyohPCBQTExTQUkxICJSIiBjbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX0FEQ0NMS1NPVVJDRV9QTEwgICAgICAgICAgIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTCAgICAgICAvKiE8IFBMTCAiUCIgY2xvY2sgc2VsZWN0ZWQgYXMgQURDIGNsb2NrICAgICAqLworI2RlZmluZSBSQ0NfQURDQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgTExfUkNDX0FEQ19DTEtTT1VSQ0VfU1lTQ0xLICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jayAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfSENMSzVfQ2xvY2tfU291cmNlIEhDTEsgUkYgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKworI2RlZmluZSBSQ0NfSENMSzVTT1VSQ0VfSFNJICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgSFNJIGNsb2NrIG5vdCBkaXZpZGVkIHNlbGVjdGVkIGFzIFJhZGlvIERvbWFpbiBjbG9jayAqLworI2RlZmluZSBSQ0NfSENMSzVTT1VSQ0VfSFNFICAgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgSFNFIGNsb2NrIGRpdmlkZWQgYnkgMiBzZWxlY3RlZCBhcyBSYWRpbyBEb21haW4gY2xvY2sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9SRldLUF9DbG9ja19Tb3VyY2UgUkYgV0tQIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgUkNDX1JGV0tQQ0xLU09VUkNFX05PTkUgICAgICAgICAgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9OT05FICAvKiE8IE5vbmUgY2xvY2sgc2VsZWN0ZWQgYXMgUkYgc3lzdGVtIHdha2V1cCBjbG9jayAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ0NfUkZXS1BDTEtTT1VSQ0VfTFNFICAgICAgICAgICBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0xTRSAgIC8qITwgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIFJGIHN5c3RlbSB3YWtldXAgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19SRldLUENMS1NPVVJDRV9MU0kgICAgICAgICAgIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTFNJICAgLyohPCBMU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUkYgc3lzdGVtIHdha2V1cCBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX1JGV0tQQ0xLU09VUkNFX0hTRV9ESVYxMDI0ICAgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9IU0VfRElWMTAyNCAvKiE8IEhTRSBjbG9jayBkaXZpZGVkIGJ5IDEwMjQgc2VsZWN0ZWQgYXMgUkYgc3lzdGVtIHdha2V1cCBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKworLyoqIEBkZWZncm91cCBSQ0NFeF9TTVBTX0Nsb2NrX1NvdXJjZSBTTVBTIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgUkNDX1NNUFNDTEtTT1VSQ0VfSFNJICAgICAgICAgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX0hTSSAgICAgLyohPCBIU0kgc2VsZWN0aW9uIGFzIHNtcHMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NNUFNDTEtTT1VSQ0VfTVNJICAgICAgICAgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX01TSSAgICAgLyohPCBNU0kgc2VsZWN0aW9uIGFzIHNtcHMgY2xvY2sgKi8KKyNkZWZpbmUgUkNDX1NNUFNDTEtTT1VSQ0VfSFNFICAgICAgICAgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX0hTRSAgICAgLyohPCBIU0Ugc2VsZWN0aW9uIGFzIHNtcHMgY2xvY2sgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ19TeXN0ZW1fQ2xvY2tfU291cmNlX1N0YXR1cyBTeXN0ZW0gQ2xvY2sgU291cmNlIFN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19TTVBTQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBzbXBzIGNsb2NrICovCisjZGVmaW5lIFJDQ19TTVBTQ0xLU09VUkNFX1NUQVRVU19NU0kgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19NU0kgICAgIC8qITwgTVNJIHNlbGVjdGlvbiBhcyBzbXBzIGNsb2NrICovCisjZGVmaW5lIFJDQ19TTVBTQ0xLU09VUkNFX1NUQVRVU19IU0UgICAgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0UgICAgIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBzbXBzIGNsb2NrICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X1NNUFNfQ2xvY2tfRGl2aWRlciBTTVBTIENsb2NrIERpdmlzaW9uIEZhY3RvcgorICAqIEB7CisgICovCisKKyNkZWZpbmUgUkNDX1NNUFNDTEtESVZfUkFOR0UwICAgICAgICAgICBMTF9SQ0NfU01QU19ESVZfMCAgICAgICAgICAgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAwICovCisjZGVmaW5lIFJDQ19TTVBTQ0xLRElWX1JBTkdFMSAgICAgICAgICAgTExfUkNDX1NNUFNfRElWXzEgICAgICAgICAgICAvKiE8IFBMTE0gZGl2aXNpb24gZmFjdG9yID0gMSAqLworI2RlZmluZSBSQ0NfU01QU0NMS0RJVl9SQU5HRTIgICAgICAgICAgIExMX1JDQ19TTVBTX0RJVl8yICAgICAgICAgICAgLyohPCBQTExNIGRpdmlzaW9uIGZhY3RvciA9IDIgKi8KKyNkZWZpbmUgUkNDX1NNUFNDTEtESVZfUkFOR0UzICAgICAgICAgICBMTF9SQ0NfU01QU19ESVZfMyAgICAgICAgICAgIC8qITwgUExMTSBkaXZpc2lvbiBmYWN0b3IgPSAzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRVhUSV9MSU5FX0xTRUNTUyAgUkNDIExTRSBDU1MgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUKKyAgKiBAeworICAqLworI2RlZmluZSAgUkNDX0VYVElfTElORV9MU0VDU1MgICAgICAgICAgRVhUSV9JTVIxX0lNMTggICAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOCBjb25uZWN0ZWQgdG8gdGhlIExTRSBDU1MgRVhUSSBMaW5lICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfU3RhdHVzIFJDQ0V4IENSUyBTdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JTX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IENSUyBzdGF0dXMgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfVElNRU9VVCAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgIC8qITwgQ1JTIHN0YXR1cyB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DT0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgLyohPCBDUlMgc3RhdHVzIHN5bmNocm9uaXphdGlvbiBzdWNjZXNzICAgICAgICAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNXQVJOICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgICAgICAgICAgICAvKiE8IENSUyBzdGF0dXMgc3luY2hyb25pemF0aW9uIHdhcm5pbmcgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ0VSUiAgICAgICAgICAgICAgICAweDAwMDAwMDA4VSAgICAgICAgICAgIC8qITwgQ1JTIHN0YXR1cyBzeW5jaHJvbml6YXRpb24gZXJyb3IgICAgICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DTUlTUyAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVICAgICAgICAgICAgLyohPCBDUlMgc3RhdHVzIHN5bmNocm9uaXphdGlvbiBtaXNzZWQgICAgICAgICAqLworI2RlZmluZSBSQ0NfQ1JTX1RSSU1PVkYgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFUgICAgICAgICAgICAvKiE8IENSUyBzdGF0dXMgdHJpbW1pbmcgb3ZlcmZsb3cgb3IgdW5kZXJmbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0NSU19TeW5jaHJvU291cmNlIFJDQ0V4IENSUyBTeW5jaHJvU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9HUElPICAgICAgIExMX0NSU19TWU5DX1NPVVJDRV9HUElPICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIEdQSU8gKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX1NPVVJDRV9MU0UgICAgICAgIExMX0NSU19TWU5DX1NPVVJDRV9MU0UgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgc291cmNlIExTRSAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfU09VUkNFX1VTQiAgICAgICAgTExfQ1JTX1NZTkNfU09VUkNFX1VTQiAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgVVNCIFNPRiAoZGVmYXVsdCkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfU3luY2hyb0RpdmlkZXIgUkNDRXggQ1JTIFN5bmNocm9EaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjEgICAgICAgIExMX0NSU19TWU5DX0RJVl8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBub3QgZGl2aWRlZCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjIgICAgICAgIExMX0NSU19TWU5DX0RJVl8yICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjQgICAgICAgIExMX0NSU19TWU5DX0RJVl80ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjggICAgICAgIExMX0NSU19TWU5DX0RJVl84ICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjE2ICAgICAgIExMX0NSU19TWU5DX0RJVl8xNiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIFJDQ19DUlNfU1lOQ19ESVYzMiAgICAgICBMTF9DUlNfU1lOQ19ESVZfMzIgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfRElWNjQgICAgICAgTExfQ1JTX1NZTkNfRElWXzY0ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgUkNDX0NSU19TWU5DX0RJVjEyOCAgICAgIExMX0NSU19TWU5DX0RJVl8xMjggICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfU3luY2hyb1BvbGFyaXR5IFJDQ0V4IENSUyBTeW5jaHJvUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HICAgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HICAgICAgICAvKiE8IFN5bmNocm8gQWN0aXZlIG9uIHJpc2luZyBlZGdlIChkZWZhdWx0KSAqLworI2RlZmluZSBSQ0NfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgICAgICAvKiE8IFN5bmNocm8gQWN0aXZlIG9uIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfUmVsb2FkVmFsdWVEZWZhdWx0IFJDQ0V4IENSUyBSZWxvYWRWYWx1ZURlZmF1bHQKKyAgKiBAeworICAqLworI2RlZmluZSBSQ0NfQ1JTX1JFTE9BRFZBTFVFX0RFRkFVTFQgICAgTExfQ1JTX1JFTE9BRFZBTFVFX0RFRkFVTFQgLyohPCBUaGUgcmVzZXQgdmFsdWUgb2YgdGhlIFJFTE9BRCBmaWVsZCBjb3JyZXNwb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIHRhcmdldCBmcmVxdWVuY3kgb2YgNDggTUh6IGFuZCBhIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJlcXVlbmN5IG9mIDEga0h6IChTT0Ygc2lnbmFsIGZyb20gVVNCKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0Vycm9yTGltaXREZWZhdWx0IFJDQ0V4IENSUyBFcnJvckxpbWl0RGVmYXVsdAorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DUlNfRVJST1JMSU1JVF9ERUZBVUxUICAgICBMTF9DUlNfRVJST1JMSU1JVF9ERUZBVUxUIC8qITwgRGVmYXVsdCBGcmVxdWVuY3kgZXJyb3IgbGltaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25EZWZhdWx0IFJDQ0V4IENSUyBIU0k0OENhbGlicmF0aW9uRGVmYXVsdAorICAqIEB7CisgICovCisjZGVmaW5lIFJDQ19DUlNfSFNJNDhDQUxJQlJBVElPTl9ERUZBVUxUIExMX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgLyohPCBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIG1pZGRsZSBvZiB0aGUgdHJpbW1pbmcgaW50ZXJ2YWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHJpbW1pbmcgc3RlcCBpcyBhcm91bmQgNjcga0h6IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIFRSSU0gc3RlcHMuIEEgaGlnaGVyIFRSSU0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGEgaGlnaGVyIG91dHB1dCBmcmVxdWVuY3kgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfQ1JTX0ZyZXFFcnJvckRpcmVjdGlvbiBSQ0NFeCBDUlMgRnJlcUVycm9yRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19GUkVRRVJST1JESVJfVVAgICAgICAgIExMX0NSU19GUkVRX0VSUk9SX0RJUl9VUCAgIC8qITwgVXBjb3VudGluZyBkaXJlY3Rpb24sIHRoZSBhY3R1YWwgZnJlcXVlbmN5IGlzIGFib3ZlIHRoZSB0YXJnZXQgKi8KKyNkZWZpbmUgUkNDX0NSU19GUkVRRVJST1JESVJfRE9XTiAgICAgIExMX0NSU19GUkVRX0VSUk9SX0RJUl9ET1dOIC8qITwgRG93bmNvdW50aW5nIGRpcmVjdGlvbiwgdGhlIGFjdHVhbCBmcmVxdWVuY3kgaXMgYmVsb3cgdGhlIHRhcmdldCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfSW50ZXJydXB0X1NvdXJjZXMgUkNDRXggQ1JTIEludGVycnVwdCBTb3VyY2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9TWU5DT0sgICAgICAgICAgICAgIExMX0NSU19DUl9TWU5DT0tJRSAgICAgICAvKiE8IFNZTkMgZXZlbnQgT0sgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9TWU5DV0FSTiAgICAgICAgICAgIExMX0NSU19DUl9TWU5DV0FSTklFICAgICAvKiE8IFNZTkMgd2FybmluZyAqLworI2RlZmluZSBSQ0NfQ1JTX0lUX0VSUiAgICAgICAgICAgICAgICAgTExfQ1JTX0NSX0VSUklFICAgICAgICAgIC8qITwgRXJyb3IgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9FU1lOQyAgICAgICAgICAgICAgIExMX0NSU19DUl9FU1lOQ0lFICAgICAgICAvKiE8IEV4cGVjdGVkIFNZTkMgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9TWU5DRVJSICAgICAgICAgICAgIExMX0NSU19DUl9FUlJJRSAgICAgICAgICAvKiE8IFNZTkMgZXJyb3IgKi8KKyNkZWZpbmUgUkNDX0NSU19JVF9TWU5DTUlTUyAgICAgICAgICAgIExMX0NSU19DUl9FUlJJRSAgICAgICAgICAvKiE8IFNZTkMgbWlzc2VkICovCisjZGVmaW5lIFJDQ19DUlNfSVRfVFJJTU9WRiAgICAgICAgICAgICBMTF9DUlNfQ1JfRVJSSUUgICAgICAgICAgLyohPCBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfRmxhZ3MgUkNDRXggQ1JTIEZsYWdzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNPSyAgICAgICAgICAgIExMX0NSU19JU1JfU1lOQ09LRiAgICAgICAvKiE8IFNZTkMgZXZlbnQgT0sgZmxhZyAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX1NZTkNXQVJOICAgICAgICAgIExMX0NSU19JU1JfU1lOQ1dBUk5GICAgICAvKiE8IFNZTkMgd2FybmluZyBmbGFnICAgICAgKi8KKyNkZWZpbmUgUkNDX0NSU19GTEFHX0VSUiAgICAgICAgICAgICAgIExMX0NSU19JU1JfRVJSRiAgICAgICAgICAvKiE8IEVycm9yIGZsYWcgICAgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19FU1lOQyAgICAgICAgICAgICBMTF9DUlNfSVNSX0VTWU5DRiAgICAgICAgLyohPCBFeHBlY3RlZCBTWU5DIGZsYWcgICAgICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19TWU5DRVJSICAgICAgICAgICBMTF9DUlNfSVNSX1NZTkNFUlIgICAgICAgLyohPCBTWU5DIGVycm9yICovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19TWU5DTUlTUyAgICAgICAgICBMTF9DUlNfSVNSX1NZTkNNSVNTICAgICAgLyohPCBTWU5DIG1pc3NlZCovCisjZGVmaW5lIFJDQ19DUlNfRkxBR19UUklNT1ZGICAgICAgICAgICBMTF9DUlNfSVNSX1RSSU1PVkYgICAgICAgLyohPCBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfTWFjcm9zIFJDQ0V4IEV4cG9ydGVkIE1hY3JvcworICogQHsKKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMU0FJMSBjbG9jayBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZmFjdG9ycy4KKyAgKgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTExTQUkxIGlzIGRpc2FibGVkLgorICAqIEBub3RlICAgUExMU0FJMSBjbG9jayBzb3VyY2UgaXMgY29tbW9uIHdpdGggdGhlIG1haW4gUExMIChjb25maWd1cmVkIHRocm91Z2gKKyAgKiAgICAgICAgIEByZWYgX19IQUxfUkNDX1BMTF9DT05GSUcoKSBtYWNybykKKyAgKgorICAqIEBwYXJhbSAgX19QTExOX18gc3BlY2lmaWVzIHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTFNBSTEgVkNPIG91dHB1dCBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiA0IGFuZCA4Ni4KKyAgKiBAbm90ZSAgIFlvdSBoYXZlIHRvIHNldCB0aGUgUExMTiBwYXJhbWV0ZXIgY29ycmVjdGx5IHRvIGVuc3VyZSB0aGF0IHRoZSBWQ08KKyAgKiAgICAgICAgIG91dHB1dCBmcmVxdWVuY3kgaXMgYmV0d2VlbiA2NCBhbmQgMzQ0IE1Iei4KKyAgKiAgICAgICAgIFBMTFNBSTEgY2xvY2sgZnJlcXVlbmN5ID0gZihQTExTQUkxKSBtdWx0aXBsaWVkIGJ5IFBMTE4KKyAgKgorICAqIEBwYXJhbSAgX19QTExQX18gc3BlY2lmaWVzIHRoZSBkaXZpc2lvbiBmYWN0b3IgZm9yIFNBSSBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIChSQ0NfUExMUF9ESVYyIHRvIFJDQ19QTExQX0RJVjMyKS4KKyAgKiAgICAgICAgIFNBSSBjbG9jayBmcmVxdWVuY3kgPSBmKFBMTFNBSTEpIC8gUExMUAorICAqCisgICogQHBhcmFtICBfX1BMTFFfXyBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgVVNCL1JORyBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgaW4gdGhlIHJhbmdlIChSQ0NfUExMUV9ESVYyIHRvIFJDQ19QTExRX0RJVjgpLgorICAqICAgICAgICAgVVNCL1JORyBjbG9jayBmcmVxdWVuY3kgPSBmKFBMTFNBSTEpIC8gUExMUQorICAqCisgICogQHBhcmFtICBfX1BMTFJfXyBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgU0FSIEFEQyBjbG9jay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgaW4gdGhlIHJhbmdlIChSQ0NfUExMUl9ESVYyIHRvIFJDQ19QTExSX0RJVjgpLgorICAqICAgICAgICAgQURDIGNsb2NrIGZyZXF1ZW5jeSA9IGYoUExMU0FJMSkgLyBQTExSCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfQ09ORklHKF9fUExMTl9fLCBfX1BMTFBfXywgX19QTExRX18sIF9fUExMUl9fKSBcCisgICAgICAgICAgICAgICAgICBNT0RJRllfUkVHKFJDQy0+UExMU0FJMUNGR1IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExOIHwgUkNDX1BMTFNBSTFDRkdSX1BMTFAgfCBSQ0NfUExMU0FJMUNGR1JfUExMUSB8IFJDQ19QTExTQUkxQ0ZHUl9QTExSKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1BMTE5fXykgPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgKF9fUExMUF9fKSB8IChfX1BMTFFfXykgfCAoX19QTExSX18pKSkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFBMTFNBSTEgY2xvY2sgbXVsdGlwbGljYXRpb24gZmFjdG9yIE4uCisgICoKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgUExMU0FJMSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIFBMTFNBSTEgY2xvY2sgc291cmNlIGlzIGNvbW1vbiB3aXRoIHRoZSBtYWluIFBMTCAoY29uZmlndXJlZCB0aHJvdWdoCisgICogICAgICAgICBAcmVmIF9fSEFMX1JDQ19QTExfQ09ORklHKCkgbWFjcm8pCisgICoKKyAgKiBAcGFyYW0gIF9fUExMTl9fIHNwZWNpZmllcyB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBQTExTQUkxIFZDTyBvdXRwdXQgY2xvY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTQgYW5kIE1heF9EYXRhPTg2LgorICAqIEBub3RlICAgWW91IGhhdmUgdG8gc2V0IHRoZSBQTExOIHBhcmFtZXRlciBjb3JyZWN0bHkgdG8gZW5zdXJlIHRoYXQgdGhlIFZDTworICAqICAgICAgICAgb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6LgorICAqICAgICAgICAgVXNlIHRvIHNldCBQTExTQUkxIGNsb2NrIGZyZXF1ZW5jeSA9IGYoUExMU0FJMSkgbXVsdGlwbGllZCBieSBQTExOCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfTVVMTl9DT05GSUcoX19QTExOX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTE4sIChfX1BMTE5fXykgPDwgUkNDX1BMTFNBSTFDRkdSX1BMTE5fUG9zKQorCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMU0FJMSBjbG9jayBkaXZpc2lvbiBmYWN0b3IgUC4KKyAgKgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTExTQUkxIGlzIGRpc2FibGVkLgorICAqIEBub3RlICAgUExMU0FJMSBjbG9jayBzb3VyY2UgaXMgY29tbW9uIHdpdGggdGhlIG1haW4gUExMIChjb25maWd1cmVkIHRocm91Z2gKKyAgKiAgICAgICAgIEByZWYgX19IQUxfUkNDX1BMTF9DT05GSUcoKSBtYWNybykKKyAgKgorICAqIEBwYXJhbSAgX19QTExQX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBTQUkgY2xvY2suCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBpbiByYW5nZSAoUkNDX1BMTFBfRElWMiB0byBSQ0NfUExMUF9ESVYzMikuCisgICogICAgICAgICAgICAgICAgICAgVXNlIHRvIHNldCBTQUkgY2xvY2sgZnJlcXVlbmN5ID0gZihQTExTQUkxKSAvIFBMTFAKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMV9ESVZQX0NPTkZJRyhfX1BMTFBfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUCwgKF9fUExMUF9fKSkKKworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFBMTFNBSTEgY2xvY2sgZGl2aXNpb24gZmFjdG9yIFEuCisgICoKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgUExMU0FJMSBpcyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIFBMTFNBSTEgY2xvY2sgc291cmNlIGlzIGNvbW1vbiB3aXRoIHRoZSBtYWluIFBMTCAoY29uZmlndXJlZCB0aHJvdWdoCisgICogICAgICAgICBAcmVmIF9fSEFMX1JDQ19QTExfQ09ORklHKCkgbWFjcm8pCisgICoKKyAgKiBAcGFyYW0gIF9fUExMUV9fICBzcGVjaWZpZXMgdGhlIGRpdmlzaW9uIGZhY3RvciBmb3IgVVNCIGNsb2NrLgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgaW4gdGhlIHJhbmdlIChSQ0NfUExMUV9ESVYyIHRvIFJDQ19QTExRX0RJVjgpLgorICAqICAgICAgICAgICAgICAgICAgIFVzZSB0byBzZXQgVVNCIGNsb2NrIGZyZXF1ZW5jeSA9IGYoUExMU0FJMSkgLyBQTExRCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfRElWUV9DT05GSUcoX19QTExRX18pIFwKKyAgICAgICAgICAgICAgICAgIE1PRElGWV9SRUcoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTFEsIChfX1BMTFFfXykpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgUExMU0FJMSBjbG9jayBkaXZpc2lvbiBmYWN0b3IgUi4KKyAgKgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBQTExTQUkxIGlzIGRpc2FibGVkLgorICAqIEBub3RlICAgUExMU0FJMSBjbG9jayBzb3VyY2UgaXMgY29tbW9uIHdpdGggdGhlIG1haW4gUExMIChjb25maWd1cmVkIHRocm91Z2gKKyAgKiAgICAgICAgIEByZWYgX19IQUxfUkNDX1BMTF9DT05GSUcoKSBtYWNybykKKyAgKgorICAqIEBwYXJhbSAgX19QTExSX18gIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBBREMgY2xvY2suCisgICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgKFJDQ19QTExSX0RJVjIgdG8gUkNDX1BMTFJfRElWOCkuCisgICogICAgICAgICAgICAgICAgICAgVXNlIHRvIHNldCBBREMgY2xvY2sgZnJlcXVlbmN5ID0gZihQTExTQUkxKSAvIFBMTFIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMV9ESVZSX0NPTkZJRyhfX1BMTFJfXykgXAorICAgICAgICAgICAgICAgICAgTU9ESUZZX1JFRyhSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUiwgKF9fUExMUl9fKSkKKworLyoqCisgICogQGJyaWVmICBNYWNyb3MgdG8gZW5hYmxlIHRoZSBQTExTQUkxLgorICAqIEBub3RlICAgVGhlIFBMTFNBSTEgaXMgZGlzYWJsZWQgYnkgaGFyZHdhcmUgd2hlbiBlbnRlcmluZyBTVE9QIGFuZCBTVEFOREJZIG1vZGVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMV9FTkFCTEUoKSAgTExfUkNDX1BMTFNBSTFfRW5hYmxlKCkKKworLyoqCisgICogQGJyaWVmICBNYWNyb3MgdG8gZGlzYWJsZSB0aGUgUExMU0FJMS4KKyAgKiBAbm90ZSAgIFRoZSBQTExTQUkxIGlzIGRpc2FibGVkIGJ5IGhhcmR3YXJlIHdoZW4gZW50ZXJpbmcgU1RPUCBhbmQgU1RBTkRCWSBtb2Rlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfRElTQUJMRSgpIExMX1JDQ19QTExTQUkxX0Rpc2FibGUoKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvcyB0byBlbmFibGUgZWFjaCBjbG9jayBvdXRwdXQgKFJDQ19QTExTQUkxX1NBSTFDTEssIFJDQ19QTExTQUkxX1VTQkNMSyBhbmQgUkNDX1BMTFNBSTFfQURDQ0xLKS4KKyAgKiBAbm90ZSAgIEVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhvc2UgY2xvY2tzIGNhbiBiZSBkb25lIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3RvcCB0aGUgUExMLgorICAqICAgICAgICAgVGhpcyBpcyBtYWlubHkgdXNlZCB0byBzYXZlIFBvd2VyLgorICAqIEBwYXJhbSAgX19QTExTQUkxX0NMT0NLT1VUX18gc3BlY2lmaWVzIHRoZSBQTExTQUkxIGNsb2NrIHRvIGJlIG91dHB1dC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9TQUkxQ0xLICBUaGlzIGNsb2NrIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYWNjdXJhdGUgY2xvY2sgdG8gYWNoaWV2ZSBoaWdoLXF1YWxpdHkgYXVkaW8gcGVyZm9ybWFuY2Ugb24gU0FJIGludGVyZmFjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTQUkxX0FEQ0NMSyAgQ2xvY2sgdXNlZCB0byBjbG9jayBBREMgcGVyaXBoZXJhbAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QTExTQUkxX1VTQkNMSyAgVGhpcyBjbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFVTQiBEZXZpY2UgKDQ4IE1IeikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9STkdDTEsgc2FtZSBhcyBSQ0NfUExMU0FJMV9VU0JDTEsKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMUNMS09VVF9FTkFCTEUoX19QTExTQUkxX0NMT0NLT1VUX18pICAgU0VUX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCAoX19QTExTQUkxX0NMT0NLT1VUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvcyB0byBkaXNhYmxlIGVhY2ggY2xvY2sgb3V0cHV0IChSQ0NfUExMU0FJMV9TQUkxQ0xLLCBSQ0NfUExMU0FJMV9VU0JDTEsgYW5kIFJDQ19QTExTQUkxX0FEQ0NMSykuCisgICogQG5vdGUgICBFbmFibGluZyBhbmQgZGlzYWJsaW5nIHRob3NlIGNsb2NrcyBjYW4gYmUgZG9uZSB3aXRob3V0IHRoZSBuZWVkIHRvIHN0b3AgdGhlIFBMTC4KKyAgKiAgICAgICAgIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gc2F2ZSBQb3dlci4KKyAgKiBAcGFyYW0gIF9fUExMU0FJMV9DTE9DS09VVF9fIHNwZWNpZmllcyB0aGUgUExMU0FJMSBjbG9jayB0byBiZSBvdXRwdXQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNBSTFfU0FJMUNMSyAgVGhpcyBjbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIGFuIGFjY3VyYXRlIGNsb2NrIHRvIGFjaGlldmUgaGlnaC1xdWFsaXR5IGF1ZGlvIHBlcmZvcm1hbmNlIG9uIFNBSSBpbnRlcmZhY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9BRENDTEsgIENsb2NrIHVzZWQgdG8gY2xvY2sgQURDIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9VU0JDTEsgIFRoaXMgY2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0IgRGV2aWNlICg0OCBNSHopCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNBSTFfUk5HQ0xLICBzYW1lIGFzIFJDQ19QTExTQUkxX1VTQkNMSworICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19QTExTQUkxQ0xLT1VUX0RJU0FCTEUoX19QTExTQUkxX0NMT0NLT1VUX18pICBDTEVBUl9CSVQoUkNDLT5QTExTQUkxQ0ZHUiwgKF9fUExMU0FJMV9DTE9DS09VVF9fKSkKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBnZXQgY2xvY2sgb3V0cHV0IGVuYWJsZSBzdGF0dXMgKFJDQ19QTExTQUkxX1NBSTFDTEssIFJDQ19QTExTQUkxX1VTQkNMSyBhbmQgUkNDX1BMTFNBSTFfQURDQ0xLKS4KKyAgKiBAcGFyYW0gIF9fUExMU0FJMV9DTE9DS09VVF9fIHNwZWNpZmllcyB0aGUgUExMU0FJMSBjbG9jayB0byBiZSBvdXRwdXQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNBSTFfU0FJMUNMSyAgVGhpcyBjbG9jayBpcyB1c2VkIHRvIGdlbmVyYXRlIGFuIGFjY3VyYXRlIGNsb2NrIHRvIGFjaGlldmUgaGlnaC1xdWFsaXR5IGF1ZGlvIHBlcmZvcm1hbmNlIG9uIFNBSSBpbnRlcmZhY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9BRENDTEsgIENsb2NrIHVzZWQgdG8gY2xvY2sgQURDIHBlcmlwaGVyYWwKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUExMU0FJMV9VU0JDTEsgIFRoaXMgY2xvY2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0IgRGV2aWNlICg0OCBNSHopCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BMTFNBSTFfUk5HQ0xLICBzYW1lIGFzIFJDQ19QTExTQUkxX1VTQkNMSworICAqIEByZXR2YWwgU0VUIC8gUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9QTExTQUkxQ0xLT1VUX0NPTkZJRyhfX1BMTFNBSTFfQ0xPQ0tPVVRfXykgIFJFQURfQklUKFJDQy0+UExMU0FJMUNGR1IsIChfX1BMTFNBSTFfQ0xPQ0tPVVRfXykpCisKKworLyoqCisgICogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFNBSTEgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19TQUkxX0NMS1NPVVJDRV9fIGRlZmluZXMgdGhlIFNBSTEgY2xvY2sgc291cmNlLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQKKyAgKiAgICAgICAgIGZyb20gdGhlIFBMTFNBSTEsIHN5c3RlbSBQTEwsIEhTSSBvciBleHRlcm5hbCBjbG9jayAodGhyb3VnaCBhIGRlZGljYXRlZCBwaW4pLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1BMTFNBSTEgICAgU0FJMSBjbG9jayA9IFBMTFNBSTEgIlAiIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1BMTCAgICAgICAgU0FJMSBjbG9jayAgPSBQTEwgIlAiIGNsb2NrCisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX0hTSSAgICAgICAgU0FJMSBjbG9jayAgPSBIU0kgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfUElOICAgICAgICBTQUkxIGNsb2NrID0gRXh0ZXJuYWwgQ2xvY2sgKFNBSTFfRVhUQ0xLKQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TQUkxX0NPTkZJRyhfX1NBSTFfQ0xLU09VUkNFX18pICBMTF9SQ0NfU2V0U0FJQ2xvY2tTb3VyY2UoX19TQUkxX0NMS1NPVVJDRV9fKQorCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgU0FJMSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TQUkxQ0xLU09VUkNFX1BMTFNBSTEgICAgIFNBSTEgY2xvY2sgPSBQTExTQUkxICJQIiBjbG9jaworICAqICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU0FJMUNMS1NPVVJDRV9QTEwgICAgICAgICBTQUkxIGNsb2NrICA9IFBMTCAiUCIgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfSFNJICAgICAgICAgU0FJMSBjbG9jayAgPSBIU0kgY2xvY2sKKyAgKiAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NBSTFDTEtTT1VSQ0VfUElOICAgICAgICAgU0FJMSBjbG9jayA9IEV4dGVybmFsIENsb2NrIChTQUkxX0VYVENMSykKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1NBSTFfU09VUkNFKCkgIExMX1JDQ19HZXRTQUlDbG9ja1NvdXJjZShMTF9SQ0NfU0FJMV9DTEtTT1VSQ0UpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgSTJDMSBjbG9jayAoSTJDMUNMSykuCisgICoKKyAgKiBAcGFyYW0gIF9fSTJDMV9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIEkyQzEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfUENMSzEgICBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfSFNJICAgICBIU0kgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0kyQzFfQ09ORklHKF9fSTJDMV9DTEtTT1VSQ0VfXykgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlKF9fSTJDMV9DTEtTT1VSQ0VfXykKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBJMkMxIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9QQ0xLMSAgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDMUNMS1NPVVJDRV9IU0kgICAgIEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzFDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCkgTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBJMkMzIGNsb2NrIChJMkMzQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19JMkMzX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgSTJDMyBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9QQ0xLMSAgIFBDTEsxIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9IU0kgICAgIEhTSSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0kyQzNDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfSTJDM19DT05GSUcoX19JMkMzX0NMS1NPVVJDRV9fKSBMTF9SQ0NfU2V0STJDQ2xvY2tTb3VyY2UoX19JMkMzX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEkyQzMgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX1BDTEsxICAgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19JMkMzQ0xLU09VUkNFX0hTSSAgICAgSFNJIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfSTJDM0NMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfSTJDM19TT1VSQ0UoKSBMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UoTExfUkNDX0kyQzNfQ0xLU09VUkNFKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayAoVVNBUlQxQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19VU0FSVDFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0FSVDEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMiAgIFBDTEsyIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJICAgICBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9TWVNDTEsgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX0xTRSAgICAgTFNFIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhfX1VTQVJUMV9DTEtTT1VSQ0VfXykgTExfUkNDX1NldFVTQVJUQ2xvY2tTb3VyY2UoX19VU0FSVDFfQ0xLU09VUkNFX18pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgVVNBUlQxIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyICAgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1VTQVJUMUNMS1NPVVJDRV9IU0kgICAgIEhTSSBzZWxlY3RlZCBhcyBVU0FSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIFVTQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFICAgICBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpIExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIExQVUFSVCBjbG9jayAoTFBVQVJUQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19MUFVBUlRfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBMUFVBUlQgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEgICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJICAgICBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgICAgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MUFVBUlQxX0NPTkZJRyhfX0xQVUFSVF9DTEtTT1VSQ0VfXykgTExfUkNDX1NldExQVUFSVENsb2NrU291cmNlKF9fTFBVQVJUX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVUFSVCBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfUENMSzEgICBQQ0xLMSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVUFSVDFDTEtTT1VSQ0VfSFNJICAgICBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSyAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBVQVJUMUNMS1NPVVJDRV9MU0UgICAgIExTRSBzZWxlY3RlZCBhcyBMUFVBUlQxIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tTb3VyY2UoTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFKQorCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIExQVElNMSBjbG9jayAoTFBUSU0xQ0xLKS4KKyAgKgorICAqIEBwYXJhbSAgX19MUFRJTTFfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBMUFRJTTEgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgUENMSyBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgIEhTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgIExTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgIExTRSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xQVElNMV9DT05GSUcoX19MUFRJTTFfQ0xLU09VUkNFX18pIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlKF9fTFBUSU0xX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMSAgUENMSyBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTSSAgIEhTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0hTSSAgIFN5c3RlbSBDbG9jayBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0xQ0xLU09VUkNFX0xTRSAgIExTRSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCkgTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgTFBUSU0yIGNsb2NrIChMUFRJTTJDTEspLgorICAqCisgICogQHBhcmFtICBfX0xQVElNMl9DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIExQVElNMiBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxICBQQ0xLIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNJICAgSFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfSFNJICAgTFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFICAgTFNFIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFBUSU0yX0NPTkZJRyhfX0xQVElNMl9DTEtTT1VSQ0VfXykgTExfUkNDX1NldExQVElNQ2xvY2tTb3VyY2UoX19MUFRJTTJfQ0xLU09VUkNFX18pCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGdldCB0aGUgTFBUSU0yIGNsb2NrIHNvdXJjZS4KKyAgKiBAcmV0dmFsIFRoZSBjbG9jayBzb3VyY2UgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFBUSU0yQ0xLU09VUkNFX1BDTEsxICBQQ0xLIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNJICAgSFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfSFNJICAgU3lzdGVtIENsb2NrIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MUFRJTTJDTEtTT1VSQ0VfTFNFICAgTFNFIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX0xQVElNMl9TT1VSQ0UoKSBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRSkKKworCisvKiogQGJyaWVmICBNYWNybyB0byBjb25maWd1cmUgdGhlIFJORyBjbG9jay4KKyAgKgorICAqIEBub3RlICBVU0IgYW5kIFJORyBwZXJpcGhlcmFscyBzaGFyZSB0aGUgc2FtZSA0OE1IeiBjbG9jayBzb3VyY2UuCisgICoKKyAgKiBAcGFyYW0gIF9fUk5HX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgUk5HIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9DTEs0OCAgICBDTEs0OCBkaXZpZGVkIGJ5IDMgc2VsZWN0ZWQgYXMgUk5HIENsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9MU0kgICAgICBMU0kgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9MU0UgICAgICBMU0Ugc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19STkdfQ09ORklHKF9fUk5HX0NMS1NPVVJDRV9fKSAgTExfUkNDX1NldFJOR0Nsb2NrU291cmNlKF9fUk5HX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFJORyBjbG9jay4gICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9DTEs0OCAgICBDTEs0OCBkaXZpZGVkIGJ5IDMgc2VsZWN0ZWQgYXMgUk5HIENsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9MU0kgICAgICBMU0kgc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JOR0NMS1NPVVJDRV9MU0UgICAgICBMU0Ugc2VsZWN0ZWQgYXMgUk5HIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfUk5HX1NPVVJDRSgpIExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZShMTF9SQ0NfUk5HX0NMS1NPVVJDRSkKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgVVNCIGNsb2NrIChVU0JDTEspLgorICAqCisgICogQG5vdGUgIFVTQiBhbmQgUk5HIHBlcmlwaGVyYWxzIHNoYXJlIHRoZSBzYW1lIDQ4TUh6IGNsb2NrIHNvdXJjZS4KKyAgKgorICAqIEBwYXJhbSAgX19VU0JfQ0xLU09VUkNFX18gc3BlY2lmaWVzIHRoZSBVU0IgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX0hTSTQ4ICAgIEhTSTQ4IHNlbGVjdGVkIGFzIDQ4TUh6IGNsb2NrIGZvciBkZXZpY2VzIHdpdGggSFNJNDgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX01TSSAgICAgIE1TSSBzZWxlY3RlZCBhcyBVU0IgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTFNBSTEgIFBMTFNBSTEgIlEiIGNsb2NrIChQTEw0OE0yQ0xLKSBzZWxlY3RlZCBhcyBVU0IgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfVVNCQ0xLU09VUkNFX1BMTCAgICAgIFBMTCAiUSIgY2xvY2sgKFBMTDQ4TTFDTEspIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhfX1VTQl9DTEtTT1VSQ0VfXykgIExMX1JDQ19TZXRVU0JDbG9ja1NvdXJjZShfX1VTQl9DTEtTT1VSQ0VfXykKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBVU0IgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgVGhlIGNsb2NrIHNvdXJjZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0JDTEtTT1VSQ0VfSFNJNDggICAgSFNJNDggc2VsZWN0ZWQgYXMgNDhNSHogY2xvY2sgZm9yIGRldmljZXMgd2l0aCBIU0k0OAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0JDTEtTT1VSQ0VfTVNJICAgICAgTVNJIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0JDTEtTT1VSQ0VfUExMU0FJMSAgUExMU0FJMSAiUSIgY2xvY2sgKFBMTDQ4TTJDTEspIHNlbGVjdGVkIGFzIFVTQiBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19VU0JDTEtTT1VSQ0VfUExMICAgICAgUExMICJRIiBjbG9jayAoUExMNDhNMUNMSykgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpICBMTF9SQ0NfR2V0VVNCQ2xvY2tTb3VyY2UoTExfUkNDX1VTQl9DTEtTT1VSQ0UpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgQURDIGludGVyZmFjZSBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQURDX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgQURDIGRpZ2l0YWwgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQ0NMS1NPVVJDRV9OT05FICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfUExMU0FJMSAgUExMU0FJMSBDbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDQ0xLU09VUkNFX1BMTCAgUExMIENsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgQURDIGNsb2NrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19BRENfQ09ORklHKF9fQURDX0NMS1NPVVJDRV9fKSAgTExfUkNDX1NldEFEQ0Nsb2NrU291cmNlKF9fQURDX0NMS1NPVVJDRV9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIEFEQyBjbG9jayBzb3VyY2UuCisgICogQHJldHZhbCBUaGUgY2xvY2sgc291cmNlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0FEQ0NMS1NPVVJDRV9OT05FICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfUExMU0FJMSAgUExMU0FJMSBDbG9jayBzZWxlY3RlZCBhcyBBREMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQURDQ0xLU09VUkNFX1BMTCAgUExMIENsb2NrIHNlbGVjdGVkIGFzIEFEQyBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19BRENDTEtTT1VSQ0VfU1lTQ0xLICBTeXN0ZW0gQ2xvY2sgc2VsZWN0ZWQgYXMgQURDIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfQURDX1NPVVJDRSgpIExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZShMTF9SQ0NfQURDX0NMS1NPVVJDRSkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBSRldLUCBpbnRlcmZhY2UgY2xvY2suCisgICogQHBhcmFtICBfX1JGV0tQX0NMS1NPVVJDRV9fIHNwZWNpZmllcyB0aGUgUkZXS1AgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUkZXS1BDTEtTT1VSQ0VfTk9ORSAgICAgICAgIE5vIGNsb2NrIHNlbGVjdGVkIGFzIFJGV0tQIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JGV0tQQ0xLU09VUkNFX0xTRSAgICAgICAgICBMU0UgQ2xvY2sgc2VsZWN0ZWQgYXMgUkZXS1AgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUkZXS1BDTEtTT1VSQ0VfTFNJICAgICAgICAgIExTSSBDbG9jayBzZWxlY3RlZCBhcyBSRldLUCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SRldLUENMS1NPVVJDRV9IU0VfRElWMTAyNCAgSFNFIGRpdjEwMjQgQ2xvY2sgc2VsZWN0ZWQgYXMgUkZXS1AgY2xvY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1JGV0FLRVVQX0NPTkZJRyhfX1JGV0tQX0NMS1NPVVJDRV9fKSAgTExfUkNDX1NldFJGV0tQQ2xvY2tTb3VyY2UoX19SRldLUF9DTEtTT1VSQ0VfXykKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBSRldLUCBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SRldLUENMS1NPVVJDRV9OT05FICAgICAgICAgTm8gY2xvY2sgc2VsZWN0ZWQgYXMgUkZXS1AgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUkZXS1BDTEtTT1VSQ0VfTFNFICAgICAgICAgIExTRSBDbG9jayBzZWxlY3RlZCBhcyBSRldLUCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19SRldLUENMS1NPVVJDRV9MU0kgICAgICAgICAgTFNJIENsb2NrIHNlbGVjdGVkIGFzIFJGV0tQIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1JGV0tQQ0xLU09VUkNFX0hTRV9ESVYxMDI0ICBIU0UgZGl2MTAyNCBDbG9jayBzZWxlY3RlZCBhcyBSRldLUCBjbG9jaworICAqLworI2RlZmluZSBfX0hBTF9SQ0NfR0VUX1JGV0FLRVVQX1NPVVJDRSgpICBMTF9SQ0NfR2V0UkZXS1BDbG9ja1NvdXJjZSgpCisKKy8qKiBAYnJpZWYgIE1hY3JvIHRvIGNvbmZpZ3VyZSB0aGUgU01QUyBjbG9jayBkaXZpc2lvbiBmYWN0b3IuCisgICoKKyAgKiBAcGFyYW0gIF9fU01QU0NMS0RJVl9fIHNwZWNpZmllcyB0aGUgZGl2aXNpb24gZmFjdG9yIGZvciBTTVBTIGNsb2NrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS0RJVl9SQU5HRTAgICAgICAgICAgIDFzdCBkaXZpZGVyIGZhY3RvciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TTVBTQ0xLRElWX1JBTkdFMSAgICAgICAgICAgMm5kIGRpdmlkZXIgZmFjdG9yIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtESVZfUkFOR0UyICAgICAgICAgICAzdGggZGl2aWRlciBmYWN0b3IgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS0RJVl9SQU5HRTMgICAgICAgICAgIDR0aCBkaXZpZGVyIGZhY3RvciB2YWx1ZQorICAqCisgICogQG5vdGUgZGl2aWRlciB2YWx1ZSBwcmVkZWZpbmVkIGJ5IEhXIGRlcGVuZGluZyBvZiBTTVBTIGNsb2NrIHNvdXJjZQorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19TTVBTX0RJVl9DT05GSUcoX19TTVBTQ0xLRElWX18pIExMX1JDQ19TZXRTTVBTUHJlc2NhbGVyKF9fU01QU0NMS0RJVl9fKQorCisvKiogQGJyaWVmICBNYWNybyB0byBnZXQgdGhlIFNNUFMgY2xvY2sgZGl2aXNpb24gZmFjdG9yLgorICAqCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TTVBTQ0xLRElWX1JBTkdFMCAgICAgICAgICAgMXN0IGRpdmlkZXIgZmFjdG9yIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtESVZfUkFOR0UxICAgICAgICAgICAybmQgZGl2aWRlciBmYWN0b3IgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS0RJVl9SQU5HRTIgICAgICAgICAgIDN0aCBkaXZpZGVyIGZhY3RvciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TTVBTQ0xLRElWX1JBTkdFMyAgICAgICAgICAgNHRoIGRpdmlkZXIgZmFjdG9yIHZhbHVlCisgICoKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0dFVF9TTVBTX0RJVigpIExMX1JDQ19HZXRTTVBTUHJlc2NhbGVyKCkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gY29uZmlndXJlIHRoZSBTTVBTIGludGVyZmFjZSBjbG9jay4KKyAgKiBAcGFyYW0gIF9fU01QU19DTEtTT1VSQ0VfXyBzcGVjaWZpZXMgdGhlIFNNUFMgZGlnaXRhbCBpbnRlcmZhY2UgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS1NPVVJDRV9IU0kgICAgICAgICAgSFNJIGNsb2NrIHNlbGVjdGVkIGFzIFNNUFMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS1NPVVJDRV9NU0kgICAgICAgICAgTVNJIENsb2NrIHNlbGVjdGVkIGFzIFNNUFMgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfU01QU0NMS1NPVVJDRV9IU0UgICAgICAgICAgSFNFIENsb2NrIHNlbGVjdGVkIGFzIFNNUFMgY2xvY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKworI2RlZmluZSBfX0hBTF9SQ0NfU01QU19DT05GSUcoX19TTVBTX0NMS1NPVVJDRV9fKSBMTF9SQ0NfU2V0U01QU0Nsb2NrU291cmNlKF9fU01QU19DTEtTT1VSQ0VfXykKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBTTVBTIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfSFNJICAgICAgICAgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfTVNJICAgICAgICAgIE1TSSBDbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfSFNFICAgICAgICAgIEhTRSBDbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU01QU19TT1VSQ0UoKSBMTF9SQ0NfR2V0U01QU0Nsb2NrU2VsZWN0aW9uKCkKKworLyoqIEBicmllZiAgTWFjcm8gdG8gZ2V0IHRoZSBTTVBTIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfU1RBVFVTX0hTSSAgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfU1RBVFVTX01TSSAgIE1TSSBDbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NNUFNDTEtTT1VSQ0VfU1RBVFVTX0hTRSAgIEhTRSBDbG9jayBzZWxlY3RlZCBhcyBTTVBTIGNsb2NrCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19HRVRfU01QU19TT1VSQ0VfU1RBVFVTKCkgTExfUkNDX0dldFNNUFNDbG9ja1NvdXJjZSgpCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRmxhZ3NfSW50ZXJydXB0c19NYW5hZ2VtZW50IEZsYWdzIEludGVycnVwdHMgTWFuYWdlbWVudAorICAqIEBicmllZiBtYWNyb3MgdG8gbWFuYWdlIHRoZSBzcGVjaWZpZWQgUkNDIEZsYWdzIGFuZCBpbnRlcnJ1cHRzLgorICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgRW5hYmxlIFBMTFNBSTFSRFkgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMV9FTkFCTEVfSVQoKSBMTF9SQ0NfRW5hYmxlSVRfUExMU0FJMVJEWSgpCisKKy8qKiBAYnJpZWYgRGlzYWJsZSBQTExTQUkxUkRZIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfRElTQUJMRV9JVCgpIExMX1JDQ19EaXNhYmxlSVRfUExMU0FJMVJEWSgpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFBMTFNBSTFSRFkgaW50ZXJydXB0IHBlbmRpbmcgYml0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfUExMU0FJMV9DTEVBUl9JVCgpIExMX1JDQ19DbGVhckZsYWdfUExMU0FJMVJEWSgpCisKKy8qKiBAYnJpZWYgQ2hlY2sgd2hldGhlciBQTExTQUkxUkRZIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEByZXR2YWwgVFJVRSBvciBGQUxTRS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfR0VUX0lUX1NPVVJDRSgpIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMU0FJMVJEWSgpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIFBMTFNBSTFSRFkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEByZXR2YWwgVFJVRSBvciBGQUxTRS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX1BMTFNBSTFfR0VUX0ZMQUcoKSAgTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBDMSBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBDMiBMaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9DMl9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgTExfQzJfRVhUSV9FbmFibGVJVF8wXzMxKFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IEMxIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgQzIgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfQzJfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfSVQoKSAgICAgICAgTExfQzJfRVhUSV9EaXNhYmxlSVRfMF8zMShSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXZlbnQgQzEgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXZlbnQgQzIgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0MyX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAgIExMX0MyX0VYVElfRW5hYmxlRXZlbnRfMF8zMShSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFJDQyBMU0UgQ1NTIEV2ZW50IEMxIExpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXZlbnQgQzIgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX0MyX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAgIExMX0MyX0VYVElfRGlzYWJsZUV2ZW50XzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18wXzMxKFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IEZhbGxpbmcgVHJpZ2dlci4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18wXzMxKFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUkNDIExTRSBDU1MgRXh0ZW5kZWQgSW50ZXJydXB0IFJpc2luZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFJDQyBMU0UgQ1NTIEV4dGVuZGVkIEludGVycnVwdCBSaXNpbmcgJiBGYWxsaW5nIFRyaWdnZXIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7ICAgICAgICAgICAgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBSQ0MgTFNFIENTUyBFeHRlbmRlZCBJbnRlcnJ1cHQgUmlzaW5nICYgRmFsbGluZyBUcmlnZ2VyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0xTRUNTU19FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICAgICAgICAgICAgIFwKKyAgICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgICAgICAgICAgICBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSQ0MgTFNFIENTUyBFWFRJIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHJldHZhbCBFWFRJIFJDQyBMU0UgQ1NTIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VUX0ZMQUcoKSAgICAgICBMTF9FWFRJX0lzQWN0aXZlRmxhZ18wXzMxKFJDQ19FWFRJX0xJTkVfTFNFQ1NTKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJDQyBMU0UgQ1NTIEVYVEkgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19MU0VDU1NfRVhUSV9DTEVBUl9GTEFHKCkgICAgTExfRVhUSV9DbGVhckZsYWdfMF8zMShSQ0NfRVhUSV9MSU5FX0xTRUNTUykKKworLyoqCisgICogQGJyaWVmIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIHRoZSBSQ0MgTFNFIENTUyBFWFRJIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfR0VORVJBVEVfU1dJVCgpICBMTF9FWFRJX0dlbmVyYXRlU1dJXzBfMzEoUkNDX0VYVElfTElORV9MU0VDU1MpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgQ1JTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ1JTIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ09LICBTWU5DIGV2ZW50IE9LIGludGVycnVwdAorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DV0FSTiAgU1lOQyB3YXJuaW5nIGludGVycnVwdAorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FUlIgIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVNZTkMgIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0lUKF9fSU5URVJSVVBUX18pICAgU0VUX0JJVChDUlMtPkNSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIENSUyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIENSUyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DT0sgIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VSUiAgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FU1lOQyAgRXhwZWN0ZWQgU1lOQyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19ESVNBQkxFX0lUKF9fSU5URVJSVVBUX18pICBDTEVBUl9CSVQoQ1JTLT5DUiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBDUlMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgQ1JTIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9TWU5DT0sgIFNZTkMgZXZlbnQgT0sgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VSUiAgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9FU1lOQyAgRXhwZWN0ZWQgU1lOQyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19HRVRfSVRfU09VUkNFKF9fSU5URVJSVVBUX18pICAoKFJFQURfQklUKENSUy0+Q1IsIChfX0lOVEVSUlVQVF9fKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBDUlMgaW50ZXJydXB0IHBlbmRpbmcgYml0cworICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNPSyAgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfU1lOQ1dBUk4gIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfSVRfRVJSICBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX0VTWU5DICBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19JVF9UUklNT1ZGICBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNFUlIgIFNZTkMgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0lUX1NZTkNNSVNTICBTWU5DIG1pc3NlZCBpbnRlcnJ1cHQKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEVBUl9JVChfX0lOVEVSUlVQVF9fKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChfX0lOVEVSUlVQVF9fKSAmIFJDQ19DUlNfSVRfRVJST1JfTUFTSykgIT0gUkVTRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FUlJDIHwgKChfX0lOVEVSUlVQVF9fKSAmIH5SQ0NfQ1JTX0lUX0VSUk9SX01BU0spKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVfUkVHKENSUy0+SUNSLCAoX19JTlRFUlJVUFRfXykpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JTIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNPSyAgU1lOQyBldmVudCBPSworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNXQVJOICBTWU5DIHdhcm5pbmcKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19FUlIgIEVycm9yCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfRVNZTkMgIEV4cGVjdGVkIFNZTkMKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19UUklNT1ZGICBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DRVJSICBTWU5DIGVycm9yCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MgIFNZTkMgbWlzc2VkCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9GTEFHXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfR0VUX0ZMQUcoX19GTEFHX18pICAoUkVBRF9CSVQoQ1JTLT5JU1IsIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENSUyBzcGVjaWZpZWQgRkxBRy4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ09LICBTWU5DIGV2ZW50IE9LCisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4gIFNZTkMgd2FybmluZworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX0VSUiAgRXJyb3IKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19FU1lOQyAgRXhwZWN0ZWQgU1lOQworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1RSSU1PVkYgIFRyaW1taW5nIG92ZXJmbG93IG9yIHVuZGVyZmxvdworICAqICAgICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19GTEFHX1NZTkNFUlIgIFNZTkMgZXJyb3IKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfRkxBR19TWU5DTUlTUyAgU1lOQyBtaXNzZWQKKyAgKiBAbm90ZSBSQ0NfQ1JTX0ZMQUdfRVJSIGNsZWFycyBSQ0NfQ1JTX0ZMQUdfVFJJTU9WRiwgUkNDX0NSU19GTEFHX1NZTkNFUlIsIFJDQ19DUlNfRkxBR19TWU5DTUlTUyBhbmQgY29uc2VxdWVudGx5IFJDQ19DUlNfRkxBR19FUlIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKF9fRkxBR19fKSAgICAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChfX0ZMQUdfXykgJiBSQ0NfQ1JTX0ZMQUdfRVJST1JfTUFTSykgIT0gMFUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX1JFRyhDUlMtPklDUiwgQ1JTX0lDUl9FUlJDIHwgKChfX0ZMQUdfXykgJiB+UkNDX0NSU19GTEFHX0VSUk9SX01BU0spKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVfUkVHKENSUy0+SUNSLCAoX19GTEFHX18pKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NFeF9DUlNfRXh0ZW5kZWRfRmVhdHVyZXMgUkNDRXggQ1JTIEV4dGVuZGVkIEZlYXR1cmVzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBvc2NpbGxhdG9yIGNsb2NrIGZvciBmcmVxdWVuY3kgZXJyb3IgY291bnRlci4KKyAgKiBAbm90ZSAgIHdoZW4gdGhlIENFTiBiaXQgaXMgc2V0IHRoZSBDUlNfQ0ZHUiByZWdpc3RlciBiZWNvbWVzIHdyaXRlLXByb3RlY3RlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRU5BQkxFKCkgIExMX0NSU19FbmFibGVGcmVxRXJyb3JDb3VudGVyKCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvc2NpbGxhdG9yIGNsb2NrIGZvciBmcmVxdWVuY3kgZXJyb3IgY291bnRlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19GUkVRX0VSUk9SX0NPVU5URVJfRElTQUJMRSgpIExMX0NSU19EaXNhYmxlRnJlcUVycm9yQ291bnRlcigpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBhdXRvbWF0aWMgaGFyZHdhcmUgYWRqdXN0ZW1lbnQgb2YgVFJJTSBiaXRzLgorICAqIEBub3RlICAgV2hlbiB0aGUgQVVUT1RSSU1FTiBiaXQgaXMgc2V0IHRoZSBDUlNfQ0ZHUiByZWdpc3RlciBiZWNvbWVzIHdyaXRlLXByb3RlY3RlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUkNDX0NSU19BVVRPTUFUSUNfQ0FMSUJfRU5BQkxFKCkgICAgIExMX0NSU19FbmFibGVBdXRvVHJpbW1pbmcoKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgaGFyZHdhcmUgYWRqdXN0ZW1lbnQgb2YgVFJJTSBiaXRzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SQ0NfQ1JTX0FVVE9NQVRJQ19DQUxJQl9ESVNBQkxFKCkgICAgTExfQ1JTX0Rpc2FibGVBdXRvVHJpbW1pbmcoKQorCisvKioKKyAgKiBAYnJpZWYgIE1hY3JvIHRvIGNhbGN1bGF0ZSByZWxvYWQgdmFsdWUgdG8gYmUgc2V0IGluIENSUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGFyZ2V0IGFuZCBzeW5jIGZyZXF1ZW5jaWVzCisgICogQG5vdGUgICBUaGUgUkVMT0FEIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGlvIGJldHdlZW4gdGhlIHRhcmdldCBmcmVxdWVuY3kgYW5kIHRoZSBmcmVxdWVuY3kKKyAgKiAgICAgICAgICAgICBvZiB0aGUgc3luY2hyb25pemF0aW9uIHNvdXJjZSBhZnRlciBwcmVzY2FsaW5nLiBJdCBpcyB0aGVuIGRlY3JlYXNlZCBieSBvbmUgaW4gb3JkZXIgdG8KKyAgKiAgICAgICAgICAgICByZWFjaCB0aGUgZXhwZWN0ZWQgc3luY2hyb25pemF0aW9uIG9uIHRoZSB6ZXJvIHZhbHVlLiBUaGUgZm9ybXVsYSBpcyB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICAgIFJFTE9BRCA9IChmVEFSR0VUIC8gZlNZTkMpIC0xCisgICogQHBhcmFtICBfX0ZUQVJHRVRfXyBUYXJnZXQgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikKKyAgKiBAcGFyYW0gIF9fRlNZTkNfXyBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JDQ19DUlNfUkVMT0FEVkFMVUVfQ0FMQ1VMQVRFKF9fRlRBUkdFVF9fLCBfX0ZTWU5DX18pICBfX0xMX0NSU19DQUxDX0NBTENVTEFURV9SRUxPQURWQUxVRSgoX19GVEFSR0VUX18pLChfX0ZTWU5DX18pKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtDb25maWcoUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICAqUGVyaXBoQ2xrSW5pdCk7Cit1aW50MzJfdCAgICAgICAgICBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NFeF9FbmFibGVQTExTQUkxKFJDQ19QTExTQUkxSW5pdFR5cGVEZWYgICpQTExTQUkxSW5pdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfRGlzYWJsZVBMTFNBSTEodm9pZCk7CisKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9XYWtlVXBTdG9wQ0xLQ29uZmlnKHVpbnQzMl90IFdha2VVcENsayk7CisKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1Modm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfRGlzYWJsZUxTRUNTUyh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1NfSVQodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfTFNFQ1NTX0lSUUhhbmRsZXIodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfTFNFQ1NTX0NhbGxiYWNrKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfTFNDT0NvbmZpZyh1aW50MzJfdCBSQ0NfTFNDT3gsIHVpbnQzMl90IFJDQ19MU0NPU291cmNlKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9FbmFibGVMU0NPKHVpbnQzMl90IExTQ09Tb3VyY2UpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0Rpc2FibGVMU0NPKHZvaWQpOworCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfRW5hYmxlTVNJUExMTW9kZSh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9EaXNhYmxlTVNJUExMTW9kZSh2b2lkKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgICBIQUxfUkNDRXhfVHJpbU9zYyh1aW50MzJfdCBPc2NpbGxhdG9yVHlwZSk7CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKENSUykKKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworCit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTQ29uZmlnKFJDQ19DUlNJbml0VHlwZURlZiAqcEluaXQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTR2V0U3luY2hyb25pemF0aW9uSW5mbyhSQ0NfQ1JTU3luY2hyb0luZm9UeXBlRGVmICpwU3luY2hyb0luZm8pOwordWludDMyX3QgICAgICAgICAgSEFMX1JDQ0V4X0NSU1dhaXRTeW5jaHJvbml6YXRpb24odWludDMyX3QgVGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIodm9pZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUkNDRXhfQ1JTX1N5bmNPa0NhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjayh2b2lkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayh1aW50MzJfdCBFcnJvcik7CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBDUlMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfUkNDX0VYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3JuZy5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfcm5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMGEwOQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX3JuZy5oCkBAIC0wLDAgKzEsMzc4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9ybmcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUk5HIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9STkdfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1JOR19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFJORykKKworLyoqIEBkZWZncm91cCBSTkcgUk5HCisgICogQGJyaWVmIFJORyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX1R5cGVzIFJORyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX1R5cGVzX0dyb3VwMSBSTkcgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgQ2xvY2tFcnJvckRldGVjdGlvbjsgLyohPCBDRUQgQ2xvY2sgZXJyb3IgZGV0ZWN0aW9uICovCit9IFJOR19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfVHlwZXNfR3JvdXAyIFJORyBTdGF0ZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JOR19TVEFURV9SRVNFVCAgICAgPSAweDAwVSwgIC8qITwgUk5HIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyAgSEFMX1JOR19TVEFURV9SRUFEWSAgICAgPSAweDAxVSwgIC8qITwgUk5HIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgKi8KKyAgSEFMX1JOR19TVEFURV9CVVNZICAgICAgPSAweDAyVSwgIC8qITwgUk5HIGludGVybmFsIHByb2Nlc3MgaXMgb25nb2luZyAgICAgKi8KKyAgSEFMX1JOR19TVEFURV9USU1FT1VUICAgPSAweDAzVSwgIC8qITwgUk5HIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1JOR19TVEFURV9FUlJPUiAgICAgPSAweDA0VSAgIC8qITwgUk5HIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgKi8KKworfSBIQUxfUk5HX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfVHlwZXNfR3JvdXAzIFJORyBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0ICBfX1JOR19IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZiAvKiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworeworICBSTkdfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICovCisKKyAgUk5HX0luaXRUeXBlRGVmICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgLyohPCBSTkcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgIExvY2s7ICAgICAgICAgLyohPCBSTkcgbG9ja2luZyBvYmplY3QgICAgICAqLworCisgIF9fSU8gSEFMX1JOR19TdGF0ZVR5cGVEZWYgICBTdGF0ZTsgICAgICAgIC8qITwgUk5HIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworICBfX0lPICB1aW50MzJfdCAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgLyohPCBSTkcgRXJyb3IgY29kZSAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIFJhbmRvbU51bWJlcjsgLyohPCBMYXN0IEdlbmVyYXRlZCBSTkcgRGF0YSAqLworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIFJlYWR5RGF0YUNhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZywgdWludDMyX3QgcmFuZG9tMzJiaXQpOyAgLyohPCBSTkcgRGF0YSBSZWFkeSBDYWxsYmFjayAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1JOR19IYW5kbGVUeXBlRGVmICpocm5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSTkcgRXJyb3IgQ2FsbGJhY2sgICAgICAgICAqLworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19STkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJORyBNc3AgSW5pdCBjYWxsYmFjayAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1JOR19IYW5kbGVUeXBlRGVmICpocm5nKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJORyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9IFJOR19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgUk5HIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfUk5HX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwMFUsICAgICAvKiE8IFJORyBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAqLworCisgIEhBTF9STkdfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDAxVSwgICAgIC8qITwgUk5HIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICovCisgIEhBTF9STkdfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDAyVSAgICAgIC8qITwgUk5HIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICovCisKK30gSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgUk5HIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBSTkdfQ2FsbGJhY2tUeXBlRGVmKShSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBhIGNvbW1vbiBSTkcgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwUk5HX1JlYWR5RGF0YUNhbGxiYWNrVHlwZURlZikoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHVpbnQzMl90IHJhbmRvbTMyYml0KTsgICAvKiE8IHBvaW50ZXIgdG8gYW4gUk5HIERhdGEgUmVhZHkgc3BlY2lmaWMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzIFJORyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9Db25zdGFudHNfR3JvdXAxIFJORyBJbnRlcnJ1cHQgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJOR19JVF9EUkRZICBSTkdfU1JfRFJEWSAgLyohPCBEYXRhIFJlYWR5IGludGVycnVwdCAgKi8KKyNkZWZpbmUgUk5HX0lUX0NFSSAgIFJOR19TUl9DRUlTICAvKiE8IENsb2NrIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBSTkdfSVRfU0VJICAgUk5HX1NSX1NFSVMgIC8qITwgU2VlZCBlcnJvciBpbnRlcnJ1cHQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9Db25zdGFudHNfR3JvdXAyIFJORyBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSTkdfRkxBR19EUkRZICAgUk5HX1NSX0RSRFkgIC8qITwgRGF0YSByZWFkeSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUk5HX0ZMQUdfQ0VDUyAgIFJOR19TUl9DRUNTICAvKiE8IENsb2NrIGVycm9yIGN1cnJlbnQgc3RhdHVzICovCisjZGVmaW5lIFJOR19GTEFHX1NFQ1MgICBSTkdfU1JfU0VDUyAgLyohPCBTZWVkIGVycm9yIGN1cnJlbnQgc3RhdHVzICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfQ29uc3RhbnRzX0dyb3VwMyBSTkcgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUk5HX0NFRF9FTkFCTEUgICAgICAgICAgMHgwMDAwMDAwMFUgLyohPCBDbG9jayBlcnJvciBkZXRlY3Rpb24gRW5hYmxlZCAgKi8KKyNkZWZpbmUgUk5HX0NFRF9ESVNBQkxFICAgICAgICAgUk5HX0NSX0NFRCAgLyohPCBDbG9jayBlcnJvciBkZXRlY3Rpb24gRGlzYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0Vycm9yX0RlZmluaXRpb24gICBSTkcgRXJyb3IgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lICBIQUxfUk5HX0VSUk9SX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgIEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAweDAwMDAwMDAxVSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisjZGVmaW5lICBIQUxfUk5HX0VSUk9SX1RJTUVPVVQgICAgICAgICAgMHgwMDAwMDAwMlUgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSTkdfRXhwb3J0ZWRfTWFjcm9zIFJORyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFJORyBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfUk5HX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFU0VUOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9STkdfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRVNFVCkKKyNlbmRpZiAvKlVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIFJORyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBSTkdfQ1JfUk5HRU4pCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZXMgdGhlIFJORyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgSGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+Uk5HX0NSX1JOR0VOKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHRoZSBzZWxlY3RlZCBSTkcgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFJORyBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIFJORyBmbGFnCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0ZMQUdfRFJEWTogIERhdGEgcmVhZHkKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0ZMQUdfQ0VDUzogIENsb2NrIGVycm9yIGN1cnJlbnQgc3RhdHVzCisgICogICAgICAgICAgICBAYXJnIFJOR19GTEFHX1NFQ1M6ICBTZWVkIGVycm9yIGN1cnJlbnQgc3RhdHVzCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9STkdfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IgJiAoX19GTEFHX18pKSA9PSAoX19GTEFHX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFycyB0aGUgc2VsZWN0ZWQgUk5HIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBSTkcgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBSTkcgZmxhZyB0byBjbGVhcgorICAqIEBub3RlICAgV0FSTklORzogVGhpcyBpcyBhIGR1bW15IG1hY3JvIGZvciBIQUwgY29kZSBhbGlnbm1lbnQsCisgICogICAgICAgICBmbGFncyBSTkdfRkxBR19EUkRZLCBSTkdfRkxBR19DRUNTIGFuZCBSTkdfRkxBR19TRUNTIGFyZSByZWFkLW9ubHkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgICAgICAvKiBkdW1teSAgbWFjcm8gKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGVzIHRoZSBSTkcgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfRU5BQkxFX0lUKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgUk5HX0NSX0lFKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBSTkcgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9STkdfRElTQUJMRV9JVChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gflJOR19DUl9JRSkKKworLyoqCisgICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJORyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJORyBpbnRlcnJ1cHQgc3RhdHVzIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSTkdfSVRfRFJEWTogRGF0YSByZWFkeSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0lUX0NFSTogQ2xvY2sgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFJOR19JVF9TRUk6IFNlZWQgZXJyb3IgaW50ZXJydXB0CisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSTkcgaW50ZXJydXB0IHN0YXR1cyBmbGFncy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gUk5HIEhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJORyBpbnRlcnJ1cHQgc3RhdHVzIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUk5HX0lUX0NFSTogQ2xvY2sgZXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFJOR19JVF9TRUk6IFNlZWQgZXJyb3IgaW50ZXJydXB0CisgICogQG5vdGUgICBSTkdfSVRfRFJEWSBmbGFnIGlzIHJlYWQtb25seSwgcmVhZGluZyBSTkdfRFIgcmVnaXN0ZXIgYXV0b21hdGljYWxseSBjbGVhcnMgUk5HX0lUX0RSRFkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JOR19DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSA9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnMgUk5HIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX0RlSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit2b2lkIEhBTF9STkdfTXNwSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit2b2lkIEhBTF9STkdfTXNwRGVJbml0KFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIEhBTF9STkdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFJOR19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfVW5SZWdpc3RlckNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCBIQUxfUk5HX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcsIHBSTkdfUmVhZHlEYXRhQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1VuUmVnaXN0ZXJSZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCAqcmFuZG9tMzJiaXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcl9JVChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit1aW50MzJfdCBIQUxfUk5HX1JlYWRMYXN0UmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKwordm9pZCBIQUxfUk5HX0lSUUhhbmRsZXIoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX0Vycm9yQ2FsbGJhY2soUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpOwordm9pZCBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKFJOR19IYW5kbGVUeXBlRGVmICpocm5nLCB1aW50MzJfdCByYW5kb20zMmJpdCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworSEFMX1JOR19TdGF0ZVR5cGVEZWYgSEFMX1JOR19HZXRTdGF0ZShSTkdfSGFuZGxlVHlwZURlZiAqaHJuZyk7Cit1aW50MzJfdCAgICAgICAgICAgICBIQUxfUk5HX0dldEVycm9yKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19Qcml2YXRlX01hY3JvcyBSTkcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19STkdfSVQoSVQpICgoKElUKSA9PSBSTkdfSVRfQ0VJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICgoSVQpID09IFJOR19JVF9TRUkpKQorCisjZGVmaW5lIElTX1JOR19GTEFHKEZMQUcpICgoKEZMQUcpID09IFJOR19GTEFHX0RSRFkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJOR19GTEFHX0NFQ1MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFJOR19GTEFHX1NFQ1MpKQorCisvKioKKyAgKiBAYnJpZWYgVmVyaWZ5IHRoZSBSTkcgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uIG1vZGUuCisgICogQHBhcmFtIF9fTU9ERV9fIFJORyBDbG9jayBFcnJvciBEZXRlY3Rpb24gbW9kZQorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1JOR19DRUQoX19NT0RFX18pICAgKCgoX19NT0RFX18pID09IFJOR19DRURfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFJOR19DRURfRElTQUJMRSkpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogUk5HICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfUk5HX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3J0Yy5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYjRjMQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX3J0Yy5oCkBAIC0wLDAgKzEsOTgxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1JUQ19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiBJbmNsdWRlIGxvdyBsZXZlbCBkcml2ZXIgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZXh0aS5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQyBSVEMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX1R5cGVzIFJUQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiAKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9SVENfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgUlRDIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgKi8KKyAgSEFMX1JUQ19TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBSVEMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAqLworICBIQUxfUlRDX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IFJUQyBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9SVENfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgUlRDIHRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVICAgLyohPCBSVEMgZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLworCit9SEFMX1JUQ1N0YXRlVHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgUlRDIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEhvdXJGb3JtYXQ7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBIb3VyIEZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0hvdXJfRm9ybWF0cyAqLworCisgIHVpbnQzMl90IEFzeW5jaFByZWRpdjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBc3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBTeW5jaFByZWRpdjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgU3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RkZGICovCisKKyAgdWludDMyX3QgT3V0UHV0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBzaWduYWwgd2lsbCBiZSByb3V0ZWQgdG8gdGhlIFJUQyBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ0V4X091dHB1dF9zZWxlY3Rpb25fRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBPdXRQdXRSZW1hcDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlbWFwIGZvciBSVEMgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiAgUlRDX091dHB1dF9BTEFSTV9PVVRfUmVtYXAgKi8KKworICB1aW50MzJfdCBPdXRQdXRQb2xhcml0eTsgIC8qITwgU3BlY2lmaWVzIHRoZSBwb2xhcml0eSBvZiB0aGUgb3V0cHV0IHNpZ25hbC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfT3V0cHV0X1BvbGFyaXR5X0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgT3V0UHV0VHlwZTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIE91dHB1dCBQaW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX091dHB1dF9UeXBlX0FMQVJNX09VVCAqLworfVJUQ19Jbml0VHlwZURlZjsKKworLyoqIAorICAqIEBicmllZiAgUlRDIFRpbWUgc3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBIb3VyczsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgSG91ci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTIgaWYgdGhlIFJUQ19Ib3VyRm9ybWF0XzEyIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyMyBpZiB0aGUgUlRDX0hvdXJGb3JtYXRfMjQgaXMgc2VsZWN0ZWQgKi8KKworICB1aW50OF90IE1pbnV0ZXM7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBNaW51dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA1OSAqLworCisgIHVpbnQ4X3QgU2Vjb25kczsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBUaW1lIFNlY29uZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5ICovCisKKyAgdWludDhfdCBUaW1lRm9ybWF0OyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFNL1BNIFRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19BTV9QTV9EZWZpbml0aW9ucyAqLworICAKKyAgdWludDMyX3QgU3ViU2Vjb25kczsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVENfU1NSIFJUQyBTdWIgU2Vjb25kIHJlZ2lzdGVyIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjb3JyZXNwb25kcyB0byBhIHRpbWUgdW5pdCByYW5nZSBiZXR3ZWVuIFswLTFdIFNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBbMSBTZWMgLyBTZWNvbmRGcmFjdGlvbiArMV0gZ3JhbnVsYXJpdHkgKi8KKyAKKyAgdWludDMyX3QgU2Vjb25kRnJhY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgcmFuZ2Ugb3IgZ3JhbnVsYXJpdHkgb2YgU3ViIFNlY29uZCByZWdpc3RlciBjb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIFN5bmNocm9ub3VzIHByZS1zY2FsZXIgZmFjdG9yIHZhbHVlIChQUkVESVZfUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNvcnJlc3BvbmRzIHRvIGEgdGltZSB1bml0IHJhbmdlIGJldHdlZW4gWzAtMV0gU2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFsxIFNlYyAvIFNlY29uZEZyYWN0aW9uICsxXSBncmFudWxhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgd2lsbCBiZSB1c2VkIG9ubHkgYnkgSEFMX1JUQ19HZXRUaW1lIGZ1bmN0aW9uICovCisgIAorICB1aW50MzJfdCBEYXlMaWdodFNhdmluZzsgIC8qITwgU3BlY2lmaWVzIFJUQ19EYXlMaWdodFNhdmVPcGVyYXRpb246IHRoZSB2YWx1ZSBvZiBob3VyIGFkanVzdG1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19EYXlMaWdodFNhdmluZ19EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFN0b3JlT3BlcmF0aW9uOyAgLyohPCBTcGVjaWZpZXMgUlRDX1N0b3JlT3BlcmF0aW9uIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIEJDSyBiaXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBDUiByZWdpc3RlciB0byBzdG9yZSB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfU3RvcmVPcGVyYXRpb25fRGVmaW5pdGlvbnMgKi8KK31SVENfVGltZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFJUQyBEYXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OF90IFdlZWtEYXk7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBNb250aDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIE1vbnRoIChpbiBCQ0QgZm9ybWF0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19Nb250aF9EYXRlX0RlZmluaXRpb25zICovCisKKyAgdWludDhfdCBEYXRlOyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzEgKi8KKworICB1aW50OF90IFllYXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIERhdGUgWWVhci4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDk5ICovCisKK31SVENfRGF0ZVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFJUQyBBbGFybSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUlRDX1RpbWVUeXBlRGVmIEFsYXJtVGltZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gVGltZSBtZW1iZXJzICovCisKKyAgdWludDMyX3QgQWxhcm1NYXNrOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtTWFza19EZWZpbml0aW9ucyAqLworICAKKyAgdWludDMyX3QgQWxhcm1TdWJTZWNvbmRNYXNrOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gU3ViU2Vjb25kcyBNYXNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1fU3ViX1NlY29uZHNfTWFza3NfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBBbGFybURhdGVXZWVrRGF5U2VsOyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBpcyBvbiBEYXRlIG9yIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfQWxhcm1EYXRlV2Vla0RheV9EZWZpbml0aW9ucyAqLworCisgIHVpbnQ4X3QgQWxhcm1EYXRlV2Vla0RheTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIERhdGUvV2Vla0RheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIEFsYXJtIERhdGUgaXMgc2VsZWN0ZWQsIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIGEgdmFsdWUgaW4gdGhlIDEtMzEgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBBbGFybSBXZWVrRGF5IGlzIHNlbGVjdGVkLCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgQWxhcm07ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhbGFybSAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0FsYXJtc19EZWZpbml0aW9ucyAqLworfVJUQ19BbGFybVR5cGVEZWY7CisKKy8qKiAKKyAgKiBAYnJpZWYgIFJUQyBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24gIAorICAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmCit7CisgIFJUQ19UeXBlRGVmICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgKi8KKworICBSVENfSW5pdFR5cGVEZWYgICAgICAgICAgIEluaXQ7ICAgICAgIC8qITwgUlRDIHJlcXVpcmVkIHBhcmFtZXRlcnMgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICBMb2NrOyAgICAgICAvKiE8IFJUQyBsb2NraW5nIG9iamVjdCAgICAgICAqLworCisgIF9fSU8gSEFMX1JUQ1N0YXRlVHlwZURlZiAgU3RhdGU7ICAgICAgLyohPCBUaW1lIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAgKCogQWxhcm1BRXZlbnRDYWxsYmFjaykgICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAvKiE8IFJUQyBBbGFybSBBIEV2ZW50IGNhbGxiYWNrICAgICAgICAgKi8KKworICB2b2lkICAoKiBBbGFybUJFdmVudENhbGxiYWNrKSAgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgIC8qITwgUlRDIEFsYXJtIEIgRXZlbnQgY2FsbGJhY2sgICAgICAgICAqLworCisgIHZvaWQgICgqIFRpbWVTdGFtcEV2ZW50Q2FsbGJhY2spICAgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgLyohPCBSVEMgVGltZVN0YW1wIEV2ZW50IGNhbGxiYWNrICAgICAgICovCisKKyAgdm9pZCAgKCogV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKSAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAvKiE8IFJUQyBXYWtlVXBUaW1lciBFdmVudCBjYWxsYmFjayAgICAgKi8KKworICB2b2lkICAoKiBUYW1wZXIxRXZlbnRDYWxsYmFjaykgICAgICggc3RydWN0IF9fUlRDX0hhbmRsZVR5cGVEZWYgKiBocnRjKTsgIC8qITwgUlRDIFRhbXBlciAxIEV2ZW50IGNhbGxiYWNrICAgICAgICAqLworCisgIHZvaWQgICgqIFRhbXBlcjJFdmVudENhbGxiYWNrKSAgICAgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgLyohPCBSVEMgVGFtcGVyIDIgRXZlbnQgY2FsbGJhY2sgICAgICAgICovCisKKyAgdm9pZCAgKCogVGFtcGVyM0V2ZW50Q2FsbGJhY2spICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAvKiE8IFJUQyBUYW1wZXIgMyBFdmVudCBjYWxsYmFjayAgICAgICAgKi8KKworICB2b2lkICAoKiBNc3BJbml0Q2FsbGJhY2spICAgICAgICAgKCBzdHJ1Y3QgX19SVENfSGFuZGxlVHlwZURlZiAqIGhydGMpOyAgIC8qITwgUlRDIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworCisgIHZvaWQgICgqIE1zcERlSW5pdENhbGxiYWNrKSAgICAgICAoIHN0cnVjdCBfX1JUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7ICAgLyohPCBSVEMgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCit9UlRDX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBMUFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFJUQyBBbGFybSBBIEV2ZW50IENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFJUQyBBbGFybSBCIEV2ZW50IENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX1JUQ19USU1FU1RBTVBfRVZFTlRfQ0JfSUQgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFJUQyBUaW1lU3RhbXAgRXZlbnQgQ2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1JUQ19XQUtFVVBUSU1FUl9FVkVOVF9DQl9JRCAgICAgICA9IDB4MDNVLCAgICAvKiE8IFJUQyBXYWtlVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFJUQyBUYW1wZXIgMSBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IFJUQyBUYW1wZXIgMiBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19UQU1QRVIzX0VWRU5UX0NCX0lEICAgICAgICAgICA9IDB4MDZVLCAgICAvKiE8IFJUQyBUYW1wZXIgMyBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MEVVLCAgICAvKiE8IFJUQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEZVICAgICAvKiE8IFJUQyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgKi8KK31IQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBSVEMgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFJUQ19DYWxsYmFja1R5cGVEZWYpKFJUQ19IYW5kbGVUeXBlRGVmICogaHJ0Yyk7IC8qITwgcG9pbnRlciB0byBhbiBSVEMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0NvbnN0YW50cyBSVEMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgUlRDX0hvdXJfRm9ybWF0cyBSVEMgSG91ciBGb3JtYXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0hPVVJGT1JNQVRfMjQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19IT1VSRk9STUFUXzEyICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9GTVQpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1BvbGFyaXR5X0RlZmluaXRpb25zIFJUQyBPdXRwdXQgUG9sYXJpdHkgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0ggICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9QT0xBUklUWV9MT1cgICAgICAgICgodWludDMyX3QpUlRDX0NSX1BPTCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X1R5cGVfQUxBUk1fT1VUIFJUQyBPdXRwdXQgVHlwZSBBTEFSTSBPVVQKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9UWVBFX1BVU0hQVUxMICAgICAgICgodWludDMyX3QpUlRDX09SX0FMQVJNT1VUVFlQRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfT3V0cHV0X0FMQVJNX09VVF9SZW1hcCBSVEMgT3V0cHV0IEFMQVJNIE9VVCBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19PVVRQVVRfUkVNQVBfTk9ORSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX09VVFBVVF9SRU1BUF9QT1MxICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19PUl9PVVRfUk1QKQorLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFJUQ19BTV9QTV9EZWZpbml0aW9ucyBSVEMgQU0gUE0gRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfSE9VUkZPUk1BVDEyX0FNICAgICAgICAgICAgKCh1aW50OF90KTB4MDBVKQorI2RlZmluZSBSVENfSE9VUkZPUk1BVDEyX1BNICAgICAgICAgICAgKCh1aW50OF90KTB4NDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19EYXlMaWdodFNhdmluZ19EZWZpbml0aW9ucyBSVEMgRGF5TGlnaHRTYXZpbmcgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfREFZTElHSFRTQVZJTkdfU1VCMUggICAgICAgKCh1aW50MzJfdClSVENfQ1JfU1VCMUgpCisjZGVmaW5lIFJUQ19EQVlMSUdIVFNBVklOR19BREQxSCAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9BREQxSCkKKyNkZWZpbmUgUlRDX0RBWUxJR0hUU0FWSU5HX05PTkUgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX1N0b3JlT3BlcmF0aW9uX0RlZmluaXRpb25zIFJUQyBTdG9yZU9wZXJhdGlvbiBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19TVE9SRU9QRVJBVElPTl9SRVNFVCAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX1NUT1JFT1BFUkFUSU9OX1NFVCAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9CS1ApCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0lucHV0X3BhcmFtZXRlcl9mb3JtYXRfZGVmaW5pdGlvbnMgUlRDIElucHV0IFBhcmFtZXRlciBGb3JtYXQgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfRk9STUFUX0JJTiAgICgodWludDMyX3QpMHgwMDAwMDAwMDBVKQorI2RlZmluZSBSVENfRk9STUFUX0JDRCAgICgodWludDMyX3QpMHgwMDAwMDAwMDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19Nb250aF9EYXRlX0RlZmluaXRpb25zIFJUQyBNb250aCBEYXRlIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKworLyogQ29kZWQgaW4gQkNEIGZvcm1hdCAqLworI2RlZmluZSBSVENfTU9OVEhfSkFOVUFSWSAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDFVKQorI2RlZmluZSBSVENfTU9OVEhfRkVCUlVBUlkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKQorI2RlZmluZSBSVENfTU9OVEhfTUFSQ0ggICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDNVKQorI2RlZmluZSBSVENfTU9OVEhfQVBSSUwgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDRVKQorI2RlZmluZSBSVENfTU9OVEhfTUFZICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKQorI2RlZmluZSBSVENfTU9OVEhfSlVORSAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDZVKQorI2RlZmluZSBSVENfTU9OVEhfSlVMWSAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDdVKQorI2RlZmluZSBSVENfTU9OVEhfQVVHVVNUICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDhVKQorI2RlZmluZSBSVENfTU9OVEhfU0VQVEVNQkVSICAgICAgICAgICAgKCh1aW50OF90KTB4MDlVKQorI2RlZmluZSBSVENfTU9OVEhfT0NUT0JFUiAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTBVKQorI2RlZmluZSBSVENfTU9OVEhfTk9WRU1CRVIgICAgICAgICAgICAgKCh1aW50OF90KTB4MTFVKQorI2RlZmluZSBSVENfTU9OVEhfREVDRU1CRVIgICAgICAgICAgICAgKCh1aW50OF90KTB4MTJVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19XZWVrRGF5X0RlZmluaXRpb25zIFJUQyBXZWVrRGF5IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1dFRUtEQVlfTU9OREFZICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfVFVFU0RBWSAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfV0VETkVTREFZICAgICAgICAgICgodWludDhfdCkweDAzVSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfVEhVUlNEQVkgICAgICAgICAgICgodWludDhfdCkweDA0VSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfRlJJREFZICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfU0FUVVJEQVkgICAgICAgICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgUlRDX1dFRUtEQVlfU1VOREFZICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfQWxhcm1EYXRlV2Vla0RheV9EZWZpbml0aW9ucyBSVEMgQWxhcm1EYXRlV2Vla0RheSBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9XRUVLREFZICAgUlRDX0FMUk1BUl9XRFNFTAorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybU1hc2tfRGVmaW5pdGlvbnMgUlRDIEFsYXJtTWFzayBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTU1BU0tfTk9ORSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfQUxBUk1NQVNLX0RBVEVXRUVLREFZICAgICAgIFJUQ19BTFJNQVJfTVNLNAorI2RlZmluZSBSVENfQUxBUk1NQVNLX0hPVVJTICAgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMworI2RlZmluZSBSVENfQUxBUk1NQVNLX01JTlVURVMgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMgorI2RlZmluZSBSVENfQUxBUk1NQVNLX1NFQ09ORFMgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMQorI2RlZmluZSBSVENfQUxBUk1NQVNLX0FMTCAgICAgICAgICAgICAgICgodWludDMyX3QpIChSVENfQUxBUk1NQVNLX05PTkUgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX0RBVEVXRUVLREFZIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX0hPVVJTICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX01JTlVURVMgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQUxBUk1NQVNLX1NFQ09ORFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19BbGFybXNfRGVmaW5pdGlvbnMgUlRDIEFsYXJtcyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19BTEFSTV9BICAgICAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQUUKKyNkZWZpbmUgUlRDX0FMQVJNX0IgICAgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJCRQorCisvKioKKyAgKiBAfQorICAqLworCisKKyAgLyoqIEBkZWZncm91cCBSVENfQWxhcm1fU3ViX1NlY29uZHNfTWFza3NfRGVmaW5pdGlvbnMgUlRDIEFsYXJtIFN1YiBTZWNvbmRzIE1hc2tzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19BTEwgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFsbCBBbGFybSBTUyBmaWVsZHMgYXJlIG1hc2tlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGNvbXBhcmlzb24gb24gc3ViIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBbGFybSAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMSAgICAgIFJUQ19BTFJNQVNTUl9NQVNLU1NfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDoxXSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1swXSBpcyBjb21wYXJlZC4gICAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzIgICAgICBSVENfQUxSTUFTU1JfTUFTS1NTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6Ml0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzE6MF0gYXJlIGNvbXBhcmVkICAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMyAgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzAgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDozXSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMjowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF80ICAgICAgUlRDX0FMUk1BU1NSX01BU0tTU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNTWzE0OjRdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1szOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzUgICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6NV0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s0OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzYgICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6Nl0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s1OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzcgICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yKSkgIC8qITwgU1NbMTQ6N10gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCAgICAgY29tcGFyaXNvbi4gT25seSBTU1s2OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzggICAgICBSVENfQUxSTUFTU1JfTUFTS1NTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6OF0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s3OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzkgICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6OV0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi4gT25seSBTU1s4OjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEwICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18xIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU1NbMTQ6MTBdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbOTowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMSAgICAgKCh1aW50MzJfdCkgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMCB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykpICAvKiE8IFNTWzE0OjExXSBhcmUgZG9uJ3QgY2FyZSBpbiBBbGFybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uLiBPbmx5IFNTWzEwOjBdIGFyZSBjb21wYXJlZCAqLworI2RlZmluZSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTIgICAgICgodWludDMyX3QpIChSVENfQUxSTUFTU1JfTUFTS1NTXzIgfCBSVENfQUxSTUFTU1JfTUFTS1NTXzMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTU1sxNDoxMl0gYXJlIGRvbid0IGNhcmUgaW4gQWxhcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi5Pbmx5IFNTWzExOjBdIGFyZSBjb21wYXJlZCAgKi8KKyNkZWZpbmUgUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzEzICAgICAoKHVpbnQzMl90KSAoUlRDX0FMUk1BU1NSX01BU0tTU18wIHwgUlRDX0FMUk1BU1NSX01BU0tTU18yIHwgUlRDX0FMUk1BU1NSX01BU0tTU18zKSkgIC8qITwgU1NbMTQ6MTNdIGFyZSBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uIE9ubHkgU1NbMTI6MF0gYXJlIGNvbXBhcmVkICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNCAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19BTFJNQVNTUl9NQVNLU1NfMSB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMiB8IFJUQ19BTFJNQVNTUl9NQVNLU1NfMykpICAvKiE8IFNTWzE0XSBpcyBkb24ndCBjYXJlIGluIEFsYXJtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb24uT25seSBTU1sxMzowXSBhcmUgY29tcGFyZWQgICovCisjZGVmaW5lIFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfTk9ORSAgICAgICAgUlRDX0FMUk1BU1NSX01BU0tTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNTWzE0OjBdIGFyZSBjb21wYXJlZCBhbmQgbXVzdCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhY3RpdmF0ZSBhbGFybS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0ludGVycnVwdHNfRGVmaW5pdGlvbnMgUlRDIEludGVycnVwdHMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfSVRfVFMgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQ1JfVFNJRSkgICAgICAgIC8qITwgRW5hYmxlIFRpbWVzdGFtcCBJbnRlcnJ1cHQgICAgKi8KKyNkZWZpbmUgUlRDX0lUX1dVVCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0NSX1dVVElFKSAgICAgICAvKiE8IEVuYWJsZSBXYWtldXAgdGltZXIgSW50ZXJydXB0ICovCisjZGVmaW5lIFJUQ19JVF9BTFJBICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9BTFJBSUUpICAgICAgLyohPCBFbmFibGUgQWxhcm0gQSBJbnRlcnJ1cHQgICAgICAqLworI2RlZmluZSBSVENfSVRfQUxSQiAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQ1JfQUxSQklFKSAgICAgIC8qITwgRW5hYmxlIEFsYXJtIEIgSW50ZXJydXB0ICAgICAgKi8KKyNkZWZpbmUgUlRDX0lUX1RBTVAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QSUUpICAvKiE8IEVuYWJsZSBhbGwgVGFtcGVyIEludGVycnVwdCAgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBSVENfSVRfVEFNUDEgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxSUUpIC8qITwgRW5hYmxlIFRhbXBlciAxIEludGVycnVwdCAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBSVENfSVRfVEFNUDIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVAySUUpIC8qITwgRW5hYmxlIFRhbXBlciAyIEludGVycnVwdCAgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRmxhZ3NfRGVmaW5pdGlvbnMgUlRDIEZsYWdzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0ZMQUdfUkVDQUxQRiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9SRUNBTFBGKQorI2RlZmluZSBSVENfRkxBR19UQU1QMkYgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1RBTVAyRikKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAxRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVEFNUDFGKQorI2VuZGlmCisjZGVmaW5lIFJUQ19GTEFHX1RTT1ZGICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVFNPVkYpCisjZGVmaW5lIFJUQ19GTEFHX1RTRiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVFNGKQorI2lmIGRlZmluZWQoUlRDX0lTUl9JVFNGKQorI2RlZmluZSBSVENfRkxBR19JVFNGICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0lUU0YpCisjZW5kaWYKKyNkZWZpbmUgUlRDX0ZMQUdfV1VURiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9XVVRGKQorI2RlZmluZSBSVENfRkxBR19BTFJCRiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0FMUkJGKQorI2RlZmluZSBSVENfRkxBR19BTFJBRiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0FMUkFGKQorI2RlZmluZSBSVENfRkxBR19JTklURiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0lOSVRGKQorI2RlZmluZSBSVENfRkxBR19SU0YgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1JTRikKKyNkZWZpbmUgUlRDX0ZMQUdfSU5JVFMgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9JTklUUykKKyNkZWZpbmUgUlRDX0ZMQUdfU0hQRiAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9TSFBGKQorI2RlZmluZSBSVENfRkxBR19XVVRXRiAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX1dVVFdGKQorI2RlZmluZSBSVENfRkxBR19BTFJCV0YgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfSVNSX0FMUkJXRikKKyNkZWZpbmUgUlRDX0ZMQUdfQUxSQVdGICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0lTUl9BTFJBV0YpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfTWFjcm9zIFJUQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFJUQyBoYW5kbGUgc3RhdGUKKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfUlRDX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3tcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRVNFVDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1JUQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPldQUiA9IDB4Q0FVOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5XUFIgPSAweDUzVTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5XUFIgPSAweEZGVTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgQUxBUk1BIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQUxSQUUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBTEFSTUEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX0FMUkFFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBTEFSTUIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUJfRU5BQkxFKF9fSEFORExFX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQUxSQkUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBTEFSTUIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTUJfRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX0FMUkJFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19JVF9BTFJBOiBBbGFybSBBIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBBbGFybSBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQTogQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQTogQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpJiAoKF9fSU5URVJSVVBUX18pPj4gNFUpKSAhPSAwVSk/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBBbGFybSBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGludGVycnVwdCBzb3VyY2VzIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfQUxSQTogQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX0FMUkI6IEFsYXJtIEIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgKF9fSU5URVJSVVBUX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIEFsYXJtJ3MgZmxhZyBzdGF0dXMuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBGbGFnIHNvdXJjZXMgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0FMUkFGCisgICogICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0FMUkJGCisgICogICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0FMUkFXRgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJCV0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gMFUpPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgQWxhcm0ncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gRmxhZyBzb3VyY2VzIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX0FMUkFGCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19BTFJCRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpIHwgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGJ5IGNvcmUgMS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCkgICAgICAgICAgICAoRVhUSS0+SU1SMSB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZSBieSBjb3JlIDIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJQzJfRU5BQkxFX0lUKCkgICAgICAgICAgKEVYVEktPkMySU1SMSB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgYnkgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX0lUKCkgICAgICAgICAgIChFWFRJLT5JTVIxICY9IH4oUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZSBieSBjb3JlIDIuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJQzJfRElTQUJMRV9JVCgpICAgICAgICAgKEVYVEktPkMySU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgYnkgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0VWRU5UKCkgICAgICAgICAoRVhUSS0+RU1SMSB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGJ5IGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJQzJfRU5BQkxFX0VWRU5UKCkgICAgICAgIChFWFRJLT5DMkVNUjEgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgYnkgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9FVkVOVCgpICAgICAgICAgKEVYVEktPkVNUjEgJj0gfihSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgYnkgY29yZSAyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElDMl9ESVNBQkxFX0VWRU5UKCkgICAgICAgKEVYVEktPkMyRU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgICogQGJyaWVmICBFbmFibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKSAgIChFWFRJLT5GVFNSMSB8PSBSVENfRVhUSV9MSU5FX0FMQVJNX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIChFWFRJLT5GVFNSMSAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICAoRVhUSS0+UlRTUjEgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKSAgIChFWFRJLT5SVFNSMSAmPSB+KFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4gIAorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lLiAgCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgaW50ZXJydXB0IGZsYWcgaXMgc2V0IG9yIG5vdGJ5IGNvcmUgMS4KKyAgKiBAcmV0dmFsIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSV9HRVRfRkxBRygpICAgICAgICAgICAgICAoRVhUSS0+UFIxICYgUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90IGJ5IGNvcmUgMi4KKyAgKiBAcmV0dmFsIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSUMyX0dFVF9GTEFHKCkgICAgICAgICAgICAoRVhUSS0+UFIyICYgUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBSVEMgQWxhcm0gYXNzb2NpYXRlZCBFeHRpIGxpbmUgZmxhZy4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIChFWFRJLT5QUjEgPSAoUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgUlRDIEFsYXJtIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGZsYWcuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfQUxBUk1fRVhUSUMyX0NMRUFSX0ZMQUcoKSAgICAgICAgICAoRVhUSS0+UFIyID0gKFJUQ19FWFRJX0xJTkVfQUxBUk1fRVZFTlQpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgICogQGJyaWVmIEdlbmVyYXRlIGEgU29mdHdhcmUgaW50ZXJydXB0IG9uIFJUQyBBbGFybSBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0dFTkVSQVRFX1NXSVQoKSAgICAgICAgIChFWFRJLT5TV0lFUjEgfD0gUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBSVEMgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfcnRjX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnMgUlRDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19Jbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKwordm9pZCBIQUxfUlRDX01zcEluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOwordm9pZCBIQUxfUlRDX01zcERlSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19SZWdpc3RlckNhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBSVENfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1VuUmVnaXN0ZXJDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgSEFMX1JUQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBSVEMgVGltZSBhbmQgRGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRUaW1lKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRUaW1lKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBSVEMgQWxhcm0gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFJUQyBBbGFybSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0RlYWN0aXZhdGVBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQWxhcm0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBBbGFybSwgdWludDMyX3QgRm9ybWF0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwICBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8gIAorLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfSGFuZGxlVHlwZURlZiogaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8gIAorLyogUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9SVENTdGF0ZVR5cGVEZWYgSEFMX1JUQ19HZXRTdGF0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLyAgCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX0NvbnN0YW50cyBSVEMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogTWFza3MgRGVmaW5pdGlvbiAqLworI2RlZmluZSBSVENfVFJfUkVTRVJWRURfTUFTSyAgKCh1aW50MzJfdCkgKFJUQ19UUl9QTSB8IFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVFJfTU5UIHwgUlRDX1RSX01OVXwgUlRDX1RSX1NUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19UUl9TVSkpCisjZGVmaW5lIFJUQ19EUl9SRVNFUlZFRF9NQVNLICAoKHVpbnQzMl90KSAoUlRDX0RSX1lUIHwgUlRDX0RSX1lVIHwgUlRDX0RSX1dEVSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRFJfTVQgfCBSVENfRFJfTVUgfCBSVENfRFJfRFQgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19EUl9EVSkpCisjZGVmaW5lIFJUQ19JTklUX01BU0sgICAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGRlUpCisjZGVmaW5lIFJUQ19SU0ZfTUFTSyAgICAgICAgICAgICgodWludDMyX3QpfihSVENfSVNSX0lOSVQgfCBSVENfSVNSX1JTRikpCisKKyNkZWZpbmUgUlRDX1RJTUVPVVRfVkFMVUUgIDEwMDBVCisKKyNkZWZpbmUgUlRDX0VYVElfTElORV9BTEFSTV9FVkVOVCAgICAgICAgICAgICAoTExfRVhUSV9MSU5FXzE3KSAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIGNvbm5lY3RlZCB0byB0aGUgUlRDIEFsYXJtIGV2ZW50ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX01hY3JvcyBSVEMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19JU19SVENfRGVmaW5pdGlvbnMgUlRDIFByaXZhdGUgbWFjcm9zIHRvIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMKKyAgKiBAeworICAqLyAKKworI2RlZmluZSBJU19SVENfSE9VUl9GT1JNQVQoRk9STUFUKSAgICAgKCgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8xMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRk9STUFUKSA9PSBSVENfSE9VUkZPUk1BVF8yNCkpCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVF9QT0woUE9MKSAoKChQT0wpID09IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBPTCkgPT0gUlRDX09VVFBVVF9QT0xBUklUWV9MT1cpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfVFlQRShUWVBFKSAoKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUWVBFKSA9PSBSVENfT1VUUFVUX1RZUEVfUFVTSFBVTEwpKQorCisjZGVmaW5lIElTX1JUQ19PVVRQVVRfUkVNQVAoUkVNQVApICAgKCgoUkVNQVApID09IFJUQ19PVVRQVVRfUkVNQVBfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFTUFQKSA9PSBSVENfT1VUUFVUX1JFTUFQX1BPUzEpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSRk9STUFUMTIoUE0pICAoKChQTSkgPT0gUlRDX0hPVVJGT1JNQVQxMl9BTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE0pID09IFJUQ19IT1VSRk9STUFUMTJfUE0pKQorCisjZGVmaW5lIElTX1JUQ19EQVlMSUdIVF9TQVZJTkcoU0FWRSkgKCgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX1NVQjFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX0FERDFIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gUlRDX0RBWUxJR0hUU0FWSU5HX05PTkUpKQorCisjZGVmaW5lIElTX1JUQ19TVE9SRV9PUEVSQVRJT04oT1BFUkFUSU9OKSAoKChPUEVSQVRJT04pID09IFJUQ19TVE9SRU9QRVJBVElPTl9SRVNFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1BFUkFUSU9OKSA9PSBSVENfU1RPUkVPUEVSQVRJT05fU0VUKSkKKworI2RlZmluZSBJU19SVENfRk9STUFUKEZPUk1BVCkgKCgoRk9STUFUKSA9PSBSVENfRk9STUFUX0JJTikgfHwgKChGT1JNQVQpID09IFJUQ19GT1JNQVRfQkNEKSkKKworI2RlZmluZSBJU19SVENfWUVBUihZRUFSKSAgICAgICAgICAgICAgKChZRUFSKSA8PSAodWludDMyX3QpOTlVKQorCisjZGVmaW5lIElTX1JUQ19NT05USChNT05USCkgICAgICAgICAgICAoKChNT05USCkgPj0gKHVpbnQzMl90KTFVKSAmJiAoKE1PTlRIKSA8PSAodWludDMyX3QpMTJVKSkKKworI2RlZmluZSBJU19SVENfREFURShEQVRFKSAgICAgICAgICAgICAgKCgoREFURSkgPj0gKHVpbnQzMl90KTFVKSAmJiAoKERBVEUpIDw9ICh1aW50MzJfdCkzMVUpKQorCisjZGVmaW5lIElTX1JUQ19XRUVLREFZKFdFRUtEQVkpICgoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX01PTkRBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9UVUVTREFZKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfV0VETkVTREFZKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RIVVJTREFZKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9GUklEQVkpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfU0FUVVJEQVkpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9EQVRFKERBVEUpICgoKERBVEUpID4odWludDMyX3QpMFUpICYmICgoREFURSkgPD0gKHVpbnQzMl90KTMxVSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKFdFRUtEQVkpICgoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX01PTkRBWSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfVFVFU0RBWSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9XRURORVNEQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1RIVVJTREFZKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0VFS0RBWSkgPT0gUlRDX1dFRUtEQVlfRlJJREFZKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXRUVLREFZKSA9PSBSVENfV0VFS0RBWV9TQVRVUkRBWSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdFRUtEQVkpID09IFJUQ19XRUVLREFZX1NVTkRBWSkpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoU0VMKSAoKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTRUwpID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX1dFRUtEQVkpKQorCisjZGVmaW5lIElTX1JUQ19BTEFSTV9NQVNLKE1BU0spICAoKChNQVNLKSAmIH4oUlRDX0FMQVJNTUFTS19BTEwpKSA9PSAwVSkKKworI2RlZmluZSBJU19SVENfQUxBUk0oQUxBUk0pICAgICAgKCgoQUxBUk0pID09IFJUQ19BTEFSTV9BKSB8fCAoKEFMQVJNKSA9PSBSVENfQUxBUk1fQikpCisKKyNkZWZpbmUgSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoVkFMVUUpICgoVkFMVUUpIDw9IFJUQ19BTFJNQVNTUl9TUykKKworI2RlZmluZSBJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9NQVNLKE1BU0spICAgKCgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19BTEwpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF83KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0XzExKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX1NTMTRfMTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFJUQ19BTEFSTVNVQlNFQ09ORE1BU0tfU1MxNF8xMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gUlRDX0FMQVJNU1VCU0VDT05ETUFTS19TUzE0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBSVENfQUxBUk1TVUJTRUNPTkRNQVNLX05PTkUpKQorCisjZGVmaW5lIElTX1JUQ19BU1lOQ0hfUFJFRElWKFBSRURJVikgICAoKFBSRURJVikgPD0gKHVpbnQzMl90KTB4N0ZVKQorCisjZGVmaW5lIElTX1JUQ19TWU5DSF9QUkVESVYoUFJFRElWKSAgICAoKFBSRURJVikgPD0gKHVpbnQzMl90KTB4N0ZGRlUpCisKKyNkZWZpbmUgSVNfUlRDX0hPVVIxMihIT1VSKSAgICAgICAgICAgICgoKEhPVVIpID4gKHVpbnQzMl90KTBVKSAmJiAoKEhPVVIpIDw9ICh1aW50MzJfdCkxMlUpKQorCisjZGVmaW5lIElTX1JUQ19IT1VSMjQoSE9VUikgICAgICAgICAgICAoKEhPVVIpIDw9ICh1aW50MzJfdCkyM1UpCisKKyNkZWZpbmUgSVNfUlRDX01JTlVURVMoTUlOVVRFUykgICAgICAgICgoTUlOVVRFUykgPD0gKHVpbnQzMl90KTU5VSkKKworI2RlZmluZSBJU19SVENfU0VDT05EUyhTRUNPTkRTKSAgICAgICAgKChTRUNPTkRTKSA8PSAodWludDMyX3QpNTlVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9GdW5jdGlvbnMgUlRDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBSVENfRW50ZXJJbml0TW9kZShSVENfSGFuZGxlVHlwZURlZiogaHJ0Yyk7Cit1aW50OF90ICAgICAgICAgICAgUlRDX0J5dGVUb0JjZDIodWludDhfdCBWYWx1ZSk7Cit1aW50OF90ICAgICAgICAgICAgUlRDX0JjZDJUb0J5dGUodWludDhfdCBWYWx1ZSk7CisvKioKKyAgKiBAfQorICAqLworICAKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfUlRDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3J0Y19leC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfcnRjX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMGMyYQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX3J0Y19leC5oCkBAIC0wLDAgKzEsMTQ5NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcnRjX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJUQyBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8gCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfUlRDX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9SVENfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXggUlRDRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9UeXBlcyBSVENFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUlRDIFRhbXBlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgVGFtcGVyOyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIFBpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9QaW5zX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgSW50ZXJydXB0OyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIEludGVycnVwdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9JbnRlcnJ1cHRfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUcmlnZ2VyOyAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUYW1wZXIgVHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgIFJUQ0V4X1RhbXBlcl9UcmlnZ2VyX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgTm9FcmFzZTsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIG5vIGVyYXNlIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmICBSVENFeF9UYW1wZXJfRXJhc2VCYWNrVXBfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBNYXNrRmxhZzsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVGFtcGVyIEZsYWcgbWFza2luZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX01hc2tGbGFnX0RlZmluaXRpb25zICAgKi8KKworICB1aW50MzJfdCBGaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRmlsdGVyIFRhbXBlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX0ZpbHRlcl9EZWZpbml0aW9ucyAqLworCisgIHVpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5OyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1NhbXBsaW5nX0ZyZXF1ZW5jaWVzX0RlZmluaXRpb25zICovCisKKyAgdWludDMyX3QgUHJlY2hhcmdlRHVyYXRpb247ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUHJlY2hhcmdlIER1cmF0aW9uIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1Bpbl9QcmVjaGFyZ2VfRHVyYXRpb25fRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUYW1wZXJQdWxsVXA7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUYW1wZXIgUHVsbFVwIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1B1bGxfVVBfRGVmaW5pdGlvbnMgKi8KKworICB1aW50MzJfdCBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDRXhfVGFtcGVyX1RpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uX0RlZmluaXRpb25zICovCit9UlRDX1RhbXBlclR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9Db25zdGFudHMgUlRDRXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyAgCisvKiogQGRlZmdyb3VwIFJUQ0V4X091dHB1dF9zZWxlY3Rpb25fRGVmaW5pdGlvbnMgUlRDRXggT3V0cHV0IFNlbGVjdGlvbiBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX09VVFBVVF9ESVNBQkxFICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19PVVRQVVRfQUxBUk1BICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9PU0VMXzApCisjZGVmaW5lIFJUQ19PVVRQVVRfQUxBUk1CICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9PU0VMXzEpCisjZGVmaW5lIFJUQ19PVVRQVVRfV0FLRVVQICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19DUl9PU0VMKQorCisvKioKKyAgKiBAfQorICAqLworIAorLyoqIEBkZWZncm91cCBSVENFeF9CYWNrdXBfUmVnaXN0ZXJzX0RlZmluaXRpb25zIFJUQ0V4IEJhY2t1cCBSZWdpc3RlcnMgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19CS1BfRFIwICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfQktQX0RSMSAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjIgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJUQ19CS1BfRFIzICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKQorI2RlZmluZSBSVENfQktQX0RSNCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkKKyNkZWZpbmUgUlRDX0JLUF9EUjUgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNVUpCisjZGVmaW5lIFJUQ19CS1BfRFI2ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKQorI2RlZmluZSBSVENfQktQX0RSNyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA3VSkKKyNkZWZpbmUgUlRDX0JLUF9EUjggICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpCisjZGVmaW5lIFJUQ19CS1BfRFI5ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDlVKQorI2RlZmluZSBSVENfQktQX0RSMTAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDBBVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjExICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwQlUpCisjZGVmaW5lIFJUQ19CS1BfRFIxMiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMENVKQorI2RlZmluZSBSVENfQktQX0RSMTMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDBEVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjE0ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwRVUpCisjZGVmaW5lIFJUQ19CS1BfRFIxNSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMEZVKQorI2RlZmluZSBSVENfQktQX0RSMTYgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkKKyNkZWZpbmUgUlRDX0JLUF9EUjE3ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMVUpCisjZGVmaW5lIFJUQ19CS1BfRFIxOCAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTJVKQorI2RlZmluZSBSVENfQktQX0RSMTkgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEzVSkKKyAgICAKKy8qKgorICAqIEB9CisgICovCisgIAorICAKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGltZV9TdGFtcF9FZGdlc19kZWZpbml0aW9ucyBSVENFeCBUaW1lIFN0YW1wIEVkZ2VzIGRlZmluaXRpb24KKyAgKiBAeworICAqLyAKKyNkZWZpbmUgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HICAgICAgIFJUQ19DUl9UU0VER0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UaW1lU3RhbXBfUGluX1NlbGVjdGlvbnMgUlRDRXggVGltZVN0YW1wIFBpbiBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKyAgCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9QaW5zX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBQaW5zIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX1RBTVBFUl8xICAgICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxRQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworI2RlZmluZSBSVENfVEFNUEVSXzIgICAgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDJFCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QRVJfMyAgICAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QM0UKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX0ludGVycnVwdF9EZWZpbml0aW9ucyBSVENFeCBUYW1wZXIgSW50ZXJydXB0IERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19UQU1QRVIxX0lOVEVSUlVQVCAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMUlFCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisKKyNkZWZpbmUgUlRDX1RBTVBFUjJfSU5URVJSVVBUICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAySUUKKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX1RBTVBFUjNfSU5URVJSVVBUICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAzSUUKKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisjZGVmaW5lIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVCAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVBJRQorLyoqCisgICogQH0KKyAgKi8gICAgICAgIAorCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9UcmlnZ2VyX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBUcmlnZ2VyIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9GQUxMSU5HRURHRSAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpCisjZGVmaW5lIFJUQ19UQU1QRVJUUklHR0VSX0xPV0xFVkVMICAgICAgICAgUlRDX1RBTVBFUlRSSUdHRVJfUklTSU5HRURHRQorI2RlZmluZSBSVENfVEFNUEVSVFJJR0dFUl9ISUdITEVWRUwgICAgICAgIFJUQ19UQU1QRVJUUklHR0VSX0ZBTExJTkdFREdFCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX0VyYXNlQmFja1VwX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBFcmFzZUJhY2tVcCBEZWZpbml0aW9ucworKiBAeworKi8KKyNkZWZpbmUgUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRElTQUJMRSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX01hc2tGbGFnX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBNYXNrRmxhZyBEZWZpbml0aW9ucworKiBAeworKi8KKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX1RBTVBFUk1BU0tfRkxBR19FTkFCTEUgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfRmlsdGVyX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBGaWx0ZXIgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSRklMVEVSX0RJU0FCTEUgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBUYW1wZXIgZmlsdGVyIGlzIGRpc2FibGVkICovCisKKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl8yU0FNUExFICAgUlRDX1RBTVBDUl9UQU1QRkxUXzAgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl80U0FNUExFICAgUlRDX1RBTVBDUl9UQU1QRkxUXzEgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZWwgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUkZJTFRFUl84U0FNUExFICAgUlRDX1RBTVBDUl9UQU1QRkxUICAgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBzYW1wbGVzIGF0IHRoZSBhY3RpdmUgbGV2ZS4gKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfU2FtcGxpbmdfRnJlcXVlbmNpZXNfRGVmaW5pdGlvbnMgUlRDRXggVGFtcGVyIFNhbXBsaW5nIEZyZXF1ZW5jaWVzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMzI3NjggICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAzMjc2OCAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxNjM4NCAgUlRDX1RBTVBDUl9UQU1QRlJFUV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTYzODQgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWODE5MiAgIFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDgxOTIgICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjQwOTYgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBDUl9UQU1QRlJFUV8wIHwgUlRDX1RBTVBDUl9UQU1QRlJFUV8xKSkgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA0MDk2ICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyMDQ4ICAgUlRDX1RBTVBDUl9UQU1QRlJFUV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMjA0OCAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlNBTVBMSU5HRlJFUV9SVENDTEtfRElWMTAyNCAgICgodWludDMyX3QpIChSVENfVEFNUENSX1RBTVBGUkVRXzAgfCBSVENfVEFNUENSX1RBTVBGUkVRXzIpKSAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDEwMjQgICovCisjZGVmaW5lIFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjUxMiAgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBDUl9UQU1QRlJFUV8xIHwgUlRDX1RBTVBDUl9UQU1QRlJFUV8yKSkgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyA1MTIgICAqLworI2RlZmluZSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyNTYgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVBGUkVRXzIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDI1NiAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1Bpbl9QcmVjaGFyZ2VfRHVyYXRpb25fRGVmaW5pdGlvbnMgUlRDRXggVGFtcGVyIFBpbiBQcmVjaGFyZ2UgRHVyYXRpb24gRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fMVJUQ0NMSyAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBkdXJpbmcgMSBSVENDTEsgY3ljbGUgICovCisjZGVmaW5lIFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl8yUlRDQ0xLICBSVENfVEFNUENSX1RBTVBQUkNIXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nIGR1cmluZyAyIFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzRSVENDTEsgIFJUQ19UQU1QQ1JfVEFNUFBSQ0hfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgZHVyaW5nIDQgUlRDQ0xLIGN5Y2xlcyAqLworI2RlZmluZSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fOFJUQ0NMSyAoKHVpbnQzMl90KShSVENfVEFNUENSX1RBTVBQUkNIXzAgfCBSVENfVEFNUENSX1RBTVBQUkNIXzEpKSAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBkdXJpbmcgOCBSVENDTEsgY3ljbGVzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfVGFtcGVyX1RpbWVTdGFtcE9uVGFtcGVyRGV0ZWN0aW9uX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBUaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbiBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9FTkFCTEUgIFJUQ19UQU1QQ1JfVEFNUFRTICAgICAgIC8qITwgVGltZVN0YW1wIG9uIFRhbXBlciBEZXRlY3Rpb24gZXZlbnQgc2F2ZWQgICAgICAgICovCisjZGVmaW5lIFJUQ19USU1FU1RBTVBPTlRBTVBFUkRFVEVDVElPTl9ESVNBQkxFICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAvKiE8IFRpbWVTdGFtcCBvbiBUYW1wZXIgRGV0ZWN0aW9uIGV2ZW50IGlzIG5vdCBzYXZlZCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlcl9QdWxsX1VQX0RlZmluaXRpb25zIFJUQ0V4IFRhbXBlciBQdWxsIFVQIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX1RBTVBFUl9QVUxMVVBfRU5BQkxFICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nICovCisjZGVmaW5lIFJUQ19UQU1QRVJfUFVMTFVQX0RJU0FCTEUgIFJUQ19UQU1QQ1JfVEFNUFBVRElTICAgLyohPCBUYW1wZXIgcGlucyBwcmUtY2hhcmdlIGlzIGRpc2FibGVkICAgICAgICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfV2FrZXVwX1RpbWVyX0RlZmluaXRpb25zIFJUQ0V4IFdha2V1cCBUaW1lciBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMTYgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWOCAgICAgICAgIFJUQ19DUl9XVUNLU0VMXzAKKyNkZWZpbmUgUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVY0ICAgICAgICAgUlRDX0NSX1dVQ0tTRUxfMQorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjIgICAgICAgICAoKHVpbnQzMl90KSAoUlRDX0NSX1dVQ0tTRUxfMCB8IFJUQ19DUl9XVUNLU0VMXzEpKQorI2RlZmluZSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xNkJJVFMgICAgICBSVENfQ1JfV1VDS1NFTF8yCisjZGVmaW5lIFJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE3QklUUyAgICAgICgodWludDMyX3QpIChSVENfQ1JfV1VDS1NFTF8xIHwgUlRDX0NSX1dVQ0tTRUxfMikpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1Ntb290aF9jYWxpYl9wZXJpb2RfRGVmaW5pdGlvbnMgUlRDRXggU21vb3RoIGNhbGliIHBlcmlvZCBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUMgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgSWYgUlRDQ0xLID0gMzI3NjggSHosIFNtb290aCBjYWxpYmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgaXMgMzJzLCAgZWxzZSAyZXhwMjAgUlRDQ0xLIHB1bHNlcyAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUEVSSU9EXzE2U0VDICAgUlRDX0NBTFJfQ0FMVzE2ICAgICAgICAgIC8qITwgSWYgUlRDQ0xLID0gMzI3NjggSHosIFNtb290aCBjYWxpYmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgaXMgMTZzLCBlbHNlIDJleHAxOSBSVENDTEsgcHVsc2VzICovCisjZGVmaW5lIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfOFNFQyAgICBSVENfQ0FMUl9DQUxXOCAgICAgICAgICAgLyohPCBJZiBSVENDTEsgPSAzMjc2OCBIeiwgU21vb3RoIGNhbGliYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCBpcyA4cywgZWxzZSAyZXhwMTggUlRDQ0xLIHB1bHNlcyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X1Ntb290aF9jYWxpYl9QbHVzX3B1bHNlc19EZWZpbml0aW9ucyBSVENFeCBTbW9vdGggY2FsaWIgUGx1cyBwdWxzZXMgRGVmaW5pdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBSVENfU01PT1RIQ0FMSUJfUExVU1BVTFNFU19TRVQgICAgUlRDX0NBTFJfQ0FMUCAgICAgICAgICAgIC8qITwgVGhlIG51bWJlciBvZiBSVENDTEsgcHVsc2VzIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBYIC1zZWNvbmQgd2luZG93ID0gWSAtIENBTE1bODowXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBZID0gNTEyLCAyNTYsIDEyOCB3aGVuIFggPSAzMiwgMTYsIDggKi8KKyNkZWZpbmUgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgLyohPCBUaGUgbnVtYmVyIG9mIFJUQ0NMSyBwdWxzZXMgc3ViYnN0aXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgMzItc2Vjb25kIHdpbmRvdyA9IENBTE1bODowXSAqLworCisvKioKKyAgKiBAfQorICAqLworIC8qKiBAZGVmZ3JvdXAgUlRDRXhfQ2FsaWJfT3V0cHV0X3NlbGVjdGlvbl9EZWZpbml0aW9ucyBSVENFeCBDYWxpYiBPdXRwdXQgc2VsZWN0aW9uIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUlRDX0NBTElCT1VUUFVUXzUxMkhaICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX0NBTElCT1VUUFVUXzFIWiAgICAgICAgICAgICAgUlRDX0NSX0NPU0VMCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSVENFeF9BZGRfMV9TZWNvbmRfUGFyYW1ldGVyX0RlZmluaXRpb24gUlRDRXggQWRkIDEgU2Vjb25kIFBhcmFtZXRlciBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIFJUQ19TSElGVEFERDFTX1JFU0VUICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgUlRDX1NISUZUQUREMVNfU0VUICAgICAgICBSVENfU0hJRlRSX0FERDFTCisvKioKKyAgKiBAfQorICAqLworICAvKiogQGRlZmdyb3VwIFJUQ0V4X0ludGVycnVwdHNfRGVmaW5pdGlvbnMgUlRDRXggSW50ZXJydXB0cyBEZWZpbml0aW9ucworICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBSVENfSVRfVEFNUDMgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVAzSUUpICAvKiE8IEVuYWJsZSBUYW1wZXIgMyBJbnRlcnJ1cHQgICAgICovCisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisgICAgCisvKiogQGRlZmdyb3VwIFJUQ0V4X0ZsYWdzX0RlZmluaXRpb25zIFJUQ0V4IEZsYWdzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIFJUQ19GTEFHX1RBTVAzRiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19JU1JfVEFNUDNGKQorI2VuZGlmCisvKioKKyAgKiBAfQorICAqLyAgCisgIAorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfTWFjcm9zIFJUQ0V4IEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVdBS0VVUFRJTUVSLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfV2FrZVVwX1RpbWVyIFJUQyBXYWtlVXAgVGltZXIKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBXYWtlVXAgVGltZXIgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfV1VURSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFdha2VVcCBUaW1lciBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfV1VURSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgV2FrZVVwVGltZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfV1VUOiBXYWtlVXBUaW1lciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfSVRfV1VUOiBXYWtlVXBUaW1lciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFdha2VVcFRpbWVyIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBXYWtlVXBUaW1lciBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9XVVQ6ICBXYWtlVXBUaW1lciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiA0VSkpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBXYWtlIFVwIHRpbWVyIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZSBVcCB0aW1lciBpbnRlcnJ1cHQgc291cmNlcyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1dVVDogIFdha2VVcFRpbWVyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgV2FrZVVwVGltZXIncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFdha2VVcFRpbWVyIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VURgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VUV0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIFdha2UgVXAgdGltZXIncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgV2FrZVVwVGltZXIgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfV1VURgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKXwoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklUKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCkgICAgICAgKEVYVEktPklNUjEgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBvZiBjb3JlIDEuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfSVQoKSAgICAgIChFWFRJLT5JTVIxICY9IH4oUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElDMl9FTkFCTEVfSVQoKSAgICAgICAoRVhUSS0+QzJJTVIxIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSUMyX0RJU0FCTEVfSVQoKSAgICAgIChFWFRJLT5DMklNUjEgJj0gfihSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSkKKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBvZiBjb3JlIDEuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SMSB8PSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBldmVudCBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBvZiBjb3JlIDIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSUMyX0VOQUJMRV9FVkVOVCgpICAgIChFWFRJLT5DMkVNUjEgfD0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXZlbnQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUjEgJj0gfihSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJQzJfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkMyRU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgKEVYVEktPkZUU1IxIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIChFWFRJLT5GVFNSMSAmPSB+KFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpKQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgKEVYVEktPlJUU1IxIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgKEVYVEktPlJUU1IxICY9IH4oUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmlzaW5nICYgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSAgZG8geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBSVEMgV2FrZVVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3Qgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTGluZSBTdGF0dXMuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAgICAgIChFWFRJLT5QUjEgJiBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90IG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSUMyX0dFVF9GTEFHKCkgICAgICAgICAgICAoRVhUSS0+UFIxICYgUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgUlRDIFdha2VVcCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZSBmbGFnIG9mIGNvcmUgMS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0NMRUFSX0ZMQUcoKSAgICAgICAgICAgIChFWFRJLT5QUjEgPSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2xlYXIgdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUgZmxhZyBvZiBjb3JlIDIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSUMyX0NMRUFSX0ZMQUcoKSAgICAgICAgICAoRVhUSS0+UFIxID0gUlRDX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkKKworCisvKi0tLS0tLS0tLS0tLS0tLSovCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBXYWtlVXAgVGltZXIgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgICAgICAoRVhUSS0+U1dJRVIxIHw9IFJUQ19FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQpCisvKi0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRJTUVTVEFNUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RpbWVzdGFtcCBSVEMgVGltZXN0YW1wCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfVFNFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oUlRDX0NSX1RTRSkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIGludGVycnVwdCBzb3VyY2UgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RTOiBUaW1lU3RhbXAgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBiZSBkaXNhYmxlZC4gCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUaW1lU3RhbXAgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19JVF9UUzogVGltZVN0YW1wIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gNFUpKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGltZSBTdGFtcCBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRpbWUgU3RhbXAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0lUX1RTOiBUaW1lU3RhbXAgaW50ZXJydXB0ICAgICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpICYgKF9fSU5URVJSVVBUX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIFRpbWVTdGFtcCdzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RTRgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UU09WRgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgVGltZSBTdGFtcCdzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFJUQyBUaW1lU3RhbXAgRmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UU0YKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RTT1ZGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19USU1FU1RBTVBfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpfCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRBTVBFUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X1RhbXBlciBSVEMgVGFtcGVyCisgICogQHsKKyAgKi8gCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIFRhbXBlcjEgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjFfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgfD0gKFJUQ19UQU1QQ1JfVEFNUDFFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyMSBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSMV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiAmPSB+KFJUQ19UQU1QQ1JfVEFNUDFFKSkKKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyMiBpbnB1dCBkZXRlY3Rpb24uCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSMl9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiB8PSAoUlRDX1RBTVBDUl9UQU1QMkUpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUYW1wZXIyIGlucHV0IGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIyX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSICY9IH4oUlRDX1RBTVBDUl9UQU1QMkUpKQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBUYW1wZXIzIGlucHV0IGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVIzX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChSVENfVEFNUENSX1RBTVAzRSkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgUlRDIFRhbXBlcjMgaW5wdXQgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUjNfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgJj0gfihSVENfVEFNUENSX1RBTVAzRSkpCisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKSAmJiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisJCQorLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovICAgCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLiAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovICAgCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLiAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUiAmPSB+KF9fSU5URVJSVVBUX18pKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMzogVGFtcGVyMyBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8gICAKKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5UQU1QQ1IgfD0gKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuIAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkgJiYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCQorLyoqCisgICogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUlRDIFRhbXBlciBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMTogVGFtcGVyMSBpbnRlcnJ1cHQgICAgIAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKChfX0lOVEVSUlVQVF9fKSA9PSBSVENfSVRfVEFNUDEpID8gKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gM1UpKSAhPSAwVSkgPyAxVSA6IDBVKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAyKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDVVKSkgIT0gMFUpID8gMVUgOiAwVSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5URVJSVVBUX18pID09IFJUQ19JVF9UQU1QMykgPyAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiA3VSkpICE9IDBVKSA/IDFVIDogMFUpKQorCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUYW1wZXIgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0ICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QMjogVGFtcGVyMiBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKCgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAxKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDNVKSkgIT0gMFUpID8gMVUgOiAwVSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSU5URVJSVVBUX18pID09IFJUQ19JVF9UQU1QMikgPyAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19JTlRFUlJVUFRfXyk+PiA1VSkpICE9IDBVKSA/IDFVIDogMFUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUYW1wZXIgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEBwYXJhbSBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6ICAgIAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKChfX0lOVEVSUlVQVF9fKSA9PSBSVENfSVRfVEFNUDIpID8gKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoKF9fSU5URVJSVVBUX18pPj4gNVUpKSAhPSAwVSkgPyAxVSA6IDBVKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19JTlRFUlJVUFRfXykgPT0gUlRDX0lUX1RBTVAzKSA/ICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0lOVEVSUlVQVF9fKT4+IDdVKSkgIT0gMFUpID8gMVUgOiAwVSkpCisKKworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpICYmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKwkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBUYW1wZXIgaW50ZXJydXB0IGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFJUQyBUYW1wZXIgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgIEBhcmcgIFJUQ19JVF9UQU1QOiBBbGwgdGFtcGVycyBpbnRlcnJ1cHRzCisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDE6IFRhbXBlcjEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDI6IFRhbXBlcjIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDM6IFRhbXBlcjMgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+VEFNUENSKSAmIChfX0lOVEVSUlVQVF9fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgUlRDIFRhbXBlcidzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIEZsYWcgaXMgcGVuZGluZyBvciBub3QuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDFGOiBUYW1wZXIxIGZsYWcKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAyRjogVGFtcGVyMiBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QM0Y6IFRhbXBlcjMgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgVGFtcGVyJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAxRjogVGFtcGVyMSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMkY6IFRhbXBlcjIgZmxhZworICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZMQUdfVEFNUDNGOiBUYW1wZXIzIGZsYWcgCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSA9ICh+KChfX0ZMQUdfXykgfCBSVENfSVNSX0lOSVQpfCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVQpKQorICAgICAgIAorI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGFtcGVyIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAxOiBUYW1wZXIxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBUYW1wZXIncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAxRjogVGFtcGVyMSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMkY6IFRhbXBlcjIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgVGFtcGVyJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAxRjogVGFtcGVyMSBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QMkY6IFRhbXBlcjIgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgPSAofigoX19GTEFHX18pIHwgUlRDX0lTUl9JTklUKXwoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklUKSkKKworI2VsaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorCisJCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgVGFtcGVyIGludGVycnVwdCBoYXMgYmVlbiBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBSVEMgVGFtcGVyIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICBAYXJnICBSVENfSVRfVEFNUDogQWxsIHRhbXBlcnMgaW50ZXJydXB0cworICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAyOiBUYW1wZXIyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyAgUlRDX0lUX1RBTVAzOiBUYW1wZXIzIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlRBTVBDUikgJiAoX19JTlRFUlJVUFRfXykpICE9IDBVKSA/IDFVIDogMFUpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBUYW1wZXIncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAyRjogVGFtcGVyMiBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QM0Y6IFRhbXBlcjMgZmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKCgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUikgJiAoX19GTEFHX18pKSAhPSAwVSkgPyAxVSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBSVEMgVGFtcGVyJ3MgcGVuZGluZyBmbGFncy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIFRhbXBlciBGbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1RBTVAyRjogVGFtcGVyMiBmbGFnCisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19UQU1QM0Y6IFRhbXBlcjMgZmxhZyAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKH4oKF9fRkxBR19fKSB8IFJUQ19JU1JfSU5JVCl8KChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisKKyNlbmRpZgorCisgICAgICAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKyAKKworI2lmIGRlZmluZWQoUlRDX0lOVEVSTkFMVFNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSVEMgaW50ZXJuYWwgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfSU5URVJOQUxfVElNRVNUQU1QX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9JVFNFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgaW50ZXJuYWwgVGltZVN0YW1wIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfSU5URVJOQUxfVElNRVNUQU1QX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfSVRTRSkpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcCdzIGZsYWcgc3RhdHVzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcCBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRkxBR19JVFNGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKF9fRkxBR19fKSkgIT0gMFUpID8gMVUgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgUlRDIEludGVybmFsIFRpbWUgU3RhbXAncyBwZW5kaW5nIGZsYWdzLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19GTEFHX18gc3BlY2lmaWVzIHRoZSBSVEMgSW50ZXJuYWwgVGltZSBTdGFtcCBGbGFnIHNvdXJjZSB0byBjbGVhci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRkxBR19JVFNGCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpID0gKH4oKF9fRkxBR19fKSB8IFJUQ19JU1JfSU5JVCl8KChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVCkpCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisgICAgICAgCisvKioKKyAgKiBAfQorICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRBTVBFUi9USU1FU1RBTVAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9UYW1wZXJfVGltZXN0YW1wIEVYVEkgUlRDIFRhbXBlciBUaW1lc3RhbXAgRVhUSQorICAqIEB7CisgICovCisgIAorLyogVEFNUEVSIFRJTUVTVEFNUCBFWFRJICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpICAgICAgICAoRVhUSS0+SU1SMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSUMyX0VOQUJMRV9JVCgpICAgICAgKEVYVEktPkMySU1SMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZSBvZiBjb3JlIDEuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9JVCgpICAgICAgIChFWFRJLT5JTVIxICY9IH4oUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdCBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSUMyX0RJU0FCTEVfSVQoKSAgICAgKEVYVEktPkMySU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfRVZFTlQoKSAgICAoRVhUSS0+RU1SMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAyLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSUMyX0VOQUJMRV9FVkVOVCgpICAoRVhUSS0+QzJFTVIxIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV2ZW50IG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX0VWRU5UKCkgICAoRVhUSS0+RU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBldmVudCBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIG9mIGNvcmUgMi4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElDMl9ESVNBQkxFX0VWRU5UKCkgKEVYVEktPkMyRU1SMSAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgICogQGJyaWVmICBFbmFibGUgZmFsbGluZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgKEVYVEktPkZUU1IxIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCkgIChFWFRJLT5GVFNSMSAmPSB+KFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgICAgKEVYVEktPlJUU1IxIHw9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpICAgKEVYVEktPlJUU1IxICY9IH4oUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKSkKKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpICBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lLgorICAqIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiBAcmV0dmFsIE5vbmUuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRElTQUJMRV9SSVNJTkdfRkFMTElOR19FREdFKCkgIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9ESVNBQkxFX1JJU0lOR19FREdFKCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0RJU0FCTEVfRkFMTElOR19FREdFKCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZSBpbnRlcnJ1cHQgZmxhZyBpcyBzZXQgb3Igbm90IG9mIGNvcmUgMS4KKyAgKiBAcmV0dmFsIExpbmUgU3RhdHVzLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0dFVF9GTEFHKCkgICAgICAgICAoRVhUSS0+UFIxICYgUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3Qgb2YgY29yZSAyLgorICAqIEByZXR2YWwgTGluZSBTdGF0dXMuCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElDMl9HRVRfRkxBRygpICAgICAgIChFWFRJLT5QUjIgJiBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgUlRDIFRhbXBlciBhbmQgVGltZXN0YW1wIGFzc29jaWF0ZWQgRXh0aSBsaW5lIGZsYWcgb2YgY29yZSAxLgorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9DTEVBUl9GTEFHKCkgICAgICAgKEVYVEktPlBSMSA9IFJUQ19FWFRJX0xJTkVfVEFNUEVSX1RJTUVTVEFNUF9FVkVOVCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lc3RhbXAgYXNzb2NpYXRlZCBFeHRpIGxpbmUgZmxhZyBvZiBjb3JlIDIuCisgICogQHJldHZhbCBOb25lLgorICAqLworI2RlZmluZSBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJQzJfQ0xFQVJfRkxBRygpICAgICAoRVhUSS0+UFIxID0gUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UKQorCisvKioKKyAgKiBAYnJpZWYgR2VuZXJhdGUgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQgb24gdGhlIFJUQyBUYW1wZXIgYW5kIFRpbWVzdGFtcCBhc3NvY2lhdGVkIEV4dGkgbGluZQorICAqIEByZXR2YWwgTm9uZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1RBTVBFUl9USU1FU1RBTVBfRVhUSV9HRU5FUkFURV9TV0lUKCkgICAgKEVYVEktPlNXSUVSMSB8PSBSVENfRVhUSV9MSU5FX1RBTVBFUl9USU1FU1RBTVBfRVZFTlQpCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DYWxpYnJhdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9DYWxpYnJhdGlvbiBSVEMgQ2FsaWJyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgUlRDIGNhbGlicmF0aW9uIG91dHB1dC4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IChSVENfQ1JfQ09FKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjYWxpYnJhdGlvbiBvdXRwdXQuCisgICogQHBhcmFtIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBSVEMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSB+KFJUQ19DUl9DT0UpKQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBjbG9jayByZWZlcmVuY2UgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NMT0NLUkVGX0RFVEVDVElPTl9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gKFJUQ19DUl9SRUZDS09OKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBjbG9jayByZWZlcmVuY2UgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUlRDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX0NMT0NLUkVGX0RFVEVDVElPTl9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gfihSVENfQ1JfUkVGQ0tPTikpCisKKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFJUQyBzaGlmdCBvcGVyYXRpb24ncyBmbGFnIHN0YXR1cy4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFJUQyBoYW5kbGUuCisgICogQHBhcmFtIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUlRDIHNoaWZ0IG9wZXJhdGlvbiBGbGFnIGlzIHBlbmRpbmcgb3Igbm90LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GTEFHX1NIUEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfUlRDX1NISUZUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmIChfX0ZMQUdfXykpICE9IDBVKT8gMVUgOiAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSVENFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBSVEMgVGltZVN0YW1wIGFuZCBUYW1wZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBkZWZncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMKKyAqIEB7CisgKi8gCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVTdGFtcEVkZ2UsIHVpbnQzMl90IFJUQ19UaW1lU3RhbXBQaW4pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcF9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisjaWYgZGVmaW5lZChSVENfSU5URVJOQUxUU19TVVBQT1JUKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldEludGVybmFsVGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlSW50ZXJuYWxUaW1lU3RhbXAoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworI2VuZGlmCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfR2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lU3RhbXAsIFJUQ19EYXRlVHlwZURlZiAqc1RpbWVTdGFtcERhdGUsIHVpbnQzMl90IEZvcm1hdCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUYW1wZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UYW1wZXJUeXBlRGVmKiBzVGFtcGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUYW1wZXJfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UYW1wZXJUeXBlRGVmKiBzVGFtcGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlVGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUYW1wZXIpOwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RhbXBlclRpbWVTdGFtcElSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9UYW1wZXIzRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLwordm9pZCAgICAgICAgICAgICAgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JUaW1lU3RhbXBFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JUYW1wZXIxRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpOworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvclRhbXBlcjNFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUlRDIFdha2UtdXAgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAqIEB7CisgKi8gCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFdha2VVcFRpbWVyX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBXYWtlVXBDb3VudGVyLCB1aW50MzJfdCBXYWtlVXBDbG9jayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVdha2VVcFRpbWVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3VpbnQzMl90ICAgICAgICAgIEhBTF9SVENFeF9HZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7Cit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JXYWtlVXBUaW1lckV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4dGVuZGVkIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiBAeworICovIAorCit2b2lkIEhBTF9SVENFeF9CS1VQV3JpdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IEJhY2t1cFJlZ2lzdGVyLCB1aW50MzJfdCBEYXRhKTsKK3VpbnQzMl90IEhBTF9SVENFeF9CS1VQUmVhZChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpOworCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U21vb3RoQ2FsaWIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFNtb290aENhbGliUGVyaW9kLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMsIHVpbnQzMl90IFNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0U3luY2hyb1NoaWZ0KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBTaGlmdEFkZDFTLCB1aW50MzJfdCBTaGlmdFN1YkZTKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRDYWxpYnJhdGlvbk91dFB1dChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQ2FsaWJPdXRwdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVDYWxpYnJhdGlvbk91dFB1dChSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0UmVmQ2xvY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVSZWZDbG9jayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRW5hYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EaXNhYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4dGVuZGVkIFJUQyBmZWF0dXJlcyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAqIEB7CisgKi8gCit2b2lkICAgICAgICAgICAgICBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0Yyk7IAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JBbGFybUJFdmVudChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENFeF9Qcml2YXRlX0NvbnN0YW50cyBSVENFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisgIAorLyogTWFza3MgRGVmaW5pdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpICYmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgICAgICAKKyNkZWZpbmUgUlRDX0ZMQUdTX01BU0sgICAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19GTEFHX1JFQ0FMUEYgfCBSVENfRkxBR19UQU1QM0YgfCBSVENfRkxBR19UQU1QMkYgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19UQU1QMUZ8IFJUQ19GTEFHX1RTT1ZGIHwgUlRDX0ZMQUdfVFNGICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfV1VURiB8IFJUQ19GTEFHX0FMUkJGIHwgUlRDX0ZMQUdfQUxSQUYgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0lOSVRGIHwgUlRDX0ZMQUdfUlNGICAgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19JTklUUyB8IFJUQ19GTEFHX1NIUEYgfCBSVENfRkxBR19XVVRXRiAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfQUxSQldGIHwgUlRDX0ZMQUdfQUxSQVdGKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBSVENfVEFNUENSX1RBTVBYRSAgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QQ1JfVEFNUDNFIHwgUlRDX1RBTVBDUl9UQU1QMkUgfCBSVENfVEFNUENSX1RBTVAxRSkpCisjZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhJRSAgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBFUjFfSU5URVJSVVBUIHwgUlRDX1RBTVBFUjJfSU5URVJSVVBUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QRVIzX0lOVEVSUlVQVCB8IFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVCkpCisgICAgICAgCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgCisjZGVmaW5lIFJUQ19GTEFHU19NQVNLICAgICAgICAgICgodWludDMyX3QpIChSVENfRkxBR19SRUNBTFBGIHwgUlRDX0ZMQUdfVEFNUDJGIHwgUlRDX0ZMQUdfVEFNUDFGfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19UU09WRiB8IFJUQ19GTEFHX1RTRiB8IFJUQ19GTEFHX1dVVEYgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19BTFJCRiB8IFJUQ19GTEFHX0FMUkFGICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19JTklURiB8IFJUQ19GTEFHX1JTRiB8IFJUQ19GTEFHX0lOSVRTICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19TSFBGIHwgUlRDX0ZMQUdfV1VUV0YgfFJUQ19GTEFHX0FMUkJXRiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19BTFJBV0YpKQorCisjZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhFICAgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBDUl9UQU1QMkUgfCBSVENfVEFNUENSX1RBTVAxRSkpCisjZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhJRSAgICAoKHVpbnQzMl90KSAoUlRDX1RBTVBFUjFfSU5URVJSVVBUIHwgUlRDX1RBTVBFUjJfSU5URVJSVVBUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BTExfVEFNUEVSX0lOVEVSUlVQVCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZWxpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgUlRDX0ZMQUdTX01BU0sgICAgICAgICAgKCh1aW50MzJfdCkgKFJUQ19GTEFHX1JFQ0FMUEYgfCBSVENfRkxBR19UQU1QM0YgfCBSVENfRkxBR19UQU1QMkYgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19UU09WRiB8IFJUQ19GTEFHX1RTRiAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfV1VURiB8IFJUQ19GTEFHX0FMUkJGIHwgUlRDX0ZMQUdfQUxSQUYgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19GTEFHX0lOSVRGIHwgUlRDX0ZMQUdfUlNGICAgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfRkxBR19JTklUUyB8IFJUQ19GTEFHX1NIUEYgfCBSVENfRkxBR19XVVRXRiAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX0ZMQUdfQUxSQldGIHwgUlRDX0ZMQUdfQUxSQVdGKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBSVENfVEFNUENSX1RBTVBYRSAgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QQ1JfVEFNUDNFIHwgUlRDX1RBTVBDUl9UQU1QMkUpKQorI2RlZmluZSBSVENfVEFNUENSX1RBTVBYSUUgICAgKCh1aW50MzJfdCkgKFJUQ19UQU1QRVIyX0lOVEVSUlVQVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVEFNUEVSM19JTlRFUlJVUFQgfCBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQpKQorI2VuZGlmICAgICAgCisKKyNkZWZpbmUgUlRDX0VYVElfTElORV9UQU1QRVJfVElNRVNUQU1QX0VWRU5UICAoRVhUSV9JTVIxX0lNMTgpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTggQ29ubmVjdGVkIHRvIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lIFN0YW1wIGV2ZW50cyAqLworI2RlZmluZSBSVENfRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UICAgICAgIChFWFRJX0lNUjFfSU0xOSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOSBDb25uZWN0ZWQgdG8gdGhlIFJUQyBXYWtldXAgZXZlbnQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDRXhfUHJpdmF0ZV9NYWNyb3MgUlRDRXggUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ0V4X0lTX1JUQ19EZWZpbml0aW9ucyBQcml2YXRlIG1hY3JvcyB0byBjaGVjayBpbnB1dCBwYXJhbWV0ZXJzCisgICogQHsKKyAgKi8gCisKKyNkZWZpbmUgSVNfUlRDX09VVFBVVChPVVRQVVQpICgoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPVVRQVVQpID09IFJUQ19PVVRQVVRfQUxBUk1BKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT1VUUFVUKSA9PSBSVENfT1VUUFVUX0FMQVJNQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX09VVFBVVF9XQUtFVVApKQorCisjZGVmaW5lIElTX1JUQ19CS1AoQktQKSAgICAgICAgICAgICAgICAgICAoKEJLUCkgPCAodWludDMyX3QpIFJUQ19CS1BfTlVNQkVSKQorCisjZGVmaW5lIElTX1RJTUVTVEFNUF9FREdFKEVER0UpICgoKEVER0UpID09IFJUQ19USU1FU1RBTVBFREdFX1JJU0lORykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HKSkKKworI2RlZmluZSAgSVNfUlRDX1RBTVBFUihUQU1QRVIpICAoKCgoVEFNUEVSKSAmICgodWludDMyX3QpKDB4RkZGRkZGRkZVIF4gUlRDX1RBTVBDUl9UQU1QWEUpKSkgPT0gMHgwMFUpICYmICgoVEFNUEVSKSAhPSAwVSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQoSU5URVJSVVBUKSAoKCgoSU5URVJSVVBUKSAmICh1aW50MzJfdCkoMHhGRkZGRkZGRlUgXiBSVENfVEFNUENSX1RBTVBYSUUpKSA9PSAweDAwVSkgJiYgKChJTlRFUlJVUFQpICE9IDBVKSkKKworI2RlZmluZSBJU19SVENfVElNRVNUQU1QX1BJTihQSU4pICAoKChQSU4pID09IFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVCkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9UUklHR0VSKFRSSUdHRVIpICgoKFRSSUdHRVIpID09IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRSSUdHRVIpID09IFJUQ19UQU1QRVJUUklHR0VSX0ZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUUklHR0VSKSA9PSBSVENfVEFNUEVSVFJJR0dFUl9MT1dMRVZFTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVFJJR0dFUikgPT0gUlRDX1RBTVBFUlRSSUdHRVJfSElHSExFVkVMKSkgCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9FUkFTRV9NT0RFKE1PREUpICAgICAgICAgICAgICgoKE1PREUpID09IFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9NQVNLRkxBR19TVEFURShTVEFURSkgICAgICAgICgoKFNUQVRFKSA9PSBSVENfVEFNUEVSTUFTS19GTEFHX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFJUQ19UQU1QRVJNQVNLX0ZMQUdfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9GSUxURVIoRklMVEVSKSAgKCgoRklMVEVSKSA9PSBSVENfVEFNUEVSRklMVEVSX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklMVEVSKSA9PSBSVENfVEFNUEVSRklMVEVSXzJTQU1QTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklMVEVSKSA9PSBSVENfVEFNUEVSRklMVEVSXzRTQU1QTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklMVEVSKSA9PSBSVENfVEFNUEVSRklMVEVSXzhTQU1QTEUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUShGUkVRKSAoKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYzMjc2OCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxNjM4NCl8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY4MTkyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY0MDk2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYyMDQ4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVYxMDI0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGUkVRKSA9PSBSVENfVEFNUEVSU0FNUExJTkdGUkVRX1JUQ0NMS19ESVY1MTIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZSRVEpID09IFJUQ19UQU1QRVJTQU1QTElOR0ZSRVFfUlRDQ0xLX0RJVjI1NikpCisKKyNkZWZpbmUgSVNfUlRDX1RBTVBFUl9QUkVDSEFSR0VfRFVSQVRJT04oRFVSQVRJT04pICgoKERVUkFUSU9OKSA9PSBSVENfVEFNUEVSUFJFQ0hBUkdFRFVSQVRJT05fMVJUQ0NMSykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRFVSQVRJT04pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl8yUlRDQ0xLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEVVJBVElPTikgPT0gUlRDX1RBTVBFUlBSRUNIQVJHRURVUkFUSU9OXzRSVENDTEspIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRFVSQVRJT04pID09IFJUQ19UQU1QRVJQUkVDSEFSR0VEVVJBVElPTl84UlRDQ0xLKSkKKworI2RlZmluZSBJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihERVRFQ1RJT04pICgoKERFVEVDVElPTikgPT0gUlRDX1RJTUVTVEFNUE9OVEFNUEVSREVURUNUSU9OX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFVEVDVElPTikgPT0gUlRDX1RJTUVTVEFNUE9OVEFNUEVSREVURUNUSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFKFNUQVRFKSAoKChTVEFURSkgPT0gUlRDX1RBTVBFUl9QVUxMVVBfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gUlRDX1RBTVBFUl9QVUxMVVBfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfUlRDX1dBS0VVUF9DTE9DSyhDTE9DSykgKCgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMTYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX1JUQ0NMS19ESVY4KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfUlRDQ0xLX0RJVjQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFJUQ19XQUtFVVBDTE9DS19SVENDTEtfRElWMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTE9DSykgPT0gUlRDX1dBS0VVUENMT0NLX0NLX1NQUkVfMTZCSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMT0NLKSA9PSBSVENfV0FLRVVQQ0xPQ0tfQ0tfU1BSRV8xN0JJVFMpKQorCisjZGVmaW5lIElTX1JUQ19XQUtFVVBfQ09VTlRFUihDT1VOVEVSKSAgKChDT1VOVEVSKSA8PSBSVENfV1VUUl9XVVQpCisKKyNkZWZpbmUgSVNfUlRDX1NNT09USF9DQUxJQl9QRVJJT0QoUEVSSU9EKSAoKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRVJJT0QpID09IFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfOFNFQykpCisKKyNkZWZpbmUgSVNfUlRDX1NNT09USF9DQUxJQl9QTFVTKFBMVVMpICgoKFBMVVMpID09IFJUQ19TTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1NFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUExVUykgPT0gUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQpKQorCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfU21vb3RoX2NhbGliX01pbnVzX3B1bHNlc19EZWZpbml0aW9ucyBSVENFeCBTbW9vdGggY2FsaWIgTWludXMgcHVsc2VzIERlZmluaXRpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIElTX1JUQ19TTU9PVEhfQ0FMSUJfTUlOVVMoVkFMVUUpICgoVkFMVUUpIDw9IFJUQ19DQUxSX0NBTE0pCisvKioKKyAgKiBAfQorICAqLworICAKKworI2RlZmluZSBJU19SVENfU0hJRlRfQUREMVMoU0VMKSAoKChTRUwpID09IFJUQ19TSElGVEFERDFTX1JFU0VUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNFTCkgPT0gUlRDX1NISUZUQUREMVNfU0VUKSkKKworCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfU3Vic3RyYWN0X0ZyYWN0aW9uX09mX1NlY29uZF9WYWx1ZSBSVENFeCBTdWJzdHJhY3QgRnJhY3Rpb24gT2YgU2Vjb25kIFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfUlRDX1NISUZUX1NVQkZTKEZTKSAoKEZTKSA8PSBSVENfU0hJRlRSX1NVQkZTKQorLyoqCisgICogQH0KKyAgKi8KKyNkZWZpbmUgSVNfUlRDX0NBTElCX09VVFBVVChPVVRQVVQpICAoKChPVVRQVVQpID09IFJUQ19DQUxJQk9VVFBVVF81MTJIWikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9VVFBVVCkgPT0gUlRDX0NBTElCT1VUUFVUXzFIWikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9SVENfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfc2FpLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zYWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFmZDFmCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc2FpLmgKQEAgLTAsMCArMSw5NjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3NhaS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTQUkgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfU0FJX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9TQUlfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNBSQorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNBSV9FeHBvcnRlZF9UeXBlcyBTQUkgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU0FJX1NUQVRFX1JFU0VUICAgPSAweDAwVSwgLyohPCBTQUkgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX1NBSV9TVEFURV9SRUFEWSAgID0gMHgwMVUsIC8qITwgU0FJIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9TQUlfU1RBVEVfQlVTWSAgICA9IDB4MDJVLCAvKiE8IFNBSSBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAqLworICBIQUxfU0FJX1NUQVRFX0JVU1lfVFggPSAweDEyVSwgLyohPCBEYXRhIHRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1NBSV9TVEFURV9CVVNZX1JYID0gMHgyMlUsIC8qITwgRGF0YSByZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICovCit9IEhBTF9TQUlfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFNBSSBDYWxsYmFjayBwcm90b3R5cGUKKyAgKi8KK3R5cGVkZWYgdm9pZCAoKlNBSWNhbGxiYWNrKSh2b2lkKTsKKworLyoqIEBkZWZncm91cCBTQUlfUERNX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNBSSBQRE0gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFNBSSBQRE0gSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBGdW5jdGlvbmFsU3RhdGUgIEFjdGl2YXRpb247ICAvKiE8IEVuYWJsZS9kaXNhYmxlIFBETSBpbnRlcmZhY2UgKi8KKyAgdWludDMyX3QgICAgICAgICBNaWNQYWlyc05icjsgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWNyb3Bob25lIHBhaXJzIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzLiAqLworICB1aW50MzJfdCAgICAgICAgIENsb2NrRW5hYmxlOyAvKiE8IFNwZWNpZmllcyB3aGljaCBjbG9jayBtdXN0IGJlIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWVzIGNvbWJpbmF0aW9uIG9mIEByZWYgU0FJX1BETV9DbG9ja0VuYWJsZSAqLworfSBTQUlfUGRtSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9Jbml0X1N0cnVjdHVyZV9kZWZpbml0aW9uIFNBSSBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBTQUkgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBBdWRpb01vZGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU0FJIEJsb2NrIGF1ZGlvIE1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfTW9kZSAqLworCisgIHVpbnQzMl90IFN5bmNocm87ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIFNBSSBCbG9jayBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNBSV9CbG9ja19TeW5jaHJvbml6YXRpb24gKi8KKworICB1aW50MzJfdCBTeW5jaHJvRXh0OyAgICAgICAgICAvKiE8IFNwZWNpZmllcyBTQUkgZXh0ZXJuYWwgb3V0cHV0IHN5bmNocm9uaXphdGlvbiwgdGhpcyBzZXR1cCBpcyBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQmxvY2tBIGFuZCBCbG9ja0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNBSV9CbG9ja19TeW5jRXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgSWYgYm90aCBhdWRpbyBibG9ja3Mgb2Ygc2FtZSBTQUkgYXJlIHVzZWQsIHRoaXMgcGFyYW1ldGVyIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBmb3IgZWFjaCBhdWRpbyBibG9jayAqLworCisgIHVpbnQzMl90IE1ja091dHB1dDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgbWFzdGVyIGNsb2NrIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfTWNrT3V0cHV0ICovCisKKyAgdWludDMyX3QgT3V0cHV0RHJpdmU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hlbiBTQUkgQmxvY2sgb3V0cHV0cyBhcmUgZHJpdmVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX091dHB1dF9Ecml2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgdmFsdWUgaGFzIHRvIGJlIHNldCBiZWZvcmUgZW5hYmxpbmcgdGhlIGF1ZGlvIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGFmdGVyIHRoZSBhdWRpbyBibG9jayBjb25maWd1cmF0aW9uLiAqLworCisgIHVpbnQzMl90IE5vRGl2aWRlcjsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgbWFzdGVyIGNsb2NrIHdpbGwgYmUgZGl2aWRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfTm9EaXZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgSWYgYml0IE5PRElWIGluIHRoZSBTQUlfeENSMSByZWdpc3RlciBpcyBjbGVhcmVkLCB0aGUgZnJhbWUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGFsaWduZWQgdG8gYSBudW1iZXIgZXF1YWwgdG8gYSBwb3dlciBvZiAyLCBmcm9tIDggdG8gMjU2LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGJpdCBOT0RJViBpbiB0aGUgU0FJX3hDUjEgcmVnaXN0ZXIgaXMgc2V0LCB0aGUgZnJhbWUgbGVuZ3RoIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UgYW55IG9mIHRoZSB2YWx1ZXMgZnJvbSA4IHRvIDI1Ni4gKi8KKworICB1aW50MzJfdCBGSUZPVGhyZXNob2xkOyAgICAgICAvKiE8IFNwZWNpZmllcyBTQUkgQmxvY2sgRklGTyB0aHJlc2hvbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfRmlmb19UaHJlc2hvbGQgKi8KKworICB1aW50MzJfdCBBdWRpb0ZyZXF1ZW5jeTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYXVkaW8gZnJlcXVlbmN5IHNhbXBsaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0F1ZGlvX0ZyZXF1ZW5jeSAqLworCisgIHVpbnQzMl90IE1ja2RpdjsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBtYXN0ZXIgY2xvY2sgZGl2aWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSBpZiBBdWRpb0ZyZXF1ZW5jeSBpcyBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUlfQVVESU9fRlJFUVVFTkNZX01DS0RJViBvdGhlcndpc2UgaXQgaXMgaW50ZXJuYWxseSBjb21wdXRlZC4gKi8KKworICB1aW50MzJfdCBNY2tPdmVyU2FtcGxpbmc7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbWFzdGVyIGNsb2NrIG92ZXJzYW1wbGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNBSV9CbG9ja19NY2tfT3ZlclNhbXBsaW5nICovCisKKyAgdWludDMyX3QgTW9ub1N0ZXJlb01vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIG1vbm8gb3Igc3RlcmVvIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfTW9ub19TdGVyZW9fTW9kZSAqLworCisgIHVpbnQzMl90IENvbXBhbmRpbmdNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wYW5kaW5nIG1vZGUgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNBSV9CbG9ja19Db21wYW5kaW5nX01vZGUgKi8KKworICB1aW50MzJfdCBUcmlTdGF0ZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGFuZGluZyBtb2RlIHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfVFJJU3RhdGVfTWFuYWdlbWVudCAqLworCisgIFNBSV9QZG1Jbml0VHlwZURlZiBQZG1Jbml0OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBQRE0gY29uZmlndXJhdGlvbi4gKi8KKworICAvKiBUaGlzIHBhcnQgb2YgdGhlIHN0cnVjdHVyZSBpcyBhdXRvbWF0aWNhbGx5IGZpbGxlZCBpZiB5b3VyIGFyZSB1c2luZyB0aGUgaGlnaCBsZXZlbCBpbml0aWFsaXNhdGlvbgorICAgICBmdW5jdGlvbiBIQUxfU0FJX0luaXRQcm90b2NvbCAqLworCisgIHVpbnQzMl90IFByb3RvY29sOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNBSSBCbG9jayBwcm90b2NvbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX1Byb3RvY29sICovCisKKyAgdWludDMyX3QgRGF0YVNpemU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU0FJIEJsb2NrIGRhdGEgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX0RhdGFfU2l6ZSAqLworCisgIHVpbnQzMl90IEZpcnN0Qml0OyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBkYXRhIHRyYW5zZmVycyBzdGFydCBmcm9tIE1TQiBvciBMU0IgYml0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfTVNCX0xTQl90cmFuc21pc3Npb24gKi8KKworICB1aW50MzJfdCBDbG9ja1N0cm9iaW5nOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBTQUkgQmxvY2sgY2xvY2sgc3Ryb2JpbmcgZWRnZSBzZW5zaXRpdml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX0Nsb2NrX1N0cm9iaW5nICovCit9IFNBSV9Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0ZyYW1lX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNBSSBGcmFtZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU0FJIEZyYW1lIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICB1aW50MzJfdCBGcmFtZUxlbmd0aDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBGcmFtZSBsZW5ndGgsIHRoZSBudW1iZXIgb2YgU0NLIGNsb2NrcyBmb3IgZWFjaCBhdWRpbyBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDggYW5kIE1heF9EYXRhID0gMjU2LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgSWYgbWFzdGVyIGNsb2NrIE1DTEtfeCBwaW4gaXMgZGVjbGFyZWQgYXMgYW4gb3V0cHV0LCB0aGUgZnJhbWUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG51bWJlciBlcXVhbCB0byBwb3dlciBvZiAyIGluIG9yZGVyIHRvIGtlZXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIGF1ZGlvIGZyYW1lLCBhbiBpbnRlZ2VyIG51bWJlciBvZiBNQ0xLIHB1bHNlcyBieSBiaXQgQ2xvY2suICovCisKKyAgdWludDMyX3QgQWN0aXZlRnJhbWVMZW5ndGg7ICAvKiE8IFNwZWNpZmllcyB0aGUgRnJhbWUgc3luY2hyb25pemF0aW9uIGFjdGl2ZSBsZXZlbCBsZW5ndGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxlbmd0aCBpbiBudW1iZXIgb2YgYml0IGNsb2NrIChTQ0sgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFjdGl2ZSBsZXZlbCBvZiBGUyBzaWduYWwgaW4gYXVkaW8gZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDEyOCAqLworCisgIHVpbnQzMl90IEZTRGVmaW5pdGlvbjsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEZyYW1lIHN5bmNocm9uaXphdGlvbiBkZWZpbml0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfRlNfRGVmaW5pdGlvbiAqLworCisgIHVpbnQzMl90IEZTUG9sYXJpdHk7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEZyYW1lIHN5bmNocm9uaXphdGlvbiBQb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX0ZTX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgRlNPZmZzZXQ7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgRnJhbWUgc3luY2hyb25pemF0aW9uIE9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0Jsb2NrX0ZTX09mZnNldCAqLworCit9IFNBSV9GcmFtZUluaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfU2xvdF9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBTQUkgU2xvdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgIFNBSSBCbG9jayBTbG90IEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRmlyc3RCaXRPZmZzZXQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgcG9zaXRpb24gb2YgZmlyc3QgZGF0YSB0cmFuc2ZlciBiaXQgaW4gdGhlIHNsb3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI0ICovCisKKyAgdWludDMyX3QgU2xvdFNpemU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU2xvdCBTaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfQmxvY2tfU2xvdF9TaXplICovCisKKyAgdWludDMyX3QgU2xvdE51bWJlcjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNsb3QgaW4gdGhlIGF1ZGlvIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAxNiAqLworCisgIHVpbnQzMl90IFNsb3RBY3RpdmU7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNsb3RzIGluIGF1ZGlvIGZyYW1lIHRoYXQgd2lsbCBiZSBhY3RpdmF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNBSV9CbG9ja19TbG90X0FjdGl2ZSAqLworfSBTQUlfU2xvdEluaXRUeXBlRGVmOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfSGFuZGxlX1N0cnVjdHVyZV9kZWZpbml0aW9uIFNBSSBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFNBSSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QgX19TQUlfSGFuZGxlVHlwZURlZgoreworICBTQUlfQmxvY2tfVHlwZURlZiAgICAgICAgICpJbnN0YW5jZTsgICAgLyohPCBTQUkgQmxvY2t4IHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgKi8KKworICBTQUlfSW5pdFR5cGVEZWYgICAgICAgICAgIEluaXQ7ICAgICAgICAgLyohPCBTQUkgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgU0FJX0ZyYW1lSW5pdFR5cGVEZWYgICAgICBGcmFtZUluaXQ7ICAgIC8qITwgU0FJIEZyYW1lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCisgIFNBSV9TbG90SW5pdFR5cGVEZWYgICAgICAgU2xvdEluaXQ7ICAgICAvKiE8IFNBSSBTbG90IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqcEJ1ZmZQdHI7ICAgICAvKiE8IFBvaW50ZXIgdG8gU0FJIHRyYW5zZmVyIEJ1ZmZlciAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgWGZlclNpemU7ICAgICAvKiE8IFNBSSB0cmFuc2ZlciBzaXplICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICBYZmVyQ291bnQ7ICAgIC8qITwgU0FJIHRyYW5zZmVyIGNvdW50ZXIgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICpoZG1hdHg7ICAgICAgLyohPCBTQUkgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAqaGRtYXJ4OyAgICAgIC8qITwgU0FJIFJ4IERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIFNBSWNhbGxiYWNrICAgICAgICAgICAgICAgbXV0ZWNhbGxiYWNrOyAvKiE8IFNBSSBtdXRlIGNhbGxiYWNrICovCisKKyAgdm9pZCAoKkludGVycnVwdFNlcnZpY2VSb3V0aW5lKShzdHJ1Y3QgX19TQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7IC8qIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIElSUSBoYW5kbGVyICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICBMb2NrOyAgICAgICAgIC8qITwgU0FJIGxvY2tpbmcgb2JqZWN0ICovCisKKyAgX19JTyBIQUxfU0FJX1N0YXRlVHlwZURlZiBTdGF0ZTsgICAgICAgIC8qITwgU0FJIGNvbW11bmljYXRpb24gc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgLyohPCBTQUkgRXJyb3IgY29kZSAqLworCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsgICAgICAvKiE8IFNBSSByZWNlaXZlIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIHZvaWQgKCpSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsgIC8qITwgU0FJIHJlY2VpdmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworICB2b2lkICgqVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsgICAgICAvKiE8IFNBSSB0cmFuc21pdCBjb21wbGV0ZSBjYWxsYmFjayAqLworICB2b2lkICgqVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7ICAvKiE8IFNBSSB0cmFuc21pdCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIHZvaWQgKCpFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19TQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7ICAgICAgIC8qITwgU0FJIGVycm9yIGNhbGxiYWNrICovCisgIHZvaWQgKCpNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsgICAgIC8qITwgU0FJIE1TUCBpbml0IGNhbGxiYWNrICovCisgIHZvaWQgKCpNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOyAgIC8qITwgU0FJIE1TUCBkZS1pbml0IGNhbGxiYWNrICovCisjZW5kaWYKK30gU0FJX0hhbmRsZVR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBTQUkgY2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9TQUlfUlhfQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwMFUsIC8qITwgU0FJIHJlY2VpdmUgY29tcGxldGUgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX1NBSV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgPSAweDAxVSwgLyohPCBTQUkgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9TQUlfVFhfQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwMlUsIC8qITwgU0FJIHRyYW5zbWl0IGNvbXBsZXRlIGNhbGxiYWNrIElEICovCisgIEhBTF9TQUlfVFhfSEFMRkNPTVBMRVRFX0NCX0lEID0gMHgwM1UsIC8qITwgU0FJIHRyYW5zbWl0IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX1NBSV9FUlJPUl9DQl9JRCAgICAgICAgICAgPSAweDA0VSwgLyohPCBTQUkgZXJyb3IgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX1NBSV9NU1BJTklUX0NCX0lEICAgICAgICAgPSAweDA1VSwgLyohPCBTQUkgTVNQIGluaXQgY2FsbGJhY2sgSUQgKi8KKyAgSEFMX1NBSV9NU1BERUlOSVRfQ0JfSUQgICAgICAgPSAweDA2VSAgLyohPCBTQUkgTVNQIGRlLWluaXQgY2FsbGJhY2sgSUQgKi8KK30gSEFMX1NBSV9DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTQUkgY2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHZvaWQgKCpwU0FJX0NhbGxiYWNrVHlwZURlZikoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNBSV9FeHBvcnRlZF9Db25zdGFudHMgU0FJIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Vycm9yX0NvZGUgU0FJIEVycm9yIENvZGUKKyAgKiBAeworICAqLworI2RlZmluZSBIQUxfU0FJX0VSUk9SX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgTm8gZXJyb3IgKi8KKyNkZWZpbmUgSEFMX1NBSV9FUlJPUl9PVlIgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgSEFMX1NBSV9FUlJPUl9VRFIgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAvKiE8IFVuZGVycnVuIGVycm9yICovCisjZGVmaW5lIEhBTF9TQUlfRVJST1JfQUZTREVUICAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBBbnRpY2lwYXRlZCBGcmFtZSBzeW5jaHJvbmlzYXRpb24gZGV0ZWN0aW9uICovCisjZGVmaW5lIEhBTF9TQUlfRVJST1JfTEZTREVUICAgICAgICAgICAweDAwMDAwMDA4VSAgLyohPCBMYXRlIEZyYW1lIHN5bmNocm9uaXNhdGlvbiBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgSEFMX1NBSV9FUlJPUl9DTlJFQURZICAgICAgICAgIDB4MDAwMDAwMTBVICAvKiE8IGNvZGVjIG5vdCByZWFkeSAqLworI2RlZmluZSBIQUxfU0FJX0VSUk9SX1dDS0NGRyAgICAgICAgICAgMHgwMDAwMDAyMFUgIC8qITwgV3JvbmcgY2xvY2sgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIQUxfU0FJX0VSUk9SX1RJTUVPVVQgICAgICAgICAgMHgwMDAwMDA0MFUgIC8qITwgVGltZW91dCBlcnJvciAqLworI2RlZmluZSBIQUxfU0FJX0VSUk9SX0RNQSAgICAgICAgICAgICAgMHgwMDAwMDA4MFUgIC8qITwgRE1BIGVycm9yICovCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfU0FJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgMHgwMDAwMDEwMFUgIC8qITwgSW52YWxpZCBjYWxsYmFjayBlcnJvciAqLworI2VuZGlmCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19TeW5jRXh0IFNBSSBFeHRlcm5hbCBzeW5jaHJvbmlzYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfU1lOQ0VYVF9ESVNBQkxFICAgICAgICAgIDBVCisjZGVmaW5lIFNBSV9TWU5DRVhUX09VVEJMT0NLQV9FTkFCTEUgMVUKKyNkZWZpbmUgU0FJX1NZTkNFWFRfT1VUQkxPQ0tCX0VOQUJMRSAyVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfTWNrT3V0cHV0IFNBSSBCbG9jayBNYXN0ZXIgQ2xvY2sgT3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX01DS19PVVRQVVRfRElTQUJMRSAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9NQ0tfT1VUUFVUX0VOQUJMRSAgICAgICBTQUlfeENSMV9NQ0tFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfUHJvdG9jb2wgU0FJIFN1cHBvcnRlZCBwcm90b2NvbAorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9JMlNfU1RBTkRBUkQgICAgICAwVQorI2RlZmluZSBTQUlfSTJTX01TQkpVU1RJRklFRCAgMVUKKyNkZWZpbmUgU0FJX0kyU19MU0JKVVNUSUZJRUQgIDJVCisjZGVmaW5lIFNBSV9QQ01fTE9ORyAgICAgICAgICAzVQorI2RlZmluZSBTQUlfUENNX1NIT1JUICAgICAgICAgNFUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX1Byb3RvY29sX0RhdGFTaXplIFNBSSBwcm90b2NvbCBkYXRhIHNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVQgICAgICAgICAwVQorI2RlZmluZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVRFWFRFTkRFRCAxVQorI2RlZmluZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMjRCSVQgICAgICAgICAyVQorI2RlZmluZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMzJCSVQgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQXVkaW9fRnJlcXVlbmN5IFNBSSBBdWRpbyBGcmVxdWVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfQVVESU9fRlJFUVVFTkNZXzE5MksgICAgICAgICAgMTkyMDAwVQorI2RlZmluZSBTQUlfQVVESU9fRlJFUVVFTkNZXzk2SyAgICAgICAgICAgOTYwMDBVCisjZGVmaW5lIFNBSV9BVURJT19GUkVRVUVOQ1lfNDhLICAgICAgICAgICA0ODAwMFUKKyNkZWZpbmUgU0FJX0FVRElPX0ZSRVFVRU5DWV80NEsgICAgICAgICAgIDQ0MTAwVQorI2RlZmluZSBTQUlfQVVESU9fRlJFUVVFTkNZXzMySyAgICAgICAgICAgMzIwMDBVCisjZGVmaW5lIFNBSV9BVURJT19GUkVRVUVOQ1lfMjJLICAgICAgICAgICAyMjA1MFUKKyNkZWZpbmUgU0FJX0FVRElPX0ZSRVFVRU5DWV8xNksgICAgICAgICAgIDE2MDAwVQorI2RlZmluZSBTQUlfQVVESU9fRlJFUVVFTkNZXzExSyAgICAgICAgICAgMTEwMjVVCisjZGVmaW5lIFNBSV9BVURJT19GUkVRVUVOQ1lfOEsgICAgICAgICAgICA4MDAwVQorI2RlZmluZSBTQUlfQVVESU9fRlJFUVVFTkNZX01DS0RJViAgICAgICAgMFUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX01ja19PdmVyU2FtcGxpbmcgU0FJIEJsb2NrIE1hc3RlciBDbG9jayBPdmVyU2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfTUNLX09WRVJTQU1QTElOR19ESVNBQkxFICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX01DS19PVkVSU0FNUExJTkdfRU5BQkxFICAgICAgIFNBSV94Q1IxX09TUgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfUERNX0Nsb2NrRW5hYmxlIFNBSSBQRE0gQ2xvY2sgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX1BETV9DTE9DSzFfRU5BQkxFICAgICBTQUlfUERNQ1JfQ0tFTjEKKyNkZWZpbmUgU0FJX1BETV9DTE9DSzJfRU5BQkxFICAgICBTQUlfUERNQ1JfQ0tFTjIKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX01vZGUgU0FJIEJsb2NrIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfTU9ERU1BU1RFUl9UWCAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9NT0RFTUFTVEVSX1JYICAgICAgICAgU0FJX3hDUjFfTU9ERV8wCisjZGVmaW5lIFNBSV9NT0RFU0xBVkVfVFggICAgICAgICAgU0FJX3hDUjFfTU9ERV8xCisjZGVmaW5lIFNBSV9NT0RFU0xBVkVfUlggICAgICAgICAgKFNBSV94Q1IxX01PREVfMSB8IFNBSV94Q1IxX01PREVfMCkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfUHJvdG9jb2wgU0FJIEJsb2NrIFByb3RvY29sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX0ZSRUVfUFJPVE9DT0wgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9TUERJRl9QUk9UT0NPTCAgICAgICAgICAgICAgICBTQUlfeENSMV9QUlRDRkdfMAorI2RlZmluZSBTQUlfQUM5N19QUk9UT0NPTCAgICAgICAgICAgICAgICAgU0FJX3hDUjFfUFJUQ0ZHXzEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX0RhdGFfU2l6ZSBTQUkgQmxvY2sgRGF0YSBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzggICAgIFNBSV94Q1IxX0RTXzEKKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzEwICAgIChTQUlfeENSMV9EU18xIHwgU0FJX3hDUjFfRFNfMCkKKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzE2ICAgIFNBSV94Q1IxX0RTXzIKKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzIwICAgIChTQUlfeENSMV9EU18yIHwgU0FJX3hDUjFfRFNfMCkKKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzI0ICAgIChTQUlfeENSMV9EU18yIHwgU0FJX3hDUjFfRFNfMSkKKyNkZWZpbmUgU0FJX0RBVEFTSVpFXzMyICAgIChTQUlfeENSMV9EU18yIHwgU0FJX3hDUjFfRFNfMSB8IFNBSV94Q1IxX0RTXzApCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19NU0JfTFNCX3RyYW5zbWlzc2lvbiBTQUkgQmxvY2sgTVNCIExTQiB0cmFuc21pc3Npb24KKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfRklSU1RCSVRfTVNCICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX0ZJUlNUQklUX0xTQiAgICAgICAgICAgICAgICAgIFNBSV94Q1IxX0xTQkZJUlNUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19DbG9ja19TdHJvYmluZyBTQUkgQmxvY2sgQ2xvY2sgU3Ryb2JpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfQ0xPQ0tTVFJPQklOR19GQUxMSU5HRURHRSAgICAgMFUKKyNkZWZpbmUgU0FJX0NMT0NLU1RST0JJTkdfUklTSU5HRURHRSAgICAgIDFVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19TeW5jaHJvbml6YXRpb24gU0FJIEJsb2NrIFN5bmNocm9uaXphdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9BU1lOQ0hST05PVVMgICAgICAgICAgICAgICAgICAwVSAvKiE8IEFzeW5jaHJvbm91cyAqLworI2RlZmluZSBTQUlfU1lOQ0hST05PVVMgICAgICAgICAgICAgICAgICAgMVUgLyohPCBTeW5jaHJvbm91cyB3aXRoIG90aGVyIGJsb2NrIG9mIHNhbWUgU0FJICovCisjZGVmaW5lIFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMSAgICAgICAgICAyVSAvKiE8IFN5bmNocm9ub3VzIHdpdGggb3RoZXIgU0FJLCBTQUkxICovCisjZGVmaW5lIFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMiAgICAgICAgICAzVSAvKiE8IFN5bmNocm9ub3VzIHdpdGggb3RoZXIgU0FJLCBTQUkyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19PdXRwdXRfRHJpdmUgU0FJIEJsb2NrIE91dHB1dCBEcml2ZQorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9PVVRQVVREUklWRV9ESVNBQkxFICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9PVVRQVVREUklWRV9FTkFCTEUgICAgICAgICAgIFNBSV94Q1IxX09VVERSSVYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX05vRGl2aWRlciBTQUkgQmxvY2sgTm9EaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX01BU1RFUkRJVklERVJfRU5BQkxFICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX01BU1RFUkRJVklERVJfRElTQUJMRSAgICAgICAgU0FJX3hDUjFfTk9ESVYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX0ZTX0RlZmluaXRpb24gU0FJIEJsb2NrIEZTIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfRlNfU1RBUlRGUkFNRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX0ZTX0NIQU5ORUxfSURFTlRJRklDQVRJT04gICAgIFNBSV94RlJDUl9GU0RFRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfRlNfUG9sYXJpdHkgU0FJIEJsb2NrIEZTIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX0ZTX0FDVElWRV9MT1cgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBTQUlfRlNfQUNUSVZFX0hJR0ggICAgICAgICAgICAgICAgIFNBSV94RlJDUl9GU1BPTAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfRlNfT2Zmc2V0IFNBSSBCbG9jayBGUyBPZmZzZXQKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfRlNfRklSU1RCSVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX0ZTX0JFRk9SRUZJUlNUQklUICAgICAgICAgICAgIFNBSV94RlJDUl9GU09GRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfU2xvdF9TaXplIFNBSSBCbG9jayBTbG90IFNpemUKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfU0xPVFNJWkVfREFUQVNJWkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX1NMT1RTSVpFXzE2QiAgICAgICAgICAgICAgICAgIFNBSV94U0xPVFJfU0xPVFNaXzAKKyNkZWZpbmUgU0FJX1NMT1RTSVpFXzMyQiAgICAgICAgICAgICAgICAgIFNBSV94U0xPVFJfU0xPVFNaXzEKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX1Nsb3RfQWN0aXZlIFNBSSBCbG9jayBTbG90IEFjdGl2ZQorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9TTE9UX05PVEFDVElWRSAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfMCAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV8xICAgICAgICAgICAgIDB4MDAwMDAwMDJVCisjZGVmaW5lIFNBSV9TTE9UQUNUSVZFXzIgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfMyAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV80ICAgICAgICAgICAgIDB4MDAwMDAwMTBVCisjZGVmaW5lIFNBSV9TTE9UQUNUSVZFXzUgICAgICAgICAgICAgMHgwMDAwMDAyMFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfNiAgICAgICAgICAgICAweDAwMDAwMDQwVQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV83ICAgICAgICAgICAgIDB4MDAwMDAwODBVCisjZGVmaW5lIFNBSV9TTE9UQUNUSVZFXzggICAgICAgICAgICAgMHgwMDAwMDEwMFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfOSAgICAgICAgICAgICAweDAwMDAwMjAwVQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV8xMCAgICAgICAgICAgIDB4MDAwMDA0MDBVCisjZGVmaW5lIFNBSV9TTE9UQUNUSVZFXzExICAgICAgICAgICAgMHgwMDAwMDgwMFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfMTIgICAgICAgICAgICAweDAwMDAxMDAwVQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV8xMyAgICAgICAgICAgIDB4MDAwMDIwMDBVCisjZGVmaW5lIFNBSV9TTE9UQUNUSVZFXzE0ICAgICAgICAgICAgMHgwMDAwNDAwMFUKKyNkZWZpbmUgU0FJX1NMT1RBQ1RJVkVfMTUgICAgICAgICAgICAweDAwMDA4MDAwVQorI2RlZmluZSBTQUlfU0xPVEFDVElWRV9BTEwgICAgICAgICAgIDB4MDAwMEZGRkZVCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9Nb25vX1N0ZXJlb19Nb2RlIFNBSSBNb25vIFN0ZXJlbyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX1NURVJFT01PREUgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBTQUlfTU9OT01PREUgICAgICAgICAgICAgICAgIFNBSV94Q1IxX01PTk8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX1RSSVN0YXRlX01hbmFnZW1lbnQgU0FJIFRSSVN0YXRlIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfT1VUUFVUX05PVFJFTEVBU0VEICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9PVVRQVVRfUkVMRUFTRUQgICAgICAgU0FJX3hDUjJfVFJJUworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfRmlmb19UaHJlc2hvbGQgU0FJIEJsb2NrIEZpZm8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX0ZJRk9USFJFU0hPTERfRU1QVFkgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNBSV9GSUZPVEhSRVNIT0xEXzFRRiAgICBTQUlfeENSMl9GVEhfMAorI2RlZmluZSBTQUlfRklGT1RIUkVTSE9MRF9IRiAgICAgU0FJX3hDUjJfRlRIXzEKKyNkZWZpbmUgU0FJX0ZJRk9USFJFU0hPTERfM1FGICAgIChTQUlfeENSMl9GVEhfMSB8IFNBSV94Q1IyX0ZUSF8wKQorI2RlZmluZSBTQUlfRklGT1RIUkVTSE9MRF9GVUxMICAgU0FJX3hDUjJfRlRIXzIKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX0NvbXBhbmRpbmdfTW9kZSBTQUkgQmxvY2sgQ29tcGFuZGluZyBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX05PQ09NUEFORElORyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0FJX1VMQVdfMUNQTF9DT01QQU5ESU5HICAgICAgICAgU0FJX3hDUjJfQ09NUF8xCisjZGVmaW5lIFNBSV9BTEFXXzFDUExfQ09NUEFORElORyAgICAgICAgIChTQUlfeENSMl9DT01QXzEgfCBTQUlfeENSMl9DT01QXzApCisjZGVmaW5lIFNBSV9VTEFXXzJDUExfQ09NUEFORElORyAgICAgICAgIChTQUlfeENSMl9DT01QXzEgfCBTQUlfeENSMl9DUEwpCisjZGVmaW5lIFNBSV9BTEFXXzJDUExfQ09NUEFORElORyAgICAgICAgIChTQUlfeENSMl9DT01QXzEgfCBTQUlfeENSMl9DT01QXzAgfCBTQUlfeENSMl9DUEwpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19NdXRlX1ZhbHVlIFNBSSBCbG9jayBNdXRlIFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX1pFUk9fVkFMVUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBTQUlfTEFTVF9TRU5UX1ZBTFVFICAgICAgICAgICAgICAgIFNBSV94Q1IyX01VVEVWQUwKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0Jsb2NrX0ludGVycnVwdHNfRGVmaW5pdGlvbiBTQUkgQmxvY2sgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX0lUX09WUlVEUiAgICAgICAgICAgICAgICAgICAgIFNBSV94SU1SX09WUlVEUklFCisjZGVmaW5lIFNBSV9JVF9NVVRFREVUICAgICAgICAgICAgICAgICAgICBTQUlfeElNUl9NVVRFREVUSUUKKyNkZWZpbmUgU0FJX0lUX1dDS0NGRyAgICAgICAgICAgICAgICAgICAgIFNBSV94SU1SX1dDS0NGR0lFCisjZGVmaW5lIFNBSV9JVF9GUkVRICAgICAgICAgICAgICAgICAgICAgICBTQUlfeElNUl9GUkVRSUUKKyNkZWZpbmUgU0FJX0lUX0NOUkRZICAgICAgICAgICAgICAgICAgICAgIFNBSV94SU1SX0NOUkRZSUUKKyNkZWZpbmUgU0FJX0lUX0FGU0RFVCAgICAgICAgICAgICAgICAgICAgIFNBSV94SU1SX0FGU0RFVElFCisjZGVmaW5lIFNBSV9JVF9MRlNERVQgICAgICAgICAgICAgICAgICAgICBTQUlfeElNUl9MRlNERVRJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUlfQmxvY2tfRmxhZ3NfRGVmaW5pdGlvbiAgU0FJIEJsb2NrIEZsYWdzIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTQUlfRkxBR19PVlJVRFIgICAgICAgICAgICAgICAgICAgU0FJX3hTUl9PVlJVRFIKKyNkZWZpbmUgU0FJX0ZMQUdfTVVURURFVCAgICAgICAgICAgICAgICAgIFNBSV94U1JfTVVURURFVAorI2RlZmluZSBTQUlfRkxBR19XQ0tDRkcgICAgICAgICAgICAgICAgICAgU0FJX3hTUl9XQ0tDRkcKKyNkZWZpbmUgU0FJX0ZMQUdfRlJFUSAgICAgICAgICAgICAgICAgICAgIFNBSV94U1JfRlJFUQorI2RlZmluZSBTQUlfRkxBR19DTlJEWSAgICAgICAgICAgICAgICAgICAgU0FJX3hTUl9DTlJEWQorI2RlZmluZSBTQUlfRkxBR19BRlNERVQgICAgICAgICAgICAgICAgICAgU0FJX3hTUl9BRlNERVQKKyNkZWZpbmUgU0FJX0ZMQUdfTEZTREVUICAgICAgICAgICAgICAgICAgIFNBSV94U1JfTEZTREVUCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9CbG9ja19GaWZvX1N0YXR1c19MZXZlbCAgIFNBSSBCbG9jayBGaWZvIFN0YXR1cyBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9GSUZPU1RBVFVTX0VNUFRZICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBTQUlfRklGT1NUQVRVU19MRVNTMVFVQVJURVJGVUxMICAgMHgwMDAxMDAwMFUKKyNkZWZpbmUgU0FJX0ZJRk9TVEFUVVNfMVFVQVJURVJGVUxMICAgICAgIDB4MDAwMjAwMDBVCisjZGVmaW5lIFNBSV9GSUZPU1RBVFVTX0hBTEZGVUxMICAgICAgICAgICAweDAwMDMwMDAwVQorI2RlZmluZSBTQUlfRklGT1NUQVRVU18zUVVBUlRFUkZVTEwgICAgICAgMHgwMDA0MDAwMFUKKyNkZWZpbmUgU0FJX0ZJRk9TVEFUVVNfRlVMTCAgICAgICAgICAgICAgIDB4MDAwNTAwMDBVCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTQUlfRXhwb3J0ZWRfTWFjcm9zIFNBSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAYnJpZWYgbWFjcm9zIHRvIGhhbmRsZSBpbnRlcnJ1cHRzIGFuZCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgUmVzZXQgU0FJIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTQUkgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfU0FJX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVTRVQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1NBSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNBSSBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNBSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9PVlJVRFI6IE92ZXJydW4gdW5kZXJydW4gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfTVVURURFVDogTXV0ZSBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfV0NLQ0ZHOiBXcm9uZyBDbG9jayBDb25maWd1cmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX0ZSRVE6IEZJRk8gcmVxdWVzdCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9DTlJEWTogQ29kZWMgbm90IHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX0FGU0RFVDogQW50aWNpcGF0ZWQgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9MRlNERVQ6IExhdGUgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NBSV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU1SIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNBSSBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNBSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUgb3IgZGlzYWJsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9PVlJVRFI6IE92ZXJydW4gdW5kZXJydW4gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfTVVURURFVDogTXV0ZSBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfV0NLQ0ZHOiBXcm9uZyBDbG9jayBDb25maWd1cmF0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX0ZSRVE6IEZJRk8gcmVxdWVzdCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9DTlJEWTogQ29kZWMgbm90IHJlYWR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX0FGU0RFVDogQW50aWNpcGF0ZWQgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9MRlNERVQ6IExhdGUgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NBSV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU1SICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNBSSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNBSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU0FJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfT1ZSVURSOiBPdmVycnVuIHVuZGVycnVuIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX01VVEVERVQ6IE11dGUgZGV0ZWN0aW9uIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0lUX1dDS0NGRzogV3JvbmcgQ2xvY2sgQ29uZmlndXJhdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9GUkVROiBGSUZPIHJlcXVlc3QgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfQ05SRFk6IENvZGVjIG5vdCByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNBSV9JVF9BRlNERVQ6IEFudGljaXBhdGVkIGZyYW1lIHN5bmNocm9uaXphdGlvbiBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTQUlfSVRfTEZTREVUOiBMYXRlIGZyYW1lIHN5bmNocm9uaXphdGlvbiBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU0FJX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU1SICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTQUkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNBSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTQUlfRkxBR19PVlJVRFI6IE92ZXJydW4gdW5kZXJydW4gZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0ZMQUdfTVVURURFVDogTXV0ZSBkZXRlY3Rpb24gZmxhZy4KKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0ZMQUdfV0NLQ0ZHOiBXcm9uZyBDbG9jayBDb25maWd1cmF0aW9uIGZsYWcuCisgICogICAgICAgICAgICBAYXJnIFNBSV9GTEFHX0ZSRVE6IEZJRk8gcmVxdWVzdCBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyBTQUlfRkxBR19DTlJEWTogQ29kZWMgbm90IHJlYWR5IGZsYWcuCisgICogICAgICAgICAgICBAYXJnIFNBSV9GTEFHX0FGU0RFVDogQW50aWNpcGF0ZWQgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBmbGFnLgorICAqICAgICAgICAgICAgQGFyZyBTQUlfRkxBR19MRlNERVQ6IExhdGUgZnJhbWUgc3luY2hyb25pemF0aW9uIGRldGVjdGlvbiBmbGFnLgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1NBSV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IpICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTQUkgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNBSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0ZMQUdfT1ZSVURSOiBDbGVhciBPdmVycnVuIHVuZGVycnVuCisgICogICAgICAgICAgICBAYXJnIFNBSV9GTEFHX01VVEVERVQ6IENsZWFyIE11dGUgZGV0ZWN0aW9uCisgICogICAgICAgICAgICBAYXJnIFNBSV9GTEFHX1dDS0NGRzogQ2xlYXIgV3JvbmcgQ2xvY2sgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICAgQGFyZyBTQUlfRkxBR19GUkVROiBDbGVhciBGSUZPIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0ZMQUdfQ05SRFk6IENsZWFyIENvZGVjIG5vdCByZWFkeQorICAqICAgICAgICAgICAgQGFyZyBTQUlfRkxBR19BRlNERVQ6IENsZWFyIEFudGljaXBhdGVkIGZyYW1lIHN5bmNocm9uaXphdGlvbiBkZXRlY3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgU0FJX0ZMQUdfTEZTREVUOiBDbGVhciBMYXRlIGZyYW1lIHN5bmNocm9uaXphdGlvbiBkZXRlY3Rpb24KKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TQUlfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNMUkZSID0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIFNBSS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTQUkgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TQUlfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gIFNBSV94Q1IxX1NBSUVOKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFNBSS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTQUkgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TQUlfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICB+U0FJX3hDUjFfU0FJRU4pCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgU0FJIEhBTCBFeHRlbnNpb24gbW9kdWxlICovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9zYWlfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0luaXRQcm90b2NvbChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDMyX3QgcHJvdG9jb2wsIHVpbnQzMl90IGRhdGFzaXplLCB1aW50MzJfdCBuYnNsb3QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9Jbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRGVJbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3ZvaWQgSEFMX1NBSV9Nc3BJbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3ZvaWQgSEFMX1NBSV9Nc3BEZUluaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyogU0FJIGNhbGxiYWNrcyByZWdpc3Rlci91bnJlZ2lzdGVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfUmVnaXN0ZXJDYWxsYmFjayhTQUlfSGFuZGxlVHlwZURlZiAgICAgICAgKmhzYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1NBSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTQUlfQ2FsbGJhY2tUeXBlRGVmICAgICAgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfVW5SZWdpc3RlckNhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICAgICAgICAqaHNhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9TQUlfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYKKy8qKgorICAqIEB9CisgICovCisKKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU0FJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAgKiBAeworICAqLworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9UcmFuc21pdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfVHJhbnNtaXRfSVQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfUmVjZWl2ZV9JVChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX1RyYW5zbWl0X0RNQShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlX0RNQShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9ETUFQYXVzZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0RNQVJlc3VtZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0RNQVN0b3AoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworCisvKiBBYm9ydCBmdW5jdGlvbiAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9BYm9ydChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7CisKKy8qIE11dGUgbWFuYWdlbWVudCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9FbmFibGVUeE11dGVNb2RlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MTZfdCB2YWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9EaXNhYmxlVHhNdXRlTW9kZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0VuYWJsZVJ4TXV0ZU1vZGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIFNBSWNhbGxiYWNrIGNhbGxiYWNrLCB1aW50MTZfdCBjb3VudGVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRGlzYWJsZVJ4TXV0ZU1vZGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworCisvKiBTQUkgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKi8KK3ZvaWQgSEFMX1NBSV9JUlFIYW5kbGVyKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3ZvaWQgSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOwordm9pZCBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3ZvaWQgSEFMX1NBSV9SeEhhbGZDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOwordm9pZCBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3ZvaWQgSEFMX1NBSV9FcnJvckNhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1NBSV9TdGF0ZVR5cGVEZWYgSEFMX1NBSV9HZXRTdGF0ZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7Cit1aW50MzJfdCBIQUxfU0FJX0dldEVycm9yKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNBSV9Qcml2YXRlX01hY3JvcyBTQUkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19TQUlfQkxPQ0tfU1lOQ0VYVChTVEFURSkgKCgoU1RBVEUpID09IFNBSV9TWU5DRVhUX0RJU0FCTEUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFNBSV9TWU5DRVhUX09VVEJMT0NLQV9FTkFCTEUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RBVEUpID09IFNBSV9TWU5DRVhUX09VVEJMT0NLQl9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NBSV9TVVBQT1JURURfUFJPVE9DT0woUFJPVE9DT0wpICAgKCgoUFJPVE9DT0wpID09IFNBSV9JMlNfU1RBTkRBUkQpICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUk9UT0NPTCkgPT0gU0FJX0kyU19NU0JKVVNUSUZJRUQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBST1RPQ09MKSA9PSBTQUlfSTJTX0xTQkpVU1RJRklFRCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJPVE9DT0wpID09IFNBSV9QQ01fTE9ORykgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQUk9UT0NPTCkgPT0gU0FJX1BDTV9TSE9SVCkpCisKKyNkZWZpbmUgSVNfU0FJX1BST1RPQ09MX0RBVEFTSVpFKERBVEFTSVpFKSAgICgoKERBVEFTSVpFKSA9PSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVQpICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklURVhURU5ERUQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNBSV9QUk9UT0NPTF9EQVRBU0laRV8yNEJJVCkgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMzJCSVQpKQorCisjZGVmaW5lIElTX1NBSV9BVURJT19GUkVRVUVOQ1koQVVESU8pICgoKEFVRElPKSA9PSBTQUlfQVVESU9fRlJFUVVFTkNZXzE5MkspIHx8ICgoQVVESU8pID09IFNBSV9BVURJT19GUkVRVUVOQ1lfOTZLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFVRElPKSA9PSBTQUlfQVVESU9fRlJFUVVFTkNZXzQ4SykgIHx8ICgoQVVESU8pID09IFNBSV9BVURJT19GUkVRVUVOQ1lfNDRLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFVRElPKSA9PSBTQUlfQVVESU9fRlJFUVVFTkNZXzMySykgIHx8ICgoQVVESU8pID09IFNBSV9BVURJT19GUkVRVUVOQ1lfMjJLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFVRElPKSA9PSBTQUlfQVVESU9fRlJFUVVFTkNZXzE2SykgIHx8ICgoQVVESU8pID09IFNBSV9BVURJT19GUkVRVUVOQ1lfMTFLKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFVRElPKSA9PSBTQUlfQVVESU9fRlJFUVVFTkNZXzhLKSAgIHx8ICgoQVVESU8pID09IFNBSV9BVURJT19GUkVRVUVOQ1lfTUNLRElWKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfTUNLX09WRVJTQU1QTElORyhWQUxVRSkgKCgoVkFMVUUpID09IFNBSV9NQ0tfT1ZFUlNBTVBMSU5HX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBTQUlfTUNLX09WRVJTQU1QTElOR19FTkFCTEUpKQorCisjZGVmaW5lIElTX1NBSV9QRE1fTUlDX1BBSVJTX05VTUJFUihWQUxVRSkgICAoKDFVIDw9IChWQUxVRSkpICYmICgoVkFMVUUpIDw9IDNVKSkKKworI2RlZmluZSBJU19TQUlfUERNX0NMT0NLX0VOQUJMRShDTE9DSykgKCgoQ0xPQ0spICE9IDBVKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDTE9DSykgJiB+KFNBSV9QRE1fQ0xPQ0sxX0VOQUJMRSB8IFNBSV9QRE1fQ0xPQ0syX0VOQUJMRSkpID09IDBVKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfTU9ERShNT0RFKSAgKCgoTU9ERSkgPT0gU0FJX01PREVNQVNURVJfVFgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNBSV9NT0RFTUFTVEVSX1JYKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTQUlfTU9ERVNMQVZFX1RYKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0FJX01PREVTTEFWRV9SWCkpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX1BST1RPQ09MKFBST1RPQ09MKSAoKChQUk9UT0NPTCkgPT0gU0FJX0ZSRUVfUFJPVE9DT0wpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUFJPVE9DT0wpID09IFNBSV9BQzk3X1BST1RPQ09MKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBST1RPQ09MKSA9PSBTQUlfU1BESUZfUFJPVE9DT0wpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19EQVRBU0laRShEQVRBU0laRSkgKCgoREFUQVNJWkUpID09IFNBSV9EQVRBU0laRV84KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTQUlfREFUQVNJWkVfMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU0FJX0RBVEFTSVpFXzE2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVNJWkUpID09IFNBSV9EQVRBU0laRV8yMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERBVEFTSVpFKSA9PSBTQUlfREFUQVNJWkVfMjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBU0laRSkgPT0gU0FJX0RBVEFTSVpFXzMyKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfRklSU1RfQklUKEJJVCkgKCgoQklUKSA9PSBTQUlfRklSU1RCSVRfTVNCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCSVQpID09IFNBSV9GSVJTVEJJVF9MU0IpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19DTE9DS19TVFJPQklORyhDTE9DSykgKCgoQ0xPQ0spID09IFNBSV9DTE9DS1NUUk9CSU5HX0ZBTExJTkdFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xPQ0spID09IFNBSV9DTE9DS1NUUk9CSU5HX1JJU0lOR0VER0UpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19TWU5DSFJPKFNZTkNIUk8pICgoKFNZTkNIUk8pID09IFNBSV9BU1lOQ0hST05PVVMpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTWU5DSFJPKSA9PSBTQUlfU1lOQ0hST05PVVMpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1lOQ0hSTykgPT0gU0FJX1NZTkNIUk9OT1VTX0VYVF9TQUkxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNZTkNIUk8pID09IFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMikpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX01DS19PVVRQVVQoVkFMVUUpICgoKFZBTFVFKSA9PSBTQUlfTUNLX09VVFBVVF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFZBTFVFKSA9PSBTQUlfTUNLX09VVFBVVF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfT1VUUFVUX0RSSVZFKERSSVZFKSAoKChEUklWRSkgPT0gU0FJX09VVFBVVERSSVZFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRFJJVkUpID09IFNBSV9PVVRQVVREUklWRV9FTkFCTEUpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19OT0RJVklERVIoTk9ESVZJREVSKSAoKChOT0RJVklERVIpID09IFNBSV9NQVNURVJESVZJREVSX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTk9ESVZJREVSKSA9PSBTQUlfTUFTVEVSRElWSURFUl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfTVVURV9DT1VOVEVSKENPVU5URVIpICgoQ09VTlRFUikgPD0gNjNVKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19NVVRFX1ZBTFVFKFZBTFVFKSAgICAoKChWQUxVRSkgPT0gU0FJX1pFUk9fVkFMVUUpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChWQUxVRSkgPT0gU0FJX0xBU1RfU0VOVF9WQUxVRSkpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX0NPTVBBTkRJTkdfTU9ERShNT0RFKSAgICAoKChNT0RFKSA9PSBTQUlfTk9DT01QQU5ESU5HKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTQUlfVUxBV18xQ1BMX0NPTVBBTkRJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTQUlfQUxBV18xQ1BMX0NPTVBBTkRJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTQUlfVUxBV18yQ1BMX0NPTVBBTkRJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTQUlfQUxBV18yQ1BMX0NPTVBBTkRJTkcpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19GSUZPX1RIUkVTSE9MRChUSFJFU0hPTEQpICgoKFRIUkVTSE9MRCkgPT0gU0FJX0ZJRk9USFJFU0hPTERfRU1QVFkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSFJFU0hPTEQpID09IFNBSV9GSUZPVEhSRVNIT0xEXzFRRikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVEhSRVNIT0xEKSA9PSBTQUlfRklGT1RIUkVTSE9MRF9IRikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRIUkVTSE9MRCkgPT0gU0FJX0ZJRk9USFJFU0hPTERfM1FGKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUSFJFU0hPTEQpID09IFNBSV9GSUZPVEhSRVNIT0xEX0ZVTEwpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19UUklTVEFURV9NQU5BR0VNRU5UKFNUQVRFKSAoKChTVEFURSkgPT0gU0FJX09VVFBVVF9OT1RSRUxFQVNFRCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVEFURSkgPT0gU0FJX09VVFBVVF9SRUxFQVNFRCkpCisKKyNkZWZpbmUgSVNfU0FJX01PTk9fU1RFUkVPX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gU0FJX01PTk9NT0RFKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0FJX1NURVJFT01PREUpKQorCisjZGVmaW5lIElTX1NBSV9TTE9UX0FDVElWRShBQ1RJVkUpICAoKEFDVElWRSkgPD0gU0FJX1NMT1RBQ1RJVkVfQUxMKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19TTE9UX05VTUJFUihOVU1CRVIpICgoMVUgPD0gKE5VTUJFUikpICYmICgoTlVNQkVSKSA8PSAxNlUpKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19TTE9UX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gU0FJX1NMT1RTSVpFX0RBVEFTSVpFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0FJX1NMT1RTSVpFXzE2QikgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0FJX1NMT1RTSVpFXzMyQikpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX0ZJUlNUQklUX09GRlNFVChPRkZTRVQpICgoT0ZGU0VUKSA8PSAyNFUpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX0ZTX09GRlNFVChPRkZTRVQpICgoKE9GRlNFVCkgPT0gU0FJX0ZTX0ZJUlNUQklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPRkZTRVQpID09IFNBSV9GU19CRUZPUkVGSVJTVEJJVCkpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX0ZTX1BPTEFSSVRZKFBPTEFSSVRZKSAoKChQT0xBUklUWSkgPT0gU0FJX0ZTX0FDVElWRV9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gU0FJX0ZTX0FDVElWRV9ISUdIKSkKKworI2RlZmluZSBJU19TQUlfQkxPQ0tfRlNfREVGSU5JVElPTihERUZJTklUSU9OKSAoKChERUZJTklUSU9OKSA9PSBTQUlfRlNfU1RBUlRGUkFNRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERUZJTklUSU9OKSA9PSBTQUlfRlNfQ0hBTk5FTF9JREVOVElGSUNBVElPTikpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX01BU1RFUl9ESVZJREVSKERJVklERVIpICgoRElWSURFUikgPD0gNjNVKQorCisjZGVmaW5lIElTX1NBSV9CTE9DS19GUkFNRV9MRU5HVEgoTEVOR1RIKSAoKDhVIDw9IChMRU5HVEgpKSAmJiAoKExFTkdUSCkgPD0gMjU2VSkpCisKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX0FDVElWRV9GUkFNRShMRU5HVEgpICgoMVUgPD0gKExFTkdUSCkpICYmICgoTEVOR1RIKSA8PSAxMjhVKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU0FJX1ByaXZhdGVfRnVuY3Rpb25zIFNBSSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1NBSV9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9zYWlfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX3NhaV9leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjg3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zYWlfZXguaApAQCAtMCwwICsxLDEwNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc2FpX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNBSSBIQUwgZXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9TQUlfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1NBSV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU0FJRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTQUlFeF9FeHBvcnRlZF9UeXBlcyBTQUlFeCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUERNIG1pY3JvcGhvbmUgZGVsYXkgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE1pY1BhaXI7ICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBwYWlyIG9mIG1pY3JvcGhvbmVzIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMuICovCisKKyAgdWludDMyX3QgTGVmdERlbGF5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBkZWxheSBpbiBQRE0gY2xvY2sgdW5pdCB0byBhcHBseSBvbiBsZWZ0IG1pY3JvcGhvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNy4gKi8KKworICB1aW50MzJfdCBSaWdodERlbGF5OyAgLyohPCBTcGVjaWZpZXMgdGhlIGRlbGF5IGluIFBETSBjbG9jayB1bml0IHRvIGFwcGx5IG9uIHJpZ2h0IG1pY3JvcGhvbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNy4gKi8KK30gU0FJRXhfUGRtTWljRGVsYXlQYXJhbVR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTQUlFeF9FeHBvcnRlZF9GdW5jdGlvbnMgU0FJRXggRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNBSUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJRXhfQ29uZmlnUGRtTWljRGVsYXkoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIFNBSUV4X1BkbU1pY0RlbGF5UGFyYW1UeXBlRGVmICpwZG1NaWNEZWxheSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNBSUV4X1ByaXZhdGVfTWFjcm9zIFNBSUV4IEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfU0FJX1BETV9NSUNfREVMQVkoVkFMVUUpICAgKChWQUxVRSkgPD0gN1UpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9TQUlfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zbWFydGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzMyYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkLmgKQEAgLTAsMCArMSwxMTU0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9zbWFydGNhcmQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01BUlRDQVJEIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9TTUFSVENBUkRfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1NNQVJUQ0FSRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJECisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX1R5cGVzIFNNQVJUQ0FSRCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTTUFSVENBUkQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBDb25maWd1cmVzIHRoZSBTbWFydENhcmQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhdWQgcmF0ZSByZWdpc3RlciBpcyBjb21wdXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1c2FydF9rZXJfY2twcmVzKSAvICgoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHVzYXJ0X2tlcl9ja3ByZXMgaXMgdGhlIFVTQVJUIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXb3JkTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIEByZWYgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIGNhbiBvbmx5IGJlIHNldCB0byA5ICg4IGRhdGEgKyAxIHBhcml0eSBiaXRzKS4gKi8KKworICB1aW50MzJfdCBTdG9wQml0czsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9TdG9wX0JpdHMuICovCisKKyAgdWludDE2X3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX1Bhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBwYXJpdHkgaXMgZW5hYmxlZCBieSBkZWZhdWx0IChQQ0UgaXMgZm9yY2VkIHRvIDEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSBXb3JkTGVuZ3RoIGlzIGZvcmNlZCB0byA4IGJpdHMgKyBwYXJpdHksIE0gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWQgdG8gMSBhbmQgdGhlIHBhcml0eSBiaXQgaXMgdGhlIDl0aCBiaXQuICovCisKKyAgdWludDE2X3QgTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBvciBUcmFuc21pdCBtb2RlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTW9kZSAqLworCisgIHVpbnQxNl90IENMS1BvbGFyaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9DbG9ja19Qb2xhcml0eSAqLworCisgIHVpbnQxNl90IENMS1BoYXNlOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrX1BoYXNlICovCisKKyAgdWludDE2X3QgQ0xLTGFzdEJpdDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRfTGFzdF9CaXQgKi8KKworICB1aW50MTZfdCBPbmVCaXRTYW1wbGluZzsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGEgc2luZ2xlIHNhbXBsZSBvciB0aHJlZSBzYW1wbGVzJyBtYWpvcml0eSB2b3RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGluZyB0aGUgc2luZ2xlIHNhbXBsZSBtZXRob2QgaW5jcmVhc2VzIHRoZSByZWNlaXZlciB0b2xlcmFuY2UgdG8gY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpYXRpb25zLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9PbmVCaXRfU2FtcGxpbmcuICovCisKKyAgdWludDhfdCAgUHJlc2NhbGVyOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MDEgdG8gMHgxRi4gUHJlc2NhbGVyIHZhbHVlIGlzIG11bHRpcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAyIHRvIGdpdmUgdGhlIGRpdmlzaW9uIGZhY3RvciBvZiB0aGUgc291cmNlIGNsb2NrIGZyZXF1ZW5jeSAqLworCisgIHVpbnQ4X3QgIEd1YXJkVGltZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTbWFydENhcmQgR3VhcmQgVGltZSBhcHBsaWVkIGFmdGVyIHN0b3AgYml0cy4gKi8KKworICB1aW50MTZfdCBOQUNLRW5hYmxlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBTbWFydENhcmQgTkFDSyB0cmFuc21pc3Npb24gaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgcGFyaXR5IGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX05BQ0tfRW5hYmxlICovCisKKyAgdWludDMyX3QgVGltZU91dEVuYWJsZTsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZWl2ZXIgdGltZW91dCBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9UaW1lb3V0X0VuYWJsZSovCisKKyAgdWludDMyX3QgVGltZU91dFZhbHVlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHJlY2VpdmVyIHRpbWUgb3V0IHZhbHVlIGluIG51bWJlciBvZiBiYXVkIGJsb2NrczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgQ2hhcmFjdGVyIFdhaXQgVGltZSAoQ1dUKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBXYWl0IFRpbWUgKEJXVCkuIEl0IGlzIGNvZGVkIG92ZXIgMjQgYml0cy4gKi8KKworICB1aW50OF90IEJsb2NrTGVuZ3RoOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU21hcnRDYXJkIEJsb2NrIExlbmd0aCBpbiBUPTEgUmVjZXB0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBmcm9tIDB4MCB0byAweEZGICovCisKKyAgdWludDhfdCBBdXRvUmV0cnlDb3VudDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNtYXJ0Q2FyZCBhdXRvLXJldHJ5IGNvdW50IChudW1iZXIgb2YgcmV0cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGFuZCB0cmFuc21pdCBtb2RlKS4gV2hlbiBzZXQgdG8gMCwgcmV0cmFuc21pc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQuIE90aGVyd2lzZSwgaXRzIG1heGltdW0gdmFsdWUgaXMgNyAoYmVmb3JlIHNpZ25hbGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3IpICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVVNBUlQgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IFNNQVJUQ0FSRF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGFsaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQWR2RmVhdHVyZUluaXQ7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggYWR2YW5jZWQgU01BUlRDQVJEIGZlYXR1cmVzIGlzIGluaXRpYWxpemVkLiBTZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWQgZmVhdHVyZXMgbWF5IGJlIGluaXRpYWxpemVkIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRFeF9BZHZhbmNlZF9GZWF0dXJlc19Jbml0aWFsaXphdGlvbl9UeXBlICovCisKKyAgdWludDMyX3QgVHhQaW5MZXZlbEludmVydDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVFggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9UeF9JbnYgICovCisKKyAgdWludDMyX3QgUnhQaW5MZXZlbEludmVydDsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUlggcGluIGFjdGl2ZSBsZXZlbCBpcyBpbnZlcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9SeF9JbnYgICovCisKKyAgdWludDMyX3QgRGF0YUludmVydDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBkYXRhIGFyZSBpbnZlcnRlZCAocG9zaXRpdmUvZGlyZWN0IGxvZ2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX0RhdGFfSW52ICovCisKKyAgdWludDMyX3QgU3dhcDsgICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9SeF9UeF9Td2FwICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bkRpc2FibGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX092ZXJydW5fRGlzYWJsZSAqLworCisgIHVpbnQzMl90IERNQURpc2FibGVvblJ4RXJyb3I7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSRF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvciAqLworCisgIHVpbnQzMl90IE1TQkZpcnN0OyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgTVNCIGlzIHNlbnQgZmlyc3Qgb24gVUFSVCBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01BUlRDQVJEX01TQl9GaXJzdCAqLworCisgIHVpbnQxNl90IFR4Q29tcGxldGlvbkluZGljYXRpb247ICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCB0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIGlzIHVzZWQ6IGJlZm9yZSAod2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmbGFnIGlzIGF2YWlsYWJsZSkgb3Igb25jZSBndWFyZCB0aW1lIHBlcmlvZCBoYXMgZWxhcHNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQVJUQ0FSREV4X1RyYW5zbWlzc2lvbl9Db21wbGV0aW9uX0luZGljYXRpb24uICovCit9IFNNQVJUQ0FSRF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBIQUwgU01BUlRDQVJEIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFNNQVJUQ0FSRCBTdGF0ZSB2YWx1ZSBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZGlmZmVyZW50IHN1YnN0YXRlczogZ1N0YXRlIGFuZCBSeFN0YXRlIChzZWUgQHJlZiBTTUFSVENBUkRfU3RhdGVfRGVmaW5pdGlvbikuCisgICogICAgICAgIC0gZ1N0YXRlIGNvbnRhaW5zIFNNQVJUQ0FSRCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBJUCBpbml0aWxpc2F0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKElQIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICAgICAxICA6IEluaXQgZG9uZSAoSVAgbm90IGluaXRpYWxpemVkLiBIQUwgU01BUlRDQVJEIEluaXQgZnVuY3Rpb24gYWxyZWFkeSBjYWxsZWQpCisgICogICAgICAgICAgYjQtYjMgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAKKyAgKiAgICAgICAgICBiMiAgICAgSW50cmluc2ljIHByb2Nlc3Mgc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5CisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChJUCBidXN5IHdpdGggc29tZSBjb25maWd1cmF0aW9uIG9yIGludGVybmFsIG9wZXJhdGlvbnMpCisgICogICAgICAgICAgYjEgICAgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgICB4ICA6IFNob3VsZCBiZSBzZXQgdG8gMAorICAqICAgICAgICAgIGIwICAgICBUeCBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkgKG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgICAgIDEgIDogQnVzeSAoVHggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgIC0gUnhTdGF0ZSBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIFJ4IG9wZXJhdGlvbnMuCisgICogICAgICAgICAgUnhTdGF0ZSB2YWx1ZSBjb2RpbmcgZm9sbG93IGJlbG93IGRlc2NyaWJlZCBiaXRtYXAgOgorICAqICAgICAgICAgIGI3LWI2ICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeHggOiBTaG91bGQgYmUgc2V0IHRvIDAwCisgICogICAgICAgICAgYjUgICAgIElQIGluaXRpbGlzYXRpb24gc3RhdHVzCisgICogICAgICAgICAgICAgMCAgOiBSZXNldCAoSVAgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChJUCBub3QgaW5pdGlhbGl6ZWQpCisgICogICAgICAgICAgYjQtYjIgIChub3QgdXNlZCkKKyAgKiAgICAgICAgICAgIHh4eCA6IFNob3VsZCBiZSBzZXQgdG8gMDAwCisgICogICAgICAgICAgYjEgICAgIFJ4IHN0YXRlCisgICogICAgICAgICAgICAgMCAgOiBSZWFkeSAobm8gUnggb3BlcmF0aW9uIG9uZ29pbmcpCisgICogICAgICAgICAgICAgMSAgOiBCdXN5IChSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICBiMCAgICAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHggIDogU2hvdWxkIGJlIHNldCB0byAwLgorICAqLwordHlwZWRlZiB1aW50MzJfdCBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgIC8qITwgVVNBUlQgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBTTUFSVENBUkRfSW5pdFR5cGVEZWYgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgU01BUlRDQVJEX0FkdkZlYXR1cmVJbml0VHlwZURlZiAgIEFkdmFuY2VkSW5pdDsgICAgICAgICAgLyohPCBTbWFydENhcmQgYWR2YW5jZWQgZmVhdHVyZXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBTbWFydENhcmQgVHggdHJhbnNmZXIgQnVmZmVyICAgICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgICAgICAgLyohPCBTbWFydENhcmQgVHggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAgICAgIC8qITwgUG9pbnRlciB0byBTbWFydENhcmQgUnggdHJhbnNmZXIgQnVmZmVyICAgICAgICAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgICAgICAgLyohPCBTbWFydENhcmQgUnggVHJhbnNmZXIgQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBOYlJ4RGF0YVRvUHJvY2VzczsgICAgIC8qITwgTnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlggSVNSIGV4ZWN1dGlvbiAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgTmJUeERhdGFUb1Byb2Nlc3M7ICAgICAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFRYIElTUiBleGVjdXRpb24gICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZm9Nb2RlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIEZJRk8gbW9kZSB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUFSVENBUkRFeF9GSUZPX21vZGUuICovCisKKyAgdm9pZCAoKlJ4SVNSKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFJ4IElSUSBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCpUeElTUikoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWF0eDsgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICAgZ1N0YXRlOyAgICAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiAgIFJ4U3RhdGU7ICAgICAgICAgICAgICAgLyohPCBTbWFydENhcmQgc3RhdGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1NNQVJUQ0FSRF9TdGF0ZVR5cGVEZWYgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgICAgICAvKiE8IFNtYXJ0Q2FyZCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworCisgIHZvaWQgKCogQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworCisgIHZvaWQgKCogUnhGaWZvRnVsbENhbGxiYWNrKShzdHJ1Y3QgX19TTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7ICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgICAgICAgICAgICAqLworCisgIHZvaWQgKCogVHhGaWZvRW1wdHlDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAvKiE8IFNNQVJUQ0FSRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICAgICAgICAgICAqLworCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgICAgICAgICAgIC8qITwgU01BUlRDQVJEIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOyAgICAgICAgIC8qITwgU01BUlRDQVJEIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9IFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgU01BUlRDQVJEIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfU01BUlRDQVJEX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgU01BUlRDQVJEIFR4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBTTUFSVENBUkQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX1NNQVJUQ0FSRF9FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDJVLCAgICAvKiE8IFNNQVJUQ0FSRCBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU01BUlRDQVJEX0FCT1JUX0NPTVBMRVRFX0NCX0lEICAgICAgICAgID0gMHgwM1UsICAgIC8qITwgU01BUlRDQVJEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgPSAweDA0VSwgICAgLyohPCBTTUFSVENBUkQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1NNQVJUQ0FSRF9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEICA9IDB4MDVVLCAgICAvKiE8IFNNQVJUQ0FSRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElEICAqLworICBIQUxfU01BUlRDQVJEX1JYX0ZJRk9fRlVMTF9DQl9JRCAgICAgICAgICAgID0gMHgwNlUsICAgIC8qITwgU01BUlRDQVJEIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayBJRCAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfVFhfRklGT19FTVBUWV9DQl9JRCAgICAgICAgICAgPSAweDA3VSwgICAgLyohPCBTTUFSVENBUkQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KKworICBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgU01BUlRDQVJEIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICovCisgIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDA5VSAgICAgLyohPCBTTUFSVENBUkQgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKworfSBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUFSVENBUkQgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYpKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsgIC8qITwgcG9pbnRlciB0byBhbiBTTUFSVENBUkQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBjbG9jayBzb3VyY2VzCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsyICAgICA9IDB4MDEsIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSSAgICAgICA9IDB4MDIsIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSyAgICA9IDB4MDQsIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRSAgICAgICA9IDB4MDgsIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAgICAgKi8KKyAgU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRCA9IDB4MTAgIC8qITwgdW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAgICAgKi8KK30gU01BUlRDQVJEX0Nsb2NrU291cmNlVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0NvbnN0YW50cyAgU01BUlRDQVJEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1N0YXRlX0RlZmluaXRpb24gU01BUlRDQVJEIFN0YXRlIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgICAgICAgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIGFuZCBSeFN0YXRlICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWSAgICAgICAgICAgICAweDAwMDAwMDI0VSAgICAgICAgICAgICAgICAgICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYICAgICAgICAgIDB4MDAwMDAwMjFVICAgICAgICAgICAgICAgICAgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlggICAgICAgICAgMHgwMDAwMDAyMlUgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIFJ4U3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFhfUlggICAgICAgMHgwMDAwMDAyM1UgICAgICAgICAgICAgICAgICAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIGFuZCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHRvIGJlIHVzZWQgZm9yIG5laXRoZXIgZ1N0YXRlIG5vciBSeFN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIHJlc3VsdCBvZiBjb21iaW5hdGlvbiAoT3IpIGJldHdlZW4gZ1N0YXRlIGFuZCBSeFN0YXRlIHZhbHVlcyAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX1RJTUVPVVQgICAgICAgICAgMHgwMDAwMDBBMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFRpbWVvdXQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX1NUQVRFX0VSUk9SICAgICAgICAgICAgMHgwMDAwMDBFMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgZ1N0YXRlIG9ubHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Vycm9yX0RlZmluaXRpb24gU01BUlRDQVJEIEVycm9yIENvZGUgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9QRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgICAgICAgLyohPCBQYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX05FICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgICAgICAvKiE8IE5vaXNlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfRkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAgICAgICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQVJUQ0FSRF9FUlJPUl9PUkUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgICAgICAgLyohPCBPdmVycnVuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgICAgICAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICovCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfUlRPICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKSAgICAgICAgIC8qITwgUmVjZWl2ZXIgVGltZU91dCBlcnJvciAgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAgICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1dvcmRfTGVuZ3RoIFNNQVJUQ0FSRCBXb3JkIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgIFVTQVJUX0NSMV9NMCAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgbGVuZ3RoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9TdG9wX0JpdHMgU01BUlRDQVJEIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMF81ICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMC41IHN0b3AgYml0ICAqLworI2RlZmluZSBTTUFSVENBUkRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUCAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUGFyaXR5IFNNQVJUQ0FSRCBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QQVJJVFlfT0REICAgICAgICAgICAgICAgIChVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTKSAgLyohPCBTTUFSVENBUkQgZnJhbWUgb2RkIHBhcml0eSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX01vZGUgU01BUlRDQVJEIFRyYW5zZmVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTU9ERV9SWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYIG1vZGUgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9NT0RFX1RYICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX01PREVfVFhfUlggICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAvKiE8IFNNQVJUQ0FSRCBSWCBhbmQgVFggbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfQ2xvY2tfUG9sYXJpdHkgU01BUlRDQVJEIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBsb3cgcG9sYXJpdHkgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgaGlnaCBwb2xhcml0eSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfQ2xvY2tfUGhhc2UgU01BUlRDQVJEIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBvbiBmaXJzdCBjbG9jayB0cmFuc2l0aW9uICAqLworI2RlZmluZSBTTUFSVENBUkRfUEhBU0VfMkVER0UgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BIQSAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIHBoYXNlIG9uIHNlY29uZCBjbG9jayB0cmFuc2l0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9MYXN0X0JpdCBTTUFSVENBUkQgTGFzdCBCaXQKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9ESVNBQkxFICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugbm90IG91dHB1dCB0byBTQ0xLIHBpbiAqLworI2RlZmluZSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUgICAgICAgICAgICBVU0FSVF9DUjJfTEJDTCAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugb3V0cHV0IHRvIFNDTEsgcGluICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfT25lQml0X1NhbXBsaW5nIFNNQVJUQ0FSRCBPbmUgQml0IFNhbXBsaW5nIE1ldGhvZAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZnJhbWUgb25lLWJpdCBzYW1wbGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0VOQUJMRSAgICAgVVNBUlRfQ1IzX09ORUJJVCAgICAgICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBmcmFtZSBvbmUtYml0IHNhbXBsZSBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9OQUNLX0VuYWJsZSBTTUFSVENBUkQgTkFDSyBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfTkFDS19ESVNBQkxFICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIE5BQ0sgdHJhbnNtaXNzaW9uIGRpc2FibGVkICAqLworI2RlZmluZSBTTUFSVENBUkRfTkFDS19FTkFCTEUgICAgICAgICAgICAgICBVU0FSVF9DUjNfTkFDSyAgICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIE5BQ0sgdHJhbnNtaXNzaW9uIGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1RpbWVvdXRfRW5hYmxlIFNNQVJUQ0FSRCBUaW1lb3V0IEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBkaXNhYmxlZCAqLworI2RlZmluZSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUgICAgICAgICAgICBVU0FSVF9DUjJfUlRPRU4gICAgICAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0Nsb2NrUHJlc2NhbGVyICBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjEgICAgMHgwMDAwMDAwMFUgIC8qITwgZmNsa19wcmVzID0gZmNsayAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYyICAgIDB4MDAwMDAwMDFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMiAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNCAgICAweDAwMDAwMDAyVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzQgICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjYgICAgMHgwMDAwMDAwM1UgIC8qITwgZmNsa19wcmVzID0gZmNsay82ICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVY4ICAgIDB4MDAwMDAwMDRVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvOCAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMTAgICAweDAwMDAwMDA1VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEwICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjEyICAgMHgwMDAwMDAwNlUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMiAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxNiAgIDB4MDAwMDAwMDdVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTYgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMzIgICAweDAwMDAwMDA4VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzMyICAqLworI2RlZmluZSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjY0ICAgMHgwMDAwMDAwOVUgIC8qITwgZmNsa19wcmVzID0gZmNsay82NCAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxMjggIDB4MDAwMDAwMEFVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTI4ICovCisjZGVmaW5lIFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMjU2ICAweDAwMDAwMDBCVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzI1NiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9UeF9JbnYgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUgICBVU0FSVF9DUjJfVFhJTlYgICAgICAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUnhfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFICAgVVNBUlRfQ1IyX1JYSU5WICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0RhdGFfSW52IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIEJpbmFyeSBEYXRhIGludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBCaW5hcnkgZGF0YSBpbnZlcnNpb24gZGlzYWJsZSAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1J4X1R4X1N3YXAgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgUlggVFggcGlucyBzd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFICAgIFVTQVJUX0NSMl9TV0FQICAgICAgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfT3ZlcnJ1bl9EaXNhYmxlIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE92ZXJydW4gRGlzYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRU5BQkxFICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPCBSWCBvdmVycnVuIGVuYWJsZSAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFICBVU0FSVF9DUjNfT1ZSRElTICAgICAgICAgICAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRE1BX0Rpc2FibGVfb25fUnhfRXJyb3IgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgRE1BIERpc2FibGUgb24gUnggRXJyb3IKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgRE1BIGVuYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SICBVU0FSVF9DUjNfRERSRSAgICAgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX01TQl9GaXJzdCAgIFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlIE1TQiBmaXJzdAorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUmVxdWVzdF9QYXJhbWV0ZXJzIFNNQVJUQ0FSRCBSZXF1ZXN0IFBhcmFtZXRlcnMKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICBVU0FSVF9SUVJfUlhGUlEgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZSBkYXRhIGZsdXNoIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUICAgICAgVVNBUlRfUlFSX1RYRlJRICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggcmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfSW50ZXJydXB0aW9uX01hc2sgU01BUlRDQVJEIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRlUgICAvKiE8IFNNQVJUQ0FSRCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBFMFUgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIG1hc2sgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DUl9QT1MgICAgICAgICAgICAgICAgICAgIDVVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBjb250cm9sIHJlZ2lzdGVyIHBvc2l0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUYwMFUgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgbWFzayAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JU1JfUE9TICAgICAgICAgICAgICAgICAgIDhVICAgICAgICAvKiE8IFNNQVJUQ0FSRCBJU1IgcmVnaXN0ZXIgcG9zaXRpb24gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfTWFjcm9zICBTTUFSVENBUkQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgU01BUlRDQVJEIGhhbmRsZSBzdGF0ZXMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2VuZGlmIC8qVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICAqLworCisvKiogQGJyaWVmICBGbHVzaCB0aGUgU21hcnRjYXJkIERhdGEgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9GTFVTSF9EUlJFR0lTVEVSKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgICAgfSB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUEVGICAgIFBhcml0eSBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0ZFRiAgICBGcmFtaW5nIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfTkVGICAgIE5vaXNlIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfT1JFRiAgIE92ZXJSdW4gZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgSWRsZSBsaW5lIGRldGVjdGVkIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDQkdURiBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX0VPQkYgICBFbmQgb2YgYmxvY2sgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU01BUlRDQVJEIFBFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfUEVGKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9GRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9ORUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFNNQVJUQ0FSRF9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgT1JFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgU01BUlRDQVJEX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUFSVENBUkQgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBTTUFSVENBUkRfQ0xFQVJfSURMRUYpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydGNhcmQgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVENCR1QgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKHdoZW4gZmxhZyBhdmFpbGFibGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RFQUNLIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfRU9CRiAgRW5kIG9mIGJsb2NrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19SVE9GICBSZWNlaXZlciB0aW1lb3V0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19UWEZORiBUWEZJRk8gbm90IGZ1bGwgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlhGTkUgUlhGSUZPIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfT1JFICAgT3ZlcnJ1biBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfTkUgICAgTm9pc2UgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX0ZFICAgIEZyYW1pbmcgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1BFICAgIFBhcml0eSBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfVFhGRSAgVFhGSUZPIEVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfRkxBR19SWEZGICBSWEZJRk8gRnVsbCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0ZMQUdfUlhGVCAgU01BUlRDQVJEIFJYRklGTyB0aHJlc2hvbGQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9GTEFHX1RYRlQgIFNNQVJUQ0FSRCBUWEZJRk8gdGhyZXNob2xkIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU21hcnRDYXJkIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgdG8gZW5hYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZORiAgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgIEVycm9yIGludGVycnVwdChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRkYgICBSWEZJRk8gZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGRSAgIFRYRklGTyBlbXB0eSBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGVCAgIFJYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGVCAgIFRYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfQ1JfTUFTSykgPj4gU01BUlRDQVJEX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9ICgodWludDMyX3QpMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiB8PSAoKHVpbnQzMl90KTFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgfD0gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIGludGVycnVwdCB0byBkaXNhYmxlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZORiAgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgIEVycm9yIGludGVycnVwdChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRkYgICBSWEZJRk8gZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGRSAgIFRYRklGTyBlbXB0eSBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGVCAgIFJYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGVCAgIFRYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICgoKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfQ1JfTUFTSykgPj4gU01BUlRDQVJEX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfQ1JfTUFTSykgPj4gU01BUlRDQVJEX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9IH4gKCh1aW50MzJfdCkxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0lUX01BU0spKSkpCisKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRU9CICAgIEVuZCBvZiBibG9jayBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlRPICAgIFJlY2VpdmUgdGltZW91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhFICAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRk5GICBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQyAgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UQ0JHVCAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCAod2hlbiBpbnRlcnJ1cHRpb24gYXZhaWxhYmxlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWE5FICAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGTkUgIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0lETEUgICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9QRSAgICAgUGFyaXR5IGVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9FUlIgICAgRXJyb3IgaW50ZXJydXB0KGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGRiAgIFJYRklGTyBmdWxsIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZFICAgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9SWEZUICAgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZUICAgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgodWludDMyX3QpMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVNSX01BU0spPj4gU01BUlRDQVJEX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTbWFydENhcmQgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VPQiAgICBFbmQgb2YgYmxvY2sgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JUTyAgICBSZWNlaXZlIHRpbWVvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1RYRSAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9UWEZORiAgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVEMgICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVENCR1QgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBpbnRlcnJ1cHQgKHdoZW4gaW50ZXJydXB0aW9uIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhORSAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRk5FICBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9JVF9JRExFICAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUEUgICAgIFBhcml0eSBlcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfRVJSICAgIEVycm9yIGludGVycnVwdChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX1JYRkYgICBSWEZJRk8gZnVsbCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGRSAgIFRYRklGTyBlbXB0eSBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfUlhGVCAgIFJYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfSVRfVFhGVCAgIFRYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24KKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKCgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAweDAxVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAweDAyVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoKHVpbnQzMl90KTB4MDFVIDw8ICgoKHVpbnQxNl90KShfX0lOVEVSUlVQVF9fKSkgJiBTTUFSVENBUkRfSVRfTUFTSykpKSAgIT0gMFUpID8gU0VUIDogUkVTRVQpCisKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JVF9DTEVBUl9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1BFRiAgICBQYXJpdHkgZXJyb3IgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgRnJhbWluZyBlcnJvciBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX05FRiAgICBOb2lzZSBkZXRlY3RlZCBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX09SRUYgICBPdmVyUnVuIGVycm9yIGNsZWFyIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfSURMRUYgIElkbGUgbGluZSBkZXRlY3Rpb24gY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfVENGICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0NMRUFSX1RDQkdURiBUcmFuc21pc3Npb24gY29tcGxldGUgYmVmb3JlIGd1YXJkIHRpbWUgY2xlYXIgZmxhZyAod2hlbiBmbGFnIGF2YWlsYWJsZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfQ0xFQVJfUlRPRiAgIFJlY2VpdmVyIHRpbWVvdXQgY2xlYXIgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9DTEVBUl9FT0JGICAgRW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiB8PSAodWludDMyX3QpKF9fSVRfQ0xFQVJfXykpCisKKy8qKiBAYnJpZWYgIFNldCBhIHNwZWNpZmljIFNNQVJUQ0FSRCByZXF1ZXN0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBkYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgVHJhbnNtaXQgZGF0YSBmbHVzaCBSZXF1ZXN0CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBTTUFSVENBUkQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSAodWludDMyX3QpfigodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgVVNBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAgVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBVU0FSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgSGFuZGxlCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gIH5VU0FSVF9DUjFfVUUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfUHJpdmF0ZV9NYWNyb3MgU01BUlRDQVJEIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBTTUFSVENBUkQgY2xvY2sgc291cmNlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgdGhlIFNNQVJUQ0FSRCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2RlZmluZSBTTUFSVENBUkRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX0xTRTsgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgQmF1ZCByYXRlIHJhbmdlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBXQiAoNjQgTUh6KQorICAqICAgICAgICAgZGl2aWRlZCBieSB0aGUgb3ZlcnNhbXBsaW5nIHVzZWQgb24gdGhlIFNNQVJUQ0FSRCAoaS5lLiAxNikuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHNldCBieSB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbi4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA0MDAwMDAxVSkKKworLyoqIEBicmllZiAgQ2hlY2sgdGhlIGJsb2NrIGxlbmd0aCByYW5nZS4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFNNQVJUQ0FSRCBibG9jayBsZW5ndGggaXMgMHhGRi4KKyAgKiBAcGFyYW0gIF9fTEVOR1RIX18gYmxvY2sgbGVuZ3RoLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9CTE9DS0xFTkdUSChfX0xFTkdUSF9fKSAoKF9fTEVOR1RIX18pIDw9IDB4RkZVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZS4KKyAgKiBAbm90ZSAgIFRoZSBtYXhpbXVtIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IHZhbHVlIGlzIDB4RkZGRkZGLgorICAqIEBwYXJhbSAgX19USU1FT1VUVkFMVUVfXyByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKF9fVElNRU9VVFZBTFVFX18pICAgICgoX19USU1FT1VUVkFMVUVfXykgPD0gMHhGRkZGRkZVKQorCisvKiogQGJyaWVmICBDaGVjayB0aGUgU01BUlRDQVJEIGF1dG9yZXRyeSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBpcyAweDcuCisgICogQHBhcmFtICBfX0NPVU5UX18gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucy4KKyAgKiBAcmV0dmFsIFRlc3QgcmVzdWx0IChUUlVFIG9yIEZBTFNFKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQVVUT1JFVFJZX0NPVU5UKF9fQ09VTlRfXykgICAgICAgICAoKF9fQ09VTlRfXykgPD0gMHg3VSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTEVOR1RIX18gU01BUlRDQVJEIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoX19MRU5HVEhfXykgPT0gU01BUlRDQVJEX1dPUkRMRU5HVEhfOUIpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TVE9QQklUU19fIFNNQVJUQ0FSRCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1NUT1BCSVRTKF9fU1RPUEJJVFNfXykgKCgoX19TVE9QQklUU19fKSA9PSBTTUFSVENBUkRfU1RPUEJJVFNfMF81KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBTTUFSVENBUkRfU1RPUEJJVFNfMV81KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBwYXJpdHkgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fUEFSSVRZX18gU01BUlRDQVJEIGZyYW1lIHBhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBTTUFSVENBUkRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBTTUFSVENBUkRfUEFSSVRZX09ERCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBTTUFSVENBUkQgY29tbXVuaWNhdGlvbiBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX01PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgMHhGRkYzVSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBwb2xhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUE9MX18gU01BUlRDQVJEIGZyYW1lIHBvbGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX0NQT0xfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BPTF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9QT0xBUklUWShfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFNNQVJUQ0FSRF9QT0xBUklUWV9MT1cpIHx8ICgoX19DUE9MX18pID09IFNNQVJUQ0FSRF9QT0xBUklUWV9ISUdIKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBwaGFzZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUEhBX18gU01BUlRDQVJEIGZyYW1lIHBoYXNlLgorICAqIEByZXR2YWwgU0VUIChfX0NQSEFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ1BIQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9QSEFTRShfX0NQSEFfXykgKCgoX19DUEhBX18pID09IFNNQVJUQ0FSRF9QSEFTRV8xRURHRSkgfHwgKChfX0NQSEFfXykgPT0gU01BUlRDQVJEX1BIQVNFXzJFREdFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBsYXN0IGJpdCBjbG9jayBwdWxzZSBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xBU1RCSVRfXyBTTUFSVENBUkQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19MQVNUQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xBU1RCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTEFTVEJJVChfX0xBU1RCSVRfXykgKCgoX19MQVNUQklUX18pID09IFNNQVJUQ0FSRF9MQVNUQklUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFTVEJJVF9fKSA9PSBTTUFSVENBUkRfTEFTVEJJVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX09ORUJJVF9fIFNNQVJUQ0FSRCBmcmFtZSBzYW1wbGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19PTkVCSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fT05FQklUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFKF9fT05FQklUX18pICgoKF9fT05FQklUX18pID09IFNNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09ORUJJVF9fKSA9PSBTTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBOQUNLIHRyYW5zbWlzc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX05BQ0tfXyBTTUFSVENBUkQgTkFDSyB0cmFuc21pc3Npb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19OQUNLX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX05BQ0tfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfTkFDSyhfX05BQ0tfXykgKCgoX19OQUNLX18pID09IFNNQVJUQ0FSRF9OQUNLX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OQUNLX18pID09IFNNQVJUQ0FSRF9OQUNLX0RJU0FCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USU1FT1VUX18gU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19USU1FT1VUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RJTUVPVVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfVElNRU9VVChfX1RJTUVPVVRfXykgKCgoX19USU1FT1VUX18pID09IFNNQVJUQ0FSRF9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVElNRU9VVF9fKSA9PSBTTUFSVENBUkRfVElNRU9VVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGNsb2NrIFByZXNjYWxlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DTE9DS1BSRVNDQUxFUl9fIFNNQVJUQ0FSRCBjbG9jayBQcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQ0xPQ0tQUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYyKSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWNCkgICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjYpICAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVY4KSAgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMTApICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjEyKSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxNikgIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMzIpICB8fCBcCisgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBTTUFSVENBUkRfUFJFU0NBTEVSX0RJVjY0KSAgfHwgXAorICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gU01BUlRDQVJEX1BSRVNDQUxFUl9ESVYxMjgpIHx8IFwKKyAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFNNQVJUQ0FSRF9QUkVTQ0FMRVJfRElWMjU2KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBhZHZhbmNlZCBmZWF0dXJlcyBpbml0aWFsaXphdGlvbiBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19JTklUX18gU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0lOSVQoX19JTklUX18pICgoX19JTklUX18pIDw9IChTTUFSVENBUkRfQURWRkVBVFVSRV9OT19JTklUICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVFhJTlZfXyBTTUFSVENBUkQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVFhJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVFhJTlZfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQURWRkVBVFVSRV9UWElOVihfX1RYSU5WX18pICgoKF9fVFhJTlZfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFhJTlZfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19SWElOVl9fIFNNQVJUQ0FSRCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19SWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19SWElOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WKF9fUlhJTlZfXykgKCgoX19SWElOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SWElOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVl9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIGRhdGEgaW52ZXJzaW9uIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fREFUQUlOVl9fIFNNQVJUQ0FSRCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlYoX19EQVRBSU5WX18pICgoKF9fREFUQUlOVl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9EQVRBSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBSWC9UWCBwaW5zIHN3YXAgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19TV0FQX18gU01BUlRDQVJEIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1NXQVBfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1dBUF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVAoX19TV0FQX18pICgoKF9fU1dBUF9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9TV0FQX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TV0FQX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSBvdmVycnVuIHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fT1ZFUlJVTl9fIFNNQVJUQ0FSRCBmcmFtZSBvdmVycnVuIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fT1ZFUlJVTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PVkVSUlVOX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX09WRVJSVU4oX19PVkVSUlVOX18pICgoKF9fT1ZFUlJVTl9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19PVkVSUlVOX18pID09IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgRE1BIGVuYWJsaW5nIG9yIGRpc2FibGluZyBvbiBlcnJvciBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQV9fIFNNQVJUQ0FSRCBETUEgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9uIGVycm9yIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fRE1BX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAoKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRU5BQkxFT05SWEVSUk9SKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RNQV9fKSA9PSBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFfRElTQUJMRU9OUlhFUlJPUikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBTTUFSVENBUkQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTVNCRklSU1RfXyBTTUFSVENBUkQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fTVNCRklSU1RfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTVNCRklSU1RfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfQURWRkVBVFVSRV9NU0JGSVJTVChfX01TQkZJUlNUX18pICgoKF9fTVNCRklSU1RfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVNCRklSU1RfXykgPT0gU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCByZXF1ZXN0IHBhcmFtZXRlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIFNNQVJUQ0FSRCByZXF1ZXN0IHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9SRVFVRVNUX1BBUkFNRVRFUihfX1BBUkFNX18pICgoKF9fUEFSQU1fXykgPT0gU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gU01BUlRDQVJEX1RYREFUQV9GTFVTSF9SRVFVRVNUKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogSW5jbHVkZSBTTUFSVENBUkQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfc21hcnRjYXJkX2V4LmgiCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICAqIEB7CisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0RlSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIEBhZGR0b2dyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKwordm9pZCBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3ZvaWQgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7Cit2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAgKiBAeworICAqLworCitIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9TTUFSVENBUkRfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zbWFydGNhcmRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY4NmE3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkX2V4LmgKQEAgLTAsMCArMSwzNDMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3NtYXJ0Y2FyZF9leC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTTUFSVENBUkQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1NNQVJUQ0FSRF9FWF9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfU01BUlRDQVJEX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfQ29uc3RhbnRzICBTTUFSVENBUkQgRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9UcmFuc21pc3Npb25fQ29tcGxldGlvbl9JbmRpY2F0aW9uIFNNQVJUQ0FSRCBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBJbmRpY2F0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RDQkdUICAgICAgU01BUlRDQVJEX0lUX1RDQkdUIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSAqLworI2RlZmluZSBTTUFSVENBUkRfVEMgICAgICAgICBTTUFSVENBUkRfSVRfVEMgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIChmbGFnIHJhaXNlZCB3aGVuIGd1YXJkIHRpbWUgaGFzIGVsYXBzZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgU01BUlRDQVJEIGFkdmFuY2VkIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gdHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX05PX0lOSVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgTm8gYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDFVICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwMDJVICAgIC8qITwgUlggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCAgICAgICAgIDB4MDAwMDAwMDRVICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfSU5JVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAgIC8qITwgVFgvUlggcGlucyBzd2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgIDB4MDAwMDAwMTBVICAgIC8qITwgUlggb3ZlcnJ1biBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RNQURJU0FCTEVPTkVSUk9SX0lOSVQgIDB4MDAwMDAwMjBVICAgIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQgICAgICAgICAgIDB4MDAwMDAwODBVICAgIC8qITwgTW9zdCBzaWduaWZpY2FudCBiaXQgc2VudC9yZWNlaXZlZCBmaXJzdCAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYQ09NUExFVElPTiAgICAgICAgICAgIDB4MDAwMDAxMDBVICAgIC8qITwgVFggY29tcGxldGlvbiBpbmRpY2F0aW9uIGJlZm9yZSBvZiBhZnRlciBndWFyZCB0aW1lICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0ZJRk9fbW9kZSBTTUFSVENBUkRFeCBGSUZPIG1vZGUKKyAgKiBAYnJpZWYgICAgU01BUlRDQVJEIEZJRk8gbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GSUZPTU9ERV9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEUgICAgICAgICBVU0FSVF9DUjFfRklGT0VOICAgICAgICAgICAgICAvKiE8IEZJRk8gbW9kZSBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgU01BUlRDQVJERXggVFhGSUZPIHRocmVzaG9sZCBsZXZlbAorICAqIEBicmllZiAgICBTTUFSVENBUkQgVFhGSUZPIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV84ICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF8xXzQgICBVU0FSVF9DUjNfVFhGVENGR18wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19UWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfM180ICAgKFVTQVJUX0NSM19UWEZUQ0ZHXzB8VVNBUlRfQ1IzX1RYRlRDRkdfMSkgIC8qITwgVFhGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF83XzggICBVU0FSVF9DUjNfVFhGVENGR18yICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfVFhGVENGR18yfFVTQVJUX0NSM19UWEZUQ0ZHXzApICAvKiE8IFRYRklGTyBiZWNvbWVzIGVtcHR5ICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUlhGSUZPX3RocmVzaG9sZF9sZXZlbCBTTUFSVENBUkRFeCBSWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQGJyaWVmICAgIFNNQVJUQ0FSRCBSWEZJRk8gbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8xXzggICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV80ICAgVVNBUlRfQ1IzX1JYRlRDRkdfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfMiAgIFVTQVJUX0NSM19SWEZUQ0ZHXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS8yIG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8zXzQgICAoVVNBUlRfQ1IzX1JYRlRDRkdfMHxVU0FSVF9DUjNfUlhGVENGR18xKSAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfN184ICAgVVNBUlRfQ1IzX1JYRlRDRkdfMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzhfOCAgIChVU0FSVF9DUjNfUlhGVENGR18yfFVTQVJUX0NSM19SWEZUQ0ZHXzApICAvKiE8IFJYRklGTyBGSUZPIGJlY29tZXMgZnVsbCAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9GbGFncyBTTUFSVENBUkQgRmxhZ3MKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWAorICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RDQkdUICAgICAgICAgIFVTQVJUX0lTUl9UQ0JHVCAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JFQUNLICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RFQUNLICAgICAgICAgIFVTQVJUX0lTUl9URUFDSyAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0JVU1kgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgIC8qITwgU01BUlRDQVJEIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0VPQkYgICAgICAgICAgIFVTQVJUX0lTUl9FT0JGICAgICAgICAgIC8qITwgU01BUlRDQVJEIGVuZCBvZiBibG9jayBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JUT0YgICAgICAgICAgIFVTQVJUX0lTUl9SVE9GICAgICAgICAgIC8qITwgU01BUlRDQVJEIHJlY2VpdmVyIHRpbWVvdXQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRSAgICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRk5GICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RDICAgICAgICAgICAgIFVTQVJUX0lTUl9UQyAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYTkUgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgU01BUlRDQVJEIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRk5FICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0lETEUgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3Rpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX09SRSAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX05FICAgICAgICAgICAgIFVTQVJUX0lTUl9ORSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX0ZFICAgICAgICAgICAgIFVTQVJUX0lTUl9GRSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1BFICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRkUgICAgICAgICAgIFVTQVJUX0lTUl9UWEZFICAgICAgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyBFbXB0eSBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRkYgICAgICAgICAgIFVTQVJUX0lTUl9SWEZGICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyBGdWxsIGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1JYRlQgICAgICAgICAgIFVTQVJUX0lTUl9SWEZUICAgICAgICAgIC8qITwgU01BUlRDQVJEIFJYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9GTEFHX1RYRlQgICAgICAgICAgIFVTQVJUX0lTUl9UWEZUICAgICAgICAgIC8qITwgU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgZmxhZyAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0ludGVycnVwdF9kZWZpbml0aW9uIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIERlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMFpaWlpaMFhYWVlZWVliCisgICogICAgICAgICAgIC0gWVlZWVkgIDogSW50ZXJydXB0IHNvdXJjZSBwb3NpdGlvbiBpbiB0aGUgWFggcmVnaXN0ZXIgKDUgYml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyIGJpdHMpCisgICogICAgICAgICAgICAgICAgIC0gMDE6IENSMSByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDEwOiBDUjIgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgICAgICAgLSAxMTogQ1IzIHJlZ2lzdGVyCisgICogICAgICAgICAgIC0gWlpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDUgYml0cykKKyAgKiBAeworICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUEUgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVFhFICAgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVFhGTkYgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfVEMgICAgICAgICAgICAgICAgICAgICAweDA2MjZVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlhORSAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdGlvbiAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfUlhGTkUgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBTTUFSVENBUkRfSVRfSURMRSAgICAgICAgICAgICAgICAgICAweDA0MjRVICAgICAgICAgICAvKiE8IFNNQVJUQ0FSRCBpZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdGlvbiAgICAgICAgICAqLworCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9FUlIgICAgICAgICAgICAgICAgICAgIDB4MDA2MFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9PUkUgICAgICAgICAgICAgICAgICAgIDB4MDMwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9ORSAgICAgICAgICAgICAgICAgICAgIDB4MDIwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9JVF9GRSAgICAgICAgICAgICAgICAgICAgIDB4MDEwMFUgICAgICAgICAgIC8qITwgU01BUlRDQVJEIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX0VPQiAgICAgICAgICAgICAgICAgICAgMHgwQzNCVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JUTyAgICAgICAgICAgICAgICAgICAgMHgwQjNBVSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RDQkdUICAgICAgICAgICAgICAgICAgMHgxOTc4VSAgICAgICAgICAgLyohPCBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGNvbXBsZXRpb24gaW50ZXJydXB0aW9uICovCisKKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JYRkYgICAgICAgICAgICAgICAgICAgIDB4MTgzRlUgICAgICAgICAgLyohPCBTTUFSVENBUkQgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RYRkUgICAgICAgICAgICAgICAgICAgIDB4MTczRVUgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFhGSUZPIGVtcHR5IGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1JYRlQgICAgICAgICAgICAgICAgICAgIDB4MUE3Q1UgICAgICAgICAgLyohPCBTTUFSVENBUkQgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0lUX1RYRlQgICAgICAgICAgICAgICAgICAgIDB4MUI3N1UgICAgICAgICAgLyohPCBTTUFSVENBUkQgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfSVRfQ0xFQVJfRmxhZ3MgU01BUlRDQVJEIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9QRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgIC8qITwgU01BUlRDQVJEIHBhcml0eSBlcnJvciBjbGVhciBmbGFnICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9GRUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgIC8qITwgU01BUlRDQVJEIGZyYW1pbmcgZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9ORUNGICAgIC8qITwgU01BUlRDQVJEIG5vaXNlIGVycm9yIGRldGVjdGVkIGNsZWFyIGZsYWcgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgIC8qITwgU01BUlRDQVJEIG92ZXJydW4gZXJyb3IgY2xlYXIgZmxhZyAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgIC8qITwgU01BUlRDQVJEIGlkbGUgbGluZSBkZXRlY3RlZCBjbGVhciBmbGFnICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UWEZFQ0YgICAgICAgICAgICAgIFVTQVJUX0lDUl9UWEZFQ0YgIC8qITwgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBjbGVhciBmbGFnICovCisjZGVmaW5lIFNNQVJUQ0FSRF9DTEVBUl9UQ0JHVEYgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0JHVENGIC8qITwgU01BUlRDQVJEIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uIGNsZWFyIGZsYWcgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX1JUT0YgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1JUT0NGICAgLyohPCBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZSBvdXQgY2xlYXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgU01BUlRDQVJEX0NMRUFSX0VPQkYgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgLyohPCBTTUFSVENBUkQgZW5kIG9mIGJsb2NrIGNsZWFyIGZsYWcgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUHJpdmF0ZV9NYWNyb3MgU01BUlRDQVJEIEV4dGVuZGVkIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgU2V0IHRoZSBUcmFuc21pc3Npb24gQ29tcGxldGlvbiBmbGFnCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgSWYgVENCR1QgKFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSkgZmxhZyBpcyBub3QgYXZhaWxhYmxlIG9yIGlmCisgICogICAgICAgIEFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uIGlzIG5vdCBhbHJlYWR5IGZpbGxlZCwgdGhlIGxhdHRlciBpcyBmb3JjZWQKKyAgKiAgICAgICAgdG8gU01BUlRDQVJEX1RDICh0cmFuc21pc3Npb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIHdoZW4gZ3VhcmQgdGltZSBoYXMgZWxhcHNlZCkuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIFNNQVJUQ0FSRF9UUkFOU01JU1NJT05fQ09NUExFVElPTl9TRVRUSU5HKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1RYQ09NUExFVElPTikpICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID0gU01BUlRDQVJEX1RDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT04oKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbikpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBSZXR1cm4gdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KKyAgKiBAbm90ZSAgQmFzZWQgb24gQWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24gc2V0dGluZywgcmV0dXJuIFRDIG9yIFRDQkdUIGZsYWcuCisgICogICAgICAgIFdoZW4gVENCR1QgZmxhZyAoVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lKSBpcyBub3QgYXZhaWxhYmxlLCBUQyBmbGFnIGlzCisgICogICAgICAgIHJlcG9ydGVkLgorICAqIEByZXR2YWwgVHJhbnNtaXNzaW9uIGNvbXBsZXRpb24gZmxhZworICAqLworI2RlZmluZSBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID09IFNNQVJUQ0FSRF9UQykgPyAoU01BUlRDQVJEX0ZMQUdfVEMpIDogIChTTUFSVENBUkRfRkxBR19UQ0JHVCkpCisKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBmcmFtZSB0cmFuc21pc3Npb24gY29tcGxldGlvbiB1c2VkIGZsYWcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVFhDT01QTEVURV9fIFNNQVJUQ0FSRCBmcmFtZSB0cmFuc21pc3Npb24gY29tcGxldGlvbiB1c2VkIGZsYWcuCisgICogQHJldHZhbCBTRVQgKF9fVFhDT01QTEVURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19UWENPTVBMRVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OKF9fVFhDT01QTEVURV9fKSAoKChfX1RYQ09NUExFVEVfXykgPT0gU01BUlRDQVJEX1RDQkdUKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RYQ09NUExFVEVfXykgPT0gU01BUlRDQVJEX1RDKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBGSUZPIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RBVEVfXyBTTUFSVENBUkQgRklGTyBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfU01BUlRDQVJEX0ZJRk9NT0RFX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBTTUFSVENBUkRfRklGT01PREVfRElTQUJMRSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVEhSRVNIT0xEX18gU01BUlRDQVJEIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwuCisgICogQHJldHZhbCBTRVQgKF9fVEhSRVNIT0xEX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RIUkVTSE9MRF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICgoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF8xXzQpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfMV8yKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzNfNCkgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRF83XzgpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1RYRklGT19USFJFU0hPTERfOF84KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFNNQVJUQ0FSRCBSWEZJRk8gdGhyZXNob2xkIGxldmVsIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFNNQVJUQ0FSRCBSWEZJRk8gdGhyZXNob2xkIGxldmVsLgorICAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19TTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRChfX1RIUkVTSE9MRF9fKSAoKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8xXzgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfMV80KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfMikgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBTTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRF8zXzQpICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gU01BUlRDQVJEX1JYRklGT19USFJFU0hPTERfN184KSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzhfOCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElPIG9wZXJhdGlvbiBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRFeF9CbG9ja0xlbmd0aF9Db25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgQmxvY2tMZW5ndGgpOwordm9pZCAgICAgICAgICAgICAgSEFMX1NNQVJUQ0FSREV4X1RpbWVPdXRfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaW1lT3V0VmFsdWUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRGlzYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9TTUFSVENBUkRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOwordm9pZCBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9FbmFibGVGaWZvTW9kZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRGlzYWJsZUZpZm9Nb2RlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IFRocmVzaG9sZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfU2V0UnhGaWZvVGhyZXNob2xkKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBUaHJlc2hvbGQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1NNQVJUQ0FSRF9FWF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF9zbWJ1cy5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfc21idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdjMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc21idXMuaApAQCAtMCwwICsxLDc0MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc21idXMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgU01CVVMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1NNQlVTX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9TTUJVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU01CVVMKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9UeXBlcyBTTUJVUyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfQ29uZmlndXJhdGlvbl9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBTTUJVUyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBTTUJVUyBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWluZzsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBTTUJVU19USU1JTkdSX3JlZ2lzdGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIFNNQlVTIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gUmVmZXJlbmNlIG1hbnVhbCAqLworICB1aW50MzJfdCBBbmFsb2dGaWx0ZXI7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBBbmFsb2cgRmlsdGVyIGlzIGVuYWJsZSBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19BbmFsb2dfRmlsdGVyICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczE7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGZpcnN0IGRldmljZSBvd24gYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBvciAxMC1iaXQgYWRkcmVzcy4gKi8KKworICB1aW50MzJfdCBBZGRyZXNzaW5nTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlIGZvciBtYXN0ZXIgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19hZGRyZXNzaW5nX21vZGUgKi8KKworICB1aW50MzJfdCBEdWFsQWRkcmVzc01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX2R1YWxfYWRkcmVzc2luZ19tb2RlICovCisKKyAgdWludDMyX3QgT3duQWRkcmVzczI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlY29uZCBkZXZpY2Ugb3duIGFkZHJlc3MgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSA3LWJpdCBhZGRyZXNzLiAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MyTWFza3M7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY2tub2xlZGdlIG1hc2sgYWRkcmVzcyBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19vd25fYWRkcmVzczJfbWFza3MuICovCisKKyAgdWludDMyX3QgR2VuZXJhbENhbGxNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgZ2VuZXJhbCBjYWxsIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTTUJVU19nZW5lcmFsX2NhbGxfYWRkcmVzc2luZ19tb2RlLiAqLworCisgIHVpbnQzMl90IE5vU3RyZXRjaE1vZGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIG5vc3RyZXRjaCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU01CVVNfbm9zdHJldGNoX21vZGUgKi8KKworICB1aW50MzJfdCBQYWNrZXRFcnJvckNoZWNrTW9kZTsgICAvKiE8IFNwZWNpZmllcyBpZiBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX3BhY2tldF9lcnJvcl9jaGVja19tb2RlICovCisKKyAgdWludDMyX3QgUGVyaXBoZXJhbE1vZGU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggbW9kZSBvZiBQZXJpcGhhbCBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNNQlVTX3BlcmlwaGVyYWxfbW9kZSAqLworCisgIHVpbnQzMl90IFNNQnVzVGltZW91dDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb250ZW50IG9mIHRoZSAzMiBCaXRzIFNNQlVTX1RJTUVPVVRfcmVnaXN0ZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbmFibGUgYml0cyBhbmQgZGlmZmVyZW50IHRpbWVvdXQgdmFsdWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbGN1bGF0ZWQgYnkgcmVmZXJyaW5nIHRvIFNNQlVTIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gUmVmZXJlbmNlIG1hbnVhbCAqLworfSBTTUJVU19Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX3N0YXRlX2RlZmluaXRpb24gSEFMIHN0YXRlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBTdGF0ZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1JFU0VUICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAvKiE8IFNNQlVTIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfUkVBRFkgICAgICAgICAgICgweDAwMDAwMDAxVSkgIC8qITwgU01CVVMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9CVVNZICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgLyohPCBTTUJVUyBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYICAoMHgwMDAwMDAxMlUpICAvKiE8IE1hc3RlciBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlggICgweDAwMDAwMDIyVSkgIC8qITwgTWFzdGVyIERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYICAgKDB4MDAwMDAwMzJVKSAgLyohPCBTbGF2ZSBEYXRhIFRyYW5zbWlzc2lvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlggICAoMHgwMDAwMDA0MlUpICAvKiE8IFNsYXZlIERhdGEgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAqLworI2RlZmluZSBIQUxfU01CVVNfU1RBVEVfVElNRU9VVCAgICAgICAgICgweDAwMDAwMDAzVSkgIC8qITwgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TTUJVU19TVEFURV9FUlJPUiAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAgLyohPCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTiAgICAgICAgICAoMHgwMDAwMDAwOFUpICAgLyohPCBBZGRyZXNzIExpc3RlbiBNb2RlIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXJyb3JfQ29kZV9kZWZpbml0aW9uIFNNQlVTIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgU01CVVMgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX05PTkUgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0JFUlIgICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAgIC8qITwgQkVSUiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FSTE8gICAgICAgICAgICAoMHgwMDAwMDAwMlUpICAgIC8qITwgQVJMTyBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FDS0YgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAgIC8qITwgQUNLRiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX09WUiAgICAgICAgICAgICAoMHgwMDAwMDAwOFUpICAgIC8qITwgT1ZSIGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0hBTFRJTUVPVVQgICAgICAoMHgwMDAwMDAxMFUpICAgIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0JVU1RJTUVPVVQgICAgICAoMHgwMDAwMDAyMFUpICAgIC8qITwgQnVzIFRpbWVvdXQgZXJyb3IgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0FMRVJUICAgICAgICAgICAoMHgwMDAwMDA0MFUpICAgIC8qITwgQWxlcnQgZXJyb3IgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX1BFQ0VSUiAgICAgICAgICAoMHgwMDAwMDA4MFUpICAgIC8qITwgUEVDIGVycm9yICAgICAgICAgICAgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgICgweDAwMDAwMTAwVSkgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICovCisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyNkZWZpbmUgSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfUEFSQU0gICAgKDB4MDAwMDAyMDBVKSAgIC8qITwgSW52YWxpZCBQYXJhbWV0ZXJzIGVycm9yICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX2hhbmRsZV9TdHJ1Y3R1cmVfZGVmaW5pdGlvbiBTTUJVUyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIFNNQlVTIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYKK3sKKyAgSTJDX1R5cGVEZWYgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgIC8qITwgU01CVVMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAqLworCisgIFNNQlVTX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAvKiE8IFNNQlVTIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgKi8KKworICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICpwQnVmZlB0cjsgICAgICAgLyohPCBQb2ludGVyIHRvIFNNQlVTIHRyYW5zZmVyIGJ1ZmZlciAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBYZmVyU2l6ZTsgICAgICAgIC8qITwgU01CVVMgdHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgWGZlckNvdW50OyAgICAgICAvKiE8IFNNQlVTIHRyYW5zZmVyIGNvdW50ZXIgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIFhmZXJPcHRpb25zOyAgICAgLyohPCBTTUJVUyB0cmFuc2ZlciBvcHRpb25zICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBQcmV2aW91c1N0YXRlOyAgIC8qITwgU01CVVMgY29tbXVuaWNhdGlvbiBQcmV2aW91cyBzdGF0ZSAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAvKiE8IFNNQlVTIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAgLyohPCBTTUJVUyBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgIC8qITwgU01CVVMgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogTWFzdGVyVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7ICAgICAgICAgICAvKiE8IFNNQlVTIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBNYXN0ZXJSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgIC8qITwgU01CVVMgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqIFNsYXZlVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7ICAgICAgICAgICAgLyohPCBTTUJVUyBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogU2xhdmVSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAvKiE8IFNNQlVTIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKiBMaXN0ZW5DcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7ICAgICAgICAgICAgIC8qITwgU01CVVMgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrICAgICAgICAgICAgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7ICAgICAgICAgICAgICAgICAgLyohPCBTTUJVUyBFcnJvciBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBBZGRyQ2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7ICAvKiE8IFNNQlVTIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2sgKi8KKworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgICAgICAgICAgICAgICAgLyohPCBTTUJVUyBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7ICAgICAgICAgICAgICAvKiE8IFNNQlVTIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBTTUJVU19IYW5kbGVUeXBlRGVmOworCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTTUJVUyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCAgICAgID0gMHgwMFUsICAgIC8qITwgU01CVVMgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1NNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCAgICAgID0gMHgwMVUsICAgIC8qITwgU01CVVMgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1NNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEICAgICAgID0gMHgwMlUsICAgIC8qITwgU01CVVMgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAgKi8KKyAgSEFMX1NNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgID0gMHgwM1UsICAgIC8qITwgU01CVVMgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElEICAgKi8KKyAgSEFMX1NNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwNFUsICAgIC8qITwgU01CVVMgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NNQlVTX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgwNVUsICAgIC8qITwgU01CVVMgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBTTUJVUyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDA3VSAgICAgLyohPCBTTUJVUyBNc3AgRGVJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAqLworCit9IEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU01CVVMgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFNNQlVTX0NhbGxiYWNrVHlwZURlZikoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsgLyohPCBwb2ludGVyIHRvIGFuIFNNQlVTIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmICB2b2lkICgqcFNNQlVTX0FkZHJDYWxsYmFja1R5cGVEZWYpKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSk7IC8qITwgcG9pbnRlciB0byBhbiBTTUJVUyBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfQ29uc3RhbnRzIFNNQlVTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfQW5hbG9nX0ZpbHRlciBTTUJVUyBBbmFsb2cgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUgICAgICAgICAgICAgIEkyQ19DUjFfQU5GT0ZGCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX2FkZHJlc3NpbmdfbW9kZSBTTUJVUyBhZGRyZXNzaW5nIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBTTUJVU19BRERSRVNTSU5HTU9ERV8xMEJJVCAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19kdWFsX2FkZHJlc3NpbmdfbW9kZSBTTUJVUyBkdWFsIGFkZHJlc3NpbmcgbW9kZQorICAqIEB7CisgICovCisKKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgIEkyQ19PQVIyX09BMkVOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX293bl9hZGRyZXNzMl9tYXNrcyBTTUJVUyBvd25hZGRyZXNzMiBtYXNrcworICAqIEB7CisgICovCisKKyNkZWZpbmUgU01CVVNfT0EyX05PTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAwVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAyVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swMyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDAzVSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA1VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA2VSkKKyNkZWZpbmUgU01CVVNfT0EyX01BU0swNyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBTTUJVU19nZW5lcmFsX2NhbGxfYWRkcmVzc2luZ19tb2RlIFNNQlVTIGdlbmVyYWwgY2FsbCBhZGRyZXNzaW5nIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19HRU5FUkFMQ0FMTF9FTkFCTEUgICAgICAgICAgICAgICAgSTJDX0NSMV9HQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX25vc3RyZXRjaF9tb2RlIFNNQlVTIG5vc3RyZXRjaCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfTk9TVFJFVENIX0VOQUJMRSAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTk9TVFJFVENICisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX3BhY2tldF9lcnJvcl9jaGVja19tb2RlIFNNQlVTIHBhY2tldCBlcnJvciBjaGVjayBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfUEVDX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU01CVVNfUEVDX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfUEVDRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfcGVyaXBoZXJhbF9tb2RlIFNNQlVTIHBlcmlwaGVyYWwgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19IT1NUICAgICAgICBJMkNfQ1IxX1NNQkhFTgorI2RlZmluZSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkUgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkVfQVJQICAgSTJDX0NSMV9TTUJERU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfUmVsb2FkRW5kTW9kZV9kZWZpbml0aW9uIFNNQlVTIFJlbG9hZEVuZE1vZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgIFNNQlVTX1NPRlRFTkRfTU9ERSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgIFNNQlVTX1JFTE9BRF9NT0RFICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjJfUkVMT0FECisjZGVmaW5lICBTTUJVU19BVVRPRU5EX01PREUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IyX0FVVE9FTkQKKyNkZWZpbmUgIFNNQlVTX1NFTkRQRUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjJfUEVDQllURQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19TdGFydFN0b3BNb2RlX2RlZmluaXRpb24gU01CVVMgU3RhcnRTdG9wTW9kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSAgU01CVVNfTk9fU1RBUlRTVE9QICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSAgU01CVVNfR0VORVJBVEVfU1RPUCAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RPUCkKKyNkZWZpbmUgIFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4pCisjZGVmaW5lICBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbiBTTUJVUyBYZmVyT3B0aW9ucyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKworLyogTGlzdCBvZiBYZmVyT3B0aW9ucyBpbiB1c2FnZSBvZiA6CisgKiAxLSBSZXN0YXJ0IGNvbmRpdGlvbiB3aGVuIGRpcmVjdGlvbiBjaGFuZ2UKKyAqIDItIE5vIFJlc3RhcnQgY29uZGl0aW9uIGluIG90aGVyIHVzZSBjYXNlcworICovCisjZGVmaW5lICBTTUJVU19GSVJTVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICBTTUJVU19TT0ZURU5EX01PREUKKyNkZWZpbmUgIFNNQlVTX05FWFRfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKFNNQlVTX1JFTE9BRF9NT0RFIHwgU01CVVNfU09GVEVORF9NT0RFKSkKKyNkZWZpbmUgIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAgICAgIFNNQlVTX0FVVE9FTkRfTU9ERQorI2RlZmluZSAgU01CVVNfTEFTVF9GUkFNRV9OT19QRUMgICAgICAgICAgICAgICAgU01CVVNfQVVUT0VORF9NT0RFCisjZGVmaW5lICBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAoKHVpbnQzMl90KShTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUpKQorI2RlZmluZSAgU01CVVNfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAgICAgICAgICAgKCh1aW50MzJfdCkoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfU0VORFBFQ19NT0RFKSkKKworLyogTGlzdCBvZiBYZmVyT3B0aW9ucyBpbiB1c2FnZSBvZiA6CisgKiAxLSBSZXN0YXJ0IGNvbmRpdGlvbiBpbiBhbGwgdXNlIGNhc2VzIChkaXJlY3Rpb24gY2hhbmdlIG9yIG5vdCkKKyAqLworI2RlZmluZSAgU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDICAgICAgICAgICAgICAgKDB4MDAwMDAwQUFVKQorI2RlZmluZSAgU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMgICAgICAgICAgICAgKDB4MDAwMEFBMDBVKQorI2RlZmluZSAgU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgKDB4MDBBQTAwMDBVKQorI2RlZmluZSAgU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgKDB4QUEwMDAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uIFNNQlVTIEludGVycnVwdCBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgU01CVVMgSW50ZXJydXB0IGRlZmluaXRpb24KKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDB4WFhYWFhYWFgKKyAgKiAgICAgICAgICAgLSBYWFhYWFhYWCAgOiBJbnRlcnJ1cHQgY29udHJvbCBtYXNrCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU01CVVNfSVRfRVJSSSAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfRVJSSUUKKyNkZWZpbmUgU01CVVNfSVRfVENJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfVENJRQorI2RlZmluZSBTTUJVU19JVF9TVE9QSSAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9TVE9QSUUKKyNkZWZpbmUgU01CVVNfSVRfTkFDS0kgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfTkFDS0lFCisjZGVmaW5lIFNNQlVTX0lUX0FERFJJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0FERFJJRQorI2RlZmluZSBTTUJVU19JVF9SWEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9SWElFCisjZGVmaW5lIFNNQlVTX0lUX1RYSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RYSUUKKyNkZWZpbmUgU01CVVNfSVRfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTUJVU19JVF9FUlJJIHwgU01CVVNfSVRfVENJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSSB8IFNNQlVTX0lUX1RYSSkKKyNkZWZpbmUgU01CVVNfSVRfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTUJVU19JVF9FUlJJIHwgU01CVVNfSVRfVENJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9SWEkpCisjZGVmaW5lIFNNQlVTX0lUX0FMRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAoU01CVVNfSVRfRVJSSSkKKyNkZWZpbmUgU01CVVNfSVRfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTUJVU19JVF9BRERSSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0ZsYWdfZGVmaW5pdGlvbiBTTUJVUyBGbGFnIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgRmxhZyBkZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFhZWVlZCisgICogICAgICAgICAgIC0gWFhYWFhYWFggIDogRmxhZyBtYXNrCisgICogQHsKKyAgKi8KKworI2RlZmluZSAgU01CVVNfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9UWEUKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVFhJUyAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhJUworI2RlZmluZSAgU01CVVNfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9SWE5FCisjZGVmaW5lICBTTUJVU19GTEFHX0FERFIgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FERFIKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQUYgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfTkFDS0YKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfU1RPUEYgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfU1RPUEYKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVEMKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfVENSICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVENSCisjZGVmaW5lICBTTUJVU19GTEFHX0JFUlIgICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0JFUlIKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQVJMTyAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQVJMTworI2RlZmluZSAgU01CVVNfRkxBR19PVlIgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9PVlIKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfUEVDRVJSICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfUEVDRVJSCisjZGVmaW5lICBTTUJVU19GTEFHX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RJTUVPVVQKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQUxFUlQgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUxFUlQKKyNkZWZpbmUgIFNNQlVTX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQlVTWQorI2RlZmluZSAgU01CVVNfRkxBR19ESVIgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9ESVIKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9NYWNyb3MgU01CVVMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgU01CVVMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNkZWZpbmUgX19IQUxfU01CVVNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9TTUJVU19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRVNFVCkKKyNlbmRpZgorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RDSSAgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfQUREUkkgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RDSSAgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfQUREUkkgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+KF9fSU5URVJSVVBUX18pKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9FUlJJICBFcnJvcnMgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RDSSAgIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19JVF9TVE9QSSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfTkFDS0kgTkFDSyByZWNlaXZlZCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfQUREUkkgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfSVRfUlhJICAgUlggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0lUX1RYSSAgIFRYIGludGVycnVwdCBlbmFibGUKKyAgKgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTTUJVUyBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVFhFICAgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19UWElTICAgIFRyYW5zbWl0IGludGVycnVwdCBzdGF0dXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1JYTkUgICAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUREUiAgICBBZGRyZXNzIG1hdGNoZWQgKHNsYXZlIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BRiAgICAgIE5BQ0sgcmVjZWl2ZWQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfU1RPUEYgICBTVE9QIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19UQyAgICAgIFRyYW5zZmVyIGNvbXBsZXRlIChtYXN0ZXIgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RDUiAgICAgVHJhbnNmZXIgY29tcGxldGUgcmVsb2FkCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19CRVJSICAgIEJ1cyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQVJMTyAgICBBcmJpdHJhdGlvbiBsb3N0CisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19PVlIgICAgIE92ZXJydW4vVW5kZXJydW4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1BFQ0VSUiAgUEVDIGVycm9yIGluIHJlY2VwdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfVElNRU9VVCBUaW1lb3V0IG9yIFRsb3cgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FMRVJUICAgU01CdXMgYWxlcnQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0JVU1kgICAgQnVzIGJ1c3kKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0RJUiAgICAgVHJhbnNmZXIgZGlyZWN0aW9uIChzbGF2ZSBtb2RlKQorICAqCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBTTUJVU19GTEFHX01BU0sgICgweDAwMDFGRkZGVSkKKyNkZWZpbmUgX19IQUxfU01CVVNfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IpICYgKChfX0ZMQUdfXykgJiBTTUJVU19GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIFNNQlVTX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTTUJVUyBwZW5kaW5nIGZsYWdzIHdoaWNoIGFyZSBjbGVhcmVkIGJ5IHdyaXRpbmcgMSBpbiBhIHNwZWNpZmljIGJpdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FERFIgICAgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQUYgICAgICBOQUNLIHJlY2VpdmVkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX0FSTE8gICAgQXJiaXRyYXRpb24gbG9zdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0ZMQUdfT1ZSICAgICBPdmVycnVuL1VuZGVycnVuCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTTUJVU19GTEFHX1RJTUVPVVQgVGltZW91dCBvciBUbG93IGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgU01CVVNfRkxBR19BTEVSVCAgIFNNQnVzIGFsZXJ0CisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TTUJVU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAoU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIEkyQ19DUjFfUEUpKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU01CVVMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NNQlVTX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgIChDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBJMkNfQ1IxX1BFKSkKKworLyoqIEBicmllZiAgR2VuZXJhdGUgYSBOb24tQWNrbm93bGVkZ2UgU01CVVMgcGVyaXBoZXJhbCBpbiBTbGF2ZSBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU01CVVNfR0VORVJBVEVfTkFDSyhfX0hBTkRMRV9fKSAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyLCBJMkNfQ1IyX05BQ0spKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQlVTX1ByaXZhdGVfTWFjcm8gU01CVVMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX1NNQlVTX0FOQUxPR19GSUxURVIoRklMVEVSKSAgICAgICAgICAgICAgICAgICgoKEZJTFRFUikgPT0gU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRklMVEVSKSA9PSBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfU01CVVNfRElHSVRBTF9GSUxURVIoRklMVEVSKSAgICAgICAgICAgICAgICAgKChGSUxURVIpIDw9IDB4MDAwMDAwMEZVKQorCisjZGVmaW5lIElTX1NNQlVTX0FERFJFU1NJTkdfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICgoKE1PREUpID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19BRERSRVNTSU5HTU9ERV8xMEJJVCkpCisKKyNkZWZpbmUgSVNfU01CVVNfRFVBTF9BRERSRVNTKEFERFJFU1MpICAgICAgICAgICAgICAgICAgKCgoQUREUkVTUykgPT0gU01CVVNfRFVBTEFERFJFU1NfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUkVTUykgPT0gU01CVVNfRFVBTEFERFJFU1NfRU5BQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19PV05fQUREUkVTUzJfTUFTSyhNQVNLKSAgICAgICAgICAgICAgICAoKChNQVNLKSA9PSBTTUJVU19PQTJfTk9NQVNLKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzAzKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDQpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gU01CVVNfT0EyX01BU0swNSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBTTUJVU19PQTJfTUFTSzA2KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IFNNQlVTX09BMl9NQVNLMDcpKQorCisjZGVmaW5lIElTX1NNQlVTX0dFTkVSQUxfQ0FMTChDQUxMKSAgICAgICAgICAgICAgICAgICAgICgoKENBTEwpID09IFNNQlVTX0dFTkVSQUxDQUxMX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0FMTCkgPT0gU01CVVNfR0VORVJBTENBTExfRU5BQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19OT19TVFJFVENIKFNUUkVUQ0gpICAgICAgICAgICAgICAgICAgICAoKChTVFJFVENIKSA9PSBTTUJVU19OT1NUUkVUQ0hfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTVFJFVENIKSA9PSBTTUJVU19OT1NUUkVUQ0hfRU5BQkxFKSkKKworI2RlZmluZSBJU19TTUJVU19QRUMoUEVDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQRUMpID09IFNNQlVTX1BFQ19ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQRUMpID09IFNNQlVTX1BFQ19FTkFCTEUpKQorCisjZGVmaW5lIElTX1NNQlVTX1BFUklQSEVSQUxfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICgoKE1PREUpID09IFNNQlVTX1BFUklQSEVSQUxfTU9ERV9TTUJVU19IT1NUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkVfQVJQKSkKKworI2RlZmluZSBJU19TTUJVU19UUkFOU0ZFUl9NT0RFKE1PREUpICAgICAgICAgICAgICAgICAgICAoKChNT0RFKSA9PSBTTUJVU19SRUxPQURfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTTUJVU19BVVRPRU5EX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNNQlVTX1NPRlRFTkRfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU01CVVNfU0VORFBFQ19NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoU01CVVNfUkVMT0FEX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUpKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChTTUJVU19BVVRPRU5EX01PREUgfCBTTUJVU19TRU5EUEVDX01PREUpKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKFNNQlVTX0FVVE9FTkRfTU9ERSB8IFNNQlVTX1JFTE9BRF9NT0RFKSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoU01CVVNfQVVUT0VORF9NT0RFIHwgU01CVVNfU0VORFBFQ19NT0RFIHwgU01CVVNfUkVMT0FEX01PREUgKSkpCisKKworI2RlZmluZSBJU19TTUJVU19UUkFOU0ZFUl9SRVFVRVNUKFJFUVVFU1QpICAgICAgICAgICAgICAoKChSRVFVRVNUKSA9PSBTTUJVU19HRU5FUkFURV9TVE9QKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfTk9fU1RBUlRTVE9QKSkKKworCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAgICAgIChJU19TTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfRklSU1RfRlJBTUUpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19ORVhUX0ZSQU1FKSAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfTEFTVF9GUkFNRV9OT19QRUMpICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQykgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX0xBU1RfRlJBTUVfV0lUSF9QRUMpKQorCisjZGVmaW5lIElTX1NNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVChSRVFVRVNUKSAoKChSRVFVRVNUKSA9PSBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMpICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQykgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMpICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQykpCisKKyNkZWZpbmUgU01CVVNfUkVTRVRfQ1IxKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdCkoSTJDX0NSMV9TTUJIRU4gfCBJMkNfQ1IxX1NNQkRFTiB8IEkyQ19DUjFfUEVDRU4pKSkKKyNkZWZpbmUgU01CVVNfUkVTRVRfQ1IyKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdCkoSTJDX0NSMl9TQUREIHwgSTJDX0NSMl9IRUFEMTBSIHwgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX1JFTE9BRCB8IEkyQ19DUjJfUkRfV1JOKSkpCisKKyNkZWZpbmUgU01CVVNfR0VORVJBVEVfU1RBUlQoX19BRERNT0RFX18sX19BRERSRVNTX18pICAgICAoKChfX0FERE1PREVfXykgPT0gU01CVVNfQUREUkVTU0lOR01PREVfN0JJVCkgPyAodWludDMyX3QpKCgoKHVpbnQzMl90KShfX0FERFJFU1NfXykgJiAoSTJDX0NSMl9TQUREKSkgfCAoSTJDX0NSMl9TVEFSVCkgfCAoSTJDX0NSMl9BVVRPRU5EKSkgJiAofkkyQ19DUjJfUkRfV1JOKSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKCgoKHVpbnQzMl90KShfX0FERFJFU1NfXykgJiAoSTJDX0NSMl9TQUREKSkgfCAoSTJDX0NSMl9BREQxMCkgfCAoSTJDX0NSMl9TVEFSVCkpICYgKH5JMkNfQ1IyX1JEX1dSTikpKQorCisjZGVmaW5lIFNNQlVTX0dFVF9BRERSX01BVENIKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBJMkNfSVNSX0FERENPREUpID4+IDE3VSkKKyNkZWZpbmUgU01CVVNfR0VUX0RJUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIEkyQ19JU1JfRElSKSA+PiAxNlUpCisjZGVmaW5lIFNNQlVTX0dFVF9TVE9QX01PREUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIEkyQ19DUjJfQVVUT0VORCkKKyNkZWZpbmUgU01CVVNfR0VUX1BFQ19NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9QRUNCWVRFKQorI2RlZmluZSBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9BTEVSVEVOKQorCisjZGVmaW5lIFNNQlVTX0NIRUNLX0ZMQUcoX19JU1JfXywgX19GTEFHX18pICAgICAgICAgICAgICgoKChfX0lTUl9fKSAmICgoX19GTEFHX18pICYgU01CVVNfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBTTUJVU19GTEFHX01BU0spKSA/IFNFVCA6IFJFU0VUKQorI2RlZmluZSBTTUJVU19DSEVDS19JVF9TT1VSQ0UoX19DUjFfXywgX19JVF9fKSAgICAgICAgICAoKCgoX19DUjFfXykgJiAoX19JVF9fKSkgPT0gKF9fSVRfXykpID8gU0VUIDogUkVTRVQpCisKKyNkZWZpbmUgSVNfU01CVVNfT1dOX0FERFJFU1MxKEFERFJFU1MxKSAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MxKSA8PSAweDAwMDAwM0ZGVSkKKyNkZWZpbmUgSVNfU01CVVNfT1dOX0FERFJFU1MyKEFERFJFU1MyKSAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MyKSA8PSAodWludDE2X3QpMHgwMEZGVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnMgU01CVVMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0luaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19EZUluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01zcEluaXQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX01zcERlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnRGlnaXRhbEZpbHRlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpOworCisvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCBIQUxfU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQlVTX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgcFNNQlVTX0FkZHJDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBCbG9ja2luZ19tb2RlX1BvbGxpbmcgQmxvY2tpbmcgbW9kZSBQb2xsaW5nCisgKiBAeworICovCisvKioqKioqKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfSXNEZXZpY2VSZWFkeShTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQzMl90IFRyaWFscywgdWludDMyX3QgVGltZW91dCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgTm9uLUJsb2NraW5nX21vZGVfSW50ZXJydXB0IE5vbi1CbG9ja2luZyBtb2RlIEludGVycnVwdAorICogQHsKKyAqLworLyoqKioqKiogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX1JlY2VpdmVfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX01hc3Rlcl9BYm9ydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQxNl90IERldkFkZHJlc3MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19TbGF2ZV9SZWNlaXZlX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0VuYWJsZUFsZXJ0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRGlzYWJsZUFsZXJ0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRGlzYWJsZUxpc3Rlbl9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX0lSUV9IYW5kbGVyX2FuZF9DYWxsYmFja3MgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogQHsKKyAqLworLyoqKioqKiogU01CVVMgSVJRSGFuZGxlciBhbmQgQ2FsbGJhY2tzIHVzZWQgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQpICovCit2b2lkIEhBTF9TTUJVU19FVl9JUlFIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19FUl9JUlFIYW5kbGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpOwordm9pZCBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKK3ZvaWQgSEFMX1NNQlVTX0FkZHJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpOwordm9pZCBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit2b2lkIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAeworICovCisKKy8qIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgSEFMX1NNQlVTX0dldFN0YXRlKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cyk7Cit1aW50MzJfdCBIQUxfU01CVVNfR2V0RXJyb3IoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01CVVNfUHJpdmF0ZV9GdW5jdGlvbnMgU01CVVMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gc3RtMzJ3Ynh4X2hhbF9zbWJ1cy5jIGZpbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfU01CVVNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfc3BpLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE0NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc3BpLmgKQEAgLTAsMCArMSw4NDYgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3NwaS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTUEkgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1NQSV9ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfU1BJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUEkKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfVHlwZXMgU1BJIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTUEkgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBvcGVyYXRpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9Nb2RlICovCisKKyAgdWludDMyX3QgRGlyZWN0aW9uOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBiaWRpcmVjdGlvbmFsIG1vZGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uICovCisKKyAgdWludDMyX3QgRGF0YVNpemU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBkYXRhIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGF0YV9TaXplICovCisKKyAgdWludDMyX3QgQ0xLUG9sYXJpdHk7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ2xvY2tfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBDTEtQaGFzZTsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgYWN0aXZlIGVkZ2UgZm9yIHRoZSBiaXQgY2FwdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19QaGFzZSAqLworCisgIHVpbnQzMl90IE5TUzsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TUyBzaWduYWwgaXMgbWFuYWdlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9TbGF2ZV9TZWxlY3RfbWFuYWdlbWVudCAqLworCisgIHVpbnQzMl90IEJhdWRSYXRlUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkIFJhdGUgcHJlc2NhbGVyIHZhbHVlIHdoaWNoIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0JhdWRSYXRlX1ByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoZSBjb21tdW5pY2F0aW9uIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4gKi8KKworICB1aW50MzJfdCBGaXJzdEJpdDsgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIGRhdGEgdHJhbnNmZXJzIHN0YXJ0IGZyb20gTVNCIG9yIExTQiBiaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTVNCX0xTQl90cmFuc21pc3Npb24gKi8KKworICB1aW50MzJfdCBUSU1vZGU7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgVEkgbW9kZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9USV9tb2RlICovCisKKyAgdWludDMyX3QgQ1JDQ2FsY3VsYXRpb247ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIENSQyBjYWxjdWxhdGlvbiBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DUkNfQ2FsY3VsYXRpb24gKi8KKworICB1aW50MzJfdCBDUkNQb2x5bm9taWFsOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcG9seW5vbWlhbCB1c2VkIGZvciB0aGUgQ1JDIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2RkIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSA2NTUzNSAqLworCisgIHVpbnQzMl90IENSQ0xlbmd0aDsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBDUkMgTGVuZ3RoIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JDIExlbmd0aCBpcyBvbmx5IHVzZWQgd2l0aCBEYXRhOCBhbmQgRGF0YTE2LCBub3Qgb3RoZXIgZGF0YSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX2xlbmd0aCAqLworCisgIHVpbnQzMl90IE5TU1BNb2RlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5TU1Agc2lnbmFsIGlzIGVuYWJsZWQgb3Igbm90IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9OU1NQX01vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IHRoZSBOU1NQIGJpdCBpbiB0aGUgU1BJeF9DUjIgcmVnaXN0ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdGFrZXMgZWZmZWN0IG9ubHkgaWYgdGhlIFNQSSBpbnRlcmZhY2UgaXMgY29uZmlndXJlZCBhcyBNb3Rvcm9sYSBTUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgKEZSRj0wKSB3aXRoIGNhcHR1cmUgb24gdGhlIGZpcnN0IGVkZ2UgKFNQSXhfQ1IxIENQSEEgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQT0wgc2V0dGluZyBpcyBpZ25vcmVkKS4uICovCit9IFNQSV9Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBIQUwgU1BJIFN0YXRlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgSEFMX1NQSV9TVEFURV9SRVNFVCAgICAgID0gMHgwMFUsICAgIC8qITwgUGVyaXBoZXJhbCBub3QgSW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9SRUFEWSAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZICAgICAgID0gMHgwMlUsICAgIC8qITwgYW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYICAgID0gMHgwM1UsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1JYICAgID0gMHgwNFUsICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYID0gMHgwNVUsICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgSEFMX1NQSV9TVEFURV9FUlJPUiAgICAgID0gMHgwNlUsICAgIC8qITwgU1BJIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9TVEFURV9BQk9SVCAgICAgID0gMHgwN1UgICAgIC8qITwgU1BJIGFib3J0IGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gSEFMX1NQSV9TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU1BJIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZgoreworICBTUElfVHlwZURlZiAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgLyohPCBTUEkgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICovCisKKyAgU1BJX0luaXRUeXBlRGVmICAgICAgICAgICAgSW5pdDsgICAgICAgICAgIC8qITwgU1BJIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgLyohPCBTUEkgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgVHhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAgICAgKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICBSeFhmZXJTaXplOyAgICAgLyohPCBTUEkgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgUnhYZmVyQ291bnQ7ICAgIC8qITwgU1BJIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIENSQ1NpemU7ICAgICAgICAvKiE8IFNQSSBDUkMgc2l6ZSB1c2VkIGZvciB0aGUgdHJhbnNmZXIgICAgICAgKi8KKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAvKiE8IGZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVNSICAgICAgICovCisKKyAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgLyohPCBmdW5jdGlvbiBwb2ludGVyIG9uIFR4IElTUiAgICAgICAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICpoZG1hdHg7ICAgICAgICAvKiE8IFNQSSBUeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgLyohPCBTUEkgUnggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgTG9jazsgICAgICAgICAgIC8qITwgTG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIF9fSU8gSEFMX1NQSV9TdGF0ZVR5cGVEZWYgIFN0YXRlOyAgICAgICAgICAvKiE8IFNQSSBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgLyohPCBTUEkgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICB2b2lkICgqIFR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgICAgIC8qITwgU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjayAgICAgICAgICAqLworICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgICAgIC8qITwgU1BJIFJ4IENvbXBsZXRlZCBjYWxsYmFjayAgICAgICAgICAqLworICB2b2lkICgqIFR4UnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgIC8qITwgU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrICAgICAgICAqLworICB2b2lkICgqIFR4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgIC8qITwgU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrICAgICAqLworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgIC8qITwgU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrICAgICAqLworICB2b2lkICgqIFR4UnhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgIC8qITwgU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgICAgICAgICAgICAgIC8qITwgU1BJIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgIC8qITwgU1BJIEFib3J0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOyAgICAgICAgICAgIC8qITwgU1BJIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7ICAgICAgICAgIC8qITwgU1BJIE1zcCBEZUluaXQgY2FsbGJhY2sgICAgICAgICAgICAqLworCisjZW5kaWYgIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBTUElfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTUEkgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBTUEkgVHggQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDFVLCAgICAvKiE8IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgICAgICAqLworICBIQUxfU1BJX1RYX1JYX0NPTVBMRVRFX0NCX0lEICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrIElEICAgICAgICovCisgIEhBTF9TUElfVFhfSEFMRl9DT01QTEVURV9DQl9JRCAgICAgICAgPSAweDAzVSwgICAgLyohPCBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICAgKi8KKyAgSEFMX1NQSV9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFNQSSBSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfU1BJX1RYX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgICAgID0gMHgwNVUsICAgIC8qITwgU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9TUElfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBTUEkgRXJyb3IgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NQSV9BQk9SVF9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDdVLCAgICAvKiE8IFNQSSBBYm9ydCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAqLworICBIQUxfU1BJX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgU1BJIE1zcCBJbml0IGNhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9TUElfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgPSAweDA5VSAgICAgLyohPCBTUEkgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgKi8KKworfSBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBTUEkgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCisgICovCit0eXBlZGVmICB2b2lkICgqcFNQSV9DYWxsYmFja1R5cGVEZWYpKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsgLyohPCBwb2ludGVyIHRvIGFuIFNQSSBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfQ29uc3RhbnRzIFNQSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FcnJvcl9Db2RlIFNQSSBFcnJvciBDb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9OT05FICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX01PREYgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkgICAvKiE8IE1PREYgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfQ1JDICAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgIC8qITwgQ1JDIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9PVlIgICAgICAgICAgICAgICAoMHgwMDAwMDAwNFUpICAgLyohPCBPVlIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX0ZSRSAgICAgICAgICAgICAgICgweDAwMDAwMDA4VSkgICAvKiE8IEZSRSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TUElfRVJST1JfRE1BICAgICAgICAgICAgICAgKDB4MDAwMDAwMTBVKSAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9GTEFHICAgICAgICAgICAgICAoMHgwMDAwMDAyMFUpICAgLyohPCBFcnJvciBvbiBSWE5FL1RYRS9CU1kvRlRMVkwvRlJMVkwgRmxhZyAqLworI2RlZmluZSBIQUxfU1BJX0VSUk9SX0FCT1JUICAgICAgICAgICAgICgweDAwMDAwMDQwVSkgICAvKiE8IEVycm9yIGR1cmluZyBTUEkgQWJvcnQgcHJvY2VkdXJlICAgICAgICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyNkZWZpbmUgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLICAoMHgwMDAwMDA4MFUpICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAgICAgICAgICAgICAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTW9kZSBTUEkgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9NT0RFX1NMQVZFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfTU9ERV9NQVNURVIgICAgICAgICAgICAgICAgIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0RpcmVjdGlvbiBTUEkgRGlyZWN0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfRElSRUNUSU9OXzJMSU5FUyAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZICAgICBTUElfQ1IxX1JYT05MWQorI2RlZmluZSBTUElfRElSRUNUSU9OXzFMSU5FICAgICAgICAgICAgIFNQSV9DUjFfQklESU1PREUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0RhdGFfU2l6ZSBTUEkgRGF0YSBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzRCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDMwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV81QklUICAgICAgICAgICAgICAgKDB4MDAwMDA0MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfNkJJVCAgICAgICAgICAgICAgICgweDAwMDAwNTAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzdCSVQgICAgICAgICAgICAgICAoMHgwMDAwMDYwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV84QklUICAgICAgICAgICAgICAgKDB4MDAwMDA3MDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfOUJJVCAgICAgICAgICAgICAgICgweDAwMDAwODAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzEwQklUICAgICAgICAgICAgICAoMHgwMDAwMDkwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xMUJJVCAgICAgICAgICAgICAgKDB4MDAwMDBBMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTJCSVQgICAgICAgICAgICAgICgweDAwMDAwQjAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzEzQklUICAgICAgICAgICAgICAoMHgwMDAwMEMwMFUpCisjZGVmaW5lIFNQSV9EQVRBU0laRV8xNEJJVCAgICAgICAgICAgICAgKDB4MDAwMDBEMDBVKQorI2RlZmluZSBTUElfREFUQVNJWkVfMTVCSVQgICAgICAgICAgICAgICgweDAwMDAwRTAwVSkKKyNkZWZpbmUgU1BJX0RBVEFTSVpFXzE2QklUICAgICAgICAgICAgICAoMHgwMDAwMEYwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DbG9ja19Qb2xhcml0eSBTUEkgQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICBTUElfQ1IxX0NQT0wKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0Nsb2NrX1BoYXNlIFNQSSBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgIFNQSV9DUjFfQ1BIQQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfU2xhdmVfU2VsZWN0X21hbmFnZW1lbnQgU1BJIFNsYXZlIFNlbGVjdCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX05TU19TT0ZUICAgICAgICAgICAgICAgICAgICBTUElfQ1IxX1NTTQorI2RlZmluZSBTUElfTlNTX0hBUkRfSU5QVVQgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX05TU19IQVJEX09VVFBVVCAgICAgICAgICAgICAoU1BJX0NSMl9TU09FIDw8IDE2VSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX05TU1BfTW9kZSBTUEkgTlNTIFB1bHNlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfTlNTX1BVTFNFX0VOQUJMRSAgICAgICAgICAgIFNQSV9DUjJfTlNTUAorI2RlZmluZSBTUElfTlNTX1BVTFNFX0RJU0FCTEUgICAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0JhdWRSYXRlX1ByZXNjYWxlciBTUEkgQmF1ZFJhdGUgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzIgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl80ICAgICAgICAgKFNQSV9DUjFfQlJfMCkKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzggICAgICAgICAoU1BJX0NSMV9CUl8xKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTYgICAgICAgIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8zMiAgICAgICAgKFNQSV9DUjFfQlJfMikKKyNkZWZpbmUgU1BJX0JBVURSQVRFUFJFU0NBTEVSXzY0ICAgICAgICAoU1BJX0NSMV9CUl8yIHwgU1BJX0NSMV9CUl8wKQorI2RlZmluZSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfMTI4ICAgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEpCisjZGVmaW5lIFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yNTYgICAgICAgKFNQSV9DUjFfQlJfMiB8IFNQSV9DUjFfQlJfMSB8IFNQSV9DUjFfQlJfMCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX01TQl9MU0JfdHJhbnNtaXNzaW9uIFNQSSBNU0IgTFNCIFRyYW5zbWlzc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GSVJTVEJJVF9NU0IgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBTUElfRklSU1RCSVRfTFNCICAgICAgICAgICAgICAgIFNQSV9DUjFfTFNCRklSU1QKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX1RJX21vZGUgU1BJIFRJIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBTUElfVElNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX1RJTU9ERV9FTkFCTEUgICAgICAgICAgICAgICBTUElfQ1IyX0ZSRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfQ1JDX0NhbGN1bGF0aW9uIFNQSSBDUkMgQ2FsY3VsYXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBTUElfQ1JDQ0FMQ1VMQVRJT05fRElTQUJMRSAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSAgICAgICBTUElfQ1IxX0NSQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9DUkNfbGVuZ3RoIFNQSSBDUkMgTGVuZ3RoCisgICogQHsKKyAgKiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBTUElfQ1JDX0xFTkdUSF9EQVRBU0laRTogYWxpZ25lZCB3aXRoIHRoZSBkYXRhIHNpemUKKyAgKiAgICAgU1BJX0NSQ19MRU5HVEhfOEJJVCAgICA6IENSQyA4Yml0CisgICogICAgIFNQSV9DUkNfTEVOR1RIXzE2QklUICAgOiBDUkMgMTZiaXQKKyAgKi8KKyNkZWZpbmUgU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9DUkNfTEVOR1RIXzhCSVQgICAgICAgICAgICAgKDB4MDAwMDAwMDFVKQorI2RlZmluZSBTUElfQ1JDX0xFTkdUSF8xNkJJVCAgICAgICAgICAgICgweDAwMDAwMDAyVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0ZJRk9fcmVjZXB0aW9uX3RocmVzaG9sZCBTUEkgRklGTyBSZWNlcHRpb24gVGhyZXNob2xkCisgICogQHsKKyAgKiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBTUElfUlhGSUZPX1RIUkVTSE9MRCBvciBTUElfUlhGSUZPX1RIUkVTSE9MRF9RRiA6CisgICogICAgICAgICAgUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgdGhlIEZJRk8KKyAgKiAgICAgICAgICBsZXZlbCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDEvNCg4LWJpdHMpLgorICAqICAgICBTUElfUlhGSUZPX1RIUkVTSE9MRF9IRjogUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgdGhlIEZJRk8KKyAgKiAgICAgICAgICBsZXZlbCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDEvMigxNiBiaXRzKS4gKi8KKyNkZWZpbmUgU1BJX1JYRklGT19USFJFU0hPTEQgICAgICAgICAgICBTUElfQ1IyX0ZSWFRICisjZGVmaW5lIFNQSV9SWEZJRk9fVEhSRVNIT0xEX1FGICAgICAgICAgU1BJX0NSMl9GUlhUSAorI2RlZmluZSBTUElfUlhGSUZPX1RIUkVTSE9MRF9IRiAgICAgICAgICgweDAwMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0ludGVycnVwdF9kZWZpbml0aW9uIFNQSSBJbnRlcnJ1cHQgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9JVF9UWEUgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRQorI2RlZmluZSBTUElfSVRfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfUlhORUlFCisjZGVmaW5lIFNQSV9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9FUlJJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRmxhZ3NfZGVmaW5pdGlvbiBTUEkgRmxhZ3MgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgU1BJX1NSX1JYTkUgICAvKiBTUEkgc3RhdHVzIGZsYWc6IFJ4IGJ1ZmZlciBub3QgZW1wdHkgZmxhZyAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUgICAgLyogU1BJIHN0YXR1cyBmbGFnOiBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfQlNZICAgICAgICAgICAgICAgICAgICBTUElfU1JfQlNZICAgIC8qIFNQSSBzdGF0dXMgZmxhZzogQnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX0NSQ0VSUiAgICAgICAgICAgICAgICAgU1BJX1NSX0NSQ0VSUiAvKiBTUEkgRXJyb3IgZmxhZzogQ1JDIGVycm9yIGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUElfRkxBR19NT0RGICAgICAgICAgICAgICAgICAgIFNQSV9TUl9NT0RGICAgLyogU1BJIEVycm9yIGZsYWc6IE1vZGUgZmF1bHQgZmxhZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBTUElfU1JfT1ZSICAgIC8qIFNQSSBFcnJvciBmbGFnOiBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX0ZSRSAgICAgICAgICAgICAgICAgICAgU1BJX1NSX0ZSRSAgICAvKiBTUEkgRXJyb3IgZmxhZzogVEkgbW9kZSBmcmFtZSBmb3JtYXQgZXJyb3IgZmxhZyAqLworI2RlZmluZSBTUElfRkxBR19GVExWTCAgICAgICAgICAgICAgICAgIFNQSV9TUl9GVExWTCAgLyogU1BJIGZpZm8gdHJhbnNtaXNzaW9uIGxldmVsICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1BJX0ZMQUdfRlJMVkwgICAgICAgICAgICAgICAgICBTUElfU1JfRlJMVkwgIC8qIFNQSSBmaWZvIHJlY2VwdGlvbiBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQSV9GTEFHX01BU0sgICAgICAgICAgICAgICAgICAgKFNQSV9TUl9SWE5FIHwgU1BJX1NSX1RYRSB8IFNQSV9TUl9CU1kgfCBTUElfU1JfQ1JDRVJSIHwgU1BJX1NSX01PREYgfCBTUElfU1JfT1ZSIHwgU1BJX1NSX0ZSRSB8IFNQSV9TUl9GVExWTCB8IFNQSV9TUl9GUkxWTCkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX3RyYW5zbWlzc2lvbl9maWZvX3N0YXR1c19sZXZlbCBTUEkgVHJhbnNtaXNzaW9uIEZJRk8gU3RhdHVzIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZUTFZMX0VNUFRZICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9GVExWTF9RVUFSVEVSX0ZVTEwgICAgICAgICAgKDB4MDAwMDA4MDBVKQorI2RlZmluZSBTUElfRlRMVkxfSEFMRl9GVUxMICAgICAgICAgICAgICgweDAwMDAxMDAwVSkKKyNkZWZpbmUgU1BJX0ZUTFZMX0ZVTEwgICAgICAgICAgICAgICAgICAoMHgwMDAwMTgwMFUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX3JlY2VwdGlvbl9maWZvX3N0YXR1c19sZXZlbCBTUEkgUmVjZXB0aW9uIEZJRk8gU3RhdHVzIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU1BJX0ZSTFZMX0VNUFRZICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNQSV9GUkxWTF9RVUFSVEVSX0ZVTEwgICAgICAgICAgKDB4MDAwMDAyMDBVKQorI2RlZmluZSBTUElfRlJMVkxfSEFMRl9GVUxMICAgICAgICAgICAgICgweDAwMDAwNDAwVSkKKyNkZWZpbmUgU1BJX0ZSTFZMX0ZVTEwgICAgICAgICAgICAgICAgICAoMHgwMDAwMDYwMFUpCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfTWFjcm9zIFNQSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBSZXNldCBTUEkgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorI2RlZmluZSBfX0hBTF9TUElfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRVNFVDsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfU1BJX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1RYRTogVHggYnVmZmVyIGVtcHR5IGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0lUX1JYTkU6IFJYIGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgKF9fSU5URVJSVVBUX18pKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdHMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIGhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEl4IHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIsIChfX0lOVEVSUlVQVF9fKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNQSSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQ1JDRVJSOiBDUkMgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19NT0RGOiBNb2RlIGZhdWx0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfT1ZSOiBPdmVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQlNZOiBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJFOiBGcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GVExWTDogU1BJIGZpZm8gdHJhbnNtaXNzaW9uIGxldmVsCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSTFZMOiBTUEkgZmlmbyByZWNlcHRpb24gbGV2ZWwKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9TUElfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKSAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgQ1JDRVJSIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTUEkgSGFuZGxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFNQSSB3aGVyZSB4OiAxLCAyLCBvciAzIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9ICh1aW50MTZfdCkoflNQSV9GTEFHX0NSQ0VSUikpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBTUEkgTU9ERiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfTU9ERkZMQUcoX19IQU5ETEVfXykgICAgICAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnX21vZGYgPSAweDAwVTsgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcHJlZ19tb2RmID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7ICAgICAgICAgICAgXAorICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1BFKTsgXAorICAgIFVOVVNFRCh0bXByZWdfbW9kZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIE9WUiBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fSU8gdWludDMyX3QgdG1wcmVnX292ciA9IDB4MDBVOyAgICAgICAgICAgICAgXAorICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5EUjsgICAgICAgXAorICAgIHRtcHJlZ19vdnIgPSAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUjsgICAgICAgXAorICAgIFVOVVNFRCh0bXByZWdfb3ZyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgU1BJIEZSRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhfX0hBTkRMRV9fKSAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX0lPIHVpbnQzMl90IHRtcHJlZ19mcmUgPSAweDAwVTsgICAgICAgICAgICAgICAgXAorICB0bXByZWdfZnJlID0gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1I7ICAgICAgICAgXAorICBVTlVTRUQodG1wcmVnX2ZyZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9d2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9TUElfRU5BQkxFKF9fSEFORExFX18pICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNQSSBIYW5kbGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgU1BJIHdoZXJlIHg6IDEsIDIsIG9yIDMgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfU1BJX0RJU0FCTEUoX19IQU5ETEVfXykgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9TUEUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9Qcml2YXRlX01hY3JvcyBTUEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmICBTZXQgdGhlIFNQSSB0cmFuc21pdC1vbmx5IG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBTUElfMUxJTkVfVFgoX19IQU5ETEVfXykgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0JJRElPRSkKKworLyoqIEBicmllZiAgU2V0IHRoZSBTUEkgcmVjZWl2ZS1vbmx5IG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBTUElfMUxJTkVfUlgoX19IQU5ETEVfXykgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQklESU9FKQorCisvKiogQGJyaWVmICBSZXNldCB0aGUgQ1JDIGNhbGN1bGF0aW9uIG9mIHRoZSBTUEkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU1BJIEhhbmRsZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBTUEkgd2hlcmUgeDogMSwgMiwgb3IgMyB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBTUElfUkVTRVRfQ1JDKF9fSEFORExFX18pIGRve0NMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDRU4pO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTt9d2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19TUl9fICBjb3B5IG9mIFNQSSBTUiByZWdzaXRlci4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX1JYTkU6IFJlY2VpdmUgYnVmZmVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX1RYRTogVHJhbnNtaXQgYnVmZmVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQ1JDRVJSOiBDUkMgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19NT0RGOiBNb2RlIGZhdWx0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfT1ZSOiBPdmVycnVuIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfQlNZOiBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgU1BJX0ZMQUdfRlJFOiBGcmFtZSBmb3JtYXQgZXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBTUElfRkxBR19GVExWTDogU1BJIGZpZm8gdHJhbnNtaXNzaW9uIGxldmVsCisgICogICAgICAgICAgICBAYXJnIFNQSV9GTEFHX0ZSTFZMOiBTUEkgZmlmbyByZWNlcHRpb24gbGV2ZWwKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgU1BJX0NIRUNLX0ZMQUcoX19TUl9fLCBfX0ZMQUdfXykgICAgICAgICAoKCgoX19TUl9fKSAmICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgU1BJX0ZMQUdfTUFTSykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgSW50ZXJydXB0IGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0NSMl9fICBjb3B5IG9mIFNQSSBDUjIgcmVnc2l0ZXIuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBTUElfSVRfUlhORTogUlggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIFNQSV9JVF9FUlI6IEVycm9yIGludGVycnVwdCBlbmFibGUKKyAgKiBAcmV0dmFsIFNFVCBvciBSRVNFVC4KKyAgKi8KKyNkZWZpbmUgU1BJX0NIRUNLX0lUX1NPVVJDRShfX0NSMl9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoKChfX0NSMl9fKSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIE1vZGUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBNb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IFNQSV9NT0RFX1NMQVZFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX01PREVfTUFTVEVSKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBEaXJlY3Rpb24gTW9kZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTU9ERV9fIHNwZWNpZmllcyB0aGUgU1BJIERpcmVjdGlvbiBNb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfRGlyZWN0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9ESVJFQ1RJT04oX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gU1BJX0RJUkVDVElPTl8xTElORSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgRGlyZWN0aW9uIE1vZGUgcGFyYW1ldGVyIGlzIDIgbGluZXMuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEaXJlY3Rpb24gTW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVMoX19NT0RFX18pICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERpcmVjdGlvbiBNb2RlIHBhcmFtZXRlciBpcyAxIG9yIDIgbGluZXMuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEaXJlY3Rpb24gTW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoX19NT0RFX18pICgoKF9fTU9ERV9fKSA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIERhdGEgU2l6ZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fREFUQVNJWkVfXyBzcGVjaWZpZXMgdGhlIFNQSSBEYXRhIFNpemUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9EYXRhX1NpemUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0RBVEFTSVpFKF9fREFUQVNJWkVfXykgKCgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTZCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTVCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTRCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTNCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTJCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTFCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfMTBCSVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfOUJJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfOEJJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfN0JJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNkJJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNUJJVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBU0laRV9fKSA9PSBTUElfREFUQVNJWkVfNEJJVCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgU2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZSBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fQ1BPTF9fIHNwZWNpZmllcyB0aGUgU1BJIHNlcmlhbCBjbG9jayBzdGVhZHkgc3RhdGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9DbG9ja19Qb2xhcml0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfQ1BPTChfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFNQSV9QT0xBUklUWV9MT1cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ1BPTF9fKSA9PSBTUElfUE9MQVJJVFlfSElHSCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQ2xvY2sgUGhhc2UgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX0NQSEFfXyBzcGVjaWZpZXMgdGhlIFNQSSBDbG9jayBQaGFzZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0Nsb2NrX1BoYXNlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9DUEhBKF9fQ1BIQV9fKSAoKChfX0NQSEFfXykgPT0gU1BJX1BIQVNFXzFFREdFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NQSEFfXykgPT0gU1BJX1BIQVNFXzJFREdFKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBTbGF2ZSBTZWxlY3QgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX05TU19fIHNwZWNpZmllcyB0aGUgU1BJIFNsYXZlIFNlbGVjdCBtYW5hZ2VtZW50IHBhcmFtZXRlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9OU1MoX19OU1NfXykgKCgoX19OU1NfXykgPT0gU1BJX05TU19TT0ZUKSAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NfXykgPT0gU1BJX05TU19IQVJEX0lOUFVUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19OU1NfXykgPT0gU1BJX05TU19IQVJEX09VVFBVVCkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgTlNTIFB1bHNlIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19OU1NQX18gc3BlY2lmaWVzIHRoZSBTUEkgTlNTIFB1bHNlIE1vZGUgcGFyYW1ldGVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTlNTUF9Nb2RlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9OU1NQKF9fTlNTUF9fKSAoKChfX05TU1BfXykgPT0gU1BJX05TU19QVUxTRV9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTlNTUF9fKSA9PSBTUElfTlNTX1BVTFNFX0RJU0FCTEUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIEJhdWRyYXRlIHByZXNjYWxlciBwYXJhbWV0ZXIgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fUFJFU0NBTEVSX18gc3BlY2lmaWVzIHRoZSBTUEkgQmF1ZHJhdGUgcHJlc2NhbGVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQmF1ZFJhdGVfUHJlc2NhbGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl80KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzE2KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8zMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBTUElfQkFVRFJBVEVQUkVTQ0FMRVJfNjQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gU1BJX0JBVURSQVRFUFJFU0NBTEVSXzEyOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFNQSV9CQVVEUkFURVBSRVNDQUxFUl8yNTYpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIE1TQiBMU0IgdHJhbnNtaXNzaW9uIHBhcmFtZXRlciBpcyBpbiBhbGxvd2VkIHJhbmdlLgorICAqIEBwYXJhbSAgX19CSVRfXyBzcGVjaWZpZXMgdGhlIFNQSSBNU0IgTFNCIHRyYW5zbWlzc2lvbiAod2hldGhlciBkYXRhIHRyYW5zZmVyIHN0YXJ0cyBmcm9tIE1TQiBvciBMU0IgYml0KS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX01TQl9MU0JfdHJhbnNtaXNzaW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9GSVJTVF9CSVQoX19CSVRfXykgKCgoX19CSVRfXykgPT0gU1BJX0ZJUlNUQklUX01TQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQklUX18pID09IFNQSV9GSVJTVEJJVF9MU0IpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIFRJIG1vZGUgcGFyYW1ldGVyIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX01PREVfXyBzcGVjaWZpZXMgdGhlIFNQSSBUSSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfVElfbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfVElNT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gU1BJX1RJTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBTUElfVElNT0RFX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBTUEkgQ1JDIGNhbGN1bGF0aW9uIGVuYWJsZWQgc3RhdGUgaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fQ0FMQ1VMQVRJT05fXyBzcGVjaWZpZXMgdGhlIFNQSSBDUkMgY2FsY3VsYXRpb24gZW5hYmxlIHN0YXRlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfQ1JDX0NhbGN1bGF0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9DUkNfQ0FMQ1VMQVRJT04oX19DQUxDVUxBVElPTl9fKSAoKChfX0NBTENVTEFUSU9OX18pID09IFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NBTENVTEFUSU9OX18pID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorCisvKiogQGJyaWVmICBDaGVja3MgaWYgU1BJIENSQyBsZW5ndGggaXMgaW4gYWxsb3dlZCByYW5nZS4KKyAgKiBAcGFyYW0gIF9fTEVOR1RIX18gc3BlY2lmaWVzIHRoZSBTUEkgQ1JDIGxlbmd0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0NSQ19sZW5ndGgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgSVNfU1BJX0NSQ19MRU5HVEgoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPT0gU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBTUElfQ1JDX0xFTkdUSF84QklUKSAgfHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKSkKKworLyoqIEBicmllZiAgQ2hlY2tzIGlmIFNQSSBwb2x5bm9taWFsIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24sIGlzIGluIGFsbG93ZWQgcmFuZ2UuCisgICogQHBhcmFtICBfX1BPTFlOT01JQUxfXyBzcGVjaWZpZXMgdGhlIFNQSSBwb2x5bm9taWFsIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBDUkMgY2FsY3VsYXRpb24uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIElTX1NQSV9DUkNfUE9MWU5PTUlBTChfX1BPTFlOT01JQUxfXykgKCgoX19QT0xZTk9NSUFMX18pID49IDB4MVUpICYmICgoX19QT0xZTk9NSUFMX18pIDw9IDB4RkZGRlUpICYmICgoKF9fUE9MWU5PTUlBTF9fKSYweDFVKSAhPSAwVSkpCisKKy8qKiBAYnJpZWYgIENoZWNrcyBpZiBETUEgaGFuZGxlIGlzIHZhbGlkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgYSBETUEgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBJU19TUElfRE1BX0hBTkRMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pICE9IE5VTEwpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgU1BJIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX3NwaV9leC5oIgorCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfTXNwSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfTXNwRGVJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCBIQUxfU1BJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBTUElfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgSEFMX1NQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisvKiBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdF9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdF9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BUGF1c2UoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFSZXN1bWUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9ETUFTdG9wKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9BYm9ydChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKKwordm9pZCBIQUxfU1BJX0lSUUhhbmRsZXIoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhSeENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7Cit2b2lkIEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordm9pZCBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9FcnJvckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3ZvaWQgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TUElfU3RhdGVUeXBlRGVmIEhBTF9TUElfR2V0U3RhdGUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOwordWludDMyX3QgICAgICAgICAgICAgSEFMX1NQSV9HZXRFcnJvcihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9TUElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfc3BpX2V4LmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF9zcGlfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzI3MDQxCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfc3BpX2V4LmgKQEAgLTAsMCArMSw3NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc3BpX2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBIQUwgRXh0ZW5kZWQgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfU1BJX0VYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9TUElfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNQSUV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAYWRkdG9ncm91cCBTUElFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElFeF9GbHVzaFJ4RmlmbyhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9TUElfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfdGltLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF90aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVmNzlhCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfdGltLmgKQEAgLTAsMCArMSwyMTQzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF90aW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVElNIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9USU1fSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1RJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX1R5cGVzIFRJTSBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVElNIFRpbWUgYmFzZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVElNIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYgKi8KKworICB1aW50MzJfdCBDb3VudGVyTW9kZTsgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGNvdW50ZXIgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ291bnRlcl9Nb2RlICovCisKKyAgdWludDMyX3QgUGVyaW9kOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpb2QgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvLVJlbG9hZCBSZWdpc3RlciBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4gICovCisKKyAgdWludDMyX3QgQ2xvY2tEaXZpc2lvbjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBkaXZpc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tEaXZpc2lvbiAqLworCisgIHVpbnQzMl90IFJlcGV0aXRpb25Db3VudGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4gRWFjaCB0aW1lIHRoZSBSQ1IgZG93bmNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgemVybywgYW4gdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFJDUiB2YWx1ZSAoTikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIGluIFBXTSBtb2RlIHRoYXQgKE4rMSkgY29ycmVzcG9uZHMgdG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIFBXTSBwZXJpb2RzIGluIGVkZ2UtYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGhhbGYgUFdNIHBlcmlvZCBpbiBjZW50ZXItYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1AgdGltZXJzOiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2YW5jZWQgdGltZXJzOiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLiAqLworCisgIHVpbnQzMl90IEF1dG9SZWxvYWRQcmVsb2FkOyAgLyohPCBTcGVjaWZpZXMgdGhlIGF1dG8tcmVsb2FkIHByZWxvYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0F1dG9SZWxvYWRQcmVsb2FkICovCit9IFRJTV9CYXNlX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPQ01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyAqLworCisgIHVpbnQzMl90IFB1bHNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAqLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9Qb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgT0NGYXN0TW9kZTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIEZhc3QgbW9kZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9PdXRwdXRfRmFzdF9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgaW4gUFdNMSBhbmQgUFdNMiBtb2RlLiAqLworCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgT0NOSWRsZVN0YXRlOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXIgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KK30gVElNX09DX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBPbmUgUHVsc2UgTW9kZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPQ01vZGU7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfYW5kX1BXTV9tb2RlcyAqLworCisgIHVpbnQzMl90IFB1bHNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwdWxzZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRiAqLworCisgIHVpbnQzMl90IE9DUG9sYXJpdHk7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBPQ05Qb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9Qb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfSWRsZV9TdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIHRpbWVyIGluc3RhbmNlcyBzdXBwb3J0aW5nIGJyZWFrIGZlYXR1cmUuICovCisKKyAgdWludDMyX3QgT0NOSWRsZVN0YXRlOyAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT3V0cHV0X0NvbXBhcmVfTl9JZGxlX1N0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBwYXJhbWV0ZXIgaXMgdmFsaWQgb25seSBmb3IgdGltZXIgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgZmVhdHVyZS4gKi8KKworICB1aW50MzJfdCBJQ1BvbGFyaXR5OyAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNTZWxlY3Rpb247ICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQ0ZpbHRlcjsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KK30gVElNX09uZVB1bHNlX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBJbnB1dCBDYXB0dXJlIENvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBJQ1BvbGFyaXR5OyAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUNTZWxlY3Rpb247ICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDUHJlc2NhbGVyOyAgLyohPCBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQ0ZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fSUNfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIEVuY29kZXIgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fRW5jb2Rlcl9Nb2RlICovCisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9Qb2xhcml0eSAqLworCisgIHVpbnQzMl90IElDMVNlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1NlbGVjdGlvbiAqLworCisgIHVpbnQzMl90IElDMVByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciAqLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dCBjYXB0dXJlIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KKworICB1aW50MzJfdCBJQzJQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisKKyAgdWludDMyX3QgSUMyU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9TZWxlY3Rpb24gKi8KKworICB1aW50MzJfdCBJQzJQcmVzY2FsZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQzJGaWx0ZXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCit9IFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIENsb2NrIENvbmZpZ3VyYXRpb24gSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9ja1NvdXJjZTsgICAgIC8qITwgVElNIGNsb2NrIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0Nsb2NrX1NvdXJjZSAqLworICB1aW50MzJfdCBDbG9ja1BvbGFyaXR5OyAgIC8qITwgVElNIGNsb2NrIHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9DbG9ja19Qb2xhcml0eSAqLworICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgIC8qITwgVElNIGNsb2NrIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCisgIHVpbnQzMl90IENsb2NrRmlsdGVyOyAgICAgLyohPCBUSU0gY2xvY2sgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KK30gVElNX0Nsb2NrQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gQ2xlYXIgSW5wdXQgQ29uZmlndXJhdGlvbiBIYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENsZWFySW5wdXRTdGF0ZTsgICAgICAvKiE8IFRJTSBjbGVhciBJbnB1dCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgRU5BQkxFIG9yIERJU0FCTEUgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dFNvdXJjZTsgICAgIC8qITwgVElNIGNsZWFyIElucHV0IHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQ2xlYXJJbnB1dF9Tb3VyY2UgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dFBvbGFyaXR5OyAgIC8qITwgVElNIENsZWFyIElucHV0IHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0NsZWFySW5wdXRfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQ2xlYXJJbnB1dFByZXNjYWxlcjsgIC8qITwgVElNIENsZWFyIElucHV0IHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIDA6IFdoZW4gT0NSZWYgY2xlYXIgZmVhdHVyZSBpcyB1c2VkIHdpdGggRVRSIHNvdXJjZSwgRVRSIHByZXNjYWxlciBtdXN0IGJlIG9mZiAqLworICB1aW50MzJfdCBDbGVhcklucHV0RmlsdGVyOyAgICAgLyohPCBUSU0gQ2xlYXIgSW5wdXQgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworfSBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIE1hc3RlciBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgICBBZHZhbmNlZCB0aW1lcnMgcHJvdmlkZSBUUkdPMiBpbnRlcm5hbCBsaW5lIHdoaWNoIGlzIHJlZGlyZWN0ZWQKKyAgKiAgICAgICAgIHRvIHRoZSBBREMKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBNYXN0ZXJPdXRwdXRUcmlnZ2VyOyAgIC8qITwgVHJpZ2dlciBvdXRwdXQgKFRSR08pIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbiAqLworICB1aW50MzJfdCAgTWFzdGVyT3V0cHV0VHJpZ2dlcjI7ICAvKiE8IFRyaWdnZXIgb3V0cHV0MiAoVFJHTzIpIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbl8yICovCisgIHVpbnQzMl90ICBNYXN0ZXJTbGF2ZU1vZGU7ICAgICAgIC8qITwgTWFzdGVyL3NsYXZlIG1vZGUgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX1NsYXZlX01vZGUgKi8KK30gVElNX01hc3RlckNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVElNIFNsYXZlIGNvbmZpZ3VyYXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICBTbGF2ZU1vZGU7ICAgICAgICAgLyohPCBTbGF2ZSBtb2RlIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fU2xhdmVfTW9kZSAqLworICB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyOyAgICAgIC8qITwgSW5wdXQgVHJpZ2dlciBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX1RyaWdnZXJfU2VsZWN0aW9uICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUG9sYXJpdHk7ICAgLyohPCBJbnB1dCBUcmlnZ2VyIHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9UcmlnZ2VyX1BvbGFyaXR5ICovCisgIHVpbnQzMl90ICBUcmlnZ2VyUHJlc2NhbGVyOyAgLyohPCBJbnB1dCB0cmlnZ2VyIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fVHJpZ2dlcl9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgIFRyaWdnZXJGaWx0ZXI7ICAgICAvKiE8IElucHV0IHRyaWdnZXIgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgICovCisKK30gVElNX1NsYXZlQ29uZmlnVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBUSU0gQnJlYWsgaW5wdXQocykgYW5kIERlYWQgdGltZSBjb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQG5vdGUgICAyIGJyZWFrIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCAoQktJTiBhbmQgQktJTjIpIHdpdGggY29uZmlndXJhYmxlCisgICogICAgICAgIGZpbHRlciBhbmQgcG9sYXJpdHkuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPZmZTdGF0ZVJ1bk1vZGU7ICAgICAgLyohPCBUSU0gb2ZmIHN0YXRlIGluIHJ1biBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX09TU1JfT2ZmX1N0YXRlX1NlbGVjdGlvbl9mb3JfUnVuX21vZGVfc3RhdGUgKi8KKyAgdWludDMyX3QgT2ZmU3RhdGVJRExFTW9kZTsgICAgIC8qITwgVElNIG9mZiBzdGF0ZSBpbiBJRExFIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fT1NTSV9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9JZGxlX21vZGVfc3RhdGUgKi8KKyAgdWludDMyX3QgTG9ja0xldmVsOyAgICAgICAgICAgIC8qITwgVElNIExvY2sgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTG9ja19sZXZlbCAqLworICB1aW50MzJfdCBEZWFkVGltZTsgICAgICAgICAgICAgLyohPCBUSU0gZGVhZCBUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGICovCisgIHVpbnQzMl90IEJyZWFrU3RhdGU7ICAgICAgICAgICAvKiE8IFRJTSBCcmVhayBTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9CcmVha19JbnB1dF9lbmFibGVfZGlzYWJsZSAqLworICB1aW50MzJfdCBCcmVha1BvbGFyaXR5OyAgICAgICAgLyohPCBUSU0gQnJlYWsgaW5wdXQgcG9sYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fQnJlYWtfUG9sYXJpdHkgKi8KKyAgdWludDMyX3QgQnJlYWtGaWx0ZXI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBicmVhayBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwIGFuZCBNYXhfRGF0YSA9IDB4RiAqLworICB1aW50MzJfdCBCcmVhazJTdGF0ZTsgICAgICAgICAgLyohPCBUSU0gQnJlYWsyIFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0JyZWFrMl9JbnB1dF9lbmFibGVfZGlzYWJsZSAqLworICB1aW50MzJfdCBCcmVhazJQb2xhcml0eTsgICAgICAgLyohPCBUSU0gQnJlYWsyIGlucHV0IHBvbGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0JyZWFrMl9Qb2xhcml0eSAqLworICB1aW50MzJfdCBCcmVhazJGaWx0ZXI7ICAgICAgICAgLyohPCBUSU0gYnJlYWsyIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCisgIHVpbnQzMl90IEF1dG9tYXRpY091dHB1dDsgICAgICAvKiE8IFRJTSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9BT0VfQml0X1NldF9SZXNldCAqLworfSBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9USU1fU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9USU1fU1RBVEVfUkVBRFkgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCisgIEhBTF9USU1fU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBBbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICovCisgIEhBTF9USU1fU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9USU1fU1RBVEVfRVJST1IgICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICovCit9IEhBTF9USU1fU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBBY3RpdmUgY2hhbm5lbCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzEgICAgICAgID0gMHgwMVUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDEgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMiAgICAgICAgPSAweDAyVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgMiAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zICAgICAgICA9IDB4MDRVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyAzICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQgICAgICAgID0gMHgwOFUsICAgIC8qITwgVGhlIGFjdGl2ZSBjaGFubmVsIGlzIDQgICAgICovCisgIEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNSAgICAgICAgPSAweDEwVSwgICAgLyohPCBUaGUgYWN0aXZlIGNoYW5uZWwgaXMgNSAgICAgKi8KKyAgSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF82ICAgICAgICA9IDB4MjBVLCAgICAvKiE8IFRoZSBhY3RpdmUgY2hhbm5lbCBpcyA2ICAgICAqLworICBIQUxfVElNX0FDVElWRV9DSEFOTkVMX0NMRUFSRUQgID0gMHgwMFUgICAgIC8qITwgQWxsIGFjdGl2ZSBjaGFubmVscyBjbGVhcmVkICovCit9IEhBTF9USU1fQWN0aXZlQ2hhbm5lbDsKKworLyoqCisgICogQGJyaWVmICBUSU0gVGltZSBCYXNlIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3R5cGVkZWYgc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworeworICBUSU1fVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgKi8KKyAgVElNX0Jhc2VfSW5pdFR5cGVEZWYgICAgICAgIEluaXQ7ICAgICAgICAgIC8qITwgVElNIFRpbWUgQmFzZSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisgIEhBTF9USU1fQWN0aXZlQ2hhbm5lbCAgICAgICBDaGFubmVsOyAgICAgICAvKiE8IEFjdGl2ZSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAqLworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgKmhkbWFbN107ICAgICAgLyohPCBETUEgSGFuZGxlcnMgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhcnJheSBpcyBhY2Nlc3NlZCBieSBhIEByZWYgRE1BX0hhbmRsZV9pbmRleCAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgTG9jazsgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgX19JTyBIQUxfVElNX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAgIC8qITwgVElNIG9wZXJhdGlvbiBzdGF0ZSAgICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogQmFzZV9Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgIC8qITwgVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEJhc2VfTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAvKiE8IFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBJQ19Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAgLyohPCBUSU0gSUMgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogSUNfTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgIC8qITwgVElNIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE9DX01zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAgICAvKiE8IFRJTSBPQyBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBPQ19Nc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAgLyohPCBUSU0gT0MgTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogUFdNX01zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAgIC8qITwgVElNIFBXTSBNc3AgSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFBXTV9Nc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAvKiE8IFRJTSBQV00gTXNwIERlSW5pdCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBPbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgLyohPCBUSU0gT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogT25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgIC8qITwgVElNIE9uZSBQdWxzZSBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEVuY29kZXJfTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAvKiE8IFRJTSBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBFbmNvZGVyX01zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgLyohPCBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogSGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgIC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBQZXJpb2RFbGFwc2VkQ2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgIC8qITwgVElNIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFRyaWdnZXJDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAgICAgICAvKiE8IFRJTSBUcmlnZ2VyIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBUcmlnZ2VySGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgLyohPCBUSU0gVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogSUNfQ2FwdHVyZUNhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgIC8qITwgVElNIElucHV0IENhcHR1cmUgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIElDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBPQ19EZWxheUVsYXBzZWRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgLyohPCBUSU0gT3V0cHV0IENvbXBhcmUgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgIC8qITwgVElNIFBXTSBQdWxzZSBGaW5pc2hlZCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIFBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQ29tbXV0YXRpb25DYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAgICAgICAgIC8qITwgVElNIENvbW11dGF0aW9uIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIENvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgICAgICAvKiE8IFRJTSBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBCcmVha0NhbGxiYWNrKShzdHJ1Y3QgX19USU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7ICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0gQnJlYWsgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQnJlYWsyQ2FsbGJhY2spKHN0cnVjdCBfX1RJTV9IYW5kbGVUeXBlRGVmICpodGltKTsgICAgICAgICAgICAgICAgICAgIC8qITwgVElNIEJyZWFrMiBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfSBUSU1fSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFRJTSBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEICAgICAgICAgICAgPSAweDAwVSAgICAvKiE8IFRJTSBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCAgICAgICAgICA9IDB4MDFVICAgIC8qITwgVElNIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgID0gMHgwMlUgICAgLyohPCBUSU0gSUMgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgPSAweDAzVSAgICAvKiE8IFRJTSBJQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICA9IDB4MDRVICAgIC8qITwgVElNIE9DIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgID0gMHgwNVUgICAgLyohPCBUSU0gT0MgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgPSAweDA2VSAgICAvKiE8IFRJTSBQV00gTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEICAgICAgICAgICA9IDB4MDdVICAgIC8qITwgVElNIFBXTSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEICAgICAgID0gMHgwOFUgICAgLyohPCBUSU0gT25lIFB1bHNlIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCAgICAgPSAweDA5VSAgICAvKiE8IFRJTSBPbmUgUHVsc2UgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgICAgICAgICA9IDB4MEFVICAgIC8qITwgVElNIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEICAgICAgID0gMHgwQlUgICAgLyohPCBUSU0gRW5jb2RlciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCAgICAgPSAweDBDVSAgICAvKiE8IFRJTSBIYWxsIFNlbnNvciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAqLworICAsSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgICA9IDB4MERVICAgIC8qITwgVElNIEhhbGwgU2Vuc29yIE1zcERlSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEICAgICAgICAgID0gMHgwRVUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgICAgID0gMHgwRlUgICAgLyohPCBUSU0gUGVyaW9kIEVsYXBzZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgxMFUgICAgLyohPCBUSU0gVHJpZ2dlciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX1RSSUdHRVJfSEFMRl9DQl9JRCAgICAgICAgICAgID0gMHgxMVUgICAgLyohPCBUSU0gVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCAgICAgICAgICAgICAgPSAweDEyVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEICAgICAgICAgPSAweDEzVSAgICAvKiE8IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCAgICAgICAgPSAweDE0VSAgICAvKiE8IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrIElEICAgICAgICAgICAgICAgKi8KKyAgLEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0NCX0lEICAgICAgPSAweDE1VSAgICAvKiE8IFRJTSBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9IQUxGX0NCX0lEID0gMHgxNlUgICAgLyohPCBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisgICxIQUxfVElNX0VSUk9SX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgxN1UgICAgLyohPCBUSU0gRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEICAgICAgICAgICAgID0gMHgxOFUgICAgLyohPCBUSU0gQ29tbXV0YXRpb24gQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0NPTU1VVEFUSU9OX0hBTEZfQ0JfSUQgICAgICAgID0gMHgxOVUgICAgLyohPCBUSU0gQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0JSRUFLX0NCX0lEICAgICAgICAgICAgICAgICAgID0gMHgxQVUgICAgLyohPCBUSU0gQnJlYWsgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICxIQUxfVElNX0JSRUFLMl9DQl9JRCAgICAgICAgICAgICAgICAgID0gMHgxQlUgICAgLyohPCBUSU0gQnJlYWsyIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFRJTSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVElNX0NhbGxiYWNrVHlwZURlZikoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOyAgLyohPCBwb2ludGVyIHRvIHRoZSBUSU0gY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9Tb3VyY2UgVElNIENsZWFyIElucHV0IFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBPQ1JFRl9DTFIgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAvKiE8IE9DUkVGX0NMUiBpcyBjb25uZWN0ZWQgdG8gRVRSRiBpbnB1dCAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMSAgICAgICAgICBUSU0xX0FGMV9FVFJTRUxfMCAgIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0ICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAyICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8xICAgLyohPCBPQ1JFRl9DTFJfSU5UIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0RNQV9CYXNlX2FkZHJlc3MgVElNIERNQSBCYXNlIEFkZHJlc3MKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRE1BQkFTRV9DUjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NSMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfU01DUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBUSU1fRE1BQkFTRV9ESUVSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNVCisjZGVmaW5lIFRJTV9ETUFCQVNFX1NSICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfRUdSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDZVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDTVIyICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NFUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDlVCisjZGVmaW5lIFRJTV9ETUFCQVNFX1BTQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQVUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQVJSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBCVQorI2RlZmluZSBUSU1fRE1BQkFTRV9SQ1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFVQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ1IzICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEZVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQkRUUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExVQorI2RlZmluZSBUSU1fRE1BQkFTRV9EQ1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTJVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0RNQVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxM1UKKyNkZWZpbmUgVElNX0RNQUJBU0VfT1IgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0VQorI2RlZmluZSBUSU1fRE1BQkFTRV9DQ01SMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTVVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0NDUjUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNlUKKyNkZWZpbmUgVElNX0RNQUJBU0VfQ0NSNiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3VQorI2RlZmluZSBUSU1fRE1BQkFTRV9BRjEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMThVCisjZGVmaW5lIFRJTV9ETUFCQVNFX0FGMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOVUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V2ZW50X1NvdXJjZSBUSU0gRXZlbnQgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX1VQREFURSAgICAgICAgICAgICAgVElNX0VHUl9VRyAgICAgLyohPCBSZWluaXRpYWxpemUgdGhlIGNvdW50ZXIgYW5kIGdlbmVyYXRlcyBhbiB1cGRhdGUgb2YgdGhlIHJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0MxICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDMUcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NDMiAgICAgICAgICAgICAgICAgVElNX0VHUl9DQzJHICAgLyohPCBBIGNhcHR1cmUvY29tcGFyZSBldmVudCBpcyBnZW5lcmF0ZWQgb24gY2hhbm5lbCAyICovCisjZGVmaW5lIFRJTV9FVkVOVFNPVVJDRV9DQzMgICAgICAgICAgICAgICAgIFRJTV9FR1JfQ0MzRyAgIC8qITwgQSBjYXB0dXJlL2NvbXBhcmUgZXZlbnQgaXMgZ2VuZXJhdGVkIG9uIGNoYW5uZWwgMyAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQ0M0ICAgICAgICAgICAgICAgICBUSU1fRUdSX0NDNEcgICAvKiE8IEEgY2FwdHVyZS9jb21wYXJlIGV2ZW50IGlzIGdlbmVyYXRlZCBvbiBjaGFubmVsIDQgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0NPTSAgICAgICAgICAgICAgICAgVElNX0VHUl9DT01HICAgLyohPCBBIGNvbW11dGF0aW9uIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfVFJJR0dFUiAgICAgICAgICAgICBUSU1fRUdSX1RHICAgICAvKiE8IEEgdHJpZ2dlciBldmVudCBpcyBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgVElNX0VWRU5UU09VUkNFX0JSRUFLICAgICAgICAgICAgICAgVElNX0VHUl9CRyAgICAgLyohPCBBIGJyZWFrIGV2ZW50IGlzIGdlbmVyYXRlZCAqLworI2RlZmluZSBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyICAgICAgICAgICAgICBUSU1fRUdSX0IyRyAgICAvKiE8IEEgYnJlYWsgMiBldmVudCBpcyBnZW5lcmF0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NoYW5uZWxfUG9sYXJpdHkgVElNIElucHV0IENoYW5uZWwgcG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXggc291cmNlICovCisjZGVmaW5lICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORyAgICAgVElNX0NDRVJfQ0MxUCAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeCBzb3VyY2UgKi8KKyNkZWZpbmUgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgICAoVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSAgLyohPCBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRVRSX1BvbGFyaXR5IFRJTSBFVFIgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUCAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFIgc291cmNlICovCisjZGVmaW5lIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUiBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0VUUl9QcmVzY2FsZXIgVElNIEVUUiBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICovCisjZGVmaW5lIFRJTV9FVFJQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQU18wICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IHNvdXJjZSBpcyBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgVElNX0VUUlBSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTXzEgICAgICAgICAgICAgICAgICAgLyohPCBFVFIgaW5wdXQgc291cmNlIGlzIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBUSU1fRVRSUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFMgICAgICAgICAgICAgICAgICAgICAvKiE8IEVUUiBpbnB1dCBzb3VyY2UgaXMgZGl2aWRlZCBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Db3VudGVyX01vZGUgVElNIENvdW50ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9VUCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB1c2VkIGFzIHVwLWNvdW50ZXIgICAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfRE9XTiAgICAgICAgICAgICAgIFRJTV9DUjFfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgdXNlZCBhcyBkb3duLWNvdW50ZXIgKi8KKyNkZWZpbmUgVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQxICAgICBUSU1fQ1IxX0NNU18wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDZW50ZXItYWxpZ25lZCBtb2RlIDEgICAgICAgICovCisjZGVmaW5lIFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMiAgICAgVElNX0NSMV9DTVNfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2VudGVyLWFsaWduZWQgbW9kZSAyICAgICAgICAqLworI2RlZmluZSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDMgICAgIFRJTV9DUjFfQ01TICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENlbnRlci1hbGlnbmVkIG1vZGUgMyAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0Nsb2NrRGl2aXNpb24gVElNIENsb2NrIERpdmlzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMT0NLRElWSVNJT05fRElWMSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDbG9jayBkaXZpc2lvbjogdERUUz10Q0tfSU5UICAgKi8KKyNkZWZpbmUgVElNX0NMT0NLRElWSVNJT05fRElWMiAgICAgICAgICAgICBUSU1fQ1IxX0NLRF8wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDbG9jayBkaXZpc2lvbjogdERUUz0yKnRDS19JTlQgKi8KKyNkZWZpbmUgVElNX0NMT0NLRElWSVNJT05fRElWNCAgICAgICAgICAgICBUSU1fQ1IxX0NLRF8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDbG9jayBkaXZpc2lvbjogdERUUz00KnRDS19JTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX1N0YXRlIFRJTSBPdXRwdXQgQ29tcGFyZSBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PVVRQVVRTVEFURV9ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3V0cHV0IGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9PVVRQVVRTVEFURV9FTkFCTEUgICAgICAgICAgICAgVElNX0NDRVJfQ0MxRSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgb3V0cHV0IGVuYWJsZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0F1dG9SZWxvYWRQcmVsb2FkIFRJTSBBdXRvLVJlbG9hZCBQcmVsb2FkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0FVVE9SRUxPQURfUFJFTE9BRF9ESVNBQkxFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyBub3QgYnVmZmVyZWQgKi8KKyNkZWZpbmUgVElNX0FVVE9SRUxPQURfUFJFTE9BRF9FTkFCTEUgICAgICAgICAgICAgICAgIFRJTV9DUjFfQVJQRSAgICAgICAgICAgICAgLyohPCBUSU14X0FSUiByZWdpc3RlciBpcyBidWZmZXJlZCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfRmFzdF9TdGF0ZSBUSU0gT3V0cHV0IEZhc3QgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NGQVNUX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBDb21wYXJlIGZhc3QgZGlzYWJsZSAqLworI2RlZmluZSBUSU1fT0NGQVNUX0VOQUJMRSAgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFGRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBDb21wYXJlIGZhc3QgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfTl9TdGF0ZSBUSU0gQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBTdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PVVRQVVROU1RBVEVfRElTQUJMRSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0N4TiBpcyBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgVElNX09VVFBVVE5TVEFURV9FTkFCTEUgICAgICAgICAgICBUSU1fQ0NFUl9DQzFORSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQ3hOIGlzIGVuYWJsZWQgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT3V0cHV0X0NvbXBhcmVfUG9sYXJpdHkgVElNIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgb3V0cHV0IHBvbGFyaXR5ICAqLworI2RlZmluZSBUSU1fT0NQT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMVAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSBvdXRwdXQgcG9sYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9OX1BvbGFyaXR5IFRJTSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DTlBPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNX09DTlBPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFOUCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgY29tcGxlbWVudGFyeSBvdXRwdXQgcG9sYXJpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX0lkbGVfU3RhdGUgVElNIE91dHB1dCBDb21wYXJlIElkbGUgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT0NJRExFU1RBVEVfU0VUICAgICAgICAgICAgICAgIFRJTV9DUjJfT0lTMSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE91dHB1dCBJZGxlIHN0YXRlOiBPQ3g9MSB3aGVuIE1PRT0wICovCisjZGVmaW5lIFRJTV9PQ0lETEVTVEFURV9SRVNFVCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT3V0cHV0IElkbGUgc3RhdGU6IE9DeD0wIHdoZW4gTU9FPTAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX091dHB1dF9Db21wYXJlX05fSWRsZV9TdGF0ZSBUSU0gQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBJZGxlIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DTklETEVTVEFURV9TRVQgICAgICAgICAgICAgICBUSU1fQ1IyX09JUzFOICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wbGVtZW50YXJ5IG91dHB1dCBJZGxlIHN0YXRlOiBPQ3hOPTEgd2hlbiBNT0U9MCAqLworI2RlZmluZSBUSU1fT0NOSURMRVNUQVRFX1JFU0VUICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBsZW1lbnRhcnkgb3V0cHV0IElkbGUgc3RhdGU6IE9DeE49MCB3aGVuIE1PRT0wICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5IFRJTSBJbnB1dCBDYXB0dXJlIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgIFRJTV9JQ1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HICAgICAgLyohPCBDYXB0dXJlIHRyaWdnZXJlZCBieSByaXNpbmcgZWRnZSBvbiB0aW1lciBpbnB1dCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBUSU1fSUNQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkcgICAgIC8qITwgQ2FwdHVyZSB0cmlnZ2VyZWQgYnkgZmFsbGluZyBlZGdlIG9uIHRpbWVyIGlucHV0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgVElNX0lDUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgICAvKiE8IENhcHR1cmUgdHJpZ2dlcmVkIGJ5IGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2VzIG9uIHRpbWVyIGlucHV0Ki8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSSAgICAgICAgICAgVElNX0NDTVIxX0NDMVNfMCAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBJQzEsIElDMiwgSUMzIG9yIElDNCwgcmVzcGVjdGl2ZWx5ICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJICAgICAgICAgVElNX0NDTVIxX0NDMVNfMSAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBJQzIsIElDMSwgSUM0IG9yIElDMywgcmVzcGVjdGl2ZWx5ICovCisjZGVmaW5lIFRJTV9JQ1NFTEVDVElPTl9UUkMgICAgICAgICAgICAgICAgVElNX0NDTVIxX0NDMVMgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNIElucHV0IDEsIDIsIDMgb3IgNCBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9JbnB1dF9DYXB0dXJlX1ByZXNjYWxlciBUSU0gSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIGVhY2ggdGltZSBhbiBlZGdlIGlzIGRldGVjdGVkIG9uIHRoZSBjYXB0dXJlIGlucHV0ICovCisjZGVmaW5lIFRJTV9JQ1BTQ19ESVYyICAgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX0lDMVBTQ18wICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0lDUFNDX0RJVjQgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfSUMxUFNDXzEgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fSUNQU0NfRElWOCAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9JQzFQU0MgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgOCBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PbmVfUHVsc2VfTW9kZSBUSU0gT25lIFB1bHNlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fT1BNT0RFX1NJTkdMRSAgICAgICAgICAgICAgICAgIFRJTV9DUjFfT1BNICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgc3RvcHMgY291bnRpbmcgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIFRJTV9PUE1PREVfUkVQRVRJVElWRSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciBpcyBub3Qgc3RvcHBlZCBhdCB1cGRhdGUgZXZlbnQgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0VuY29kZXJfTW9kZSBUSU0gRW5jb2RlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMSAgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMSwgeDIgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gVEkxRlAxIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMkZQMiBsZXZlbCAgKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMiAgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMiwgeDIgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gVEkyRlAyIGVkZ2UgZGVwZW5kaW5nIG9uIFRJMUZQMSBsZXZlbC4gKi8KKyNkZWZpbmUgVElNX0VOQ09ERVJNT0RFX1RJMTIgICAgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzEgfCBUSU1fU01DUl9TTVNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUXVhZHJhdHVyZSBlbmNvZGVyIG1vZGUgMywgeDQgbW9kZSwgY291bnRzIHVwL2Rvd24gb24gYm90aCBUSTFGUDEgYW5kIFRJMkZQMiBlZGdlcyBkZXBlbmRpbmcgb24gdGhlIGxldmVsIG9mIHRoZSBvdGhlciBpbnB1dC4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0ludGVycnVwdF9kZWZpbml0aW9uIFRJTSBpbnRlcnJ1cHQgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9JVF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfVUlFICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGludGVycnVwdCAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JVF9DQzEgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MxSUUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DQzIgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MySUUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DQzMgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MzSUUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DQzQgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0M0SUUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisjZGVmaW5lIFRJTV9JVF9DT00gICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ09NSUUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tbXV0YXRpb24gaW50ZXJydXB0ICAgICAgICovCisjZGVmaW5lIFRJTV9JVF9UUklHR0VSICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfVElFICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9JVF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQklFICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0ICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Db21tdXRhdGlvbl9Tb3VyY2UgIFRJTSBDb21tdXRhdGlvbiBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ09NTVVUQVRJT05fVFJHSSAgICAgICAgICAgICAgVElNX0NSMl9DQ1VTICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdoZW4gQ2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyBhcmUgcHJlbG9hZGVkLCB0aGV5IGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9yIHdoZW4gYW4gcmlzaW5nIGVkZ2Ugb2NjdXJzIG9uIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXaGVuIENhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgYXJlIHByZWxvYWRlZCwgdGhleSBhcmUgdXBkYXRlZCBieSBzZXR0aW5nIHRoZSBDT01HIGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRE1BX3NvdXJjZXMgVElNIERNQSBTb3VyY2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0RNQV9VUERBVEUgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9VREUgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVwZGF0ZSBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDMSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMURFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDEgZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9DQzIgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzJERSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIGNhcHR1cmUvY29tcGFyZSBtYWN0aCAyIGV2ZW50IGV2ZW50ICovCisjZGVmaW5lIFRJTV9ETUFfQ0MzICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MzREUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBjYXB0dXJlL2NvbXBhcmUgbWFjdGggMyBldmVudCBldmVudCAqLworI2RlZmluZSBUSU1fRE1BX0NDNCAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDNERFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERNQSByZXF1ZXN0IGlzIHRyaWdnZXJlZCBieSB0aGUgY2FwdHVyZS9jb21wYXJlIG1hY3RoIDQgZXZlbnQgZXZlbnQgKi8KKyNkZWZpbmUgVElNX0RNQV9DT00gICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DT01ERSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBETUEgcmVxdWVzdCBpcyB0cmlnZ2VyZWQgYnkgdGhlIGNvbW11dGF0aW9uIGV2ZW50ICovCisjZGVmaW5lIFRJTV9ETUFfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfVERFICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRE1BIHJlcXVlc3QgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB0cmlnZ2VyIGV2ZW50ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9GbGFnX2RlZmluaXRpb24gVElNIEZsYWcgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9GTEFHX1VQREFURSAgICAgICAgICAgICAgICAgICAgVElNX1NSX1VJRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGludGVycnVwdCBmbGFnICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MxICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MxSUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DQzIgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMyAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDM0lGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0M0ICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M0SUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBUSU1fRkxBR19DQzUgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzVJRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNiAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNklGICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ09NICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ09NSUYgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21tdXRhdGlvbiBpbnRlcnJ1cHQgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19UUklHR0VSICAgICAgICAgICAgICAgICAgIFRJTV9TUl9USUYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcgICAgICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0JSRUFLICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0JJRiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGZsYWcgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQlJFQUsyICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQjJJRiAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayAyIGludGVycnVwdCBmbGFnICAgICAgICAqLworI2RlZmluZSBUSU1fRkxBR19TWVNURU1fQlJFQUsgICAgICAgICAgICAgIFRJTV9TUl9TQklGICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZyAgICovCisjZGVmaW5lIFRJTV9GTEFHX0NDMU9GICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMU9GICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSAxIG92ZXJjYXB0dXJlIGZsYWcgICAgKi8KKyNkZWZpbmUgVElNX0ZMQUdfQ0MyT0YgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MyT0YgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIDIgb3ZlcmNhcHR1cmUgZmxhZyAgICAqLworI2RlZmluZSBUSU1fRkxBR19DQzNPRiAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzNPRiAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUgMyBvdmVyY2FwdHVyZSBmbGFnICAgICovCisjZGVmaW5lIFRJTV9GTEFHX0NDNE9GICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNE9GICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZSA0IG92ZXJjYXB0dXJlIGZsYWcgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0NoYW5uZWwgVElNIENoYW5uZWwKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjaGFubmVsIDEgaWRlbnRpZmllciAgICAgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIGNoYW5uZWwgMiBpZGVudGlmaWVyICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCAzIGlkZW50aWZpZXIgICAgICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSBjaGFubmVsIDQgaWRlbnRpZmllciAgICAgICovCisjZGVmaW5lIFRJTV9DSEFOTkVMXzUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyZSBjaGFubmVsIDUgaWRlbnRpZmllciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX0NIQU5ORUxfNiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0VSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJlIGNoYW5uZWwgNiBpZGVudGlmaWVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0hBTk5FTF9BTEwgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwM0NVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdsb2JhbCBDYXB0dXJlL2NvbXBhcmUgY2hhbm5lbCBpZGVudGlmaWVyICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfU291cmNlIFRJTSBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTIgICAgVElNX1NNQ1JfRVRQU18xICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSU5URVJOQUwgICAgVElNX1NNQ1JfRVRQU18wICAgICAgLyohPCBJbnRlcm5hbCBjbG9jayBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMCAgICAgICAgVElNX1RTX0lUUjAgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIwKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMSAgICAgICAgVElNX1RTX0lUUjEgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIxKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMiAgICAgICAgVElNX1RTX0lUUjIgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIyKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMyAgICAgICAgVElNX1RTX0lUUjMgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChJVFIzKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxRUQgICAgICAgVElNX1RTX1RJMUZfRUQgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChUVEkxRlAxICsgZWRnZSBkZXRlY3QuKSAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxICAgICAgICAgVElNX1RTX1RJMUZQMSAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChUVEkxRlAxKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkyICAgICAgICAgVElNX1RTX1RJMkZQMiAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChUVEkyRlAyKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTEgICAgVElNX1RTX0VUUkYgICAgICAgICAgLyohPCBFeHRlcm5hbCBjbG9jayBzb3VyY2UgbW9kZSAxIChFVFJGKSAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfUG9sYXJpdHkgVElNIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0NMT0NLUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgLyohPCBQb2xhcml0eSBmb3IgRVRSeCBjbG9jayBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9DTE9DS1BPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAvKiE8IFBvbGFyaXR5IGZvciBUSXggY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0ZBTExJTkcgICAvKiE8IFBvbGFyaXR5IGZvciBUSXggY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX0JPVEhFREdFICAvKiE8IFBvbGFyaXR5IGZvciBUSXggY2xvY2sgc291cmNlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xvY2tfUHJlc2NhbGVyIFRJTSBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYxICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDIgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVY0ICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIENsb2NrOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9Qb2xhcml0eSBUSU0gQ2xlYXIgSW5wdXQgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX0lOVkVSVEVEICAgICAgICAgICBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQgICAgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX05PTklOVkVSVEVEICAgICAgICBUSU1fRVRSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAvKiE8IFBvbGFyaXR5IGZvciBFVFJ4IHBpbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQ2xlYXJJbnB1dF9QcmVzY2FsZXIgVElNIENsZWFyIElucHV0IFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjEgICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgIC8qITwgTm8gcHJlc2NhbGVyIGlzIHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjIgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIHBpbjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVY0ICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBwaW46IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgNCBldmVudHMuICovCisjZGVmaW5lIFRJTV9DTEVBUklOUFVUUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgcGluOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDggZXZlbnRzLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fT1NTUl9PZmZfU3RhdGVfU2VsZWN0aW9uX2Zvcl9SdW5fbW9kZV9zdGF0ZSBUSU0gT1NTUiBPZmZTdGF0ZSBTZWxlY3Rpb24gZm9yIFJ1biBtb2RlIHN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09TU1JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9PU1NSICAgICAgICAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZW5hYmxlZCAoc3RpbGwgY29udHJvbGxlZCBieSB0aGUgdGltZXIpICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT1NTUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DL09DTiBvdXRwdXRzIGFyZSBkaXNhYmxlZCAobm90IGNvbnRyb2xsZWQgYW55IGxvbmdlciBieSB0aGUgdGltZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PU1NJX09mZl9TdGF0ZV9TZWxlY3Rpb25fZm9yX0lkbGVfbW9kZV9zdGF0ZSBUSU0gT1NTSSBPZmZTdGF0ZSBTZWxlY3Rpb24gZm9yIElkbGUgbW9kZSBzdGF0ZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9PU1NJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfT1NTSSAgICAgICAgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0MvT0NOIG91dHB1dHMgYXJlIGVuYWJsZWQgKHN0aWxsIGNvbnRyb2xsZWQgYnkgdGhlIHRpbWVyKSAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09TU0lfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKG5vdCBjb250cm9sbGVkIGFueSBsb25nZXIgYnkgdGhlIHRpbWVyKSAqLworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xvY2tfbGV2ZWwgIFRJTSBMb2NrIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF9PRkYgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMT0NLIE9GRiAgICAgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF8xICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLXzAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMT0NLIExldmVsIDEgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF8yICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLXzEgICAgICAgICAgICAgICAgICAgICAgLyohPCBMT0NLIExldmVsIDIgKi8KKyNkZWZpbmUgVElNX0xPQ0tMRVZFTF8zICAgICAgICAgICAgICAgICAgICBUSU1fQkRUUl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMT0NLIExldmVsIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrX0lucHV0X2VuYWJsZV9kaXNhYmxlIFRJTSBCcmVhayBJbnB1dCBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtfRU5BQkxFICAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX0JLRSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBlbmFibGVkICAqLworI2RlZmluZSBUSU1fQlJFQUtfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSyBpcyBkaXNhYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWtfUG9sYXJpdHkgVElNIEJyZWFrIElucHV0IFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGxvdyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLUE9MQVJJVFlfSElHSCAgICAgICAgICAgICBUSU1fQkRUUl9CS1AgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0JyZWFrMl9JbnB1dF9lbmFibGVfZGlzYWJsZSBUSU0gQnJlYWsgaW5wdXQgMiBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUsyX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgZGlzYWJsZWQgICovCisjZGVmaW5lIFRJTV9CUkVBSzJfRU5BQkxFICAgICAgICAgICAgICAgICAgVElNX0JEVFJfQksyRSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLMiBpcyBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWsyX1BvbGFyaXR5IFRJTSBCcmVhayBJbnB1dCAyIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLMlBPTEFSSVRZX0xPVyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksyIGlzIGFjdGl2ZSBsb3cgICAqLworI2RlZmluZSBUSU1fQlJFQUsyUE9MQVJJVFlfSElHSCAgICAgICAgICAgIFRJTV9CRFRSX0JLMlAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGhpZ2ggICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9BT0VfQml0X1NldF9SZXNldCBUSU0gQXV0b21hdGljIE91dHB1dCBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUgKi8KKyNkZWZpbmUgVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUgICAgICAgICBUSU1fQkRUUl9BT0UgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNT0UgY2FuIGJlIHNldCBieSBzb2Z0d2FyZSBvciBhdXRvbWF0aWNhbGx5IGF0IHRoZSBuZXh0IHVwZGF0ZSBldmVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBub25lIG9mIHRoZSBicmVhayBpbnB1dHMgQlJLIGFuZCBCUksyIGlzIGFjdGl2ZSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0dyb3VwX0NoYW5uZWw1IEdyb3VwIENoYW5uZWwgNSBhbmQgQ2hhbm5lbCAxLCAyIG9yIDMKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfTk9ORSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBObyBlZmZlY3Qgb2YgT0M1UkVGIG9uIE9DMVJFRkMsIE9DMlJFRkMgYW5kIE9DM1JFRkMgKi8KKyNkZWZpbmUgVElNX0dST1VQQ0g1X09DMVJFRkMgICAgICAgICAgICAgICBUSU1fQ0NSNV9HQzVDMSAgICAgICAgICAgICAgICAgICAgICAgLyogITwgT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGICAgICovCisjZGVmaW5lIFRJTV9HUk9VUENINV9PQzJSRUZDICAgICAgICAgICAgICAgVElNX0NDUjVfR0M1QzIgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAgICAqLworI2RlZmluZSBUSU1fR1JPVVBDSDVfT0MzUkVGQyAgICAgICAgICAgICAgIFRJTV9DQ1I1X0dDNUMzICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZCBPQzVSRUYgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX01hc3Rlcl9Nb2RlX1NlbGVjdGlvbiBUSU0gTWFzdGVyIE1vZGUgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RSR09fUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0VHUi5VRyBiaXQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX0VOQUJMRSAgICAgICAgICAgVElNX0NSMl9NTVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DUjEuQ0VOIGJpdCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19VUERBVEUgICAgICAgICAgIFRJTV9DUjJfTU1TXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MxICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMSB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCAxIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08pICovCisjZGVmaW5lIFRJTV9UUkdPX09DMVJFRiAgICAgICAgICAgVElNX0NSMl9NTVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MxUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IChUUkdPKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHT19PQzJSRUYgICAgICAgICAgIChUSU1fQ1IyX01NU18yIHwgVElNX0NSMl9NTVNfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dChUUkdPKSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RSR09fT0MzUkVGICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEpICAgICAgICAgICAgICAgICAgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQoVFJHTykgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUkdPX09DNFJFRiAgICAgICAgICAgKFRJTV9DUjJfTU1TXzIgfCBUSU1fQ1IyX01NU18xIHwgVElNX0NSMl9NTVNfMCkgIC8qITwgT0M0UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0KFRSR08pICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uXzIgVElNIE1hc3RlciBNb2RlIFNlbGVjdGlvbiAyIChUUkdPMikKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFJHTzJfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0VHUi5VRyBiaXQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NSMS5DRU4gYml0IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTzIpICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDYXB0dXJlIG9yIGEgY29tcGFyZSBtYXRjaCAxIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAqLworI2RlZmluZSBUSU1fVFJHTzJfT0MxUkVGICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0MyUkVGICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzJSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0MzUkVGICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzNSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzVSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M2UkVGICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzZSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKFRSR08yKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR0ZBTExJTkcgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgcmlzaW5nIG9yIGZhbGxpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M2UkVGX1JJU0lOR0ZBTExJTkcgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzZSRUYgcmlzaW5nIG9yIGZhbGxpbmcgZWRnZXMgZ2VuZXJhdGUgcHVsc2VzIG9uIFRSR08yICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M0UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORyAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgcmlzaW5nIG9yIE9DNlJFRiBmYWxsaW5nIGVkZ2VzIGdlbmVyYXRlIHB1bHNlcyBvbiBUUkdPMiAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHxUSU1fQ1IyX01NUzJfMSkgICAgICAgICAgICAgICAgICAgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgICAgICAgICAqLworI2RlZmluZSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfRkFMTElORyAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEgfCBUSU1fQ1IyX01NUzJfMCkgLyohPCBPQzVSRUYgb3IgT0M2UkVGIHJpc2luZyBlZGdlcyBnZW5lcmF0ZSBwdWxzZXMgb24gVFJHTzIgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTWFzdGVyX1NsYXZlX01vZGUgVElNIE1hc3Rlci9TbGF2ZSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9FTkFCTEUgICAgICAgICBUSU1fU01DUl9NU00gICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBhY3Rpb24gKi8KKyNkZWZpbmUgVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fU2xhdmVfTW9kZSBUSU0gU2xhdmUgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfRElTQUJMRSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNsYXZlIG1vZGUgZGlzYWJsZWQgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfUkVTRVQgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IE1vZGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfR0FURUQgICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMCkgICAgICAgICAgICAgICAgICAvKiE8IEdhdGVkIE1vZGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfVFJJR0dFUiAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSkgICAgICAgICAgICAgICAgICAvKiE8IFRyaWdnZXIgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfRVhURVJOQUwxICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAvKiE8IEV4dGVybmFsIENsb2NrIE1vZGUgMSAgICAgICAgICovCisjZGVmaW5lIFRJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSICBUSU1fU01DUl9TTVNfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbWJpbmVkIHJlc2V0ICsgdHJpZ2dlciBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9PdXRwdXRfQ29tcGFyZV9hbmRfUFdNX21vZGVzIFRJTSBPdXRwdXQgQ29tcGFyZSBhbmQgUFdNIE1vZGVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9USU1JTkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGcm96ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0FDVElWRSAgICAgICAgICAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjaGFubmVsIHRvIGFjdGl2ZSBsZXZlbCBvbiBtYXRjaCAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2V0IGNoYW5uZWwgdG8gaW5hY3RpdmUgbGV2ZWwgb24gbWF0Y2ggKi8KKyNkZWZpbmUgVElNX09DTU9ERV9UT0dHTEUgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBUb2dnbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX1BXTTEgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IFBXTSBtb2RlIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUFdNMiAgICAgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApIC8qITwgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9GT1JDRURfQUNUSVZFICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBGb3JjZSBhY3RpdmUgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSAgICAgICAgICBUSU1fQ0NNUjFfT0MxTV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZvcmNlIGluYWN0aXZlIGxldmVsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0xICAgICAgVElNX0NDTVIxX09DMU1fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmV0cmlnZXJyYWJsZSBPUE0gbW9kZSAxICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9SRVRSSUdFUlJBQkxFX09QTTIgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDIgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMikgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbWJpbmVkIFBXTSBtb2RlIDEgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9PQ01PREVfQ09NQklORURfUFdNMiAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8wIHwgVElNX0NDTVIxX09DMU1fMikgIC8qITwgQ29tYmluZWQgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzEgfCBUSU1fQ0NNUjFfT0MxTV8yKSAgLyohPCBBc3ltbWV0cmljIFBXTSBtb2RlIDEgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMiAgICAgICAgIFRJTV9DQ01SMV9PQzFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFzeW1tZXRyaWMgUFdNIG1vZGUgMiAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1NlbGVjdGlvbiBUSU0gVHJpZ2dlciBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFNfSVRSMCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19JVFIxICAgICAgICAgIFRJTV9TTUNSX1RTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW50ZXJuYWwgVHJpZ2dlciAxIChJVFIxKSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX0lUUjIgICAgICAgICAgVElNX1NNQ1JfVFNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnRlcm5hbCBUcmlnZ2VyIDIgKElUUjIpICAgICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfSVRSMyAgICAgICAgICAoVElNX1NNQ1JfVFNfMCB8IFRJTV9TTUNSX1RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMyAoSVRSMykgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19USTFGX0VEICAgICAgIFRJTV9TTUNSX1RTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVEkxIEVkZ2UgRGV0ZWN0b3IgKFRJMUZfRUQpICAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RTX1RJMUZQMSAgICAgICAgKFRJTV9TTUNSX1RTXzAgfCBUSU1fU01DUl9UU18yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxIChUSTFGUDEpICAgICAgICAqLworI2RlZmluZSBUSU1fVFNfVEkyRlAyICAgICAgICAoVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZpbHRlcmVkIFRpbWVyIElucHV0IDIgKFRJMkZQMikgICAgICAgICovCisjZGVmaW5lIFRJTV9UU19FVFJGICAgICAgICAgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMSB8IFRJTV9TTUNSX1RTXzIpICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgRXh0ZXJuYWwgVHJpZ2dlciBpbnB1dCAoRVRSRikgKi8KKyNkZWZpbmUgVElNX1RTX05PTkUgICAgICAgICAgMHgwMDAwRkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyB0cmlnZ2VyIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fVHJpZ2dlcl9Qb2xhcml0eSBUSU0gVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfSU5WRVJURUQgICAgICAgICAgIFRJTV9FVFJQT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggdHJpZ2dlciBzb3VyY2VzICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIFRJTV9FVFJQT0xBUklUWV9OT05JTlZFUlRFRCAgICAgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIEVUUnggdHJpZ2dlciBzb3VyY2VzICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9SSVNJTkcgICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfRkFMTElORyAgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisjZGVmaW5lIFRJTV9UUklHR0VSUE9MQVJJVFlfQk9USEVER0UgICAgICAgICAgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRSAgICAgIC8qITwgUG9sYXJpdHkgZm9yIFRJeEZQeCBvciBUSTFfRUQgdHJpZ2dlciBzb3VyY2VzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9UcmlnZ2VyX1ByZXNjYWxlciBUSU0gVHJpZ2dlciBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVYxICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAvKiE8IE5vIHByZXNjYWxlciBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjIgICAgICAgICAgICAgVElNX0VUUlBSRVNDQUxFUl9ESVYyICAgICAgICAgICAgIC8qITwgUHJlc2NhbGVyIGZvciBFeHRlcm5hbCBFVFIgVHJpZ2dlcjogQ2FwdHVyZSBwZXJmb3JtZWQgb25jZSBldmVyeSAyIGV2ZW50cy4gKi8KKyNkZWZpbmUgVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWNCAgICAgICAgICAgICBUSU1fRVRSUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgLyohPCBQcmVzY2FsZXIgZm9yIEV4dGVybmFsIEVUUiBUcmlnZ2VyOiBDYXB0dXJlIHBlcmZvcm1lZCBvbmNlIGV2ZXJ5IDQgZXZlbnRzLiAqLworI2RlZmluZSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgIFRJTV9FVFJQUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAvKiE8IFByZXNjYWxlciBmb3IgRXh0ZXJuYWwgRVRSIFRyaWdnZXI6IENhcHR1cmUgcGVyZm9ybWVkIG9uY2UgZXZlcnkgOCBldmVudHMuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9USTFfU2VsZWN0aW9uIFRJTSBUSTEgSW5wdXQgU2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9DSDEgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgVElNeF9DSDEgcGluIGlzIGNvbm5lY3RlZCB0byBUSTEgaW5wdXQgKi8KKyNkZWZpbmUgVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTiAgICBUSU1fQ1IyX1RJMVMgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgVEkxIGlucHV0IChYT1IgY29tYmluYXRpb24pICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9ETUFfQnVyc3RfTGVuZ3RoIFRJTSBETUEgQnVyc3QgTGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzFUUkFOU0ZFUiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxIHJlZ2lzdGVyIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMlRSQU5TRkVSUyAgICAgIDB4MDAwMDAxMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDIgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8zVFJBTlNGRVJTICAgICAgMHgwMDAwMDIwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzRUUkFOU0ZFUlMgICAgICAweDAwMDAwMzAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA0IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfNVRSQU5TRkVSUyAgICAgIDB4MDAwMDA0MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF82VFJBTlNGRVJTICAgICAgMHgwMDAwMDUwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gNiByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzdUUkFOU0ZFUlMgICAgICAweDAwMDAwNjAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byA3IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfOFRSQU5TRkVSUyAgICAgIDB4MDAwMDA3MDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDggcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF85VFJBTlNGRVJTICAgICAgMHgwMDAwMDgwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gOSByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEwVFJBTlNGRVJTICAgICAweDAwMDAwOTAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMCByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTFUUkFOU0ZFUlMgICAgIDB4MDAwMDBBMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDExIHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xMlRSQU5TRkVSUyAgICAgMHgwMDAwMEIwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTIgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzEzVFJBTlNGRVJTICAgICAweDAwMDAwQzAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxMyByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTRUUkFOU0ZFUlMgICAgIDB4MDAwMDBEMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE0IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xNVRSQU5TRkVSUyAgICAgMHgwMDAwMEUwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTUgcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKyNkZWZpbmUgVElNX0RNQUJVUlNUTEVOR1RIXzE2VFJBTlNGRVJTICAgICAweDAwMDAwRjAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgdHJhbnNmZXIgaXMgZG9uZSB0byAxNiByZWdpc3RlcnMgc3RhcnRpbmcgdHJvbSBUSU14X0NSMSArIFRJTXhfRENSLkRCQSAqLworI2RlZmluZSBUSU1fRE1BQlVSU1RMRU5HVEhfMTdUUkFOU0ZFUlMgICAgIDB4MDAwMDEwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0cmFuc2ZlciBpcyBkb25lIHRvIDE3IHJlZ2lzdGVycyBzdGFydGluZyB0cm9tIFRJTXhfQ1IxICsgVElNeF9EQ1IuREJBICovCisjZGVmaW5lIFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUyAgICAgMHgwMDAwMTEwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIHRyYW5zZmVyIGlzIGRvbmUgdG8gMTggcmVnaXN0ZXJzIHN0YXJ0aW5nIHRyb20gVElNeF9DUjEgKyBUSU14X0RDUi5EQkEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0hhbmRsZV9pbmRleCBUSU0gRE1BIEhhbmRsZSBJbmRleAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9ETUFfSURfVVBEQVRFICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMCkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBVcGRhdGUgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0MxICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwMSkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DQzIgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDAyKSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX0NDMyAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDMpICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3RzICovCisjZGVmaW5lIFRJTV9ETUFfSURfQ0M0ICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpIDB4MDAwNCkgICAgICAgLyohPCBJbmRleCBvZiB0aGUgRE1BIGhhbmRsZSB1c2VkIGZvciBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdHMgKi8KKyNkZWZpbmUgVElNX0RNQV9JRF9DT01NVVRBVElPTiAgICAgICAgICAgKCh1aW50MTZfdCkgMHgwMDA1KSAgICAgICAvKiE8IEluZGV4IG9mIHRoZSBETUEgaGFuZGxlIHVzZWQgZm9yIENvbW11dGF0aW9uIERNQSByZXF1ZXN0cyAqLworI2RlZmluZSBUSU1fRE1BX0lEX1RSSUdHRVIgICAgICAgICAgICAgICAoKHVpbnQxNl90KSAweDAwMDYpICAgICAgIC8qITwgSW5kZXggb2YgdGhlIERNQSBoYW5kbGUgdXNlZCBmb3IgVHJpZ2dlciBETUEgcmVxdWVzdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ2hhbm5lbF9DQ19TdGF0ZSBUSU0gQ2FwdHVyZS9Db21wYXJlIENoYW5uZWwgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQ0N4X0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IG9yIG91dHB1dCBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDeF9ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBvciBvdXRwdXQgY2hhbm5lbCBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fQ0N4Tl9FTkFCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgaXMgZW5hYmxlZCAqLworI2RlZmluZSBUSU1fQ0N4Tl9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgaXMgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fQnJlYWtfU3lzdGVtIFRJTSBCcmVhayBTeXN0ZW0KKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX0VDQyAgICAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0VDQ0wgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBFQ0MgZXJyb3Igc2lnbmFsIHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3ICovCisjZGVmaW5lIFRJTV9CUkVBS19TWVNURU1fUFZEICAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfUFZETCAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFBWRCBjb25uZWN0aW9uIHdpdGggVElNMS84LzE1LzE2LzE3IEJyZWFrIElucHV0IGFuZCBhbHNvIHRoZSBQVkRFIGFuZCBQTFMgYml0cyBvZiB0aGUgUG93ZXIgQ29udHJvbCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgVElNX0JSRUFLX1NZU1RFTV9TUkFNMl9QQVJJVFlfRVJST1IgIFNZU0NGR19DRkdSMl9TUEwgICAgLyohPCBFbmFibGVzIGFuZCBsb2NrcyB0aGUgU1JBTTJfUEFSSVRZIGVycm9yIHNpZ25hbCB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvOC8xNS8xNi8xNyAqLworI2RlZmluZSBUSU1fQlJFQUtfU1lTVEVNX0xPQ0tVUCAgICAgICAgICAgICAgU1lTQ0ZHX0NGR1IyX0NMTCAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgb3V0cHV0IG9mIENvcnRleE00IHdpdGggQnJlYWsgSW5wdXQgb2YgVElNMS84LzE1LzE2LzE3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX01hY3JvcyBUSU0gRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgVElNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX1RJTV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSAgICAgICAgICAgICA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk9DX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlBXTV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+T25lUHVsc2VfTXNwRGVJbml0Q2FsbGJhY2sgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgID0gTlVMTDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgICA9IE5VTEw7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBfX0hBTF9USU1fUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjF8PShUSU1fQ1IxX0NFTikpCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX01PRV9FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFJ8PShUSU1fQkRUUl9NT0UpKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFKF9fSEFORExFX18pIFwKKyAgZG8geyBcCisgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVUwpIFwKKyAgICB7IFwKKyAgICAgIGlmKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFVMKSBcCisgICAgICB7IFwKKyAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4oVElNX0NSMV9DRU4pOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlIFRoZSBNYWluIE91dHB1dCBFbmFibGUgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCBvbmx5IGlmIGFsbCB0aGUgQ0N4IGFuZCBDQ3hOIGNoYW5uZWxzIGhhdmUgYmVlbiBkaXNhYmxlZAorICAqLworI2RlZmluZSBfX0hBTF9USU1fTU9FX0RJU0FCTEUoX19IQU5ETEVfXykgXAorICBkbyB7IFwKKyAgICBpZiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hFX01BU0spID09IDBVTCkgXAorICAgIHsgXAorICAgICAgaWYoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hORV9NQVNLKSA9PSAwVUwpIFwKKyAgICAgIHsgXAorICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5CRFRSICY9IH4oVElNX0JEVFJfTU9FKTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUaGUgTWFpbiBPdXRwdXQgRW5hYmxlIG9mIGEgdGltZXIgaW5zdGFuY2UgaXMgZGlzYWJsZWQgdW5jb25kaXRpb25hbGx5CisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRElTQUJMRV9VTkNPTkRJVElPTkFMTFkoX19IQU5ETEVfXykgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgJj0gfihUSU1fQkRUUl9NT0UpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVVBEQVRFOiBVcGRhdGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzE6ICAgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzI6ICBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMzogIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0M0OiAgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DT006ICAgQ29tbXV0YXRpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9UUklHR0VSOiBUcmlnZ2VyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQlJFQUs6IEJyZWFrIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICY9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGVuYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVXBkYXRlIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiAgIENvbW11dGF0aW9uIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVFJJR0dFUjogVHJpZ2dlciBETUEgcmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fRU5BQkxFX0RNQShfX0hBTkRMRV9fLCBfX0RNQV9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSIHw9IChfX0RNQV9fKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERNQSByZXF1ZXN0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFRJTSBIYW5kbGUuCisgICogQHBhcmFtICBfX0RNQV9fIHNwZWNpZmllcyB0aGUgVElNIERNQSByZXF1ZXN0IHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9VUERBVEU6IFVwZGF0ZSBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogICBDb21tdXRhdGlvbiBETUEgcmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRyaWdnZXIgRE1BIHJlcXVlc3QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfRE1BKF9fSEFORExFX18sIF9fRE1BX18pICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+RElFUiAmPSB+KF9fRE1BX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBUSU0gaW50ZXJydXB0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVElNIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzE6IENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDMjogQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQ0MzOiBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzQ6IENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNTogQ29tcGFyZSA1IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NDNjogQ29tcGFyZSA2IGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0NPTTogIENvbW11dGF0aW9uIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0ZMQUdfQlJFQUs6IEJyZWFrIGludGVycnVwdCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFRJTV9GTEFHX0JSRUFLMjogQnJlYWsgMiBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19TWVNURU1fQlJFQUs6IFN5c3RlbSBCcmVhayBpbnRlcnJ1cHQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzFPRjogQ2FwdHVyZS9Db21wYXJlIDEgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzJPRjogQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzNPRjogQ2FwdHVyZS9Db21wYXJlIDMgb3ZlcmNhcHR1cmUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBUSU1fRkxBR19DQzRPRjogQ2FwdHVyZS9Db21wYXJlIDQgb3ZlcmNhcHR1cmUgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoVFJVRSBvciBGQUxTRSkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRJTSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1VQREFURTogVXBkYXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MxOiAgIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MyOiAgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzM6ICBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDNDogIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ09NOiAgIENvbW11dGF0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfVFJJR0dFUjogVHJpZ2dlciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0JSRUFLOiBCcmVhayBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBzdGF0ZSBvZiBUSU1fSVQgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJiAoX19JTlRFUlJVUFRfXykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgQ2xlYXIgdGhlIFRJTSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9VUERBVEU6IFVwZGF0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMTogICBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NDMjogIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBUSU1fSVRfQ0MzOiAgQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9DQzQ6ICBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX0NPTTogICBDb21tdXRhdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lUX1RSSUdHRVI6IFRyaWdnZXIgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9CUkVBSzogQnJlYWsgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9DTEVBUl9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9IH4oX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBUSU0gQ291bnRlciBpcyB1c2VkIGFzIGRvd25jb3VudGVyLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgRmFsc2UgKENvdW50ZXIgdXNlZCBhcyB1cGNvdW50ZXIpIG9yIFRydWUgKENvdW50ZXIgdXNlZCBhcyBkb3duY291bnRlcikKKyAgKiBAbm90ZSBUaGlzIG1hY3JvIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8gZ2V0IHRoZSBjb3VudGluZyBtb2RlIHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIENlbnRlci1hbGlnbmVkIG1vZGUgb3IgRW5jb2RlcgorbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0lTX1RJTV9DT1VOVElOR19ET1dOKF9fSEFORExFX18pICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYoVElNX0NSMV9ESVIpKSA9PSAoVElNX0NSMV9ESVIpKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIFByZXNjYWxlciBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19QUkVTQ19fIHNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIG5ldyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIoX19IQU5ETEVfXywgX19QUkVTQ19fKSAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UFNDID0gKF9fUFJFU0NfXykpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DT1VOVEVSX18gc3BlY2lmaWVzIHRoZSBDb3VudGVyIHJlZ2lzdGVyIG5ldyB2YWx1ZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DT1VOVEVSKF9fSEFORExFX18sIF9fQ09VTlRFUl9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNOVCA9IChfX0NPVU5URVJfXykpCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUSU0gQ291bnRlciBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoVElNeF9DTlQpCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09VTlRFUihfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNOVCkKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nIGFub3RoZXIgdGltZSBhbnkgSW5pdCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQVVUT1JFTE9BRF9fIHNwZWNpZmllcyB0aGUgQ291bnRlciByZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fLCBfX0FVVE9SRUxPQURfXykgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkFSUiA9IChfX0FVVE9SRUxPQURfXyk7ICBcCisgICAgKF9fSEFORExFX18pLT5Jbml0LlBlcmlvZCA9IChfX0FVVE9SRUxPQURfXyk7ICAgIFwKKyAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIEF1dG9yZWxvYWQgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIDE2LWJpdCBvciAzMi1iaXQgdmFsdWUgb2YgdGhlIHRpbWVyIGF1dG8tcmVsb2FkIHJlZ2lzdGVyKFRJTXhfQVJSKQorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIGFueSBJbml0IGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DS0RfXyBzcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uIHZhbHVlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZToKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjI6IHREVFM9Mip0Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQ6IHREVFM9NCp0Q0tfSU5UCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ0xPQ0tESVZJU0lPTihfX0hBTkRMRV9fLCBfX0NLRF9fKSBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH5USU1fQ1IxX0NLRCk7ICBcCisgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0NLRF9fKTsgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja0RpdmlzaW9uID0gKF9fQ0tEX18pOyAgIFwKKyAgfSB3aGlsZSgwKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIENsb2NrIERpdmlzaW9uIHZhbHVlIG9uIHJ1bnRpbWUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHJldHZhbCBUaGUgY2xvY2sgZGl2aXNpb24gY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NMT0NLRElWSVNJT05fRElWMTogdERUUz10Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjI6IHREVFM9Mip0Q0tfSU5UCisgICogICAgICAgICAgICBAYXJnIFRJTV9DTE9DS0RJVklTSU9OX0RJVjQ6IHREVFM9NCp0Q0tfSU5UCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ0xPQ0tESVZJU0lPTihfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIFRJTV9DUjFfQ0tEKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIElucHV0IENhcHR1cmUgcHJlc2NhbGVyIG9uIHJ1bnRpbWUgd2l0aG91dCBjYWxsaW5nIGFub3RoZXIgdGltZSBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWwoKSBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIF9fSUNQU0NfXyBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmU0IHByZXNjYWxlciBuZXcgdmFsdWUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fU0VUX0lDUFJFU0NBTEVSKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0lDUFNDX18pIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgXAorICAgIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXyksIChfX0lDUFNDX18pKTsgXAorICB9IHdoaWxlKDApCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IGdldCBpbnB1dCBjYXB0dXJlIDEgcHJlc2NhbGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IGdldCBpbnB1dCBjYXB0dXJlIDIgcHJlc2NhbGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBpbnB1dCBjYXB0dXJlIDMgcHJlc2NhbGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IGdldCBpbnB1dCBjYXB0dXJlIDQgcHJlc2NhbGVyIHZhbHVlCisgICogQHJldHZhbCBUaGUgaW5wdXQgY2FwdHVyZSBwcmVzY2FsZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cworICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX0lDUFJFU0NBTEVSKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJiBUSU1fQ0NNUjFfSUMxUFNDKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0lDMlBTQykgPj4gOFUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmIFRJTV9DQ01SMl9JQzNQU0MpIDpcCisgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0lDNFBTQykpID4+IDhVKQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyBhbm90aGVyIHRpbWUgQ29uZmlnQ2hhbm5lbCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHBhcmFtICBfX0NPTVBBUkVfXyBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZSByZWdpc3RlciBuZXcgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19DT01QQVJFX18pIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEgPSAoX19DT01QQVJFX18pKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMiA9IChfX0NPTVBBUkVfXykpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjQgPSAoX19DT01QQVJFX18pKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNSA9IChfX0NPTVBBUkVfXykpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNiA9IChfX0NPTVBBUkVfXykpKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgVElNIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXB0dXJlIGNvbXBhcmUgcmVnaXN0ZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBnZXQgY2FwdHVyZS9jb21wYXJlIDEgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogZ2V0IGNhcHR1cmUvY29tcGFyZSAyIHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IGdldCBjYXB0dXJlL2NvbXBhcmUgMyByZWdpc3RlciB2YWx1ZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBnZXQgY2FwdHVyZS9jb21wYXJlIDQgcmVnaXN0ZXIgdmFsdWUKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogZ2V0IGNhcHR1cmUvY29tcGFyZSA1IHJlZ2lzdGVyIHZhbHVlCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IGdldCBjYXB0dXJlL2NvbXBhcmUgNiByZWdpc3RlciB2YWx1ZQorICAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIHJlZ2lzdGVyIChUSU14X0NDUnkpCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09NUEFSRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNCkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNikpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9FTkFCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMVBFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DM1BFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgfD0gVElNX0NDTVIyX09DNFBFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNVBFKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzZQRSkpCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFRJTSBPdXRwdXQgY29tcGFyZSBwcmVsb2FkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MxUEUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DM1BFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjJfT0M0UEUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzVQRSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzZQRSkpCisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAbm90ZSAgV2hlbiB0aGUgVVJTIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIgaXMgc2V0LCBvbmx5IGNvdW50ZXIKKyAgKiAgICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZgorICAqICAgICAgICBlbmFibGVkKQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fVVJTX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMXw9IFRJTV9DUjFfVVJTKQorCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAbm90ZSAgV2hlbiB0aGUgVVJTIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIgaXMgcmVzZXQsIGFueSBvZiB0aGUKKyAgKiAgICAgICAgZm9sbG93aW5nIGV2ZW50cyBnZW5lcmF0ZSBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IChpZgorICAqICAgICAgICBlbmFibGVkKToKKyAgKiAgICAgICAgICAgXyBDb3VudGVyIG92ZXJmbG93IHVuZGVyZmxvdworICAqICAgICAgICAgICBfIFNldHRpbmcgdGhlIFVHIGJpdAorICAqICAgICAgICAgICBfIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9USU1fVVJTX0RJU0FCTEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEmPX5USU1fQ1IxX1VSUykKKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDYXB0dXJlIHggaW5wdXQgcG9sYXJpdHkgb24gcnVudGltZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIF9fUE9MQVJJVFlfXyBQb2xhcml0eSBmb3IgVEl4IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfUklTSU5HOiBSaXNpbmcgRWRnZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fSU5QVVRDSEFOTkVMUE9MQVJJVFlfRkFMTElORzogRmFsbGluZyBFZGdlCisgICogICAgICAgICAgICBAYXJnIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9CT1RIRURHRTogUmlzaW5nIGFuZCBGYWxsaW5nIEVkZ2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fUE9MQVJJVFlfXykgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVElNX1JFU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgICAgICAgICAgICAgIFwKKyAgICBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXyksIChfX1BPTEFSSVRZX18pKTsgXAorICB9d2hpbGUoMCkKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0NvbnN0YW50cyBUSU0gUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogVGhlIGNvdW50ZXIgb2YgYSB0aW1lciBpbnN0YW5jZSBpcyBkaXNhYmxlZCBvbmx5IGlmIGFsbCB0aGUgQ0N4IGFuZCBDQ3hOCisgICBjaGFubmVscyBoYXZlIGJlZW4gZGlzYWJsZWQgKi8KKyNkZWZpbmUgVElNX0NDRVJfQ0N4RV9NQVNLICAoKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFFIHwgVElNX0NDRVJfQ0MyRSB8IFRJTV9DQ0VSX0NDM0UgfCBUSU1fQ0NFUl9DQzRFKSkKKyNkZWZpbmUgVElNX0NDRVJfQ0N4TkVfTUFTSyAoKHVpbnQzMl90KShUSU1fQ0NFUl9DQzFORSB8IFRJTV9DQ0VSX0NDMk5FIHwgVElNX0NDRVJfQ0MzTkUpKQorLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBwcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX01hY3JvcyBUSU0gUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9TT1VSQ0UoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFNPVVJDRV9DT01QMikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0NMRUFSSU5QVVRTT1VSQ0VfTk9ORSkpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9CQVNFKF9fQkFTRV9fKSAoKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ1IyKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU01DUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRElFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU1IpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRUdSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NFUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ05UKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfUFNDKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQVJSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfUkNSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQkRUUikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfT1IpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NNUjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYyKSkKKworI2RlZmluZSBJU19USU1fRVZFTlRfU09VUkNFKF9fU09VUkNFX18pICgoKChfX1NPVVJDRV9fKSAmIDB4RkZGRkZFMDBVKSA9PSAweDAwMDAwMDAwVSkgJiYgKChfX1NPVVJDRV9fKSAhPSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX0NPVU5URVJfTU9ERShfX01PREVfXykgICAgICAoKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX1VQKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfRE9XTikgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0NPVU5URVJNT0RFX0NFTlRFUkFMSUdORUQyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDMpKQorCisjZGVmaW5lIElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihfX0RJVl9fKSAgKCgoX19ESVZfXykgPT0gVElNX0NMT0NLRElWSVNJT05fRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRElWX18pID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0KSkKKworI2RlZmluZSBJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKFBSRUxPQUQpICgoKFBSRUxPQUQpID09IFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBSRUxPQUQpID09IFRJTV9BVVRPUkVMT0FEX1BSRUxPQURfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fRkFTVF9TVEFURShfX1NUQVRFX18pICAgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09DRkFTVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVEFURV9fKSA9PSBUSU1fT0NGQVNUX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX09DX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9PQ1BPTEFSSVRZX0hJR0gpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9PQ1BPTEFSSVRZX0xPVykpCisKKyNkZWZpbmUgSVNfVElNX09DTl9QT0xBUklUWShfX1BPTEFSSVRZX18pICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9PQ05QT0xBUklUWV9ISUdIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fT0NOUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19USU1fT0NJRExFX1NUQVRFKF9fU1RBVEVfXykgICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09DSURMRVNUQVRFX1NFVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX09DSURMRVNUQVRFX1JFU0VUKSkKKworI2RlZmluZSBJU19USU1fT0NOSURMRV9TVEFURShfX1NUQVRFX18pICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09DTklETEVTVEFURV9TRVQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQpKQorCisjZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9SSVNJTkcpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfRkFMTElORykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19USU1fSUNfU0VMRUNUSU9OKF9fU0VMRUNUSU9OX18pICgoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX0lDU0VMRUNUSU9OX1RSQykpCisKKyNkZWZpbmUgSVNfVElNX0lDX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAoKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9JQ1BTQ19ESVYyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0lDUFNDX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fSUNQU0NfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX09QTV9NT0RFKF9fTU9ERV9fKSAgICAgICAgICAoKChfX01PREVfXykgPT0gVElNX09QTU9ERV9TSU5HTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09QTU9ERV9SRVBFVElUSVZFKSkKKworI2RlZmluZSBJU19USU1fRU5DT0RFUl9NT0RFKF9fTU9ERV9fKSAgICAgICgoKF9fTU9ERV9fKSA9PSBUSU1fRU5DT0RFUk1PREVfVEkxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9FTkNPREVSTU9ERV9USTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX0VOQ09ERVJNT0RFX1RJMTIpKQorCisjZGVmaW5lIElTX1RJTV9ETUFfU09VUkNFKF9fU09VUkNFX18pICgoKChfX1NPVVJDRV9fKSAmIDB4RkZGRjgwRkZVKSA9PSAweDAwMDAwMDAwVSkgJiYgKChfX1NPVVJDRV9fKSAhPSAweDAwMDAwMDAwVSkpCisKKyNkZWZpbmUgSVNfVElNX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfQUxMKSkKKworI2RlZmluZSBJU19USU1fT1BNX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpKQorCisjZGVmaW5lIElTX1RJTV9DT01QTEVNRU5UQVJZX0NIQU5ORUxTKF9fQ0hBTk5FTF9fKSAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tTT1VSQ0UoX19DTE9DS19fKSAoKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIwKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIxKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIyKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9JVFIzKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTFFRCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTEpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9USTIpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLX18pID09IFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMSkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0lOVkVSVEVEKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9OT05JTlZFUlRFRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xPQ0tQT0xBUklUWV9CT1RIRURHRSkpCisKKyNkZWZpbmUgSVNfVElNX0NMT0NLUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fQ0xPQ0tQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMT0NLUFJFU0NBTEVSX0RJVjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9DTE9DS1BSRVNDQUxFUl9ESVY4KSkKKworI2RlZmluZSBJU19USU1fQ0xPQ0tGSUxURVIoX19JQ0ZJTFRFUl9fKSAgICAgICgoX19JQ0ZJTFRFUl9fKSA8PSAweEZVKQorCisjZGVmaW5lIElTX1RJTV9DTEVBUklOUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX0lOVkVSVEVEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fQ0xFQVJJTlBVVFBPTEFSSVRZX05PTklOVkVSVEVEKSkKKworI2RlZmluZSBJU19USU1fQ0xFQVJJTlBVVF9QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX0NMRUFSSU5QVVRQUkVTQ0FMRVJfRElWOCkpCisKKyNkZWZpbmUgSVNfVElNX0NMRUFSSU5QVVRfRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX09TU1JfU1RBVEUoX19TVEFURV9fKSAgICAgICAoKChfX1NUQVRFX18pID09IFRJTV9PU1NSX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX09TU1JfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX09TU0lfU1RBVEUoX19TVEFURV9fKSAgICAgICAoKChfX1NUQVRFX18pID09IFRJTV9PU1NJX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX09TU0lfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0xPQ0tfTEVWRUwoX19MRVZFTF9fKSAgICAgICAoKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfT0ZGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRVZFTF9fKSA9PSBUSU1fTE9DS0xFVkVMXzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVWRUxfXykgPT0gVElNX0xPQ0tMRVZFTF8yKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFVkVMX18pID09IFRJTV9MT0NLTEVWRUxfMykpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLX0ZJTFRFUihfX0JSS0ZJTFRFUl9fKSAoKF9fQlJLRklMVEVSX18pIDw9IDB4RlVMKQorCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLX1NUQVRFKF9fU1RBVEVfXykgICAgICAoKChfX1NUQVRFX18pID09IFRJTV9CUkVBS19FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9CUkVBS19ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBS1BPTEFSSVRZX0xPVykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBS1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX1RJTV9CUkVBSzJfU1RBVEUoX19TVEFURV9fKSAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUsyX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLMl9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUsyX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fQlJFQUsyUE9MQVJJVFlfTE9XKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBSzJQT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19USU1fQVVUT01BVElDX09VVFBVVF9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfVElNX0dST1VQQ0g1KF9fT0NSRUZfXykgKCgoKF9fT0NSRUZfXykgJiAweDFGRkZGRkZGVSkgPT0gMHgwMDAwMDAwMFUpKQorCisjZGVmaW5lIElTX1RJTV9UUkdPX1NPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19SRVNFVCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fVVBEQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DMVJFRikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR09fT0MyUkVGKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHT19PQzNSRUYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPX09DNFJFRikpCisKKyNkZWZpbmUgSVNfVElNX1RSR08yX1NPVVJDRShfX1NPVVJDRV9fKSAoKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfUkVTRVQpICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9FTkFCTEUpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX1VQREFURSkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MxKSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzFSRUYpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DMlJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0MzUkVGKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzNSRUYpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRikgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M1UkVGKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzZSRUYpICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdGQUxMSU5HKSAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M2UkVGX1JJU0lOR0ZBTExJTkcpICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzRSRUZfUklTSU5HX09DNlJFRl9SSVNJTkcpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX1RSR08yX09DNFJFRl9SSVNJTkdfT0M2UkVGX0ZBTExJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fVFJHTzJfT0M1UkVGX1JJU0lOR19PQzZSRUZfUklTSU5HKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IFRJTV9UUkdPMl9PQzVSRUZfUklTSU5HX09DNlJFRl9GQUxMSU5HKSkKKworI2RlZmluZSBJU19USU1fTVNNX1NUQVRFKF9fU1RBVEVfXykgICAgICAoKChfX1NUQVRFX18pID09IFRJTV9NQVNURVJTTEFWRU1PREVfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX01BU1RFUlNMQVZFTU9ERV9ESVNBQkxFKSkKKworI2RlZmluZSBJU19USU1fU0xBVkVfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfRElTQUJMRSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9SRVNFVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9TTEFWRU1PREVfVFJJR0dFUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1NMQVZFTU9ERV9FWFRFUk5BTDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUikpCisKKyNkZWZpbmUgSVNfVElNX1BXTV9NT0RFKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gVElNX09DTU9ERV9QV00xKSAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9QV00yKSAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9DT01CSU5FRF9QV00xKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9DT01CSU5FRF9QV00yKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTIpKQorCisjZGVmaW5lIElTX1RJTV9PQ19NT0RFKF9fTU9ERV9fKSAgKCgoX19NT0RFX18pID09IFRJTV9PQ01PREVfVElNSU5HKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfQUNUSVZFKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfSU5BQ1RJVkUpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfVE9HR0xFKSAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSkgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9PQ01PREVfUkVUUklHRVJSQUJMRV9PUE0yKSkKKworI2RlZmluZSBJU19USU1fVFJJR0dFUl9TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19JVFIxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfSVRSMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0VMRUNUSU9OX18pID09IFRJTV9UU19USTFGX0VEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkxRlAxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfVEkyRlAyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTEVDVElPTl9fKSA9PSBUSU1fVFNfRVRSRikpCisKKyNkZWZpbmUgSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oX19TRUxFQ1RJT05fXykgKCgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX0lUUjMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TRUxFQ1RJT05fXykgPT0gVElNX1RTX05PTkUpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9JTlZFUlRFRCAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfTk9OSU5WRVJURUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBUSU1fVFJJR0dFUlBPTEFSSVRZX1JJU0lORyAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX1RSSUdHRVJQT0xBUklUWV9GQUxMSU5HICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9UUklHR0VSUE9MQVJJVFlfQk9USEVER0UgICApKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSUFJFU0NBTEVSKF9fUFJFU0NBTEVSX18pICgoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gVElNX1RSSUdHRVJQUkVTQ0FMRVJfRElWMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBUSU1fVFJJR0dFUlBSRVNDQUxFUl9ESVY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09IFRJTV9UUklHR0VSUFJFU0NBTEVSX0RJVjgpKQorCisjZGVmaW5lIElTX1RJTV9UUklHR0VSRklMVEVSKF9fSUNGSUxURVJfXykgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX1RJMVNFTEVDVElPTihfX1RJMVNFTEVDVElPTl9fKSAgKCgoX19USTFTRUxFQ1RJT05fXykgPT0gVElNX1RJMVNFTEVDVElPTl9DSDEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USTFTRUxFQ1RJT05fXykgPT0gVElNX1RJMVNFTEVDVElPTl9YT1JDT01CSU5BVElPTikpCisKKyNkZWZpbmUgSVNfVElNX0RNQV9MRU5HVEgoX19MRU5HVEhfXykgICAgICAoKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzJUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfM1RSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF80VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzVUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfNlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF83VFJBTlNGRVJTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MRU5HVEhfXykgPT0gVElNX0RNQUJVUlNUTEVOR1RIXzhUUkFOU0ZFUlMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBUSU1fRE1BQlVSU1RMRU5HVEhfOVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMFRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xMlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xM1RSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNFRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNVRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xNlRSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xN1RSQU5TRkVSUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUykpCisKKyNkZWZpbmUgSVNfVElNX0lDX0ZJTFRFUihfX0lDRklMVEVSX18pICAgKChfX0lDRklMVEVSX18pIDw9IDB4RlUpCisKKyNkZWZpbmUgSVNfVElNX0RFQURUSU1FKF9fREVBRFRJTUVfXykgICAgKChfX0RFQURUSU1FX18pIDw9IDB4RkZVKQorCisjZGVmaW5lIElTX1RJTV9CUkVBS19TWVNURU0oX19DT05GSUdfXykgICAgKCgoX19DT05GSUdfXykgPT0gVElNX0JSRUFLX1NZU1RFTV9FQ0MpICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09ORklHX18pID09IFRJTV9CUkVBS19TWVNURU1fUFZEKSAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NPTkZJR19fKSA9PSBUSU1fQlJFQUtfU1lTVEVNX1NSQU0yX1BBUklUWV9FUlJPUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DT05GSUdfXykgPT0gVElNX0JSRUFLX1NZU1RFTV9MT0NLVVApKQorCisjZGVmaW5lIElTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKF9fVFJJR0dFUl9fKSAoKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9UUklHR0VSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdHRVJfXykgPT0gVElNX1NMQVZFTU9ERV9DT01CSU5FRF9SRVNFVFRSSUdHRVIpKQorCisjZGVmaW5lIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19JQ1BTQ19fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSAoX19JQ1BTQ19fKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSAoX19JQ1BTQ19fKSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSAoKF9fSUNQU0NfXykgPDwgOFUpKSkKKworI2RlZmluZSBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMxUFNDKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMyUFNDKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjJfSUMzUFNDKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX0lDNFBTQykpCisKKyNkZWZpbmUgVElNX1NFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18sIF9fUE9MQVJJVFlfXykgXAorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoX19QT0xBUklUWV9fKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDRVKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDhVKSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9ICgoKF9fUE9MQVJJVFlfXykgPDwgMTJVKSkpKQorCisjZGVmaW5lIFRJTV9SRVNFVF9DQVBUVVJFUE9MQVJJVFkoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpKQorCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5jbHVkZSBUSU0gSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfdGltX2V4LmgiCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFRJTSBUaW1lIEJhc2UgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWUgQmFzZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogVGltZSBCYXNlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0Jhc2VfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fQmFzZV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBUaW1lciBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFRJTSBQV00gZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRJTSBQV00gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFRpbWVyIFBXTSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BXTV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogVGltZXIgSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBUaW1lciBPbmUgUHVsc2UgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPbmVQdWxzZU1vZGUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgVElNIEVuY29kZXIgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBUaW1lciBFbmNvZGVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sICBUSU1fRW5jb2Rlcl9Jbml0VHlwZURlZiAqc0NvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhMiwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKiAgQGJyaWVmICAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICAqIEB7CisgICovCisvKiBJbnRlcnJ1cHQgSGFuZGxlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIQUxfVElNX0lSUUhhbmRsZXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOCBUSU0gUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT0NfSW5pdFR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fSUNfSW5pdFR5cGVEZWYgKnNDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgIHVpbnQzMl90IElucHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqc0NsZWFySW5wdXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVEkxX1NlbGVjdGlvbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsIHVpbnQzMl90ICAqQnVyc3RCdWZmZXIsIHVpbnQzMl90ICBCdXJzdExlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9HZW5lcmF0ZUV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBFdmVudFNvdXJjZSk7Cit1aW50MzJfdCBIQUxfVElNX1JlYWRDYXB0dXJlZFZhbHVlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDkgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGVzIChJbnRlcnJ1cHQgYW5kIERNQSkgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTV9FcnJvckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVElNX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9VblJlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEwIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0Jhc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9PQ19HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX1BXTV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX0lDX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1RJTV9TdGF0ZVR5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgVElNX0Jhc2VfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fQmFzZV9Jbml0VHlwZURlZiAqU3RydWN0dXJlKTsKK3ZvaWQgVElNX1RJMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcik7Cit2b2lkIFRJTV9PQzJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7Cit2b2lkIFRJTV9FVFJfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fRXh0VFJHUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fRXh0VFJHUG9sYXJpdHksIHVpbnQzMl90IEV4dFRSR0ZpbHRlcik7CisKK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFDYXB0dXJlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Cit2b2lkIFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVElNX1Jlc2V0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIHByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3RpbV9leC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfdGltX2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwM2NkMQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX3RpbV9leC5oCkBAIC0wLDAgKzEsMzcxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF90aW1fZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVElNIEhBTCBFeHRlbmRlZCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9USU1fRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1RJTV9FWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNRXgKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9UeXBlcyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fSW5wdXRfQ2FwdHVyZV9QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBJQzFGaWx0ZXI7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgaW5wdXQgY2FwdHVyZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAgYW5kIE1heF9EYXRhID0gMHhGICovCisKKyAgdWludDMyX3QgQ29tbXV0YXRpb25fRGVsYXk7ICAgLyohPCBTcGVjaWZpZXMgdGhlIHB1bHNlIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGICovCit9IFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBCcmVhay9CcmVhazIgaW5wdXQgY29uZmlndXJhdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgU291cmNlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIHRpbWVyIGJyZWFrIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZSAqLworICB1aW50MzJfdCBFbmFibGU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGJyZWFrIGlucHV0IHNvdXJjZSBpcyBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZV9FbmFibGUgKi8KKyAgdWludDMyX3QgUG9sYXJpdHk7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBicmVhayBpbnB1dCBzb3VyY2UgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX1BvbGFyaXR5ICovCit9CitUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKy8qIEVuZCBvZiBleHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0NvbnN0YW50cyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9SZW1hcCBUSU0gRXh0ZW5kZWQgUmVtYXBwaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0dQSU8gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gSS9PICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzFfQVdEMSAgICAgIFRJTTFfT1JfRVRSX0FEQzFfUk1QXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDEgICAgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzFfQVdEMiAgICAgIFRJTTFfT1JfRVRSX0FEQzFfUk1QXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDIgICAgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0FEQzFfQVdEMyAgICAgIChUSU0xX09SX0VUUl9BREMxX1JNUF8wIHwgVElNMV9PUl9FVFJfQURDMV9STVBfMSkgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDMgICAgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAxICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgKi8KKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAyICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQgKi8KKworI2RlZmluZSBUSU1fVElNMV9USTFfR1BJTyAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMSBJbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIEkvMCAgICAgICovCisjZGVmaW5lIFRJTV9USU0xX1RJMV9DT01QMSAgICAgICAgIFRJTTFfT1JfVEkxX1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xIElucHV0IGNhcHR1cmUgMWlzIGNvbm5lY3RlZCB0byBDT01QMSBPVVQgKi8KKworI2RlZmluZSBUSU1fVElNMl9JVFJfTkMgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMiBJbnRlcm5hbCB0cmlnZ2VyIElUUiBpcyBub3QgY29ubmVjdGVkICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0yX0lUUl9VU0IgICAgICAgICAgICBUSU0yX09SX0lUUjFfUk1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0yIEludGVybmFsIHRyaWdnZXIgSVRSIGlzIGNvbm5lY3RlZCB0byBVU0JGUyBTT0YgKi8KKworI2RlZmluZSBUSU1fVElNMl9FVFJfR1BJTyAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMiBFeHRlcm5hbCB0cmlnZ2VyIEVUUiBpcyBjb25uZWN0ZWQgdG8gSS9PICovCisjZGVmaW5lIFRJTV9USU0yX0VUUl9MU0UgICAgICAgICAgICBUSU0yX09SX0VUUl9STVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0yIEV4dGVybmFsIHRyaWdnZXIgRVRSIGlzIGNvbm5lY3RlZCB0byBMU0UgKi8KKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAxICAgICAgICAgIFRJTTJfQUYxX0VUUlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNMl9FVFJfQ09NUDIgICAgICAgICAgVElNMl9BRjFfRVRSU0VMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCAgICAgICAgICovCisKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0dQSU8gICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTJfVEk0IGlzIGNvbm5lY3RlZCB0byBJL08gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMSAgICAgICAgICBUSU0yX09SX1RJNF9STVBfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0yX1RJNCBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgT1VUICAgICAgICAgICAqLworI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDIgICAgICAgICAgVElNMl9PUl9USTRfUk1QXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMl9USTQgaXMgY29ubmVjdGVkIHRvIENPTVAxIE9VVCAgICAgICAgICAgKi8KKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAxX0NPTVAyICAgIChUSU0yX09SX1RJNF9STVBfMCB8IFRJTTJfT1JfVEk0X1JNUF8xKSAgICAgICAgICAgICAgIC8qICE8IFRJTTJfVEk0IGlzIGNvbm5lY3RlZCB0byBDT01QMSBhbmQgQ09NUDIgT1VUICovCisKKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9HUElPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE2X1RJMSBpcyBjb25uZWN0ZWQgdG8gSS9PICAgICAgICovCisjZGVmaW5lIFRJTV9USU0xNl9USTFfTFNJICAgICAgICAgICBUSU0xNl9PUl9USTFfUk1QXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xNl9USTEgaXMgY29ubmVjdGVkIHRvIExTSSBDbG9jayAqLworI2RlZmluZSBUSU1fVElNMTZfVEkxX0xTRSAgICAgICAgICAgVElNMTZfT1JfVEkxX1JNUF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTZfVEkxIGlzIGNvbm5lY3RlZCB0byBMU0UgQ2xvY2sgKi8KKyNkZWZpbmUgVElNX1RJTTE2X1RJMV9SVEMgICAgICAgICAgIChUSU0xNl9PUl9USTFfUk1QXzAgfCBUSU0xNl9PUl9USTFfUk1QXzEpICAgICAgICAgICAgIC8qICE8IFRJTTE2X1RJMSBpcyBjb25uZWN0ZWQgdG8gUlRDICAgICAgICovCisKKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9HUElPICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRJTTE3X1RJMSBpcyBjb25uZWN0ZWQgdG8gSS9PICAgICAgICovCisjZGVmaW5lIFRJTV9USU0xN19USTFfTVNJICAgICAgICAgICBUSU0xN19PUl9USTFfUk1QXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0xN19USTEgaXMgY29ubmVjdGVkIHRvIE1TSSAgICAgICAqLworI2RlZmluZSBUSU1fVElNMTdfVEkxX0hTRSAgICAgICAgICAgVElNMTdfT1JfVEkxX1JNUF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgVElNMTdfVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UvMzIgICAgKi8KKyNkZWZpbmUgVElNX1RJTTE3X1RJMV9NQ08gICAgICAgICAgIChUSU0xN19PUl9USTFfUk1QXzAgfCBUSU0xN19PUl9USTFfUk1QXzEpICAgICAgICAgICAgIC8qICE8IFRJTTE3X1RJMSBpcyBjb25uZWN0ZWQgdG8gTUNPICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0IFRJTSBFeHRlbmRlZCBCcmVhayBpbnB1dAorICAqIEB7CisgICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUX0JSSyAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRpbWVyIGJyZWFrIGlucHV0ICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVF9CUksyICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUaW1lciBicmVhazIgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlIFRJTSBFeHRlbmRlZCBCcmVhayBpbnB1dCBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9CS0lOICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBBbiBleHRlcm5hbCBzb3VyY2UgKEdQSU8pIGlzIGNvbm5lY3RlZCB0byB0aGUgQktJTiBwaW4gICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0NPTVAxICAgIDB4MDAwMDAwMDJVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IFRoZSBDT01QMSBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicmVhayBpbnB1dCAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMiAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUaGUgQ09NUDIgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byB0aGUgYnJlYWsgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfQnJlYWtfSW5wdXRfU291cmNlX0VuYWJsZSBUSU0gRXh0ZW5kZWQgQnJlYWsgaW5wdXQgc291cmNlIGVuYWJsaW5nCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0JSRUFLSU5QVVRTT1VSQ0VfRElTQUJMRSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogITwgQnJlYWsgaW5wdXQgc291cmNlIGlzIGRpc2FibGVkICovCisjZGVmaW5lIFRJTV9CUkVBS0lOUFVUU09VUkNFX0VOQUJMRSAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IEJyZWFrIGlucHV0IHNvdXJjZSBpcyBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0JyZWFrX0lucHV0X1NvdXJjZV9Qb2xhcml0eSBUSU0gRXh0ZW5kZWQgQnJlYWsgaW5wdXQgcG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9MT1cgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWV9ISUdIICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBCcmVhayBpbnB1dCBzb3VyY2UgaXMgYWN0aXZlX2hpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9NYWNyb3MgVElNIEV4dGVuZGVkIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX01hY3JvcyBUSU0gRXh0ZW5kZWQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19USU1fUkVNQVAoX19JTlNUQU5DRV9fLCBfX1JFTUFQX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKChfX0lOU1RBTkNFX18pID09IFRJTTEpICAmJiAoKCgoX19SRU1BUF9fKSAmIDB4RkZGRTNGRUNVKSA9PSAweDAwMDAwMDAwVSkpKSAgXAorICAgICAgICB8fCAoKChfX0lOU1RBTkNFX18pID09IFRJTTIpICAmJiAoKCgoX19SRU1BUF9fKSAmIDB4RkZGRTNGRjBVKSA9PSAweDAwMDAwMDAwVSkpKSAgXAorICAgICAgICB8fCAoKChfX0lOU1RBTkNFX18pID09IFRJTTE2KSAmJiAoKCgoX19SRU1BUF9fKSAmIDB4RkZGRkZGRkNVKSA9PSAweDAwMDAwMDAwVSkpKSAgXAorICAgICAgICB8fCAoKChfX0lOU1RBTkNFX18pID09IFRJTTE3KSAmJiAoKCgoX19SRU1BUF9fKSAmIDB4RkZGRkZGRkNVKSA9PSAweDAwMDAwMDAwVSkpKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtJTlBVVChfX0JSRUFLSU5QVVRfXykgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCgoX19CUkVBS0lOUFVUX18pID09IFRJTV9CUkVBS0lOUFVUX0JSSykgIHx8IFwKKyAgICAgICAgICAgKChfX0JSRUFLSU5QVVRfXykgPT0gVElNX0JSRUFLSU5QVVRfQlJLMikpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKF9fU09VUkNFX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX0JLSU4pICB8fCBcCisgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDEpIHx8IFwKKyAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9DT01QMikpCisKKyNkZWZpbmUgSVNfVElNX0JSRUFLSU5QVVRTT1VSQ0VfU1RBVEUoX19TVEFURV9fKSAgICAgICAgICAgICBcCisgICAgICAgICAgKCgoX19TVEFURV9fKSA9PSBUSU1fQlJFQUtJTlBVVFNPVVJDRV9ESVNBQkxFKSAgfHwgXAorICAgICAgICAgICAoKF9fU1RBVEVfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfRU5BQkxFKSkKKworI2RlZmluZSBJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKChfX1BPTEFSSVRZX18pID09IFRJTV9CUkVBS0lOUFVUU09VUkNFX1BPTEFSSVRZX0xPVykgIHx8IFwKKyAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0JSRUFLSU5QVVRTT1VSQ0VfUE9MQVJJVFlfSElHSCkpCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgcHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmICpzQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKK3ZvaWQgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisKKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CisvKiBOb24tQmxvY2tpbmcgbW9kZTogRE1BICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CisKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKworLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworCisvKiBOb24tQmxvY2tpbmcgbW9kZTogSW50ZXJydXB0ICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKTsKKy8qIE5vbi1CbG9ja2luZyBtb2RlOiBETUEgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJsb2NraW5nIG1vZGU6IFBvbGxpbmcgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKKworLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDUgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIENvbW11dGF0aW9uU291cmNlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfTWFzdGVyQ29uZmlnU3luY2hyb25pemF0aW9uKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZiAqc01hc3RlckNvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtEZWFkVGltZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9CcmVha0RlYWRUaW1lQ29uZmlnVHlwZURlZiAqc0JyZWFrRGVhZFRpbWVDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZiAqc0JyZWFrSW5wdXRDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0dyb3VwQ2hhbm5lbDUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWxzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXApOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEV4dGVuZGVkIENhbGxiYWNrICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7Cit2b2lkIEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKK3ZvaWQgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOwordm9pZCBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogRXh0ZW5kZWQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFbmQgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTUV4IFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIHByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9USU1fRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfdHNjLmggYi9JbmMvc3RtMzJ3Ynh4X2hhbF90c2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUwYzdlCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfdHNjLmgKQEAgLTAsMCArMSw3NjEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3RzYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBUU0MgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1RTQ19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfVFNDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUU0MKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfVHlwZXMgVFNDIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFRTQyBzdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9UU0NfU1RBVEVfUkVTRVQgID0gMHgwMFVMLCAvKiE8IFRTQyByZWdpc3RlcnMgaGF2ZSB0aGVpciByZXNldCB2YWx1ZSAqLworICBIQUxfVFNDX1NUQVRFX1JFQURZICA9IDB4MDFVTCwgLyohPCBUU0MgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZCBvciBhY3F1aXNpdGlvbiBpcyBjb21wbGV0ZWQgd2l0aCBzdWNjZXNzICovCisgIEhBTF9UU0NfU1RBVEVfQlVTWSAgID0gMHgwMlVMLCAvKiE8IFRTQyBpbml0aWFsaXphdGlvbiBvciBhY3F1aXNpdGlvbiBpcyBvbi1nb2luZyAqLworICBIQUxfVFNDX1NUQVRFX0VSUk9SICA9IDB4MDNVTCAgLyohPCBBY3F1aXNpdGlvbiBpcyBjb21wbGV0ZWQgd2l0aCBtYXggY291bnQgZXJyb3IgKi8KK30gSEFMX1RTQ19TdGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBUU0MgZ3JvdXAgc3RhdHVzIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVFNDX0dST1VQX09OR09JTkcgICA9IDB4MDBVTCwgLyohPCBBY3F1aXNpdGlvbiBvbiBncm91cCBpcyBvbi1nb2luZyBvciBub3Qgc3RhcnRlZCAqLworICBUU0NfR1JPVVBfQ09NUExFVEVEID0gMHgwMVVMIC8qITwgQWNxdWlzaXRpb24gb24gZ3JvdXAgaXMgY29tcGxldGVkIHdpdGggc3VjY2VzcyAobm8gbWF4IGNvdW50IGVycm9yKSAqLworfSBUU0NfR3JvdXBTdGF0dXNUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgVFNDIGluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENUUHVsc2VIaWdoTGVuZ3RoOyAgICAgICAvKiE8IENoYXJnZS10cmFuc2ZlciBoaWdoIHB1bHNlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlSExfQ29uZmlnICAqLworICB1aW50MzJfdCBDVFB1bHNlTG93TGVuZ3RoOyAgICAgICAgLyohPCBDaGFyZ2UtdHJhbnNmZXIgbG93IHB1bHNlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19DVFB1bHNlTExfQ29uZmlnICAqLworICBGdW5jdGlvbmFsU3RhdGUgU3ByZWFkU3BlY3RydW07ICAgLyohPCBTcHJlYWQgc3BlY3RydW0gYWN0aXZhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworICB1aW50MzJfdCBTcHJlYWRTcGVjdHJ1bURldmlhdGlvbjsgLyohPCBTcHJlYWQgc3BlY3RydW0gZGV2aWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMTI3ICovCisgIHVpbnQzMl90IFNwcmVhZFNwZWN0cnVtUHJlc2NhbGVyOyAvKiE8IFNwcmVhZCBzcGVjdHJ1bSBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfU3ByZWFkU3BlY19QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXI7IC8qITwgUHVsc2UgZ2VuZXJhdG9yIHByZXNjYWxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19QdWxzZUdlbmVyYXRvcl9QcmVzY2FsZXIgKi8KKyAgdWludDMyX3QgTWF4Q291bnRWYWx1ZTsgICAgICAgICAgIC8qITwgTWF4IGNvdW50IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX01heENvdW50X1ZhbHVlICAqLworICB1aW50MzJfdCBJT0RlZmF1bHRNb2RlOyAgICAgICAgICAgLyohPCBJTyBkZWZhdWx0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUU0NfSU9fRGVmYXVsdF9Nb2RlICAqLworICB1aW50MzJfdCBTeW5jaHJvUGluUG9sYXJpdHk7ICAgICAgLyohPCBTeW5jaHJvIHBpbiBwb2xhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRTQ19TeW5jaHJvX1Bpbl9Qb2xhcml0eSAqLworICB1aW50MzJfdCBBY3F1aXNpdGlvbk1vZGU7ICAgICAgICAgLyohPCBBY3F1aXNpdGlvbiBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVFNDX0FjcXVpc2l0aW9uX01vZGUgICovCisgIEZ1bmN0aW9uYWxTdGF0ZSBNYXhDb3VudEludGVycnVwdDsvKiE8IE1heCBjb3VudCBpbnRlcnJ1cHQgYWN0aXZhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIEVOQUJMRSBvciBESVNBQkxFLiAqLworICB1aW50MzJfdCBDaGFubmVsSU9zOyAgICAgICAgICAgICAgLyohPCBDaGFubmVsIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNoaWVsZElPczsgICAgICAgICAgICAgICAvKiE8IFNoaWVsZCBJT3MgbWFzayAqLworICB1aW50MzJfdCBTYW1wbGluZ0lPczsgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBJT3MgbWFzayAqLworfSBUU0NfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiBUU0MgSU9zIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENoYW5uZWxJT3M7ICAvKiE8IENoYW5uZWwgSU9zIG1hc2sgKi8KKyAgdWludDMyX3QgU2hpZWxkSU9zOyAgIC8qITwgU2hpZWxkIElPcyBtYXNrICovCisgIHVpbnQzMl90IFNhbXBsaW5nSU9zOyAvKiE8IFNhbXBsaW5nIElPcyBtYXNrICovCit9IFRTQ19JT0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVFNDIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QgX19UU0NfSGFuZGxlVHlwZURlZgoreworICBUU0NfVHlwZURlZiAgICAgICAgICAgICAgICpJbnN0YW5jZTsgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgKi8KKyAgVFNDX0luaXRUeXBlRGVmICAgICAgICAgICBJbml0OyAgICAgICAvKiE8IEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgICovCisgIF9fSU8gSEFMX1RTQ19TdGF0ZVR5cGVEZWYgU3RhdGU7ICAgICAgLyohPCBQZXJpcGhlcmFsIHN0YXRlICAgICAgICAgICAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgIExvY2s7ICAgICAgIC8qITwgTG9jayBmZWF0dXJlICAgICAgICAgICAgICAgKi8KKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICBFcnJvckNvZGU7ICAvKiE8IEkyQyBFcnJvciBjb2RlICAgICAgICAgICAgICovCisKKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogQ29udkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgIC8qITwgVFNDIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgICAgIC8qITwgVFNDIEVycm9yIGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1RTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsgICAgLyohPCBUU0MgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAgLyohPCBUU0MgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgKi8KKworI2VuZGlmICAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gVFNDX0hhbmRsZVR5cGVEZWY7CisKK2VudW0KK3sKKyAgVFNDX0dST1VQMV9JRFggPSAweDAwVUwsCisgIFRTQ19HUk9VUDJfSURYLAorICBUU0NfR1JPVVAzX0lEWCwKKyAgVFNDX0dST1VQNF9JRFgsCisgIFRTQ19HUk9VUDVfSURYLAorICBUU0NfR1JPVVA2X0lEWCwKKyAgVFNDX0dST1VQN19JRFgsCisgIFRTQ19OQl9PRl9HUk9VUFMKK307CisKKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBUU0MgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9UU0NfQ09OVl9DT01QTEVURV9DQl9JRCAgICAgICAgICAgPSAweDAwVUwsICAvKiE8IFRTQyBDb252ZXJzaW9uIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgKi8KKyAgSEFMX1RTQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDFVTCwgIC8qITwgVFNDIEVycm9yIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAqLworCisgIEhBTF9UU0NfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDAyVUwsICAvKiE8IFRTQyBNc3AgSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgKi8KKyAgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MDNVTCAgIC8qITwgVFNDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAqLworCit9IEhBTF9UU0NfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIFRTQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVFNDX0NhbGxiYWNrVHlwZURlZikoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOyAvKiE8IHBvaW50ZXIgdG8gYW4gVFNDIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFRTQ19FeHBvcnRlZF9Db25zdGFudHMgVFNDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBUU0MgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBUU0MgRXJyb3IgQ29kZSBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSEFMX1RTQ19FUlJPUl9OT05FICAgICAgMHgwMDAwMDAwMFVMICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfVFNDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgIDB4MDAwMDAwMDFVTCAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0NUUHVsc2VITF9Db25maWcgQ1RQdWxzZSBIaWdoIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19DVFBIXzFDWUNMRSAgICAgICAgIDB4MDAwMDAwMDBVTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxIGN5Y2xlIChQR0NMSykgICAqLworI2RlZmluZSBUU0NfQ1RQSF8yQ1lDTEVTICAgICAgICBUU0NfQ1JfQ1RQSF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMiBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfM0NZQ0xFUyAgICAgICAgVFNDX0NSX0NUUEhfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDMgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzRDWUNMRVMgICAgICAgIChUU0NfQ1JfQ1RQSF8xIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyA0IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQSF81Q1lDTEVTICAgICAgICBUU0NfQ1JfQ1RQSF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgNSBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfNkNZQ0xFUyAgICAgICAgKFRTQ19DUl9DVFBIXzIgfCBUU0NfQ1JfQ1RQSF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDYgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzdDWUNMRVMgICAgICAgIChUU0NfQ1JfQ1RQSF8yIHwgVFNDX0NSX0NUUEhfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyA3IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQSF84Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUEhfMiB8IFRTQ19DUl9DVFBIXzEgfCBUU0NfQ1JfQ1RQSF8wKSAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgOCBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUEhfOUNZQ0xFUyAgICAgICAgVFNDX0NSX0NUUEhfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDkgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBIXzEwQ1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQSF8zIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxMCBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQSF8xMUNZQ0xFUyAgICAgICAoVFNDX0NSX0NUUEhfMyB8IFRTQ19DUl9DVFBIXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMTEgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUEhfMTJDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBIXzMgfCBUU0NfQ1JfQ1RQSF8xIHwgVFNDX0NSX0NUUEhfMCkgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDEyIGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBIXzEzQ1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQSF8zIHwgVFNDX0NSX0NUUEhfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxMyBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQSF8xNENZQ0xFUyAgICAgICAoVFNDX0NSX0NUUEhfMyB8IFRTQ19DUl9DVFBIXzIgfCBUU0NfQ1JfQ1RQSF8wKSAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgaGlnaCBkdXJpbmcgMTQgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUEhfMTVDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBIXzMgfCBUU0NfQ1JfQ1RQSF8yIHwgVFNDX0NSX0NUUEhfMSkgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGhpZ2ggZHVyaW5nIDE1IGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBIXzE2Q1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQSF8zIHwgVFNDX0NSX0NUUEhfMiB8IFRTQ19DUl9DVFBIXzEgfCBUU0NfQ1JfQ1RQSF8wKSAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBoaWdoIGR1cmluZyAxNiBjeWNsZXMgKFBHQ0xLKSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfQ1RQdWxzZUxMX0NvbmZpZyBDVFB1bHNlIExvdyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfQ1RQTF8xQ1lDTEUgICAgICAgICAweDAwMDAwMDAwVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMSBjeWNsZSAoUEdDTEspICAgKi8KKyNkZWZpbmUgVFNDX0NUUExfMkNZQ0xFUyAgICAgICAgVFNDX0NSX0NUUExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDIgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBMXzNDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAzIGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF80Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUExfMSB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgNCBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUExfNUNZQ0xFUyAgICAgICAgVFNDX0NSX0NUUExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDUgY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBMXzZDWUNMRVMgICAgICAgIChUU0NfQ1JfQ1RQTF8yIHwgVFNDX0NSX0NUUExfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyA2IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF83Q1lDTEVTICAgICAgICAoVFNDX0NSX0NUUExfMiB8IFRTQ19DUl9DVFBMXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgNyBjeWNsZXMgKFBHQ0xLKSAgKi8KKyNkZWZpbmUgVFNDX0NUUExfOENZQ0xFUyAgICAgICAgKFRTQ19DUl9DVFBMXzIgfCBUU0NfQ1JfQ1RQTF8xIHwgVFNDX0NSX0NUUExfMCkgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDggY3ljbGVzIChQR0NMSykgICovCisjZGVmaW5lIFRTQ19DVFBMXzlDWUNMRVMgICAgICAgIFRTQ19DUl9DVFBMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyA5IGN5Y2xlcyAoUEdDTEspICAqLworI2RlZmluZSBUU0NfQ1RQTF8xMENZQ0xFUyAgICAgICAoVFNDX0NSX0NUUExfMyB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMTAgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUExfMTFDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBMXzMgfCBUU0NfQ1JfQ1RQTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDExIGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBMXzEyQ1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQTF8zIHwgVFNDX0NSX0NUUExfMSB8IFRTQ19DUl9DVFBMXzApICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAxMiBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQTF8xM0NZQ0xFUyAgICAgICAoVFNDX0NSX0NUUExfMyB8IFRTQ19DUl9DVFBMXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMTMgY3ljbGVzIChQR0NMSykgKi8KKyNkZWZpbmUgVFNDX0NUUExfMTRDWUNMRVMgICAgICAgKFRTQ19DUl9DVFBMXzMgfCBUU0NfQ1JfQ1RQTF8yIHwgVFNDX0NSX0NUUExfMCkgICAgICAgICAgICAgICAgICAvKiE8IENoYXJnZSB0cmFuc2ZlciBwdWxzZSBsb3cgZHVyaW5nIDE0IGN5Y2xlcyAoUEdDTEspICovCisjZGVmaW5lIFRTQ19DVFBMXzE1Q1lDTEVTICAgICAgIChUU0NfQ1JfQ1RQTF8zIHwgVFNDX0NSX0NUUExfMiB8IFRTQ19DUl9DVFBMXzEpICAgICAgICAgICAgICAgICAgLyohPCBDaGFyZ2UgdHJhbnNmZXIgcHVsc2UgbG93IGR1cmluZyAxNSBjeWNsZXMgKFBHQ0xLKSAqLworI2RlZmluZSBUU0NfQ1RQTF8xNkNZQ0xFUyAgICAgICAoVFNDX0NSX0NUUExfMyB8IFRTQ19DUl9DVFBMXzIgfCBUU0NfQ1JfQ1RQTF8xIHwgVFNDX0NSX0NUUExfMCkgIC8qITwgQ2hhcmdlIHRyYW5zZmVyIHB1bHNlIGxvdyBkdXJpbmcgMTYgY3ljbGVzIChQR0NMSykgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1NwcmVhZFNwZWNfUHJlc2NhbGVyIFNwcmVhZCBTcGVjdHJ1bSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBUU0NfU1NfUFJFU0NfRElWMSAgICAgICAweDAwMDAwMDAwVUwgIC8qITwgU3ByZWFkIFNwZWN0cnVtIFByZXNjYWxlciBEaXYxICovCisjZGVmaW5lIFRTQ19TU19QUkVTQ19ESVYyICAgICAgIFRTQ19DUl9TU1BTQyAgLyohPCBTcHJlYWQgU3BlY3RydW0gUHJlc2NhbGVyIERpdjIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1B1bHNlR2VuZXJhdG9yX1ByZXNjYWxlciBQdWxzZSBHZW5lcmF0b3IgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjEgICAgICAgMHgwMDAwMDAwMFVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgR2VuZXJhdG9yIEhDTEsgRGl2MSAgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVYyICAgICAgIFRTQ19DUl9QR1BTQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjIgICAqLworI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWNCAgICAgICBUU0NfQ1JfUEdQU0NfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBHZW5lcmF0b3IgSENMSyBEaXY0ICAgKi8KKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjggICAgICAgKFRTQ19DUl9QR1BTQ18xIHwgVFNDX0NSX1BHUFNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgR2VuZXJhdG9yIEhDTEsgRGl2OCAgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVYxNiAgICAgIFRTQ19DUl9QR1BTQ18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjE2ICAqLworI2RlZmluZSBUU0NfUEdfUFJFU0NfRElWMzIgICAgICAoVFNDX0NSX1BHUFNDXzIgfCBUU0NfQ1JfUEdQU0NfMCkgICAgICAgICAgICAgICAgICAgLyohPCBQdWxzZSBHZW5lcmF0b3IgSENMSyBEaXYzMiAgKi8KKyNkZWZpbmUgVFNDX1BHX1BSRVNDX0RJVjY0ICAgICAgKFRTQ19DUl9QR1BTQ18yIHwgVFNDX0NSX1BHUFNDXzEpICAgICAgICAgICAgICAgICAgIC8qITwgUHVsc2UgR2VuZXJhdG9yIEhDTEsgRGl2NjQgICovCisjZGVmaW5lIFRTQ19QR19QUkVTQ19ESVYxMjggICAgIChUU0NfQ1JfUEdQU0NfMiB8IFRTQ19DUl9QR1BTQ18xIHwgVFNDX0NSX1BHUFNDXzApICAvKiE8IFB1bHNlIEdlbmVyYXRvciBIQ0xLIERpdjEyOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfTWF4Q291bnRfVmFsdWUgTWF4IENvdW50IFZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX01DVl8yNTUgICAgICAgICAgICAgMHgwMDAwMDAwMFVMICAgICAgICAgICAgICAgICAgIC8qITwgMjU1IG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgICAqLworI2RlZmluZSBUU0NfTUNWXzUxMSAgICAgICAgICAgICBUU0NfQ1JfTUNWXzAgICAgICAgICAgICAgICAgICAgLyohPCA1MTEgbWF4aW11bSBudW1iZXIgb2YgY2hhcmdlIHRyYW5zZmVyIHB1bHNlcyAgICovCisjZGVmaW5lIFRTQ19NQ1ZfMTAyMyAgICAgICAgICAgIFRTQ19DUl9NQ1ZfMSAgICAgICAgICAgICAgICAgICAvKiE8IDEwMjMgbWF4aW11bSBudW1iZXIgb2YgY2hhcmdlIHRyYW5zZmVyIHB1bHNlcyAgKi8KKyNkZWZpbmUgVFNDX01DVl8yMDQ3ICAgICAgICAgICAgKFRTQ19DUl9NQ1ZfMSB8IFRTQ19DUl9NQ1ZfMCkgIC8qITwgMjA0NyBtYXhpbXVtIG51bWJlciBvZiBjaGFyZ2UgdHJhbnNmZXIgcHVsc2VzICAqLworI2RlZmluZSBUU0NfTUNWXzQwOTUgICAgICAgICAgICBUU0NfQ1JfTUNWXzIgICAgICAgICAgICAgICAgICAgLyohPCA0MDk1IG1heGltdW0gbnVtYmVyIG9mIGNoYXJnZSB0cmFuc2ZlciBwdWxzZXMgICovCisjZGVmaW5lIFRTQ19NQ1ZfODE5MSAgICAgICAgICAgIChUU0NfQ1JfTUNWXzIgfCBUU0NfQ1JfTUNWXzApICAvKiE8IDgxOTEgbWF4aW11bSBudW1iZXIgb2YgY2hhcmdlIHRyYW5zZmVyIHB1bHNlcyAgKi8KKyNkZWZpbmUgVFNDX01DVl8xNjM4MyAgICAgICAgICAgKFRTQ19DUl9NQ1ZfMiB8IFRTQ19DUl9NQ1ZfMSkgIC8qITwgMTYzODMgbWF4aW11bSBudW1iZXIgb2YgY2hhcmdlIHRyYW5zZmVyIHB1bHNlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfSU9fRGVmYXVsdF9Nb2RlIElPIERlZmF1bHQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19JT0RFRl9PVVRfUFBfTE9XICAgIDB4MDAwMDAwMDBVTCAvKiE8IEkvT3MgYXJlIGZvcmNlZCB0byBvdXRwdXQgcHVzaC1wdWxsIGxvdyAqLworI2RlZmluZSBUU0NfSU9ERUZfSU5fRkxPQVQgICAgICBUU0NfQ1JfSU9ERUYgLyohPCBJL09zIGFyZSBpbiBpbnB1dCBmbG9hdGluZyAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX1N5bmNocm9fUGluX1BvbGFyaXR5IFN5bmNocm8gUGluIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgMHgwMDAwMDAwMFVMICAgLyohPCBGYWxsaW5nIGVkZ2Ugb25seSAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NZTkNfUE9MQVJJVFlfUklTSU5HICAgVFNDX0NSX1NZTkNQT0wgLyohPCBSaXNpbmcgZWRnZSBhbmQgaGlnaCBsZXZlbCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0FjcXVpc2l0aW9uX01vZGUgQWNxdWlzaXRpb24gTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19BQ1FfTU9ERV9OT1JNQUwgICAgIDB4MDAwMDAwMDBVTCAgLyohPCBOb3JtYWwgYWNxdWlzaXRpb24gbW9kZSAoYWNxdWlzaXRpb24gc3RhcnRzIGFzIHNvb24gYXMgU1RBUlQgYml0IGlzIHNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19BQ1FfTU9ERV9TWU5DSFJPICAgIFRTQ19DUl9BTSAgICAgLyohPCBTeW5jaHJvbml6ZWQgYWNxdWlzaXRpb24gbW9kZSAoYWNxdWlzaXRpb24gc3RhcnRzIGlmIFNUQVJUIGJpdCBpcyBzZXQgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIHNpZ25hbCBpcyBkZXRlY3RlZCBvbiB0aGUgU1lOQyBpbnB1dCBwaW4pICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19pbnRlcnJ1cHRzX2RlZmluaXRpb24gSW50ZXJydXB0cyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX0lUX0VPQSAgICAgICAgICAgICAgVFNDX0lFUl9FT0FJRSAvKiE8IEVuZCBvZiBhY3F1aXNpdGlvbiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFRTQ19JVF9NQ0UgICAgICAgICAgICAgIFRTQ19JRVJfTUNFSUUgLyohPCBNYXggY291bnQgZXJyb3IgaW50ZXJydXB0IGVuYWJsZSAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfZmxhZ3NfZGVmaW5pdGlvbiBGbGFncyBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVFNDX0ZMQUdfRU9BICAgICAgICAgICAgVFNDX0lTUl9FT0FGIC8qITwgRW5kIG9mIGFjcXVpc2l0aW9uIGZsYWcgKi8KKyNkZWZpbmUgVFNDX0ZMQUdfTUNFICAgICAgICAgICAgVFNDX0lTUl9NQ0VGIC8qITwgTWF4IGNvdW50IGVycm9yIGZsYWcgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0dyb3VwX2RlZmluaXRpb24gR3JvdXAgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFRTQ19HUk9VUDEgICAgICAgICAgICAgICgweDFVTCA8PCBUU0NfR1JPVVAxX0lEWCkKKyNkZWZpbmUgVFNDX0dST1VQMiAgICAgICAgICAgICAgKDB4MVVMIDw8IFRTQ19HUk9VUDJfSURYKQorI2RlZmluZSBUU0NfR1JPVVAzICAgICAgICAgICAgICAoMHgxVUwgPDwgVFNDX0dST1VQM19JRFgpCisjZGVmaW5lIFRTQ19HUk9VUDQgICAgICAgICAgICAgICgweDFVTCA8PCBUU0NfR1JPVVA0X0lEWCkKKyNkZWZpbmUgVFNDX0dST1VQNSAgICAgICAgICAgICAgKDB4MVVMIDw8IFRTQ19HUk9VUDVfSURYKQorI2RlZmluZSBUU0NfR1JPVVA2ICAgICAgICAgICAgICAoMHgxVUwgPDwgVFNDX0dST1VQNl9JRFgpCisjZGVmaW5lIFRTQ19HUk9VUDcgICAgICAgICAgICAgICgweDFVTCA8PCBUU0NfR1JPVVA3X0lEWCkKKworI2RlZmluZSBUU0NfR1JPVVAxX0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzFfSU8xIC8qITwgVFNDIEdyb3VwMSBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQMV9JTzIgICAgICAgICAgVFNDX0lPQ0NSX0cxX0lPMiAvKiE8IFRTQyBHcm91cDEgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDFfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HMV9JTzMgLyohPCBUU0MgR3JvdXAxIElPMyAqLworI2RlZmluZSBUU0NfR1JPVVAxX0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzFfSU80IC8qITwgVFNDIEdyb3VwMSBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVAyX0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzJfSU8xIC8qITwgVFNDIEdyb3VwMiBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQMl9JTzIgICAgICAgICAgVFNDX0lPQ0NSX0cyX0lPMiAvKiE8IFRTQyBHcm91cDIgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDJfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HMl9JTzMgLyohPCBUU0MgR3JvdXAyIElPMyAqLworI2RlZmluZSBUU0NfR1JPVVAyX0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzJfSU80IC8qITwgVFNDIEdyb3VwMiBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVAzX0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzNfSU8xIC8qITwgVFNDIEdyb3VwMyBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQM19JTzIgICAgICAgICAgVFNDX0lPQ0NSX0czX0lPMiAvKiE8IFRTQyBHcm91cDMgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDNfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HM19JTzMgLyohPCBUU0MgR3JvdXAzIElPMyAqLworI2RlZmluZSBUU0NfR1JPVVAzX0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzNfSU80IC8qITwgVFNDIEdyb3VwMyBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVA0X0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzRfSU8xIC8qITwgVFNDIEdyb3VwNCBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQNF9JTzIgICAgICAgICAgVFNDX0lPQ0NSX0c0X0lPMiAvKiE8IFRTQyBHcm91cDQgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDRfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HNF9JTzMgLyohPCBUU0MgR3JvdXA0IElPMyAqLworI2RlZmluZSBUU0NfR1JPVVA0X0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzRfSU80IC8qITwgVFNDIEdyb3VwNCBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVA1X0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzVfSU8xIC8qITwgVFNDIEdyb3VwNSBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQNV9JTzIgICAgICAgICAgVFNDX0lPQ0NSX0c1X0lPMiAvKiE8IFRTQyBHcm91cDUgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDVfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HNV9JTzMgLyohPCBUU0MgR3JvdXA1IElPMyAqLworI2RlZmluZSBUU0NfR1JPVVA1X0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzVfSU80IC8qITwgVFNDIEdyb3VwNSBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVA2X0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzZfSU8xIC8qITwgVFNDIEdyb3VwNiBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQNl9JTzIgICAgICAgICAgVFNDX0lPQ0NSX0c2X0lPMiAvKiE8IFRTQyBHcm91cDYgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDZfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HNl9JTzMgLyohPCBUU0MgR3JvdXA2IElPMyAqLworI2RlZmluZSBUU0NfR1JPVVA2X0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzZfSU80IC8qITwgVFNDIEdyb3VwNiBJTzQgKi8KKworI2RlZmluZSBUU0NfR1JPVVA3X0lPMSAgICAgICAgICBUU0NfSU9DQ1JfRzdfSU8xIC8qITwgVFNDIEdyb3VwNyBJTzEgKi8KKyNkZWZpbmUgVFNDX0dST1VQN19JTzIgICAgICAgICAgVFNDX0lPQ0NSX0c3X0lPMiAvKiE8IFRTQyBHcm91cDcgSU8yICovCisjZGVmaW5lIFRTQ19HUk9VUDdfSU8zICAgICAgICAgIFRTQ19JT0NDUl9HN19JTzMgLyohPCBUU0MgR3JvdXA3IElPMyAqLworI2RlZmluZSBUU0NfR1JPVVA3X0lPNCAgICAgICAgICBUU0NfSU9DQ1JfRzdfSU80IC8qITwgVFNDIEdyb3VwNyBJTzQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX01hY3JvcyBUU0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiBSZXNldCBUU0MgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9UU0NfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVTRVQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIF9fSEFMX1RTQ19SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFU0VUKQorI2VuZGlmCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFRTQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9IFRTQ19DUl9UU0NFKQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgVFNDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gKH5UU0NfQ1JfVFNDRSkpCisKKy8qKgorICAqIEBicmllZiBTdGFydCBhY3F1aXNpdGlvbi4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU1RBUlRfQUNRKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfU1RBUlQpCisKKy8qKgorICAqIEBicmllZiBTdG9wIGFjcXVpc2l0aW9uLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19TVE9QX0FDUShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh+VFNDX0NSX1NUQVJUKSkKKworLyoqCisgICogQGJyaWVmIFNldCBJTyBkZWZhdWx0IG1vZGUgdG8gb3V0cHV0IHB1c2gtcHVsbCBsb3cuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9JT0RFRl9PVVRQUExPVyhfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gKH5UU0NfQ1JfSU9ERUYpKQorCisvKioKKyAgKiBAYnJpZWYgU2V0IElPIGRlZmF1bHQgbW9kZSB0byBpbnB1dCBmbG9hdGluZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU0VUX0lPREVGX0lORkxPQVQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSBUU0NfQ1JfSU9ERUYpCisKKy8qKgorICAqIEBicmllZiBTZXQgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5IHRvIGZhbGxpbmcgZWRnZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfU0VUX1NZTkNfUE9MX0ZBTEwoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAoflRTQ19DUl9TWU5DUE9MKSkKKworLyoqCisgICogQGJyaWVmIFNldCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UgYW5kIGhpZ2ggbGV2ZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX1NFVF9TWU5DX1BPTF9SSVNFX0hJR0goX19IQU5ETEVfXykgICAgICAgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gVFNDX0NSX1NZTkNQT0wpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgVFNDIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBUU0MgaW50ZXJydXB0CisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklFUiB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIFRTQyBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gVFNDIGludGVycnVwdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJj0gKH4oX19JTlRFUlJVUFRfXykpKQorCisvKiogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUU0MgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIEhhbmRsZQorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBUU0MgaW50ZXJydXB0CisgICogQHJldHZhbCBTRVQgb3IgUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUU0MgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBUU0MgZmxhZworICAqIEByZXR2YWwgU0VUIG9yIFJFU0VUCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgICAgICAgICAgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkgPyBTRVQgOiBSRVNFVCkKKworLyoqCisgICogQGJyaWVmIENsZWFyIHRoZSBUU0MncyBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fRkxBR19fIFRTQyBmbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgc2NobWl0dCB0cmlnZ2VyIGh5c3RlcmVzaXMgb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFX0hZU1RFUkVTSVMoX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0hDUiB8PSAoX19HWF9JT1lfTUFTS19fKSkKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgc2NobWl0dCB0cmlnZ2VyIGh5c3RlcmVzaXMgb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9IWVNURVJFU0lTKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0hDUiAmPSAofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIE9wZW4gYW5hbG9nIHN3aXRjaCBvbiBhIGdyb3VwIG9mIElPcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JT1lfTUFTS19fIElPcyBtYXNrCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RTQ19PUEVOX0FOQUxPR19TV0lUQ0goX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklPQVNDUiAmPSAofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIENsb3NlIGFuYWxvZyBzd2l0Y2ggb24gYSBncm91cCBvZiBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfQ0xPU0VfQU5BTE9HX1NXSVRDSChfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0FTQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgYSBncm91cCBvZiBJT3MgaW4gY2hhbm5lbCBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0VOQUJMRV9DSEFOTkVMKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9DQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGEgZ3JvdXAgb2YgY2hhbm5lbCBJT3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRTQyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fR1hfSU9ZX01BU0tfXyBJT3MgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRElTQUJMRV9DSEFOTkVMKF9fSEFORExFX18sIF9fR1hfSU9ZX01BU0tfXykgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0NDUiAmPSAofihfX0dYX0lPWV9NQVNLX18pKSkKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBhIGdyb3VwIG9mIElPcyBpbiBzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0VOQUJMRV9TQU1QTElORyhfX0hBTkRMRV9fLCBfX0dYX0lPWV9NQVNLX18pICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9TQ1IgfD0gKF9fR1hfSU9ZX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGEgZ3JvdXAgb2Ygc2FtcGxpbmcgSU9zLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX0lPWV9NQVNLX18gSU9zIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEVfU0FNUExJTkcoX19IQU5ETEVfXywgX19HWF9JT1lfTUFTS19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9TQ1IgJj0gKH4oX19HWF9JT1lfTUFTS19fKSkpCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgYWNxdWlzaXRpb24gZ3JvdXBzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUU0MgaGFuZGxlCisgICogQHBhcmFtICBfX0dYX01BU0tfXyBHcm91cHMgbWFzaworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9UU0NfRU5BQkxFX0dST1VQKF9fSEFORExFX18sIF9fR1hfTUFTS19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SU9HQ1NSIHw9IChfX0dYX01BU0tfXykpCisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGFjcXVpc2l0aW9uIGdyb3Vwcy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIGhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9NQVNLX18gR3JvdXBzIG1hc2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0RJU0FCTEVfR1JPVVAoX19IQU5ETEVfXywgX19HWF9NQVNLX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgJj0gKH4oX19HWF9NQVNLX18pKSkKKworLyoqIEBicmllZiBHZXRzIGFjcXVpc2l0aW9uIGdyb3VwIHN0YXR1cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVFNDIEhhbmRsZQorICAqIEBwYXJhbSAgX19HWF9JTkRFWF9fIEdyb3VwIGluZGV4CisgICogQHJldHZhbCBTRVQgb3IgUkVTRVQKKyAgKi8KKyNkZWZpbmUgX19IQUxfVFNDX0dFVF9HUk9VUF9TVEFUVVMoX19IQU5ETEVfXywgX19HWF9JTkRFWF9fKSBcCisoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JT0dDU1IgJiAodWludDMyX3QpKDFVTCA8PCAoKChfX0dYX0lOREVYX18pICYgMHhGVUwpICsgMTZVTCkpKSA9PSAodWludDMyX3QpKDFVTCA8PCAoKChfX0dYX0lOREVYX18pICYgMHhGVUwpICsgMTZVTCkpKSA/IFRTQ19HUk9VUF9DT01QTEVURUQgOiBUU0NfR1JPVVBfT05HT0lORykKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUU0NfUHJpdmF0ZV9NYWNyb3MgVFNDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19UU0NfQ1RQSChfX1ZBTFVFX18pICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMUNZQ0xFKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzJDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8zQ1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfNENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzVDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF82Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfN0NZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzhDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF85Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTBDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzExQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8xMkNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTNDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBIXzE0Q1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQSF8xNUNZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUEhfMTZDWUNMRVMpKQorCisjZGVmaW5lIElTX1RTQ19DVFBMKF9fVkFMVUVfXykgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xQ1lDTEUpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMkNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzNDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF80Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfNUNZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzZDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF83Q1lDTEVTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfOENZQ0xFUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzlDWUNMRVMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xMENZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMTFDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzEyQ1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xM0NZQ0xFUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX0NUUExfMTRDWUNMRVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19DVFBMXzE1Q1lDTEVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfQ1RQTF8xNkNZQ0xFUykpCisKKyNkZWZpbmUgSVNfVFNDX1NTKF9fVkFMVUVfXykgICAgICAgICAgICAoKChGdW5jdGlvbmFsU3RhdGUpKF9fVkFMVUVfXykgPT0gRElTQUJMRSkgfHwgKChGdW5jdGlvbmFsU3RhdGUpKF9fVkFMVUVfXykgPT0gRU5BQkxFKSkKKworI2RlZmluZSBJU19UU0NfU1NEKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gMFVMKSB8fCAoKChfX1ZBTFVFX18pID4gMFVMKSAmJiAoKF9fVkFMVUVfXykgPCAxMjhVTCkpKQorCisjZGVmaW5lIElTX1RTQ19TU19QUkVTQyhfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfU1NfUFJFU0NfRElWMSkgfHwgKChfX1ZBTFVFX18pID09IFRTQ19TU19QUkVTQ19ESVYyKSkKKworI2RlZmluZSBJU19UU0NfUEdfUFJFU0MoX19WQUxVRV9fKSAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjEpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19QR19QUkVTQ19ESVY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19QR19QUkVTQ19ESVYzMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX1BHX1BSRVNDX0RJVjY0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfUEdfUFJFU0NfRElWMTI4KSkKKworI2RlZmluZSBJU19UU0NfTUNWKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gVFNDX01DVl8yNTUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfTUNWXzUxMSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfMTAyMykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gVFNDX01DVl8yMDQ3KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBUU0NfTUNWXzQwOTUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfODE5MSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IFRTQ19NQ1ZfMTYzODMpKQorCisjZGVmaW5lIElTX1RTQ19JT0RFRihfX1ZBTFVFX18pICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykgfHwgKChfX1ZBTFVFX18pID09IFRTQ19JT0RFRl9JTl9GTE9BVCkpCisKKyNkZWZpbmUgSVNfVFNDX1NZTkNfUE9MKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IFRTQ19TWU5DX1BPTEFSSVRZX0ZBTExJTkcpIHx8ICgoX19WQUxVRV9fKSA9PSBUU0NfU1lOQ19QT0xBUklUWV9SSVNJTkcpKQorCisjZGVmaW5lIElTX1RTQ19BQ1FfTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBUU0NfQUNRX01PREVfTk9STUFMKSB8fCAoKF9fVkFMVUVfXykgPT0gVFNDX0FDUV9NT0RFX1NZTkNIUk8pKQorCisjZGVmaW5lIElTX1RTQ19NQ0VfSVQoX19WQUxVRV9fKSAgICAgICAgKCgoRnVuY3Rpb25hbFN0YXRlKShfX1ZBTFVFX18pID09IERJU0FCTEUpIHx8ICgoRnVuY3Rpb25hbFN0YXRlKShfX1ZBTFVFX18pID09IEVOQUJMRSkpCisKKyNkZWZpbmUgSVNfVFNDX0dST1VQX0lOREVYKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IDBVTCkgfHwgKCgoX19WQUxVRV9fKSA+IDBVTCkgJiYgKChfX1ZBTFVFX18pIDwgKHVpbnQzMl90KVRTQ19OQl9PRl9HUk9VUFMpKSkKKworI2RlZmluZSBJU19UU0NfR1JPVVAoX19WQUxVRV9fKSAgICAgICAgICgoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMV9JTzEpID09IFRTQ19HUk9VUDFfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDFfSU8yKSA9PSBUU0NfR1JPVVAxX0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAxX0lPMykgPT0gVFNDX0dST1VQMV9JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMV9JTzQpID09IFRTQ19HUk9VUDFfSU80KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDJfSU8xKSA9PSBUU0NfR1JPVVAyX0lPMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAyX0lPMikgPT0gVFNDX0dST1VQMl9JTzIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQMl9JTzMpID09IFRTQ19HUk9VUDJfSU8zKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDJfSU80KSA9PSBUU0NfR1JPVVAyX0lPNCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAzX0lPMSkgPT0gVFNDX0dST1VQM19JTzEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQM19JTzIpID09IFRTQ19HUk9VUDNfSU8yKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDNfSU8zKSA9PSBUU0NfR1JPVVAzX0lPMykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVAzX0lPNCkgPT0gVFNDX0dST1VQM19JTzQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNF9JTzEpID09IFRTQ19HUk9VUDRfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDRfSU8yKSA9PSBUU0NfR1JPVVA0X0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA0X0lPMykgPT0gVFNDX0dST1VQNF9JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNF9JTzQpID09IFRTQ19HUk9VUDRfSU80KSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDVfSU8xKSA9PSBUU0NfR1JPVVA1X0lPMSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA1X0lPMikgPT0gVFNDX0dST1VQNV9JTzIpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNV9JTzMpID09IFRTQ19HUk9VUDVfSU8zKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDVfSU80KSA9PSBUU0NfR1JPVVA1X0lPNCkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA2X0lPMSkgPT0gVFNDX0dST1VQNl9JTzEpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQNl9JTzIpID09IFRTQ19HUk9VUDZfSU8yKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDZfSU8zKSA9PSBUU0NfR1JPVVA2X0lPMykgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA2X0lPNCkgPT0gVFNDX0dST1VQNl9JTzQpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQN19JTzEpID09IFRTQ19HUk9VUDdfSU8xKSB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIFRTQ19HUk9VUDdfSU8yKSA9PSBUU0NfR1JPVVA3X0lPMikgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiBUU0NfR1JPVVA3X0lPMykgPT0gVFNDX0dST1VQN19JTzMpIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pICYgVFNDX0dST1VQN19JTzQpID09IFRTQ19HUk9VUDdfSU80KSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0luaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19EZUluaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX01zcEluaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX01zcERlSW5pdChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYyk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19SZWdpc3RlckNhbGxiYWNrKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCBIQUxfVFNDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBUU0NfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1VuUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdGFydF9JVChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3AoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdG9wX0lUKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKTsKK1RTQ19Hcm91cFN0YXR1c1R5cGVEZWYgSEFMX1RTQ19Hcm91cEdldFN0YXR1cyhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgdWludDMyX3QgZ3hfaW5kZXgpOwordWludDMyX3QgSEFMX1RTQ19Hcm91cEdldFZhbHVlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCB1aW50MzJfdCBneF9pbmRleCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19JT0NvbmZpZyhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgVFNDX0lPQ29uZmlnVHlwZURlZiAqY29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfSU9EaXNjaGFyZ2UoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIEZ1bmN0aW9uYWxTdGF0ZSBjaG9pY2UpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9UU0NfU3RhdGVUeXBlRGVmIEhBTF9UU0NfR2V0U3RhdGUoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRTQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIFRTQyBJUlFIYW5kbGVyIGFuZCBDYWxsYmFja3MgdXNlZCBpbiBJbnRlcnJ1cHQgbW9kZSAqLwordm9pZCBIQUxfVFNDX0lSUUhhbmRsZXIoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOwordm9pZCBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfVFNDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3VhcnQuaCBiL0luYy9zdG0zMndieHhfaGFsX3VhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJlMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfdWFydC5oCkBAIC0wLDAgKzEsMTYyOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfdWFydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVQVJUIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0hBTF9VQVJUX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9VQVJUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJUCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9UeXBlcyBVQVJUIEV4cG9ydGVkIFR5cGVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFVBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIG1lbWJlciBjb25maWd1cmVzIHRoZSBVQVJUIGNvbW11bmljYXRpb24gYmF1ZCByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgcmVnaXN0ZXIgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVUFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCgyNTYgKiBscHVhcnRfa2VyX2NrcHJlcykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgbHB1YXJ0X2tlcl9ja19wcmVzIGlzIHRoZSBVQVJUIGlucHV0IGNsb2NrIGRpdmlkZWQgYnkgYSBwcmVzY2FsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBJZiBvdmVyc2FtcGxpbmcgaXMgMTYgb3IgaW4gTElOIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyID0gKCh1YXJ0X2tlcl9ja3ByZXMpIC8gKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gSWYgb3ZlcnNhbXBsaW5nIGlzIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzE1OjRdID0gKCgyICogdWFydF9rZXJfY2twcmVzKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMTU6NF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXVkIFJhdGUgUmVnaXN0ZXJbM10gPSAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsyOjBdID0gICgoKDIgKiB1YXJ0X2tlcl9ja3ByZXMpIC8gKChodWFydC0+SW5pdC5CYXVkUmF0ZSkpKVszOjBdKSA+PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdWFydF9rZXJfY2tfcHJlcyBpcyB0aGUgVUFSVCBpbnB1dCBjbG9jayBkaXZpZGVkIGJ5IGEgcHJlc2NhbGVyICovCisKKyAgdWludDMyX3QgV29yZExlbmd0aDsgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgaW4gYSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRFeF9Xb3JkX0xlbmd0aC4gKi8KKworICB1aW50MzJfdCBTdG9wQml0czsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0cmFuc21pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfU3RvcF9CaXRzLiAqLworCisgIHVpbnQzMl90IFBhcml0eTsgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwYXJpdHkgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlIGNvbXB1dGVkIHBhcml0eSBpcyBpbnNlcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBNU0IgcG9zaXRpb24gb2YgdGhlIHRyYW5zbWl0dGVkIGRhdGEgKDl0aCBiaXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOSBkYXRhIGJpdHM7IDh0aCBiaXQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOCBkYXRhIGJpdHMpLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJlY2VpdmUgb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9Nb2RlLiAqLworCisgIHVpbnQzMl90IEh3Rmxvd0N0bDsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBtb2RlIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfSGFyZHdhcmVfRmxvd19Db250cm9sLiAqLworCisgIHVpbnQzMl90IE92ZXJTYW1wbGluZzsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE92ZXIgc2FtcGxpbmcgOCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLCB0byBhY2hpZXZlIGhpZ2hlciBzcGVlZCAodXAgdG8gZl9QQ0xLLzgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9PdmVyX1NhbXBsaW5nLiAqLworCisgIHVpbnQzMl90IE9uZUJpdFNhbXBsaW5nOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYSBzaW5nbGUgc2FtcGxlIG9yIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHZvdGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW5nIHRoZSBzaW5nbGUgc2FtcGxlIG1ldGhvZCBpbmNyZWFzZXMgdGhlIHJlY2VpdmVyIHRvbGVyYW5jZSB0byBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlhdGlvbnMuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9PbmVCaXRfU2FtcGxpbmcuICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVUFSVCBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0Nsb2NrUHJlc2NhbGVyLiAqLworCit9IFVBUlRfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlcyBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQWR2RmVhdHVyZUluaXQ7ICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGljaCBhZHZhbmNlZCBVQVJUIGZlYXR1cmVzIGlzIGluaXRpYWxpemVkLiBTZXZlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZhbmNlZCBGZWF0dXJlcyBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZSAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQWR2YW5jZWRfRmVhdHVyZXNfSW5pdGlhbGl6YXRpb25fVHlwZS4gKi8KKworICB1aW50MzJfdCBUeFBpbkxldmVsSW52ZXJ0OyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgaXMgaW52ZXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfVHhfSW52LiAgKi8KKworICB1aW50MzJfdCBSeFBpbkxldmVsSW52ZXJ0OyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaXMgaW52ZXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfUnhfSW52LiAgKi8KKworICB1aW50MzJfdCBEYXRhSW52ZXJ0OyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSBhcmUgaW52ZXJ0ZWQgKHBvc2l0aXZlL2RpcmVjdCBsb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMgbmVnYXRpdmUvaW52ZXJ0ZWQgbG9naWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX0RhdGFfSW52LiAqLworCisgIHVpbnQzMl90IFN3YXA7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBUWCBhbmQgUlggcGlucyBhcmUgc3dhcHBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9SeF9UeF9Td2FwLiAqLworCisgIHVpbnQzMl90IE92ZXJydW5EaXNhYmxlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVjZXB0aW9uIG92ZXJydW4gZGV0ZWN0aW9uIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX092ZXJydW5fRGlzYWJsZS4gKi8KKworICB1aW50MzJfdCBETUFEaXNhYmxlb25SeEVycm9yOyAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIERNQSBpcyBkaXNhYmxlZCBpbiBjYXNlIG9mIHJlY2VwdGlvbiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9ETUFfRGlzYWJsZV9vbl9SeF9FcnJvci4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVFbmFibGU7ICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfQXV0b0JhdWRSYXRlX0VuYWJsZS4gKi8KKworICB1aW50MzJfdCBBdXRvQmF1ZFJhdGVNb2RlOyAgICAgIC8qITwgSWYgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQsIHNwZWNpZmllcyBob3cgdGhlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiBpcyBjYXJyaWVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUuICovCisKKyAgdWludDMyX3QgTVNCRmlyc3Q7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIE1TQiBpcyBzZW50IGZpcnN0IG9uIFVBUlQgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVF9NU0JfRmlyc3QuICovCit9IFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmOworCisKKworLyoqCisgICogQGJyaWVmIEhBTCBVQVJUIFN0YXRlIGRlZmluaXRpb24KKyAgKiBAbm90ZSAgSEFMIFVBUlQgU3RhdGUgdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGRpZmZlcmVudCBzdWJzdGF0ZXM6IGdTdGF0ZSBhbmQgUnhTdGF0ZSAoc2VlIEByZWYgVUFSVF9TdGF0ZV9EZWZpbml0aW9uKS4KKyAgKiAgICAgICAgLSBnU3RhdGUgY29udGFpbnMgVUFSVCBzdGF0ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGdsb2JhbCBIYW5kbGUgbWFuYWdlbWVudAorICAqICAgICAgICAgIGFuZCBhbHNvIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gVHggb3BlcmF0aW9ucy4KKyAgKiAgICAgICAgICBnU3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgRXJyb3IgaW5mb3JtYXRpb24KKyAgKiAgICAgICAgICAgICAwMCA6IE5vIEVycm9yCisgICogICAgICAgICAgICAgMDEgOiAoTm90IFVzZWQpCisgICogICAgICAgICAgICAgMTAgOiBUaW1lb3V0CisgICogICAgICAgICAgICAgMTEgOiBFcnJvcgorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZC4gSEFMIFVBUlQgSW5pdCBmdW5jdGlvbiBhbHJlYWR5IGNhbGxlZCkKKyAgKiAgICAgICAgICBiNC1iMyAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGIyICAgICBJbnRyaW5zaWMgcHJvY2VzcyBzdGF0ZQorICAqICAgICAgICAgICAgIDAgIDogUmVhZHkKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFBlcmlwaGVyYWwgYnVzeSB3aXRoIHNvbWUgY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBvcGVyYXRpb25zKQorICAqICAgICAgICAgIGIxICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAKKyAgKiAgICAgICAgICBiMCAgICAgVHggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBUeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFR4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAtIFJ4U3RhdGUgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBSeCBvcGVyYXRpb25zLgorICAqICAgICAgICAgIFJ4U3RhdGUgdmFsdWUgY29kaW5nIGZvbGxvdyBiZWxvdyBkZXNjcmliZWQgYml0bWFwIDoKKyAgKiAgICAgICAgICBiNy1iNiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgIHh4IDogU2hvdWxkIGJlIHNldCB0byAwMAorICAqICAgICAgICAgIGI1ICAgICBQZXJpcGhlcmFsIGluaXRpYWxpemF0aW9uIHN0YXR1cworICAqICAgICAgICAgICAgIDAgIDogUmVzZXQgKFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkKQorICAqICAgICAgICAgICAgIDEgIDogSW5pdCBkb25lIChQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCkKKyAgKiAgICAgICAgICBiNC1iMiAgKG5vdCB1c2VkKQorICAqICAgICAgICAgICAgeHh4IDogU2hvdWxkIGJlIHNldCB0byAwMDAKKyAgKiAgICAgICAgICBiMSAgICAgUnggc3RhdGUKKyAgKiAgICAgICAgICAgICAwICA6IFJlYWR5IChubyBSeCBvcGVyYXRpb24gb25nb2luZykKKyAgKiAgICAgICAgICAgICAxICA6IEJ1c3kgKFJ4IG9wZXJhdGlvbiBvbmdvaW5nKQorICAqICAgICAgICAgIGIwICAgICAobm90IHVzZWQpCisgICogICAgICAgICAgICAgeCAgOiBTaG91bGQgYmUgc2V0IHRvIDAuCisgICovCit0eXBlZGVmIHVpbnQzMl90IEhBTF9VQVJUX1N0YXRlVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmIFVBUlQgY2xvY2sgc291cmNlcyBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMSAgICAgID0gMHgwMFUsICAgIC8qITwgUENMSzEgY2xvY2sgc291cmNlICAqLworICBVQVJUX0NMT0NLU09VUkNFX1BDTEsyICAgICAgPSAweDAxVSwgICAgLyohPCBQQ0xLMiBjbG9jayBzb3VyY2UgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJICAgICAgICA9IDB4MDJVLCAgICAvKiE8IEhTSSBjbG9jayBzb3VyY2UgICAgKi8KKyAgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAqLworICBVQVJUX0NMT0NLU09VUkNFX0xTRSAgICAgICAgPSAweDA4VSwgICAgLyohPCBMU0UgY2xvY2sgc291cmNlICAgICAgICovCisgIFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEICA9IDB4MTBVICAgICAvKiE8IFVuZGVmaW5lZCBjbG9jayBzb3VyY2UgKi8KK30gVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmCit7CisgIFVTQVJUX1R5cGVEZWYgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgICAgIC8qITwgVUFSVCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICAgICAgICAqLworCisgIFVBUlRfSW5pdFR5cGVEZWYgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAqLworCisgIFVBUlRfQWR2RmVhdHVyZUluaXRUeXBlRGVmIEFkdmFuY2VkSW5pdDsgICAgICAgICAgIC8qITwgVUFSVCBBZHZhbmNlZCBGZWF0dXJlcyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFR4WGZlclNpemU7ICAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFR4WGZlckNvdW50OyAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIFVBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgIFJ4WGZlckNvdW50OyAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgIE1hc2s7ICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgIEZpZm9Nb2RlOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIEZJRk8gbW9kZSBpcyBiZWluZyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVUFSVEV4X0ZJRk9fbW9kZS4gKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgTmJSeERhdGFUb1Byb2Nlc3M7ICAgICAgICAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYIElTUiBleGVjdXRpb24gKi8KKworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgTmJUeERhdGFUb1Byb2Nlc3M7ICAgICAgICAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFRYIElTUiBleGVjdXRpb24gKi8KKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gUnggSVJRIGhhbmRsZXIgICAqLworCisgIHZvaWQgKCpUeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBUeCBJUlEgaGFuZGxlciAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hdHg7ICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hcng7ICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFJ4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAgICAgICAgLyohPCBMb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgICAgZ1N0YXRlOyAgICAgICAgICAgICAgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZ2xvYmFsIEhhbmRsZSBtYW5hZ2VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gcmVsYXRlZCB0byBUeCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSEFMX1VBUlRfU3RhdGVUeXBlRGVmICovCisKKyAgX19JTyBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgICAgUnhTdGF0ZTsgICAgICAgICAgICAgLyohPCBVQVJUIHN0YXRlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gUnggb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEhBTF9VQVJUX1N0YXRlVHlwZURlZiAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgIC8qITwgVUFSVCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAoKiBUeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgLyohPCBVQVJUIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgICAgIC8qITwgVUFSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIFJ4SGFsZkNwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAvKiE8IFVBUlQgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAgLyohPCBVQVJUIFJ4IENvbXBsZXRlIENhbGxiYWNrICAgICAgICAgICAgICovCisgIHZvaWQgKCogRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgICAgICAgIC8qITwgVUFSVCBFcnJvciBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEFib3J0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAvKiE8IFVBUlQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBVQVJUIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCogQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgIC8qITwgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICAqLworICB2b2lkICgqIFdha2V1cENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAgICAvKiE8IFVBUlQgV2FrZXVwIENhbGxiYWNrICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBSeEZpZm9GdWxsQ2FsbGJhY2spKHN0cnVjdCBfX1VBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOyAgICAgICAgLyohPCBVQVJUIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAgICAgICAgICAgICovCisgIHZvaWQgKCogVHhGaWZvRW1wdHlDYWxsYmFjaykoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAgICAgIC8qITwgVUFSVCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICAgICAgICAgICAqLworCisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAgIC8qITwgVUFSVCBNc3AgSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgICAgICAgICAvKiE8IFVBUlQgTXNwIERlSW5pdCBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9IFVBUlRfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEhBTCBVQVJUIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFVBUlQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgKi8KKyAgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBVQVJUIFR4IENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCAgICAgICAgID0gMHgwMlUsICAgIC8qITwgVUFSVCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCAgICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFVBUlQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBVQVJUIEVycm9yIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEICAgICAgICAgID0gMHgwNVUsICAgIC8qITwgVUFSVCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCA9IDB4MDZVLCAgICAvKiE8IFVBUlQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgSUQgKi8KKyAgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCAgPSAweDA3VSwgICAgLyohPCBVQVJUIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQgICovCisgIEhBTF9VQVJUX1dBS0VVUF9DQl9JRCAgICAgICAgICAgICAgICAgID0gMHgwOFUsICAgIC8qITwgVUFSVCBXYWtldXAgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAqLworICBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgICAgICAgICAgICA9IDB4MDlVLCAgICAvKiE8IFVBUlQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElEICAgICAgICAgICAgKi8KKyAgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCAgICAgICAgICAgPSAweDBBVSwgICAgLyohPCBVQVJUIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQgICAgICAgICAgICovCisKKyAgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCAgICAgICAgICAgICAgICAgPSAweDBCVSwgICAgLyohPCBVQVJUIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICovCisgIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwQ1UgICAgIC8qITwgVUFSVCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAqLworCit9IEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBVQVJUIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBVQVJUX0NhbGxiYWNrVHlwZURlZikoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7ICAvKiE8IHBvaW50ZXIgdG8gYW4gVUFSVCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJUX0V4cG9ydGVkX0NvbnN0YW50cyBVQVJUIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdGF0ZV9EZWZpbml0aW9uIFVBUlQgU3RhdGUgQ29kZSBEZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX1JFU0VUICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCBQZXJpcGhlcmFsIGlzIG5vdCBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBhbmQgUnhTdGF0ZSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfUkVBRFkgICAgICAgICAweDAwMDAwMDIwVSAgICAvKiE8IFBlcmlwaGVyYWwgSW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgYW5kIFJ4U3RhdGUgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX1NUQVRFX0JVU1kgICAgICAgICAgMHgwMDAwMDAyNFUgICAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworI2RlZmluZSAgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCAgICAgICAweDAwMDAwMDIxVSAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9CVVNZX1JYICAgICAgIDB4MDAwMDAwMjJVICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgYWxsb3dlZCBmb3IgUnhTdGF0ZSBvbmx5ICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9CVVNZX1RYX1JYICAgIDB4MDAwMDAwMjNVICAgIC8qITwgRGF0YSBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdG8gYmUgdXNlZCBmb3IgbmVpdGhlciBnU3RhdGUgbm9yIFJ4U3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgcmVzdWx0IG9mIGNvbWJpbmF0aW9uIChPcikgYmV0d2VlbiBnU3RhdGUgYW5kIFJ4U3RhdGUgdmFsdWVzICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9USU1FT1VUICAgICAgIDB4MDAwMDAwQTBVICAgIC8qITwgVGltZW91dCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIGlzIGFsbG93ZWQgZm9yIGdTdGF0ZSBvbmx5ICovCisjZGVmaW5lICBIQUxfVUFSVF9TVEFURV9FUlJPUiAgICAgICAgIDB4MDAwMDAwRTBVICAgIC8qITwgRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBhbGxvd2VkIGZvciBnU3RhdGUgb25seSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0Vycm9yX0RlZmluaXRpb24gICBVQVJUIEVycm9yIERlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfTk9ORSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9QRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAgIC8qITwgUGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX05FICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfRkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAgICAvKiE8IEZyYW1lIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9PUkUgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAgIC8qITwgT3ZlcnJ1biBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX0RNQSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RvcF9CaXRzICAgVUFSVCBOdW1iZXIgb2YgU3RvcCBCaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18wXzUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9TVE9QXzAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgZnJhbWUgd2l0aCAwLjUgc3RvcCBiaXQgICovCisjZGVmaW5lIFVBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGZyYW1lIHdpdGggMSBzdG9wIGJpdCAgICAqLworI2RlZmluZSBVQVJUX1NUT1BCSVRTXzFfNSAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IyX1NUT1BfMCB8IFVTQVJUX0NSMl9TVE9QXzEpIC8qITwgVUFSVCBmcmFtZSB3aXRoIDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgVUFSVF9TVE9QQklUU18yICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9TVE9QXzEgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgZnJhbWUgd2l0aCAyIHN0b3AgYml0cyAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfUGFyaXR5ICBVQVJUIFBhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfUEFSSVRZX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBwYXJpdHkgICAqLworI2RlZmluZSBVQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgVUFSVF9QQVJJVFlfT0REICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMpICAgICAvKiE8IE9kZCBwYXJpdHkgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSGFyZHdhcmVfRmxvd19Db250cm9sIFVBUlQgSGFyZHdhcmUgRmxvdyBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9IV0NPTlRST0xfTk9ORSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGhhcmR3YXJlIGNvbnRyb2wgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9IV0NPTlRST0xfUlRTICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3QgVG8gU2VuZCAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19DVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENsZWFyIFRvIFNlbmQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9IV0NPTlRST0xfUlRTX0NUUyAgICAgICAgICAgICAgIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAgICAvKiE8IFJlcXVlc3QgYW5kIENsZWFyIFRvIFNlbmQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9Nb2RlIFVBUlQgVHJhbnNmZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfTU9ERV9SWCAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SRSAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVQVJUX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgIC8qITwgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9NT0RFX1RYX1JYICAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAvKiE8IFJYIGFuZCBUWCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfU3RhdGUgIFVBUlQgU3RhdGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1NUQVRFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgIC8qITwgVUFSVCBkaXNhYmxlZCAgKi8KKyNkZWZpbmUgVUFSVF9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1VFICAgICAgICAvKiE8IFVBUlQgZW5hYmxlZCAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfT3Zlcl9TYW1wbGluZyBVQVJUIE92ZXIgU2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX09WRVJTQU1QTElOR18xNiAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgIC8qITwgT3ZlcnNhbXBsaW5nIGJ5IDE2ICovCisjZGVmaW5lIFVBUlRfT1ZFUlNBTVBMSU5HXzggICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9PVkVSOCAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgOCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PbmVCaXRfU2FtcGxpbmcgVUFSVCBPbmUgQml0IFNhbXBsaW5nIE1ldGhvZAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBPbmUtYml0IHNhbXBsaW5nIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUgICAgICAgICAgVVNBUlRfQ1IzX09ORUJJVCAgICAvKiE8IE9uZS1iaXQgc2FtcGxpbmcgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0Nsb2NrUHJlc2NhbGVyICBVQVJUIENsb2NrIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjEgICAgMHgwMDAwMDAwMFUgIC8qITwgZmNsa19wcmVzID0gZmNsayAgICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMiAgICAweDAwMDAwMDAxVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzIgICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVY0ICAgIDB4MDAwMDAwMDJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvNCAgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjYgICAgMHgwMDAwMDAwM1UgIC8qITwgZmNsa19wcmVzID0gZmNsay82ICAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWOCAgICAweDAwMDAwMDA0VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzggICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYxMCAgIDB4MDAwMDAwMDVVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMTAgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjEyICAgMHgwMDAwMDAwNlUgIC8qITwgZmNsa19wcmVzID0gZmNsay8xMiAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTYgICAweDAwMDAwMDA3VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzE2ICAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYzMiAgIDB4MDAwMDAwMDhVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMzIgICovCisjZGVmaW5lIFVBUlRfUFJFU0NBTEVSX0RJVjY0ICAgMHgwMDAwMDAwOVUgIC8qITwgZmNsa19wcmVzID0gZmNsay82NCAgKi8KKyNkZWZpbmUgVUFSVF9QUkVTQ0FMRVJfRElWMTI4ICAweDAwMDAwMDBBVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyOCAqLworI2RlZmluZSBVQVJUX1BSRVNDQUxFUl9ESVYyNTYgIDB4MDAwMDAwMEJVICAvKiE8IGZjbGtfcHJlcyA9IGZjbGsvMjU2ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9BdXRvQmF1ZF9SYXRlX01vZGUgICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIEF1dG9CYXVkIFJhdGUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05TVEFSVEJJVCAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gb24gc3RhcnQgYml0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTkZBTExJTkdFREdFIFVTQVJUX0NSMl9BQlJNT0RFXzAgICAvKiE8IEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBvbiBmYWxsaW5nIGVkZ2UgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg3RkZSQU1FICAgVVNBUlRfQ1IyX0FCUk1PREVfMSAgIC8qITwgQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG9uIDB4N0YgZnJhbWUgZGV0ZWN0aW9uICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT04wWDU1RlJBTUUgICBVU0FSVF9DUjJfQUJSTU9ERSAgICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gb24gMHg1NSBmcmFtZSBkZXRlY3Rpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SZWNlaXZlcl9UaW1lT3V0IFVBUlQgUmVjZWl2ZXIgVGltZU91dAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfUkVDRUlWRVJfVElNRU9VVF9ESVNBQkxFICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfUkVDRUlWRVJfVElNRU9VVF9FTkFCTEUgICAgICAgIFVTQVJUX0NSMl9SVE9FTiAgICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTElOICAgIFVBUlQgTG9jYWwgSW50ZXJjb25uZWN0aW9uIE5ldHdvcmsgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfTElOX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITwgTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0xJTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTElORU4gICAgICAgICAgICAvKiE8IExvY2FsIEludGVyY29ubmVjdCBOZXR3b3JrIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9MSU5fQnJlYWtfRGV0ZWN0aW9uICBVQVJUIExJTiBCcmVhayBEZXRlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzEwQiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IExJTiAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCAqLworI2RlZmluZSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQiAgICAgICBVU0FSVF9DUjJfTEJETCAgICAgICAgICAgICAvKiE8IExJTiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfVHggICAgVUFSVCBETUEgVHgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RNQV9UWF9ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IFVBUlQgRE1BIFRYIGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfRE1BX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ETUFUICAgICAgICAgICAgIC8qITwgVUFSVCBETUEgVFggZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9ETUFfUnggICBVQVJUIERNQSBSeAorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfRE1BX1JYX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgRE1BIFJYIGRpc2FibGVkICovCisjZGVmaW5lIFVBUlRfRE1BX1JYX0VOQUJMRSAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ETUFSICAgICAgICAgICAgICAvKiE8IFVBUlQgRE1BIFJYIGVuYWJsZWQgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSGFsZl9EdXBsZXhfU2VsZWN0aW9uICBVQVJUIEhhbGYgRHVwbGV4IFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSEFMRl9EVVBMRVhfRElTQUJMRSAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgaGFsZi1kdXBsZXggZGlzYWJsZWQgKi8KKyNkZWZpbmUgVUFSVF9IQUxGX0RVUExFWF9FTkFCTEUgICAgICAgICAgICAgVVNBUlRfQ1IzX0hEU0VMICAgICAgICAgICAgIC8qITwgVUFSVCBoYWxmLWR1cGxleCBlbmFibGVkICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1dha2VVcF9NZXRob2RzICAgVUFSVCBXYWtlVXAgTWV0aG9kcworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiBpZGxlIGxpbmUgICAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBNRVRIT0RfQUREUkVTU01BUksgICAgICAgVVNBUlRfQ1IxX1dBS0UgICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIGFkZHJlc3MgbWFyayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1JlcXVlc3RfUGFyYW1ldGVycyBVQVJUIFJlcXVlc3QgUGFyYW1ldGVycworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQVVUT0JBVURfUkVRVUVTVCAgICAgICAgICAgICAgIFVTQVJUX1JRUl9BQlJSUSAgICAgICAgLyohPCBBdXRvLUJhdWQgUmF0ZSBSZXF1ZXN0ICAgICAgKi8KKyNkZWZpbmUgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCAgICAgICAgICAgICAgVVNBUlRfUlFSX1NCS1JRICAgICAgICAvKiE8IFNlbmQgQnJlYWsgUmVxdWVzdCAgICAgICAgICAqLworI2RlZmluZSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUICAgICAgICAgICAgICBVU0FSVF9SUVJfTU1SUSAgICAgICAgIC8qITwgTXV0ZSBNb2RlIFJlcXVlc3QgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgICAgIFVTQVJUX1JRUl9SWEZSUSAgICAgICAgLyohPCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdCAgKi8KKyNkZWZpbmUgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCAgICAgICAgICAgVVNBUlRfUlFSX1RYRlJRICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0FkdmFuY2VkX0ZlYXR1cmVzX0luaXRpYWxpemF0aW9uX1R5cGUgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBJbml0aWFsaXphdGlvbiBUeXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgTm8gYWR2YW5jZWQgZmVhdHVyZSBpbml0aWFsaXphdGlvbiAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUICAgICAgICAgICAweDAwMDAwMDAyVSAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCAgICAgICAgIDB4MDAwMDAwMDRVICAgICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9JTklUICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAgICAgICAgLyohPCBUWC9SWCBwaW5zIHN3YXAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQgICAweDAwMDAwMDEwVSAgICAgICAgICAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RNQURJU0FCTEVPTkVSUk9SX0lOSVQgIDB4MDAwMDAwMjBVICAgICAgICAgIC8qITwgRE1BIGRpc2FibGUgb24gUmVjZXB0aW9uIEVycm9yICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0lOSVQgICAgICAgMHgwMDAwMDA0MFUgICAgICAgICAgLyohPCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gaW5pdGlhbGl6YXRpb24gICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9JTklUICAgICAgICAgICAweDAwMDAwMDgwVSAgICAgICAgICAvKiE8IE1vc3Qgc2lnbmlmaWNhbnQgYml0IHNlbnQvcmVjZWl2ZWQgZmlyc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9UeF9JbnYgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFRYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9UWElOVl9FTkFCTEUgICAgICAgIFVTQVJUX0NSMl9UWElOViAgICAgICAgIC8qITwgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1J4X0ludiBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0VOQUJMRSAgICAgICAgVVNBUlRfQ1IyX1JYSU5WICAgICAgICAgLyohPCBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRGF0YV9JbnYgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBCaW5hcnkgRGF0YSBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVl9ESVNBQkxFICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEJpbmFyeSBkYXRhIGludmVyc2lvbiBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSAgICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgIC8qITwgQmluYXJ5IGRhdGEgaW52ZXJzaW9uIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9SeF9UeF9Td2FwIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBSWCBUWCBQaW5zIFN3YXAKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1dBUF9ESVNBQkxFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgc3dhcCBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSAgICAgICAgIFVTQVJUX0NSMl9TV0FQICAgICAgICAgIC8qITwgVFgvUlggcGlucyBzd2FwIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9PdmVycnVuX0Rpc2FibGUgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBPdmVycnVuIERpc2FibGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9FTkFCTEUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFJYIG92ZXJydW4gZW5hYmxlICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfT1ZFUlJVTl9ESVNBQkxFICAgICBVU0FSVF9DUjNfT1ZSRElTICAgICAgICAvKiE8IFJYIG92ZXJydW4gZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0F1dG9CYXVkUmF0ZV9FbmFibGUgIFVBUlQgQWR2YW5jZWQgRmVhdHVyZSBBdXRvIEJhdWRSYXRlIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgUlggQXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIGVuYWJsZSAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUgICAgVVNBUlRfQ1IyX0FCUkVOICAgICAgLyohPCBSWCBBdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24gZGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0RNQV9EaXNhYmxlX29uX1J4X0Vycm9yICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIERNQSBEaXNhYmxlIE9uIFJ4IEVycm9yCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RNQV9FTkFCTEVPTlJYRVJST1IgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBETUEgZW5hYmxlIG9uIFJlY2VwdGlvbiBFcnJvciAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SICAgVVNBUlRfQ1IzX0REUkUgICAgICAgLyohPCBETUEgZGlzYWJsZSBvbiBSZWNlcHRpb24gRXJyb3IgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9NU0JfRmlyc3QgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgTVNCIEZpcnN0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0RJU0FCTEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSAgICAgVVNBUlRfQ1IyX01TQkZJUlNUICAgICAgLyohPCBNb3N0IHNpZ25pZmljYW50IGJpdCBzZW50L3JlY2VpdmVkIGZpcnN0IGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdG9wX01vZGVfRW5hYmxlICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFN0b3AgTW9kZSBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFVBUlQgc3RvcCBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0VOQUJMRSAgICAgVVNBUlRfQ1IxX1VFU00gICAgICAgICAgLyohPCBVQVJUIHN0b3AgbW9kZSBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfTXV0ZV9Nb2RlICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIE11dGUgTW9kZSBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfTVVURU1PREVfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFVBUlQgbXV0ZSBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSAgICAgVVNBUlRfQ1IxX01NRSAgICAgICAgICAgLyohPCBVQVJUIG11dGUgbW9kZSBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUyAgICBVQVJUIEFkZHJlc3MtbWF0Y2hpbmcgTFNCIFBvc2l0aW9uIEluIENSMiBSZWdpc3RlcgorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUyAgICAgICAgICAgICAyNFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBhZGRyZXNzLW1hdGNoaW5nIExTQiBwb3NpdGlvbiBpbiBDUjIgcmVnaXN0ZXIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9XYWtlVXBfZnJvbV9TdG9wX1NlbGVjdGlvbiAgIFVBUlQgV2FrZVVwIEZyb20gU3RvcCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUICAgICAgICAgICAgIFVTQVJUX0NSM19XVVNfMSAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIHN0YXJ0IGJpdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkgICAgVVNBUlRfQ1IzX1dVUyAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gcmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBvciBSWEZJRk8gaXMgbm90IGVtcHR5ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRHJpdmVyRW5hYmxlX1BvbGFyaXR5ICAgICAgVUFSVCBEcml2ZXJFbmFibGUgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IERyaXZlciBlbmFibGUgc2lnbmFsIGlzIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAgIC8qITwgRHJpdmVyIGVuYWJsZSBzaWduYWwgaXMgYWN0aXZlIGxvdyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9DUjFfREVBVF9BRERSRVNTX0xTQl9QT1MgICAgVUFSVCBEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lIExTQiBQb3NpdGlvbiBJbiBDUjEgUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyAgICAgICAyMVUgICAgICAvKiE8IFVBUlQgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gdGltZSBMU0IgcG9zaXRpb24gaW4gQ1IxIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfQ1IxX0RFRFRfQUREUkVTU19MU0JfUE9TICAgIFVBUlQgRHJpdmVyIEVuYWJsZSBEZUFzc2VydGlvbiBUaW1lIExTQiBQb3NpdGlvbiBJbiBDUjEgUmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyAgICAgICAxNlUgICAgICAvKiE8IFVBUlQgRHJpdmVyIEVuYWJsZSBkZS1hc3NlcnRpb24gdGltZSBMU0IgcG9zaXRpb24gaW4gQ1IxIHJlZ2lzdGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfSW50ZXJydXB0aW9uX01hc2sgICAgVUFSVCBJbnRlcnJ1cHRpb25zIEZsYWcgTWFzaworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRlUgIC8qITwgVUFSVCBpbnRlcnJ1cHRpb25zIGZsYWdzIG1hc2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9UaW1lT3V0X1ZhbHVlICAgIFVBUlQgcG9sbGluZy1iYXNlZCBjb21tdW5pY2F0aW9ucyB0aW1lLW91dCB2YWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VQVJUX1RJTUVPVVRfVkFMVUUgICAgICAgICAgICAgIDB4MUZGRkZGRlUgIC8qITwgVUFSVCBwb2xsaW5nLWJhc2VkIGNvbW11bmljYXRpb25zIHRpbWUtb3V0IHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRmxhZ3MgICAgIFVBUlQgU3RhdHVzIEZsYWdzCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFgKKyAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhGVCAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhGVCAgICAgICAgICAvKiE8IFVBUlQgVFhGSUZPIHRocmVzaG9sZCBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SWEZUICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWEZUICAgICAgICAgIC8qITwgVUFSVCBSWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYRkYgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRkYgICAgICAgICAgLyohPCBVQVJUIFJYRklGTyBGdWxsIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVFhGRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhGRSAgICAgICAgICAvKiE8IFVBUlQgVFhGSUZPIEVtcHR5IGZsYWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SRUFDSyAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RFQUNLICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfV1VGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfV1VGICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBmbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SV1UgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SV1UgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB3YWtlLXVwIGZyb20gbXV0ZSBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1NCS0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1NCS0YgICAgICAgICAgLyohPCBVQVJUIHNlbmQgYnJlYWsgZmxhZyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQ01GICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQ01GICAgICAgICAgICAvKiE8IFVBUlQgY2hhcmFjdGVyIG1hdGNoIGZsYWcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgIC8qITwgVUFSVCBidXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0FCUkYgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0FCUkYgICAgICAgICAgLyohPCBVQVJUIGF1dG8gQmF1ZCByYXRlIGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfQUJSRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRSAgICAgICAgICAvKiE8IFVBUlQgYXV0byBCYXVkIHJhdGUgZXJyb3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19DVFMgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFMgICAgICAgICAgIC8qITwgVUFSVCBjbGVhciB0byBzZW5kIGZsYWcgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX0NUU0lGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUU0lGICAgICAgICAgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgaW50ZXJydXB0IGZsYWcgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfTEJERiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTEJERiAgICAgICAgICAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgIC8qITwgVUFSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1RYRk5GICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBVQVJUIFRYRklGTyBub3QgZnVsbCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IFVBUlQgdHJhbnNtaXNzaW9uIGNvbXBsZXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWE5FX1JYRk5FICAgIC8qITwgVUFSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX1JYRk5FICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgLyohPCBVQVJUIFJYRklGTyBub3QgZW1wdHkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfSURMRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfSURMRSAgICAgICAgICAvKiE8IFVBUlQgaWRsZSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19PUkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9PUkUgICAgICAgICAgIC8qITwgVUFSVCBvdmVycnVuIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9GTEFHX05FICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgLyohPCBVQVJUIG5vaXNlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfRkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRkUgICAgICAgICAgICAvKiE8IFVBUlQgZnJhbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfRkxBR19QRSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9QRSAgICAgICAgICAgIC8qITwgVUFSVCBwYXJpdHkgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9JbnRlcnJ1cHRfZGVmaW5pdGlvbiAgIFVBUlQgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDBaWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNWJpdHMpCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwMDAwMDBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgRWxlbWVudHMgdmFsdWVzIGNvbnZlbnRpb246IDAwMDBaWlpaMDAwMDAwMDBiCisgICogICAgICAgICAgIC0gWlpaWiAgOiBGbGFnIHBvc2l0aW9uIGluIHRoZSBJU1IgcmVnaXN0ZXIoNGJpdHMpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9JVF9QRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI4VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBwYXJpdHkgZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVBUlRfSVRfVFhGTkYgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyN1UgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI2VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0aW9uICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVBUlRfSVRfUlhGTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDUyNVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgUlhGSUZPIG5vdCBlbXB0eSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI0VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBpZGxlIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX0xCRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4NDZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0aW9uICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfQ1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk2QVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgQ1RTIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9DTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTJFVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBjaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0aW9uICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1dVRiAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzZVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0aW9uICAgICAgICovCisjZGVmaW5lIFVBUlRfSVRfUlhGRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgzRlUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgUlhGSUZPIGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9UWEZFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzNFVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBUWEZJRk8gZW1wdHkgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0lUX1JYRlQgICAgICAgICAgICAgICAgICAgICAgICAweDFBN0NVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFJYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24gICAgICovCisjZGVmaW5lIFVBUlRfSVRfVFhGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MUI3N1UgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkIGludGVycnVwdGlvbiAgICAgKi8KKworLyogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwMDAwMDBYWFlZWVlZYgorICAgICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgICAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgICAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9JVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAqLworCisvKiAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMDAwMFpaWlowMDAwMDAwMGIKKyAgICAgICAgICAgICAtIFpaWlogIDogRmxhZyBwb3NpdGlvbiBpbiB0aGUgSVNSIHJlZ2lzdGVyKDRiaXRzKSAqLworI2RlZmluZSBVQVJUX0lUX09SRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDBVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVBUlRfSVRfTkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMFUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgbm9pc2UgZXJyb3IgaW50ZXJydXB0aW9uICAgKi8KKyNkZWZpbmUgVUFSVF9JVF9GRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBmcmFtZSBlcnJvciBpbnRlcnJ1cHRpb24gICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX0lUX0NMRUFSX0ZsYWdzICBVQVJUIEludGVycnVwdGlvbiBDbGVhciBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgIC8qITwgTm9pc2UgRXJyb3IgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfSURMRUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgIC8qITwgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVFhGRUNGICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVFhGRUNGICAgICAgICAgIC8qITwgVFhGSUZPIGVtcHR5IGNsZWFyIGZsYWcgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfTEJERiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTEJEQ0YgICAgICAgICAgIC8qITwgTElOIEJyZWFrIERldGVjdGlvbiBDbGVhciBGbGFnICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ1RTRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgIC8qITwgQ1RTIEludGVycnVwdCBDbGVhciBGbGFnICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfQ01GICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfV1VGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgIC8qITwgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfTWFjcm9zIFVBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgUmVzZXQgVUFSVCBoYW5kbGUgc3RhdGVzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9VQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfVUFSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFU0VUOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRVNFVDsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKKyNlbmRpZiAvKlVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqIEBicmllZiAgRmx1c2ggdGhlIFVBUlQgRGF0YSByZWdpc3RlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgXAorICBkb3sgICAgICAgICAgICAgICAgXAorICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICB9ICB3aGlsZSgwVSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGICAgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfVFhGRUNGICAgVFhGSUZPIGVtcHR5IGNsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RDRiAgICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgICBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NUU0YgICAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ01GICAgICAgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgICAgIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgQ2xlYXIgRmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfUEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9QRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIEZFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9GRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgTkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9ORUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVQVJUIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfT1JFRkxBRyhfX0hBTkRMRV9fKSAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVBUlRfQ0xFQVJfT1JFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVBUlQgSURMRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSURMRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoKF9fSEFORExFX18pLCBVQVJUX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVUFSVCBUWCBGSUZPIGVtcHR5IGNsZWFyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfVFhGRUNGKF9fSEFORExFX18pICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVUFSVF9DTEVBUl9UWEZFQ0YpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhGVCAgVFhGSUZPIHRocmVzaG9sZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWEZGICBSWEZJRk8gRnVsbCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRkUgIFRYRklGTyBFbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEVBQ0sgVHJhbnNtaXQgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfV1VGICAgV2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JXVSAgIFJlY2VpdmVyIHdha2UgdXAgZmxhZyAoaWYgdGhlIFVBUlQgaW4gbXV0ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19TQktGICBTZW5kIEJyZWFrIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQ01GICAgQ2hhcmFjdGVyIG1hdGNoIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkYgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0FCUkUgIEF1dG8gQmF1ZCByYXRlIGRldGVjdGlvbiBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0NUUyAgIENUUyBDaGFuZ2UgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19MQkRGICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVFhFICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRk5GIFVBUlQgVFhGSUZPIG5vdCBmdWxsIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfVEMgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1JYRk5FIFVBUlQgUlhGSUZPIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19PUkUgICBPdmVycnVuIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUEUgICAgUGFyaXR5IEVycm9yIGZsYWcKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmIChfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChmcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSk/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgfD0gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVUFSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gfiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVBUlRfSVRfTUFTSykpKSkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGRSAgVFhGSUZPIEVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSU5URVJSVVBUX18pPj4gOFUpKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRkUgIFRYRklGTyBFbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDFVKSA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgVUFSVF9JVF9NQVNLKSkpICAhPSBSRVNFVCkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVQVJUIElTUiBmbGFnLCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgSUNSIHJlZ2lzdGVyIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUEVGICAgIFBhcml0eSBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9GRUYgICAgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfSURMRUYgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UWEZFQ0YgVFhGSUZPIGVtcHR5IENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1RDRiAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfTEJERiAgIExJTiBCcmVhayBEZXRlY3Rpb24gQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ1RTRiAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ01GICAgIENoYXJhY3RlciBNYXRjaCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9XVUYgICAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVQVJUIHJlcXVlc3QgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fUkVRX18gc3BlY2lmaWVzIHRoZSByZXF1ZXN0IGZsYWcgdG8gc2V0CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0FVVE9CQVVEX1JFUVVFU1QgQXV0by1CYXVkIFJhdGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfU0VOREJSRUFLX1JFUVVFU1QgU2VuZCBCcmVhayBSZXF1ZXN0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9NVVRFX01PREVfUkVRVUVTVCBNdXRlIE1vZGUgUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgUmVjZWl2ZSBEYXRhIGZsdXNoIFJlcXVlc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIgfD0gKHVpbnQxNl90KShfX1JFUV9fKSkKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIG9uZSBiaXQgc2FtcGxlIG1ldGhvZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9PTkVfQklUX1NBTVBMRV9FTkFCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM3w9IFVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFVBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VQVJUX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+VVNBUlRfQ1IzX09ORUJJVCkKKworLyoqIEBicmllZiAgRW5hYmxlIFVBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVVNBUlRfQ1IxX1VFKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFVBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gflVTQVJUX0NSMV9VRSkKKworLyoqIEBicmllZiAgRW5hYmxlIENUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBlbmFibGUgQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBVQVJUIGluc3RhbmNlLAorICAqICAgICAgICAgd2l0aG91dCBuZWVkIHRvIGNhbGwgSEFMX1VBUlRfSW5pdCgpIGZ1bmN0aW9uLgorICAqICAgICAgICAgQXMgaW52b2x2aW5nIGRpcmVjdCBhY2Nlc3MgdG8gVUFSVCByZWdpc3RlcnMsIHVzYWdlIG9mIHRoaXMgbWFjcm8gc2hvdWxkIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHVzZXIuCisgICogQG5vdGUgICBBcyBtYWNybyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBtb2RpZnlpbmcgQ1RTIEh3IGZsb3cgY29udHJvbCBmZWF0dXJlIGFjdGl2YXRpb24sIHdpdGhvdXQgbmVlZAorICAqICAgICAgICAgZm9yIFVTQVJUIGluc3RhbmNlIERlaW5pdC9Jbml0LCBmb2xsb3dpbmcgY29uZGl0aW9ucyBmb3IgbWFjcm8gY2FsbCBzaG91bGQgYmUgZnVsZmlsbGVkIDoKKyAgKiAgICAgICAgICAgLSBVQVJUIGluc3RhbmNlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCAodGhyb3VnaCBjYWxsIG9mIEhBTF9VQVJUX0luaXQoKSApCisgICogICAgICAgICAgIC0gbWFjcm8gY291bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb3JyZXNwb25kaW5nIFVBUlQgaW5zdGFuY2UgaXMgZGlzYWJsZWQgKGkuZS4gX19IQUxfVUFSVF9ESVNBQkxFKF9fSEFORExFX18pKQorICAqICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gRW5hYmxlIG1hY3JvIChpLmUuIF9fSEFMX1VBUlRfRU5BQkxFKF9fSEFORExFX18pKS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVUFSVF9IV0NPTlRST0xfQ1RTX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19DVFNFKTsgIFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuSHdGbG93Q3RsIHw9IFVTQVJUX0NSM19DVFNFOyAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBEaXNhYmxlIENUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIENUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX0NUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19DVFNFKTsgICAgICBcCisgIH0gd2hpbGUoMFUpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBSVFMgZmxvdyBjb250cm9sLgorICAqIEBub3RlICAgVGhpcyBtYWNybyBhbGxvd3MgdG8gZW5hYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19FTkFCTEUoX19IQU5ETEVfXykgICAgICAgXAorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOyBcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCB8PSBVU0FSVF9DUjNfUlRTRTsgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBEaXNhYmxlIFJUUyBmbG93IGNvbnRyb2wuCisgICogQG5vdGUgICBUaGlzIG1hY3JvIGFsbG93cyB0byBkaXNhYmxlIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZm9yIGEgZ2l2ZW4gVUFSVCBpbnN0YW5jZSwKKyAgKiAgICAgICAgIHdpdGhvdXQgbmVlZCB0byBjYWxsIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKyAgKiAgICAgICAgIEFzIGludm9sdmluZyBkaXJlY3QgYWNjZXNzIHRvIFVBUlQgcmVnaXN0ZXJzLCB1c2FnZSBvZiB0aGlzIG1hY3JvIHNob3VsZCBiZSBmdWxseSBlbmRvcnNlZCBieSB1c2VyLgorICAqIEBub3RlICAgQXMgbWFjcm8gaXMgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIFJUUyBIdyBmbG93IGNvbnRyb2wgZmVhdHVyZSBhY3RpdmF0aW9uLCB3aXRob3V0IG5lZWQKKyAgKiAgICAgICAgIGZvciBVU0FSVCBpbnN0YW5jZSBEZWluaXQvSW5pdCwgZm9sbG93aW5nIGNvbmRpdGlvbnMgZm9yIG1hY3JvIGNhbGwgc2hvdWxkIGJlIGZ1bGZpbGxlZCA6CisgICogICAgICAgICAgIC0gVUFSVCBpbnN0YW5jZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgKHRocm91Z2ggY2FsbCBvZiBIQUxfVUFSVF9Jbml0KCkgKQorICAqICAgICAgICAgICAtIG1hY3JvIGNvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29ycmVzcG9uZGluZyBVQVJUIGluc3RhbmNlIGlzIGRpc2FibGVkIChpLmUuIF9fSEFMX1VBUlRfRElTQUJMRShfX0hBTkRMRV9fKSkKKyAgKiAgICAgICAgICAgICBhbmQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIEVuYWJsZSBtYWNybyAoaS5lLiBfX0hBTF9VQVJUX0VOQUJMRShfX0hBTkRMRV9fKSkuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VBUlRfSFdDT05UUk9MX1JUU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgIFwKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SVFNFKTtcCisgICAgKF9fSEFORExFX18pLT5Jbml0Lkh3Rmxvd0N0bCAmPSB+KFVTQVJUX0NSM19SVFNFKTsgICAgIFwKKyAgfSB3aGlsZSgwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX01hY3JvcyAgIFVBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqIEBicmllZiAgR2V0IFVBUlQgY2xvayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBjbG9jayBwcmVzY2FsZXIgdmFsdWUuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBVQVJUIGNsb2NrIGRpdmlzaW9uIGZhY3RvcgorICAqLworI2RlZmluZSBVQVJUX0dFVF9ESVZfRkFDVE9SKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgXAorICAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpICAgPyAxVSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYyKSAgID8gMlUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWNCkgICA/IDRVIDogICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpICAgPyA2VSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY4KSAgID8gOFUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTApICA/IDEwVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSAgPyAxMlUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxNikgID8gMTZVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMzIpICA/IDMyVSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSAgPyA2NFUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMjgpID8gMTI4VSA6ICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMjU2KSA/IDI1NlUgOiAxVSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIHdpdGggTFBVQVJULgorICAqIEBwYXJhbSAgX19QQ0xLX18gTFBVQVJUIGNsb2NrLgorICAqIEBwYXJhbSAgX19CQVVEX18gQmF1ZCByYXRlIHNldCBieSB0aGUgdXNlci4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVQVJUIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICAqLworI2RlZmluZSBVQVJUX0RJVl9MUFVBUlQoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAgICAgKCh1aW50MzJfdCkoKCgoKHVpbnQ2NF90KShfX1BDTEtfXykvVUFSVF9HRVRfRElWX0ZBQ1RPUigoX19DTE9DS1BSRVNDQUxFUl9fKSkpKjI1NlUpICsgKHVpbnQzMl90KSgoX19CQVVEX18pLzJVKSkgLyAoX19CQVVEX18pKSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDgtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gVUFSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVUFSVF9ESVZfU0FNUExJTkc4KF9fUENMS19fLCBfX0JBVURfXywgX19DTE9DS1BSRVNDQUxFUl9fKSAgICgoKCgoX19QQ0xLX18pL1VBUlRfR0VUX0RJVl9GQUNUT1IoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykpKSoyVSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgQlJSIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBzZXQgQlJSIHJlZ2lzdGVyIGluIDE2LWJpdCBvdmVyc2FtcGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIF9fUENMS19fIFVBUlQgY2xvY2suCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEBwYXJhbSAgX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgcHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgRGl2aXNpb24gcmVzdWx0CisgICovCisjZGVmaW5lIFVBUlRfRElWX1NBTVBMSU5HMTYoX19QQ0xLX18sIF9fQkFVRF9fLCBfX0NMT0NLUFJFU0NBTEVSX18pICAoKCgoX19QQ0xLX18pL1VBUlRfR0VUX0RJVl9GQUNUT1IoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykpKSArICgoX19CQVVEX18pLzJVKSkgLyAoX19CQVVEX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIG9yIG5vdCBVQVJUIGluc3RhbmNlIGlzIExvdyBQb3dlciBVQVJULgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgU0VUIChpbnN0YW5jZSBpcyBMUFVBUlQpIG9yIFJFU0VUIChpbnN0YW5jZSBpc24ndCBMUFVBUlQpCisgICovCisjZGVmaW5lIFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoX19IQU5ETEVfXykgKElTX0xQVUFSVF9JTlNUQU5DRSgoX19IQU5ETEVfXyktPkluc3RhbmNlKSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBCYXVkIHJhdGUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAqICAgICAgICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBXQiAoaS5lLiA2NCBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAgKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKF9fQkFVRFJBVEVfXykgPCA4MDAwMDAxVSkKKworLyoqIEBicmllZiAgQ2hlY2sgVUFSVCBhc3NlcnRpb24gdGltZS4KKyAgKiBAcGFyYW0gIF9fVElNRV9fIDUtYml0IHZhbHVlIGFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0FTU0VSVElPTlRJTUUoX19USU1FX18pICAgICgoX19USU1FX18pIDw9IDB4MUZVKQorCisvKiogQGJyaWVmICBDaGVjayBVQVJUIGRlYXNzZXJ0aW9uIHRpbWUuCisgICogQHBhcmFtICBfX1RJTUVfXyA1LWJpdCB2YWx1ZSBkZWFzc2VydGlvbiB0aW1lLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpLgorICAqLworI2RlZmluZSBJU19VQVJUX0RFQVNTRVJUSU9OVElNRShfX1RJTUVfXykgKChfX1RJTUVfXykgPD0gMHgxRlUpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMuCisgICogQHJldHZhbCBTRVQgKF9fU1RPUEJJVFNfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RPUEJJVFNfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1NUT1BCSVRTKF9fU1RPUEJJVFNfXykgKCgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzBfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzFfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgTFBVQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBMUFVBUlQgZnJhbWUgbnVtYmVyIG9mIHN0b3AgYml0cy4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QQklUU19fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QQklUU19fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX0xQVUFSVF9TVE9QQklUUyhfX1NUT1BCSVRTX18pICgoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVUFSVF9TVE9QQklUU18yKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVBUlQgZnJhbWUgcGFyaXR5LgorICAqIEByZXR2YWwgU0VUIChfX1BBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJJVFlfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1BBUklUWShfX1BBUklUWV9fKSAoKChfX1BBUklUWV9fKSA9PSBVQVJUX1BBUklUWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSSVRZX18pID09IFVBUlRfUEFSSVRZX0VWRU4pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVUFSVF9QQVJJVFlfT0REKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NPTlRST0xfXyBVQVJUIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KKyAgKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChfX0NPTlRST0xfXylcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9DVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgY29tbXVuaWNhdGlvbiBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01PREVfXyBVQVJUIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX01PREUoX19NT0RFX18pICgoKChfX01PREVfXykgJiAofigodWludDMyX3QpKFVBUlRfTU9ERV9UWF9SWCkpKSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RBVEVfXyBVQVJUIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9TVEFURShfX1NUQVRFX18pICgoKF9fU1RBVEVfXykgPT0gVUFSVF9TVEFURV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFVBUlRfU1RBVEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgb3ZlcnNhbXBsaW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NBTVBMSU5HX18gVUFSVCBvdmVyc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09WRVJTQU1QTElORyhfX1NBTVBMSU5HX18pICgoKF9fU0FNUExJTkdfXykgPT0gVUFSVF9PVkVSU0FNUExJTkdfMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMSU5HX18pID09IFVBUlRfT1ZFUlNBTVBMSU5HXzgpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBzYW1wbGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PTkVCSVRfXyBVQVJUIGZyYW1lIHNhbXBsaW5nLgorICAqIEByZXR2YWwgU0VUIChfX09ORUJJVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PTkVCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX09ORV9CSVRfU0FNUExFKF9fT05FQklUX18pICgoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fT05FQklUX18pID09IFVBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIFVBUlQgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIG1vZGUuCisgICogQHJldHZhbCBTRVQgKF9fTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19NT0RFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURU1PREUoX19NT0RFX18pICAoKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTlNUQVJUQklUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfT05GQUxMSU5HRURHRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX09OMFg3RkZSQU1FKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9PTjBYNTVGUkFNRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USU1FT1VUX18gVUFSVCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9SRUNFSVZFUl9USU1FT1VUKF9fVElNRU9VVF9fKSAoKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MSU5fXyBVQVJUIExJTiBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19MSU5fXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTElOX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9MSU4oX19MSU5fXykgICAgICAgICgoKF9fTElOX18pID09IFVBUlRfTElOX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTElOX18pID09IFVBUlRfTElOX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBsZW5ndGguCisgICogQHJldHZhbCBTRVQgKF9fTEVOR1RIX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xFTkdUSF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPT0gVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBUWCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19ETUFUWF9fIFVBUlQgRE1BIFRYIHN0YXRlLgorICAqIEByZXR2YWwgU0VUIChfX0RNQVRYX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RNQVRYX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9ETUFfVFgoX19ETUFUWF9fKSAgICAgKCgoX19ETUFUWF9fKSA9PSBVQVJUX0RNQV9UWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fRE1BVFhfXykgPT0gVUFSVF9ETUFfVFhfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgRE1BIFJYIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0RNQVJYX18gVUFSVCBETUEgUlggc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fRE1BUlhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BUlhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0RNQV9SWChfX0RNQVJYX18pICAgICAoKChfX0RNQVJYX18pID09IFVBUlRfRE1BX1JYX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFSWF9fKSA9PSBVQVJUX0RNQV9SWF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBoYWxmLWR1cGxleCBzdGF0ZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19IRFNFTF9fIFVBUlQgaGFsZi1kdXBsZXggc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fSERTRUxfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSERTRUxfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0hBTEZfRFVQTEVYKF9fSERTRUxfXykgICAgICgoKF9fSERTRUxfXykgPT0gVUFSVF9IQUxGX0RVUExFWF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19IRFNFTF9fKSA9PSBVQVJUX0hBTEZfRFVQTEVYX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgbWV0aG9kIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1dBS0VVUF9fIFVBUlQgd2FrZS11cCBtZXRob2QgLgorICAqIEByZXR2YWwgU0VUIChfX1dBS0VVUF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFVVBfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1dBS0VVUE1FVEhPRChfX1dBS0VVUF9fKSAoKChfX1dBS0VVUF9fKSA9PSBVQVJUX1dBS0VVUE1FVEhPRF9JRExFTElORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VVUF9fKSA9PSBVQVJUX1dBS0VVUE1FVEhPRF9BRERSRVNTTUFSSykpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHJlcXVlc3QgcGFyYW1ldGVyIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUkFNX18gVUFSVCByZXF1ZXN0IHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJBTV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QQVJBTV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVBUlRfQVVUT0JBVURfUkVRVUVTVCkgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVQVJUX01VVEVfTU9ERV9SRVFVRVNUKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUkFNX18pID09IFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0lOSVRfXyBVQVJUIGFkdmFuY2VkIGZlYXR1cmVzIGluaXRpYWxpemF0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX0lOSVRfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fSU5JVF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9JTklUKF9fSU5JVF9fKSAgICgoX19JTklUX18pIDw9IChVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9UWElOVkVSVF9JTklUICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYSU5WRVJUX0lOSVQgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfREFUQUlOVkVSVF9JTklUICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfSU5JVCAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0lOSVQpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBUWCBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19UWElOVl9fIFVBUlQgZnJhbWUgVFggaW52ZXJzaW9uIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fVFhJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fVFhJTlZfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfVFhJTlYoX19UWElOVl9fKSAoKChfX1RYSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9UWElOVl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1RYSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYIGludmVyc2lvbiBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1JYSU5WX18gVUFSVCBmcmFtZSBSWCBpbnZlcnNpb24gc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19SWElOVl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19SWElOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9SWElOVihfX1JYSU5WX18pICgoKF9fUlhJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1JYSU5WX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19SWElOVl9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfUlhJTlZfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgZGF0YSBpbnZlcnNpb24gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19EQVRBSU5WX18gVUFSVCBmcmFtZSBkYXRhIGludmVyc2lvbiBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX0RBVEFJTlZfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fREFUQUlOVl9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKF9fREFUQUlOVl9fKSAoKChfX0RBVEFJTlZfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RBVEFJTlZfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBSU5WX18pID09IFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NXQVBfXyBVQVJUIGZyYW1lIFJYL1RYIHBpbnMgc3dhcCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX1NXQVBfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1dBUF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKF9fU1dBUF9fKSAoKChfX1NXQVBfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NXQVBfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TV0FQX18pID09IFVBUlRfQURWRkVBVFVSRV9TV0FQX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGZyYW1lIG92ZXJydW4gc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19PVkVSUlVOX18gVUFSVCBmcmFtZSBvdmVycnVuIHNldHRpbmcuCisgICogQHJldHZhbCBTRVQgKF9fT1ZFUlJVTl9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19PVkVSUlVOX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9PVkVSUlVOKF9fT1ZFUlJVTl9fKSAgICAgKCgoX19PVkVSUlVOX18pID09IFVBUlRfQURWRkVBVFVSRV9PVkVSUlVOX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX09WRVJSVU5fXykgPT0gVUFSVF9BRFZGRUFUVVJFX09WRVJSVU5fRElTQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGF1dG8gQmF1ZCByYXRlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0FVVE9CQVVEUkFURV9fIFVBUlQgYXV0byBCYXVkIHJhdGUgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fQVVUT0JBVURSQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FVVE9CQVVEUkFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEUoX19BVVRPQkFVRFJBVEVfXykgICgoKF9fQVVUT0JBVURSQVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FVVE9CQVVEUkFURV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19ETUFfXyBVQVJUIERNQSBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gZXJyb3Igc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19ETUFfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fRE1BX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihfX0RNQV9fKSAgKCgoX19ETUFfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RNQV9FTkFCTEVPTlJYRVJST1IpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ETUFfXykgPT0gVUFSVF9BRFZGRUFUVVJFX0RNQV9ESVNBQkxFT05SWEVSUk9SKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgTVNCIGZpcnN0IHNldHRpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTVNCRklSU1RfXyBVQVJUIGZyYW1lIE1TQiBmaXJzdCBzZXR0aW5nLgorICAqIEByZXR2YWwgU0VUIChfX01TQkZJUlNUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01TQkZJUlNUX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUKF9fTVNCRklSU1RfXykgKCgoX19NU0JGSVJTVF9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBzdG9wIG1vZGUgc3RhdGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUE1PREVfXyBVQVJUIHN0b3AgbW9kZSBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVE9QTU9ERV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVE9QTU9ERV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfQURWRkVBVFVSRV9TVE9QTU9ERShfX1NUT1BNT0RFX18pICgoKF9fU1RPUE1PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QTU9ERV9fKSA9PSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgbXV0ZSBtb2RlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX01VVEVfXyBVQVJUIG11dGUgbW9kZSBzdGF0ZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NVVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01VVEVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX01VVEVfTU9ERShfX01VVEVfXykgICAgICAgKCgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VVEVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgc2VsZWN0aW9uIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1dBS0VfXyBVQVJUIHdha2UtdXAgc2VsZWN0aW9uLgorICAqIEByZXR2YWwgU0VUIChfX1dBS0VfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fV0FLRV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfV0FLRVVQX1NFTEVDVElPTihfX1dBS0VfXykgKCgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX0FERFJFU1MpICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX1NUQVJUQklUKSAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19XQUtFX18pID09IFVBUlRfV0FLRVVQX09OX1JFQUREQVRBX05PTkVNUFRZKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZHJpdmVyIGVuYWJsZSBwb2xhcml0eSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QT0xBUklUWV9fIFVBUlQgZHJpdmVyIGVuYWJsZSBwb2xhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QT0xBUklUWV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19QT0xBUklUWV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VBUlRfREVfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICAoKChfX1BPTEFSSVRZX18pID09IFVBUlRfREVfUE9MQVJJVFlfSElHSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBVQVJUX0RFX1BPTEFSSVRZX0xPVykpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFByZXNjYWxlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DTE9DS1BSRVNDQUxFUl9fIFVBUlQgUHJlc2NhbGVyIHZhbHVlLgorICAqIEByZXR2YWwgU0VUIChfX0NMT0NLUFJFU0NBTEVSX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NMT0NLUFJFU0NBTEVSX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9QUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVY0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWOCkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYxMCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjEyKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTYpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYzMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVBUlRfUFJFU0NBTEVSX0RJVjY0KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVUFSVF9QUkVTQ0FMRVJfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVQVJUX1BSRVNDQUxFUl9ESVYyNTYpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBJbmNsdWRlIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfdWFydF9leC5oIgorCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IYWxmRHVwbGV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCBBZGRyZXNzLCB1aW50MzJfdCBXYWtlVXBNZXRob2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGVJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BJbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9Nc3BEZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFVBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9VblJlZ2lzdGVyQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgSEFMX1VBUlRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0X0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFQYXVzZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVN0b3AoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisvKiBUcmFuc2ZlciBBYm9ydCBmdW5jdGlvbnMgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3ZvaWQgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX1NlbmRCcmVhayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgSEFMX1VBUlRfR2V0U3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7Cit1aW50MzJfdCAgICAgICAgICAgICAgSEFMX1VBUlRfR2V0RXJyb3IoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVBUlQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3ZvaWQgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9DaGVja0lkbGVTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9VQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfaGFsX3VhcnRfZXguaCBiL0luYy9zdG0zMndieHhfaGFsX3VhcnRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY0Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfdWFydF9leC5oCkBAIC0wLDAgKzEsMzUzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF91YXJ0X2V4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1VBUlRfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1VBUlRfRVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeAorICAqIEB7CisgICovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9UeXBlcyBVQVJURXggRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBXYWtlVXBFdmVudDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIGV2ZW50IHdpbGwgYWN0aXZhdGUgdGhlIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnIChXVUYpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX1dha2VVcF9mcm9tX1N0b3BfU2VsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIFVBUlRfV0FLRVVQX09OX0FERFJFU1MsIHRoZSB0d28gb3RoZXIgZmllbGRzIGJlbG93IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB1cC4gKi8KKworICB1aW50MTZfdCBBZGRyZXNzTGVuZ3RoOyAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgNCBvciA3LWJpdCBsb25nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoLiAgKi8KKworICB1aW50OF90IEFkZHJlc3M7ICAgICAgICAgICAgIC8qITwgVUFSVC9VU0FSVCBub2RlIGFkZHJlc3MgKDctYml0IGxvbmcgbWF4KS4gKi8KK30gVUFSVF9XYWtlVXBUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFVBUlRFeCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9Xb3JkX0xlbmd0aCBVQVJURXggV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfN0IgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IDgtYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOUIgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAvKiE8IDktYml0IGxvbmcgVUFSVCBmcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfV2FrZVVwX0FkZHJlc3NfTGVuZ3RoIFVBUlRFeCBXYWtlVXAgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgIC8qITwgNC1iaXQgbG9uZyB3YWtlLXVwIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgICAgICAgVVNBUlRfQ1IyX0FERE03ICAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9GSUZPX21vZGUgVUFSVEV4IEZJRk8gbW9kZQorICAqIEBicmllZiAgICBVQVJUIEZJRk8gbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVBUlRfRklGT01PREVfRElTQUJMRSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBGSUZPIG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4gIC8qITwgRklGTyBtb2RlIGVuYWJsZSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAgKiBAYnJpZWYgICAgVUFSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFhGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfMV80ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIgICBVU0FSVF9DUjNfVFhGVENGR18xICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRYRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCAgIChVU0FSVF9DUjNfVFhGVENGR18wfFVTQVJUX0NSM19UWEZUQ0ZHXzEpIC8qITwgVFhGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1RYRklGT19USFJFU0hPTERfN184ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzggICAoVVNBUlRfQ1IzX1RYRlRDRkdfMnxVU0FSVF9DUjNfVFhGVENGR18wKSAvKiE8IFRYRklGTyBiZWNvbWVzIGVtcHR5ICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1JYRklGT190aHJlc2hvbGRfbGV2ZWwgVUFSVEV4IFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAgKiBAYnJpZWYgICAgVUFSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQgICBVU0FSVF9DUjNfUlhGVENGR18wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfMV8yICAgVVNBUlRfQ1IzX1JYRlRDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNCAgIChVU0FSVF9DUjNfUlhGVENGR18wfFVTQVJUX0NSM19SWEZUQ0ZHXzEpIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAzLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzggICBVU0FSVF9DUjNfUlhGVENGR18yICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVQVJUX1JYRklGT19USFJFU0hPTERfOF84ICAgKFVTQVJUX0NSM19SWEZUQ0ZHXzJ8VVNBUlRfQ1IzX1JYRlRDRkdfMCkgLyohPCBSWEZJRk8gRklGTyBiZWNvbWVzIGZ1bGwgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVUFSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKwordm9pZCBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCit2b2lkIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwordm9pZCBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMworICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQWRkcmVzc0xlbmd0aCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgVGhyZXNob2xkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfTWFjcm9zIFVBUlRFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlcG9ydCB0aGUgVUFSVCBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0NMT0NLU09VUkNFX18gb3V0cHV0IHZhcmlhYmxlLgorICAqIEByZXR2YWwgVUFSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2RlZmluZSBVQVJUX0dFVENMT0NLU09VUkNFKF9fSEFORExFX18sX19DTE9DS1NPVVJDRV9fKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsyOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gTFBVQVJUMSkgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0hTSTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0hTSTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX1NZU0NMSzogICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzsgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19MUFVBUlQxQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX0xTRTsgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKKyAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBSZXBvcnQgdGhlIFVBUlQgbWFzayB0byBhcHBseSB0byByZXRyaWV2ZSB0aGUgcmVjZWl2ZWQgZGF0YQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB3b3JkIGxlbmd0aCBhbmQgdG8gdGhlIHBhcml0eSBiaXRzIGFjdGl2YXRpb24uCisgICogQG5vdGUgICBJZiBQQ0UgPSAxLCB0aGUgcGFyaXR5IGJpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZXh0cmFjdGVkCisgICogICAgICAgICBieSB0aGUgcmVjZXB0aW9uIEFQSSgpLgorICAqICAgICAgICAgVGhpcyBtYXNraW5nIG9wZXJhdGlvbiBpcyBub3QgY2FycmllZCBvdXQgaW4gdGhlIGNhc2Ugb2YKKyAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lLCB0aGUgbWFzayB0byBhcHBseSB0byBVQVJUIFJEUiByZWdpc3RlciBpcyBzdG9yZWQgaW4gKF9fSEFORExFX18pLT5NYXNrIGZpZWxkLgorICAqLworI2RlZmluZSBVQVJUX01BU0tfQ09NUFVUQVRJT04oX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzhCKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfN0IpICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAzRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVBUlQgZnJhbWUgbGVuZ3RoLgorICAqIEByZXR2YWwgU0VUIChfX0xFTkdUSF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19MRU5HVEhfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1dPUkRfTEVOR1RIKF9fTEVOR1RIX18pICgoKF9fTEVOR1RIX18pID09IFVBUlRfV09SRExFTkdUSF83QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVBUlRfV09SRExFTkdUSF84QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVBUlRfV09SRExFTkdUSF85QikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIHdha2UtdXAgYWRkcmVzcyBsZW5ndGggaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQUREUkVTU19fIFVBUlQgd2FrZS11cCBhZGRyZXNzIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19BRERSRVNTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0FERFJFU1NfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKF9fQUREUkVTU19fKSAoKChfX0FERFJFU1NfXykgPT0gVUFSVF9BRERSRVNTX0RFVEVDVF80QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0FERFJFU1NfXykgPT0gVUFSVF9BRERSRVNTX0RFVEVDVF83QikpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVEhSRVNIT0xEX18gVUFSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsLgorICAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1RYRklGT19USFJFU0hPTEQoX19USFJFU0hPTERfXykgKCgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzhfOCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fVEhSRVNIT0xEX18gVUFSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsLgorICAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX1JYRklGT19USFJFU0hPTEQoX19USFJFU0hPTERfXykgKCgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzhfOCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1VBUlRfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfdXNhcnQuaCBiL0luYy9zdG0zMndieHhfaGFsX3VzYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNTU3MgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfaGFsX3VzYXJ0LmgKQEAgLTAsMCArMSw5MzIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3VzYXJ0LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVTQVJUIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfSEFMX1VTQVJUX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0hBTF9VU0FSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsX2RlZi5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlQKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9UeXBlcyBVU0FSVCBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBVU0FSVCBJbml0IFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBCYXVkUmF0ZTsgICAgICAgICAgICAgICAgICAvKiE8IFRoaXMgbWVtYmVyIGNvbmZpZ3VyZXMgdGhlIFVzYXJ0IGNvbW11bmljYXRpb24gYmF1ZCByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXVkIHJhdGUgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsxNTo0XSA9ICgoMiAqIGZjbGtfcHJlcykgLyAoKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpWzE1OjRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF1ZCBSYXRlIFJlZ2lzdGVyWzNdICAgID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWQgUmF0ZSBSZWdpc3RlclsyOjBdICA9ICAoKCgyICogZmNsa19wcmVzKSAvICgoaHVhcnQtPkluaXQuQmF1ZFJhdGUpKSlbMzowXSkgPj4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGZjbGtfcHJlcyBpcyB0aGUgVVNBUlQgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChmY2xrKSBkaXZpZGVkIGJ5IGEgcHJlc2NhbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlICBPdmVyc2FtcGxpbmcgYnkgOCBpcyBzeXN0ZW1hdGljYWxseSBhcHBsaWVkIHRvIGFjaGlldmUgaGlnaCBiYXVkIHJhdGVzLiAqLworCisgIHVpbnQzMl90IFdvcmRMZW5ndGg7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGluIGEgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVEV4X1dvcmRfTGVuZ3RoLiAqLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfU3RvcF9CaXRzLiAqLworCisgIHVpbnQzMl90IFBhcml0eTsgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfUGFyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiBwYXJpdHkgaXMgZW5hYmxlZCwgdGhlIGNvbXB1dGVkIHBhcml0eSBpcyBpbnNlcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBNU0IgcG9zaXRpb24gb2YgdGhlIHRyYW5zbWl0dGVkIGRhdGEgKDl0aCBiaXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOSBkYXRhIGJpdHM7IDh0aCBiaXQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIGxlbmd0aCBpcyBzZXQgdG8gOCBkYXRhIGJpdHMpLiAqLworCisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFJlY2VpdmUgb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTW9kZS4gKi8KKworICB1aW50MzJfdCBDTEtQb2xhcml0eTsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc3RlYWR5IHN0YXRlIG9mIHRoZSBzZXJpYWwgY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9DbG9ja19Qb2xhcml0eS4gKi8KKworICB1aW50MzJfdCBDTEtQaGFzZTsgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgdHJhbnNpdGlvbiBvbiB3aGljaCB0aGUgYml0IGNhcHR1cmUgaXMgbWFkZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0Nsb2NrX1BoYXNlLiAqLworCisgIHVpbnQzMl90IENMS0xhc3RCaXQ7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNsb2NrIHB1bHNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QgdHJhbnNtaXR0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGJpdCAoTVNCKSBoYXMgdG8gYmUgb3V0cHV0IG9uIHRoZSBTQ0xLIHBpbiBpbiBzeW5jaHJvbm91cyBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTGFzdF9CaXQuICovCisKKyAgdWludDMyX3QgQ2xvY2tQcmVzY2FsZXI7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciB2YWx1ZSB1c2VkIHRvIGRpdmlkZSB0aGUgVVNBUlQgY2xvY2sgc291cmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfQ2xvY2tQcmVzY2FsZXIuICovCit9IFVTQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgSEFMIFVTQVJUIFN0YXRlIHN0cnVjdHVyZXMgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9VU0FSVF9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgaXMgbm90IGluaXRpYWxpemVkICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBJbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBhbiBpbnRlcm5hbCBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYICAgICAgICAgICA9IDB4MTJVLCAgICAvKiE8IERhdGEgVHJhbnNtaXNzaW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlggICAgICAgICAgID0gMHgyMlUsICAgIC8qITwgRGF0YSBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCAgICAgICAgPSAweDMyVSwgICAgLyohPCBEYXRhIFRyYW5zbWlzc2lvbiBSZWNlcHRpb24gcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIEhBTF9VU0FSVF9TVEFURV9USU1FT1VUICAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1VTQVJUX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHgwNFUgICAgIC8qITwgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGNsb2NrIHNvdXJjZXMgZGVmaW5pdGlvbnMKKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMiAgICAgID0gMHgwMVUsICAgIC8qITwgUENMSzIgY2xvY2sgc291cmNlICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9IU0kgICAgICAgID0gMHgwMlUsICAgIC8qITwgSFNJIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEsgICAgID0gMHgwNFUsICAgIC8qITwgU1lTQ0xLIGNsb2NrIHNvdXJjZSAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9MU0UgICAgICAgID0gMHgwOFUsICAgIC8qITwgTFNFIGNsb2NrIHNvdXJjZSAgICAgICAqLworICBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQgID0gMHgxMFUgICAgIC8qITwgVW5kZWZpbmVkIGNsb2NrIHNvdXJjZSAqLworfSBVU0FSVF9DbG9ja1NvdXJjZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYKK3sKKyAgVVNBUlRfVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgICAgIC8qITwgVVNBUlQgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgKi8KKworICBVU0FSVF9Jbml0VHlwZURlZiAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gVVNBUlQgVHggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgICAgICAgIC8qITwgVVNBUlQgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICBUeFhmZXJDb3VudDsgICAgICAgICAgICAgLyohPCBVU0FSVCBUeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gVVNBUlQgUnggdHJhbnNmZXIgQnVmZmVyICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgICAgICAgIC8qITwgVVNBUlQgUnggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICBSeFhmZXJDb3VudDsgICAgICAgICAgICAgLyohPCBVU0FSVCBSeCBUcmFuc2ZlciBDb3VudGVyICAgICAgICAgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIE1hc2s7ICAgICAgICAgICAgICAgICAgICAvKiE8IFVTQVJUIFJ4IFJEUiByZWdpc3RlciBtYXNrICAgICAgICAgICovCisKKyAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgTmJSeERhdGFUb1Byb2Nlc3M7ICAgICAgIC8qITwgTnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlggSVNSIGV4ZWN1dGlvbiAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgIE5iVHhEYXRhVG9Qcm9jZXNzOyAgICAgICAvKiE8IE51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFRYIElTUiBleGVjdXRpb24gKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBTbGF2ZU1vZGU7ICAgICAgICAgICAgICAgLyohPCBFbmFibGUvRGlzYWJsZSBVQVJUIFNQSSBTbGF2ZSBNb2RlLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBAcmVmIFVTQVJURXhfU2xhdmVfTW9kZSAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIEZpZm9Nb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgRklGTyBtb2RlIHdpbGwgYmUgdXNlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgQHJlZiBVU0FSVEV4X0ZJRk9fbW9kZS4gKi8KKworICB2b2lkICgqUnhJU1IpKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFJ4IElSUSBoYW5kbGVyICAqLworCisgIHZvaWQgKCpUeElTUikoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAvKiE8IEZ1bmN0aW9uIHBvaW50ZXIgb24gVHggSVJRIGhhbmRsZXIgICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgKmhkbWF0eDsgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgVHggRE1BIEhhbmRsZSBwYXJhbWV0ZXJzICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBSeCBETUEgSGFuZGxlIHBhcmFtZXRlcnMgICAgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgICAgICAgICAvKiE8IExvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgX19JTyBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAgICAgICAgLyohPCBVU0FSVCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIHZvaWQgKCogVHhIYWxmQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgICAgICAgLyohPCBVU0FSVCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICAgICAgICAqLworICB2b2lkICgqIFR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgICAgICAgICAgIC8qITwgVVNBUlQgVHggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBSeEhhbGZDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAvKiE8IFVTQVJUIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICovCisgIHZvaWQgKCogUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAgLyohPCBVU0FSVCBSeCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAgICAqLworICB2b2lkICgqIFR4UnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgIC8qITwgVVNBUlQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgICAgICAgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgICAgICAgICAgICAvKiE8IFVTQVJUIEVycm9yIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogQWJvcnRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgLyohPCBVU0FSVCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayAgICAgICAgICAqLworICB2b2lkICgqIFJ4Rmlmb0Z1bGxDYWxsYmFjaykoc3RydWN0IF9fVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsgICAgICAgIC8qITwgVVNBUlQgUnggRmlmbyBGdWxsIENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBUeEZpZm9FbXB0eUNhbGxiYWNrKShzdHJ1Y3QgX19VU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgICAgICAvKiE8IFVTQVJUIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgICAgICAgICAgICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgICAvKiE8IFVTQVJUIE1zcCBJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1VTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7ICAgICAgICAgLyohPCBVU0FSVCBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAqLworI2VuZGlmICAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCit9IFVTQVJUX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgSEFMIFVTQVJUIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQoreworICBIQUxfVVNBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAwVSwgICAgLyohPCBVU0FSVCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBVU0FSVCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEICAgICAgICAgPSAweDAyVSwgICAgLyohPCBVU0FSVCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElEICAgICAgICAqLworICBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBVU0FSVCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfVFhfUlhfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBVU0FSVCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgPSAweDA1VSwgICAgLyohPCBVU0FSVCBFcnJvciBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgICAgICAgICAgPSAweDA2VSwgICAgLyohPCBVU0FSVCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRCAgICAgICAgICAqLworICBIQUxfVVNBUlRfUlhfRklGT19GVUxMX0NCX0lEICAgICAgICAgICAgPSAweDA3VSwgICAgLyohPCBVU0FSVCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQgICAgICAgICAgICAqLworICBIQUxfVVNBUlRfVFhfRklGT19FTVBUWV9DQl9JRCAgICAgICAgICAgPSAweDA4VSwgICAgLyohPCBVU0FSVCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElEICAgICAgICAgICAqLworCisgIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICA9IDB4MDlVLCAgICAvKiE8IFVTQVJUIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICovCisgIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICA9IDB4MEFVICAgICAvKiE8IFVTQVJUIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisKK30gSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBVU0FSVCBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgIHZvaWQgKCpwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmKShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOyAgLyohPCBwb2ludGVyIHRvIGFuIFVTQVJUIGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9FcnJvcl9EZWZpbml0aW9uICAgVVNBUlQgRXJyb3IgRGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9OT05FICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgIC8qITwgTm8gZXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfUEUgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgICAvKiE8IFBhcml0eSBlcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX05FICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAgLyohPCBOb2lzZSBlcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9GRSAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgIC8qITwgZnJhbWUgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfT1JFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1VTQVJUX0VSUk9SX0RNQSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAgLyohPCBETUEgdHJhbnNmZXIgZXJyb3IgICAgICAgICovCisjZGVmaW5lIEhBTF9VU0FSVF9FUlJPUl9VRFIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgIC8qITwgU1BJIHNsYXZlIHVuZGVycnVuIGVycm9yICAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICAgKi8KKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9TdG9wX0JpdHMgIFVTQVJUIE51bWJlciBvZiBTdG9wIEJpdHMKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9TVE9QQklUU18wXzUgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMCAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgZnJhbWUgd2l0aCAwLjUgc3RvcCBiaXQgICovCisjZGVmaW5lIFVTQVJUX1NUT1BCSVRTXzEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSB3aXRoIDEgc3RvcCBiaXQgICAgKi8KKyNkZWZpbmUgVVNBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xKSAvKiE8IFVTQVJUIGZyYW1lIHdpdGggMS41IHN0b3AgYml0cyAqLworI2RlZmluZSBVU0FSVF9TVE9QQklUU18yICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX1NUT1BfMSAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgZnJhbWUgd2l0aCAyIHN0b3AgYml0cyAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1Bhcml0eSAgICBVU0FSVCBQYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIHBhcml0eSAgICovCisjZGVmaW5lIFVTQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgICAgIC8qITwgRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgVVNBUlRfUEFSSVRZX09ERCAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9QQ0UgfCBVU0FSVF9DUjFfUFMpICAgLyohPCBPZGQgcGFyaXR5ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9Nb2RlICAgVVNBUlQgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX01PREVfUlggICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9SRSAgICAgICAgICAgICAgICAgICAgLyohPCBSWCBtb2RlICAgICAgICAqLworI2RlZmluZSBVU0FSVF9NT0RFX1RYICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgICAgICAgICAgICAgICAgICAgIC8qITwgVFggbW9kZSAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfTU9ERV9UWF9SWCAgICAgICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAvKiE8IFJYIGFuZCBUWCBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX092ZXJfU2FtcGxpbmcgVVNBUlQgT3ZlciBTYW1wbGluZworICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX09WRVJTQU1QTElOR18xNiAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgLyohPCBPdmVyc2FtcGxpbmcgYnkgMTYgKi8KKyNkZWZpbmUgVVNBUlRfT1ZFUlNBTVBMSU5HXzggICAgICAgICAgICAgICAgVVNBUlRfQ1IxX09WRVI4ICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSA4ICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9DbG9jayAgVVNBUlQgQ2xvY2sKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9DTE9DS19ESVNBQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAvKiE8IFVTQVJUIGNsb2NrIGRpc2FibGUgKi8KKyNkZWZpbmUgVVNBUlRfQ0xPQ0tfRU5BQkxFICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOICAgLyohPCBVU0FSVCBjbG9jayBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Nsb2NrX1BvbGFyaXR5ICBVU0FSVCBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBEcml2ZXIgZW5hYmxlIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBVU0FSVF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BPTCAgIC8qITwgRHJpdmVyIGVuYWJsZSBzaWduYWwgaXMgYWN0aXZlIGxvdyAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfQ2xvY2tfUGhhc2UgICBVU0FSVCBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1BIQVNFXzFFREdFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCBVU0FSVCBmcmFtZSBwaGFzZSBvbiBmaXJzdCBjbG9jayB0cmFuc2l0aW9uICAqLworI2RlZmluZSBVU0FSVF9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BIQSAgIC8qITwgVVNBUlQgZnJhbWUgcGhhc2Ugb24gc2Vjb25kIGNsb2NrIHRyYW5zaXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTGFzdF9CaXQgIFVTQVJUIExhc3QgQml0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfTEFTVEJJVF9ESVNBQkxFICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8IFVTQVJUIGZyYW1lIGxhc3QgZGF0YSBiaXQgY2xvY2sgcHVsc2Ugbm90IG91dHB1dCB0byBTQ0xLIHBpbiAqLworI2RlZmluZSBVU0FSVF9MQVNUQklUX0VOQUJMRSAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJDTCAgIC8qITwgVVNBUlQgZnJhbWUgbGFzdCBkYXRhIGJpdCBjbG9jayBwdWxzZSBvdXRwdXQgdG8gU0NMSyBwaW4gICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0Nsb2NrUHJlc2NhbGVyICBVU0FSVCBDbG9jayBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMSAgICAweDAwMDAwMDAwVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrICAgICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMiAgICAweDAwMDAwMDAxVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzIgICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWNCAgICAweDAwMDAwMDAyVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzQgICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWNiAgICAweDAwMDAwMDAzVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzYgICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWOCAgICAweDAwMDAwMDA0VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzggICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMTAgICAweDAwMDAwMDA1VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEwICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMTIgICAweDAwMDAwMDA2VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMTYgICAweDAwMDAwMDA3VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzE2ICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMzIgICAweDAwMDAwMDA4VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzMyICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWNjQgICAweDAwMDAwMDA5VSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzY0ICAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMTI4ICAweDAwMDAwMDBBVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzEyOCAqLworI2RlZmluZSBVU0FSVF9QUkVTQ0FMRVJfRElWMjU2ICAweDAwMDAwMDBCVSAgLyohPCBmY2xrX3ByZXMgPSBmY2xrLzI1NiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX1JlcXVlc3RfUGFyYW1ldGVycyAgVVNBUlQgUmVxdWVzdCBQYXJhbWV0ZXJzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgIFVTQVJUX1JRUl9SWEZSUSAgICAgICAgLyohPCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdCAgKi8KKyNkZWZpbmUgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QgICAgICAgIFVTQVJUX1JRUl9UWEZSUSAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIGZsdXNoIFJlcXVlc3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRmxhZ3MgICAgICBVU0FSVCBGbGFncworICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYCisgICogICAgICAgICAgIC0gMHhYWFhYICA6IEZsYWcgbWFzayBpbiB0aGUgSVNSIHJlZ2lzdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UWEZUICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRlQgICAgICAgICAgLyohPCBVU0FSVCBUWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SWEZUICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRlQgICAgICAgICAgLyohPCBVU0FSVCBSWEZJRk8gdGhyZXNob2xkIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SWEZGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRkYgICAgICAgICAgLyohPCBVU0FSVCBSWEZJRk8gRnVsbCBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UWEZFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRkUgICAgICAgICAgLyohPCBVU0FSVCBUWEZJRk8gRW1wdHkgZmxhZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SRUFDSyAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgLyohPCBVU0FSVCByZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19URUFDSyAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgLyohPCBVU0FSVCB0cmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZyAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19CVVNZICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgLyohPCBVU0FSVCBidXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19VRFIgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1VEUiAgICAgICAgICAgLyohPCBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3IgZmxhZyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UWEUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBVU0FSVCB0cmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UWEZORiAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgLyohPCBVU0FSVCBUWEZJRk8gbm90IGZ1bGwgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19UQyAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgLyohPCBVU0FSVCB0cmFuc21pc3Npb24gY29tcGxldGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SWE5FICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgLyohPCBVU0FSVCByZWFkIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19SWEZORSAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgLyohPCBVU0FSVCBSWEZJRk8gbm90IGVtcHR5ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19JRExFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0lETEUgICAgICAgICAgLyohPCBVU0FSVCBpZGxlIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19PUkUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX09SRSAgICAgICAgICAgLyohPCBVU0FSVCBvdmVycnVuIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19ORSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgLyohPCBVU0FSVCBub2lzZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19GRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgLyohPCBVU0FSVCBmcmFtZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfRkxBR19QRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1BFICAgICAgICAgICAgLyohPCBVU0FSVCBwYXJpdHkgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfSW50ZXJydXB0X2RlZmluaXRpb24gVVNBUlQgSW50ZXJydXB0cyBEZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAwMDAwWlpaWjBYWFlZWVlZYgorICAqICAgICAgICAgICAtIFlZWVlZICA6IEludGVycnVwdCBzb3VyY2UgcG9zaXRpb24gaW4gdGhlIFhYIHJlZ2lzdGVyICg1Yml0cykKKyAgKiAgICAgICAgICAgLSBYWCAgOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICgyYml0cykKKyAgKiAgICAgICAgICAgICAgICAgLSAwMTogQ1IxIHJlZ2lzdGVyCisgICogICAgICAgICAgICAgICAgIC0gMTA6IENSMiByZWdpc3RlcgorICAqICAgICAgICAgICAgICAgICAtIDExOiBDUjMgcmVnaXN0ZXIKKyAgKiAgICAgICAgICAgLSBaWlpaICA6IEZsYWcgcG9zaXRpb24gaW4gdGhlIElTUiByZWdpc3Rlcig0Yml0cykKKyAgKiBAeworICAqLworCisjZGVmaW5lIFVTQVJUX0lUX1BFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjhVICAgICAvKiE8IFVTQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1RYRSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVTQVJUX0lUX1RYRk5GICAgICAgICAgICAgICAgICAgICAgICAweDA3MjdVICAgICAvKiE8IFVTQVJUIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0aW9uICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjZVICAgICAvKiE8IFVTQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHRpb24gICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1JYTkUgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAvKiE8IFVTQVJUIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0aW9uICovCisjZGVmaW5lIFVTQVJUX0lUX1JYRk5FICAgICAgICAgICAgICAgICAgICAgICAweDA1MjVVICAgICAvKiE8IFVTQVJUIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0aW9uICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjRVICAgICAvKiE8IFVTQVJUIGlkbGUgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjBVICAgICAvKiE8IFVTQVJUIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX09SRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDBVICAgICAvKiE8IFVTQVJUIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDBVICAgICAvKiE8IFVTQVJUIG5vaXNlIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX0ZFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDBVICAgICAvKiE8IFVTQVJUIGZyYW1lIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1JYRkYgICAgICAgICAgICAgICAgICAgICAgICAweDE4M0ZVICAgICAvKiE8IFVTQVJUIFJYRklGTyBmdWxsIGludGVycnVwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1RYRkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3M0VVICAgICAvKiE8IFVTQVJUIFRYRklGTyBlbXB0eSBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1JYRlQgICAgICAgICAgICAgICAgICAgICAgICAweDFBN0NVICAgICAvKiE8IFVTQVJUIFJYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24gICAgICovCisjZGVmaW5lIFVTQVJUX0lUX1RYRlQgICAgICAgICAgICAgICAgICAgICAgICAweDFCNzdVICAgICAvKiE8IFVTQVJUIFRYRklGTyB0aHJlc2hvbGQgcmVhY2hlZCBpbnRlcnJ1cHRpb24gICAgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfSVRfQ0xFQVJfRmxhZ3MgICAgVVNBUlQgSW50ZXJydXB0aW9uIENsZWFyIEZsYWdzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgIC8qITwgTm9pc2UgRXJyb3IgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfT1JFRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfT1JFQ0YgICAgICAgICAgIC8qITwgT3ZlclJ1biBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfSURMRUYgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgIC8qITwgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcgICAgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfVENGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcgICAgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfVURSRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVURSQ0YgICAgICAgICAgIC8qITwgU1BJIHNsYXZlIHVuZGVycnVuIGVycm9yIENsZWFyIEZsYWcgKi8KKyNkZWZpbmUgVVNBUlRfQ0xFQVJfVFhGRUNGICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVFhGRUNGICAgICAgICAgIC8qITwgVFhGSUZPIEVtcHR5IENsZWFyIEZsYWcgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfSW50ZXJydXB0aW9uX01hc2sgICAgVVNBUlQgSW50ZXJydXB0aW9uIEZsYWdzIE1hc2sKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9JVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUZVICAgICAvKiE8IFVTQVJUIGludGVycnVwdGlvbnMgZmxhZ3MgbWFzayAqLworI2RlZmluZSBVU0FSVF9DUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRTBVICAgICAvKiE8IFVTQVJUIGNvbnRyb2wgcmVnaXN0ZXIgbWFzayAqLworI2RlZmluZSBVU0FSVF9DUl9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1VSAgICAgICAgICAvKiE8IFVTQVJUIGNvbnRyb2wgcmVnaXN0ZXIgcG9zaXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX01hY3JvcyBVU0FSVCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGJyaWVmIFJlc2V0IFVTQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2RlZmluZSBfX0hBTF9VU0FSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCisjZWxzZQorI2RlZmluZSBfX0hBTF9VU0FSVF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFU0VUKQorI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UWEZUICBUWEZJRk8gdGhyZXNob2xkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1JYRlQgIFJYRklGTyB0aHJlc2hvbGQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUlhGRiAgUlhGSUZPIEZ1bGwgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfVFhGRSAgVFhGSUZPIEVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1RFQUNLIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19CVVNZICBCdXN5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1VEUiAgIFNQSSBzbGF2ZSB1bmRlcnJ1biBlcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1RYRk5GIFRYRklGTyBub3QgZnVsbCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfUlhORSAgUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SWEZORSBSWEZJRk8gbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfT1JFICAgT3ZlclJ1biBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19ORSAgICBOb2lzZSBFcnJvciBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19GRSAgICBGcmFtaW5nIEVycm9yIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1BFICAgIFBhcml0eSBFcnJvciBmbGFnCisgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fRkxBR19fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVU0FSVCBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfUEVGICAgICAgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9GRUYgICAgICBGcmFtaW5nIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9ORUYgICAgICBOb2lzZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfT1JFRiAgICAgT3ZlcnJ1biBFcnJvciBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfSURMRUYgICAgSURMRSBsaW5lIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9UWEZFQ0YgICBUWEZJRk8gZW1wdHkgY2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1RDRiAgICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVURSRiAgICAgU1BJIHNsYXZlIHVuZGVycnVuIGVycm9yIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBQRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9QRUZMQUcoX19IQU5ETEVfXykgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgVVNBUlRfQ0xFQVJfUEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgRkUgcGVuZGluZyBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfRkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX0ZFRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIE5FIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX05FRkxBRyhfX0hBTkRMRV9fKSAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX05FRikKKworLyoqIEBicmllZiAgQ2xlYXIgdGhlIFVTQVJUIE9SRSBwZW5kaW5nIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9PUkVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX09SRUYpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBVU0FSVCBJRExFIHBlbmRpbmcgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0NMRUFSX0lETEVGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX0lETEVGKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgVVNBUlQgVFggRklGTyBlbXB0eSBjbGVhciBmbGFnLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfVFhGRUNGKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX1RYRkVDRikKKworLyoqIEBicmllZiAgQ2xlYXIgU1BJIHNsYXZlIHVuZGVycnVuIGVycm9yIGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKF9fSEFORExFX18pICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyksIFVTQVJUX0NMRUFSX1VEUkYpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICgoKCgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9DUl9NQVNLKSA+PiBVU0FSVF9DUl9QT1MpID09IDFVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSk6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0NSX01BU0spID4+IFVTQVJUX0NSX1BPUykgPT0gMlUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIHw9ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyB8PSAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lUX01BU0spKSkpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYRkYgIFJYRklGTyBGdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRkUgIFRYRklGTyBFbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZUICBSWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRlQgIFRYRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZORiBUWCBGSUZPIG5vdCBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1JYRk5FIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0KEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0NSX01BU0spID4+IFVTQVJUX0NSX1BPUykgPT0gMVUpPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9IH4gKDFVIDw8ICgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9JVF9NQVNLKSkpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19JTlRFUlJVUFRfXykgJiBVU0FSVF9DUl9NQVNLKSA+PiBVU0FSVF9DUl9QT1MpID09IDJVKT8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSB+ICgxVSA8PCAoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVRfTUFTSykpKSkKKworCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfT1JFICAgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9ORSAgICBOb2lzZSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9GRSAgICBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgodWludDMyX3QpMSA8PCAoKF9fSU5URVJSVVBUX18pPj4gMHgwOCkpKSAhPSBSRVNFVCkgPyBTRVQgOiBSRVNFVCkKKworLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZGICBSWEZJRk8gRnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZFICBUWEZJRk8gRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhGVCAgUlhGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UWEZUICBUWEZJRk8gdGhyZXNob2xkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfVFhGTkYgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9SWEZORSBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfSVRfT1JFICAgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9ORSAgICBOb2lzZSBFcnJvciBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9GRSAgICBGcmFtaW5nIEVycm9yIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiAweDA1VSkgPT0gMHgwMVUpID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDB4MDVVKSA9PSAweDAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIFVTQVJUX0lUX01BU0spKSkgICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVVNBUlQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHBhcmFtICBfX0lUX0NMRUFSX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgZmxhZyB0aGF0IG5lZWRzIHRvIGJlIHNldAorICAqICAgICAgICAgICAgICAgICAgICAgICB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9QRUYgICAgICBQYXJpdHkgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0ZFRiAgICAgIEZyYW1pbmcgRXJyb3IgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX05FRiAgICAgIE5vaXNlIGRldGVjdGVkIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9PUkVGICAgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9JRExFRiAgICBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX1RYRkVDRiAgIFRYRklGTyBlbXB0eSBjbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGICAgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JVF9DTEVBUl9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKHVpbnQzMl90KShfX0lUX0NMRUFSX18pKQorCisvKiogQGJyaWVmICBTZXQgYSBzcGVjaWZpYyBVU0FSVCByZXF1ZXN0IGZsYWcuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19SRVFfXyBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgZmxhZyB0byBzZXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCBSZWNlaXZlIERhdGEgZmx1c2ggUmVxdWVzdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUIFRyYW5zbWl0IGRhdGEgZmx1c2ggUmVxdWVzdAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX1NFTkRfUkVRKF9fSEFORExFX18sIF9fUkVRX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiB8PSAoX19SRVFfXykpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgVVNBUlQgb25lIGJpdCBzYW1wbGUgbWV0aG9kLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVVNBUlRfT05FX0JJVF9TQU1QTEVfRU5BQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjN8PSBVU0FSVF9DUjNfT05FQklUKQorCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBVU0FSVCBvbmUgYml0IHNhbXBsZSBtZXRob2QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9PTkVfQklUX1NBTVBMRV9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMgJj0gflVTQVJUX0NSM19PTkVCSVQpCisKKy8qKiBAYnJpZWYgIEVuYWJsZSBVU0FSVC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVU0FSVCBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1VTQVJUX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSBVU0FSVF9DUjFfVUUpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgVVNBUlQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9VU0FSVF9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gflVTQVJUX0NSMV9VRSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX01hY3JvcyAgIFVTQVJUIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBicmllZiAgR2V0IFVTQVJUIGNsb2NrIGRpdmlzaW9uIGZhY3RvciBmcm9tIGNsb2NrIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcGFyYW0gIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVU0FSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBVU0FSVCBjbG9jayBkaXZpc2lvbiBmYWN0b3IKKyAgKi8KKyNkZWZpbmUgVVNBUlRfR0VUX0RJVl9GQUNUT1IoX19DTE9DS1BSRVNDQUxFUl9fKSBcCisgICgoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjEpICAgPyAxVSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMikgICA/IDJVIDogICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVY0KSAgID8gNFUgOiAgICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjYpICAgPyA2VSA6ICAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWOCkgICA/IDhVIDogICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYxMCkgID8gMTBVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjEyKSAgPyAxMlUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTYpICA/IDE2VSA6ICAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYzMikgID8gMzJVIDogICAgICBcCisgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjY0KSAgPyA2NFUgOiAgICAgIFwKKyAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTI4KSA/IDEyOFUgOiAgICAgXAorICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYyNTYpID8gMjU2VSA6IDFVKQorCisvKiogQGJyaWVmICBCUlIgZGl2aXNpb24gb3BlcmF0aW9uIHRvIHNldCBCUlIgcmVnaXN0ZXIgaW4gOC1iaXQgb3ZlcnNhbXBsaW5nIG1vZGUuCisgICogQHBhcmFtICBfX1BDTEtfXyBVU0FSVCBjbG9jay4KKyAgKiBAcGFyYW0gIF9fQkFVRF9fIEJhdWQgcmF0ZSBzZXQgYnkgdGhlIHVzZXIuCisgICogQHBhcmFtICBfX0NMT0NLUFJFU0NBTEVSX18gVUFSVCBwcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBEaXZpc2lvbiByZXN1bHQKKyAgKi8KKyNkZWZpbmUgVVNBUlRfRElWX1NBTVBMSU5HOChfX1BDTEtfXywgX19CQVVEX18sIF9fQ0xPQ0tQUkVTQ0FMRVJfXykgICAoKCgoKF9fUENMS19fKS9VU0FSVF9HRVRfRElWX0ZBQ1RPUihfX0NMT0NLUFJFU0NBTEVSX18pKSoyVSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKworLyoqIEBicmllZiAgUmVwb3J0IHRoZSBVU0FSVCBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlLgorICAqIEBwYXJhbSAgX19DTE9DS1NPVVJDRV9fIG91dHB1dCB2YXJpYWJsZS4KKyAgKiBAcmV0dmFsIHRoZSBVU0FSVCBjbG9ja2luZyBzb3VyY2UsIHdyaXR0ZW4gaW4gX19DTE9DS1NPVVJDRV9fLgorICAqLworI2RlZmluZSBVU0FSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfSFNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfSFNJOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfU1lTQ0xLOiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOyAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfTFNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfTFNFOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAorICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQorCisvKiogQGJyaWVmICBDaGVjayBVU0FSVCBCYXVkIHJhdGUuCisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAqICAgICAgICAgVGhlIG1heGltdW0gQmF1ZCBSYXRlIGlzIGRlcml2ZWQgZnJvbSB0aGUgbWF4aW11bSBjbG9jayBvbiBXQiAoaS5lLiA2NCBNSHopCisgICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzbWFsbGVzdCBvdmVyc2FtcGxpbmcgdXNlZCBvbiB0aGUgVVNBUlQgKGkuZS4gOCkKKyAgKiBAcmV0dmFsIFNFVCAoX19CQVVEUkFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19CQVVEUkFURV9fIGlzIGludmFsaWQpICAqLworI2RlZmluZSBJU19VU0FSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8PSA4MDAwMDAwVSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIG51bWJlciBvZiBzdG9wIGJpdHMgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU1RPUEJJVFNfXyBVU0FSVCBmcmFtZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgorICAqIEByZXR2YWwgU0VUIChfX1NUT1BCSVRTX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUT1BCSVRTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfU1RPUEJJVFMoX19TVE9QQklUU19fKSAoKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzBfNSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUEJJVFNfXykgPT0gVVNBUlRfU1RPUEJJVFNfMSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TVE9QQklUU19fKSA9PSBVU0FSVF9TVE9QQklUU18xXzUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUT1BCSVRTX18pID09IFVTQVJUX1NUT1BCSVRTXzIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgcGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1BBUklUWV9fIFVTQVJUIGZyYW1lIHBhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19QQVJJVFlfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fUEFSSVRZX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUEFSSVRZKF9fUEFSSVRZX18pICgoKF9fUEFSSVRZX18pID09IFVTQVJUX1BBUklUWV9OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BBUklUWV9fKSA9PSBVU0FSVF9QQVJJVFlfRVZFTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJJVFlfXykgPT0gVVNBUlRfUEFSSVRZX09ERCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fTU9ERV9fIFVTQVJUIGNvbW11bmljYXRpb24gbW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pICYgMHhGRkZGRkZGM1UpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBvdmVyc2FtcGxpbmcgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fU0FNUExJTkdfXyBVU0FSVCBvdmVyc2FtcGxpbmcuCisgICogQHJldHZhbCBTRVQgKF9fU0FNUExJTkdfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU0FNUExJTkdfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9PVkVSU0FNUExJTkcoX19TQU1QTElOR19fKSAoKChfX1NBTVBMSU5HX18pID09IFVTQVJUX09WRVJTQU1QTElOR18xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMSU5HX18pID09IFVTQVJUX09WRVJTQU1QTElOR184KSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGNsb2NrIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NMT0NLX18gVVNBUlQgY2xvY2sgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9DTE9DSyhfX0NMT0NLX18pICgoKF9fQ0xPQ0tfXykgPT0gVVNBUlRfQ0xPQ0tfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tfXykgPT0gVVNBUlRfQ0xPQ0tfRU5BQkxFKSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIHBvbGFyaXR5IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0NQT0xfXyBVU0FSVCBmcmFtZSBwb2xhcml0eS4KKyAgKiBAcmV0dmFsIFNFVCAoX19DUE9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NQT0xfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9QT0xBUklUWShfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFVTQVJUX1BPTEFSSVRZX0xPVykgfHwgKChfX0NQT0xfXykgPT0gVVNBUlRfUE9MQVJJVFlfSElHSCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBmcmFtZSBwaGFzZSBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19DUEhBX18gVVNBUlQgZnJhbWUgcGhhc2UuCisgICogQHJldHZhbCBTRVQgKF9fQ1BIQV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19DUEhBX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUEhBU0UoX19DUEhBX18pICgoKF9fQ1BIQV9fKSA9PSBVU0FSVF9QSEFTRV8xRURHRSkgfHwgKChfX0NQSEFfXykgPT0gVVNBUlRfUEhBU0VfMkVER0UpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZyBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19MQVNUQklUX18gVVNBUlQgZnJhbWUgbGFzdCBiaXQgY2xvY2sgcHVsc2Ugc2V0dGluZy4KKyAgKiBAcmV0dmFsIFNFVCAoX19MQVNUQklUX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0xBU1RCSVRfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9MQVNUQklUKF9fTEFTVEJJVF9fKSAoKChfX0xBU1RCSVRfXykgPT0gVVNBUlRfTEFTVEJJVF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEFTVEJJVF9fKSA9PSBVU0FSVF9MQVNUQklUX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCByZXF1ZXN0IHBhcmFtZXRlciBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19QQVJBTV9fIFVTQVJUIHJlcXVlc3QgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgU0VUIChfX1BBUkFNX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1BBUkFNX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfUkVRVUVTVF9QQVJBTUVURVIoX19QQVJBTV9fKSAoKChfX1BBUkFNX18pID09IFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBQcmVzY2FsZXIgaXMgdmFsaWQuCisgICogQHBhcmFtIF9fQ0xPQ0tQUkVTQ0FMRVJfXyBVU0FSVCBQcmVzY2FsZXIgdmFsdWUuCisgICogQHJldHZhbCBTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fQ0xPQ0tQUkVTQ0FMRVJfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9QUkVTQ0FMRVIoX19DTE9DS1BSRVNDQUxFUl9fKSAoKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVYxKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0NMT0NLUFJFU0NBTEVSX18pID09IFVTQVJUX1BSRVNDQUxFUl9ESVY2KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMzIpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWNjQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19DTE9DS1BSRVNDQUxFUl9fKSA9PSBVU0FSVF9QUkVTQ0FMRVJfRElWMTI4KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ0xPQ0tQUkVTQ0FMRVJfXykgPT0gVVNBUlRfUFJFU0NBTEVSX0RJVjI1NikpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEluY2x1ZGUgVVNBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZSAqLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfdXNhcnRfZXguaCIKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfTXNwRGVJbml0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFQYXVzZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVJlc3VtZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVN0b3AoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKy8qIFRyYW5zZmVyIEFib3J0IGZ1bmN0aW9ucyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnRfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKwordm9pZCBIQUxfVVNBUlRfSVJRSGFuZGxlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit2b2lkIEhBTF9VU0FSVF9UeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3ZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwordm9pZCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyogUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgSEFMX1VTQVJUX0dldFN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit1aW50MzJfdCAgICAgICAgICAgICAgIEhBTF9VU0FSVF9HZXRFcnJvcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0hBTF9VU0FSVF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2hhbF91c2FydF9leC5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfdXNhcnRfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZlMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9oYWxfdXNhcnRfZXguaApAQCAtMCwwICsxLDI4NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfdXNhcnRfZXguaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVVNBUlQgSEFMIEV4dGVuZGVkIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfVVNBUlRfRVhfSAorI2RlZmluZSBTVE0zMldCeHhfSEFMX1VTQVJUX0VYX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWxfZGVmLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVEV4CisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJURXhfRXhwb3J0ZWRfQ29uc3RhbnRzIFVTQVJURXggRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X1dvcmRfTGVuZ3RoIFVTQVJURXggV29yZCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzdCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTEpICAgLyohPCA3LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCisjZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVVNBUlRfV09SRExFTkdUSF85QiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpVVNBUlRfQ1IxX00wKSAgIC8qITwgOS1iaXQgbG9uZyBVU0FSVCBmcmFtZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X1NsYXZlX1NlbGVjdF9tYW5hZ2VtZW50IFVTQVJURXggU2xhdmUgU2VsZWN0IE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBVU0FSVF9OU1NfSEFSRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgU1BJIHNsYXZlIHNlbGVjdGlvbiBkZXBlbmRzIG9uIE5TUyBpbnB1dCBwaW4gICAgICAgICAgICAgICovCisjZGVmaW5lIFVTQVJUX05TU19TT0ZUICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0RJU19OU1MgICAgLyohPCBTUEkgc2xhdmUgaXMgYWx3YXlzIHNlbGVjdGVkIGFuZCBOU1MgaW5wdXQgcGluIGlzIGlnbm9yZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBVU0FSVEV4X1NsYXZlX01vZGUgVVNBUlRFeCBTeW5jaHJvbm91cyBTbGF2ZSBtb2RlIGVuYWJsZQorICAqIEBicmllZiAgICBVU0FSVCBTTEFWRSBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUgICAweDAwMDAwMDAwVSAgICAgLyohPCBVU0FSVCBTUEkgU2xhdmUgTW9kZSBFbmFibGUgICovCisjZGVmaW5lIFVTQVJUX1NMQVZFTU9ERV9FTkFCTEUgICAgVVNBUlRfQ1IyX1NMVkVOIC8qITwgVVNBUlQgU1BJIFNsYXZlIE1vZGUgRGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X0ZJRk9fbW9kZSBVU0FSVEV4IEZJRk8gIG1vZGUKKyAgKiBAYnJpZWYgICAgVVNBUlQgRklGTyAgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX0ZJRk9NT0RFX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgRklGTyBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgVVNBUlRfRklGT01PREVfRU5BQkxFICAgICAgICAgVVNBUlRfQ1IxX0ZJRk9FTiAgICAgICAgICAgICAgLyohPCBGSUZPIG1vZGUgZW5hYmxlICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X1RYRklGT190aHJlc2hvbGRfbGV2ZWwgVVNBUlRFeCBUWEZJRk8gdGhyZXNob2xkIGxldmVsCisgICogQGJyaWVmICAgIFVTQVJUIFRYRklGTyBsZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfMV84ICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfMV80ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMCAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfMV8yICAgVVNBUlRfQ1IzX1RYRlRDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyAxLzIgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfM180ICAgKFVTQVJUX0NSM19UWEZUQ0ZHXzB8VVNBUlRfQ1IzX1RYRlRDRkdfMSkgLyohPCBUWEZJRk8gcmVhY2hlcyAzLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfN184ICAgVVNBUlRfQ1IzX1RYRlRDRkdfMiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUWEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1RYRklGT19USFJFU0hPTERfOF84ICAgKFVTQVJUX0NSM19UWEZUQ0ZHXzJ8VVNBUlRfQ1IzX1RYRlRDRkdfMCkgLyohPCBUWEZJRk8gYmVjb21lcyBlbXB0eSAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJURXhfUlhGSUZPX3RocmVzaG9sZF9sZXZlbCBVU0FSVEV4IFJYRklGTyB0aHJlc2hvbGQgbGV2ZWwKKyAgKiBAYnJpZWYgICAgVVNBUlQgUlhGSUZPIGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzggICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMS84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNCAgIFVTQVJUX0NSM19SWEZUQ0ZHXzAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyAxLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1JYRklGT19USFJFU0hPTERfMV8yICAgVVNBUlRfQ1IzX1JYRlRDRkdfMSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSWEZJRk8gRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQgICAoVVNBUlRfQ1IzX1JYRlRDRkdfMHxVU0FSVF9DUjNfUlhGVENGR18xKSAvKiE8IFJYRklGTyBGSUZPIHJlYWNoZXMgMy80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOCAgIFVTQVJUX0NSM19SWEZUQ0ZHXzIgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlhGSUZPIEZJRk8gcmVhY2hlcyA3Lzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIFVTQVJUX1JYRklGT19USFJFU0hPTERfOF84ICAgKFVTQVJUX0NSM19SWEZUQ0ZHXzJ8VVNBUlRfQ1IzX1JYRlRDRkdfMCkgLyohPCBSWEZJRk8gRklGTyBiZWNvbWVzIGZ1bGwgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJURXhfUHJpdmF0ZV9NYWNyb3MgVVNBUlRFeCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIENvbXB1dGUgdGhlIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB0aGUgd29yZCBsZW5ndGggYW5kIHRvIHRoZSBwYXJpdHkgYml0cyBhY3RpdmF0aW9uLgorICAqIEBub3RlICAgSWYgUENFID0gMSwgdGhlIHBhcml0eSBiaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBkYXRhIGV4dHJhY3RlZAorICAqICAgICAgICAgYnkgdGhlIHJlY2VwdGlvbiBBUEkoKS4KKyAgKiAgICAgICAgIFRoaXMgbWFza2luZyBvcGVyYXRpb24gaXMgbm90IGNhcnJpZWQgb3V0IGluIHRoZSBjYXNlIG9mCisgICogICAgICAgICBETUEgdHJhbnNmZXJzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUsIHRoZSBtYXNrIHRvIGFwcGx5IHRvIFVTQVJUIFJEUiByZWdpc3RlciBpcyBzdG9yZWQgaW4gKF9fSEFORExFX18pLT5NYXNrIGZpZWxkLgorICAqLworI2RlZmluZSBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF84QikgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzdCKSAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAzRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwVSkKKworCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgZnJhbWUgbGVuZ3RoIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX0xFTkdUSF9fIFVTQVJUIGZyYW1lIGxlbmd0aC4KKyAgKiBAcmV0dmFsIFNFVCAoX19MRU5HVEhfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTEVOR1RIX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfV09SRF9MRU5HVEgoX19MRU5HVEhfXykgKCgoX19MRU5HVEhfXykgPT0gVVNBUlRfV09SRExFTkdUSF83QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0xFTkdUSF9fKSA9PSBVU0FSVF9XT1JETEVOR1RIXzhCKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTEVOR1RIX18pID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgTmVnYXRpdmUgU2xhdmUgU2VsZWN0IChOU1MpIHBpbiBtYW5hZ2VtZW50IGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX05TU19fIFVTQVJUIE5lZ2F0aXZlIFNsYXZlIFNlbGVjdCBwaW4gbWFuYWdlbWVudC4KKyAgKiBAcmV0dmFsIFNFVCAoX19OU1NfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fTlNTX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfTlNTKF9fTlNTX18pICgoKF9fTlNTX18pID09IFVTQVJUX05TU19IQVJEKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX05TU19fKSA9PSBVU0FSVF9OU1NfU09GVCkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBTbGF2ZSBNb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUQVRFX18gVVNBUlQgU2xhdmUgTW9kZS4KKyAgKiBAcmV0dmFsIFNFVCAoX19TVEFURV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TVEFURV9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1NMQVZFTU9ERShfX1NUQVRFX18pICAgKCgoX19TVEFURV9fKSA9PSBVU0FSVF9TTEFWRU1PREVfRElTQUJMRSApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEUpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgRklGTyBtb2RlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUQVRFX18gVVNBUlQgRklGTyBtb2RlLgorICAqIEByZXR2YWwgU0VUIChfX1NUQVRFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NUQVRFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVVNBUlRfRklGT19NT0RFX1NUQVRFKF9fU1RBVEVfXykgKCgoX19TVEFURV9fKSA9PSBVU0FSVF9GSUZPTU9ERV9ESVNBQkxFICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkpCisKKy8qKgorICAqIEBicmllZiBFbnN1cmUgdGhhdCBVU0FSVCBUWEZJRk8gdGhyZXNob2xkIGxldmVsIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1RIUkVTSE9MRF9fIFVTQVJUIFRYRklGTyB0aHJlc2hvbGQgbGV2ZWwuCisgICogQHJldHZhbCBTRVQgKF9fVEhSRVNIT0xEX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1RIUkVTSE9MRF9fIGlzIGludmFsaWQpCisgICovCisjZGVmaW5lIElTX1VTQVJUX1RYRklGT19USFJFU0hPTEQoX19USFJFU0hPTERfXykgICgoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1RYRklGT19USFJFU0hPTERfMV84KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzIpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1RYRklGT19USFJFU0hPTERfM180KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzdfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF84XzgpKQorCisvKioKKyAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVVNBUlQgUlhGSUZPIHRocmVzaG9sZCBsZXZlbCBpcyB2YWxpZC4KKyAgKiBAcGFyYW0gX19USFJFU0hPTERfXyBVU0FSVCBSWEZJRk8gdGhyZXNob2xkIGxldmVsLgorICAqIEByZXR2YWwgU0VUIChfX1RIUkVTSE9MRF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USFJFU0hPTERfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VU0FSVF9SWEZJRk9fVEhSRVNIT0xEKF9fVEhSRVNIT0xEX18pICAoKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfOCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1JYRklGT19USFJFU0hPTERfMV8yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RIUkVTSE9MRF9fKSA9PSBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzNfNCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19USFJFU0hPTERfXykgPT0gVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF83XzgpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVEhSRVNIT0xEX18pID09IFVTQVJUX1JYRklGT19USFJFU0hPTERfOF84KSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgICogQHsKKyAgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7Cit2b2lkIEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEB7CisgICovCisKKy8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9FbmFibGVTbGF2ZU1vZGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0Rpc2FibGVTbGF2ZU1vZGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0NvbmZpZ05TUyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IE5TU0NvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9FbmFibGVGaWZvTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfRGlzYWJsZUZpZm9Nb2RlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfU2V0UnhGaWZvVGhyZXNob2xkKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgVGhyZXNob2xkKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9IQUxfVVNBUlRfRVhfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9oYWxfd3dkZy5oIGIvSW5jL3N0bTMyd2J4eF9oYWxfd3dkZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGVlODcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2hhbF93d2RnLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3d3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgV1dERyBIQUwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9IQUxfV1dER19ICisjZGVmaW5lIFNUTTMyV0J4eF9IQUxfV1dER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFdXREcKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfVHlwZXMgV1dERyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV1dERyBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIG9mIHRoZSBXV0RHLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgV1dER19QcmVzY2FsZXIgKi8KKworICB1aW50MzJfdCBXaW5kb3c7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgV1dERyB3aW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd25jb3VudGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgTWluX0RhdGEgPSAweDQwIGFuZCBNYXhfRGF0YSA9IDB4N0YgKi8KKworICB1aW50MzJfdCBDb3VudGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgV1dERyBmcmVlLXJ1bm5pbmcgZG93bmNvdW50ZXIgIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4NDAgYW5kIE1heF9EYXRhID0gMHg3RiAqLworCisgIHVpbnQzMl90IEVXSU1vZGUgOyAgICAgIC8qITwgU3BlY2lmaWVzIGlmIFdXREcgRWFybHkgV2FrZXVwIEludGVydXB0IGlzIGVuYWJsZSBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBXV0RHX0VXSV9Nb2RlICovCisKK30gV1dER19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBXV0RHIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit0eXBlZGVmIHN0cnVjdCBfX1dXREdfSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYKK3sKKyAgV1dER19UeXBlRGVmICAgICAgKkluc3RhbmNlOyAgLyohPCBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKworICBXV0RHX0luaXRUeXBlRGVmICBJbml0OyAgICAgICAvKiE8IFdXREcgcmVxdWlyZWQgcGFyYW1ldGVycyAqLworCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgdm9pZCAgICAgICAgICAgICAgKCogRXdpQ2FsbGJhY2spKHN0cnVjdCBfX1dXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOyAgICAgLyohPCBXV0RHIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgY2FsbGJhY2sgKi8KKworICB2b2lkICAgICAgICAgICAgICAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX1dXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOyAvKiE8IFdXREcgTXNwIEluaXQgY2FsbGJhY2sgKi8KKyNlbmRpZgorfSBXV0RHX0hhbmRsZVR5cGVEZWY7CisKKyNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgV1dERyBjb21tb24gQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9XV0RHX0VXSV9DQl9JRCAgICAgICAgICA9IDB4MDB1LCAgICAvKiE8IFdXREcgRVdJIGNhbGxiYWNrIElEICovCisgIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgICAgICA9IDB4MDF1LCAgICAvKiE8IFdXREcgTXNwSW5pdCBjYWxsYmFjayBJRCAqLworfUhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEhBTCBXV0RHIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiB2b2lkICgqcFdXREdfQ2FsbGJhY2tUeXBlRGVmKShXV0RHX0hhbmRsZVR5cGVEZWYgKiBocHBwKTsgLyohPCBwb2ludGVyIHRvIGEgV1dERyBjb21tb24gY2FsbGJhY2sgZnVuY3Rpb25zICovCisKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0NvbnN0YW50cyBXV0RHIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19JbnRlcnJ1cHRfZGVmaW5pdGlvbiBXV0RHIEludGVycnVwdCBkZWZpbml0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19JVF9FV0kgICAgICAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfRVdJICAvKiE8IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgV1dER19GbGFnX2RlZmluaXRpb24gV1dERyBGbGFnIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgV1dERyBGbGFnIGRlZmluaXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBXV0RHX0ZMQUdfRVdJRiAgICAgICAgICAgICAgICAgICAgICBXV0RHX1NSX0VXSUYgIC8qITwgRWFybHkgd2FrZXVwIGludGVycnVwdCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfUHJlc2NhbGVyIFdXREcgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8xICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzIgICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMiAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl80ICAgICAgICAgICAgICAgICAgICBXV0RHX0NGUl9XREdUQl8xICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzQgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfOCAgICAgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzEgfCBXV0RHX0NGUl9XREdUQl8wKSAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS84ICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzIgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMTYgKi8KKyNkZWZpbmUgV1dER19QUkVTQ0FMRVJfMzIgICAgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzIgfCBXV0RHX0NGUl9XREdUQl8wKSAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8zMiAqLworI2RlZmluZSBXV0RHX1BSRVNDQUxFUl82NCAgICAgICAgICAgICAgICAgICAoV1dER19DRlJfV0RHVEJfMiB8IFdXREdfQ0ZSX1dER1RCXzEpICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzY0ICovCisjZGVmaW5lIFdXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMTI4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfRVdJX01vZGUgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBXV0RHX0VXSV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdSAgICAgICAvKiE8IEVXSSBEaXNhYmxlICovCisjZGVmaW5lIFdXREdfRVdJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX0VXSSAgICAgIC8qITwgRVdJIEVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBXV0RHX1ByaXZhdGVfTWFjcm9zIFdXREcgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19XV0RHX1BSRVNDQUxFUihfX1BSRVNDQUxFUl9fKSAgICAoKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8xKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8yKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl80KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl84KSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8xNikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8zMikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl82NCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSBXV0RHX1BSRVNDQUxFUl8xMjgpKQorCisjZGVmaW5lIElTX1dXREdfV0lORE9XKF9fV0lORE9XX18pICAgICAgICAgICgoKF9fV0lORE9XX18pID49IFdXREdfQ0ZSX1dfNikgJiYgKChfX1dJTkRPV19fKSA8PSBXV0RHX0NGUl9XKSkKKworI2RlZmluZSBJU19XV0RHX0NPVU5URVIoX19DT1VOVEVSX18pICAgICAgICAoKChfX0NPVU5URVJfXykgPj0gV1dER19DUl9UXzYpICYmICgoX19DT1VOVEVSX18pIDw9IFdXREdfQ1JfVCkpCisKKyNkZWZpbmUgSVNfV1dER19FV0lfTU9ERShfX01PREVfXykgICAgICAgICAgKCgoX19NT0RFX18pID09IFdXREdfRVdJX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gV1dER19FV0lfRElTQUJMRSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfTWFjcm9zIFdXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFdXREcgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIFdXREdfQ1JfV0RHQSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX186IFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGludGVycnVwdCB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0lUX0VXSTogRWFybHkgd2FrZXVwIGludGVycnVwdAorICAqIEBub3RlICAgT25jZSBlbmFibGVkIHRoaXMgaW50ZXJydXB0IGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZSLCAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc2VsZWN0ZWQgV1dERyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIGl0IHRvIGNoZWNrLgorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBXV0RHX0ZMQUdfRVdJRjogRWFybHkgd2FrZXVwIGludGVycnVwdCBJVAorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBXV0RHX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgICBfX0hBTF9XV0RHX0dFVF9GTEFHKChfX0hBTkRMRV9fKSwoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIENsZWFyIHRoZSBXV0RHIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCisgICogICAgICAgICBiaXRzIHRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqLworI2RlZmluZSBfX0hBTF9XV0RHX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgX19IQUxfV1dER19DTEVBUl9GTEFHKChfX0hBTkRMRV9fKSwgKF9fSU5URVJSVVBUX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBXV0RHIGZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gIFdXREcgaGFuZGxlCisgICogQHBhcmFtICBfX0ZMQUdfXyAgc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgV1dER19GTEFHX0VXSUY6IEVhcmx5IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBXV0RHX0ZMQUcgKFNFVCBvciBSRVNFVCkuCisgICovCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MuCisgICogQHBhcmFtICBfX0hBTkRMRV9fICBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgX19GTEFHX18gIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfRkxBR19FV0lGOiBFYXJseSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiA9IH4oX19GTEFHX18pKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgV1dERyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgV1dERyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBzcGVjaWZpZXMgdGhlIFdXREcgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFdXREdfSVRfRVdJOiBFYXJseSBXYWtldXAgSW50ZXJydXB0CisgICogQHJldHZhbCBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfV1dER19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAgKiBAeworICAqLworLyogSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsKKy8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgICogQHsKKyAgKi8KKy8qIEkvTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfV1dER19SZWZyZXNoKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpOwordm9pZCAgICAgICAgICAgICAgICAgIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZyk7Cit2b2lkICAgICAgICAgICAgICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfSEFMX1dXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9hZGMuaCBiL0luYy9zdG0zMndieHhfbGxfYWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4Mjc2OQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfYWRjLmgKQEAgLTAsMCArMSw2MTIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2FkYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBBREMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9BRENfSAorI2RlZmluZSBTVE0zMldCeHhfTExfQURDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChBREMxKQorCisvKiogQGRlZmdyb3VwIEFEQ19MTCBBREMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzIEFEQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19SRUdfUkFOS194IHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAqLworLyogLSBzZXF1ZW5jZXIgcmVnaXN0ZXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gc2VxdWVuY2VyIHJhbmsgYml0cyBwb3NpdGlvbiBpbnRvIHRoZSBzZWxlY3RlZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisKKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGNvbmZpZ3VyYXRpb24gKi8KKy8qIChvZmZzZXQgcGxhY2VkIGludG8gYSBzcGFyZSBhcmVhIG9mIGxpdGVyYWwgZGVmaW5pdGlvbikgKi8KKyNkZWZpbmUgQURDX1NRUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBBRENfU1FSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgweDAwMDAwMTAwVUwpCisjZGVmaW5lIEFEQ19TUVIzX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDBVTCkKKyNkZWZpbmUgQURDX1NRUjRfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoMHgwMDAwMDMwMFVMKQorCisjZGVmaW5lIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSyAgICAgICAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19TUVI0X1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX1NRUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAgICAoOFVMKSAvKiBQb3NpdGlvbiBvZiBiaXRzIEFEQ19TUVJ4X1JFR09GRlNFVCBpbiBBRENfUkVHX1NRUlhfUkVHT0ZGU0VUX01BU0sgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSyAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0tfUE9TQklUMCkKKworLyogRGVmaW5pdGlvbiBvZiBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgYml0cyBpbmZvcm1hdGlvbiB0byBiZSBpbnNlcnRlZCAgKi8KKy8qIGludG8gQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmtzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xX1NRUlhfQklUT0ZGU0VUX1BPUyAgKCA2VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIxX1NRMSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzJfU1FSWF9CSVRPRkZTRVRfUE9TICAoMTJVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NRUjFfU1EyIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfM19TUVJYX0JJVE9GRlNFVF9QT1MgICgxOFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU1FSMV9TUTMiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS180X1NRUlhfQklUT0ZGU0VUX1BPUyAgKDI0VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIxX1NRNCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzVfU1FSWF9CSVRPRkZTRVRfUE9TICAoIDBVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NRUjJfU1E1IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfNl9TUVJYX0JJVE9GRlNFVF9QT1MgICggNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU1FSMl9TUTYiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS183X1NRUlhfQklUT0ZGU0VUX1BPUyAgKDEyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIyX1NRNyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX1JFR19SQU5LXzhfU1FSWF9CSVRPRkZTRVRfUE9TICAoMThVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NRUjJfU1E4IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfUkVHX1JBTktfOV9TUVJYX0JJVE9GRlNFVF9QT1MgICgyNFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU1FSMl9TUTkiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMF9TUVJYX0JJVE9GRlNFVF9QT1MgKCAwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIzX1NRMTAiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMV9TUVJYX0JJVE9GRlNFVF9QT1MgKCA2VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIzX1NRMTEiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xMl9TUVJYX0JJVE9GRlNFVF9QT1MgKDEyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIzX1NRMTIiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xM19TUVJYX0JJVE9GRlNFVF9QT1MgKDE4VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIzX1NRMTMiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNF9TUVJYX0JJVE9GRlNFVF9QT1MgKDI0VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVIzX1NRMTQiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNV9TUVJYX0JJVE9GRlNFVF9QT1MgKCAwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVI0X1NRMTUiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfUkFOS18xNl9TUVJYX0JJVE9GRlNFVF9QT1MgKCA2VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TUVI0X1NRMTYiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisKKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbCBMTF9BRENfSU5KX1JBTktfeCB0aGUgcmVsZXZhbnQgYml0cyBmb3I6ICAgICAgICAgICAgKi8KKy8qIC0gZGF0YSByZWdpc3RlciBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIHNlcXVlbmNlciByYW5rIGJpdHMgcG9zaXRpb24gaW50byB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBncm91cCBpbmplY3RlZCBkYXRhIHJlZ2lzdGVyICovCisvKiAob2Zmc2V0IHBsYWNlZCBpbnRvIGEgc3BhcmUgYXJlYSBvZiBsaXRlcmFsIGRlZmluaXRpb24pICovCisjZGVmaW5lIEFEQ19KRFIxX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgQURDX0pEUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMFVMKQorI2RlZmluZSBBRENfSkRSM19SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgweDAwMDAwMjAwVUwpCisjZGVmaW5lIEFEQ19KRFI0X1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAzMDBVTCkKKworI2RlZmluZSBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0sgICAgICAgIChBRENfSkRSMV9SRUdPRkZTRVQgfCBBRENfSkRSMl9SRUdPRkZTRVQgfCBBRENfSkRSM19SRUdPRkZTRVQgfCBBRENfSkRSNF9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0sgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDApCisjZGVmaW5lIEFEQ19KRFJYX1JFR09GRlNFVF9QT1MgICAgICAgICAgICAgKDhVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfSkRSeF9SRUdPRkZTRVQgaW4gQURDX0lOSl9KRFJYX1JFR09GRlNFVF9NQVNLICovCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBiaXRzIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkICovCisvKiBpbnRvIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFua3MgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MgICggOFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfSlNRUl9KU1ExIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfSU5KX1JBTktfMl9KU1FSX0JJVE9GRlNFVF9QT1MgICgxNFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfSlNRUl9KU1EyIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfSU5KX1JBTktfM19KU1FSX0JJVE9GRlNFVF9QT1MgICgyMFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfSlNRUl9KU1EzIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MgICgyNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfSlNRUl9KU1E0IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX1JFR19UUklHX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovCisvKiAtIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSByZWd1bGFyIHRyaWdnZXIgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQgICAgICAgKEFEQ19DRkdSX0VYVEVOXzApIC8qIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpICovCisKKy8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIHNvdXJjZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICovCisvKiB0cmlnZ2VyIGVkZ2Ugc2VsZWN0aW9uIGR1cGxpY2F0ZWQgd2l0aCBzaGlmdHMgWzA7IDQ7IDg7IDEyXSAgICAgICAgICAgICAgICAqLworLyogY29ycmVzcG9uZGluZyB0byB7U1cgc3RhcnQ7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXJ9LiAgICAgICAgKi8KKyNkZWZpbmUgQURDX1JFR19UUklHX1NPVVJDRV9NQVNLICAgICAgICAgICAgKCgoTExfQURDX1JFR19UUklHX1NPRlRXQVJFICYgQURDX0NGR1JfRVhUU0VMKSA8PCAoNFUgKiAwVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1JfRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAxVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1JfRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAyVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0NGR1JfRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAzVUwpKSAgKQorCisvKiBNYXNrIGNvbnRhaW5pbmcgdHJpZ2dlciBlZGdlIG1hc2tzIGZvciBlYWNoIG9mIHBvc3NpYmxlICAgICAgICAgICAgICAgICAgICAqLworLyogdHJpZ2dlciBlZGdlIHNlbGVjdGlvbiBkdXBsaWNhdGVkIHdpdGggc2hpZnRzIFswOyA0OyA4OyAxMl0gICAgICAgICAgICAgICAgKi8KKy8qIGNvcnJlc3BvbmRpbmcgdG8ge1NXIHN0YXJ0OyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyfS4gICAgICAgICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FREdFX01BU0sgICAgICAgICAgICAgICgoKExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSAmIEFEQ19DRkdSX0VYVEVOKSA8PCAoNFUgKiAwVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgIDw8ICg0VSAqIDFVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgPDwgKDRVICogMlVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICA8PCAoNFUgKiAzVUwpKSAgKQorCisvKiBEZWZpbml0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfUkVHX1RSSUdfRVhUU0VMX0JJVE9GRlNFVF9QT1MgICggNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0ZHUl9FWFRTRUwiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19SRUdfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TICAgKDEwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DRkdSX0VYVEVOIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworCisKKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRvIHNlbGVjdCBpbnRvIGxpdGVyYWwgTExfQURDX0lOSl9UUklHX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICovCisvKiAtIGluamVjdGVkIHRyaWdnZXIgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLSBpbmplY3RlZCB0cmlnZ2VyIGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQgICAgICAoQURDX0pTUVJfSkVYVEVOXzApIC8qIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpICovCisKKy8qIE1hc2sgY29udGFpbmluZyB0cmlnZ2VyIHNvdXJjZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICovCisvKiB0cmlnZ2VyIGVkZ2Ugc2VsZWN0aW9uIGR1cGxpY2F0ZWQgd2l0aCBzaGlmdHMgWzA7IDQ7IDg7IDEyXSAgICAgICAgICAgICAgICAqLworLyogY29ycmVzcG9uZGluZyB0byB7U1cgc3RhcnQ7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcjsgZXh0IHRyaWdnZXJ9LiAgICAgICAgKi8KKyNkZWZpbmUgQURDX0lOSl9UUklHX1NPVVJDRV9NQVNLICAgICAgICAgICAgKCgoTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICYgQURDX0pTUVJfSkVYVFNFTCkgPDwgKDRVICogMFVMKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURDX0pTUVJfSkVYVFNFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg0VSAqIDFVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEQ19KU1FSX0pFWFRTRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNFUgKiAyVUwpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfSlNRUl9KRVhUU0VMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKDRVICogM1VMKSkgICkKKworLyogTWFzayBjb250YWluaW5nIHRyaWdnZXIgZWRnZSBtYXNrcyBmb3IgZWFjaCBvZiBwb3NzaWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHRyaWdnZXIgZWRnZSBzZWxlY3Rpb24gZHVwbGljYXRlZCB3aXRoIHNoaWZ0cyBbMDsgNDsgODsgMTJdICAgICAgICAgICAgICAgICovCisvKiBjb3JyZXNwb25kaW5nIHRvIHtTVyBzdGFydDsgZXh0IHRyaWdnZXI7IGV4dCB0cmlnZ2VyOyBleHQgdHJpZ2dlcn0uICAgICAgICAqLworI2RlZmluZSBBRENfSU5KX1RSSUdfRURHRV9NQVNLICAgICAgICAgICAgICAoKChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pIDw8ICg0VSAqIDBVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgIDw8ICg0VSAqIDFVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgIDw8ICg0VSAqIDJVTCkpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgIDw8ICg0VSAqIDNVTCkpICApCisKKy8qIERlZmluaXRpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgYml0cyBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRTRUxfQklUT0ZGU0VUX1BPUyAgKCAyVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19KU1FSX0pFWFRTRUwiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19JTkpfVFJJR19FWFRFTl9CSVRPRkZTRVRfUE9TICAgKCA2VUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19KU1FSX0pFWFRFTiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKworCisKKworCisKKy8qIEludGVybmFsIG1hc2sgZm9yIEFEQyBjaGFubmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbyBzZWxlY3QgaW50byBsaXRlcmFsIExMX0FEQ19DSEFOTkVMX3ggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgICAgICAgICAqLworLyogLSBjaGFubmVsIGlkZW50aWZpZXIgZGVmaW5lZCBieSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBpZGVudGlmaWVyIGRlZmluZWQgYnkgYml0ZmllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtIGNoYW5uZWwgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gZXh0ZXJuYWwgY2hhbm5lbHMgKGNvbm5lY3RlZCB0byAgICAgICAgICAqLworLyogICBHUElPIHBpbnMpIGFuZCBpbnRlcm5hbCBjaGFubmVscyAoY29ubmVjdGVkIHRvIGludGVybmFsIHBhdGhzKSAgICAgICAgICAgKi8KKy8qIC0gY2hhbm5lbCBzYW1wbGluZyB0aW1lIGRlZmluZWQgYnkgU01QUnggcmVnaXN0ZXIgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICovCisvKiAgIGFuZCBTTVB4IGJpdHMgcG9zaXRpb25zIGludG8gU01QUnggcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyAgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0gpCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX0JJVEZJRUxEX01BU0sgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIKQorI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUyAoMjZVTCkvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfTUFTSyAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgfCBBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLIHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSykKKy8qIEVxdWl2YWxlbnQgbWFzayBvZiBBRENfQ0hBTk5FTF9OVU1CRVJfTUFTSyBhbGlnbmVkIG9uIHJlZ2lzdGVyIExTQiAoYml0IDApICovCisjZGVmaW5lIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgKEFEQ19TUVIyX1NRNSkgLyogRXF1aXZhbGVudCB0byBzaGlmdDogKEFEQ19DSEFOTkVMX05VTUJFUl9NQVNLID4+IFtQb3NpdGlvbiBvZiBiaXRmaWVsZCAiQURDX0NIQU5ORUxfTlVNQkVSX01BU0siIGluIHJlZ2lzdGVyXSkgKi8KKworLyogQ2hhbm5lbCBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgY2hhbm5lbHMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggICAgICAgICAoMHg4MDAwMDAwMFVMKSAvKiBNYXJrZXIgb2YgaW50ZXJuYWwgY2hhbm5lbCAqLworI2RlZmluZSBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yICAgICAgICgweDAwMDgwMDAwVUwpIC8qIE1hcmtlciBvZiBpbnRlcm5hbCBjaGFubmVsIGZvciBvdGhlciBBREMgaW5zdGFuY2VzLCBpbiBjYXNlIG9mIGRpZmZlcmVudCBBREMgaW50ZXJuYWwgY2hhbm5lbHMgbWFwcGVkIG9uIHNhbWUgY2hhbm5lbCBudW1iZXIgb24gZGlmZmVyZW50IEFEQyBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0hfTUFTSyAgICAoQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0ggfCBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF8yKQorCisvKiBJbnRlcm5hbCByZWdpc3RlciBvZmZzZXQgZm9yIEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUgY29uZmlndXJhdGlvbiAqLworLyogKG9mZnNldCBwbGFjZWQgaW50byBhIHNwYXJlIGFyZWEgb2YgbGl0ZXJhbCBkZWZpbml0aW9uKSAqLworI2RlZmluZSBBRENfU01QUjFfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19TTVBSMl9SRUdPRkZTRVQgICAgICAgICAgICAgICAgKDB4MDIwMDAwMDBVTCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfU01QUlhfUkVHT0ZGU0VUX01BU0sgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8IEFEQ19TTVBSMl9SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19TTVBSWF9SRUdPRkZTRVRfUE9TICAgICAgICAgICAgKDI1VUwpIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX1NNUFJ4X1JFR09GRlNFVCBpbiBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSyAqLworCisjZGVmaW5lIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0sgICAgKDB4MDFGMDAwMDBVTCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TICAgICAoMjBVTCkgICAgICAgICAgIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0siIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisKKy8qIERlZmluaXRpb24gb2YgY2hhbm5lbHMgSUQgbnVtYmVyIGluZm9ybWF0aW9uIHRvIGJlIGluc2VydGVkIGludG8gICAgICAgICAgICovCisvKiBjaGFubmVscyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8wX05VTUJFUiAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzFfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzJfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzNfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzRfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzVfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMiAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzZfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzdfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzhfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzlfTlVNQkVSICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEwX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEzX05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMiAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1X05VTUJFUiAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfQVdEMUNIXzMgfCBBRENfQ0ZHUl9BV0QxQ0hfMiB8IEFEQ19DRkdSX0FXRDFDSF8xIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE2X05VTUJFUiAgICAgICAgICAgICAgKEFEQ19DRkdSX0FXRDFDSF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3X05VTUJFUiAgICAgICAgICAgICAgKEFEQ19DRkdSX0FXRDFDSF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUNIXzApCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4X05VTUJFUiAgICAgICAgICAgICAgKEFEQ19DRkdSX0FXRDFDSF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFDSF8xICAgICAgICAgICAgICAgICAgICApCisKKy8qIERlZmluaXRpb24gb2YgY2hhbm5lbHMgSUQgYml0ZmllbGQgaW5mb3JtYXRpb24gdG8gYmUgaW5zZXJ0ZWQgaW50byAgICAgICAgICovCisvKiBjaGFubmVscyBsaXRlcmFscyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8wKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xKQorI2RlZmluZSBBRENfQ0hBTk5FTF8yX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8yKQorI2RlZmluZSBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8zKQorI2RlZmluZSBBRENfQ0hBTk5FTF80X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF80KQorI2RlZmluZSBBRENfQ0hBTk5FTF81X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF81KQorI2RlZmluZSBBRENfQ0hBTk5FTF82X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF82KQorI2RlZmluZSBBRENfQ0hBTk5FTF83X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF83KQorI2RlZmluZSBBRENfQ0hBTk5FTF84X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF84KQorI2RlZmluZSBBRENfQ0hBTk5FTF85X0JJVEZJRUxEICAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF85KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xMCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTFfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTEpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzEyX0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzEyKQorI2RlZmluZSBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xMykKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTRfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTQpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE1X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzE1KQorI2RlZmluZSBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCAgICAgICAgICAgIChBRENfQVdEMkNSX0FXRDJDSF8xNikKKyNkZWZpbmUgQURDX0NIQU5ORUxfMTdfQklURklFTEQgICAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMTcpCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE4X0JJVEZJRUxEICAgICAgICAgICAgKEFEQ19BV0QyQ1JfQVdEMkNIXzE4KQorCisvKiBEZWZpbml0aW9uIG9mIGNoYW5uZWxzIHNhbXBsaW5nIHRpbWUgaW5mb3JtYXRpb24gdG8gYmUgaW5zZXJ0ZWQgaW50byAgICAgICAqLworLyogY2hhbm5lbHMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMF9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoIDBVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QMCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMV9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoIDNVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QMSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMl9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoIDZVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QMiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfM19TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoIDlVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QMyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNF9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMTJVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNV9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMTVVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfNl9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMThVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfN19TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjFVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QNyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOF9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjRVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QOCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfOV9TTVAgICAgICAgICAgICAgICAgICAoQURDX1NNUFIxX1JFR09GRlNFVCB8ICgoMjdVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjFfU01QOSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTBfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoIDBVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTAiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzExX1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKCAzVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDExIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xMl9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCggNlVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxMiIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTNfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoIDlVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTMiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE0X1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDEyVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDE0IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xNV9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgxNVVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxNSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NIQU5ORUxfMTZfU01QICAgICAgICAgICAgICAgICAoQURDX1NNUFIyX1JFR09GRlNFVCB8ICgoMThVTCkgPDwgQURDX0NIQU5ORUxfU01QeF9CSVRPRkZTRVRfUE9TKSkgLyogVmFsdWUgc2hpZnRlZCBpcyBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfU01QUjJfU01QMTYiIHBvc2l0aW9uIGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEQ19DSEFOTkVMXzE3X1NNUCAgICAgICAgICAgICAgICAgKEFEQ19TTVBSMl9SRUdPRkZTRVQgfCAoKDIxVUwpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpIC8qIFZhbHVlIHNoaWZ0ZWQgaXMgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX1NNUFIyX1NNUDE3IiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0hBTk5FTF8xOF9TTVAgICAgICAgICAgICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgyNFVMKSA8PCBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKSAvKiBWYWx1ZSBzaGlmdGVkIGlzIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19TTVBSMl9TTVAxOCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgbW9kZSBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGVkOiAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbHMgTExfQURDX1NJTkdMRV9FTkRFRCBvciBMTF9BRENfU0lOR0xFX0RJRkZFUkVOVElBTCAgKi8KKy8qIHRoZSByZWxldmFudCBiaXRzIGZvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAoY29uY2F0ZW5hdGlvbiBvZiBtdWx0aXBsZSBiaXRzIHVzZWQgaW4gZGlmZmVyZW50IHJlZ2lzdGVycykgICAgICAgICAgICAgICAqLworLyogLSBBREMgY2FsaWJyYXRpb246IGNhbGlicmF0aW9uIHN0YXJ0LCBjYWxpYnJhdGlvbiBmYWN0b3IgZ2V0IG9yIHNldCAgICAgICAgKi8KKy8qIC0gQURDIGNoYW5uZWxzOiBzZXQgZWFjaCBBREMgY2hhbm5lbCBlbmRpbmcgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX1NUQVJUX01BU0sgICAgKEFEQ19DUl9BRENBTERJRikKKyNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0FMSUJfRkFDVE9SX01BU0sgICAoQURDX0NBTEZBQ1RfQ0FMRkFDVF9EIHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9TKQorI2RlZmluZSBBRENfU0lOR0xFRElGRl9DSEFOTkVMX01BU0sgICAgICAgIChBRENfQ0hBTk5FTF9JRF9CSVRGSUVMRF9NQVNLKSAvKiBFcXVpdmFsZW50IHRvIEFEQ19ESUZTRUxfRElGU0VMICovCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfU0hJRlRfTUFTSyAgKEFEQ19DQUxGQUNUX0NBTEZBQ1RfU180IHwgQURDX0NBTEZBQ1RfQ0FMRkFDVF9TXzMpIC8qIEJpdHMgY2hvc2VuIHRvIHBlcmZvcm0gb2Ygc2hpZnQgd2hlbiBzaW5nbGUgbW9kZSBpcyBzZWxlY3RlZCwgc2hpZnQgdmFsdWUgb3V0IG9mIGNoYW5uZWxzIGJpdHMgcmFuZ2UuICovCisjZGVmaW5lIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfTUFTSyAgICgweDAwMDEwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSBkaWZmZXJlbnRpYWwgbW9kZTogbWFzayBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9QT1MgICAgKDE2VUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gb2YgMSBiaXQgdG8gZGlzY3JpbWluYXRlIGRpZmZlcmVudGlhbCBtb2RlOiBwb3NpdGlvbiBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9TSElGVDQgKEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfUE9TIC0gNFVMKSAvKiBTaGlmdCBvZiBiaXQgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRCB0byBwb3NpdGlvbiB0byBwZXJmb3JtIGEgc2hpZnQgb2YgNCByYW5rcyAqLworCisvKiBJbnRlcm5hbCBtYXNrIGZvciBBREMgYW5hbG9nIHdhdGNoZG9nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVG8gc2VsZWN0IGludG8gbGl0ZXJhbHMgTExfQURDX0FXRF9DSEFOTkVMeF94eHggdGhlIHJlbGV2YW50IGJpdHMgZm9yOiAgICAgKi8KKy8qIChjb25jYXRlbmF0aW9uIG9mIG11bHRpcGxlIGJpdHMgdXNlZCBpbiBkaWZmZXJlbnQgYW5hbG9nIHdhdGNoZG9ncywgICAgICAgICovCisvKiAoZmVhdHVyZSBvZiBzZXZlcmFsIHdhdGNoZG9ncyBub3QgYXZhaWxhYmxlIG9uIGFsbCBTVE0zMiBmYW1pbGllcykpLiAgICAgICAqLworLyogLSBhbmFsb2cgd2F0Y2hkb2cgMTogbW9uaXRvcmVkIGNoYW5uZWwgZGVmaW5lZCBieSBudW1iZXIsICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc2VsZWN0aW9uIG9mIEFEQyBncm91cCAoQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZCkuICAgICAgICAgICAgICovCisvKiAtIGFuYWxvZyB3YXRjaGRvZyAyIGFuZCAzOiBtb25pdG9yZWQgY2hhbm5lbCBkZWZpbmVkIGJ5IGJpdGZpZWxkLCBubyAgICAgICAqLworLyogICBzZWxlY3Rpb24gb24gZ3JvdXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRENfQVdEX0NSMV9SRUdPRkZTRVQgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19BV0RfQ1IyX1JFR09GRlNFVCAgICAgICAgICAgICAgKDB4MDAxMDAwMDBVTCkKKyNkZWZpbmUgQURDX0FXRF9DUjNfUkVHT0ZGU0VUICAgICAgICAgICAgICAoMHgwMDIwMDAwMFVMKQorCisvKiBSZWdpc3RlciBvZmZzZXQgZ2FwIGJldHdlZW4gQVdEMSBhbmQgQVdEMi1BV0QzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisvKiAoU2V0IHNlcGFyYXRlbHkgYXMgQURDX0FXRF9DUlhfUkVHT0ZGU0VUIHRvIHNwYXJlIDMyIGJpdHMgc3BhY2UgKi8KKyNkZWZpbmUgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9NQVNLICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCkKKyNkZWZpbmUgQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwgICAgICAoMHgwMDAwMDAyNFVMKQorCisjZGVmaW5lIEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9NQVNLICAgICAgICAgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCB8IEFEQ19BV0RfQ1IyX1JFR09GRlNFVCB8IEFEQ19BV0RfQ1IzX1JFR09GRlNFVCkKKworI2RlZmluZSBBRENfQVdEX0NSMV9DSEFOTkVMX01BU0sgICAgICAgICAgIChBRENfQ0ZHUl9BV0QxQ0ggfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkKKyNkZWZpbmUgQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyAgICAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0gpCisjZGVmaW5lIEFEQ19BV0RfQ1JfQUxMX0NIQU5ORUxfTUFTSyAgICAgICAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyB8IEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spCisKKyNkZWZpbmUgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAoMjBVTCkgLyogUG9zaXRpb24gb2YgYml0cyBBRENfQVdEX0NSeF9SRUdPRkZTRVQgaW4gQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0sgKi8KKworLyogSW50ZXJuYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFEQ19BV0RfVFIxX1JFR09GRlNFVCAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IxX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUjJfUkVHT0ZGU0VUICAgICAgICAgICAgICAoQURDX0FXRF9DUjJfUkVHT0ZGU0VUKQorI2RlZmluZSBBRENfQVdEX1RSM19SRUdPRkZTRVQgICAgICAgICAgICAgIChBRENfQVdEX0NSM19SRUdPRkZTRVQpCisjZGVmaW5lIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLICAgICAgICAgKEFEQ19BV0RfVFIxX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIyX1JFR09GRlNFVCB8IEFEQ19BV0RfVFIzX1JFR09GRlNFVCkKKyNkZWZpbmUgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX1BPUyAgICAgICAgICAoQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUykgICAgIC8qIFBvc2l0aW9uIG9mIGJpdHMgQURDX1NRUnhfUkVHT0ZGU0VUIGluIEFEQ19BV0RfVFJYX1JFR09GRlNFVF9NQVNLICovCisjZGVmaW5lIEFEQ19BV0RfVFJYX0JJVF9ISUdIX01BU0sgICAgICAgICAgKDB4MDAwMTAwMDBVTCkgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIG9mIDEgYml0IHRvIGRpc2NyaW1pbmF0ZSB0aHJlc2hvbGQgaGlnaDogbWFzayBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfUE9TICAgICAgICAgICAoMTZVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gb2YgMSBiaXQgdG8gZGlzY3JpbWluYXRlIHRocmVzaG9sZCBoaWdoOiBwb3NpdGlvbiBvZiBiaXQgKi8KKyNkZWZpbmUgQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0ICAgICAgICAoQURDX0FXRF9UUlhfQklUX0hJR0hfUE9TIC0gNFVMKSAvKiBTaGlmdCBvZiBiaXQgQURDX0FXRF9UUlhfQklUX0hJR0ggdG8gcG9zaXRpb24gdG8gcGVyZm9ybSBhIHNoaWZ0IG9mIDQgcmFua3MgKi8KKworLyogSW50ZXJuYWwgbWFzayBmb3IgQURDIG9mZnNldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludGVybmFsIHJlZ2lzdGVyIG9mZnNldCBmb3IgQURDIG9mZnNldCBudW1iZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRENfT0ZSMV9SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpCisjZGVmaW5lIEFEQ19PRlIyX1JFR09GRlNFVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDFVTCkKKyNkZWZpbmUgQURDX09GUjNfUkVHT0ZGU0VUICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMlVMKQorI2RlZmluZSBBRENfT0ZSNF9SRUdPRkZTRVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzVUwpCisjZGVmaW5lIEFEQ19PRlJ4X1JFR09GRlNFVF9NQVNLICAgICAgICAgICAgKEFEQ19PRlIxX1JFR09GRlNFVCB8IEFEQ19PRlIyX1JFR09GRlNFVCB8IEFEQ19PRlIzX1JFR09GRlNFVCB8IEFEQ19PRlI0X1JFR09GRlNFVCkKKworCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjZGVmaW5lIEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TICAgICAgICAgKCAzVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gYml0ZmllbGQgIkFEQ19DRkdSX1JFUyIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NGR1JfQVdEMVNHTF9CSVRPRkZTRVRfUE9TICAgICAoMjJVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NGR1JfQVdEMVNHTCIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDX0NGR1JfQVdEMUVOX0JJVE9GRlNFVF9QT1MgICAgICAoMjNVTCkgLyogVmFsdWUgZXF1aXZhbGVudCB0byBiaXRmaWVsZCAiQURDX0NGR1JfQVdEMUVOIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfQ0ZHUl9KQVdEMUVOX0JJVE9GRlNFVF9QT1MgICAgICgyNFVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfQ0ZHUl9KQVdEMUVOIiBwb3NpdGlvbiBpbiByZWdpc3RlciAqLworI2RlZmluZSBBRENfVFIxX0hUMV9CSVRPRkZTRVRfUE9TICAgICAgICAgICgxNlVMKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIGJpdGZpZWxkICJBRENfVFIxX0hUMSIgcG9zaXRpb24gaW4gcmVnaXN0ZXIgKi8KKworCisvKiBBREMgcmVnaXN0ZXJzIGJpdHMgZ3JvdXBzICovCisjZGVmaW5lIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTICAgICAgICAgICAgKEFEQ19DUl9BRENBTCB8IEFEQ19DUl9KQURTVFAgfCBBRENfQ1JfQURTVFAgfCBBRENfQ1JfSkFEU1RBUlQgfCBBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9BRERJUyB8IEFEQ19DUl9BREVOKSAvKiBBREMgcmVnaXN0ZXIgQ1IgYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyI6IFNvZnR3YXJlIGNhbiByZWFkIGFzIHdlbGwgYXMgc2V0IHRoaXMgYml0LiBXcml0aW5nICcwJyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiaXQgdmFsdWUuICovCisKKworLyogQURDIGludGVybmFsIGNoYW5uZWxzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKy8qIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIFZyZWZJbnQgKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfQUREUiAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KikgKDB4MUZGRjc1QUFVTCkpIC8qIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBWUkVGSU5UOiBWcmVmSW50IEFEQyByYXcgZGF0YSBhY3F1aXJlZCBhdCB0ZW1wZXJhdHVyZSAzMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjYgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVlJFRklOVF9DQUxfVlJFRiAgICAgICAgICAgICAgICAgICAoMzYwMFVMKSAgICAgICAgICAgICAgICAgICAgIC8qIEFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAoVnJlZispIHZhbHVlIHdpdGggd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiAodG9sZXJhbmNlOiArLTEwIG1WKSAodW5pdDogbVYpLiAqLworLyogVGVtcGVyYXR1cmUgc2Vuc29yICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMV9BRERSICAgICAgICAgICAgICAgKCh1aW50MTZfdCopICgweDFGRkY3NUE4VUwpKSAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyV0IsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMCBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkZGNzVDQVVMKSkgLyogSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBhZGRyZXNzIG9mIHBhcmFtZXRlciBUU19DQUwyOiBPbiBTVE0zMldCLCB0ZW1wZXJhdHVyZSBzZW5zb3IgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDEzMCBEZWdDICh0b2xlcmFuY2U6ICstNSBEZWdDKSwgVnJlZisgPSAzLjAgViAodG9sZXJhbmNlOiArLTEwIG1WKS4gKi8KKyNkZWZpbmUgVEVNUFNFTlNPUl9DQUwxX1RFTVAgICAgICAgICAgICAgICAoMzBMKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgdGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiBmb3IgZGF0YSBpbnRvIFRFTVBTRU5TT1JfQ0FMMV9BRERSICh0b2xlcmFuY2U6ICstNSBEZWdDKSAodW5pdDogRGVnQykuICovCisjZGVmaW5lIFRFTVBTRU5TT1JfQ0FMMl9URU1QICAgICAgICAgICAgICAgKDEzMEwpICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDJfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HICAgICAgICAgICgzMDAwVUwpICAgICAgICAgICAgICAgICAgICAgLyogQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKCstMTAgbVYpICh1bml0OiBtVikuICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfUHJpdmF0ZV9NYWNyb3MgQURDIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEcml2ZXIgbWFjcm8gcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogc2V0IGEgcG9pbnRlciB0bworICAqICAgICAgICAgYSByZWdpc3RlciBmcm9tIGEgcmVnaXN0ZXIgYmFzaXMgZnJvbSB3aGljaCBhbiBvZmZzZXQKKyAgKiAgICAgICAgIGlzIGFwcGxpZWQuCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIGJhc2lzIGZyb20gd2hpY2ggdGhlIG9mZnNldCBpcyBhcHBsaWVkLgorICAqIEBwYXJhbSAgX19SRUdfT0ZGRlNFVF9fIE9mZnNldCB0byBiZSBhcHBsaWVkICh1bml0OiBudW1iZXIgb2YgcmVnaXN0ZXJzKS4KKyAgKiBAcmV0dmFsIFBvaW50ZXIgdG8gcmVnaXN0ZXIgYWRkcmVzcworICAqLworI2RlZmluZSBfX0FEQ19QVFJfUkVHX09GRlNFVChfX1JFR19fLCBfX1JFR19PRkZGU0VUX18pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSAoKHVpbnQzMl90KSgmKF9fUkVHX18pKSArICgoX19SRUdfT0ZGRlNFVF9fKSA8PCAyVUwpKSkpCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VTX0lOSVQgQURDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycworICAqICAgICAgICAgYW5kIG11bHRpbW9kZQorICAqICAgICAgICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29tbW9uSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgaW5zdGFuY2VzIHN0YXRlIChhbGwgQURDIGluc3RhbmNlcworICAqICAgICAgICAgc2hhcmluZyB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSBtdXN0IGJlCisgICogICAgICAgICBkaXNhYmxlZC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENvbW1vbkNsb2NrOyAgICAgICAgICAgICAgICAgLyohPCBTZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogQ2xvY2sgc291cmNlIGFuZCBwcmVzY2FsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19DT01NT05fQ0xPQ0tfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllLCBpZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdXNlZCwgc29tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sgcmF0aW8gY29uc3RyYWludHMgYmV0d2VlbiBBREMgY2xvY2sgYW5kIEFIQiBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNwZWN0ZWQuIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldENvbW1vbkNsb2NrKCkuICovCisKK30gTExfQURDX0NvbW1vbkluaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBpbnN0YW5jZS4KKyAgKiAgICAgICAgIEFmZmVjdHMgYm90aCBncm91cCByZWd1bGFyIGFuZCBncm91cCBpbmplY3RlZCAoYXZhaWxhYmlsaXR5CisgICogICAgICAgICBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0luc3RhbmNlIC4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSW5pdCgpCisgICogICAgICAgICBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY29uZGl0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIEFEQyBmZWF0dXJlcywgZm9yIGVmZmljaWVuY3kKKyAgKiAgICAgICAgIGFuZCBjb21wYXRpYmlsaXR5IG92ZXIgYWxsIFNUTTMyIGZhbWlsaWVzLiBIb3dldmVyLCB0aGUgZGlmZmVyZW50CisgICogICAgICAgICBmZWF0dXJlcyBjYW4gYmUgc2V0IHVuZGVyIGRpZmZlcmVudCBBREMgc3RhdGUgY29uZGl0aW9ucworICAqICAgICAgICAgKHNldHRpbmcgcG9zc2libGUgd2l0aCBBREMgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcsCisgICogICAgICAgICBBREMgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcsIC4uLikKKyAgKiAgICAgICAgIEVhY2ggZmVhdHVyZSBjYW4gYmUgdXBkYXRlZCBhZnRlcndhcmRzIHdpdGggYSB1bml0YXJ5IGZ1bmN0aW9uCisgICogICAgICAgICBhbmQgcG90ZW50aWFsbHkgd2l0aCBBREMgaW4gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiBkaXNhYmxlZCwKKyAgKiAgICAgICAgIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIGVhY2ggZnVuY3Rpb24gZm9yIHNldHRpbmcKKyAgKiAgICAgICAgIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFJlc29sdXRpb247ICAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIHJlc29sdXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRVNPTFVUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldFJlc29sdXRpb24oKS4gKi8KKworICB1aW50MzJfdCBEYXRhQWxpZ25tZW50OyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfREFUQV9BTElHTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXREYXRhQWxpZ25tZW50KCkuICovCisKKyAgdWludDMyX3QgTG93UG93ZXJNb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgbG93IHBvd2VyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19MUF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworCit9IExMX0FEQ19Jbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCByZWd1bGFyLgorICAqIEBub3RlICAgVGhlc2UgcGFyYW1ldGVycyBoYXZlIGFuIGltcGFjdCBvbiBBREMgc2NvcGU6IEFEQyBncm91cCByZWd1bGFyLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJSRUciKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6IGludGVybmFsIChTVyBzdGFydCkgb3IgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsICh0aW1lciBldmVudCwgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX1RSSUdHRVJfU09VUkNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIHRyaWdnZXIgc291cmNlIHRvIGV4dGVybmFsIHRyaWdnZXIgYWxzbyBzZXQgdHJpZ2dlciBwb2xhcml0eSB0byByaXNpbmcgZWRnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyIFNUTTMyIGZhbWlsaWVzIGhhdmluZyB0aGlzIHNldHRpbmcgc2V0IGJ5IEhXIGRlZmF1bHQgdmFsdWUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBuZWVkIHRvIG1vZGlmeSB0cmlnZ2VyIGVkZ2UsIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJMZW5ndGg7ICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfU0VRX1NDQU5fTEVOR1RICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoKS4gKi8KKworICB1aW50MzJfdCBTZXF1ZW5jZXJEaXNjb250OyAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6IHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQgbnVtYmVyIG9mIHJhbmtzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfUkVHX1NFUV9ESVNDT05UX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGhhcyBhbiBlZmZlY3Qgb25seSBpZiBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NhbiBsZW5ndGggb2YgMiByYW5rcyBvciBtb3JlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckRpc2NvbnQoKS4gKi8KKworICB1aW50MzJfdCBDb250aW51b3VzTW9kZTsgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhciwgd2hldGhlciBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBzaW5nbGUgbW9kZSAob25lIGNvbnZlcnNpb24gcGVyIHRyaWdnZXIpIG9yIGluIGNvbnRpbnVvdXMgbW9kZSAoYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZyBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgYXV0b21hdGljYWxseSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEFEQ19MTF9FQ19SRUdfQ09OVElOVU9VU19NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIHJlZ3VsYXIgY29udGludW91cyBtb2RlIGFuZCBkaXNjb250aW51b3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRDb250aW51b3VzTW9kZSgpLiAqLworCisgIHVpbnQzMl90IERNQVRyYW5zZmVyOyAgICAgICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhIHRyYW5zZmVyOiBubyB0cmFuc2ZlciBvciB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKCkuICovCisKKyAgdWludDMyX3QgT3ZlcnJ1bjsgICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX1JFR19PVlJfREFUQV9CRUhBVklPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0T3ZlcnJ1bigpLiAqLworCit9IExMX0FEQ19SRUdfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgU3RydWN0dXJlIGRlZmluaXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIGluamVjdGVkLgorICAqICAgICAgICAgUmVmZXIgdG8gY29ycmVzcG9uZGluZyB1bml0YXJ5IGZ1bmN0aW9ucyBpbnRvCisgICogICAgICAgICBAcmVmIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyCisgICogICAgICAgICAoZnVuY3Rpb25zIHdpdGggcHJlZml4ICJJTkoiKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMgYnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0luaXQoKQorICAqICAgICAgICAgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIGluc3RhbmNlIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBUaGlzIGNvbmRpdGlvbiBpcyBhcHBsaWVkIHRvIGFsbCBBREMgZmVhdHVyZXMsIGZvciBlZmZpY2llbmN5CisgICogICAgICAgICBhbmQgY29tcGF0aWJpbGl0eSBvdmVyIGFsbCBTVE0zMiBmYW1pbGllcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVudAorICAqICAgICAgICAgZmVhdHVyZXMgY2FuIGJlIHNldCB1bmRlciBkaWZmZXJlbnQgQURDIHN0YXRlIGNvbmRpdGlvbnMKKyAgKiAgICAgICAgIChzZXR0aW5nIHBvc3NpYmxlIHdpdGggQURDIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nLAorICAqICAgICAgICAgQURDIGVuYWJsZWQgd2l0aCBjb252ZXJzaW9uIG9uIGdvaW5nLCAuLi4pCisgICogICAgICAgICBFYWNoIGZlYXR1cmUgY2FuIGJlIHVwZGF0ZWQgYWZ0ZXJ3YXJkcyB3aXRoIGEgdW5pdGFyeSBmdW5jdGlvbgorICAqICAgICAgICAgYW5kIHBvdGVudGlhbGx5IHdpdGggQURDIGluIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gZGlzYWJsZWQsCisgICogICAgICAgICByZWZlciB0byBkZXNjcmlwdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGZvciBzZXR0aW5nCisgICogICAgICAgICBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUcmlnZ2VyU291cmNlOyAgICAgICAgICAgICAgIC8qITwgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOiBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXIgZXZlbnQsIGV4dGVybmFsIGludGVycnVwdCBsaW5lKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0lOSl9UUklHR0VSX1NPVVJDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyIGFsc28gc2V0IHRyaWdnZXIgcG9sYXJpdHkgdG8gcmlzaW5nIGVkZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHNldHRpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEFEQyBvbiBvdGhlciBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFRyaWdnZXJFZGdlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlKCkuICovCisKKyAgdWludDMyX3QgU2VxdWVuY2VyTGVuZ3RoOyAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQURDX0xMX0VDX0lOSl9TRVFfU0NBTl9MRU5HVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFNlcXVlbmNlckRpc2NvbnQ7ICAgICAgICAgICAgLyohPCBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGU6IHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQgbnVtYmVyIG9mIHJhbmtzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1NFUV9ESVNDT05UX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgcGFyYW1ldGVyIGhhcyBhbiBlZmZlY3Qgb25seSBpZiBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjYW4gbGVuZ3RoIG9mIDIgcmFua3Mgb3IgbW9yZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJEaXNjb250KCkuICovCisKKyAgdWludDMyX3QgVHJpZ0F1dG87ICAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyOiBpbmRlcGVuZGVudCBvciBmcm9tIEFEQyBncm91cCByZWd1bGFyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBBRENfTExfRUNfSU5KX1RSSUdfQVVUTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gc2V0IHRvIGluZGVwZW5kZW50IHRyaWdnZXIgaWYgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIGFuIGV4dGVybmFsIHRyaWdnZXIuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfU2V0VHJpZ0F1dG8oKS4gKi8KKworfSBMTF9BRENfSU5KX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEFEQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19GTEFHIEFEQyBmbGFncworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfQURDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfRkxBR19BRFJEWSAgICAgICAgICAgICAgICAgIEFEQ19JU1JfQURSRFkgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBpbnN0YW5jZSByZWFkeSAqLworI2RlZmluZSBMTF9BRENfRkxBR19FT0MgICAgICAgICAgICAgICAgICAgIEFEQ19JU1JfRU9DICAgICAgICAvKiE8IEFEQyBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfRU9TICAgICAgICAgICAgICAgICAgICBBRENfSVNSX0VPUyAgICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICBBRENfSVNSX09WUiAgICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0VPU01QICAgICAgICAgICAgICAgICAgQURDX0lTUl9FT1NNUCAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pFT0MgICAgICAgICAgICAgICAgICAgQURDX0lTUl9KRU9DICAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgTExfQURDX0ZMQUdfSkVPUyAgICAgICAgICAgICAgICAgICBBRENfSVNSX0pFT1MgICAgICAgLyohPCBBREMgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0pRT1ZGICAgICAgICAgICAgICAgICAgQURDX0lTUl9KUU9WRiAgICAgIC8qITwgQURDIGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG92ZXJmbG93ICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDEgICAgICAgICAgICAgICAgICAgQURDX0lTUl9BV0QxICAgICAgIC8qITwgQURDIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDIgICAgICAgICAgICAgICAgICAgQURDX0lTUl9BV0QyICAgICAgIC8qITwgQURDIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX0FEQ19GTEFHX0FXRDMgICAgICAgICAgICAgICAgICAgQURDX0lTUl9BV0QzICAgICAgIC8qITwgQURDIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JVCBBREMgaW50ZXJydXB0aW9ucyBmb3IgY29uZmlndXJhdGlvbiAoaW50ZXJydXB0aW9uIGVuYWJsZSBvciBkaXNhYmxlKQorICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfQURDX1JlYWRSZWcgYW5kICBMTF9BRENfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FEUkRZICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0FEUkRZSUUgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBpbnN0YW5jZSByZWFkeSAqLworI2RlZmluZSBMTF9BRENfSVRfRU9DICAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfRU9DSUUgICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiAqLworI2RlZmluZSBMTF9BRENfSVRfRU9TICAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfRU9TSUUgICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19JVF9PVlIgICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9PVlJJRSAgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuICovCisjZGVmaW5lIExMX0FEQ19JVF9FT1NNUCAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9FT1NNUElFICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcgcGhhc2UgKi8KKyNkZWZpbmUgTExfQURDX0lUX0pFT0MgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0pFT0NJRSAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uICovCisjZGVmaW5lIExMX0FEQ19JVF9KRU9TICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9KRU9TSUUgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisjZGVmaW5lIExMX0FEQ19JVF9KUU9WRiAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9KUU9WRklFICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTExfQURDX0lUX0FXRDEgICAgICAgICAgICAgICAgICAgICBBRENfSUVSX0FXRDFJRSAgICAgLyohPCBBREMgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSAqLworI2RlZmluZSBMTF9BRENfSVRfQVdEMiAgICAgICAgICAgICAgICAgICAgIEFEQ19JRVJfQVdEMklFICAgICAvKiE8IEFEQyBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyICovCisjZGVmaW5lIExMX0FEQ19JVF9BV0QzICAgICAgICAgICAgICAgICAgICAgQURDX0lFUl9BV0QzSUUgICAgIC8qITwgQURDIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR0lTVEVSUyAgQURDIHJlZ2lzdGVycyBjb21wbGlhbnQgd2l0aCBzcGVjaWZpYyBwdXJwb3NlCisgICogQHsKKyAgKi8KKy8qIExpc3Qgb2YgQURDIHJlZ2lzdGVycyBpbnRlbmRlZCB0byBiZSB1c2VkIChtb3N0IGNvbW1vbmx5KSB3aXRoICAgICAgICAgICAgICovCisvKiBETUEgdHJhbnNmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfRE1BX0dldFJlZ0FkZHIoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBICAgICAgICAgICgweDAwMDAwMDAwVUwpIC8qIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSByZWdpc3RlciAoY29ycmVzcG9uZGluZyB0byByZWdpc3RlciBEUikgdG8gYmUgdXNlZCB3aXRoIEFEQyBjb25maWd1cmVkIGluIGluZGVwZW5kZW50IG1vZGUuIFdpdGhvdXQgRE1BIHRyYW5zZmVyLCByZWdpc3RlciBhY2Nlc3NlZCBieSBMTCBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIoKSBhbmQgb3RoZXIgZnVuY3Rpb25zIEByZWYgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGF4KCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NPTU1PTl9DTE9DS19TT1VSQ0UgIEFEQyBjb21tb24gLSBDbG9jayBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEgICAgICAgIChBRENfQ0NSX0NLTU9ERV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVYyICAgICAgICAoQURDX0NDUl9DS01PREVfMSAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0ICAgICAgICAoQURDX0NDUl9DS01PREVfMSB8IEFEQ19DQ1JfQ0tNT0RFXzApICAgICAgICAgICAgICAgICAvKiE8IEFEQyBzeW5jaHJvbm91cyBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aG91dCBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjIgICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMiAgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVY0ICAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMSAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDQgICAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNiAgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzEgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA2ICAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjggICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgOCAgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMCAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMiAgICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDEwICAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTIgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzIgfCBBRENfQ0NSX1BSRVNDXzEgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSAxMiAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjE2ICAgICAgICAgICAoQURDX0NDUl9QUkVTQ18yIHwgQURDX0NDUl9QUkVTQ18xIHwgQURDX0NDUl9QUkVTQ18wKSAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTYgICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYzMiAgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDMyICAqLworI2RlZmluZSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNjQgICAgICAgICAgIChBRENfQ0NSX1BSRVNDXzMgfCBBRENfQ0NSX1BSRVNDXzApICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFzeW5jaHJvbm91cyBjbG9jayB3aXRoIHByZXNjYWxlciBkaXZpc2lvbiBieSA2NCAgKi8KKyNkZWZpbmUgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyOCAgICAgICAgICAoQURDX0NDUl9QUkVTQ18zIHwgQURDX0NDUl9QUkVTQ18xKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBhc3luY2hyb25vdXMgY2xvY2sgd2l0aCBwcmVzY2FsZXIgZGl2aXNpb24gYnkgMTI4ICovCisjZGVmaW5lIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYgICAgICAgICAgKEFEQ19DQ1JfUFJFU0NfMyB8IEFEQ19DQ1JfUFJFU0NfMSB8IEFEQ19DQ1JfUFJFU0NfMCkgLyohPCBBREMgYXN5bmNocm9ub3VzIGNsb2NrIHdpdGggcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ09NTU9OX1BBVEhfSU5URVJOQUwgIEFEQyBjb21tb24gLSBNZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWxzCisgICogQHsKKyAgKi8KKy8qIE5vdGU6IE90aGVyIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG1heSBiZSBhdmFpbGFibGUgICAgICAgICovCisvKiAgICAgICAoY29ubmVjdGlvbnMgdG8gb3RoZXIgcGVyaXBoZXJhbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSWYgdGhleSBhcmUgbm90IGxpc3RlZCBiZWxvdywgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgc3BlY2lmaWMgICAgICAgKi8KKy8qICAgICAgIHBhdGggZW5hYmxlLiBJbiB0aGlzIGNhc2UsIEFjY2VzcyB0byBtZWFzdXJlbWVudCBwYXRoIGlzIGRvbmUgICAgICAgICovCisvKiAgICAgICBvbmx5IGJ5IHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBBREMgaW50ZXJuYWwgY2hhbm5lbC4gICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aGVzIGFsbCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UICAgICAgIChBRENfQ0NSX1ZSRUZFTikgICAgICAgLyohPCBBREMgbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbCBjaGFubmVsIFZyZWZJbnQgKi8KKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUiAgICAoQURDX0NDUl9UU0VOKSAgICAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNkZWZpbmUgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCAgICAgICAgICAoQURDX0NDUl9WQkFURU4pICAgICAgIC8qITwgQURDIG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwgY2hhbm5lbCBWYmF0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRVNPTFVUSU9OICBBREMgaW5zdGFuY2UgLSBSZXNvbHV0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTJCICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyByZXNvbHV0aW9uIDEyIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fMTBCICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRVNfMCkgICAvKiE8IEFEQyByZXNvbHV0aW9uIDEwIGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fOEIgICAgICAgICAgICAgICAoQURDX0NGR1JfUkVTXzEgICAgICAgICAgICAgICAgICkgICAvKiE8IEFEQyByZXNvbHV0aW9uICA4IGJpdHMgKi8KKyNkZWZpbmUgTExfQURDX1JFU09MVVRJT05fNkIgICAgICAgICAgICAgICAoQURDX0NGR1JfUkVTXzEgfCBBRENfQ0ZHUl9SRVNfMCkgICAvKiE8IEFEQyByZXNvbHV0aW9uICA2IGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0RBVEFfQUxJR04gIEFEQyBpbnN0YW5jZSAtIERhdGEgYWxpZ25tZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0RBVEFfQUxJR05fUklHSFQgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQ6IHJpZ2h0IGFsaWduZWQgKGFsaWdubWVudCBvbiBkYXRhIHJlZ2lzdGVyIExTQiBiaXQgMCkqLworI2RlZmluZSBMTF9BRENfREFUQV9BTElHTl9MRUZUICAgICAgICAgICAgIChBRENfQ0ZHUl9BTElHTikgICAgICAgLyohPCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudDogbGVmdCBhbGlnbmVkIChhbGlnbWVudCBvbiBkYXRhIHJlZ2lzdGVyIE1TQiBiaXQgMTUpKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0xQX01PREUgIEFEQyBpbnN0YW5jZSAtIExvdyBwb3dlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0xQX01PREVfTk9ORSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIEFEQyBsb3cgcG93ZXIgbW9kZSBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgTExfQURDX0xQX0FVVE9XQUlUICAgICAgICAgICAgICAgICAoQURDX0NGR1JfQVVURExZKSAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBsb3cgcG93ZXIgbW9kZSBhdXRvIGRlbGF5OiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gbmVjZXNzYXJ5ICh3aGVuIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcmVhZCkuIFNlZSBkZXNjcmlwdGlvbiB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX1NldExvd1Bvd2VyTW9kZSgpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT0ZGU0VUX05CICBBREMgaW5zdGFuY2UgLSBPZmZzZXQgbnVtYmVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF8xICAgICAgICAgICAgICAgICAgICBBRENfT0ZSMV9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IG51bWJlciAxOiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisjZGVmaW5lIExMX0FEQ19PRkZTRVRfMiAgICAgICAgICAgICAgICAgICAgQURDX09GUjJfUkVHT0ZGU0VUIC8qITwgQURDIG9mZnNldCBudW1iZXIgMjogQURDIGNoYW5uZWwgYW5kIG9mZnNldCBsZXZlbCB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkIChpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGdyb3VwIGluamVjdGVkKSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUXzMgICAgICAgICAgICAgICAgICAgIEFEQ19PRlIzX1JFR09GRlNFVCAvKiE8IEFEQyBvZmZzZXQgbnVtYmVyIDM6IEFEQyBjaGFubmVsIGFuZCBvZmZzZXQgbGV2ZWwgdG8gd2hpY2ggdGhlIG9mZnNldCBwcm9ncmFtbWVkIHdpbGwgYmUgYXBwbGllZCAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCkgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF80ICAgICAgICAgICAgICAgICAgICBBRENfT0ZSNF9SRUdPRkZTRVQgLyohPCBBREMgb2Zmc2V0IG51bWJlciA0OiBBREMgY2hhbm5lbCBhbmQgb2Zmc2V0IGxldmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PRkZTRVRfU1RBVEUgQURDIGluc3RhbmNlIC0gT2Zmc2V0IHN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09GRlNFVF9ESVNBQkxFICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIG9mZnNldCBkaXNhYmxlZCAoYW1vbmcgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0KSAqLworI2RlZmluZSBMTF9BRENfT0ZGU0VUX0VOQUJMRSAgICAgICAgICAgICAgIChBRENfT0ZSMV9PRkZTRVQxX0VOKSAgLyohPCBBREMgb2Zmc2V0IGVuYWJsZWQgKGFtb25nIEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyIDEsIDIsIDMgb3IgNCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0dST1VQUyAgQURDIGluc3RhbmNlIC0gR3JvdXBzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0dST1VQX1JFR1VMQVIgICAgICAgICAgICAgICAoMHgwMDAwMDAwMVVMKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIChhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpICovCisjZGVmaW5lIExMX0FEQ19HUk9VUF9JTkpFQ1RFRCAgICAgICAgICAgICAgKDB4MDAwMDAwMDJVTCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgKG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGRldmljZXMpKi8KKyNkZWZpbmUgTExfQURDX0dST1VQX1JFR1VMQVJfSU5KRUNURUQgICAgICAoMHgwMDAwMDAwM1VMKSAvKiE8IEFEQyBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQ0hBTk5FTCAgQURDIGluc3RhbmNlIC0gQ2hhbm5lbCBudW1iZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8wICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8wX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8wX1NNUCAgfCBBRENfQ0hBTk5FTF8wX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4wICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8xX1NNUCAgfCBBRENfQ0hBTk5FTF8xX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8yX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8yX1NNUCAgfCBBRENfQ0hBTk5FTF8yX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4yICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8zX05VTUJFUiAgfCBBRENfQ0hBTk5FTF8zX1NNUCAgfCBBRENfQ0hBTk5FTF8zX0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4zICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF80X05VTUJFUiAgfCBBRENfQ0hBTk5FTF80X1NNUCAgfCBBRENfQ0hBTk5FTF80X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU40ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF81X05VTUJFUiAgfCBBRENfQ0hBTk5FTF81X1NNUCAgfCBBRENfQ0hBTk5FTF81X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU41ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF82X05VTUJFUiAgfCBBRENfQ0hBTk5FTF82X1NNUCAgfCBBRENfQ0hBTk5FTF82X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU42ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF83ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF83X05VTUJFUiAgfCBBRENfQ0hBTk5FTF83X1NNUCAgfCBBRENfQ0hBTk5FTF83X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU43ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF84ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF84X05VTUJFUiAgfCBBRENfQ0hBTk5FTF84X1NNUCAgfCBBRENfQ0hBTk5FTF84X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU44ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF85ICAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF85X05VTUJFUiAgfCBBRENfQ0hBTk5FTF85X1NNUCAgfCBBRENfQ0hBTk5FTF85X0JJVEZJRUxEICkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU45ICAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMF9TTVAgfCBBRENfQ0hBTk5FTF8xMF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMV9TTVAgfCBBRENfQ0hBTk5FTF8xMV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xMl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xMl9TTVAgfCBBRENfQ0hBTk5FTF8xMl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xMyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xM19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xM19TTVAgfCBBRENfQ0hBTk5FTF8xM19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNF9TTVAgfCBBRENfQ0hBTk5FTF8xNF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNSAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNV9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNV9TTVAgfCBBRENfQ0hBTk5FTF8xNV9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNiAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xNl9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xNl9TTVAgfCBBRENfQ0hBTk5FTF8xNl9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xNyAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xN19OVU1CRVIgfCBBRENfQ0hBTk5FTF8xN19TTVAgfCBBRENfQ0hBTk5FTF8xN19CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNyAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF8xOCAgICAgICAgICAgICAgICAgIChBRENfQ0hBTk5FTF8xOF9OVU1CRVIgfCBBRENfQ0hBTk5FTF8xOF9TTVAgfCBBRENfQ0hBTk5FTF8xOF9CSVRGSUVMRCkgLyohPCBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCAqLworI2RlZmluZSBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICAgICAgIChMTF9BRENfQ0hBTk5FTF8wICB8IEFEQ19DSEFOTkVMX0lEX0lOVEVSTkFMX0NIKSAgLyohPCBBREMgaW50ZXJuYWwgY2hhbm5lbCBjb25uZWN0ZWQgdG8gVnJlZkludDogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UuICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE3IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IuICovCisjZGVmaW5lIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAgICAgICAgKExMX0FEQ19DSEFOTkVMXzE4IHwgQURDX0NIQU5ORUxfSURfSU5URVJOQUxfQ0gpICAvKiE8IEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzI6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMiB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFZkZGEuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCByZWd1bGFyIC0gVHJpZ2dlciBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBpbnRlcm5hbDogU1cgc3RhcnQuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzAgfCBBRENfUkVHX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgIChBRENfQ0ZHUl9FWFRTRUxfMyB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgVFJHTzIuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEgICAgICAgKEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDIgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDIgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMgICAgICAgKEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBjaGFubmVsIDMgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPICAgICAgKEFEQ19DRkdSX0VYVFNFTF8zIHwgQURDX0NGR1JfRVhUU0VMXzEgfCBBRENfQ0ZHUl9FWFRTRUxfMCB8IEFEQ19SRUdfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyICAgICAgIChBRENfQ0ZHUl9FWFRTRUxfMSB8IEFEQ19DRkdSX0VYVFNFTF8wIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTIgY2hhbm5lbCAyIGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExICAgIChBRENfQ0ZHUl9FWFRTRUxfMiB8IEFEQ19DRkdSX0VYVFNFTF8xIHwgQURDX1JFR19UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IGV4dGVybmFsIGludGVycnVwdCBsaW5lIDExLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1RSSUdHRVJfRURHRSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBUcmlnZ2VyIGVkZ2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lORyAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRVhURU5fMCkgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19UUklHX0VYVF9GQUxMSU5HICAgICAgICAoQURDX0NGR1JfRVhURU5fMSAgICAgICAgICAgICAgICAgICApICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkgc2V0IHRvIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcgIChBRENfQ0ZHUl9FWFRFTl8xIHwgQURDX0NGR1JfRVhURU5fMCkgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19DT05USU5VT1VTX01PREUgIEFEQyBncm91cCByZWd1bGFyIC0gQ29udGludW91cyBtb2RlCisqIEB7CisqLworI2RlZmluZSBMTF9BRENfUkVHX0NPTlZfU0lOR0xFICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgIC8qITwgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgaW4gc2luZ2xlIG1vZGU6IG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyICovCisjZGVmaW5lIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTICAgICAgICAgKEFEQ19DRkdSX0NPTlQpICAgICAgICAgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBpbiBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX1JFR19ETUFfVFJBTlNGRVIgIEFEQyBncm91cCByZWd1bGFyIC0gRE1BIHRyYW5zZmVyIG9mIEFEQyBjb252ZXJzaW9uIGRhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgY29udmVyc2lvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCBieSBETUEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRCAgICAoICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BRU4pICAgIC8qITwgQURDIGNvbnZlcnNpb24gZGF0YSBhcmUgdHJhbnNmZXJyZWQgYnkgRE1BLCBpbiBsaW1pdGVkIG1vZGUgKG9uZSBzaG90IG1vZGUpOiBETUEgdHJhbnNmZXIgcmVxdWVzdHMgYXJlIHN0b3BwZWQgd2hlbiBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YgQURDIGNvbnZlcnNpb25zKSBpcyByZWFjaGVkLiBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBub24tY2lyY3VsYXIuICovCisjZGVmaW5lIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRCAgKEFEQ19DRkdSX0RNQUNGRyB8IEFEQ19DRkdSX0RNQUVOKSAgICAvKiE8IEFEQyBjb252ZXJzaW9uIGRhdGEgYXJlIHRyYW5zZmVycmVkIGJ5IERNQSwgaW4gdW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLCB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJyZWQgKG51bWJlciBvZiBBREMgY29udmVyc2lvbnMpLiBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4gKi8KKy8qKgorICAqIEB9CisgICovCisKKworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfT1ZSX0RBVEFfQkVIQVZJT1IgIEFEQyBncm91cCByZWd1bGFyIC0gT3ZlcnJ1biBiZWhhdmlvciBvbiBjb252ZXJzaW9uIGRhdGEKKyogQHsKKyovCisjZGVmaW5lIExMX0FEQ19SRUdfT1ZSX0RBVEFfUFJFU0VSVkVEICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAvKiE8IEFEQyBncm91cCByZWd1bGFyIGJlaGF2aW9yIGluIGNhc2Ugb2Ygb3ZlcnJ1bjogZGF0YSBwcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19PVlJfREFUQV9PVkVSV1JJVFRFTiAgICAoQURDX0NGR1JfT1ZSTU9EKSAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgYmVoYXZpb3IgaW4gY2FzZSBvZiBvdmVycnVuOiBkYXRhIG92ZXJ3cml0dGVuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX1NDQU5fTEVOR1RIICBBREMgZ3JvdXAgcmVndWxhciAtIFNlcXVlbmNlciBzY2FuIGxlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzYWJsZSAoZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOiBBREMgY29udmVyc2lvbiBvbiBvbmx5IDEgY2hhbm5lbCkgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCAyIHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU1FSMV9MXzEgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNCByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA1IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV82UkFOS1MgICggICAgICAgICAgICAgICBBRENfU1FSMV9MXzIgICAgICAgICAgICAgICAgfCBBRENfU1FSMV9MXzApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUyAgKCAgICAgICAgICAgICAgIEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggNyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTICAoICAgICAgICAgICAgICAgQURDX1NRUjFfTF8yIHwgQURDX1NRUjFfTF8xIHwgQURDX1NRUjFfTF8wKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBlbmFibGUgd2l0aCA4IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV85UkFOS1MgIChBRENfU1FSMV9MXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDkgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTAgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTEgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MgKEFEQ19TUVIxX0xfMyAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTMgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiAgICAgICAgICAgICAgICB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTQgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTUgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MgKEFEQ19TUVIxX0xfMyB8IEFEQ19TUVIxX0xfMiB8IEFEQ19TUVIxX0xfMSB8IEFEQ19TUVIxX0xfMCkgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMTYgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19SRUdfU0VRX0RJU0NPTlRfTU9ERSAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovCisjZGVmaW5lIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMlJBTktTICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0RJU0NOVU1fMCB8IEFEQ19DRkdSX0RJU0NFTikgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZWQgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgMiByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUyAgICAgICggICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDTlVNXzEgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgMyByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzRSQU5LUyAgICAgICggICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9ESVNDTlVNXzEgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNCByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUyAgICAgIChBRENfQ0ZHUl9ESVNDTlVNXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNSByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUyAgICAgIChBRENfQ0ZHUl9ESVNDTlVNXzIgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNiByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzdSQU5LUyAgICAgIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgICAgICAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgNyByYW5rcyAqLworI2RlZmluZSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUyAgICAgIChBRENfQ0ZHUl9ESVNDTlVNXzIgfCBBRENfQ0ZHUl9ESVNDTlVNXzEgfCBBRENfQ0ZHUl9ESVNDTlVNXzAgfCBBRENfQ0ZHUl9ESVNDRU4pIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBlbmFibGUgd2l0aCBzZXF1ZW5jZSBpbnRlcnJ1cHRpb24gZXZlcnkgOCByYW5rcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfUkVHX1NFUV9SQU5LUyAgQURDIGdyb3VwIHJlZ3VsYXIgLSBTZXF1ZW5jZXIgcmFua3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMSAgICAgICAgICAgICAgICAgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMV9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzIgICAgICAgICAgICAgICAgICAoQURDX1NRUjFfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzJfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAyICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18zICAgICAgICAgICAgICAgICAgKEFEQ19TUVIxX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18zX1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNCAgICAgICAgICAgICAgICAgIChBRENfU1FSMV9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfNF9TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzUgICAgICAgICAgICAgICAgICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzVfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA1ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS182ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS182X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgNiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfNyAgICAgICAgICAgICAgICAgIChBRENfU1FSMl9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfN19TUVJYX0JJVE9GRlNFVF9QT1MpICAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDcgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzggICAgICAgICAgICAgICAgICAoQURDX1NRUjJfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzhfU1FSWF9CSVRPRkZTRVRfUE9TKSAgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayA4ICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS185ICAgICAgICAgICAgICAgICAgKEFEQ19TUVIyX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS185X1NRUlhfQklUT0ZGU0VUX1BPUykgIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgOSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTAgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTBfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEwICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xMSAgICAgICAgICAgICAgICAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xMV9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTEgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzEyICAgICAgICAgICAgICAgICAoQURDX1NRUjNfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzEyX1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxMiAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTMgICAgICAgICAgICAgICAgIChBRENfU1FSM19SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTNfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDEzICovCisjZGVmaW5lIExMX0FEQ19SRUdfUkFOS18xNCAgICAgICAgICAgICAgICAgKEFEQ19TUVIzX1JFR09GRlNFVCB8IEFEQ19SRUdfUkFOS18xNF9TUVJYX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIHJhbmsgMTQgKi8KKyNkZWZpbmUgTExfQURDX1JFR19SQU5LXzE1ICAgICAgICAgICAgICAgICAoQURDX1NRUjRfUkVHT0ZGU0VUIHwgQURDX1JFR19SQU5LXzE1X1NRUlhfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgcmFuayAxNSAqLworI2RlZmluZSBMTF9BRENfUkVHX1JBTktfMTYgICAgICAgICAgICAgICAgIChBRENfU1FSNF9SRUdPRkZTRVQgfCBBRENfUkVHX1JBTktfMTZfU1FSWF9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciByYW5rIDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfVFJJR0dFUl9TT1VSQ0UgIEFEQyBncm91cCBpbmplY3RlZCAtIFRyaWdnZXIgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX1NPRlRXQVJFICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBpbnRlcm5hbDogU1cgc3RhcnQuLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTyAgICAgIChBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTzIgICAgIChBRENfSlNRUl9KRVhUU0VMXzMgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMSBUUkdPMi4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINCAgICAgICAoQURDX0pTUVJfSkVYVFNFTF8wIHwgQURDX0lOSl9UUklHX0VYVF9FREdFX0RFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWw6IFRJTTEgY2hhbm5lbCA0IGV2ZW50IChjYXB0dXJlIGNvbXBhcmU6IGlucHV0IGNhcHR1cmUgb3Igb3V0cHV0IGNhcHR1cmUpLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTyAgICAgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBUUkdPLiBUcmlnZ2VyIGVkZ2Ugc2V0IHRvIHJpc2luZyBlZGdlIChkZWZhdWx0IHNldHRpbmcpLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfQ0gxICAgICAgIChBRENfSlNRUl9KRVhUU0VMXzEgfCBBRENfSlNRUl9KRVhUU0VMXzAgfCBBRENfSU5KX1RSSUdfRVhUX0VER0VfREVGQVVMVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbDogVElNMiBjaGFubmVsIDEgZXZlbnQgKGNhcHR1cmUgY29tcGFyZTogaW5wdXQgY2FwdHVyZSBvciBvdXRwdXQgY2FwdHVyZSkuIFRyaWdnZXIgZWRnZSBzZXQgdG8gcmlzaW5nIGVkZ2UgKGRlZmF1bHQgc2V0dGluZykuICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUgICAgKEFEQ19KU1FSX0pFWFRTRUxfMiB8IEFEQ19KU1FSX0pFWFRTRUxfMSB8IEFEQ19JTkpfVFJJR19FWFRfRURHRV9ERUZBVUxUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgZnJvbSBleHRlcm5hbCBwZXJpcGhlcmFsOiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNS4gVHJpZ2dlciBlZGdlIHNldCB0byByaXNpbmcgZWRnZSAoZGVmYXVsdCBzZXR0aW5nKS4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9UUklHR0VSX0VER0UgIEFEQyBncm91cCBpbmplY3RlZCAtIFRyaWdnZXIgZWRnZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVEVOXzApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eSBzZXQgdG8gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9GQUxMSU5HICAgICAgICAoQURDX0pTUVJfSkVYVEVOXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkdGQUxMSU5HICAoQURDX0pTUVJfSkVYVEVOXzEgfCBBRENfSlNRUl9KRVhURU5fMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5IHNldCB0byBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1RSSUdfQVVUTyAgQURDIGdyb3VwIGluamVjdGVkIC0gQXV0b21hdGljIHRyaWdnZXIgbW9kZQorKiBAeworKi8KKyNkZWZpbmUgTExfQURDX0lOSl9UUklHX0lOREVQRU5ERU5UICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBpbmRlcGVuZGVudC4gU2V0dGluZyBtYW5kYXRvcnkgaWYgQURDIGdyb3VwIGluamVjdGVkIGluamVjdGVkIHRyaWdnZXIgc291cmNlIGlzIHNldCB0byBhbiBleHRlcm5hbCB0cmlnZ2VyLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1RSSUdfRlJPTV9HUlBfUkVHVUxBUiAgIChBRENfQ0ZHUl9KQVVUTykgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuIFNldHRpbmcgY29tcGxpYW50IG9ubHkgd2l0aCBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gU1cgc3RhcnQsIHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBvciBzdG9wOiBpbiB0aGlzIGNhc2UsIEFEQyBncm91cCBpbmplY3RlZCBpcyBjb250cm9sbGVkIG9ubHkgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0lOSl9DT05URVhUX1FVRVVFICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBDb250ZXh0IHF1ZXVlIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19MQVNUX0FDVElWRSAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qIEdyb3VwIGluamVjdGVkIHNlcXVlbmNlIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZCBhbmQgY2FuIGNvbnRhaW4gdXAgdG8gMiBjb250ZXh0cy4gV2hlbiBhbGwgY29udGV4dHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIHF1ZXVlIG1haW50YWlucyB0aGUgbGFzdCBjb250ZXh0IGFjdGl2ZSBwZXJwZXR1YWxseS4gKi8KKyNkZWZpbmUgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfRU5EX0VNUFRZICAgKEFEQ19DRkdSX0pRTSkgICAgICAgICAvKiBHcm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb250ZXh0IHF1ZXVlIGlzIGVuYWJsZWQgYW5kIGNhbiBjb250YWluIHVwIHRvIDIgY29udGV4dHMuIFdoZW4gYWxsIGNvbnRleHRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgaW5qZWN0ZWQgZ3JvdXAgdHJpZ2dlcnMgYXJlIGRpc2FibGVkLiAqLworI2RlZmluZSBMTF9BRENfSU5KX1FVRVVFX0RJU0FCTEUgICAgICAgICAgICAgICAoQURDX0NGR1JfSlFESVMpICAgICAgIC8qIEdyb3VwIGluamVjdGVkIHNlcXVlbmNlIGNvbnRleHQgcXVldWUgaXMgZGlzYWJsZWQ6IG9ubHkgMSBzZXF1ZW5jZSBjYW4gYmUgY29uZmlndXJlZCBhbmQgaXMgYWN0aXZlIHBlcnBldHVhbGx5LiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9TQ0FOX0xFTkdUSCAgQURDIGdyb3VwIGluamVjdGVkIC0gU2VxdWVuY2VyIHNjYW4gbGVuZ3RoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNhYmxlIChlcXVpdmFsZW50IHRvIHNlcXVlbmNlciBvZiAxIHJhbms6IEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsKSAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MgICggICAgICAgICAgICAgICAgQURDX0pTUVJfSkxfMCkgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGVuYWJsZSB3aXRoIDIgcmFua3MgaW4gdGhlIHNlcXVlbmNlICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUyAgKEFEQ19KU1FSX0pMXzEgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZW5hYmxlIHdpdGggMyByYW5rcyBpbiB0aGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTICAoQURDX0pTUVJfSkxfMSB8IEFEQ19KU1FSX0pMXzApIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBlbmFibGUgd2l0aCA0IHJhbmtzIGluIHRoZSBzZXF1ZW5jZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfSU5KX1NFUV9ESVNDT05UX01PREUgIEFEQyBncm91cCBpbmplY3RlZCAtIFNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSBkaXNhYmxlICovCisjZGVmaW5lIExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfMVJBTksgICAgICAgKEFEQ19DRkdSX0pESVNDRU4pICAgICAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlIGVuYWJsZSB3aXRoIHNlcXVlbmNlIGludGVycnVwdGlvbiBldmVyeSByYW5rICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19JTkpfU0VRX1JBTktTICBBREMgZ3JvdXAgaW5qZWN0ZWQgLSBTZXF1ZW5jZXIgcmFua3MKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfSU5KX1JBTktfMSAgICAgICAgICAgICAgICAgIChBRENfSkRSMV9SRUdPRkZTRVQgfCBBRENfSU5KX1JBTktfMV9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDEgKi8KKyNkZWZpbmUgTExfQURDX0lOSl9SQU5LXzIgICAgICAgICAgICAgICAgICAoQURDX0pEUjJfUkVHT0ZGU0VUIHwgQURDX0lOSl9SQU5LXzJfSlNRUl9CSVRPRkZTRVRfUE9TKSAvKiE8IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgcmFuayAyICovCisjZGVmaW5lIExMX0FEQ19JTkpfUkFOS18zICAgICAgICAgICAgICAgICAgKEFEQ19KRFIzX1JFR09GRlNFVCB8IEFEQ19JTkpfUkFOS18zX0pTUVJfQklUT0ZGU0VUX1BPUykgLyohPCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIHJhbmsgMyAqLworI2RlZmluZSBMTF9BRENfSU5KX1JBTktfNCAgICAgICAgICAgICAgICAgIChBRENfSkRSNF9SRUdPRkZTRVQgfCBBRENfSU5KX1JBTktfNF9KU1FSX0JJVE9GRlNFVF9QT1MpIC8qITwgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciByYW5rIDQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUxfU0FNUExJTkdUSU1FICBDaGFubmVsIC0gU2FtcGxpbmcgdGltZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMkNZQ0xFU181ICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyB0aW1lIDIuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfNkNZQ0xFU181ICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDYuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfMTJDWUNMRVNfNSAgICAgKCAgICAgICAgICAgICAgICAgICAgQURDX1NNUFIyX1NNUDEwXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTYW1wbGluZyB0aW1lIDEyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI0Q1lDTEVTXzUgICAgICggICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxMF8xIHwgQURDX1NNUFIyX1NNUDEwXzApIC8qITwgU2FtcGxpbmcgdGltZSAyNC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKyNkZWZpbmUgTExfQURDX1NBTVBMSU5HVElNRV80N0NZQ0xFU181ICAgICAoQURDX1NNUFIyX1NNUDEwXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IFNhbXBsaW5nIHRpbWUgNDcuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfOTJDWUNMRVNfNSAgICAgKEFEQ19TTVBSMl9TTVAxMF8yICAgICAgICAgICAgICAgICAgICAgfCBBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDkyLjUgQURDIGNsb2NrIGN5Y2xlcyAqLworI2RlZmluZSBMTF9BRENfU0FNUExJTkdUSU1FXzI0N0NZQ0xFU181ICAgIChBRENfU01QUjJfU01QMTBfMiB8IEFEQ19TTVBSMl9TTVAxMF8xICAgICAgICAgICAgICAgICAgICApIC8qITwgU2FtcGxpbmcgdGltZSAyNDcuNSBBREMgY2xvY2sgY3ljbGVzICovCisjZGVmaW5lIExMX0FEQ19TQU1QTElOR1RJTUVfNjQwQ1lDTEVTXzUgICAgKEFEQ19TTVBSMl9TTVAxMF8yIHwgQURDX1NNUFIyX1NNUDEwXzEgfCBBRENfU01QUjJfU01QMTBfMCkgLyohPCBTYW1wbGluZyB0aW1lIDY0MC41IEFEQyBjbG9jayBjeWNsZXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0NIQU5ORUxfU0lOR0xFX0RJRkZfRU5ESU5HICBDaGFubmVsIC0gU2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfU0lOR0xFX0VOREVEICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICBBRENfQ0FMRkFDVF9DQUxGQUNUX1MpICAgICAgICAgLyohPCBBREMgY2hhbm5lbCBlbmRpbmcgc2V0IHRvIHNpbmdsZSBlbmRlZCAobGl0ZXJhbCBhbHNvIHVzZWQgdG8gc2V0IGNhbGlicmF0aW9uIG1vZGUpICovCisjZGVmaW5lIExMX0FEQ19ESUZGRVJFTlRJQUxfRU5ERUQgICAgICAgICAgKEFEQ19DUl9BRENBTERJRiB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCkgICAgICAgICAvKiE8IEFEQyBjaGFubmVsIGVuZGluZyBzZXQgdG8gZGlmZmVyZW50aWFsIChsaXRlcmFsIGFsc28gdXNlZCB0byBzZXQgY2FsaWJyYXRpb24gbW9kZSkgKi8KKyNkZWZpbmUgTExfQURDX0JPVEhfU0lOR0xFX0RJRkZfRU5ERUQgICAgICAoTExfQURDX1NJTkdMRV9FTkRFRCB8IExMX0FEQ19ESUZGRVJFTlRJQUxfRU5ERUQpIC8qITwgQURDIGNoYW5uZWwgZW5kaW5nIHNldCB0byBib3RoIHNpbmdsZSBlbmRlZCBhbmQgZGlmZmVyZW50aWFsIChsaXRlcmFsIHVzZWQgb25seSB0byBzZXQgY2FsaWJyYXRpb24gZmFjdG9ycykgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0FXRF9OVU1CRVIgQW5hbG9nIHdhdGNoZG9nIC0gQW5hbG9nIHdhdGNoZG9nIG51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0QxICAgICAgICAgICAgICAgICAgICAgICAgKEFEQ19BV0RfQ1IxX0NIQU5ORUxfTUFTSyAgfCBBRENfQVdEX0NSMV9SRUdPRkZTRVQpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBudW1iZXIgMSAqLworI2RlZmluZSBMTF9BRENfQVdEMiAgICAgICAgICAgICAgICAgICAgICAgIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLIHwgQURDX0FXRF9DUjJfUkVHT0ZGU0VUKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyIDIgKi8KKyNkZWZpbmUgTExfQURDX0FXRDMgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSyB8IEFEQ19BV0RfQ1IzX1JFR09GRlNFVCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG51bWJlciAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19BV0RfQ0hBTk5FTFMgIEFuYWxvZyB3YXRjaGRvZyAtIE1vbml0b3JlZCBjaGFubmVscworICAqIEB7CisgICovCisjZGVmaW5lIExMX0FEQ19BV0RfRElTQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIGRpc2FibGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgIChBRENfQVdEX0NSMjNfQ0hBTk5FTF9NQVNLICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0pBV0QxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBhbGwgY2hhbm5lbHMsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkogICAgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0sgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIGFsbCBjaGFubmVscywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8wICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjAsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzEgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8yICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjIsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzIgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8zICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjMsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzMgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzMgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF80ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjQsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzQgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF81ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjUsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzUgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF82ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjYsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzYgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzYgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF83ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjcsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzcgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lONywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF84ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjgsIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzggICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF85ICAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjksIGNvbnZlcnRlZCBieSBncm91cCByZWd1bGFyIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoKExMX0FEQ19DSEFOTkVMXzkgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgY29udmVydGVkIGJ5IGdyb3VwIGluamVjdGVkIG9ubHkgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSiAgICAgICAoKExMX0FEQ19DSEFOTkVMXzkgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGV4dGVybmFsIGNoYW5uZWwgKGNoYW5uZWwgY29ubmVjdGVkIHRvIEdQSU8gcGluKSBBREN4X0lOOSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEwLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTAgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjExLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTEgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEyLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTIgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xMyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjEzLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTMgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xMywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE0LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTQgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNSAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE1LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTUgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNiAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE2LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTYgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNiwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xNyAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE3LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTcgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xNywgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spICAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE4LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF8xOCAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBHUElPIHBpbikgQURDeF9JTjE4LCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfMTggJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgbW9uaXRvcmluZyBvZiBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gR1BJTyBwaW4pIEFEQ3hfSU4xOCwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgcmVndWxhciBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9JTkogICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZyZWZJbnQ6IEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlLCBjb252ZXJ0ZWQgYnkgZ3JvdXAgaW5qZWN0ZWQgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSiAgICAgICgoTExfQURDX0NIQU5ORUxfVlJFRklOVCAgICAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiB8IEFEQ19DRkdSX0FXRDFFTiB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWcmVmSW50OiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcgICAgICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfSU5KICAgICAgICgoTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBUZW1wZXJhdHVyZSBzZW5zb3IsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUdfSU5KICAgKChMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFRlbXBlcmF0dXJlIHNlbnNvciwgY29udmVydGVkIGJ5IGVpdGhlciBncm91cCByZWd1bGFyIG9yIGluamVjdGVkICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcgICAgICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgVmRkYSwgY29udmVydGVkIGJ5IGdyb3VwIHJlZ3VsYXIgb25seSAqLworI2RlZmluZSBMTF9BRENfQVdEX0NIX1ZCQVRfSU5KICAgICAgICAgICAgICgoTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICAmIEFEQ19DSEFOTkVMX0lEX01BU0spIHwgQURDX0NGR1JfSkFXRDFFTiAgICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0FXRDFTR0wpIC8qITwgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yaW5nIG9mIEFEQyBpbnRlcm5hbCBjaGFubmVsIGNvbm5lY3RlZCB0byBWYmF0LzM6IFZiYXQgdm9sdGFnZSB0aHJvdWdoIGEgZGl2aWRlciBsYWRkZXIgb2YgZmFjdG9yIDEvMyB0byBoYXZlIFZiYXQgYWx3YXlzIGJlbG93IFZkZGEsIGNvbnZlcnRlZCBieSBncm91cCBpbmplY3RlZCBvbmx5ICovCisjZGVmaW5lIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUdfSU5KICAgICAgICAgKChMTF9BRENfQ0hBTk5FTF9WQkFUICAgICAgICAgICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3Jpbmcgb2YgQURDIGludGVybmFsIGNoYW5uZWwgY29ubmVjdGVkIHRvIFZiYXQvMzogVmJhdCB2b2x0YWdlIHRocm91Z2ggYSBkaXZpZGVyIGxhZGRlciBvZiBmYWN0b3IgMS8zIHRvIGhhdmUgVmJhdCBhbHdheXMgYmVsb3cgVmRkYSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfQVdEX1RIUkVTSE9MRFMgIEFuYWxvZyB3YXRjaGRvZyAtIFRocmVzaG9sZHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdIICAgICAgICAgIChBRENfVFIxX0hUMSAgICAgICAgICAgICAgKSAvKiE8IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERfTE9XICAgICAgICAgICAoICAgICAgICAgICAgICBBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBsb3cgKi8KKyNkZWZpbmUgTExfQURDX0FXRF9USFJFU0hPTERTX0hJR0hfTE9XICAgICAoQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSkgLyohPCBBREMgYW5hbG9nIHdhdGNoZG9nIGJvdGggdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgY29uY2F0ZW5hdGVkIGludG8gdGhlIHNhbWUgZGF0YSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX1NDT1BFICBPdmVyc2FtcGxpbmcgLSBPdmVyc2FtcGxpbmcgc2NvcGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BRENfT1ZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNhYmxlZC4gKi8KKyNkZWZpbmUgTExfQURDX09WU19HUlBfUkVHVUxBUl9DT05USU5VRUQgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX1JPVlNFKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuIElmIGdyb3VwIGluamVjdGVkIGludGVycnVwdHMgZ3JvdXAgcmVndWxhcjogd2hlbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLCB0aGUgb3ZlcnNhbXBsaW5nIG9uIEFEQyBncm91cCByZWd1bGFyIGlzIHRlbXBvcmFyeSBzdG9wcGVkIGFuZCBjb250aW51ZWQgYWZ0ZXJ3YXJkcy4gKi8KKyNkZWZpbmUgTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVEICAgICAoQURDX0NGR1IyX1JPVlNNIHwgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX1JPVlNFKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuIElmIGdyb3VwIGluamVjdGVkIGludGVycnVwdHMgZ3JvdXAgcmVndWxhcjogd2hlbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLCB0aGUgb3ZlcnNhbXBsaW5nIG9uIEFEQyBncm91cCByZWd1bGFyIGlzIHJlc3VtZWQgZnJvbSBzdGFydCAob3ZlcnNhbXBsZXIgYnVmZmVyIHJlc2V0KS4gKi8KKyNkZWZpbmUgTExfQURDX09WU19HUlBfSU5KRUNURUQgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX0pPVlNFICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgb24gY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIGluamVjdGVkLiAqLworI2RlZmluZSBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQgICAgICggICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU0UpIC8qITwgQURDIG92ZXJzYW1wbGluZyBvbiBjb252ZXJzaW9ucyBvZiBib3RoIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQuIElmIGdyb3VwIGluamVjdGVkIGludGVycnVwdGluZyBncm91cCByZWd1bGFyOiB3aGVuIEFEQyBncm91cCBpbmplY3RlZCBpcyB0cmlnZ2VyZWQsIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgcmVzdW1lZCBmcm9tIHN0YXJ0IChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX0RJU0NPTlRfTU9ERSAgT3ZlcnNhbXBsaW5nIC0gRGlzY29udGludW91cyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19SRUdfQ09OVCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbyBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikgKi8KKyNkZWZpbmUgTExfQURDX09WU19SRUdfRElTQ09OVCAgICAgICAgICAgICAoQURDX0NGR1IyX1RST1ZTKSAgICAgIC8qITwgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGU6IGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbyBuZWVkcyBhIHRyaWdnZXIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FQ19PVlNfUkFUSU8gIE92ZXJzYW1wbGluZyAtIFJhdGlvCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18yICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMiAoMiBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT180ICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgNCAoNCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT184ICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgOCAoOCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18xNiAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNSXzEgfCBBRENfQ0ZHUjJfT1ZTUl8wKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTYgKDE2IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1JBVElPXzMyICAgICAgICAgICAgICAgIChBRENfQ0ZHUjJfT1ZTUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyByYXRpbyBvZiAzMiAoMzIgQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fNjQgICAgICAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNSXzIgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDY0ICg2NCBBREMgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCwgc3VtIG9mIHRoZXNlIGNvbnZlcnNpb25zIGRhdGEgaXMgY29tcHV0ZWQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSAoYmVmb3JlIHBvdGVudGlhbCBzaGlmdCkgKi8KKyNkZWZpbmUgTExfQURDX09WU19SQVRJT18xMjggICAgICAgICAgICAgICAoQURDX0NGR1IyX09WU1JfMiB8IEFEQ19DRkdSMl9PVlNSXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gb2YgMTI4ICgxMjggQURDIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQsIHN1bSBvZiB0aGVzZSBjb252ZXJzaW9ucyBkYXRhIGlzIGNvbXB1dGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEgKGJlZm9yZSBwb3RlbnRpYWwgc2hpZnQpICovCisjZGVmaW5lIExMX0FEQ19PVlNfUkFUSU9fMjU2ICAgICAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNSXzIgfCBBRENfQ0ZHUjJfT1ZTUl8xIHwgQURDX0NGR1IyX09WU1JfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHJhdGlvIG9mIDI1NiAoMjU2IEFEQyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkLCBzdW0gb2YgdGhlc2UgY29udmVyc2lvbnMgZGF0YSBpcyBjb21wdXRlZCB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhIChiZWZvcmUgcG90ZW50aWFsIHNoaWZ0KSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUNfT1ZTX1NISUZUICBPdmVyc2FtcGxpbmcgLSBEYXRhIHNoaWZ0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9OT05FICAgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBBREMgb3ZlcnNhbXBsaW5nIG5vIHNoaWZ0IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIG5vdCBkaXZpZGVkIHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfMSAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiAxIChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgMiAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDQgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF8zICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18xIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDMgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSA4IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNCAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA0IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTYgdG8gcmVzdWx0IGFzIHRoZSBBREMgb3ZlcnNhbXBsaW5nIGNvbnZlcnNpb24gZGF0YSkgKi8KKyNkZWZpbmUgTExfQURDX09WU19TSElGVF9SSUdIVF81ICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTXzIgICAgICAgICAgICAgICAgICAgIHwgQURDX0NGR1IyX09WU1NfMCkgLyohPCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0IG9mIDUgKHN1bSBvZiB0aGUgQURDIGNvbnZlcnNpb25zIGRhdGEgaXMgZGl2aWRlZCBieSAzMiB0byByZXN1bHQgYXMgdGhlIEFEQyBvdmVyc2FtcGxpbmcgY29udmVyc2lvbiBkYXRhKSAqLworI2RlZmluZSBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1NfMiB8IEFEQ19DRkdSMl9PVlNTXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IEFEQyBvdmVyc2FtcGxpbmcgc2hpZnQgb2YgNiAoc3VtIG9mIHRoZSBBREMgY29udmVyc2lvbnMgZGF0YSBpcyBkaXZpZGVkIGJ5IDY0IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfNyAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTU18yIHwgQURDX0NGR1IyX09WU1NfMSB8IEFEQ19DRkdSMl9PVlNTXzApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA3IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMTI4IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisjZGVmaW5lIExMX0FEQ19PVlNfU0hJRlRfUklHSFRfOCAgICAgICAgICAgKEFEQ19DRkdSMl9PVlNTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgQURDIG92ZXJzYW1wbGluZyBzaGlmdCBvZiA4IChzdW0gb2YgdGhlIEFEQyBjb252ZXJzaW9ucyBkYXRhIGlzIGRpdmlkZWQgYnkgMjU2IHRvIHJlc3VsdCBhcyB0aGUgQURDIG92ZXJzYW1wbGluZyBjb252ZXJzaW9uIGRhdGEpICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VDX0hXX0RFTEFZUyAgRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsCisgICogICAgICAgICBub3QgdGltZW91dCB2YWx1ZXMuCisgICogICAgICAgICBGb3IgZGV0YWlscyBvbiBkZWxheXMgdmFsdWVzLCByZWZlciB0byBkZXNjcmlwdGlvbnMgaW4gc291cmNlIGNvZGUKKyAgKiAgICAgICAgIGFib3ZlIGVhY2ggbGl0ZXJhbCBkZWZpbml0aW9uLgorICAqIEB7CisgICovCisgIAorLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBJbmRpY2F0aW9ucyBmb3IgZXN0aW1hdGlvbiBvZiBBREMgdGltZW91dCBkZWxheXMsIGZvciB0aGlzICAgICAgICAgICAqLworLyogICAgICAgU1RNMzIgc2VyaWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIC0gQURDIGNhbGlicmF0aW9uIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMTEyL2ZBREMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgInRDQUwiKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgLSBBREMgZW5hYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgaXMgMSBjb252ZXJzaW9uIGN5Y2xlLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsIHBhcmFtZXRlciAidFNUQUIiKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBkaXNhYmxlIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayBjeWNsZXMgICAqLworLyogICAgICAgLSBBREMgc3RvcCBjb252ZXJzaW9uIHRpbWU6IG1heGltdW0gZGVsYXkgc2hvdWxkIGJlIGEgZmV3IEFEQyBjbG9jayAgKi8KKy8qICAgICAgICAgY3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAtIEFEQyBjb252ZXJzaW9uIHRpbWU6IGR1cmF0aW9uIGRlcGVuZGluZyBvbiBBREMgY2xvY2sgYW5kIEFEQyAgICAgICAqLworLyogICAgICAgICBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKHJlZmVyIHRvIGRldmljZSByZWZlcmVuY2UgbWFudWFsLCBzZWN0aW9uICJUaW1pbmciKSAgICAgICAgICAgICAgICovCisKKy8qIERlbGF5IGZvciBBREMgc3RhYmlsaXphdGlvbiB0aW1lIChBREMgdm9sdGFnZSByZWd1bGF0b3Igc3RhcnQtdXAgdGltZSkgICAgICovCisvKiBEZWxheSBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0QURDVlJFR19TVFVQIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0FEQ19ERUxBWV9JTlRFUk5BTF9SRUdVTF9TVEFCX1VTICggMTBVTCkgIC8qITwgRGVsYXkgZm9yIEFEQyBzdGFiaWxpemF0aW9uIHRpbWUgKEFEQyB2b2x0YWdlIHJlZ3VsYXRvciBzdGFydC11cCB0aW1lKSAqLworCisvKiBEZWxheSBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2Ugc3RhYmlsaXphdGlvbiB0aW1lLiAgICAgICAgICAgICAgICAgICAqLworLyogRGVsYXkgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidHN0YXJ0X3ZyZWZpbnQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTICAgICAgICggMTJVTCkgIC8qITwgRGVsYXkgZm9yIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTICAgICgxMjBVTCkgIC8qITwgRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKworLyogRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGEgbWluaW11bSBudW1iZXIgb2YgQURDIGNsb2NrIGN5Y2xlcyAgICAgICAgICAgICovCisvKiAgICAgICBhcmUgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlLiAgICAgICAgICAqLworLyogICAgICAgV2FpdCB0aW1lIGNhbiBiZSBjb21wdXRlZCBpbiB1c2VyIGFwcGxpY2F0aW9uIGJ5IHdhaXRpbmcgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgIGVxdWl2YWxlbnQgbnVtYmVyIG9mIENQVSBjeWNsZXMsIGJ5IHRha2luZyBpbnRvIGFjY291bnQgICAgICAgICAgICAgICovCisvKiAgICAgICByYXRpbyBvZiBDUFUgY2xvY2sgdmVyc3VzIEFEQyBjbG9jayBwcmVzY2FsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQURDX0RFTEFZX0NBTElCX0VOQUJMRV9BRENfQ1lDTEVTICggIDRVTCkgIC8qITwgRGVsYXkgcmVxdWlyZWQgYmV0d2VlbiBBREMgZW5kIG9mIGNhbGlicmF0aW9uIGFuZCBBREMgZW5hYmxlICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0V4cG9ydGVkX01hY3JvcyBBREMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gd3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBBREMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBBREMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0FEQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEFEQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEFEQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9BRENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VNX0hFTFBFUl9NQUNSTyBBREMgaGVscGVyIG1hY3JvCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdAorICAqICAgICAgICAgZnJvbSBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LgorICAqIEBub3RlICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKExMX0FEQ19DSEFOTkVMXzQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGRlY2ltYWwgbnVtYmVyICI0Ii4KKyAgKiBAbm90ZSAgIFRoZSBpbnB1dCBjYW4gYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwKKyAgKiAgICAgICAgIG51bWJlciBpcyByZXR1cm5lZCwgZWl0aGVyIGRlZmluZWQgd2l0aCBudW1iZXIKKyAgKiAgICAgICAgIG9yIHdpdGggYml0ZmllbGQgKG9ubHkgb25lIGJpdCBtdXN0IGJlIHNldCkuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTE4CisgICovCisjZGVmaW5lIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihfX0NIQU5ORUxfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfQklURklFTERfTUFTSykgPT0gMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA/ICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoKF9fQ0hBTk5FTF9fKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZ2V0IEFEQyBjaGFubmVsIGluIGxpdGVyYWwgZm9ybWF0IExMX0FEQ19DSEFOTkVMX3gKKyAgKiAgICAgICAgIGZyb20gbnVtYmVyIGluIGRlY2ltYWwgZm9ybWF0LgorICAqIEBub3RlICAgRXhhbXBsZToKKyAgKiAgICAgICAgICAgX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKDQpCisgICogICAgICAgICAgIHdpbGwgcmV0dXJuIGEgZGF0YSBlcXVpdmFsZW50IHRvICJMTF9BRENfQ0hBTk5FTF80Ii4KKyAgKiBAcGFyYW0gIF9fREVDSU1BTF9OQl9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MTgKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS5cbgorICAqICAgICAgICAgKDQpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCisjZGVmaW5lIF9fTExfQURDX0RFQ0lNQUxfTkJfVE9fQ0hBTk5FTChfX0RFQ0lNQUxfTkJfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19ERUNJTUFMX05CX18pIDw9IDlVTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFwKKyAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoX19ERUNJTUFMX05CX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgXAorICAgICAgIChBRENfU01QUjFfUkVHT0ZGU0VUIHwgKCgoM1VMICogKF9fREVDSU1BTF9OQl9fKSkpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKChfX0RFQ0lNQUxfTkJfXykgPDwgQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoX19ERUNJTUFMX05CX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgIChBRENfU01QUjJfUkVHT0ZGU0VUIHwgKCgoM1VMICogKChfX0RFQ0lNQUxfTkJfXykgLSAxMFVMKSkpIDw8IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2hhbm5lbAorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gbGl0ZXJhbCBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQG5vdGUgICBUaGUgZGlmZmVyZW50IGxpdGVyYWwgZGVmaW5pdGlvbnMgb2YgQURDIGNoYW5uZWxzIGFyZToKKyAgKiAgICAgICAgIC0gQURDIGludGVybmFsIGNoYW5uZWw6CisgICogICAgICAgICAgIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLgorICAqICAgICAgICAgLSBBREMgZXh0ZXJuYWwgY2hhbm5lbCAoY2hhbm5lbCBjb25uZWN0ZWQgdG8gYSBHUElPIHBpbik6CisgICogICAgICAgICAgIExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLgorICAqIEBub3RlICAgVGhlIGNoYW5uZWwgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBkZWZpbmVkIGZyb20gbGl0ZXJhbAorICAqICAgICAgICAgZGVmaW5pdGlvbiBvZiBhIEFEQyBpbnRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF9WUkVGSU5ULAorICAqICAgICAgICAgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiwgLi4uKSwKKyAgKiAgICAgICAgIEFEQyBleHRlcm5hbCBjaGFubmVsIChMTF9BRENfQ0hBTk5FTF8xLCBMTF9BRENfQ0hBTk5FTF8yLCAuLi4pLAorICAqICAgICAgICAgbXVzdCBub3QgYmUgYSB2YWx1ZSBmcm9tIGZ1bmN0aW9ucyB3aGVyZSBhIGNoYW5uZWwgbnVtYmVyIGlzCisgICogICAgICAgICByZXR1cm5lZCBmcm9tIEFEQyByZWdpc3RlcnMsCisgICogICAgICAgICBiZWNhdXNlIGludGVybmFsIGFuZCBleHRlcm5hbCBjaGFubmVscyBzaGFyZSB0aGUgc2FtZSBjaGFubmVsCisgICogICAgICAgICBudW1iZXIgaW4gQURDIHJlZ2lzdGVycy4gVGhlIGRpZmZlcmVudGlhdGlvbiBpcyBtYWRlIG9ubHkgd2l0aAorICAqICAgICAgICAgcGFyYW1ldGVycyBkZWZpbml0aW9ucyBvZiBkcml2ZXIuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGNoYW5uZWwgY29ycmVzcG9uZHMgdG8gYSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsIChjaGFubmVsIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluKS4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiB0aGUgY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIHBhcmFtZXRlciBkZWZpbml0aW9uIG9mIGEgQURDIGludGVybmFsIGNoYW5uZWwuCisgICovCisjZGVmaW5lIF9fTExfQURDX0lTX0NIQU5ORUxfSU5URVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKSAhPSAwVUwpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgYSBjaGFubmVsIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICB0byBpdHMgZXF1aXZhbGVudCBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZiBhIEFEQyBleHRlcm5hbCBjaGFubmVsCisgICogICAgICAgICAoTExfQURDX0NIQU5ORUxfMSwgTExfQURDX0NIQU5ORUxfMiwgLi4uKS4KKyAgKiBAbm90ZSAgIFRoZSBjaGFubmVsIHBhcmFtZXRlciBjYW4gYmUsIGFkZGl0aW9uYWxseSB0byBhIHZhbHVlCisgICogICAgICAgICBkZWZpbmVkIGZyb20gcGFyYW1ldGVyIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgKExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQsIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcyByZXR1cm5lZAorICAqICAgICAgICAgZnJvbSBBREMgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICovCisjZGVmaW5lIF9fTExfQURDX0NIQU5ORUxfSU5URVJOQUxfVE9fRVhURVJOQUwoX19DSEFOTkVMX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQ0hBTk5FTF9fKSAmIH5BRENfQ0hBTk5FTF9JRF9JTlRFUk5BTF9DSF9NQVNLKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaW50ZXJuYWwgY2hhbm5lbAorICAqICAgICAgICAgc2VsZWN0ZWQgaXMgYXZhaWxhYmxlIG9uIHRoZSBBREMgaW5zdGFuY2Ugc2VsZWN0ZWQuCisgICogQG5vdGUgICBUaGUgY2hhbm5lbCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIGRlZmluaXRpb24gb2YgYSBBREMgaW50ZXJuYWwgY2hhbm5lbCAoTExfQURDX0NIQU5ORUxfVlJFRklOVCwKKyAgKiAgICAgICAgIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IsIC4uLiksCisgICogICAgICAgICBtdXN0IG5vdCBiZSBhIHZhbHVlIGRlZmluZWQgZnJvbSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBvZgorICAqICAgICAgICAgQURDIGV4dGVybmFsIGNoYW5uZWwgKExMX0FEQ19DSEFOTkVMXzEsIExMX0FEQ19DSEFOTkVMXzIsIC4uLikKKyAgKiAgICAgICAgIG9yIGEgdmFsdWUgZnJvbSBmdW5jdGlvbnMgd2hlcmUgYSBjaGFubmVsIG51bWJlciBpcworICAqICAgICAgICAgcmV0dXJuZWQgZnJvbSBBREMgcmVnaXN0ZXJzLAorICAqICAgICAgICAgYmVjYXVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgY2hhbm5lbAorICAqICAgICAgICAgbnVtYmVyIGluIEFEQyByZWdpc3RlcnMuIFRoZSBkaWZmZXJlbnRpYXRpb24gaXMgbWFkZSBvbmx5IHdpdGgKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnMgb2YgZHJpdmVyLgorICAqIEBwYXJhbSAgX19BRENfSU5TVEFOQ0VfXyBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdGhlIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRoZSBpbnRlcm5hbCBjaGFubmVsIHNlbGVjdGVkIGlzIGF2YWlsYWJsZSBvbiB0aGUgQURDIGluc3RhbmNlIHNlbGVjdGVkLgorICAqLworI2RlZmluZSBfX0xMX0FEQ19JU19DSEFOTkVMX0lOVEVSTkFMX0FWQUlMQUJMRShfX0FEQ19JTlNUQU5DRV9fLCBfX0NIQU5ORUxfXykgIFwKKyAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChfX0NIQU5ORUxfXykgPT0gTExfQURDX0NIQU5ORUxfVlJFRklOVCkgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoX19DSEFOTkVMX18pID09IExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9BRENfQ0hBTk5FTF9WQkFUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIEFEQyBhbmFsb2cgd2F0Y2hkb2cgcGFyYW1ldGVyOgorICAqICAgICAgICAgZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvciB3aXRoIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBhbmQgZ3JvdXBzIGRlZmluaXRpb24uCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKCkuCisgICogICAgICAgICBFeGFtcGxlOgorICAqICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKAorICAqICAgICAgICAgICAgIEFEQzEsIExMX0FEQ19BV0QxLAorICAqICAgICAgICAgICAgIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoTExfQURDX0NIQU5ORUw0LCBMTF9BRENfR1JPVVBfUkVHVUxBUikpCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuXG4KKyAgKiAgICAgICAgICg0KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqIEBwYXJhbSAgX19HUk9VUF9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0dST1VQX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfSU5KRUNURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUcgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX0lOSiAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX1JFRyAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfSU5KICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX1JFRyAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfSU5KICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX1JFRyAgICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfSU5KICAgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUdfSU5KCisgICogICAgICAgICAKKyAgKiAgICAgICAgICgwKSBPbiBTVE0zMldCLCBwYXJhbWV0ZXIgYXZhaWxhYmxlIG9ubHkgb24gYW5hbG9nIHdhdGNoZG9nIG51bWJlcjogQVdEMS4KKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfQ0hBTk5FTF9HUk9VUChfX0NIQU5ORUxfXywgX19HUk9VUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX1JFR1VMQVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKF9fR1JPVVBfXykgPT0gTExfQURDX0dST1VQX0lOSkVDVEVEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gKCgoX19DSEFOTkVMX18pICYgQURDX0NIQU5ORUxfSURfTUFTSykgfCBBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoKChfX0NIQU5ORUxfXykgJiBBRENfQ0hBTk5FTF9JRF9NQVNLKSB8IEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4gfCBBRENfQ0ZHUl9BV0QxU0dMKSAgXAorICApCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgdmFsdWUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGluIGZ1bmN0aW9uIG9mIEFEQyByZXNvbHV0aW9uLCB3aGVuIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICBkaWZmZXJlbnQgb2YgMTIgYml0cy4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKQorICAqICAgICAgICAgb3IgQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogICAgICAgICBFeGFtcGxlLCB3aXRoIGEgQURDIHJlc29sdXRpb24gb2YgOCBiaXRzLCB0byBzZXQgdGhlIHZhbHVlIG9mCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggKG9uIDggYml0cyk6CisgICogICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMKKyAgKiAgICAgICAgICAgICg8IEFEQ3ggcGFyYW0gPiwKKyAgKiAgICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oTExfQURDX1JFU09MVVRJT05fOEIsIDx0aHJlc2hvbGRfdmFsdWVfOF9iaXRzPikKKyAgKiAgICAgICAgICAgICk7CisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERfXyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKF9fQURDX1JFU09MVVRJT05fXywgX19BV0RfVEhSRVNIT0xEX18pIFwKKyAgKChfX0FXRF9USFJFU0hPTERfXykgPDwgKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVICkpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBnZXQgdGhlIHZhbHVlIG9mIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2gKKyAgKiAgICAgICAgIG9yIGxvdyBpbiBmdW5jdGlvbiBvZiBBREMgcmVzb2x1dGlvbiwgd2hlbiBBREMgcmVzb2x1dGlvbiBpcyAKKyAgKiAgICAgICAgIGRpZmZlcmVudCBvZiAxMiBiaXRzLgorICAqIEBub3RlICAgVG8gYmUgdXNlZCB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkcygpLgorICAqICAgICAgICAgRXhhbXBsZSwgd2l0aCBhIEFEQyByZXNvbHV0aW9uIG9mIDggYml0cywgdG8gZ2V0IHRoZSB2YWx1ZSBvZgorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCBoaWdoIChvbiA4IGJpdHMpOgorICAqICAgICAgICAgICA8IHRocmVzaG9sZF92YWx1ZV82X2JpdHMgPiA9IF9fTExfQURDX0FOQUxPR1dEX0dFVF9USFJFU0hPTERfUkVTT0xVVElPTgorICAqICAgICAgICAgICAgKExMX0FEQ19SRVNPTFVUSU9OXzhCLAorICAqICAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoPEFEQ3ggcGFyYW0+LCBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdIKQorICAqICAgICAgICAgICAgKTsKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4RkZGCisgICovCisjZGVmaW5lIF9fTExfQURDX0FOQUxPR1dEX0dFVF9USFJFU0hPTERfUkVTT0xVVElPTihfX0FEQ19SRVNPTFVUSU9OX18sIF9fQVdEX1RIUkVTSE9MRF8xMl9CSVRTX18pIFwKKyAgKChfX0FXRF9USFJFU0hPTERfMTJfQklUU19fKSA+PiAoKF9fQURDX1JFU09MVVRJT05fXykgPj4gKEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIC0gMVUgKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGdldCB0aGUgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGQgaGlnaAorICAqICAgICAgICAgb3IgbG93IGZyb20gcmF3IHZhbHVlIGNvbnRhaW5pbmcgYm90aCB0aHJlc2hvbGRzIGNvbmNhdGVuYXRlZC4KKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHRvIGdldCBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIGhpZ2ggZnJvbSB0aGUgcmVnaXN0ZXIgcmF3IHZhbHVlOgorICAqICAgICAgICAgICBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKExMX0FEQ19BV0RfVEhSRVNIT0xEX0hJR0gsIDxyYXdfdmFsdWVfd2l0aF9ib3RoX3RocmVzaG9sZHM+KTsKKyAgKiBAcGFyYW0gIF9fQVdEX1RIUkVTSE9MRF9UWVBFX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogQHBhcmFtICBfX0FXRF9USFJFU0hPTERTX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworI2RlZmluZSBfX0xMX0FEQ19BTkFMT0dXRF9USFJFU0hPTERTX0hJR0hfTE9XKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18sIF9fQVdEX1RIUkVTSE9MRFNfXykgICAgICAgXAorICAoKChfX0FXRF9USFJFU0hPTERTX18pID4+ICgoKF9fQVdEX1RIUkVTSE9MRF9UWVBFX18pICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4gQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSkgJiBMTF9BRENfQVdEX1RIUkVTSE9MRF9MT1cpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNldCB0aGUgQURDIGNhbGlicmF0aW9uIHZhbHVlIHdpdGggYm90aCBzaW5nbGUgZW5kZWQKKyAgKiAgICAgICAgIGFuZCBkaWZmZXJlbnRpYWwgbW9kZXMgY2FsaWJyYXRpb24gZmFjdG9ycyBjb25jYXRlbmF0ZWQuCisgICogQG5vdGUgICBUbyBiZSB1c2VkIHdpdGggZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoKS4KKyAgKiAgICAgICAgIEV4YW1wbGUsIHRvIHNldCBjYWxpYnJhdGlvbiBmYWN0b3JzIHNpbmdsZSBlbmRlZCB0byAweDU1CisgICogICAgICAgICBhbmQgZGlmZmVyZW50aWFsIGVuZGVkIHRvIDB4MkE6CisgICogICAgICAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcigKKyAgKiAgICAgICAgICAgICBBREMxLAorICAqICAgICAgICAgICAgIF9fTExfQURDX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRElGRigweDU1LCAweDJBKSkKKyAgKiBAcGFyYW0gIF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RgorICAqIEBwYXJhbSAgX19DQUxJQl9GQUNUT1JfRElGRkVSRU5USUFMX18gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMSUJfRkFDVE9SX1NJTkdMRV9ESUZGKF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fLCBfX0NBTElCX0ZBQ1RPUl9ESUZGRVJFTlRJQUxfXykgICAgICAgIFwKKyAgKCgoX19DQUxJQl9GQUNUT1JfRElGRkVSRU5USUFMX18pIDw8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfRF9Qb3MpIHwgKF9fQ0FMSUJfRkFDVE9SX1NJTkdMRV9FTkRFRF9fKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gc2VsZWN0IHRoZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICB0byB3aGljaCBpcyBiZWxvbmdpbmcgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFEQyBjb21tb24gcmVnaXN0ZXIgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yOgorICAqICAgICAgICAgLSBTZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBBREMgaW5zdGFuY2VzCisgICogICAgICAgICAtIE11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMpCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIF9fQURDeF9fIEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgQURDIGNvbW1vbiByZWdpc3RlciBpbnN0YW5jZQorICAqLworI2lmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKSAmJiBkZWZpbmVkKEFEQzMpCisjZGVmaW5lIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDMTIzX0NPTU1PTikKKyNlbGlmIGRlZmluZWQoQURDMSkgJiYgZGVmaW5lZChBREMyKQorI2RlZmluZSBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoX19BREN4X18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEFEQzEyX0NPTU1PTikKKyNlbHNlCisjZGVmaW5lIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShfX0FEQ3hfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQURDMV9DT01NT04pCisjZW5kaWYKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2hlY2sgaWYgYWxsIEFEQyBpbnN0YW5jZXMgc2hhcmluZyB0aGUgc2FtZQorICAqICAgICAgICAgQURDIGNvbW1vbiBpbnN0YW5jZSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJ5IGZ1bmN0aW9ucyB3aXRoIHNldHRpbmcgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJBREN4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIE9uIGRldmljZXMgd2l0aCBvbmx5IDEgQURDIGNvbW1vbiBpbnN0YW5jZSwgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8KKyAgKiAgICAgICAgIGlzIHVzZWxlc3MgYW5kIGNhbiBiZSBpZ25vcmVkIChwYXJhbWV0ZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eQorICAqICAgICAgICAgd2l0aCBkZXZpY2VzIGZlYXR1cmluZyBzZXZlcmFsIEFEQyBjb21tb24gaW5zdGFuY2VzKS4KKyAgKiBAcGFyYW0gIF9fQURDWFlfQ09NTU9OX18gQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiBhbGwgQURDIGluc3RhbmNlcyBzaGFyaW5nIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFZhbHVlICIxIiBpZiBhdCBsZWFzdCBvbmUgQURDIGluc3RhbmNlIHNoYXJpbmcgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgaXMgZW5hYmxlZC4KKyAgKi8KKyNpZiBkZWZpbmVkKEFEQzEpICYmIGRlZmluZWQoQURDMikgJiYgZGVmaW5lZChBREMzKQorI2RlZmluZSBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoX19BRENYWV9DT01NT05fXykgICAgICAgICAgICAgIFwKKyAgKExMX0FEQ19Jc0VuYWJsZWQoQURDMSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBMTF9BRENfSXNFbmFibGVkKEFEQzIpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgTExfQURDX0lzRW5hYmxlZChBREMzKSAgKQorI2VsaWYgZGVmaW5lZChBREMxKSAmJiBkZWZpbmVkKEFEQzIpCisjZGVmaW5lIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSAgICAgICAgICAgICAgXAorICAoTExfQURDX0lzRW5hYmxlZChBREMxKSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIExMX0FEQ19Jc0VuYWJsZWQoQURDMikgICkKKyNlbHNlCisjZGVmaW5lIF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0FEQ1hZX0NPTU1PTl9fKSAgICAgICAgICAgICAgXAorICAoTExfQURDX0lzRW5hYmxlZChBREMxKSkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBkZWZpbmUgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBkaWdpdGFsCisgICogICAgICAgICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4KKyAgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGRhdGEgZnVsbC1zY2FsZSBjb3JyZXNwb25kcyB0byB2b2x0YWdlIHJhbmdlCisgICogICAgICAgICBkZXRlcm1pbmVkIGJ5IGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZXMgVnJlZisgYW5kIFZyZWYtCisgICogICAgICAgICAocmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBREMgY29udmVyc2lvbiBkYXRhIGZ1bGwtc2NhbGUgZGlnaXRhbCB2YWx1ZSAodW5pdDogZGlnaXRhbCB2YWx1ZSBvZiBBREMgY29udmVyc2lvbiBkYXRhKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKDB4RkZGVUwgPj4gKChfX0FEQ19SRVNPTFVUSU9OX18pID4+IChBRENfQ0ZHUl9SRVNfQklUT0ZGU0VUX1BPUyAtIDFVTCkpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IHRoZSBBREMgY29udmVyc2lvbiBkYXRhIGZyb20KKyAgKiAgICAgICAgIGEgcmVzb2x1dGlvbiB0byBhbm90aGVyIHJlc29sdXRpb24uCisgICogQHBhcmFtICBfX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIHRvIGJlIGNvbnZlcnRlZCAKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fQ1VSUkVOVF9fIFJlc29sdXRpb24gb2YgdGhlIGRhdGEgdG8gYmUgY29udmVydGVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fVEFSR0VUX18gUmVzb2x1dGlvbiBvZiB0aGUgZGF0YSBhZnRlciBjb252ZXJzaW9uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCByZXNvbHV0aW9uCisgICovCisjZGVmaW5lIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKF9fREFUQV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9DVVJSRU5UX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSAgICAgICAgICAgIFwKKyAgKCgoX19EQVRBX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPDwgKChfX0FEQ19SRVNPTFVUSU9OX0NVUlJFTlRfXykgPj4gKEFEQ19DRkdSX1JFU19CSVRPRkZTRVRfUE9TIC0gMVVMKSkpICAgXAorICAgPj4gKChfX0FEQ19SRVNPTFVUSU9OX1RBUkdFVF9fKSA+PiAoQURDX0NGR1JfUkVTX0JJVE9GRlNFVF9QT1MgLSAxVUwpKSAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHZvbHRhZ2UgKHVuaXQ6IG1Wb2x0KQorICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byBhIEFEQyBjb252ZXJzaW9uIGRhdGEgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpLgorICAqIEBub3RlICAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZSBlaXRoZXIga25vd24gZnJvbQorICAqICAgICAgICAgdXNlciBib2FyZCBlbnZpcm9ubWVudCBvciBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZyBBREMgbWVhc3VyZW1lbnQKKyAgKiAgICAgICAgIGFuZCBBREMgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0FMQ19WUkVGQU5BTE9HX1ZPTFRBR0UoKS4KKyAgKiBAcGFyYW0gIF9fVlJFRkFOQUxPR19WT0xUQUdFX18gQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fQURDX0RBVEFfXyBBREMgY29udmVyc2lvbiBkYXRhIChyZXNvbHV0aW9uIDEyIGJpdHMpCisgICogICAgICAgICAgICAgICAgICAgICAgICh1bml0OiBkaWdpdGFsIHZhbHVlKS4KKyAgKiBAcGFyYW0gIF9fQURDX1JFU09MVVRJT05fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIEFEQyBjb252ZXJzaW9uIGRhdGEgZXF1aXZhbGVudCB2b2x0YWdlIHZhbHVlICh1bml0OiBtVm9sdCkKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19EQVRBX1RPX1ZPTFRBR0UoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF9fQURDX0RBVEFfXykgKiAoX19WUkVGQU5BTE9HX1ZPTFRBR0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8gX19MTF9BRENfRElHSVRBTF9TQ0FMRShfX0FEQ19SRVNPTFVUSU9OX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIGFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispCisgICogICAgICAgICAodW5pdDogbVZvbHQpIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlCisgICogICAgICAgICByZWZlcmVuY2UgVnJlZkludC4KKyAgKiBAbm90ZSAgIENvbXB1dGF0aW9uIGlzIHVzaW5nIFZyZWZJbnQgY2FsaWJyYXRpb24gdmFsdWUKKyAgKiAgICAgICAgIHN0b3JlZCBpbiBzeXN0ZW0gbWVtb3J5IGZvciBlYWNoIGRldmljZSBkdXJpbmcgcHJvZHVjdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgdm9sdGFnZSBkZXBlbmRzIG9uIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQ6IHZvbHRhZ2UgbGV2ZWwKKyAgKiAgICAgICAgIGNvbm5lY3RlZCB0byBwaW4gVnJlZisuCisgICogICAgICAgICBPbiBkZXZpY2VzIHdpdGggc21hbGwgcGFja2FnZSwgdGhlIHBpbiBWcmVmKyBpcyBub3QgcHJlc2VudAorICAqICAgICAgICAgYW5kIGludGVybmFsbHkgYm9uZGVkIHRvIHBpbiBWZGRhLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgY2FsaWJyYXRpb24gZGF0YSBvZiBpbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICAqICAgICAgICAgVnJlZkludCBjb3JyZXNwb25kcyB0byBhIHJlc29sdXRpb24gb2YgMTIgYml0cywKKyAgKiAgICAgICAgIHRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFEQyByZXNvbHV0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBvZgorICAqICAgICAgICAgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludC4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19WUkVGSU5UX0FEQ19EQVRBX18gQURDIGNvbnZlcnNpb24gZGF0YSAocmVzb2x1dGlvbiAxMiBiaXRzKQorICAqICAgICAgICAgb2YgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl8xMEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzZCCisgICogQHJldHZhbCBBbmFsb2cgcmVmZXJlbmNlIHZvbHRhZ2UgKHVuaXQ6IG1WKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1ZSRUZBTkFMT0dfVk9MVEFHRShfX1ZSRUZJTlRfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQURDX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50MzJfdCkoKlZSRUZJTlRfQ0FMX0FERFIpICogVlJFRklOVF9DQUxfVlJFRikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvIF9fTExfQURDX0NPTlZFUlRfREFUQV9SRVNPTFVUSU9OKChfX1ZSRUZJTlRfQURDX0RBVEFfXyksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19BRENfUkVTT0xVVElPTl9fKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1JFU09MVVRJT05fMTJCKSAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsaWJyYXRpb24gdmFsdWVzCisgICogICAgICAgICBzdG9yZWQgaW4gc3lzdGVtIG1lbW9yeSBmb3IgZWFjaCBkZXZpY2UgZHVyaW5nIHByb2R1Y3Rpb24uCisgICogQG5vdGUgICBDYWxjdWxhdGlvbiBmb3JtdWxhOgorICAqICAgICAgICAgICBUZW1wZXJhdHVyZSA9ICgoVFNfQURDX0RBVEEgLSBUU19DQUwxKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKSkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAvIChUU19DQUwyIC0gVFNfQ0FMMSkgKyBUU19DQUwxX1RFTVAKKyAgKiAgICAgICAgICAgd2l0aCBUU19BRENfREFUQSA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieSBBREMKKyAgKiAgICAgICAgICAgICAgICBBdmdfU2xvcGUgPSAoVFNfQ0FMMiAtIFRTX0NBTDEpCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoVFNfQ0FMMl9URU1QIC0gVFNfQ0FMMV9URU1QKQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDEgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMSAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgICAgICAgIFRTX0NBTDIgICA9IGVxdWl2YWxlbnQgVFNfQURDX0RBVEEgYXQgdGVtcGVyYXR1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QX0RFR0NfQ0FMMiAoY2FsaWJyYXRlZCBpbiBmYWN0b3J5KQorICAqICAgICAgICAgQ2F1dGlvbjogQ2FsY3VsYXRpb24gcmVsZXZhbmN5IHVuZGVyIHJlc2VydmUgdGhhdCBjYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgY29ycmVjdCAoYWRkcmVzcyBhbmQgZGF0YSkuCisgICogICAgICAgICAgICAgICAgICBUbyBjYWxjdWxhdGUgdGVtcGVyYXR1cmUgdXNpbmcgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBkYXRhc2hlZXQgdHlwaWNhbCB2YWx1ZXMgKGdlbmVyaWMgdmFsdWVzIGxlc3MsIHRoZXJlZm9yZQorICAqICAgICAgICAgICAgICAgICAgbGVzcyBhY2N1cmF0ZSB0aGFuIGNhbGlicmF0ZWQgdmFsdWVzKSwKKyAgKiAgICAgICAgICAgICAgICAgIHVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBjYWxpYnJhdGlvbiBkYXRhIG9mIHRlbXBlcmF0dXJlIHNlbnNvcgorICAqICAgICAgICAgY29ycmVzcG9uZHMgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMsCisgICogICAgICAgICB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBREMgcmVzb2x1dGlvbiB0byBjb252ZXJ0IHZvbHRhZ2Ugb2YKKyAgKiAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvci4KKyAgKiAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBtYWNybyBwZXJmb3JtcyB0aGUgcHJvY2Vzc2luZyB0byBzY2FsZQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gZGF0YSB0byAxMiBiaXRzLgorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgQW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlICh1bml0OiBtVikKKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9BRENfREFUQV9fIEFEQyBjb252ZXJzaW9uIGRhdGEgb2YgaW50ZXJuYWwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yIHZvbHRhZ2UgaGFzIGJlZW4gbWVhc3VyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEyQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRVNPTFVUSU9OXzhCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fNkIKKyAgKiBAcmV0dmFsIFRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKi8KKyNkZWZpbmUgX19MTF9BRENfQ0FMQ19URU1QRVJBVFVSRShfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKCAoKGludDMyX3QpKChfX0xMX0FEQ19DT05WRVJUX0RBVEFfUkVTT0xVVElPTigoX19URU1QU0VOU09SX0FEQ19EQVRBX18pLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0FEQ19SRVNPTFVUSU9OX18pLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfQURDX1JFU09MVVRJT05fMTJCKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgLyBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC0gKGludDMyX3QpICpURU1QU0VOU09SX0NBTDFfQUREUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKSAqIChpbnQzMl90KShURU1QU0VOU09SX0NBTDJfVEVNUCAtIFRFTVBTRU5TT1JfQ0FMMV9URU1QKSAgICAgICAgICAgICAgICAgICAgXAorICAgICkgLyAoaW50MzJfdCkoKGludDMyX3QpKlRFTVBTRU5TT1JfQ0FMMl9BRERSIC0gKGludDMyX3QpKlRFTVBTRU5TT1JfQ0FMMV9BRERSKSBcCisgICApICsgVEVNUFNFTlNPUl9DQUwxX1RFTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlICh1bml0OiBkZWdyZWUgQ2Vsc2l1cykKKyAgKiAgICAgICAgIGZyb20gQURDIGNvbnZlcnNpb24gZGF0YSBvZiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IuCisgICogQG5vdGUgICBDb21wdXRhdGlvbiBpcyB1c2luZyB0ZW1wZXJhdHVyZSBzZW5zb3IgdHlwaWNhbCB2YWx1ZXMKKyAgKiAgICAgICAgIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0KS4KKyAgKiBAbm90ZSAgIENhbGN1bGF0aW9uIGZvcm11bGE6CisgICogICAgICAgICAgIFRlbXBlcmF0dXJlID0gKFRTX1RZUF9DQUx4X1ZPTFQodVYpIC0gVFNfQURDX0RBVEEgKiBDb252ZXJzaW9uX3VWKQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIC8gQXZnX1Nsb3BlICsgQ0FMeF9URU1QCisgICogICAgICAgICAgIHdpdGggVFNfQURDX0RBVEEgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciByYXcgZGF0YSBtZWFzdXJlZCBieSBBREMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaXQ6IGRpZ2l0YWwgdmFsdWUpCisgICogICAgICAgICAgICAgICAgQXZnX1Nsb3BlICAgICAgICA9IHRlbXBlcmF0dXJlIHNlbnNvciBzbG9wZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pdDogdVYvRGVncmVlIENlbHNpdXMpCisgICogICAgICAgICAgICAgICAgVFNfVFlQX0NBTHhfVk9MVCA9IHRlbXBlcmF0dXJlIHNlbnNvciBkaWdpdGFsIHZhbHVlIGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlIENBTHhfVEVNUCAodW5pdDogbVYpCisgICogICAgICAgICBDYXV0aW9uOiBDYWxjdWxhdGlvbiByZWxldmFuY3kgdW5kZXIgcmVzZXJ2ZSB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yCisgICogICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBkZXZpY2UgaGFzIGNoYXJhY3RlcmlzdGljcyBpbiBsaW5lIHdpdGgKKyAgKiAgICAgICAgICAgICAgICAgIGRhdGFzaGVldCB0eXBpY2FsIHZhbHVlcy4KKyAgKiAgICAgICAgICAgICAgICAgIElmIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxpYnJhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBvbgorICAqICAgICAgICAgICAgICAgICAgb24gdGhpcyBkZXZpY2UgKHByZXNlbmNlIG9mIG1hY3JvIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKSksCisgICogICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiB3aWxsIGJlIG1vcmUgYWNjdXJhdGUgdXNpbmcKKyAgKiAgICAgICAgICAgICAgICAgIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVEVNUEVSQVRVUkUoKS4KKyAgKiBAbm90ZSAgIEFzIGNhbGN1bGF0aW9uIGlucHV0LCB0aGUgYW5hbG9nIHJlZmVyZW5jZSB2b2x0YWdlIChWcmVmKykgbXVzdCBiZQorICAqICAgICAgICAgZGVmaW5lZCBhcyBpdCBpbXBhY3RzIHRoZSBBREMgTFNCIGVxdWl2YWxlbnQgdm9sdGFnZS4KKyAgKiBAbm90ZSAgIEFuYWxvZyByZWZlcmVuY2Ugdm9sdGFnZSAoVnJlZispIG11c3QgYmUgZWl0aGVyIGtub3duIGZyb20KKyAgKiAgICAgICAgIHVzZXIgYm9hcmQgZW52aXJvbm1lbnQgb3IgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgQURDIG1lYXN1cmVtZW50CisgICogICAgICAgICBhbmQgQURDIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0NBTENfVlJFRkFOQUxPR19WT0xUQUdFKCkuCisgICogQG5vdGUgICBBREMgbWVhc3VyZW1lbnQgZGF0YSBtdXN0IGNvcnJlc3BvbmQgdG8gYSByZXNvbHV0aW9uIG9mIDEyIGJpdHMKKyAgKiAgICAgICAgIChmdWxsIHNjYWxlIGRpZ2l0YWwgdmFsdWUgNDA5NSkuIElmIG5vdCB0aGUgY2FzZSwgdGhlIGRhdGEgbXVzdCBiZQorICAqICAgICAgICAgcHJlbGltaW5hcmlseSByZXNjYWxlZCB0byBhbiBlcXVpdmFsZW50IHJlc29sdXRpb24gb2YgMTIgYml0cy4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9UWVBfQVZHU0xPUEVfXyAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgc2Vuc29yIHNsb3BlIHR5cGljYWwgdmFsdWUgKHVuaXQ6IHVWL0RlZ0NlbHNpdXMpLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gU1RNMzJXQiwgcmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBwYXJhbWV0ZXIgIkF2Z19TbG9wZSIuCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfVFlQX0NBTFhfVl9fICAgICBEZXZpY2UgZGF0YXNoZWV0IGRhdGE6IFRlbXBlcmF0dXJlIHNlbnNvciB2b2x0YWdlIHR5cGljYWwgdmFsdWUgKGF0IHRlbXBlcmF0dXJlIGFuZCBWcmVmKyBkZWZpbmVkIGluIHBhcmFtZXRlcnMgYmVsb3cpICh1bml0OiBtVikuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBTVE0zMldCLCByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IHBhcmFtZXRlciAiVjMwIiAoY29ycmVzcG9uZGluZyB0byBUU19DQUwxKS4KKyAgKiBAcGFyYW0gIF9fVEVNUFNFTlNPUl9DQUxYX1RFTVBfXyAgICAgIERldmljZSBkYXRhc2hlZXQgZGF0YTogVGVtcGVyYXR1cmUgYXQgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIHZvbHRhZ2UgKHNlZSBwYXJhbWV0ZXIgYWJvdmUpIGlzIGNvcnJlc3BvbmRpbmcgKHVuaXQ6IG1WKQorICAqIEBwYXJhbSAgX19WUkVGQU5BTE9HX1ZPTFRBR0VfXyAgICAgICAgQW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlIChWcmVmKykgdm9sdGFnZSAodW5pdDogbVYpCisgICogQHBhcmFtICBfX1RFTVBTRU5TT1JfQURDX0RBVEFfXyAgICAgICBBREMgY29udmVyc2lvbiBkYXRhIG9mIGludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciAodW5pdDogZGlnaXRhbCB2YWx1ZSkuCisgICogQHBhcmFtICBfX0FEQ19SRVNPTFVUSU9OX18gICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBhdCB3aGljaCBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3Igdm9sdGFnZSBoYXMgYmVlbiBtZWFzdXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgVGVtcGVyYXR1cmUgKHVuaXQ6IGRlZ3JlZSBDZWxzaXVzKQorICAqLworI2RlZmluZSBfX0xMX0FEQ19DQUxDX1RFTVBFUkFUVVJFX1RZUF9QQVJBTVMoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0NBTFhfVEVNUF9fLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVlJFRkFOQUxPR19WT0xUQUdFX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19URU1QU0VOU09SX0FEQ19EQVRBX18sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BRENfUkVTT0xVVElPTl9fKSAgICAgICAgICAgICAgIFwKKyAgKCgoICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKGludDMyX3QpKCgoKF9fVEVNUFNFTlNPUl9BRENfREFUQV9fKSAqIChfX1ZSRUZBTkFMT0dfVk9MVEFHRV9fKSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgLyBfX0xMX0FEQ19ESUdJVEFMX1NDQUxFKF9fQURDX1JFU09MVVRJT05fXykpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChpbnQzMl90KSgoKF9fVEVNUFNFTlNPUl9UWVBfQ0FMWF9WX18pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKiAxMDAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICkgLyAoaW50MzJfdCkoX19URU1QU0VOU09SX1RZUF9BVkdTTE9QRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICkgKyAoaW50MzJfdCkoX19URU1QU0VOU09SX0NBTFhfVEVNUF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBBRENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEFEQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9ETUFfTWFuYWdlbWVudCBBREMgRE1BIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyogTm90ZTogTEwgQURDIGZ1bmN0aW9ucyB0byBzZXQgRE1BIHRyYW5zZmVyIGFyZSBsb2NhdGVkIGludG8gc2VjdGlvbnMgb2YgICAgKi8KKy8qICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgQURDIGluc3RhbmNlLCBncm91cHMgYW5kIG11bHRpbW9kZSAoaWYgYXZhaWxhYmxlKTogICovCisvKiAgICAgICBAcmVmIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIoKSwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGhlbHAgdG8gY29uZmlndXJlIERNQSB0cmFuc2ZlciBmcm9tIEFEQzogcmV0cmlldmUgdGhlCisgICogICAgICAgICBBREMgcmVnaXN0ZXIgYWRkcmVzcyBmcm9tIEFEQyBpbnN0YW5jZSBhbmQgYSBsaXN0IG9mIEFEQyByZWdpc3RlcnMKKyAgKiAgICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgKG1vc3QgY29tbW9ubHkpIHdpdGggRE1BIHRyYW5zZmVyLgorICAqIEBub3RlICAgVGhlc2UgQURDIHJlZ2lzdGVycyBhcmUgZGF0YSByZWdpc3RlcnM6CisgICogICAgICAgICB3aGVuIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgYXZhaWxhYmxlIGluIEFEQyBkYXRhIHJlZ2lzdGVycywKKyAgKiAgICAgICAgIEFEQyBnZW5lcmF0ZXMgYSBETUEgdHJhbnNmZXIgcmVxdWVzdC4KKyAgKiBAbm90ZSAgIFRoaXMgbWFjcm8gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIExMIERNQSBkcml2ZXIsIHJlZmVyIHRvCisgICogICAgICAgICBmdW5jdGlvbiAiTExfRE1BX0NvbmZpZ0FkZHJlc3NlcygpIi4KKyAgKiAgICAgICAgIEV4YW1wbGU6CisgICogICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXMoRE1BMSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9ETUFfQ0hBTk5FTF8xLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcihBREMxLCBMTF9BRENfRE1BX1JFR19SRUdVTEFSX0RBVEEpLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmPCBhcnJheSBvciB2YXJpYWJsZSA+LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSk7CisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIHNldmVyYWwgQURDOiBpbiBtdWx0aW1vZGUsIHNvbWUgZGV2aWNlcworICAqICAgICAgICAgdXNlIGEgZGlmZmVyZW50IGRhdGEgcmVnaXN0ZXIgb3V0c2lkZSBvZiBBREMgaW5zdGFuY2Ugc2NvcGUKKyAgKiAgICAgICAgIChjb21tb24gZGF0YSByZWdpc3RlcikuIFRoaXMgbWFjcm8gbWFuYWdlcyB0aGlzIHJlZ2lzdGVyIGRpZmZlcmVuY2UsCisgICogICAgICAgICBvbmx5IEFEQyBpbnN0YW5jZSBoYXMgdG8gYmUgc2V0IGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIERSICAgICAgIERBVEEgICAgICAgICAgIExMX0FEQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlZ2lzdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RNQV9SRUdfUkVHVUxBUl9EQVRBCisgICogQHJldHZhbCBBREMgcmVnaXN0ZXIgYWRkcmVzcworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19ETUFfR2V0UmVnQWRkcihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmVnaXN0ZXIpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgKHZvaWQpKFJlZ2lzdGVyKTsKKyAgCisgIC8qIFJldHJpZXZlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgRFIgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkmKEFEQ3gtPkRSKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfQ29tbW9uIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogY29tbW9uIHRvIHNldmVyYWwgQURDIGluc3RhbmNlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IENsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgaWYgQURDIGdyb3VwIGluamVjdGVkIGlzIHVzZWQsIHNvbWUKKyAgKiAgICAgICAgIGNsb2NrIHJhdGlvIGNvbnN0cmFpbnRzIGJldHdlZW4gQURDIGNsb2NrIGFuZCBBSEIgY2xvY2sKKyAgKiAgICAgICAgIG11c3QgYmUgcmVzcGVjdGVkLgorICAqICAgICAgICAgUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBbGwgQURDIGluc3RhbmNlcyBvZiB0aGUgQURDIGNvbW1vbiBncm91cCBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjaGVjayBjYW4gYmUgZG9uZSB3aXRoIGZ1bmN0aW9uIEByZWYgTExfQURDX0lzRW5hYmxlZCgpIGZvciBlYWNoCisgICogICAgICAgICBBREMgaW5zdGFuY2Ugb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIGhlbHBlciBtYWNybworICAqICAgICAgICAgQHJlZiBfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoKS4KKyAgKiBAcm10b2xsIENDUiAgICAgIENLTU9ERSAgICAgICAgIExMX0FEQ19TZXRDb21tb25DbG9ja1xuCisgICogICAgICAgICBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2sKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEBwYXJhbSAgQ29tbW9uQ2xvY2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDb21tb25DbG9jayhBRENfQ29tbW9uX1R5cGVEZWYgKkFEQ3h5X0NPTU1PTiwgdWludDMyX3QgQ29tbW9uQ2xvY2spCit7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfQ0tNT0RFIHwgQURDX0NDUl9QUkVTQywgQ29tbW9uQ2xvY2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJhbWV0ZXIgY29tbW9uIHRvIHNldmVyYWwgQURDOiBDbG9jayBzb3VyY2UgYW5kIHByZXNjYWxlci4KKyAgKiBAcm10b2xsIENDUiAgICAgIENLTU9ERSAgICAgICAgIExMX0FEQ19HZXRDb21tb25DbG9ja1xuCisgICogICAgICAgICBDQ1IgICAgICBQUkVTQyAgICAgICAgICBMTF9BRENfR2V0Q29tbW9uQ2xvY2sKKyAgKiBAcGFyYW0gIEFEQ3h5X0NPTU1PTiBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKCkgKQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NMT0NLX0FTWU5DX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DTE9DS19BU1lOQ19ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q29tbW9uQ2xvY2soQURDX0NvbW1vbl9UeXBlRGVmICpBREN4eV9DT01NT04pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3h5X0NPTU1PTi0+Q0NSLCBBRENfQ0NSX0NLTU9ERSB8IEFEQ19DQ1JfUFJFU0MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgcGFyYW1ldGVyIGNvbW1vbiB0byBzZXZlcmFsIEFEQzogbWVhc3VyZW1lbnQgcGF0aCB0byBpbnRlcm5hbAorICAqICAgICAgICAgY2hhbm5lbHMgKFZyZWZJbnQsIHRlbXBlcmF0dXJlIHNlbnNvciwgLi4uKS4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCB8CisgICogICAgICAgICAgICAgICAgICAgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikKKyAgKiBAbm90ZSAgIFN0YWJpbGl6YXRpb24gdGltZSBvZiBtZWFzdXJlbWVudCBwYXRoIHRvIGludGVybmFsIGNoYW5uZWw6CisgICogICAgICAgICBBZnRlciBlbmFibGluZyBpbnRlcm5hbCBwYXRocywgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uLAorICAqICAgICAgICAgYSBkZWxheSBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgYW5kCisgICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RhYmlsaXphdGlvbiB0aW1lLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfVlJFRklOVF9TVEFCX1VTLgorICAqICAgICAgICAgUmVmZXIgdG8gbGl0ZXJhbCBAcmVmIExMX0FEQ19ERUxBWV9URU1QU0VOU09SX1NUQUJfVVMuCisgICogQG5vdGUgICBBREMgaW50ZXJuYWwgY2hhbm5lbCBzYW1wbGluZyB0aW1lIGNvbnN0cmFpbnQ6CisgICogICAgICAgICBGb3IgQURDIGNvbnZlcnNpb24gb2YgaW50ZXJuYWwgY2hhbm5lbHMsCisgICogICAgICAgICBhIHNhbXBsaW5nIHRpbWUgbWluaW11bSB2YWx1ZSBpcyByZXF1aXJlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQWxsIEFEQyBpbnN0YW5jZXMgb2YgdGhlIEFEQyBjb21tb24gZ3JvdXAgbXVzdCBiZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgd2l0aCBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jc0VuYWJsZWQoKSBmb3IgZWFjaAorICAqICAgICAgICAgQURDIGluc3RhbmNlIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBoZWxwZXIgbWFjcm8KKyAgKiAgICAgICAgIEByZWYgX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKCkuCisgICogQHJtdG9sbCBDQ1IgICAgICBWUkVGRU4gICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICAqICAgICAgICAgQ0NSICAgICAgVFNFTiAgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFZCQVRFTiAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaAorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBQYXRoSW50ZXJuYWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCB1aW50MzJfdCBQYXRoSW50ZXJuYWwpCit7CisgIE1PRElGWV9SRUcoQURDeHlfQ09NTU9OLT5DQ1IsIEFEQ19DQ1JfVlJFRkVOIHwgQURDX0NDUl9UU0VOIHwgQURDX0NDUl9WQkFURU4sIFBhdGhJbnRlcm5hbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBhcmFtZXRlciBjb21tb24gdG8gc2V2ZXJhbCBBREM6IG1lYXN1cmVtZW50IHBhdGggdG8gaW50ZXJuYWwKKyAgKiAgICAgICAgIGNoYW5uZWxzIChWcmVmSW50LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLikuCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgfAorICAqICAgICAgICAgICAgICAgICAgIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IpCisgICogQHJtdG9sbCBDQ1IgICAgICBWUkVGRU4gICAgICAgICBMTF9BRENfR2V0Q29tbW9uUGF0aEludGVybmFsQ2hcbgorICAqICAgICAgICAgQ0NSICAgICAgVFNFTiAgICAgICAgICAgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoXG4KKyAgKiAgICAgICAgIENDUiAgICAgIFZCQVRFTiAgICAgICAgIExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaAorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoKEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4eV9DT01NT04tPkNDUiwgQURDX0NDUl9WUkVGRU4gfCBBRENfQ0NSX1RTRU4gfCBBRENfQ0NSX1ZCQVRFTikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19JbnN0YW5jZSBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IEFEQyBpbnN0YW5jZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjYWxpYnJhdGlvbiBmYWN0b3IgaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkCisgICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gc2V0IGNhbGlicmF0aW9uIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIHBlcmZvcm0gYSBuZXcgY2FsaWJyYXRpb24gdXNpbmcKKyAgKiAgICAgICAgIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlOgorICAqICAgICAgICAgQ2FsaWJyYXRpb24gb2Ygb2Zmc2V0IGlzIHNwZWNpZmljIHRvIGVhY2ggb2YKKyAgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgICogICAgICAgICAoY2FsaWJyYXRpb24gZmFjdG9yIG11c3QgYmUgc3BlY2lmaWVkIGZvciBlYWNoIG9mIHRoZXNlCisgICogICAgICAgICBkaWZmZXJlbnRpYWwgbW9kZXMsIGlmIHVzZWQgYWZ0ZXJ3YXJkcyBhbmQgaWYgdGhlIGFwcGxpY2F0aW9uCisgICogICAgICAgICByZXF1aXJlcyB0aGVpciBjYWxpYnJhdGlvbikuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIHNldHRpbmcgY2FsaWJyYXRpb24gZmFjdG9ycyBvZiBib3RoIG1vZGVzIHNpbmdsZSBlbmRlZAorICAqICAgICAgICAgYW5kIGRpZmZlcmVudGlhbCAocGFyYW1ldGVyIExMX0FEQ19CT1RIX1NJTkdMRV9ESUZGX0VOREVEKToKKyAgKiAgICAgICAgIGJvdGggY2FsaWJyYXRpb24gZmFjdG9ycyBtdXN0IGJlIGNvbmNhdGVuYXRlZC4KKyAgKiAgICAgICAgIFRvIHBlcmZvcm0gdGhpcyBwcm9jZXNzaW5nLCB1c2UgaGVscGVyIG1hY3JvCisgICogICAgICAgICBAcmVmIF9fTExfQURDX0NBTElCX0ZBQ1RPUl9TSU5HTEVfRElGRigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQsIHdpdGhvdXQgY2FsaWJyYXRpb24gb24gZ29pbmcsIHdpdGhvdXQgY29udmVyc2lvbgorICAqICAgICAgICAgb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENBTEZBQ1QgIENBTEZBQ1RfUyAgICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvclxuCisgICogICAgICAgICBDQUxGQUNUICBDQUxGQUNUX0QgICAgICBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NJTkdMRV9FTkRFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19ESUZGRVJFTlRJQUxfRU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQk9USF9TSU5HTEVfRElGRl9FTkRFRAorICAqIEBwYXJhbSAgQ2FsaWJyYXRpb25GYWN0b3IgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0Q2FsaWJyYXRpb25GYWN0b3IoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNpbmdsZURpZmYsIHVpbnQzMl90IENhbGlicmF0aW9uRmFjdG9yKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNBTEZBQ1QsCisgICAgICAgICAgICAgU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLLAorICAgICAgICAgICAgIENhbGlicmF0aW9uRmFjdG9yIDw8ICgoKFNpbmdsZURpZmYgJiBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX01BU0spID4+IEFEQ19TSU5HTEVESUZGX0NBTElCX0ZfQklUX0RfU0hJRlQ0KSAmIH4oU2luZ2xlRGlmZiAmIEFEQ19DQUxGQUNUX0NBTEZBQ1RfUykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNhbGlicmF0aW9uIGZhY3RvciBpbiB0aGUgbW9kZSBzaW5nbGUtZW5kZWQKKyAgKiAgICAgICAgIG9yIGRpZmZlcmVudGlhbCAoZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnRpYWwgbW9kZSBhdmFpbGFibGUpLgorICAqIEBub3RlICAgQ2FsaWJyYXRpb24gZmFjdG9ycyBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFmdGVyIHBlcmZvcm1pbmcKKyAgKiAgICAgICAgIGEgY2FsaWJyYXRpb24gcnVuIHVzaW5nIGZ1bmN0aW9uIEByZWYgTExfQURDX1N0YXJ0Q2FsaWJyYXRpb24oKS4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlOgorICAqICAgICAgICAgQ2FsaWJyYXRpb24gb2Ygb2Zmc2V0IGlzIHNwZWNpZmljIHRvIGVhY2ggb2YKKyAgKiAgICAgICAgIHNpbmdsZS1lbmRlZCBhbmQgZGlmZmVyZW50aWFsIG1vZGVzCisgICogQHJtdG9sbCBDQUxGQUNUICBDQUxGQUNUX1MgICAgICBMTF9BRENfR2V0Q2FsaWJyYXRpb25GYWN0b3JcbgorICAqICAgICAgICAgQ0FMRkFDVCAgQ0FMRkFDVF9EICAgICAgTExfQURDX0dldENhbGlicmF0aW9uRmFjdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TSU5HTEVfRU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q2FsaWJyYXRpb25GYWN0b3IoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNpbmdsZURpZmYpCit7CisgIC8qIFJldHJpZXZlIGJpdHMgd2l0aCBwb3NpdGlvbiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICAgICAgICAgICAqLworICAvKiAiU2luZ2xlRGlmZiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVyIHVzZWQgd2l0aCBtYXNrICJBRENfU0lOR0xFRElGRl9DQUxJQl9GQUNUT1JfTUFTSyIgYmVjYXVzZSAgICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DQUxGQUNULCAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX0ZBQ1RPUl9NQVNLKSkgPj4gKChTaW5nbGVEaWZmICYgQURDX1NJTkdMRURJRkZfQ0FMSUJfRl9CSVRfRF9NQVNLKSA+PiBBRENfU0lOR0xFRElGRl9DQUxJQl9GX0JJVF9EX1NISUZUNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgcmVzb2x1dGlvbi4KKyAgKiAgICAgICAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgUkVTICAgICAgICAgICAgTExfQURDX1NldFJlc29sdXRpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSZXNvbHV0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldFJlc29sdXRpb24oQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJlc29sdXRpb24pCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfUkVTLCBSZXNvbHV0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIHJlc29sdXRpb24uCisgICogICAgICAgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQHJtdG9sbCBDRkdSICAgICBSRVMgICAgICAgICAgICBMTF9BRENfR2V0UmVzb2x1dGlvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFU09MVVRJT05fOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVTT0xVVElPTl82QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRSZXNvbHV0aW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9SRVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGNvbnZlcnNpb24gZGF0YSBhbGlnbm1lbnQuCisgICogQG5vdGUgICBSZWZlciB0byByZWZlcmVuY2UgbWFudWFsIGZvciBhbGlnbm1lbnRzIGZvcm1hdHMKKyAgKiAgICAgICAgIGRlcGVuZGVuY2llcyB0byBBREMgcmVzb2x1dGlvbnMuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFMSUdOICAgICAgICAgIExMX0FEQ19TZXREYXRhQWxpZ25tZW50CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YUFsaWdubWVudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RBVEFfQUxJR05fTEVGVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldERhdGFBbGlnbm1lbnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IERhdGFBbGlnbm1lbnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQUxJR04sIERhdGFBbGlnbm1lbnQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY29udmVyc2lvbiBkYXRhIGFsaWdubWVudC4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGFsaWdubWVudHMgZm9ybWF0cworICAqICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIEFEQyByZXNvbHV0aW9ucy4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFMSUdOICAgICAgICAgIExMX0FEQ19HZXREYXRhQWxpZ25tZW50CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfREFUQV9BTElHTl9SSUdIVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19EQVRBX0FMSUdOX0xFRlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0RGF0YUFsaWdubWVudChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQUxJR04pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGxvdyBwb3dlciBtb2RlLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGxvdyBwb3dlciBtb2RlczoKKyAgKiAgICAgICAgIC0gQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiOiBEeW5hbWljIGxvdyBwb3dlciBtb2RlLAorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMgb2NjdXJyZW5jZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIG1pbmltdW0gbmVjZXNzYXJ5CisgICogICAgICAgICAgIGluIG9yZGVyIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgKiAgICAgICAgICAgTmV3IEFEQyBjb252ZXJzaW9uIHN0YXJ0cyBvbmx5IHdoZW4gdGhlIHByZXZpb3VzCisgICogICAgICAgICAgIHVuaXRhcnkgY29udmVyc2lvbiBkYXRhIChmb3IgQURDIGdyb3VwIHJlZ3VsYXIpCisgICogICAgICAgICAgIG9yIHByZXZpb3VzIHNlcXVlbmNlIGNvbnZlcnNpb25zIGRhdGEgKGZvciBBREMgZ3JvdXAgaW5qZWN0ZWQpCisgICogICAgICAgICAgIGhhcyBiZWVuIHJldHJpZXZlZCBieSB1c2VyIHNvZnR3YXJlLgorICAqICAgICAgICAgICBJbiB0aGUgbWVhbnRpbWUsIEFEQyByZW1haW5zIGlkbGU6IGRvZXMgbm90IHBlcmZvcm1zIGFueQorICAqICAgICAgICAgICBvdGhlciBjb252ZXJzaW9uLgorICAqICAgICAgICAgICBUaGlzIG1vZGUgYWxsb3dzIHRvIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIEFEQyBjb252ZXJzaW9ucworICAqICAgICAgICAgICB0cmlnZ2VycyB0byB0aGUgc3BlZWQgb2YgdGhlIHNvZnR3YXJlIHRoYXQgcmVhZHMgdGhlIGRhdGEuCisgICogICAgICAgICAgIE1vcmVvdmVyLCB0aGlzIGF2b2lkcyByaXNrIG9mIG92ZXJydW4gZm9yIGxvdyBmcmVxdWVuY3kKKyAgKiAgICAgICAgICAgYXBwbGljYXRpb25zLgorICAqICAgICAgICAgICBIb3cgdG8gdXNlIHRoaXMgbG93IHBvd2VyIG1vZGU6CisgICogICAgICAgICAgIC0gRG8gbm90IHVzZSB3aXRoIGludGVycnVwdGlvbiBvciBETUEgc2luY2UgdGhlc2UgbW9kZXMKKyAgKiAgICAgICAgICAgICBoYXZlIHRvIGNsZWFyIGltbWVkaWF0ZWx5IHRoZSBFT0MgZmxhZyB0byBmcmVlIHRoZQorICAqICAgICAgICAgICAgIElSUSB2ZWN0b3Igc2VxdWVuY2VyLgorICAqICAgICAgICAgICAtIERvIHVzZSB3aXRoIHBvbGxpbmc6IDEuIFN0YXJ0IGNvbnZlcnNpb24sCisgICogICAgICAgICAgICAgMi4gTGF0ZXIgb24sIHdoZW4gY29udmVyc2lvbiBkYXRhIGlzIG5lZWRlZDogcG9sbCBmb3IgZW5kIG9mCisgICogICAgICAgICAgICAgY29udmVyc2lvbiAgdG8gZW5zdXJlIHRoYXQgY29udmVyc2lvbiBpcyBjb21wbGV0ZWQgYW5kCisgICogICAgICAgICAgICAgcmV0cmlldmUgQURDIGNvbnZlcnNpb24gZGF0YS4gVGhpcyB3aWxsIHRyaWcgYW5vdGhlcgorICAqICAgICAgICAgICAgIEFEQyBjb252ZXJzaW9uIHN0YXJ0LgorICAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gcG93ZXItb2ZmIiAoZmVhdHVyZSBhdmFpbGFibGUgb24KKyAgKiAgICAgICAgICAgdGhpcyBkZXZpY2UgaWYgcGFyYW1ldGVyIExMX0FEQ19MUF9BVVRPUE9XRVJPRkYgaXMgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgdGhlIEFEQyBhdXRvbWF0aWNhbGx5IHBvd2Vycy1vZmYgYWZ0ZXIgYSBjb252ZXJzaW9uIGFuZAorICAqICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHdoZW4gYSBuZXcgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQKKyAgKiAgICAgICAgICAgKHdpdGggc3RhcnR1cCB0aW1lIGJldHdlZW4gdHJpZ2dlciBhbmQgc3RhcnQgb2Ygc2FtcGxpbmcpLgorICAqICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIGNvbWJpbmVkIHdpdGggbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCIuCisgICogQG5vdGUgICBXaXRoIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0IiwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgcmVhZAorICAqICAgICAgICAgaXMgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBBREMgY29udmVyc2lvbiBzdGFydCwgaW5kZXBlbmRlbnRseQorICAqICAgICAgICAgb2YgZGVsYXkgZHVyaW5nIHdoaWNoIEFEQyB3YXMgaWRsZS4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgdGhlIEFEQyBjb252ZXJzaW9uIGRhdGEgbWF5IGJlIG91dGRhdGVkOiBkb2VzIG5vdAorICAqICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCB2b2x0YWdlIGxldmVsIG9uIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFVVERMWSAgICAgICAgIExMX0FEQ19TZXRMb3dQb3dlck1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfTU9ERV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0xQX0FVVE9XQUlUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0TG93UG93ZXJNb2RlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBMb3dQb3dlck1vZGUpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfQVVURExZLCBMb3dQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgbG93IHBvd2VyIG1vZGU6CisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgbG93IHBvd2VyIG1vZGVzOgorICAqICAgICAgICAgLSBBREMgbG93IHBvd2VyIG1vZGUgImF1dG8gd2FpdCI6IER5bmFtaWMgbG93IHBvd2VyIG1vZGUsCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBvY2N1cnJlbmNlcyBhcmUgbGltaXRlZCB0byB0aGUgbWluaW11bSBuZWNlc3NhcnkKKyAgKiAgICAgICAgICAgaW4gb3JkZXIgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uLgorICAqICAgICAgICAgICBOZXcgQURDIGNvbnZlcnNpb24gc3RhcnRzIG9ubHkgd2hlbiB0aGUgcHJldmlvdXMKKyAgKiAgICAgICAgICAgdW5pdGFyeSBjb252ZXJzaW9uIGRhdGEgKGZvciBBREMgZ3JvdXAgcmVndWxhcikKKyAgKiAgICAgICAgICAgb3IgcHJldmlvdXMgc2VxdWVuY2UgY29udmVyc2lvbnMgZGF0YSAoZm9yIEFEQyBncm91cCBpbmplY3RlZCkKKyAgKiAgICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIGJ5IHVzZXIgc29mdHdhcmUuCisgICogICAgICAgICAgIEluIHRoZSBtZWFudGltZSwgQURDIHJlbWFpbnMgaWRsZTogZG9lcyBub3QgcGVyZm9ybXMgYW55CisgICogICAgICAgICAgIG90aGVyIGNvbnZlcnNpb24uCisgICogICAgICAgICAgIFRoaXMgbW9kZSBhbGxvd3MgdG8gYXV0b21hdGljYWxseSBhZGFwdCB0aGUgQURDIGNvbnZlcnNpb25zCisgICogICAgICAgICAgIHRyaWdnZXJzIHRvIHRoZSBzcGVlZCBvZiB0aGUgc29mdHdhcmUgdGhhdCByZWFkcyB0aGUgZGF0YS4KKyAgKiAgICAgICAgICAgTW9yZW92ZXIsIHRoaXMgYXZvaWRzIHJpc2sgb2Ygb3ZlcnJ1biBmb3IgbG93IGZyZXF1ZW5jeQorICAqICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgICogICAgICAgICAgIEhvdyB0byB1c2UgdGhpcyBsb3cgcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgLSBEbyBub3QgdXNlIHdpdGggaW50ZXJydXB0aW9uIG9yIERNQSBzaW5jZSB0aGVzZSBtb2RlcworICAqICAgICAgICAgICAgIGhhdmUgdG8gY2xlYXIgaW1tZWRpYXRlbHkgdGhlIEVPQyBmbGFnIHRvIGZyZWUgdGhlCisgICogICAgICAgICAgICAgSVJRIHZlY3RvciBzZXF1ZW5jZXIuCisgICogICAgICAgICAgIC0gRG8gdXNlIHdpdGggcG9sbGluZzogMS4gU3RhcnQgY29udmVyc2lvbiwKKyAgKiAgICAgICAgICAgICAyLiBMYXRlciBvbiwgd2hlbiBjb252ZXJzaW9uIGRhdGEgaXMgbmVlZGVkOiBwb2xsIGZvciBlbmQgb2YKKyAgKiAgICAgICAgICAgICBjb252ZXJzaW9uICB0byBlbnN1cmUgdGhhdCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZCBhbmQKKyAgKiAgICAgICAgICAgICByZXRyaWV2ZSBBREMgY29udmVyc2lvbiBkYXRhLiBUaGlzIHdpbGwgdHJpZyBhbm90aGVyCisgICogICAgICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQuCisgICogICAgICAgICAtIEFEQyBsb3cgcG93ZXIgbW9kZSAiYXV0byBwb3dlci1vZmYiIChmZWF0dXJlIGF2YWlsYWJsZSBvbgorICAqICAgICAgICAgICB0aGlzIGRldmljZSBpZiBwYXJhbWV0ZXIgTExfQURDX0xQX0FVVE9QT1dFUk9GRiBpcyBhdmFpbGFibGUpOgorICAqICAgICAgICAgICB0aGUgQURDIGF1dG9tYXRpY2FsbHkgcG93ZXJzLW9mZiBhZnRlciBhIGNvbnZlcnNpb24gYW5kCisgICogICAgICAgICAgIGF1dG9tYXRpY2FsbHkgd2FrZXMgdXAgd2hlbiBhIG5ldyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZAorICAqICAgICAgICAgICAod2l0aCBzdGFydHVwIHRpbWUgYmV0d2VlbiB0cmlnZ2VyIGFuZCBzdGFydCBvZiBzYW1wbGluZykuCisgICogICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgY29tYmluZWQgd2l0aCBsb3cgcG93ZXIgbW9kZSAiYXV0byB3YWl0Ii4KKyAgKiBAbm90ZSAgIFdpdGggQURDIGxvdyBwb3dlciBtb2RlICJhdXRvIHdhaXQiLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSByZWFkCisgICogICAgICAgICBpcyBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIEFEQyBjb252ZXJzaW9uIHN0YXJ0LCBpbmRlcGVuZGVudGx5CisgICogICAgICAgICBvZiBkZWxheSBkdXJpbmcgd2hpY2ggQURDIHdhcyBpZGxlLgorICAqICAgICAgICAgVGhlcmVmb3JlLCB0aGUgQURDIGNvbnZlcnNpb24gZGF0YSBtYXkgYmUgb3V0ZGF0ZWQ6IGRvZXMgbm90CisgICogICAgICAgICBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHZvbHRhZ2UgbGV2ZWwgb24gdGhlIHNlbGVjdGVkCisgICogICAgICAgICBBREMgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFVVERMWSAgICAgICAgIExMX0FEQ19HZXRMb3dQb3dlck1vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19MUF9NT0RFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfTFBfQVVUT1dBSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0TG93UG93ZXJNb2RlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9BVVRETFkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0LgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIDIgaXRlbXMgb2Ygb2Zmc2V0IGNvbmZpZ3VyYXRpb246CisgICogICAgICAgICAtIEFEQyBjaGFubmVsIHRvIHdoaWNoIHRoZSBvZmZzZXQgcHJvZ3JhbW1lZCB3aWxsIGJlIGFwcGxpZWQKKyAgKiAgICAgICAgICAgKGluZGVwZW5kZW50bHkgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIKKyAgKiAgICAgICAgICAgb3IgZ3JvdXAgaW5qZWN0ZWQpCisgICogICAgICAgICAtIE9mZnNldCBsZXZlbCAob2Zmc2V0IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmF3CisgICogICAgICAgICAgIGNvbnZlcnRlZCBkYXRhKS4KKyAgKiBAbm90ZSAgIENhdXRpb246IE9mZnNldCBmb3JtYXQgaXMgZGVwZW5kZW50IHRvIEFEQyByZXNvbHV0aW9uOgorICAqICAgICAgICAgb2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKQorICAqICAgICAgICAgYXJlIHNldCB0byAwLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBvZmZzZXQsIGJ5IGRlZmF1bHQuIEl0IGNhbiBiZSBmb3JjZWQKKyAgKiAgICAgICAgIHRvIGRpc2FibGUgc3RhdGUgdXNpbmcgZnVuY3Rpb24gTExfQURDX1NldE9mZnNldFN0YXRlKCkuCisgICogQG5vdGUgICBJZiBhIGNoYW5uZWwgaXMgbWFwcGVkIG9uIHNldmVyYWwgb2Zmc2V0cyBudW1iZXJzLCBvbmx5IHRoZSBvZmZzZXQKKyAgKiAgICAgICAgIHdpdGggdGhlIGxvd2VzdCB2YWx1ZSBpcyBjb25zaWRlcmVkIGZvciB0aGUgc3VidHJhY3Rpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIE9uIFNUTTMyV0IsIHNvbWUgZmFzdCBjaGFubmVscyBhcmUgYXZhaWxhYmxlOiBmYXN0IGFuYWxvZyBpbnB1dHMKKyAgKiAgICAgICAgIGNvbWluZyBmcm9tIEdQSU8gcGFkcyAoQURDX0lOMS4uNSkuCisgICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjEgICAgIE9GRlNFVDEgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMSAgICAgT0ZGU0VUMV9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDIgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlIzICAgICBPRkZTRVQzX0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDMgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFxuCisgICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0NIICAgICBMTF9BRENfU2V0T2Zmc2V0XG4KKyAgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDQgICAgICAgIExMX0FEQ19TZXRPZmZzZXRcbgorICAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9FTiAgICAgTExfQURDX1NldE9mZnNldAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEBwYXJhbSAgT2Zmc2V0TGV2ZWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPZmZzZXQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHksIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE9mZnNldExldmVsKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19PRlIxX09GRlNFVDFfRU4gfCBBRENfT0ZSMV9PRkZTRVQxX0NIIHwgQURDX09GUjFfT0ZGU0VUMSwKKyAgICAgICAgICAgICBBRENfT0ZSMV9PRkZTRVQxX0VOIHwgKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgfCBPZmZzZXRMZXZlbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0OgorICAqICAgICAgICAgQ2hhbm5lbCB0byB3aGljaCB0aGUgb2Zmc2V0IHByb2dyYW1tZWQgd2lsbCBiZSBhcHBsaWVkCisgICogICAgICAgICAoaW5kZXBlbmRlbnRseSBvZiBjaGFubmVsIG1hcHBlZCBvbiBBREMgZ3JvdXAgcmVndWxhcgorICAqICAgICAgICAgb3IgZ3JvdXAgaW5qZWN0ZWQpCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogQG5vdGUgICBPbiBTVE0zMldCLCBzb21lIGZhc3QgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZTogZmFzdCBhbmFsb2cgaW5wdXRzCisgICogICAgICAgICBjb21pbmcgZnJvbSBHUElPIHBhZHMgKEFEQ19JTjEuLjUpLgorICAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMV9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWxcbgorICAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNF9DSCAgICAgTExfQURDX0dldE9mZnNldENoYW5uZWwKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuXG4KKyAgKiAgICAgICAgICg0KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPZmZzZXR5KQoreworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KSBSRUFEX0JJVCgqcHJlZywgQURDX09GUjFfT0ZGU0VUMV9DSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0OgorICAqICAgICAgICAgT2Zmc2V0IGxldmVsIChvZmZzZXQgdG8gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSByYXcKKyAgKiAgICAgICAgIGNvbnZlcnRlZCBkYXRhKS4KKyAgKiBAbm90ZSAgIENhdXRpb246IE9mZnNldCBmb3JtYXQgaXMgZGVwZW5kZW50IHRvIEFEQyByZXNvbHV0aW9uOgorICAqICAgICAgICAgb2Zmc2V0IGhhcyB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDExLCB0aGUgTFNCIChyaWdodCBiaXRzKQorICAqICAgICAgICAgYXJlIHNldCB0byAwLgorICAqIEBybXRvbGwgT0ZSMSAgICAgT0ZGU0VUMSAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsXG4KKyAgKiAgICAgICAgIE9GUjIgICAgIE9GRlNFVDIgICAgICAgIExMX0FEQ19HZXRPZmZzZXRMZXZlbFxuCisgICogICAgICAgICBPRlIzICAgICBPRkZTRVQzICAgICAgICBMTF9BRENfR2V0T2Zmc2V0TGV2ZWxcbgorICAqICAgICAgICAgT0ZSNCAgICAgT0ZGU0VUNCAgICAgICAgTExfQURDX0dldE9mZnNldExldmVsCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgT2Zmc2V0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfNAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T2Zmc2V0TGV2ZWwoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE9mZnNldHkpCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsKKyAgCisgIHJldHVybiAodWludDMyX3QpIFJFQURfQklUKCpwcmVnLCBBRENfT0ZSMV9PRkZTRVQxKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZm9yIHRoZSBBREMgc2VsZWN0ZWQgb2Zmc2V0IG51bWJlciAxLCAyLCAzIG9yIDQ6CisgICogICAgICAgICBmb3JjZSBvZmZzZXQgc3RhdGUgZGlzYWJsZSBvciBlbmFibGUKKyAgKiAgICAgICAgIHdpdGhvdXQgbW9kaWZ5aW5nIG9mZnNldCBjaGFubmVsIG9yIG9mZnNldCB2YWx1ZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG5lZWRlZCBvbmx5IGluIGNhc2Ugb2Ygb2Zmc2V0IHRvIGJlCisgICogICAgICAgICBlbmFibGVkLWRpc2FibGVkIGR5bmFtaWNhbGx5LCBhbmQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgaW4gb3RoZXIgY2FzZXM6CisgICogICAgICAgICBmdW5jdGlvbiBMTF9BRENfU2V0T2Zmc2V0KCkgYXV0b21hdGljYWxseSBlbmFibGVzIHRoZSBvZmZzZXQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIE9GUjEgICAgIE9GRlNFVDFfRU4gICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZVxuCisgICogICAgICAgICBPRlIyICAgICBPRkZTRVQyX0VOICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGVcbgorICAqICAgICAgICAgT0ZSMyAgICAgT0ZGU0VUM19FTiAgICAgTExfQURDX1NldE9mZnNldFN0YXRlXG4KKyAgKiAgICAgICAgIE9GUjQgICAgIE9GRlNFVDRfRU4gICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9mZnNldHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT0ZGU0VUXzQKKyAgKiBAcGFyYW0gIE9mZnNldFN0YXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF9FTkFCTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT2Zmc2V0eSwgdWludDMyX3QgT2Zmc2V0U3RhdGUpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5PRlIxLCBPZmZzZXR5KTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX09GUjFfT0ZGU0VUMV9FTiwKKyAgICAgICAgICAgICBPZmZzZXRTdGF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZvciB0aGUgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgMSwgMiwgMyBvciA0OgorICAqICAgICAgICAgb2Zmc2V0IHN0YXRlIGRpc2FibGVkIG9yIGVuYWJsZWQuCisgICogQHJtdG9sbCBPRlIxICAgICBPRkZTRVQxX0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGVcbgorICAqICAgICAgICAgT0ZSMiAgICAgT0ZGU0VUMl9FTiAgICAgTExfQURDX0dldE9mZnNldFN0YXRlXG4KKyAgKiAgICAgICAgIE9GUjMgICAgIE9GRlNFVDNfRU4gICAgIExMX0FEQ19HZXRPZmZzZXRTdGF0ZVxuCisgICogICAgICAgICBPRlI0ICAgICBPRkZTRVQ0X0VOICAgICBMTF9BRENfR2V0T2Zmc2V0U3RhdGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBPZmZzZXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09GRlNFVF80CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PRkZTRVRfRU5BQkxFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE9mZnNldFN0YXRlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBPZmZzZXR5KQoreworICByZWdpc3RlciBjb25zdCBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+T0ZSMSwgT2Zmc2V0eSk7CisgIAorICByZXR1cm4gKHVpbnQzMl90KSBSRUFEX0JJVCgqcHJlZywgQURDX09GUjFfT0ZGU0VUMV9FTik7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfUmVndWxhciBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6IGdyb3VwIHJlZ3VsYXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZyBlZGdlIAorICAqICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyCisgICogICAgICAgICBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAgKiAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19TZXRUcmlnZ2VyRWRnZSgpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IgICAgIEVYVFNFTCAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlclNvdXJjZVxuCisgICogICAgICAgICBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnZ2VyU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX1NPRlRXQVJFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0VYVElfTElORTExCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4gfCBBRENfQ0ZHUl9FWFRTRUwsIFRyaWdnZXJTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAqIEBub3RlICAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgZ3JvdXAgcmVndWxhciB0cmlnZ2VyIHNvdXJjZSBpcworICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCwgd2l0aG91dCBkZXRhaWwKKyAgKiAgICAgICAgIG9mIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIChlcXVpdmFsZW50IHRvIAorICAqICAgICAgICAgImlmKExMX0FEQ19SRUdfR2V0VHJpZ2dlclNvdXJjZShBREMxKSA9PSBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUpIikKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBDRkdSICAgICBFWFRTRUwgICAgICAgICBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9USU0yX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfVFJJR19FWFRfRVhUSV9MSU5FMTEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFRyaWdnZXJTb3VyY2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgVHJpZ2dlclNvdXJjZSA9IFJFQURfQklUKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0VYVFNFTCB8IEFEQ19DRkdSX0VYVEVOKTsKKyAgCisgIC8qIFZhbHVlIGZvciBzaGlmdCBvZiB7MDsgNDsgODsgMTJ9IGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBiaXRmaWVsZCAgICAgICAgICAqLworICAvKiBjb3JyZXNwb25kaW5nIHRvIEFEQ19DRkdSX0VYVEVOIHswOyAxOyAyOyAzfS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgdWludDMyX3QgU2hpZnRFeHRlbiA9ICgoVHJpZ2dlclNvdXJjZSAmIEFEQ19DRkdSX0VYVEVOKSA+PiAoQURDX1JFR19UUklHX0VYVEVOX0JJVE9GRlNFVF9QT1MgLSAyVUwpKTsKKyAgCisgIC8qIFNldCBiaXRmaWVsZCBjb3JyZXNwb25kaW5nIHRvIEFEQ19DRkdSX0VYVEVOIGFuZCBBRENfQ0ZHUl9FWFRTRUwgICAgICAgICAqLworICAvKiB0byBtYXRjaCB3aXRoIHRyaWdnZXJzIGxpdGVyYWxzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmV0dXJuICgoVHJpZ2dlclNvdXJjZQorICAgICAgICAgICAmIChBRENfUkVHX1RSSUdfU09VUkNFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUl9FWFRTRUwpCisgICAgICAgICAgfCAoKEFEQ19SRUdfVFJJR19FREdFX01BU0sgPj4gU2hpZnRFeHRlbikgJiBBRENfQ0ZHUl9FWFRFTikKKyAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2UgaW50ZXJuYWwgKFNXIHN0YXJ0KQorICAqICAgICAgICAgb3IgZXh0ZXJuYWwuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIHJlZ3VsYXIgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsCisgICogICAgICAgICB0byBkZXRlcm1pbmUgd2hpY2ggcGVyaXBoZXJhbCBpcyBzZWxlY3RlZCBhcyBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX1JFR19HZXRUcmlnZ2VyU291cmNlKCkuCisgICogQHJtdG9sbCBDRkdSICAgICBFWFRFTiAgICAgICAgICBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSAiMCIgaWYgdHJpZ2dlciBzb3VyY2UgZXh0ZXJuYWwgdHJpZ2dlcgorICAqICAgICAgICAgVmFsdWUgIjEiIGlmIHRyaWdnZXIgc291cmNlIFNXIHN0YXJ0LgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4pID09IChMTF9BRENfUkVHX1RSSUdfU09GVFdBUkUgJiBBRENfQ0ZHUl9FWFRFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiB0cmlnZ2VyIHBvbGFyaXR5LgorICAqIEBub3RlICAgQXBwbGljYWJsZSBvbmx5IGZvciB0cmlnZ2VyIHNvdXJjZSBzZXQgdG8gZXh0ZXJuYWwgdHJpZ2dlci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IgICAgIEVYVEVOICAgICAgICAgIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRVhURU4sIEV4dGVybmFsVHJpZ2dlckVkZ2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuCisgICogQG5vdGUgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgRVhURU4gICAgICAgICAgTExfQURDX1JFR19HZXRUcmlnZ2VyRWRnZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFRyaWdnZXJFZGdlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9FWFRFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4KKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBmZWF0dXJlczoKKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgZnVsbHkgY29uZmlndXJhYmxlCisgICogICAgICAgICAgIChmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIiBhdmFpbGFibGUpOgorICAqICAgICAgICAgICBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsgYWZmZWN0YXRpb24gdG8gYSBjaGFubmVsCisgICogICAgICAgICAgIGFyZSBjb25maWd1cmFibGUuCisgICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgICAgc2NhbiBkaXJlY3Rpb24gaXMgZm9yd2FyZCAoZnJvbSByYW5rIDEgdG8gcmFuayBuKS4KKyAgKiAgICAgICAgICAgU2VxdWVuY2VyIHJhbmtzIGFyZSBzZWxlY3RlZCB1c2luZworICAqICAgICAgICAgICBmdW5jdGlvbiAiTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rcygpIi4KKyAgKiAgICAgICAgIC0gRm9yIGRldmljZXMgd2l0aCBzZXF1ZW5jZXIgbm90IGZ1bGx5IGNvbmZpZ3VyYWJsZQorICAqICAgICAgICAgICAoZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyQ2hhbm5lbHMoKSIgYXZhaWxhYmxlKToKKyAgKiAgICAgICAgICAgc2VxdWVuY2VyIGxlbmd0aCBhbmQgZWFjaCByYW5rIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbAorICAqICAgICAgICAgICBhcmUgZGVmaW5lZCBieSBjaGFubmVsIG51bWJlci4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb25maWd1cmF0aW9uIG9mOgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzCisgICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwKKyAgKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bworICAqICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLgorICAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgU1FSMSAgICAgTCAgICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTBSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzExUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE0UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTZSQU5LUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJMZW5ndGgoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MpCit7CisgIE1PRElGWV9SRUcoQURDeC0+U1FSMSwgQURDX1NRUjFfTCwgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBsZW5ndGggYW5kIHNjYW4gZGlyZWN0aW9uLgorICAqIEBub3RlICAgRGVzY3JpcHRpb24gb2YgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGZlYXR1cmVzOgorICAqICAgICAgICAgLSBGb3IgZGV2aWNlcyB3aXRoIHNlcXVlbmNlciBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGNvbmZpZ3VyYWJsZS4KKyAgKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXM6CisgICogICAgICAgICAgIC0gU2VxdWVuY2UgbGVuZ3RoOiBOdW1iZXIgb2YgcmFua3MgaW4gdGhlIHNjYW4gc2VxdWVuY2UuCisgICogICAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogICAgICAgICAgIFNlcXVlbmNlciByYW5rcyBhcmUgc2VsZWN0ZWQgdXNpbmcKKyAgKiAgICAgICAgICAgZnVuY3Rpb24gIkxMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKSIuCisgICogICAgICAgICAtIEZvciBkZXZpY2VzIHdpdGggc2VxdWVuY2VyIG5vdCBmdWxseSBjb25maWd1cmFibGUKKyAgKiAgICAgICAgICAgKGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiIGF2YWlsYWJsZSk6CisgICogICAgICAgICAgIHNlcXVlbmNlciBsZW5ndGggYW5kIGVhY2ggcmFuayBhZmZlY3RhdGlvbiB0byBhIGNoYW5uZWwKKyAgKiAgICAgICAgICAgYXJlIGRlZmluZWQgYnkgY2hhbm5lbCBudW1iZXIuCisgICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlIGlzCisgICogICAgICAgICAgICAgZGVmaW5lZCBieSBudW1iZXIgb2YgY2hhbm5lbHMgc2V0IGluIHRoZSBzZXF1ZW5jZSwKKyAgKiAgICAgICAgICAgICByYW5rIG9mIGVhY2ggY2hhbm5lbCBpcyBmaXhlZCBieSBjaGFubmVsIEhXIG51bWJlci4KKyAgKiAgICAgICAgICAgICAoY2hhbm5lbCAwIGZpeGVkIG9uIHJhbmsgMCwgY2hhbm5lbCAxIGZpeGVkIG9uIHJhbmsxLCAuLi4pLgorICAqICAgICAgICAgICAtIFNlcXVlbmNlIGRpcmVjdGlvbjogVW5sZXNzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXJzLCBzZXF1ZW5jZXIKKyAgKiAgICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIGxvd2VzdCBjaGFubmVsIG51bWJlciB0bworICAqICAgICAgICAgICAgIGhpZ2hlc3QgY2hhbm5lbCBudW1iZXIpLgorICAqICAgICAgICAgICBTZXF1ZW5jZXIgcmFua3MgYXJlIHNlbGVjdGVkIHVzaW5nCisgICogICAgICAgICAgIGZ1bmN0aW9uICJMTF9BRENfUkVHX1NldFNlcXVlbmNlckNoYW5uZWxzKCkiLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBybXRvbGwgU1FSMSAgICAgTCAgICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzdSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzhSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEwUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMVJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEzUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE2UkFOS1MKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+U1FSMSwgQURDX1NRUjFfTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBncm91cCByZWd1bGFyIAorICAqICAgICAgICAgY29udGludW91cyBtb2RlIGFuZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGVuYWJsZSBib3RoIEFEQyBhdXRvLWluamVjdGVkIG1vZGUKKyAgKiAgICAgICAgIGFuZCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBncm91cCByZWd1bGFyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgRElTQ0VOICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJEaXNjb250XG4KKyAgKiAgICAgICAgIENGR1IgICAgIERJU0NOVU0gICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlcURpc2NvbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzFSQU5LCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF81UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzZSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfN1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF84UkFOS1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2VxRGlzY29udCkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9ESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNLCBTZXFEaXNjb250KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToKKyAgKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQKKyAgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAgKiBAcm10b2xsIENGR1IgICAgIERJU0NFTiAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udFxuCisgICogICAgICAgICBDRkdSICAgICBESVNDTlVNICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlckRpc2NvbnQKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTksKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF80UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19TRVFfRElTQ09OVF83UkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyRGlzY29udChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNjYW4gc2VxdWVuY2UgcmFuay4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY29uZmlndXJhdGlvbiBvZjoKKyAgKiAgICAgICAgIC0gQ2hhbm5lbHMgb3JkZXJpbmcgaW50byBlYWNoIHJhbmsgb2Ygc2NhbiBzZXF1ZW5jZToKKyAgKiAgICAgICAgICAgd2hhdGV2ZXIgY2hhbm5lbCBjYW4gYmUgcGxhY2VkIGludG8gd2hhdGV2ZXIgcmFuay4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcworICAqICAgICAgICAgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAgKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdG8gbWVhc3VyZSBpbnRlcm5hbCBjaGFubmVscyAoVnJlZkludCwKKyAgKiAgICAgICAgIFRlbXBTZW5zb3IsIC4uLiksIG1lYXN1cmVtZW50IHBhdGhzIHRvIGludGVybmFsIGNoYW5uZWxzIG11c3QgYmUKKyAgKiAgICAgICAgIGVuYWJsZWQgc2VwYXJhdGVseS4KKyAgKiAgICAgICAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIFNRUjEgICAgIFNRMSAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1EyICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTMgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRNCAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E1ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTYgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRNyAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E4ICAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTkgICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTAgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExMSAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTEyICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTMgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExNCAgICAgICAgICAgTExfQURDX1JFR19TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVI0ICAgICBTUTE1ICAgICAgICAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjQgICAgIFNRMTYgICAgICAgICAgIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS182CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS185CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzE2CisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmssIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkNoYW5uZWwiIHdpdGggYml0cyBwb3NpdGlvbiAgICAgICAgICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiUmFuayIuICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiUmFuayIgYW5kICJDaGFubmVsIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U1FSMSwgKChSYW5rICYgQURDX1JFR19TUVJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfU1FSWF9SRUdPRkZTRVRfUE9TKSk7CisgIAorICBNT0RJRllfUkVHKCpwcmVnLAorICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSwKKyAgICAgICAgICAgICAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIDw8IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNjYW4gc2VxdWVuY2UgcmFuay4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlciBpcworICAqICAgICAgICAgZnVsbHkgY29uZmlndXJhYmxlOiBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBlYWNoIHJhbmsKKyAgKiAgICAgICAgIGFmZmVjdGF0aW9uIHRvIGEgY2hhbm5lbCBhcmUgY29uZmlndXJhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aCgpLgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIGRldmljZXMgYW5kIHBhY2thZ2VzLCBzb21lIGNoYW5uZWxzIG1heSBub3QgYmUgYXZhaWxhYmxlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCBmb3IgY2hhbm5lbHMgYXZhaWxhYmlsaXR5LgorICAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6CisgICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbgorICAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcKKyAgKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uCisgICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6CisgICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqIEBybXRvbGwgU1FSMSAgICAgU1ExICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIxICAgICBTUTIgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjEgICAgIFNRMyAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMSAgICAgU1E0ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTUgICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNRNiAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMiAgICAgU1E3ICAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIyICAgICBTUTggICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjIgICAgIFNROSAgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExMCAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTExICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjMgICAgIFNRMTIgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSMyAgICAgU1ExMyAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBTUVIzICAgICBTUTE0ICAgICAgICAgICBMTF9BRENfUkVHX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIFNRUjQgICAgIFNRMTUgICAgICAgICAgIExMX0FEQ19SRUdfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgU1FSNCAgICAgU1ExNiAgICAgICAgICAgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfUkFOS184CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19SQU5LXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX1JBTktfMTYKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQgICAgICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SICAgKDQpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVCAgICAgICAgICg0KQorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS5cbgorICAqICAgICAgICAgKDQpIEZvciBBREMgY2hhbm5lbCByZWFkIGJhY2sgZnJvbSBBREMgcmVnaXN0ZXIsCisgICogICAgICAgICAgICAgY29tcGFyaXNvbiB3aXRoIGludGVybmFsIGNoYW5uZWwgcGFyYW1ldGVyIHRvIGJlIGRvbmUKKyAgKiAgICAgICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX0lOVEVSTkFMX1RPX0VYVEVSTkFMKCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRTZXF1ZW5jZXJSYW5rcyhBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgUmFuaykKK3sKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlNRUjEsICgoUmFuayAmIEFEQ19SRUdfU1FSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX1NRUlhfUkVHT0ZGU0VUX1BPUykpOworICAKKyAgcmV0dXJuICh1aW50MzJfdCkgKChSRUFEX0JJVCgqcHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLX1BPU0JJVDAgPDwgKFJhbmsgJiBBRENfUkVHX1JBTktfSURfU1FSWF9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgID4+IChSYW5rICYgQURDX1JFR19SQU5LX0lEX1NRUlhfTUFTSykpIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TCisgICAgICAgICAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSBvbiBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIERlc2NyaXB0aW9uIG9mIEFEQyBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZToKKyAgKiAgICAgICAgIC0gc2luZ2xlIG1vZGU6IG9uZSBjb252ZXJzaW9uIHBlciB0cmlnZ2VyCisgICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZTogYWZ0ZXIgdGhlIGZpcnN0IHRyaWdnZXIsIGZvbGxvd2luZworICAqICAgICAgICAgICBjb252ZXJzaW9ucyBsYXVuY2hlZCBzdWNjZXNzaXZlbHkgYXV0b21hdGljYWxseS4KKyAgKiBAbm90ZSAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUgYm90aCBBREMgZ3JvdXAgcmVndWxhciAKKyAgKiAgICAgICAgIGNvbnRpbnVvdXMgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IgICAgIENPTlQgICAgICAgICAgIExMX0FEQ19SRUdfU2V0Q29udGludW91c01vZGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBDb250aW51b3VzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX1NJTkdMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfQ09OVl9DT05USU5VT1VTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldENvbnRpbnVvdXNNb2RlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDb250aW51b3VzKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsIEFEQ19DRkdSX0NPTlQsIENvbnRpbnVvdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBEZXNjcmlwdGlvbiBvZiBBREMgY29udGludW91cyBjb252ZXJzaW9uIG1vZGU6CisgICogICAgICAgICAtIHNpbmdsZSBtb2RlOiBvbmUgY29udmVyc2lvbiBwZXIgdHJpZ2dlcgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGU6IGFmdGVyIHRoZSBmaXJzdCB0cmlnZ2VyLCBmb2xsb3dpbmcKKyAgKiAgICAgICAgICAgY29udmVyc2lvbnMgbGF1bmNoZWQgc3VjY2Vzc2l2ZWx5IGF1dG9tYXRpY2FsbHkuCisgICogQHJtdG9sbCBDRkdSICAgICBDT05UICAgICAgICAgICBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0NPTlZfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19DT05WX0NPTlRJTlVPVVMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfUkVHX0dldENvbnRpbnVvdXNNb2RlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9DT05UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSB0cmFuc2Zlcjogbm8gdHJhbnNmZXIgb3IKKyAgKiAgICAgICAgIHRyYW5zZmVyIGJ5IERNQSwgYW5kIERNQSByZXF1ZXN0cyBtb2RlLgorICAqIEBub3RlICAgSWYgdHJhbnNmZXIgYnkgRE1BIHNlbGVjdGVkLCBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0cworICAqICAgICAgICAgbW9kZToKKyAgKiAgICAgICAgIC0gTGltaXRlZCBtb2RlIChPbmUgc2hvdCBtb2RlKTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSBzdG9wcGVkCisgICogICAgICAgICAgIHdoZW4gbnVtYmVyIG9mIERNQSBkYXRhIHRyYW5zZmVycyAobnVtYmVyIG9mCisgICogICAgICAgICAgIEFEQyBjb252ZXJzaW9ucykgaXMgcmVhY2hlZC4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgbm9uLWNpcmN1bGFyLgorICAqICAgICAgICAgLSBVbmxpbWl0ZWQgbW9kZTogRE1BIHRyYW5zZmVyIHJlcXVlc3RzIGFyZSB1bmxpbWl0ZWQsCisgICogICAgICAgICAgIHdoYXRldmVyIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpLgorICAqICAgICAgICAgICBUaGlzIEFEQyBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBETUEgbW9kZSBjaXJjdWxhci4KKyAgKiBAbm90ZSAgIElmIEFEQyBETUEgcmVxdWVzdHMgbW9kZSBpcyBzZXQgdG8gdW5saW1pdGVkIGFuZCBETUEgaXMgc2V0IHRvCisgICogICAgICAgICBtb2RlIG5vbi1jaXJjdWxhcjoKKyAgKiAgICAgICAgIHdoZW4gRE1BIHRyYW5zZmVycyBzaXplIHdpbGwgYmUgcmVhY2hlZCwgRE1BIHdpbGwgc3RvcCB0cmFuc2ZlcnMgb2YKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9ucyBkYXRhIEFEQyB3aWxsIHJhaXNlIGFuIG92ZXJydW4gZXJyb3IKKyAgKiAgICAgICAgKG92ZXJydW4gZmxhZyBhbmQgaW50ZXJydXB0aW9uIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIERNQSBzb3VyY2UgYWRkcmVzcyAocGVyaXBoZXJhbCBhZGRyZXNzKSwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19ETUFfR2V0UmVnQWRkcigpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDRkdSICAgICBETUFFTiAgICAgICAgICBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENGR1IgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfU2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBETUFUcmFuc2ZlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1NldERNQVRyYW5zZmVyKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBETUFUcmFuc2ZlcikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9ETUFFTiB8IEFEQ19DRkdSX0RNQUNGRywgRE1BVHJhbnNmZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yCisgICogICAgICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZS4KKyAgKiBAbm90ZSAgIElmIHRyYW5zZmVyIGJ5IERNQSBzZWxlY3RlZCwgc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdHMKKyAgKiAgICAgICAgIG1vZGU6CisgICogICAgICAgICAtIExpbWl0ZWQgbW9kZSAoT25lIHNob3QgbW9kZSk6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgc3RvcHBlZAorICAqICAgICAgICAgICB3aGVuIG51bWJlciBvZiBETUEgZGF0YSB0cmFuc2ZlcnMgKG51bWJlciBvZgorICAqICAgICAgICAgICBBREMgY29udmVyc2lvbnMpIGlzIHJlYWNoZWQuCisgICogICAgICAgICAgIFRoaXMgQURDIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIERNQSBtb2RlIG5vbi1jaXJjdWxhci4KKyAgKiAgICAgICAgIC0gVW5saW1pdGVkIG1vZGU6IERNQSB0cmFuc2ZlciByZXF1ZXN0cyBhcmUgdW5saW1pdGVkLAorICAqICAgICAgICAgICB3aGF0ZXZlciBudW1iZXIgb2YgRE1BIGRhdGEgdHJhbnNmZXJzIChudW1iZXIgb2YKKyAgKiAgICAgICAgICAgQURDIGNvbnZlcnNpb25zKS4KKyAgKiAgICAgICAgICAgVGhpcyBBREMgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggRE1BIG1vZGUgY2lyY3VsYXIuCisgICogQG5vdGUgICBJZiBBREMgRE1BIHJlcXVlc3RzIG1vZGUgaXMgc2V0IHRvIHVubGltaXRlZCBhbmQgRE1BIGlzIHNldCB0bworICAqICAgICAgICAgbW9kZSBub24tY2lyY3VsYXI6CisgICogICAgICAgICB3aGVuIERNQSB0cmFuc2ZlcnMgc2l6ZSB3aWxsIGJlIHJlYWNoZWQsIERNQSB3aWxsIHN0b3AgdHJhbnNmZXJzIG9mCisgICogICAgICAgICBBREMgY29udmVyc2lvbnMgZGF0YSBBREMgd2lsbCByYWlzZSBhbiBvdmVycnVuIGVycm9yCisgICogICAgICAgICAob3ZlcnJ1biBmbGFnIGFuZCBpbnRlcnJ1cHRpb24gaWYgZW5hYmxlZCkuCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgRE1BIHNvdXJjZSBhZGRyZXNzIChwZXJpcGhlcmFsIGFkZHJlc3MpLAorICAqICAgICAgICAgdXNlIGZ1bmN0aW9uIEByZWYgTExfQURDX0RNQV9HZXRSZWdBZGRyKCkuCisgICogQHJtdG9sbCBDRkdSICAgICBETUFFTiAgICAgICAgICBMTF9BRENfUkVHX0dldERNQVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENGR1IgICAgIERNQUNGRyAgICAgICAgIExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9MSU1JVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19ETUFfVFJBTlNGRVJfVU5MSU1JVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRETUFUcmFuc2ZlcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4gfCBBRENfQ0ZHUl9ETUFDRkcpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICogICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAgKiBAbm90ZSAgIENvbXBhdGliaWxpdHkgd2l0aCBkZXZpY2VzIHdpdGhvdXQgZmVhdHVyZSBvdmVycnVuOgorICAqICAgICAgICAgb3RoZXIgZGV2aWNlcyB3aXRob3V0IHRoaXMgZmVhdHVyZSBoYXZlIGEgYmVoYXZpb3IKKyAgKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gZGF0YSBvdmVyd3JpdHRlbi4KKyAgKiAgICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmcgb2Ygb3ZlcnJ1biBpcyBkYXRhIHByZXNlcnZlZC4KKyAgKiAgICAgICAgIFRoZXJlZm9yZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgZGV2aWNlcywgcGFyYW1ldGVyCisgICogICAgICAgICBvdmVycnVuIHNob3VsZCBiZSBzZXQgdG8gZGF0YSBvdmVyd3JpdHRlbi4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IgICAgIE9WUk1PRCAgICAgICAgIExMX0FEQ19SRUdfU2V0T3ZlcnJ1bgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE92ZXJydW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX1BSRVNFUlZFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU2V0T3ZlcnJ1bihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgT3ZlcnJ1bikKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9PVlJNT0QsIE92ZXJydW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBiZWhhdmlvciBpbiBjYXNlIG9mIG92ZXJydW46CisgICogICAgICAgICBkYXRhIHByZXNlcnZlZCBvciBvdmVyd3JpdHRlbi4KKyAgKiBAcm10b2xsIENGR1IgICAgIE9WUk1PRCAgICAgICAgIExMX0FEQ19SRUdfR2V0T3ZlcnJ1bgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfUkVHX09WUl9EQVRBX09WRVJXUklUVEVOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19HZXRPdmVycnVuKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9PVlJNT0QpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfR3JvdXBfSW5qZWN0ZWQgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlOgorICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBmcm9tIGV4dGVybmFsIHBlcmlwaGVyYWwgKHRpbWVyIGV2ZW50LAorICAqICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyB0cmlnZ2VyIHNvdXJjZSB0byBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBhbHNvIHNldCB0cmlnZ2VyIHBvbGFyaXR5IHRvIHJpc2luZyBlZGdlIAorICAqICAgICAgICAgKGRlZmF1bHQgc2V0dGluZyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgQURDIG9uIG90aGVyCisgICogICAgICAgICBTVE0zMiBmYW1pbGllcyBoYXZpbmcgdGhpcyBzZXR0aW5nIHNldCBieSBIVyBkZWZhdWx0IHZhbHVlKS4KKyAgKiAgICAgICAgIEluIGNhc2Ugb2YgbmVlZCB0byBtb2RpZnkgdHJpZ2dlciBlZGdlLCB1c2UKKyAgKiAgICAgICAgIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRUcmlnZ2VyRWRnZSgpLgorICAqIEBub3RlICAgQXZhaWxhYmlsaXR5IG9mIHBhcmFtZXRlcnMgb2YgdHJpZ2dlciBzb3VyY2VzIGZyb20gdGltZXIgCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX1NldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9TZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgVHJpZ2dlclNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19TT0ZUV0FSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0xX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9UUkdPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9USU0yX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRVhUSV9MSU5FMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgVHJpZ2dlclNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOLCBUcmlnZ2VyU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBzb3VyY2U6CisgICogICAgICAgICBpbnRlcm5hbCAoU1cgc3RhcnQpIG9yIGZyb20gZXh0ZXJuYWwgcGVyaXBoZXJhbCAodGltZXIgZXZlbnQsCisgICogICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZSkuCisgICogQG5vdGUgICBUbyBkZXRlcm1pbmUgd2hldGhlciBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSBpcworICAqICAgICAgICAgaW50ZXJuYWwgKFNXIHN0YXJ0KSBvciBleHRlcm5hbCwgd2l0aG91dCBkZXRhaWwKKyAgKiAgICAgICAgIG9mIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIChlcXVpdmFsZW50IHRvIAorICAqICAgICAgICAgImlmKExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZShBREMxKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpIikKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIHRyaWdnZXIgc291cmNlcyBmcm9tIHRpbWVyIAorICAqICAgICAgICAgZGVwZW5kcyBvbiB0aW1lcnMgYXZhaWxhYmlsaXR5IG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdnZXJTb3VyY2VcbgorICAqICAgICAgICAgSlNRUiAgICAgSkVYVEVOICAgICAgICAgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRUcmlnZ2VyU291cmNlKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90IFRyaWdnZXJTb3VyY2UgPSBSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhUU0VMIHwgQURDX0pTUVJfSkVYVEVOKTsKKyAgCisgIC8qIFZhbHVlIGZvciBzaGlmdCBvZiB7MDsgNDsgODsgMTJ9IGRlcGVuZGluZyBvbiB2YWx1ZSBvZiBiaXRmaWVsZCAgICAgICAgICAqLworICAvKiBjb3JyZXNwb25kaW5nIHRvIEFEQ19KU1FSX0pFWFRFTiB7MDsgMTsgMjsgM30uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgdWludDMyX3QgU2hpZnRKZXh0ZW4gPSAoKFRyaWdnZXJTb3VyY2UgJiBBRENfSlNRUl9KRVhURU4pID4+IChBRENfSU5KX1RSSUdfRVhURU5fQklUT0ZGU0VUX1BPUyAtIDJVTCkpOworICAKKyAgLyogU2V0IGJpdGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gQURDX0pTUVJfSkVYVEVOIGFuZCBBRENfSlNRUl9KRVhUU0VMICAgICAgICovCisgIC8qIHRvIG1hdGNoIHdpdGggdHJpZ2dlcnMgbGl0ZXJhbHMgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZXR1cm4gKChUcmlnZ2VyU291cmNlCisgICAgICAgICAgICYgKEFEQ19JTkpfVFJJR19TT1VSQ0VfTUFTSyA+PiBTaGlmdEpleHRlbikgJiBBRENfSlNRUl9KRVhUU0VMKQorICAgICAgICAgIHwgKChBRENfSU5KX1RSSUdfRURHRV9NQVNLID4+IFNoaWZ0SmV4dGVuKSAmIEFEQ19KU1FSX0pFWFRFTikKKyAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGludGVybmFsIChTVyBzdGFydCkKKyAgICAgICAgICAgIG9yIGV4dGVybmFsCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGdyb3VwIGluamVjdGVkIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLAorICAqICAgICAgICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHBlcmlwaGVyYWwgaXMgc2VsZWN0ZWQgYXMgZXh0ZXJuYWwgdHJpZ2dlciwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZS4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfSXNUcmlnZ2VyU291cmNlU1dTdGFydAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlICIwIiBpZiB0cmlnZ2VyIHNvdXJjZSBleHRlcm5hbCB0cmlnZ2VyCisgICogICAgICAgICBWYWx1ZSAiMSIgaWYgdHJpZ2dlciBzb3VyY2UgU1cgc3RhcnQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KRVhURU4pID09IChMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUgJiBBRENfSlNRUl9KRVhURU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXIgcG9sYXJpdHkuCisgICogICAgICAgICBBcHBsaWNhYmxlIG9ubHkgZm9yIHRyaWdnZXIgc291cmNlIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IG5vdCBiZSBkaXNhYmxlZC4gQ2FuIGJlIGVuYWJsZWQgd2l0aCBvciB3aXRob3V0IGNvbnZlcnNpb24KKyAgKiAgICAgICAgIG9uIGdvaW5nIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIEpTUVIgICAgIEpFWFRFTiAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEV4dGVybmFsVHJpZ2dlckVkZ2UpCit7CisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwgQURDX0pTUVJfSkVYVEVOLCBFeHRlcm5hbFRyaWdnZXJFZGdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlciBwb2xhcml0eS4KKyAgKiAgICAgICAgIEFwcGxpY2FibGUgb25seSBmb3IgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhURU4gICAgICAgICBMTF9BRENfSU5KX0dldFRyaWdnZXJFZGdlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0VHJpZ2dlckVkZ2UoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkpTUVIsIEFEQ19KU1FSX0pFWFRFTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvbmZpZ3VyYXRpb24gb2Y6CisgICogICAgICAgICAtIFNlcXVlbmNlIGxlbmd0aDogTnVtYmVyIG9mIHJhbmtzIGluIHRoZSBzY2FuIHNlcXVlbmNlLgorICAqICAgICAgICAgLSBTZXF1ZW5jZSBkaXJlY3Rpb246IFVubGVzcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVycywgc2VxdWVuY2VyCisgICogICAgICAgICAgIHNjYW4gZGlyZWN0aW9uIGlzIGZvcndhcmQgKGZyb20gcmFuayAxIHRvIHJhbmsgbikuCisgICogQG5vdGUgICBTZXF1ZW5jZXIgZGlzYWJsZWQgaXMgZXF1aXZhbGVudCB0byBzZXF1ZW5jZXIgb2YgMSByYW5rOgorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gb24gb25seSAxIGNoYW5uZWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3Qgbm90IGJlIGRpc2FibGVkLiBDYW4gYmUgZW5hYmxlZCB3aXRoIG9yIHdpdGhvdXQgY29udmVyc2lvbgorICAqICAgICAgICAgb24gZ29pbmcgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgSlNRUiAgICAgSkwgICAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBTZXF1ZW5jZXJOYlJhbmtzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfMlJBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfM1JBTktTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFNlcXVlbmNlckxlbmd0aChBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2VxdWVuY2VyTmJSYW5rcykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5KU1FSLCBBRENfSlNRUl9KTCwgU2VxdWVuY2VyTmJSYW5rcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgbGVuZ3RoIGFuZCBzY2FuIGRpcmVjdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzOgorICAqICAgICAgICAgLSBTZXF1ZW5jZSBsZW5ndGg6IE51bWJlciBvZiByYW5rcyBpbiB0aGUgc2NhbiBzZXF1ZW5jZS4KKyAgKiAgICAgICAgIC0gU2VxdWVuY2UgZGlyZWN0aW9uOiBVbmxlc3Mgc3BlY2lmaWVkIGluIHBhcmFtZXRlcnMsIHNlcXVlbmNlcgorICAqICAgICAgICAgICBzY2FuIGRpcmVjdGlvbiBpcyBmb3J3YXJkIChmcm9tIHJhbmsgMSB0byByYW5rIG4pLgorICAqIEBub3RlICAgU2VxdWVuY2VyIGRpc2FibGVkIGlzIGVxdWl2YWxlbnQgdG8gc2VxdWVuY2VyIG9mIDEgcmFuazoKKyAgKiAgICAgICAgIEFEQyBjb252ZXJzaW9uIG9uIG9ubHkgMSBjaGFubmVsLgorICAqIEBybXRvbGwgSlNRUiAgICAgSkwgICAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJMZW5ndGgKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzRSQU5LUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyTGVuZ3RoKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5KU1FSLCBBRENfSlNRUl9KTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZToKKyAgKiAgICAgICAgIHNlcXVlbmNlIHN1YmRpdmlkZWQgYW5kIHNjYW4gY29udmVyc2lvbnMgaW50ZXJydXB0ZWQgZXZlcnkgc2VsZWN0ZWQKKyAgKiAgICAgICAgIG51bWJlciBvZiByYW5rcy4KKyAgKiBAbm90ZSAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBlbmFibGUgYm90aCBBREMgZ3JvdXAgaW5qZWN0ZWQKKyAgKiAgICAgICAgIGF1dG8taW5qZWN0ZWQgbW9kZSBhbmQgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgIEpESVNDRU4gICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlcURpc2NvbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UXzFSQU5LCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFNlcXVlbmNlckRpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFNlcURpc2NvbnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkRJU0NFTiwgU2VxRGlzY29udCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXIgZGlzY29udGludW91cyBtb2RlOgorICAqICAgICAgICAgc2VxdWVuY2Ugc3ViZGl2aWRlZCBhbmQgc2NhbiBjb252ZXJzaW9ucyBpbnRlcnJ1cHRlZCBldmVyeSBzZWxlY3RlZAorICAqICAgICAgICAgbnVtYmVyIG9mIHJhbmtzLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgSkRJU0NFTiAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJEaXNjb250CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9ESVNDT05UXzFSQU5LCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJEaXNjb250KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSLCBBRENfQ0ZHUl9KRElTQ0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNlcXVlbmNlIHJhbmsuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBub3RlICAgT24gU1RNMzJXQiwgc29tZSBmYXN0IGNoYW5uZWxzIGFyZSBhdmFpbGFibGU6IGZhc3QgYW5hbG9nIGlucHV0cworICAqICAgICAgICAgY29taW5nIGZyb20gR1BJTyBwYWRzIChBRENfSU4xLi41KS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBKU1FSICAgICBKU1ExICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTIgICAgICAgICAgIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRMyAgICAgICAgICAgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1E0ICAgICAgICAgICBMTF9BRENfSU5KX1NldFNlcXVlbmNlclJhbmtzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmssIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkNoYW5uZWwiIHdpdGggYml0cyBwb3NpdGlvbiAgICAgICAgICAqLworICAvKiBpbiByZWdpc3RlciBkZXBlbmRpbmcgb24gcGFyYW1ldGVyICJSYW5rIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiUmFuayIgYW5kICJDaGFubmVsIiBhcmUgdXNlZCB3aXRoIG1hc2tzIGJlY2F1c2UgY29udGFpbmluZyAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkpTUVIsCisgICAgICAgICAgICAgKEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSA8PCAoUmFuayAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spLAorICAgICAgICAgICAgICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgPDwgKFJhbmsgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZTogY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQKKyAgKiAgICAgICAgIHNlcXVlbmNlIHJhbmsuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gZGV2aWNlcyBhbmQgcGFja2FnZXMsIHNvbWUgY2hhbm5lbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0IGZvciBjaGFubmVscyBhdmFpbGFiaWxpdHkuCisgICogQG5vdGUgICBVc2FnZSBvZiB0aGUgcmV0dXJuZWQgY2hhbm5lbCBudW1iZXI6CisgICogICAgICAgICAtIFRvIHJlaW5qZWN0IHRoaXMgY2hhbm5lbCBpbnRvIGFub3RoZXIgZnVuY3Rpb24gTExfQURDX3h4eDoKKyAgKiAgICAgICAgICAgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIG9ubHkgcGFydGx5IGZvcm1hdHRlZCBvbiBkZWZpbml0aW9uCisgICogICAgICAgICAgIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3guIFRoZXJlZm9yZSwgaXQgaGFzIHRvIGJlIGNvbXBhcmVkCisgICogICAgICAgICAgIHdpdGggcGFydHMgb2YgbGl0ZXJhbHMgTExfQURDX0NIQU5ORUxfeCBvciB1c2luZworICAqICAgICAgICAgICBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKS4KKyAgKiAgICAgICAgICAgVGhlbiB0aGUgc2VsZWN0ZWQgbGl0ZXJhbCBMTF9BRENfQ0hBTk5FTF94IGNhbiBiZSB1c2VkCisgICogICAgICAgICAgIGFzIHBhcmFtZXRlciBmb3IgYW5vdGhlciBmdW5jdGlvbi4KKyAgKiAgICAgICAgIC0gVG8gZ2V0IHRoZSBjaGFubmVsIG51bWJlciBpbiBkZWNpbWFsIGZvcm1hdDoKKyAgKiAgICAgICAgICAgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgd2l0aCB0aGUgaGVscGVyIG1hY3JvCisgICogICAgICAgICAgIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogQHJtdG9sbCBKU1FSICAgICBKU1ExICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzXG4KKyAgKiAgICAgICAgIEpTUVIgICAgIEpTUTIgICAgICAgICAgIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3NcbgorICAqICAgICAgICAgSlNRUiAgICAgSlNRMyAgICAgICAgICAgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rc1xuCisgICogICAgICAgICBKU1FSICAgICBKU1E0ICAgICAgICAgICBMTF9BRENfSU5KX0dldFNlcXVlbmNlclJhbmtzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UICAgICAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgICg0KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQgICAgICAgICAoNCkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuXG4KKyAgKiAgICAgICAgICg0KSBGb3IgQURDIGNoYW5uZWwgcmVhZCBiYWNrIGZyb20gQURDIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAgIGNvbXBhcmlzb24gd2l0aCBpbnRlcm5hbCBjaGFubmVsIHBhcmFtZXRlciB0byBiZSBkb25lCisgICogICAgICAgICAgICAgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9JTlRFUk5BTF9UT19FWFRFUk5BTCgpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChBREN4LT5KU1FSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0sgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIDw8IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpCisgICAgICAgICAgICAgICAgICAgID4+IChSYW5rICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIDw8IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gdHJpZ2dlcjoKKyAgKiAgICAgICAgIGluZGVwZW5kZW50IG9yIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGlzIG1vZGUgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycworICAqICAgICAgICAgdXBkYXRlZCBhZnRlciBvbmUgQURDIGNvbnZlcnNpb24gdHJpZ2dlciBhbmQgd2l0aCBkYXRhIAorICAqICAgICAgICAgcGVybWFuZW50bHkga2VwdCAobm90IGVyYXNlZCBieSBzdWNjZXNzaXZlIGNvbnZlcnNpb25zIG9mIHNjYW4gb2YKKyAgKiAgICAgICAgIEFEQyBzZXF1ZW5jZXIgcmFua3MpLCB1cCB0byA1IGRhdGEgcmVnaXN0ZXJzOgorICAqICAgICAgICAgMSBkYXRhIHJlZ2lzdGVyIG9uIEFEQyBncm91cCByZWd1bGFyLCA0IGRhdGEgcmVnaXN0ZXJzCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuICAgICAgICAgICAgCisgICogQG5vdGUgICBJZiBBREMgZ3JvdXAgaW5qZWN0ZWQgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgaXMgc2V0IHRvIGFuCisgICogICAgICAgICBleHRlcm5hbCB0cmlnZ2VyLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBtdXN0IGJlIHNldCB0bworICAqICAgICAgICAgaW5kZXBlbmRlbnQgdHJpZ2dlci4KKyAgKiAgICAgICAgIEFEQyBncm91cCBpbmplY3RlZCBhdXRvbWF0aWMgdHJpZ2dlciBpcyBjb21wbGlhbnQgb25seSB3aXRoIAorICAqICAgICAgICAgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2Ugc2V0IHRvIFNXIHN0YXJ0LCB3aXRob3V0IGFueSAKKyAgKiAgICAgICAgIGZ1cnRoZXIgYWN0aW9uIG9uICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBzdGFydCBvciBzdG9wOiAKKyAgKiAgICAgICAgIGluIHRoaXMgY2FzZSwgQURDIGdyb3VwIGluamVjdGVkIGlzIGNvbnRyb2xsZWQgb25seSAKKyAgKiAgICAgICAgIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBJdCBpcyBub3QgcG9zc2libGUgdG8gZW5hYmxlIGJvdGggQURDIGdyb3VwIGluamVjdGVkCisgICogICAgICAgICBhdXRvLWluamVjdGVkIG1vZGUgYW5kIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEpBVVRPICAgICAgICAgIExMX0FEQ19JTkpfU2V0VHJpZ0F1dG8KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBUcmlnQXV0byBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19GUk9NX0dSUF9SRUdVTEFSCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1NldFRyaWdBdXRvKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBUcmlnQXV0bykKK3sKKyAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLCBBRENfQ0ZHUl9KQVVUTywgVHJpZ0F1dG8pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiB0cmlnZ2VyOgorICAqICAgICAgICAgaW5kZXBlbmRlbnQgb3IgZnJvbSBBREMgZ3JvdXAgcmVndWxhci4KKyAgKiBAcm10b2xsIENGR1IgICAgIEpBVVRPICAgICAgICAgIExMX0FEQ19JTkpfR2V0VHJpZ0F1dG8KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19JTkRFUEVOREVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19GUk9NX0dSUF9SRUdVTEFSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lOSl9HZXRUcmlnQXV0byhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSkFVVE8pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIG1vZGUuCisgICogQG5vdGUgICBBIGNvbnRleHQgaXMgYSBzZXR0aW5nIG9mIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgIC0gZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlcgorICAqICAgICAgICAgLSBzZXF1ZW5jZXIgbGVuZ3RoCisgICogICAgICAgICAtIHNlcXVlbmNlciByYW5rcworICAqICAgICAgICAgSWYgY29udGV4dHMgcXVldWUgaXMgZGlzYWJsZWQ6CisgICogICAgICAgICAtIG9ubHkgMSBzZXF1ZW5jZSBjYW4gYmUgY29uZmlndXJlZAorICAqICAgICAgICAgICBhbmQgaXMgYWN0aXZlIHBlcnBldHVhbGx5LgorICAqICAgICAgICAgSWYgY29udGV4dHMgcXVldWUgaXMgZW5hYmxlZDoKKyAgKiAgICAgICAgIC0gdXAgdG8gMiBjb250ZXh0cyBjYW4gYmUgcXVldWVkCisgICogICAgICAgICAgIGFuZCBhcmUgY2hlY2tlZCBpbiBhbmQgb3V0IGFzIGEgRklGTyBzdGFjayAoZmlyc3QtaW4sIGZpcnN0LW91dCkuCisgICogICAgICAgICAtIElmIGEgbmV3IGNvbnRleHQgaXMgc2V0IHdoZW4gcXVldWVzIGlzIGZ1bGwsIGVycm9yIGlzIHRyaWdnZXJlZAorICAqICAgICAgICAgICBieSBpbnRlcnJ1cHRpb24gIkluamVjdGVkIFF1ZXVlIE92ZXJmbG93Ii4KKyAgKiAgICAgICAgIC0gVHdvIGJlaGF2aW9ycyBhcmUgcG9zc2libGUgd2hlbiBhbGwgY29udGV4dHMgaGF2ZSBiZWVuIHByb2Nlc3NlZDoKKyAgKiAgICAgICAgICAgdGhlIGNvbnRleHRzIHF1ZXVlIGNhbiBtYWludGFpbiB0aGUgbGFzdCBjb250ZXh0IGFjdGl2ZSBwZXJwZXR1YWxseQorICAqICAgICAgICAgICBvciBjYW4gYmUgZW1wdHkgYW5kIGluamVjdGVkIGdyb3VwIHRyaWdnZXJzIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIC0gVHJpZ2dlcnMgY2FuIGJlIG9ubHkgZXh0ZXJuYWwgKG5vdCBpbnRlcm5hbCBTVyBzdGFydCkKKyAgKiAgICAgICAgIC0gQ2F1dGlvbjogVGhlIHNlcXVlbmNlIG11c3QgYmUgZnVsbHkgY29uZmlndXJlZCBpbiBvbmUgdGltZQorICAqICAgICAgICAgICAob25lIHdyaXRlIG9mIHJlZ2lzdGVyIEpTUVIgbWFrZXMgYSBjaGVjay1pbiBvZiBhIG5ldyBjb250ZXh0CisgICogICAgICAgICAgIGludG8gdGhlIHF1ZXVlKS4KKyAgKiAgICAgICAgICAgVGhlcmVmb3JlIGZ1bmN0aW9ucyB0byBzZXQgc2VwYXJhdGVseSBpbmplY3RlZCB0cmlnZ2VyIGFuZAorICAqICAgICAgICAgICBzZXF1ZW5jZXIgY2hhbm5lbHMgY2Fubm90IGJlIHVzZWQsIHJlZ2lzdGVyIEpTUVIgbXVzdCBiZSBzZXQKKyAgKiAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dCgpLgorICAqIEBub3RlICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIG9ubHkgd2hlbiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQG5vdGUgICBBIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGV4dCBtb2RlIChiaXQgSlFESVMpIGNhdXNlcyB0aGUgY29udGV4dHMKKyAgKiAgICAgICAgIHF1ZXVlIHRvIGJlIGZsdXNoZWQgYW5kIHRoZSByZWdpc3RlciBKU1FSIGlzIGNsZWFyZWQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEpRTSAgICAgICAgICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEpRRElTICAgICAgICAgIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUXVldWVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19JTkpfU2V0UXVldWVNb2RlKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBRdWV1ZU1vZGUpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSlFESVMsIFF1ZXVlTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG1vZGUuCisgICogQHJtdG9sbCBDRkdSICAgICBKUU0gICAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZVxuCisgICogICAgICAgICBDRkdSICAgICBKUURJUyAgICAgICAgICBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfTEFTVF9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1FVRVVFXzJDT05URVhUU19FTkRfRU1QVFkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0dldFF1ZXVlTW9kZShBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUiwgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSlFESVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgb25lIGNvbnRleHQgb24gQURDIGdyb3VwIGluamVjdGVkIHRoYXQgd2lsbCBiZSBjaGVja2VkIGluCisgICogICAgICAgICBjb250ZXh0cyBxdWV1ZS4KKyAgKiBAbm90ZSAgIEEgY29udGV4dCBpcyBhIHNldHRpbmcgb2YgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgLSBncm91cCBpbmplY3RlZCB0cmlnZ2VyCisgICogICAgICAgICAtIHNlcXVlbmNlciBsZW5ndGgKKyAgKiAgICAgICAgIC0gc2VxdWVuY2VyIHJhbmtzCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBjb250ZXh0cyBxdWV1ZSBpcyBlbmFibGVkLAorICAqICAgICAgICAgYmVjYXVzZSB0aGUgc2VxdWVuY2UgbXVzdCBiZSBmdWxseSBjb25maWd1cmVkIGluIG9uZSB0aW1lCisgICogICAgICAgICAoZnVuY3Rpb25zIHRvIHNldCBzZXBhcmF0ZWx5IGluamVjdGVkIHRyaWdnZXIgYW5kIHNlcXVlbmNlciBjaGFubmVscworICAqICAgICAgICAgY2Fubm90IGJlIHVzZWQpOgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfSU5KX1NldFF1ZXVlTW9kZSgpLgorICAqIEBub3RlICAgSW4gdGhlIGNvbnRleHRzIHF1ZXVlLCBvbmx5IHRoZSBhY3RpdmUgY29udGV4dCBjYW4gYmUgcmVhZC4KKyAgKiAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHJlYWQgdXNpbmcgZnVuY3Rpb25zOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfR2V0VHJpZ2dlclNvdXJjZSgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9HZXRUcmlnZ2VyRWRnZSgpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rcygpCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0byBtZWFzdXJlIGludGVybmFsIGNoYW5uZWxzIChWcmVmSW50LAorICAqICAgICAgICAgVGVtcFNlbnNvciwgLi4uKSwgbWVhc3VyZW1lbnQgcGF0aHMgdG8gaW50ZXJuYWwgY2hhbm5lbHMgbXVzdCBiZQorICAqICAgICAgICAgZW5hYmxlZCBzZXBhcmF0ZWx5LgorICAqICAgICAgICAgVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBmdW5jdGlvbiBAcmVmIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaCgpLgorICAqIEBub3RlICAgT24gU1RNMzJXQiwgc29tZSBmYXN0IGNoYW5uZWxzIGFyZSBhdmFpbGFibGU6IGZhc3QgYW5hbG9nIGlucHV0cworICAqICAgICAgICAgY29taW5nIGZyb20gR1BJTyBwYWRzIChBRENfSU4xLi41KS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBub3QgYmUgZGlzYWJsZWQuIENhbiBiZSBlbmFibGVkIHdpdGggb3Igd2l0aG91dCBjb252ZXJzaW9uCisgICogICAgICAgICBvbiBnb2luZyBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBKU1FSICAgICBKRVhUU0VMICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKRVhURU4gICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKTCAgICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1ExICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1EyICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1EzICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dFxuCisgICogICAgICAgICBKU1FSICAgICBKU1E0ICAgICAgICAgICBMTF9BRENfSU5KX0NvbmZpZ1F1ZXVlQ29udGV4dAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyaWdnZXJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTJfVFJHTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1CisgICogQHBhcmFtICBFeHRlcm5hbFRyaWdnZXJFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1RSSUdfRVhUX1JJU0lOR0ZBTExJTkcKKyAgKgorICAqICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgZGlzY2FyZGVkIGluIGNhc2Ugb2YgU1cgc3RhcnQ6CisgICogICAgICAgICAgICAgICBwYXJhbWV0ZXIgIlRyaWdnZXJTb3VyY2UiIHNldCB0byAiTExfQURDX0lOSl9UUklHX1NPRlRXQVJFIi4KKyAgKiBAcGFyYW0gIFNlcXVlbmNlck5iUmFua3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8yUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MKKyAgKiBAcGFyYW0gIFJhbmsxX0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEBwYXJhbSAgUmFuazJfQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuCisgICogQHBhcmFtICBSYW5rM19DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMyAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZSRUZJTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9URU1QU0VOU09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVkJBVAorICAqICAgICAgICAgCisgICogICAgICAgICAoNykgT24gU1RNMzJXQiwgZmFzdCBjaGFubmVsICgwLjE4OCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNS4zMyBNcy9zKSkuCisgICogICAgICAgICAgICAgT3RoZXIgY2hhbm5lbHMgYXJlIHNsb3cgY2hhbm5lbHMgKDAuMjM4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA0LjIxIE1zL3MpKS4KKyAgKiBAcGFyYW0gIFJhbms0X0NoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9Db25maWdRdWV1ZUNvbnRleHQoQURDX1R5cGVEZWYgKkFEQ3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUcmlnZ2VyU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRXh0ZXJuYWxUcmlnZ2VyRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlcXVlbmNlck5iUmFua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rMV9DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUmFuazJfQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJhbmszX0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSYW5rNF9DaGFubmVsKQoreworICAvKiBTZXQgYml0cyB3aXRoIGNvbnRlbnQgb2YgcGFyYW1ldGVyICJSYW5reF9DaGFubmVsIiB3aXRoIGJpdHMgcG9zaXRpb24gICAgKi8KKyAgLyogaW4gcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIGxpdGVyYWwgIkxMX0FEQ19JTkpfUkFOS194Ii4gICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIlJhbmt4X0NoYW5uZWwiIGFuZCAiTExfQURDX0lOSl9SQU5LX3giIGFyZSB1c2VkIHdpdGggbWFza3MgICAqLworICAvKiBiZWNhdXNlIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgcGFyYW1ldGVyICJUcmlnZ2VyU291cmNlIiBpcyBzZXQgdG8gU1cgc3RhcnQsIHRoZW4gcGFyYW1ldGVyICAgICAgICAgICovCisgIC8qICJFeHRlcm5hbFRyaWdnZXJFZGdlIiBpcyBkaXNjYXJkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciB1aW50MzJfdCBpc190cmlnZ2VyX25vdF9zdyA9ICh1aW50MzJfdCkoKFRyaWdnZXJTb3VyY2UgIT0gTExfQURDX0lOSl9UUklHX1NPRlRXQVJFKSA/IDFVTCA6IDBVTCk7CisgIE1PRElGWV9SRUcoQURDeC0+SlNRUiAgICAgICAgICAgLAorICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRTRUwgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pFWFRFTiAgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTQgICAgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTMgICAgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTIgICAgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTEgICAgfAorICAgICAgICAgICAgIEFEQ19KU1FSX0pMICAgICAgICAgICwKKyAgICAgICAgICAgICBUcmlnZ2VyU291cmNlICAgICAgIHwKKyAgICAgICAgICAgICAoRXh0ZXJuYWxUcmlnZ2VyRWRnZSAqIChpc190cmlnZ2VyX25vdF9zdykpIHwKKyAgICAgICAgICAgICAoKChSYW5rNF9DaGFubmVsICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSA8PCAoTExfQURDX0lOSl9SQU5LXzQgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkgfAorICAgICAgICAgICAgICgoKFJhbmszX0NoYW5uZWwgJiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfTUFTSykgPj4gQURDX0NIQU5ORUxfSURfTlVNQkVSX0JJVE9GRlNFVF9QT1MpIDw8IChMTF9BRENfSU5KX1JBTktfMyAmIEFEQ19JTkpfUkFOS19JRF9KU1FSX01BU0spKSB8CisgICAgICAgICAgICAgKCgoUmFuazJfQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX0lEX05VTUJFUl9NQVNLKSA+PiBBRENfQ0hBTk5FTF9JRF9OVU1CRVJfQklUT0ZGU0VUX1BPUykgPDwgKExMX0FEQ19JTkpfUkFOS18yICYgQURDX0lOSl9SQU5LX0lEX0pTUVJfTUFTSykpIHwKKyAgICAgICAgICAgICAoKChSYW5rMV9DaGFubmVsICYgQURDX0NIQU5ORUxfSURfTlVNQkVSX01BU0spID4+IEFEQ19DSEFOTkVMX0lEX05VTUJFUl9CSVRPRkZTRVRfUE9TKSA8PCAoTExfQURDX0lOSl9SQU5LXzEgJiBBRENfSU5KX1JBTktfSURfSlNRUl9NQVNLKSkgfAorICAgICAgICAgICAgIFNlcXVlbmNlck5iUmFua3MKKyAgICAgICAgICAgICk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQ2hhbm5lbHMgQ29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBjaGFubmVscworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsCisgICogICAgICAgICBVbml0OiBBREMgY2xvY2sgY3ljbGVzLgorICAqIEBub3RlICAgT24gdGhpcyBkZXZpY2UsIHNhbXBsaW5nIHRpbWUgaXMgb24gY2hhbm5lbCBzY29wZTogaW5kZXBlbmRlbnRseQorICAqICAgICAgICAgb2YgY2hhbm5lbCBtYXBwZWQgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGludGVybmFsIGNoYW5uZWwgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgdG8gYmUKKyAgKiAgICAgICAgIGNvbnZlcnRlZDoKKyAgKiAgICAgICAgIHNhbXBsaW5nIHRpbWUgY29uc3RyYWludHMgbXVzdCBiZSByZXNwZWN0ZWQgKHNhbXBsaW5nIHRpbWUgY2FuIGJlCisgICogICAgICAgICBhZGp1c3RlZCBpbiBmdW5jdGlvbiBvZiBBREMgY2xvY2sgZnJlcXVlbmN5IGFuZCBzYW1wbGluZyB0aW1lCisgICogICAgICAgICBzZXR0aW5nKS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQgZm9yIHRpbWluZ3MgdmFsdWVzIChwYXJhbWV0ZXJzIFRTX3ZyZWZpbnQsCisgICogICAgICAgICBUU190ZW1wLCAuLi4pLgorICAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgICogICAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgcHJvY2Vzc2luZyB0aW1lIGlzOgorICAqICAgICAgICAgLSAxMi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTIgYml0cworICAqICAgICAgICAgLSAxMC41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTAgYml0cworICAqICAgICAgICAgLSA4LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA4IGJpdHMKKyAgKiAgICAgICAgIC0gNi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gNiBiaXRzCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyBjb252ZXJzaW9uIG9mIGludGVybmFsIGNoYW5uZWwgKFZyZWZJbnQsCisgICogICAgICAgICB0ZW1wZXJhdHVyZSBzZW5zb3IsIC4uLiksIGEgc2FtcGxpbmcgdGltZSBtaW5pbXVtIHZhbHVlCisgICogICAgICAgICBpcyByZXF1aXJlZC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIFNNUFIxICAgIFNNUDAgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDEgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDIgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDMgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDQgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDUgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDYgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDcgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDggICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIxICAgIFNNUDkgICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDEwICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDExICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDEyICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDEzICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDE0ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDE1ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDE2ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDE3ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lXG4KKyAgKiAgICAgICAgIFNNUFIyICAgIFNNUDE4ICAgICAgICAgIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMiAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzMgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF80ICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVEVNUFNFTlNPUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1ZCQVQKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDcpIE9uIFNUTTMyV0IsIGZhc3QgY2hhbm5lbCAoMC4xODggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDUuMzMgTXMvcykpLgorICAqICAgICAgICAgICAgIE90aGVyIGNoYW5uZWxzIGFyZSBzbG93IGNoYW5uZWxzICgwLjIzOCB1cyBmb3IgMTItYml0IHJlc29sdXRpb24gKEFEQyBjb252ZXJzaW9uIHJhdGUgdXAgdG8gNC4yMSBNcy9zKSkuCisgICogQHBhcmFtICBTYW1wbGluZ1RpbWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNENZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV80N0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV85MkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNDdDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNjQwQ1lDTEVTXzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTYW1wbGluZ1RpbWUpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIlNhbXBsaW5nVGltZSIgd2l0aCBiaXRzIHBvc2l0aW9uICAgICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQ2hhbm5lbCIuICAgICAgKi8KKyAgLyogUGFyYW1ldGVyICJDaGFubmVsIiBpcyB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSBjb250YWluaW5nICAgICAgICAgICAgICAgICovCisgIC8qIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+U01QUjEsICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUFJYX1JFR09GRlNFVF9NQVNLKSA+PiBBRENfU01QUlhfUkVHT0ZGU0VUX1BPUykpOworICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBBRENfU01QUjFfU01QMCA8PCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+PiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpLAorICAgICAgICAgICAgIFNhbXBsaW5nVGltZSAgIDw8ICgoQ2hhbm5lbCAmIEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX01BU0spID4+IEFEQ19DSEFOTkVMX1NNUHhfQklUT0ZGU0VUX1BPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbAorICAqICAgICAgICAgVW5pdDogQURDIGNsb2NrIGN5Y2xlcy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgZGV2aWNlLCBzYW1wbGluZyB0aW1lIGlzIG9uIGNoYW5uZWwgc2NvcGU6IGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgIG9mIGNoYW5uZWwgbWFwcGVkIG9uIEFEQyBncm91cCByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBub3RlICAgQ29udmVyc2lvbiB0aW1lIGlzIHRoZSBhZGRpdGlvbiBvZiBzYW1wbGluZyB0aW1lIGFuZCBwcm9jZXNzaW5nIHRpbWUuCisgICogICAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgcHJvY2Vzc2luZyB0aW1lIGlzOgorICAqICAgICAgICAgLSAxMi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTIgYml0cworICAqICAgICAgICAgLSAxMC41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gMTAgYml0cworICAqICAgICAgICAgLSA4LjUgQURDIGNsb2NrIGN5Y2xlcyBhdCBBREMgcmVzb2x1dGlvbiA4IGJpdHMKKyAgKiAgICAgICAgIC0gNi41IEFEQyBjbG9jayBjeWNsZXMgYXQgQURDIHJlc29sdXRpb24gNiBiaXRzCisgICogQHJtdG9sbCBTTVBSMSAgICBTTVAwICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVAxICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVAyICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVAzICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA0ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA1ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA2ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA3ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA4ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMSAgICBTTVA5ICAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxMCAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxMSAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxMiAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxMyAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxNCAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxNSAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxNiAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxNyAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZVxuCisgICogICAgICAgICBTTVBSMiAgICBTTVAxOCAgICAgICAgICBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMSAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zICAgICAgICAgICAgKDcpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNCAgICAgICAgICAgICg3KQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUgICAgICAgICAgICAoNykKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMX1RFTVBTRU5TT1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF9WQkFUCisgICogICAgICAgICAKKyAgKiAgICAgICAgICg3KSBPbiBTVE0zMldCLCBmYXN0IGNoYW5uZWwgKDAuMTg4IHVzIGZvciAxMi1iaXQgcmVzb2x1dGlvbiAoQURDIGNvbnZlcnNpb24gcmF0ZSB1cCB0byA1LjMzIE1zL3MpKS4KKyAgKiAgICAgICAgICAgICBPdGhlciBjaGFubmVscyBhcmUgc2xvdyBjaGFubmVscyAoMC4yMzggdXMgZm9yIDEyLWJpdCByZXNvbHV0aW9uIChBREMgY29udmVyc2lvbiByYXRlIHVwIHRvIDQuMjEgTXMvcykpLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0FNUExJTkdUSU1FXzJDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8xMkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNENZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV80N0NZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV85MkNZQ0xFU181CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX1NBTVBMSU5HVElNRV8yNDdDWUNMRVNfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TQU1QTElOR1RJTUVfNjQwQ1lDTEVTXzUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0Q2hhbm5lbFNhbXBsaW5nVGltZShBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlNNUFIxLCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVBSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX1NNUFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjFfU01QMCA8PCAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+PiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpKQorICAgICAgICAgICAgICAgICAgICA+PiAoKENoYW5uZWwgJiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9NQVNLKSA+PiBBRENfQ0hBTk5FTF9TTVB4X0JJVE9GRlNFVF9QT1MpCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBDaGFubmVsIGVuZGluZyBpcyBvbiBjaGFubmVsIHNjb3BlOiBpbmRlcGVuZGVudGx5IG9mIGNoYW5uZWwgbWFwcGVkCisgICogICAgICAgICBvbiBBREMgZ3JvdXAgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiAgICAgICAgIEluIGRpZmZlcmVudGlhbCBtb2RlOiBEaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQgaXMgY2FycmllZCBvdXQKKyAgKiAgICAgICAgIGJldHdlZW4gdGhlIHNlbGVjdGVkIGNoYW5uZWwgJ2knIChwb3NpdGl2ZSBpbnB1dCkgYW5kCisgICogICAgICAgICBjaGFubmVsICdpKzEnIChuZWdhdGl2ZSBpbnB1dCkuIE9ubHkgY2hhbm5lbCAnaScgaGFzIHRvIGJlCisgICogICAgICAgICBjb25maWd1cmVkLCBjaGFubmVsICdpKzEnIGlzIGNvbmZpZ3VyZWQgYXV0b21hdGljYWxseS4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgICogICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgYXJlCisgICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLAorICAqICAgICAgICAgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAqIEBub3RlICAgT24gU1RNMzJXQiwgY2hhbm5lbHMgMTYsIDE3LCAxOCBvZiBBREMxCisgICogICAgICAgICBhcmUgaW50ZXJuYWxseSBmaXhlZCB0byBzaW5nbGUtZW5kZWQgaW5wdXRzIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBGb3IgQURDIGNoYW5uZWxzIGNvbmZpZ3VyZWQgaW4gZGlmZmVyZW50aWFsIG1vZGUsIGJvdGggaW5wdXRzCisgICogICAgICAgICBzaG91bGQgYmUgYmlhc2VkIGF0IChWcmVmKykvMiArLy0yMDBtVi4KKyAgKiAgICAgICAgIChWcmVmKyBpcyB0aGUgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlKQorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE9uZSBvciBzZXZlcmFsIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCisgICogICAgICAgICBFeGFtcGxlOiAoTExfQURDX0NIQU5ORUxfNCB8IExMX0FEQ19DSEFOTkVMXzEyIHwgLi4uKQorICAqIEBybXRvbGwgRElGU0VMICAgRElGU0VMICAgICAgICAgTExfQURDX1NldENoYW5uZWxTaW5nbGVEaWZmCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfU0lOR0xFX0VOREVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0RJRkZFUkVOVElBTF9FTkRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldENoYW5uZWxTaW5nbGVEaWZmKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBTaW5nbGVEaWZmKQoreworICAvKiBCaXRzIG9mIGNoYW5uZWxzIGluIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSBhcmUgc2V0IG9ubHkgZm9yICAgICAgICAgKi8KKyAgLyogZGlmZmVyZW50aWFsIG1vZGUgKGZvciBzaW5nbGUgbW9kZSwgbWFzayBvZiBiaXRzIGFsbG93ZWQgdG8gYmUgc2V0IGlzICAgICovCisgIC8qIHNoaWZ0ZWQgb3V0IG9mIHJhbmdlIG9mIGJpdHMgb2YgY2hhbm5lbHMgaW4gc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBtb2RlLiAqLworICBNT0RJRllfUkVHKEFEQ3gtPkRJRlNFTCwKKyAgICAgICAgICAgICBDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgIChDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLKSAmIChBRENfRElGU0VMX0RJRlNFTCA+PiAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NIQU5ORUxfU0hJRlRfTUFTSykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgbW9kZSBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0IG9mIHRoZSBzZWxlY3RlZAorICAqICAgICAgICAgQURDIGNoYW5uZWwuCisgICogQG5vdGUgICBXaGVuIGNvbmZpZ3VyaW5nIGEgY2hhbm5lbCAnaScgaW4gZGlmZmVyZW50aWFsIG1vZGUsCisgICogICAgICAgICB0aGUgY2hhbm5lbCAnaSsxJyBpcyBub3QgdXNhYmxlIHNlcGFyYXRlbHkuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRvIGVuc3VyZSBhIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUtZW5kZWQgbW9kZSwKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIGNoYW5uZWwgaXRzZWxmIGFuZCB0aGUgY2hhbm5lbCAnaS0xJyBtdXN0IGJlCisgICogICAgICAgICByZWFkIGJhY2sgKHRvIGVuc3VyZSB0aGF0IHRoZSBzZWxlY3RlZCBjaGFubmVsIGNoYW5uZWwgaGFzIG5vdCBiZWVuCisgICogICAgICAgICBjb25maWd1cmVkIGluIGRpZmZlcmVudGlhbCBtb2RlIGJ5IHRoZSBwcmV2aW91cyBjaGFubmVsKS4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIFJlZmVyZW5jZSBNYW51YWwgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzCisgICogICAgICAgICBhdmFpbGFibGUgaW4gZGlmZmVyZW50aWFsIG1vZGUuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgaW50ZXJuYWwgY2hhbm5lbHMgKFZyZWZJbnQsIFRlbXBTZW5zb3IsIC4uLikgYXJlCisgICogICAgICAgICBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBjb25maWd1cmluZyBhIGNoYW5uZWwgJ2knIGluIGRpZmZlcmVudGlhbCBtb2RlLAorICAqICAgICAgICAgdGhlIGNoYW5uZWwgJ2krMScgaXMgbm90IHVzYWJsZSBzZXBhcmF0ZWx5LgorICAqIEBub3RlICAgT24gU1RNMzJXQiwgY2hhbm5lbHMgMTYsIDE3LCAxOCBvZiBBREMxCisgICogICAgICAgICBhcmUgaW50ZXJuYWxseSBmaXhlZCB0byBzaW5nbGUtZW5kZWQgaW5wdXRzIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBPbmUgb3Igc2V2ZXJhbCB2YWx1ZXMgY2FuIGJlIHNlbGVjdGVkLiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZQorICAqICAgICAgICAgcmV0dXJuZWQgaXMgbnVsbCBpZiBhbGwgY2hhbm5lbHMgYXJlIGluIHNpbmdsZSBlbmRlZC1tb2RlLgorICAqICAgICAgICAgRXhhbXBsZTogKExMX0FEQ19DSEFOTkVMXzQgfCBMTF9BRENfQ0hBTk5FTF8xMiB8IC4uLikKKyAgKiBAcm10b2xsIERJRlNFTCAgIERJRlNFTCAgICAgICAgIExMX0FEQ19HZXRDaGFubmVsU2luZ2xlRGlmZgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0NIQU5ORUxfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQ0hBTk5FTF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19DSEFOTkVMXzE1CisgICogQHJldHZhbCAwOiBjaGFubmVsIGluIHNpbmdsZS1lbmRlZCBtb2RlLCBlbHNlOiBjaGFubmVsIGluIGRpZmZlcmVudGlhbCBtb2RlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldENoYW5uZWxTaW5nbGVEaWZmKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5ESUZTRUwsIChDaGFubmVsICYgQURDX1NJTkdMRURJRkZfQ0hBTk5FTF9NQVNLKSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Db25maWd1cmF0aW9uX0FEQ19BbmFsb2dXYXRjaGRvZyBDb25maWd1cmF0aW9uIG9mIEFEQyB0cmFuc3ZlcnNhbCBzY29wZTogYW5hbG9nIHdhdGNoZG9nCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyBtb25pdG9yZWQgY2hhbm5lbHM6CisgICogICAgICAgICBhIHNpbmdsZSBjaGFubmVsLCBtdWx0aXBsZSBjaGFubmVscyBvciBhbGwgY2hhbm5lbHMsCisgICogICAgICAgICBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqIEBub3RlICAgT25jZSBtb25pdG9yZWQgY2hhbm5lbHMgYXJlIHNlbGVjdGVkLCBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG5lZWQgdG8gZGVmaW5lIGEgc2luZ2xlIGNoYW5uZWwgdG8gbW9uaXRvcgorICAqICAgICAgICAgd2l0aCBhbmFsb2cgd2F0Y2hkb2cgZnJvbSBzZXF1ZW5jZXIgY2hhbm5lbCBkZWZpbml0aW9uLAorICAqICAgICAgICAgdXNlIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikKKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOgorICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgIEFXRDFDSCAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUiAgICAgQVdEMVNHTCAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSICAgICBBV0QxRU4gICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEpBV0QxRU4gICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQVdEMkNSICAgQVdEMkNIICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBBV0QzQ1IgICBBV0QzQ0ggICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICAqIEBwYXJhbSAgQVdEQ2hhbm5lbEdyb3VwIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19JTkogICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVlJFRklOVF9SRUcgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WUkVGSU5UX0lOSiAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZSRUZJTlRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVEVNUFNFTlNPUl9SRUcgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9URU1QU0VOU09SX0lOSiAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1RFTVBTRU5TT1JfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hfVkJBVF9SRUcgICAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSF9WQkFUX0lOSiAgICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIX1ZCQVRfUkVHX0lOSgorICAqICAgICAgICAgCisgICogICAgICAgICAoMCkgT24gU1RNMzJXQiwgcGFyYW1ldGVyIGF2YWlsYWJsZSBvbmx5IG9uIGFuYWxvZyB3YXRjaGRvZyBudW1iZXI6IEFXRDEuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0R5LCB1aW50MzJfdCBBV0RDaGFubmVsR3JvdXApCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkFXRENoYW5uZWxHcm91cCIgd2l0aCBiaXRzIHBvc2l0aW9uICAqLworICAvKiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAiQVdEeSIuICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiQVdEQ2hhbm5lbEdyb3VwIiBhbmQgIkFXRHkiIGFyZSB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSAgICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+Q0ZHUiwgKChBV0R5ICYgQURDX0FXRF9DUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfQ1JYX1JFR09GRlNFVF9QT1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKEFXRHkgJiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX01BU0spICogQURDX0FXRF9DUjEyX1JFR09GRlNFVEdBUF9WQUwpKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgKEFXRHkgJiBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0spLAorICAgICAgICAgICAgIEFXRENoYW5uZWxHcm91cCAmIEFXRHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIG1vbml0b3JlZCBjaGFubmVsLgorICAqIEBub3RlICAgVXNhZ2Ugb2YgdGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyOgorICAqICAgICAgICAgLSBUbyByZWluamVjdCB0aGlzIGNoYW5uZWwgaW50byBhbm90aGVyIGZ1bmN0aW9uIExMX0FEQ194eHg6CisgICogICAgICAgICAgIHRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyBvbmx5IHBhcnRseSBmb3JtYXR0ZWQgb24gZGVmaW5pdGlvbgorICAqICAgICAgICAgICBvZiBsaXRlcmFscyBMTF9BRENfQ0hBTk5FTF94LiBUaGVyZWZvcmUsIGl0IGhhcyB0byBiZSBjb21wYXJlZAorICAqICAgICAgICAgICB3aXRoIHBhcnRzIG9mIGxpdGVyYWxzIExMX0FEQ19DSEFOTkVMX3ggb3IgdXNpbmcKKyAgKiAgICAgICAgICAgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKCkuCisgICogICAgICAgICAgIFRoZW4gdGhlIHNlbGVjdGVkIGxpdGVyYWwgTExfQURDX0NIQU5ORUxfeCBjYW4gYmUgdXNlZAorICAqICAgICAgICAgICBhcyBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgZnVuY3Rpb24uCisgICogICAgICAgICAtIFRvIGdldCB0aGUgY2hhbm5lbCBudW1iZXIgaW4gZGVjaW1hbCBmb3JtYXQ6CisgICogICAgICAgICAgIHByb2Nlc3MgdGhlIHJldHVybmVkIHZhbHVlIHdpdGggdGhlIGhlbHBlciBtYWNybworICAqICAgICAgICAgICBAcmVmIF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigpLgorICAqICAgICAgICAgICBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0aGUgYW5hbG9nIHdhdGNoZG9nIGlzIHNldCB0byBtb25pdG9yCisgICogICAgICAgICAgIG9uZSBjaGFubmVsLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhlcmUgYXJlIDIga2luZHMgb2YgYW5hbG9nIHdhdGNoZG9nCisgICogICAgICAgICBpbnN0YW5jZToKKyAgKiAgICAgICAgIC0gQVdEIHN0YW5kYXJkIChpbnN0YW5jZSBBV0QxKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGNhbiBtb25pdG9yIDEgY2hhbm5lbCBvciBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZC4KKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIG5vdCBsaW1pdGVkIChjb3JyZXNwb25kcyB0bworICAqICAgICAgICAgICAgIEFEQyByZXNvbHV0aW9uIGNvbmZpZ3VyZWQpLgorICAqICAgICAgICAgLSBBV0QgZmxleGlibGUgKGluc3RhbmNlcyBBV0QyLCBBV0QzKToKKyAgKiAgICAgICAgICAgLSBjaGFubmVscyBtb25pdG9yZWQ6IGZsZXhpYmxlIG9uIGNoYW5uZWxzIG1vbml0b3JlZCwgc2VsZWN0aW9uIGlzCisgICogICAgICAgICAgICAgY2hhbm5lbCB3aXNlLCBmcm9tIGZyb20gMSB0byBhbGwgY2hhbm5lbHMuCisgICogICAgICAgICAgICAgU3BlY2lmaWNpdHkgb2YgdGhpcyBhbmFsb2cgd2F0Y2hkb2c6IE11bHRpcGxlIGNoYW5uZWxzIGNhbgorICAqICAgICAgICAgICAgIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZToKKyAgKiAgICAgICAgICAgICAoTExfQURDX0FXRF9DSEFOTkVMNF9SRUdfSU5KIHwgTExfQURDX0FXRF9DSEFOTkVMNV9SRUdfSU5KIHwgLi4uKQorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IG5vdCBzZWxlY3Rpb24gcG9zc2libGUgKG1vbml0b3Jpbmcgb24gYm90aAorICAqICAgICAgICAgICAgIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkuCisgICogICAgICAgICAgICAgQ2hhbm5lbHMgc2VsZWN0ZWQgYXJlIG1vbml0b3JlZCBvbiBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6CisgICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHX0lOSiAoZG8gbm90IHVzZSBwYXJhbWV0ZXJzCisgICogICAgICAgICAgICAgTExfQURDX0FXRF9DSEFOTkVMeHhfUkVHIGFuZCBMTF9BRENfQVdEX0NIQU5ORUx4eF9JTkopCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBsaW1pdGVkIHRvIDggYml0czogaWYgQURDIHJlc29sdXRpb24gaXMKKyAgKiAgICAgICAgICAgICAxMiBiaXRzIHRoZSA0IExTQiBhcmUgaWdub3JlZCwgaWYgQURDIHJlc29sdXRpb24gaXMgMTAgYml0cworICAqICAgICAgICAgICAgIHRoZSAyIExTQiBhcmUgaWdub3JlZC4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZWl0aGVyIGdyb3VwcyByZWd1bGFyIG9yIGluamVjdGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgQVdEMUNIICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBDRkdSICAgICBBV0QxU0dMICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENGR1IgICAgIEFXRDFFTiAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHNcbgorICAqICAgICAgICAgQ0ZHUiAgICAgSkFXRDFFTiAgICAgICAgTExfQURDX0dldEFuYWxvZ1dETW9uaXRDaGFubmVsc1xuCisgICogICAgICAgICBBV0QyQ1IgICBBV0QyQ0ggICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RNb25pdENoYW5uZWxzXG4KKyAgKiAgICAgICAgIEFXRDNDUiAgIEFXRDNDSCAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBV0R5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMiAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMyAoMSkKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDEpIE9uIHRoaXMgQVdEIG51bWJlciwgbW9uaXRvcmVkIGNoYW5uZWwgY2FuIGJlIHJldHJpZXZlZAorICAqICAgICAgICAgICAgIGlmIG9ubHkgMSBjaGFubmVsIGlzIHByb2dyYW1tZWQgKG9yIG5vbmUgb3IgYWxsIGNoYW5uZWxzKS4KKyAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXRyaWV2ZSBtb25pdG9yZWQgY2hhbm5lbCBpZgorICAqICAgICAgICAgICAgIG11bHRpcGxlIGNoYW5uZWxzIGFyZSBwcm9ncmFtbWVkIHNpbXVsdGFuZW91c2x5CisgICogICAgICAgICAgICAgYnkgYml0ZmllbGQuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQUxMX0NIQU5ORUxTX1JFRyAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzBfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMF9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8wX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMV9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xX0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzFfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8yX1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzJfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMl9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzNfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfM19JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8zX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNF9SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF80X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzRfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF81X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzVfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNV9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzZfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfNl9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF82X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfN19SRUcgICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF83X0lOSiAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzdfUkVHX0lOSgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF84X1JFRyAgICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzhfSU5KICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOF9SRUdfSU5KCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzlfUkVHICAgICAgICAgICAoMCkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfOV9JTkogICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF85X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTBfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEwX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTFfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMV9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzExX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTJfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xMl9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEyX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTNfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xM19JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzEzX1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTRfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE0X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTVfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNV9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE1X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTZfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xNl9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE2X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMTdfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xN19JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE3X1JFR19JTkoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX0NIQU5ORUxfMThfUkVHICAgICAgICAgICgwKQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfQ0hBTk5FTF8xOF9JTkogICAgICAgICAgKDApCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9DSEFOTkVMXzE4X1JFR19JTkoKKyAgKiAgICAgICAgIAorICAqICAgICAgICAgKDApIE9uIFNUTTMyV0IsIHBhcmFtZXRlciBhdmFpbGFibGUgb25seSBvbiBhbmFsb2cgd2F0Y2hkb2cgbnVtYmVyOiBBV0QxLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19HZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHkpCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5DRkdSLCAoKEFXRHkgJiBBRENfQVdEX0NSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0FXRF9DUlhfUkVHT0ZGU0VUX1BPUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoQVdEeSAmIEFEQ19BV0RfQ1IxMl9SRUdPRkZTRVRHQVBfTUFTSykgKiBBRENfQVdEX0NSMTJfUkVHT0ZGU0VUR0FQX1ZBTCkpOworICAKKyAgcmVnaXN0ZXIgdWludDMyX3QgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKFJFQURfQklUKCpwcmVnLCBBV0R5KSAmIEFXRHkgJiBBRENfQVdEX0NSX0FMTF9DSEFOTkVMX01BU0spOworICAKKyAgLyogSWYgIkFuYWxvZ1dETW9uaXRDaGFubmVscyIgPT0gMCwgdGhlbiB0aGUgc2VsZWN0ZWQgQVdEIGlzIGRpc2FibGVkICAgICAgICovCisgIC8qIChwYXJhbWV0ZXIgdmFsdWUgTExfQURDX0FXRF9ESVNBQkxFKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFbHNlLCB0aGUgc2VsZWN0ZWQgQVdEIGlzIGVuYWJsZWQgYW5kIGlzIG1vbml0b3JpbmcgYSBncm91cCBvZiBjaGFubmVscyAgKi8KKyAgLyogb3IgYSBzaW5nbGUgY2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKEFuYWxvZ1dETW9uaXRDaGFubmVscyAhPSAwVUwpCisgIHsKKyAgICBpZihBV0R5ID09IExMX0FEQ19BV0QxKQorICAgIHsKKyAgICAgIGlmKChBbmFsb2dXRE1vbml0Q2hhbm5lbHMgJiBBRENfQ0ZHUl9BV0QxU0dMKSA9PSAwVUwpCisgICAgICB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKCggIEFuYWxvZ1dETW9uaXRDaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmICh+KEFEQ19DRkdSX0FXRDFDSCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKEFuYWxvZ1dETW9uaXRDaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoQURDX0FXRDJDUl9BV0QyQ0hfMCA8PCAoQW5hbG9nV0RNb25pdENoYW5uZWxzID4+IEFEQ19DRkdSX0FXRDFDSF9Qb3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoKEFuYWxvZ1dETW9uaXRDaGFubmVscyAmIEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spID09IEFEQ19BV0RfQ1IyM19DSEFOTkVMX01BU0spCisgICAgICB7CisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKCAgQURDX0FXRF9DUjIzX0NIQU5ORUxfTUFTSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKEFEQ19DRkdSX0pBV0QxRU4gfCBBRENfQ0ZHUl9BV0QxRU4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBBV0QgbW9uaXRvcmluZyBhIHNpbmdsZSBjaGFubmVsICovCisgICAgICAgIC8qIEFXRCBtb25pdG9yaW5nIGEgZ3JvdXAgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgQW5hbG9nV0RNb25pdENoYW5uZWxzID0gKCAgQW5hbG9nV0RNb25pdENoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChBRENfQ0ZHUl9KQVdEMUVOIHwgQURDX0NGR1JfQVdEMUVOIHwgQURDX0NGR1JfQVdEMVNHTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihBbmFsb2dXRE1vbml0Q2hhbm5lbHMpIDw8IEFEQ19DRkdSX0FXRDFDSF9Qb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICByZXR1cm4gQW5hbG9nV0RNb25pdENoYW5uZWxzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgdmFsdWUgb2YgYm90aCB0aHJlc2hvbGRzCisgICogICAgICAgICBoaWdoIGFuZCBsb3cuCisgICogQG5vdGUgICBJZiB2YWx1ZSBvZiBvbmx5IG9uZSB0aHJlc2hvbGQgaGlnaCBvciBsb3cgbXVzdCBiZSBzZXQsCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzKCkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIEFEQyByZXNvbHV0aW9uIGRpZmZlcmVudCBvZiAxMiBiaXRzLAorICAqICAgICAgICAgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgZGF0YSByZXF1aXJlIGEgc3BlY2lmaWMgc2hpZnQuCisgICogICAgICAgICBVc2UgaGVscGVyIG1hY3JvIEByZWYgX19MTF9BRENfQU5BTE9HV0RfU0VUX1RIUkVTSE9MRF9SRVNPTFVUSU9OKCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGVyZSBhcmUgMiBraW5kcyBvZiBhbmFsb2cgd2F0Y2hkb2cKKyAgKiAgICAgICAgIGluc3RhbmNlOgorICAqICAgICAgICAgLSBBV0Qgc3RhbmRhcmQgKGluc3RhbmNlIEFXRDEpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogY2FuIG1vbml0b3IgMSBjaGFubmVsIG9yIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkLgorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbm90IGxpbWl0ZWQgKGNvcnJlc3BvbmRzIHRvCisgICogICAgICAgICAgICAgQURDIHJlc29sdXRpb24gY29uZmlndXJlZCkuCisgICogICAgICAgICAtIEFXRCBmbGV4aWJsZSAoaW5zdGFuY2VzIEFXRDIsIEFXRDMpOgorICAqICAgICAgICAgICAtIGNoYW5uZWxzIG1vbml0b3JlZDogZmxleGlibGUgb24gY2hhbm5lbHMgbW9uaXRvcmVkLCBzZWxlY3Rpb24gaXMKKyAgKiAgICAgICAgICAgICBjaGFubmVsIHdpc2UsIGZyb20gZnJvbSAxIHRvIGFsbCBjaGFubmVscy4KKyAgKiAgICAgICAgICAgICBTcGVjaWZpY2l0eSBvZiB0aGlzIGFuYWxvZyB3YXRjaGRvZzogTXVsdGlwbGUgY2hhbm5lbHMgY2FuCisgICogICAgICAgICAgICAgYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOgorICAqICAgICAgICAgICAgIChMTF9BRENfQVdEX0NIQU5ORUw0X1JFR19JTkogfCBMTF9BRENfQVdEX0NIQU5ORUw1X1JFR19JTkogfCAuLi4pCisgICogICAgICAgICAgIC0gZ3JvdXBzIG1vbml0b3JlZDogbm90IHNlbGVjdGlvbiBwb3NzaWJsZSAobW9uaXRvcmluZyBvbiBib3RoCisgICogICAgICAgICAgICAgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKS4KKyAgKiAgICAgICAgICAgICBDaGFubmVscyBzZWxlY3RlZCBhcmUgbW9uaXRvcmVkIG9uIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZDoKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUdfSU5KIChkbyBub3QgdXNlIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgICAgICBMTF9BRENfQVdEX0NIQU5ORUx4eF9SRUcgYW5kIExMX0FEQ19BV0RfQ0hBTk5FTHh4X0lOSikKKyAgKiAgICAgICAgICAgLSByZXNvbHV0aW9uOiByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gOCBiaXRzOiBpZiBBREMgcmVzb2x1dGlvbiBpcworICAqICAgICAgICAgICAgIDEyIGJpdHMgdGhlIDQgTFNCIGFyZSBpZ25vcmVkLCBpZiBBREMgcmVzb2x1dGlvbiBpcyAxMCBiaXRzCisgICogICAgICAgICAgICAgdGhlIDIgTFNCIGFyZSBpZ25vcmVkLgorICAqIEBub3RlICAgSWYgQURDIG92ZXJzYW1wbGluZyBpcyBlbmFibGVkLCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgYXJlCisgICogICAgICAgICBpbXBhY3RlZDogdGhlIGNvbXBhcmlzb24gb2YgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgaXMgZG9uZSBvbgorICAqICAgICAgICAgb3ZlcnNhbXBsaW5nIGZpbmFsIGNvbXB1dGF0aW9uIChhZnRlciByYXRpbyBhbmQgc2hpZnQgYXBwbGljYXRpb24pOgorICAqICAgICAgICAgQURDIGRhdGEgcmVnaXN0ZXIgYml0ZmllbGQgWzE1OjRdICgxMiBtb3N0IHNpZ25pZmljYW50IGJpdHMpLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfQ29uZmlnQW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX0NvbmZpZ0FuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkTG93VmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZEhpZ2hWYWx1ZSwgdWludDMyX3QgQVdEVGhyZXNob2xkTG93VmFsdWUpCit7CisgIC8qIFNldCBiaXRzIHdpdGggY29udGVudCBvZiBwYXJhbWV0ZXIgIkFXRFRocmVzaG9sZHh4eFZhbHVlIiB3aXRoIGJpdHMgICAgICAqLworICAvKiBwb3NpdGlvbiBpbiByZWdpc3RlciBhbmQgcmVnaXN0ZXIgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBhcmFtZXRlciAgICAgICAgKi8KKyAgLyogIkFXRHkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgIkFXRHkiIGFuZCAiQVdEVGhyZXNob2xkeHh4VmFsdWUiIGFyZSB1c2VkIHdpdGggbWFza3MgYmVjYXVzZSAqLworICAvKiBjb250YWluaW5nIG90aGVyIGJpdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIHB1cnBvc2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlRSMSwgKChBV0R5ICYgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfVFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIE1PRElGWV9SRUcoKnByZWcsCisgICAgICAgICAgICAgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSwKKyAgICAgICAgICAgICAoQVdEVGhyZXNob2xkSGlnaFZhbHVlIDw8IEFEQ19UUjFfSFQxX0JJVE9GRlNFVF9QT1MpIHwgQVdEVGhyZXNob2xkTG93VmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZCB2YWx1ZSBvZiB0aHJlc2hvbGQKKyAgKiAgICAgICAgIGhpZ2ggb3IgbG93LgorICAqIEBub3RlICAgSWYgdmFsdWVzIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIG9yIGxvdyBtdXN0IGJlIHNldCwKKyAgKiAgICAgICAgIHVzZSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9TRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHRoZXJlIGFyZSAyIGtpbmRzIG9mIGFuYWxvZyB3YXRjaGRvZworICAqICAgICAgICAgaW5zdGFuY2U6CisgICogICAgICAgICAtIEFXRCBzdGFuZGFyZCAoaW5zdGFuY2UgQVdEMSk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBjYW4gbW9uaXRvciAxIGNoYW5uZWwgb3IgYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAtIGdyb3VwcyBtb25pdG9yZWQ6IEFEQyBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuCisgICogICAgICAgICAgIC0gcmVzb2x1dGlvbjogcmVzb2x1dGlvbiBpcyBub3QgbGltaXRlZCAoY29ycmVzcG9uZHMgdG8KKyAgKiAgICAgICAgICAgICBBREMgcmVzb2x1dGlvbiBjb25maWd1cmVkKS4KKyAgKiAgICAgICAgIC0gQVdEIGZsZXhpYmxlIChpbnN0YW5jZXMgQVdEMiwgQVdEMyk6CisgICogICAgICAgICAgIC0gY2hhbm5lbHMgbW9uaXRvcmVkOiBmbGV4aWJsZSBvbiBjaGFubmVscyBtb25pdG9yZWQsIHNlbGVjdGlvbiBpcworICAqICAgICAgICAgICAgIGNoYW5uZWwgd2lzZSwgZnJvbSBmcm9tIDEgdG8gYWxsIGNoYW5uZWxzLgorICAqICAgICAgICAgICAgIFNwZWNpZmljaXR5IG9mIHRoaXMgYW5hbG9nIHdhdGNoZG9nOiBNdWx0aXBsZSBjaGFubmVscyBjYW4KKyAgKiAgICAgICAgICAgICBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6CisgICogICAgICAgICAgICAgKExMX0FEQ19BV0RfQ0hBTk5FTDRfUkVHX0lOSiB8IExMX0FEQ19BV0RfQ0hBTk5FTDVfUkVHX0lOSiB8IC4uLikKKyAgKiAgICAgICAgICAgLSBncm91cHMgbW9uaXRvcmVkOiBub3Qgc2VsZWN0aW9uIHBvc3NpYmxlIChtb25pdG9yaW5nIG9uIGJvdGgKKyAgKiAgICAgICAgICAgICBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQpLgorICAqICAgICAgICAgICAgIENoYW5uZWxzIHNlbGVjdGVkIGFyZSBtb25pdG9yZWQgb24gZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkOgorICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFR19JTkogKGRvIG5vdCB1c2UgcGFyYW1ldGVycworICAqICAgICAgICAgICAgIExMX0FEQ19BV0RfQ0hBTk5FTHh4X1JFRyBhbmQgTExfQURDX0FXRF9DSEFOTkVMeHhfSU5KKQorICAqICAgICAgICAgICAtIHJlc29sdXRpb246IHJlc29sdXRpb24gaXMgbGltaXRlZCB0byA4IGJpdHM6IGlmIEFEQyByZXNvbHV0aW9uIGlzCisgICogICAgICAgICAgICAgMTIgYml0cyB0aGUgNCBMU0IgYXJlIGlnbm9yZWQsIGlmIEFEQyByZXNvbHV0aW9uIGlzIDEwIGJpdHMKKyAgKiAgICAgICAgICAgICB0aGUgMiBMU0IgYXJlIGlnbm9yZWQuCisgICogQG5vdGUgICBJZiBBREMgb3ZlcnNhbXBsaW5nIGlzIGVuYWJsZWQsIEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBhcmUKKyAgKiAgICAgICAgIGltcGFjdGVkOiB0aGUgY29tcGFyaXNvbiBvZiBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBpcyBkb25lIG9uCisgICogICAgICAgICBvdmVyc2FtcGxpbmcgZmluYWwgY29tcHV0YXRpb24gKGFmdGVyIHJhdGlvIGFuZCBzaGlmdCBhcHBsaWNhdGlvbik6CisgICogICAgICAgICBBREMgZGF0YSByZWdpc3RlciBiaXRmaWVsZCBbMTU6NF0gKDEyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cykuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBBREMgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBUUjEgICAgICBIVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIEhUMiAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgSFQzICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjEgICAgICBMVDEgICAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMiAgICAgIExUMiAgICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIzICAgICAgTFQzICAgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dEVGhyZXNob2xkcworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFXRHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDMKKyAgKiBAcGFyYW0gIEFXRFRocmVzaG9sZHNIaWdoTG93IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0RfVEhSRVNIT0xEX0xPVworICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkVmFsdWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19TZXRBbmFsb2dXRFRocmVzaG9sZHMoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IEFXRHksIHVpbnQzMl90IEFXRFRocmVzaG9sZHNIaWdoTG93LCB1aW50MzJfdCBBV0RUaHJlc2hvbGRWYWx1ZSkKK3sKKyAgLyogU2V0IGJpdHMgd2l0aCBjb250ZW50IG9mIHBhcmFtZXRlciAiQVdEVGhyZXNob2xkVmFsdWUiIHdpdGggYml0cyAgICAgICAgICovCisgIC8qIHBvc2l0aW9uIGluIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBwb3NpdGlvbiBkZXBlbmRpbmcgb24gcGFyYW1ldGVycyAgICAgICAqLworICAvKiAiQVdEVGhyZXNob2xkc0hpZ2hMb3ciIGFuZCAiQVdEeSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyAiQVdEeSIgYW5kICJBV0RUaHJlc2hvbGRWYWx1ZSIgYXJlIHVzZWQgd2l0aCBtYXNrcyBiZWNhdXNlICAgICovCisgIC8qIGNvbnRhaW5pbmcgb3RoZXIgYml0cyByZXNlcnZlZCBmb3Igb3RoZXIgcHVycG9zZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwcmVnID0gX19BRENfUFRSX1JFR19PRkZTRVQoQURDeC0+VFIxLCAoKEFXRHkgJiBBRENfQVdEX1RSWF9SRUdPRkZTRVRfTUFTSykgPj4gQURDX0FXRF9UUlhfUkVHT0ZGU0VUX1BPUykpOworICAKKyAgTU9ESUZZX1JFRygqcHJlZywKKyAgICAgICAgICAgICBBV0RUaHJlc2hvbGRzSGlnaExvdywKKyAgICAgICAgICAgICBBV0RUaHJlc2hvbGRWYWx1ZSA8PCAoKEFXRFRocmVzaG9sZHNIaWdoTG93ICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4gQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkIHZhbHVlIG9mIHRocmVzaG9sZCBoaWdoLAorICAqICAgICAgICAgdGhyZXNob2xkIGxvdyBvciByYXcgZGF0YSB3aXRoIEFEQyB0aHJlc2hvbGRzIGhpZ2ggYW5kIGxvdworICAqICAgICAgICAgY29uY2F0ZW5hdGVkLgorICAqIEBub3RlICAgSWYgcmF3IGRhdGEgd2l0aCBBREMgdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgaXMgcmV0cmlldmVkLAorICAqICAgICAgICAgdGhlIGRhdGEgb2YgZWFjaCB0aHJlc2hvbGQgaGlnaCBvciBsb3cgY2FuIGJlIGlzb2xhdGVkCisgICogICAgICAgICB1c2luZyBoZWxwZXIgbWFjcm86CisgICogICAgICAgICBAcmVmIF9fTExfQURDX0FOQUxPR1dEX1RIUkVTSE9MRFNfSElHSF9MT1coKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIHJlc29sdXRpb24gZGlmZmVyZW50IG9mIDEyIGJpdHMsCisgICogICAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBkYXRhIHJlcXVpcmUgYSBzcGVjaWZpYyBzaGlmdC4KKyAgKiAgICAgICAgIFVzZSBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19BTkFMT0dXRF9HRVRfVEhSRVNIT0xEX1JFU09MVVRJT04oKS4KKyAgKiBAcm10b2xsIFRSMSAgICAgIEhUMSAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgSFQyICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBIVDMgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzXG4KKyAgKiAgICAgICAgIFRSMSAgICAgIExUMSAgICAgICAgICAgIExMX0FEQ19HZXRBbmFsb2dXRFRocmVzaG9sZHNcbgorICAqICAgICAgICAgVFIyICAgICAgTFQyICAgICAgICAgICAgTExfQURDX0dldEFuYWxvZ1dEVGhyZXNob2xkc1xuCisgICogICAgICAgICBUUjMgICAgICBMVDMgICAgICAgICAgICBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQVdEeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEMworICAqIEBwYXJhbSAgQVdEVGhyZXNob2xkc0hpZ2hMb3cgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfQVdEX1RIUkVTSE9MRF9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0FXRF9USFJFU0hPTERTX0hJR0hfTE9XCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0QW5hbG9nV0RUaHJlc2hvbGRzKEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBBV0R5LCB1aW50MzJfdCBBV0RUaHJlc2hvbGRzSGlnaExvdykKK3sKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcHJlZyA9IF9fQURDX1BUUl9SRUdfT0ZGU0VUKEFEQ3gtPlRSMSwgKChBV0R5ICYgQURDX0FXRF9UUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19BV0RfVFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVdEVGhyZXNob2xkc0hpZ2hMb3cgfCBBRENfVFIxX0xUMSkpCisgICAgICAgICAgICAgICAgICAgID4+ICgoKEFXRFRocmVzaG9sZHNIaWdoTG93ICYgQURDX0FXRF9UUlhfQklUX0hJR0hfTUFTSykgPj4gQURDX0FXRF9UUlhfQklUX0hJR0hfU0hJRlQ0KSAmIH4oQVdEVGhyZXNob2xkc0hpZ2hMb3cgJiBBRENfVFIxX0xUMSkpCisgICAgICAgICAgICAgICAgICAgKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfb3ZlcnNhbXBsaW5nIENvbmZpZ3VyYXRpb24gb2YgQURDIHRyYW5zdmVyc2FsIHNjb3BlOiBvdmVyc2FtcGxpbmcKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nIHNjb3BlOiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kLW9yIGluamVjdGVkCisgICogICAgICAgICAoYXZhaWxhYmlsaXR5IG9mIEFEQyBncm91cCBpbmplY3RlZCBkZXBlbmRzIG9uIFNUTTMyIGZhbWlsaWVzKS4KKyAgKiBAbm90ZSAgIElmIGJvdGggZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkIGFyZSBzZWxlY3RlZCwKKyAgKiAgICAgICAgIHNwZWNpZnkgYmVoYXZpb3Igb2YgQURDIGdyb3VwIGluamVjdGVkIGludGVycnVwdGluZworICAqICAgICAgICAgZ3JvdXAgcmVndWxhcjogd2hlbiBBREMgZ3JvdXAgaW5qZWN0ZWQgaXMgdHJpZ2dlcmVkLAorICAqICAgICAgICAgdGhlIG92ZXJzYW1wbGluZyBvbiBBREMgZ3JvdXAgcmVndWxhciBpcyBlaXRoZXIKKyAgKiAgICAgICAgIHRlbXBvcmFyeSBzdG9wcGVkIGFuZCBjb250aW51ZWQsIG9yIHJlc3VtZWQgZnJvbSBzdGFydAorICAqICAgICAgICAgKG92ZXJzYW1wbGVyIGJ1ZmZlciByZXNldCkuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGVpdGhlciBncm91cHMgcmVndWxhciBvciBpbmplY3RlZC4KKyAgKiBAcm10b2xsIENGR1IyICAgIFJPVlNFICAgICAgICAgIExMX0FEQ19TZXRPdmVyU2FtcGxpbmdTY29wZVxuCisgICogICAgICAgICBDRkdSMiAgICBKT1ZTRSAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGVcbgorICAqICAgICAgICAgQ0ZHUjIgICAgUk9WU00gICAgICAgICAgTExfQURDX1NldE92ZXJTYW1wbGluZ1Njb3BlCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgT3ZzU2NvcGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9SRUdVTEFSX0NPTlRJTlVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfUkVTVU1FRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX0lOSkVDVEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfSU5KX1JFR19SRVNVTUVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU2V0T3ZlclNhbXBsaW5nU2NvcGUoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE92c1Njb3BlKQoreworICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU00sIE92c1Njb3BlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyBzY29wZTogQURDIGdyb3VwcyByZWd1bGFyIGFuZC1vciBpbmplY3RlZAorICAqICAgICAgICAgKGF2YWlsYWJpbGl0eSBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgZGVwZW5kcyBvbiBTVE0zMiBmYW1pbGllcykuCisgICogQG5vdGUgICBJZiBib3RoIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCBhcmUgc2VsZWN0ZWQsCisgICogICAgICAgICBzcGVjaWZ5IGJlaGF2aW9yIG9mIEFEQyBncm91cCBpbmplY3RlZCBpbnRlcnJ1cHRpbmcKKyAgKiAgICAgICAgIGdyb3VwIHJlZ3VsYXI6IHdoZW4gQURDIGdyb3VwIGluamVjdGVkIGlzIHRyaWdnZXJlZCwKKyAgKiAgICAgICAgIHRoZSBvdmVyc2FtcGxpbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgaXMgZWl0aGVyCisgICogICAgICAgICB0ZW1wb3Jhcnkgc3RvcHBlZCBhbmQgY29udGludWVkLCBvciByZXN1bWVkIGZyb20gc3RhcnQKKyAgKiAgICAgICAgIChvdmVyc2FtcGxlciBidWZmZXIgcmVzZXQpLgorICAqIEBybXRvbGwgQ0ZHUjIgICAgUk9WU0UgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1Njb3BlXG4KKyAgKiAgICAgICAgIENGR1IyICAgIEpPVlNFICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdTY29wZVxuCisgICogICAgICAgICBDRkdSMiAgICBST1ZTTSAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2NvcGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfR1JQX1JFR1VMQVJfQ09OVElOVUVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfUkVHVUxBUl9SRVNVTUVECisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19HUlBfSU5KRUNURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX0dSUF9JTkpfUkVHX1JFU1VNRUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nU2NvcGUoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfUk9WU0UgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU00pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQURDIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgKHRyaWdnZXJlZCBtb2RlKQorICAqICAgICAgICAgb24gdGhlIHNlbGVjdGVkIEFEQyBncm91cC4KKyAgKiBAbm90ZSAgIE51bWJlciBvZiBvdmVyc2FtcGxlZCBjb252ZXJzaW9ucyBhcmUgZG9uZSBlaXRoZXIgaW46CisgICogICAgICAgICAtIGNvbnRpbnVvdXMgbW9kZSAoYWxsIGNvbnZlcnNpb25zIG9mIG92ZXJzYW1wbGluZyByYXRpbworICAqICAgICAgICAgICBhcmUgZG9uZSBmcm9tIDEgdHJpZ2dlcikKKyAgKiAgICAgICAgIC0gZGlzY29udGludW91cyBtb2RlIChlYWNoIGNvbnZlcnNpb24gb2Ygb3ZlcnNhbXBsaW5nIHJhdGlvCisgICogICAgICAgICAgIG5lZWRzIGEgdHJpZ2dlcikKKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZworICAqICAgICAgICAgb24gZ3JvdXAgcmVndWxhci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIG92ZXJzYW1wbGluZyBkaXNjb250aW51b3VzIG1vZGUgCisgICogICAgICAgICAodHJpZ2dlcmVkIG1vZGUpIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiBvdmVyc2FtcGxpbmcgaXMgCisgICogICAgICAgICBzZXQgb24gZ3JvdXAgcmVndWxhciBvbmx5IGFuZCBpbiByZXN1bWVkIG1vZGUuCisgICogQHJtdG9sbCBDRkdSMiAgICBUUk9WUyAgICAgICAgICBMTF9BRENfU2V0T3ZlclNhbXBsaW5nRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE92ZXJTYW1wbGluZ0Rpc2NvbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JFR19DT05UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfRElTQ09OVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX1NldE92ZXJTYW1wbGluZ0Rpc2NvbnQoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IE92ZXJTYW1wbGluZ0Rpc2NvbnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9UUk9WUywgT3ZlclNhbXBsaW5nRGlzY29udCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBvdmVyc2FtcGxpbmcgZGlzY29udGludW91cyBtb2RlICh0cmlnZ2VyZWQgbW9kZSkKKyAgKiAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBBREMgZ3JvdXAuCisgICogQG5vdGUgICBOdW1iZXIgb2Ygb3ZlcnNhbXBsZWQgY29udmVyc2lvbnMgYXJlIGRvbmUgZWl0aGVyIGluOgorICAqICAgICAgICAgLSBjb250aW51b3VzIG1vZGUgKGFsbCBjb252ZXJzaW9ucyBvZiBvdmVyc2FtcGxpbmcgcmF0aW8KKyAgKiAgICAgICAgICAgYXJlIGRvbmUgZnJvbSAxIHRyaWdnZXIpCisgICogICAgICAgICAtIGRpc2NvbnRpbnVvdXMgbW9kZSAoZWFjaCBjb252ZXJzaW9uIG9mIG92ZXJzYW1wbGluZyByYXRpbworICAqICAgICAgICAgICBuZWVkcyBhIHRyaWdnZXIpCisgICogQHJtdG9sbCBDRkdSMiAgICBUUk9WUyAgICAgICAgICBMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SRUdfQ09OVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkVHX0RJU0NPTlQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nRGlzY29udChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQURDeC0+Q0ZHUjIsIEFEQ19DRkdSMl9UUk9WUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBREMgb3ZlcnNhbXBsaW5nCisgICogICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSAyIGl0ZW1zIG9mIG92ZXJzYW1wbGluZyBjb25maWd1cmF0aW9uOgorICAqICAgICAgICAgLSByYXRpbworICAqICAgICAgICAgLSBzaGlmdAorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDRkdSMiAgICBPVlNTICAgICAgICAgICBMTF9BRENfQ29uZmlnT3ZlclNhbXBsaW5nUmF0aW9TaGlmdFxuCisgICogICAgICAgICBDRkdSMiAgICBPVlNSICAgICAgICAgICBMTF9BRENfQ29uZmlnT3ZlclNhbXBsaW5nUmF0aW9TaGlmdAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhdGlvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT184CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1NgorICAqIEBwYXJhbSAgU2hpZnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19Db25maWdPdmVyU2FtcGxpbmdSYXRpb1NoaWZ0KEFEQ19UeXBlRGVmICpBREN4LCB1aW50MzJfdCBSYXRpbywgdWludDMyX3QgU2hpZnQpCit7CisgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUjIsIChBRENfQ0ZHUjJfT1ZTUyB8IEFEQ19DRkdSMl9PVlNSKSwgKFNoaWZ0IHwgUmF0aW8pKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIG92ZXJzYW1wbGluZyByYXRpbworICAqICAgICAgICAoaW1wYWN0aW5nIGJvdGggQURDIGdyb3VwcyByZWd1bGFyIGFuZCBpbmplY3RlZCkKKyAgKiBAcm10b2xsIENGR1IyICAgIE9WU1IgICAgICAgICAgIExMX0FEQ19HZXRPdmVyU2FtcGxpbmdSYXRpbworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJhdGlvIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT180CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT184CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19PVlNfUkFUSU9fMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX09WU19SQVRJT18xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1JBVElPXzI1NgorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfR2V0T3ZlclNhbXBsaW5nUmF0aW8oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkNGR1IyLCBBRENfQ0ZHUjJfT1ZTUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgb3ZlcnNhbXBsaW5nIHNoaWZ0CisgICogICAgICAgIChpbXBhY3RpbmcgYm90aCBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkKQorICAqIEBybXRvbGwgQ0ZHUjIgICAgT1ZTUyAgICAgICAgICAgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU2hpZnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfT1ZTX1NISUZUX1JJR0hUXzgKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0dldE92ZXJTYW1wbGluZ1NoaWZ0KEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChBREN4LT5DRkdSMiwgQURDX0NGR1IyX09WU1MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19JbnN0YW5jZSBPcGVyYXRpb24gb24gQURDIGhpZXJhcmNoaWNhbCBzY29wZTogQURDIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQdXQgQURDIGluc3RhbmNlIGluIGRlZXAgcG93ZXIgZG93biBzdGF0ZS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNhbGlicmF0aW9uIG5lY2Vzc2FyeTogV2hlbiBBREMgaXMgaW4gZGVlcC1wb3dlci1kb3duCisgICogICAgICAgICBzdGF0ZSwgdGhlIGludGVybmFsIGFuYWxvZyBjYWxpYnJhdGlvbiBpcyBsb3N0LiBBZnRlciBleGl0aW5nIGZyb20KKyAgKiAgICAgICAgIGRlZXAgcG93ZXIgZG93biwgY2FsaWJyYXRpb24gbXVzdCBiZSByZWxhdW5jaGVkIG9yIGNhbGlicmF0aW9uIGZhY3RvcgorICAqICAgICAgICAgKHByZWxpbWluYXJpbHkgc2F2ZWQpIG11c3QgYmUgc2V0IGJhY2sgaW50byBjYWxpYnJhdGlvbiByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBERUVQUFdEICAgICAgICBMTF9BRENfRW5hYmxlRGVlcFBvd2VyRG93bgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVEZWVwUG93ZXJEb3duKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9ERUVQUFdEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFEQyBkZWVwIHBvd2VyIGRvd24gbW9kZS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgQURDIGNhbGlicmF0aW9uIG5lY2Vzc2FyeTogV2hlbiBBREMgaXMgaW4gZGVlcC1wb3dlci1kb3duCisgICogICAgICAgICBzdGF0ZSwgdGhlIGludGVybmFsIGFuYWxvZyBjYWxpYnJhdGlvbiBpcyBsb3N0LiBBZnRlciBleGl0aW5nIGZyb20KKyAgKiAgICAgICAgIGRlZXAgcG93ZXIgZG93biwgY2FsaWJyYXRpb24gbXVzdCBiZSByZWxhdW5jaGVkIG9yIGNhbGlicmF0aW9uIGZhY3RvcgorICAqICAgICAgICAgKHByZWxpbWluYXJpbHkgc2F2ZWQpIG11c3QgYmUgc2V0IGJhY2sgaW50byBjYWxpYnJhdGlvbiByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBERUVQUFdEICAgICAgICBMTF9BRENfRGlzYWJsZURlZXBQb3dlckRvd24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRGlzYWJsZURlZXBQb3dlckRvd24oQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIENMRUFSX0JJVChBREN4LT5DUiwgKEFEQ19DUl9ERUVQUFdEIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBkZWVwIHBvd2VyIGRvd24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBERUVQUFdEICAgICAgICBMTF9BRENfSXNEZWVwUG93ZXJEb3duRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IGRlZXAgcG93ZXIgZG93biBpcyBkaXNhYmxlZCwgMTogZGVlcCBwb3dlciBkb3duIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRGVlcFBvd2VyRG93bkVuYWJsZWQoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfREVFUFBXRCkgPT0gKEFEQ19DUl9ERUVQUFdEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgaW5zdGFuY2UgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBhZnRlciBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlLAorICAqICAgICAgICAgYSBkZWxheSBmb3IgQURDIGludGVybmFsIHZvbHRhZ2UgcmVndWxhdG9yIHN0YWJpbGl6YXRpb24KKyAgKiAgICAgICAgIGlzIHJlcXVpcmVkIGJlZm9yZSBwZXJmb3JtaW5nIGEgQURDIGNhbGlicmF0aW9uIG9yIEFEQyBlbmFibGUuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdEFEQ1ZSRUdfU1RVUC4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfSU5URVJOQUxfUkVHVUxfU1RBQl9VUy4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSW50ZXJuYWxSZWd1bGF0b3IoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIC8qIE5vdGU6IFdyaXRlIHJlZ2lzdGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGJpdHMgZm9yY2VkIHRvIHN0YXRlIHJlc2V0ICAgICAqLworICAvKiAgICAgICBpbnN0ZWFkIG9mIG1vZGlmeWluZyBvbmx5IHRoZSBzZWxlY3RlZCBiaXQgZm9yIHRoaXMgZnVuY3Rpb24sICAgICAgKi8KKyAgLyogICAgICAgdG8gbm90IGludGVyZmVyZSB3aXRoIGJpdHMgd2l0aCBIVyBwcm9wZXJ0eSAicnMiLiAgICAgICAgICAgICAgICAgICovCisgIE1PRElGWV9SRUcoQURDeC0+Q1IsCisgICAgICAgICAgICAgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMsCisgICAgICAgICAgICAgQURDX0NSX0FEVlJFR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvci4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIHNldHRpbmcgb2YgdGhpcyBmZWF0dXJlIGlzIGNvbmRpdGlvbmVkIHRvCisgICogICAgICAgICBBREMgc3RhdGU6CisgICogICAgICAgICBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFZSRUdFTiAgICAgICBMTF9BRENfRGlzYWJsZUludGVybmFsUmVndWxhdG9yCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJbnRlcm5hbFJlZ3VsYXRvcihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPkNSLCAoQURDX0NSX0FEVlJFR0VOIHwgQURDX0NSX0JJVFNfUFJPUEVSVFlfUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZSBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEVlJFR0VOICAgICAgIExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IGludGVybmFsIHJlZ3VsYXRvciBpcyBkaXNhYmxlZCwgMTogaW50ZXJuYWwgcmVndWxhdG9yIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0FEVlJFR0VOKSA9PSAoQURDX0NSX0FEVlJFR0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluc3RhbmNlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYWZ0ZXIgQURDIGVuYWJsZSwgYSBkZWxheSBmb3IgCisgICogICAgICAgICBBREMgaW50ZXJuYWwgYW5hbG9nIHN0YWJpbGl6YXRpb24gaXMgcmVxdWlyZWQgYmVmb3JlIHBlcmZvcm1pbmcgYQorICAqICAgICAgICAgQURDIGNvbnZlcnNpb24gc3RhcnQuCisgICogICAgICAgICBSZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgdFNUQUIuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBmbGFnIExMX0FEQ19GTEFHX0FEUkRZIGlzIHJhaXNlZCB3aGVuIHRoZSBBREMKKyAgKiAgICAgICAgIGlzIGVuYWJsZWQgYW5kIHdoZW4gY29udmVyc2lvbiBjbG9jayBpcyBhY3RpdmUuCisgICogICAgICAgICAobm90IG9ubHkgY29yZSBjbG9jazogdGhpcyBBREMgaGFzIGEgZHVhbCBjbG9jayBkb21haW4pCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgQURDIGRpc2FibGVkIGFuZCBBREMgaW50ZXJuYWwgdm9sdGFnZSByZWd1bGF0b3IgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERU4gICAgICAgICAgIExMX0FEQ19FbmFibGUKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BREVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgbm90IGRpc2FibGVkLiBNdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nCisgICogICAgICAgICBvbiBlaXRoZXIgZ3JvdXBzIHJlZ3VsYXIgb3IgaW5qZWN0ZWQuCisgICogQHJtdG9sbCBDUiAgICAgICBBRERJUyAgICAgICAgICBMTF9BRENfRGlzYWJsZQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRERJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgZW5hYmxlIHN0YXRlLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgQ1IgICAgICAgQURFTiAgICAgICAgICAgTExfQURDX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IEFEQyBpcyBkaXNhYmxlZCwgMTogQURDIGlzIGVuYWJsZWQuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BREVOKSA9PSAoQURDX0NSX0FERU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBBREMgaW5zdGFuY2UgZGlzYWJsZSBzdGF0ZS4KKyAgKiBAcm10b2xsIENSICAgICAgIEFERElTICAgICAgICAgIExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogbm8gQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNEaXNhYmxlT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRERJUykgPT0gKEFEQ19DUl9BRERJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCBBREMgY2FsaWJyYXRpb24gaW4gdGhlIG1vZGUgc2luZ2xlLWVuZGVkCisgICogICAgICAgICBvciBkaWZmZXJlbnRpYWwgKGZvciBkZXZpY2VzIHdpdGggZGlmZmVyZW50aWFsIG1vZGUgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGEgbWluaW11bSBudW1iZXIgb2YgQURDIGNsb2NrIGN5Y2xlcworICAqICAgICAgICAgYXJlIHJlcXVpcmVkIGJldHdlZW4gQURDIGVuZCBvZiBjYWxpYnJhdGlvbiBhbmQgQURDIGVuYWJsZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGxpdGVyYWwgQHJlZiBMTF9BRENfREVMQVlfQ0FMSUJfRU5BQkxFX0FEQ19DWUNMRVMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudGlhbCBtb2RlIGF2YWlsYWJsZToKKyAgKiAgICAgICAgIENhbGlicmF0aW9uIG9mIG9mZnNldCBpcyBzcGVjaWZpYyB0byBlYWNoIG9mCisgICogICAgICAgICBzaW5nbGUtZW5kZWQgYW5kIGRpZmZlcmVudGlhbCBtb2RlcworICAqICAgICAgICAgKGNhbGlicmF0aW9uIHJ1biBtdXN0IGJlIHBlcmZvcm1lZCBmb3IgZWFjaCBvZiB0aGVzZQorICAqICAgICAgICAgZGlmZmVyZW50aWFsIG1vZGVzLCBpZiB1c2VkIGFmdGVyd2FyZHMgYW5kIGlmIHRoZSBhcHBsaWNhdGlvbgorICAqICAgICAgICAgcmVxdWlyZXMgdGhlaXIgY2FsaWJyYXRpb24pLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEQ0FMICAgICAgICAgIExMX0FEQ19TdGFydENhbGlicmF0aW9uXG4KKyAgKiAgICAgICAgIENSICAgICAgIEFEQ0FMRElGICAgICAgIExMX0FEQ19TdGFydENhbGlicmF0aW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19TSU5HTEVfRU5ERUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfRElGRkVSRU5USUFMX0VOREVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihBRENfVHlwZURlZiAqQURDeCwgdWludDMyX3QgU2luZ2xlRGlmZikKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQURDQUxESUYgfCBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfQURDQUwgfCAoU2luZ2xlRGlmZiAmIEFEQ19TSU5HTEVESUZGX0NBTElCX1NUQVJUX01BU0spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGNhbGlicmF0aW9uIHN0YXRlLgorICAqIEBybXRvbGwgQ1IgICAgICAgQURDQUwgICAgICAgICAgTExfQURDX0lzQ2FsaWJyYXRpb25PbkdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogY2FsaWJyYXRpb24gY29tcGxldGUsIDE6IGNhbGlicmF0aW9uIGluIHByb2dyZXNzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRENBTCkgPT0gKEFEQ19DUl9BRENBTCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfTExfRUZfT3BlcmF0aW9uX0FEQ19Hcm91cF9SZWd1bGFyIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCByZWd1bGFyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudCBmb3IgYm90aCAKKyAgKiAgICAgICAgIGludGVybmFsIHRyaWdnZXIgKFNXIHN0YXJ0KSBhbmQgZXh0ZXJuYWwgdHJpZ2dlcjoKKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIHNvZnR3YXJlIHN0YXJ0LCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICBzdGFydHMgaW1tZWRpYXRlbHkuCisgICogICAgICAgICAtIElmIEFEQyB0cmlnZ2VyIGhhcyBiZWVuIHNldCB0byBleHRlcm5hbCB0cmlnZ2VyLCBBREMgY29udmVyc2lvbgorICAqICAgICAgICAgICB3aWxsIHN0YXJ0IGF0IG5leHQgdHJpZ2dlciBldmVudCAob24gdGhlIHNlbGVjdGVkIHRyaWdnZXIgZWRnZSkKKyAgKiAgICAgICAgICAgZm9sbG93aW5nIHRoZSBBREMgc3RhcnQgY29udmVyc2lvbiBjb21tYW5kLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgc2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8KKyAgKiAgICAgICAgIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBtdXN0IGJlIGVuYWJsZWQgd2l0aG91dCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIHJlZ3VsYXIsCisgICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUQVJUICAgICAgICBMTF9BRENfUkVHX1N0YXJ0Q29udmVyc2lvbgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFNUQVJUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgcmVndWxhciwKKyAgKiAgICAgICAgIHdpdGhvdXQgQURDIGRpc2FibGUgY29tbWFuZCBvbiBnb2luZy4KKyAgKiBAcm10b2xsIENSICAgICAgIEFEU1RQICAgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKEFEQ19UeXBlRGVmICpBREN4KQoreworICAvKiBOb3RlOiBXcml0ZSByZWdpc3RlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBiaXRzIGZvcmNlZCB0byBzdGF0ZSByZXNldCAgICAgKi8KKyAgLyogICAgICAgaW5zdGVhZCBvZiBtb2RpZnlpbmcgb25seSB0aGUgc2VsZWN0ZWQgYml0IGZvciB0aGlzIGZ1bmN0aW9uLCAgICAgICovCisgIC8qICAgICAgIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBiaXRzIHdpdGggSFcgcHJvcGVydHkgInJzIi4gICAgICAgICAgICAgICAgICAqLworICBNT0RJRllfUkVHKEFEQ3gtPkNSLAorICAgICAgICAgICAgIEFEQ19DUl9CSVRTX1BST1BFUlRZX1JTLAorICAgICAgICAgICAgIEFEQ19DUl9BRFNUUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUQVJUICAgICAgICBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCByZWd1bGFyLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFNUQVJUKSA9PSAoQURDX0NSX0FEU1RBUlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIHN0YXRlCisgICogQHJtdG9sbCBDUiAgICAgICBBRFNUUCAgICAgICAgICBMTF9BRENfUkVHX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgMDogbm8gY29tbWFuZCBvZiBjb252ZXJzaW9uIHN0b3AgaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+Q1IsIEFEQ19DUl9BRFNUUCkgPT0gKEFEQ19DUl9BRFNUUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBhbGwgQURDIGNvbmZpZ3VyYXRpb25zOiBhbGwgQURDIHJlc29sdXRpb25zIGFuZAorICAqICAgICAgICAgYWxsIG92ZXJzYW1wbGluZyBpbmNyZWFzZWQgZGF0YSB3aWR0aCAoZm9yIGRldmljZXMKKyAgKiAgICAgICAgIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmcpLgorICAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGEzMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwMDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEFEQ3gtPkRSLCBBRENfRFJfUkRBVEEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19SRUdfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBEUiAgICAgICBSREFUQSAgICAgICAgICBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwMCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MTZfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTEyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChBREN4LT5EUiwgQURDX0RSX1JEQVRBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgQURDIHJlc29sdXRpb24gMTAgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAgYW5kIE1heF9EYXRhPTB4M0ZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGExMChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MTZfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDggYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE4CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTgoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEsIHJhbmdlIGZpdCBmb3IKKyAgKiAgICAgICAgIEFEQyByZXNvbHV0aW9uIDYgYml0cy4KKyAgKiBAbm90ZSAgIEZvciBkZXZpY2VzIHdpdGggZmVhdHVyZSBvdmVyc2FtcGxpbmc6IE92ZXJzYW1wbGluZworICAqICAgICAgICAgY2FuIGluY3JlYXNlIGRhdGEgd2lkdGgsIGZ1bmN0aW9uIGZvciBleHRlbmRlZCByYW5nZQorICAqICAgICAgICAgbWF5IGJlIG5lZWRlZDogQHJlZiBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTMyLgorICAqIEBybXRvbGwgRFIgICAgICAgUkRBVEEgICAgICAgICAgTExfQURDX1JFR19SZWFkQ29udmVyc2lvbkRhdGE2CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfUkVHX1JlYWRDb252ZXJzaW9uRGF0YTYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoQURDeC0+RFIsIEFEQ19EUl9SREFUQSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9PcGVyYXRpb25fQURDX0dyb3VwX0luamVjdGVkIE9wZXJhdGlvbiBvbiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiBncm91cCBpbmplY3RlZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50IGZvciBib3RoIAorICAqICAgICAgICAgaW50ZXJuYWwgdHJpZ2dlciAoU1cgc3RhcnQpIGFuZCBleHRlcm5hbCB0cmlnZ2VyOgorICAqICAgICAgICAgLSBJZiBBREMgdHJpZ2dlciBoYXMgYmVlbiBzZXQgdG8gc29mdHdhcmUgc3RhcnQsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHN0YXJ0cyBpbW1lZGlhdGVseS4KKyAgKiAgICAgICAgIC0gSWYgQURDIHRyaWdnZXIgaGFzIGJlZW4gc2V0IHRvIGV4dGVybmFsIHRyaWdnZXIsIEFEQyBjb252ZXJzaW9uCisgICogICAgICAgICAgIHdpbGwgc3RhcnQgYXQgbmV4dCB0cmlnZ2VyIGV2ZW50IChvbiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBlZGdlKQorICAqICAgICAgICAgICBmb2xsb3dpbmcgdGhlIEFEQyBzdGFydCBjb252ZXJzaW9uIGNvbW1hbmQuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRob3V0IGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgICogICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24gc3RvcCBjb21tYW5kIG9uIGdvaW5nIG9uIGdyb3VwIGluamVjdGVkLAorICAqICAgICAgICAgd2l0aG91dCBBREMgZGlzYWJsZSBjb21tYW5kIG9uIGdvaW5nLgorICAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RBUlQgICAgICAgTExfQURDX0lOSl9TdGFydENvbnZlcnNpb24KKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfSU5KX1N0YXJ0Q29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfSkFEU1RBUlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24uCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIHN0YXRlOgorICAqICAgICAgICAgQURDIG11c3QgYmUgZW5hYmxlZCB3aXRoIGNvbnZlcnNpb24gb24gZ29pbmcgb24gZ3JvdXAgaW5qZWN0ZWQsCisgICogICAgICAgICB3aXRob3V0IEFEQyBkaXNhYmxlIGNvbW1hbmQgb24gZ29pbmcuCisgICogQHJtdG9sbCBDUiAgICAgICBKQURTVFAgICAgICAgICBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0lOSl9TdG9wQ29udmVyc2lvbihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgLyogTm90ZTogV3JpdGUgcmVnaXN0ZXIgd2l0aCBzb21lIGFkZGl0aW9uYWwgYml0cyBmb3JjZWQgdG8gc3RhdGUgcmVzZXQgICAgICovCisgIC8qICAgICAgIGluc3RlYWQgb2YgbW9kaWZ5aW5nIG9ubHkgdGhlIHNlbGVjdGVkIGJpdCBmb3IgdGhpcyBmdW5jdGlvbiwgICAgICAqLworICAvKiAgICAgICB0byBub3QgaW50ZXJmZXJlIHdpdGggYml0cyB3aXRoIEhXIHByb3BlcnR5ICJycyIuICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhBREN4LT5DUiwKKyAgICAgICAgICAgICBBRENfQ1JfQklUU19QUk9QRVJUWV9SUywKKyAgICAgICAgICAgICBBRENfQ1JfSkFEU1RQKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIGdyb3VwIGluamVjdGVkIGNvbnZlcnNpb24gc3RhdGUuCisgICogQHJtdG9sbCBDUiAgICAgICBKQURTVEFSVCAgICAgICBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCAwOiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPkNSLCBBRENfQ1JfSkFEU1RBUlQpID09IChBRENfQ1JfSkFEU1RBUlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCBpbmplY3RlZCBjb21tYW5kIG9mIGNvbnZlcnNpb24gc3RvcCBzdGF0ZQorICAqIEBybXRvbGwgQ1IgICAgICAgSkFEU1RQICAgICAgICAgTExfQURDX0lOSl9Jc1N0b3BDb252ZXJzaW9uT25nb2luZworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIDA6IG5vIGNvbW1hbmQgb2YgY29udmVyc2lvbiBzdG9wIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSU5KX0lzU3RvcENvbnZlcnNpb25PbmdvaW5nKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5DUiwgQURDX0NSX0pBRFNUUCkgPT0gKEFEQ19DUl9KQURTVFApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YSwgcmFuZ2UgZml0IGZvcgorICAqICAgICAgICAgYWxsIEFEQyBjb25maWd1cmF0aW9uczogYWxsIEFEQyByZXNvbHV0aW9ucyBhbmQKKyAgKiAgICAgICAgIGFsbCBvdmVyc2FtcGxpbmcgaW5jcmVhc2VkIGRhdGEgd2lkdGggKGZvciBkZXZpY2VzCisgICogICAgICAgICB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nKS4KKyAgKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzJcbgorICAqICAgICAgICAgSkRSMiAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMlxuCisgICogICAgICAgICBKRFIzICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTMyXG4KKyAgKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBSYW5rIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzQKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwMDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSkRSMV9KREFUQSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMiBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyXG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTJcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMlxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTIoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSkRSMV9KREFUQSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiAxMCBiaXRzLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBmZWF0dXJlIG92ZXJzYW1wbGluZzogT3ZlcnNhbXBsaW5nCisgICogICAgICAgICBjYW4gaW5jcmVhc2UgZGF0YSB3aWR0aCwgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIHJhbmdlCisgICogICAgICAgICBtYXkgYmUgbmVlZGVkOiBAcmVmIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMzIuCisgICogQHJtdG9sbCBKRFIxICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwXG4KKyAgKiAgICAgICAgIEpEUjIgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTBcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGExMFxuCisgICogICAgICAgICBKRFI0ICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTEwCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgUmFuayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS180CisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwIGFuZCBNYXhfRGF0YT0weDNGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhMTAoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKCpwcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfSkRSMV9KREFUQSkKKyAgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiA4IGJpdHMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcKKyAgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAgKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOFxuCisgICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YThcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE4XG4KKyAgKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhOAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTgoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pEUjFfSkRBVEEpCisgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBkYXRhLCByYW5nZSBmaXQgZm9yCisgICogICAgICAgICBBREMgcmVzb2x1dGlvbiA2IGJpdHMuCisgICogQG5vdGUgICBGb3IgZGV2aWNlcyB3aXRoIGZlYXR1cmUgb3ZlcnNhbXBsaW5nOiBPdmVyc2FtcGxpbmcKKyAgKiAgICAgICAgIGNhbiBpbmNyZWFzZSBkYXRhIHdpZHRoLCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgcmFuZ2UKKyAgKiAgICAgICAgIG1heSBiZSBuZWVkZWQ6IEByZWYgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGEzMi4KKyAgKiBAcm10b2xsIEpEUjEgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhNlxuCisgICogICAgICAgICBKRFIyICAgICBKREFUQSAgICAgICAgICBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTZcbgorICAqICAgICAgICAgSkRSMyAgICAgSkRBVEEgICAgICAgICAgTExfQURDX0lOSl9SZWFkQ29udmVyc2lvbkRhdGE2XG4KKyAgKiAgICAgICAgIEpEUjQgICAgIEpEQVRBICAgICAgICAgIExMX0FEQ19JTkpfUmVhZENvbnZlcnNpb25EYXRhNgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJhbmsgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FEQ19JTkpfUkFOS18yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQURDX0lOSl9SQU5LXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BRENfSU5KX1JBTktfNAorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9BRENfSU5KX1JlYWRDb252ZXJzaW9uRGF0YTYoQURDX1R5cGVEZWYgKkFEQ3gsIHVpbnQzMl90IFJhbmspCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnByZWcgPSBfX0FEQ19QVFJfUkVHX09GRlNFVChBREN4LT5KRFIxLCAoKFJhbmsgJiBBRENfSU5KX0pEUlhfUkVHT0ZGU0VUX01BU0spID4+IEFEQ19KRFJYX1JFR09GRlNFVF9QT1MpKTsKKyAgCisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoKnByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pEUjFfSkRBVEEpCisgICAgICAgICAgICAgICAgICApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgQURDIGZsYWcgbWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIHJlYWR5LgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgZmxhZyBMTF9BRENfRkxBR19BRFJEWSBpcyByYWlzZWQgd2hlbiB0aGUgQURDCisgICogICAgICAgICBpcyBlbmFibGVkIGFuZCB3aGVuIGNvbnZlcnNpb24gY2xvY2sgaXMgYWN0aXZlLgorICAqICAgICAgICAgKG5vdCBvbmx5IGNvcmUgY2xvY2s6IHRoaXMgQURDIGhhcyBhIGR1YWwgY2xvY2sgZG9tYWluKQorICAqIEBybXRvbGwgSVNSICAgICAgQURSRFkgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FEUkRZKSA9PSAoTExfQURDX0ZMQUdfQURSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPQyAgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIEFEQ19JU1JfRU9DKSA9PSAoQURDX0lTUl9FT0MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TICAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9TKSA9PSAoTExfQURDX0ZMQUdfRU9TKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJU1IgICAgICBPVlIgICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19PVlIpID09IChMTF9BRENfRkxBR19PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNhbXBsaW5nIHBoYXNlLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9TTVAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPU01QKSA9PSAoTExfQURDX0ZMQUdfRU9TTVApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJU1IgICAgICBKRU9DICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT0MpID09IChMTF9BRENfRkxBR19KRU9DKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJU1IgICAgICBKRU9TICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0pFT1MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19KRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0pFT1MpID09IChMTF9BRENfRkxBR19KRU9TKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEpRT1ZGICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfSlFPVkYKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19KUU9WRihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KUU9WRikgPT0gKExMX0FEQ19GTEFHX0pRT1ZGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMSBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QxICAgICAgICAgICBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDEpID09IChMTF9BRENfRkxBR19BV0QxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDIgICAgICAgICAgIExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNBY3RpdmVGbGFnX0FXRDIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMikgPT0gKExMX0FEQ19GTEFHX0FXRDIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSVNSICAgICAgQVdEMyAgICAgICAgICAgTExfQURDX0lzQWN0aXZlRmxhZ19BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0FjdGl2ZUZsYWdfQVdEMyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QzKSA9PSAoTExfQURDX0ZMQUdfQVdEMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyByZWFkeS4KKyAgKiBAbm90ZSAgIE9uIHRoaXMgU1RNMzIgc2VyaWUsIGZsYWcgTExfQURDX0ZMQUdfQURSRFkgaXMgcmFpc2VkIHdoZW4gdGhlIEFEQworICAqICAgICAgICAgaXMgZW5hYmxlZCBhbmQgd2hlbiBjb252ZXJzaW9uIGNsb2NrIGlzIGFjdGl2ZS4KKyAgKiAgICAgICAgIChub3Qgb25seSBjb3JlIGNsb2NrOiB0aGlzIEFEQyBoYXMgYSBkdWFsIGNsb2NrIGRvbWFpbikKKyAgKiBAcm10b2xsIElTUiAgICAgIEFEUkRZICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FEUkRZKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BRFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgRU9DICAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfRU9DKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPUyAgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0VPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuLgorICAqIEBybXRvbGwgSVNSICAgICAgT1ZSICAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19PVlIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX09WUihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfT1ZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzYW1wbGluZyBwaGFzZS4KKyAgKiBAcm10b2xsIElTUiAgICAgIEVPU01QICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0VPU01QKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19FT1NNUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElTUiAgICAgIEpFT0MgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfSkVPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfSkVPQyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfSkVPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zLgorICAqIEBybXRvbGwgSVNSICAgICAgSkVPUyAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19KRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19KRU9TKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KRU9TKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0cyBxdWV1ZSBvdmVyZmxvdy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEpRT1ZGICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfSlFPVkYKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0pRT1ZGKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19KUU9WRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgZmxhZyBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgICogQHJtdG9sbCBJU1IgICAgICBBV0QxICAgICAgICAgICBMTF9BRENfQ2xlYXJGbGFnX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfQ2xlYXJGbGFnX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFdSSVRFX1JFRyhBREN4LT5JU1IsIExMX0FEQ19GTEFHX0FXRDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSVNSICAgICAgQVdEMiAgICAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0NsZWFyRmxhZ19BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICBXUklURV9SRUcoQURDeC0+SVNSLCBMTF9BRENfRkxBR19BV0QyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAgKiBAcm10b2xsIElTUiAgICAgIEFXRDMgICAgICAgICAgIExMX0FEQ19DbGVhckZsYWdfQVdEMworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19DbGVhckZsYWdfQVdEMyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgV1JJVEVfUkVHKEFEQ3gtPklTUiwgTExfQURDX0ZMQUdfQVdEMyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0xMX0VGX0lUX01hbmFnZW1lbnQgQURDIElUIG1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgcmVhZHkuCisgICogQHJtdG9sbCBJRVIgICAgICBBRFJEWUlFICAgICAgICBMTF9BRENfRW5hYmxlSVRfQURSRFkKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQURSRFkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9FT0MKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbnMuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NJRSAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0VPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMgZ3JvdXAgcmVndWxhciBpbnRlcnJ1cHRpb24gb3ZlcnJ1bi4KKyAgKiBAcm10b2xsIElFUiAgICAgIE9WUklFICAgICAgICAgIExMX0FEQ19FbmFibGVJVF9PVlIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRW5hYmxlSVRfRU9TTVAKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfRU9TTVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24uCisgICogQHJtdG9sbCBJRVIgICAgICBKRU9DSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfSkVPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpFT1NJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9KRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0pFT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpRT1ZGSUUgICAgICAgIExMX0FEQ19FbmFibGVJVF9KUU9WRgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9KUU9WRihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdGlvbiBBREMgYW5hbG9nIHdhdGNoZG9nIDEuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QxSUUgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19FbmFibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBTRVRfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0VuYWJsZUlUX0FXRDIKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BRENfRW5hYmxlSVRfQVdEMihBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgU0VUX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QyKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDNJRSAgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0VuYWJsZUlUX0FXRDMoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIFNFVF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIHJlYWR5LgorICAqIEBybXRvbGwgSUVSICAgICAgQURSRFlJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BRFJEWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbi4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPQ0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT0MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU0lFICAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4uCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfRGlzYWJsZUlUX09WUgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfT1ZSKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfT1ZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NNUElFICAgICAgICBMTF9BRENfRGlzYWJsZUlUX0VPU01QCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9FT1NNUChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uLgorICAqIEBybXRvbGwgSUVSICAgICAgSkVPQ0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiBzZXF1ZW5jZSBjb252ZXJzaW9ucy4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpFT1NJRSAgICAgICAgIExMX0FEQ19EaXNhYmxlSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgQ0xFQVJfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0pFT1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0aW9uIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93LgorICAqIEBybXRvbGwgSUVSICAgICAgSlFPVkZJRSAgICAgICAgTExfQURDX0Rpc2FibGVJVF9KUU9WRgorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FEQ19EaXNhYmxlSVRfSlFPVkYoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIENMRUFSX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAxLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QxKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAyLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMklFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBpbnRlcnJ1cHRpb24gQURDIGFuYWxvZyB3YXRjaGRvZyAzLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEM0lFICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QzCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQURDX0Rpc2FibGVJVF9BV0QzKEFEQ19UeXBlRGVmICpBREN4KQoreworICBDTEVBUl9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgcmVhZHkKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFEUkRZSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BRFJEWQorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQURSRFkoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FEUkRZKSA9PSAoTExfQURDX0lUX0FEUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbgorICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgRU9DSUUgICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0VPQworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9FT0MpID09IChMTF9BRENfSVRfRU9DKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBFT1NJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfRU9TCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9FT1MoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPUykgPT0gKExMX0FEQ19JVF9FT1MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBvdmVycnVuCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBPVlJJRSAgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfT1ZSCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9PVlIoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX09WUikgPT0gKExMX0FEQ19JVF9PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2Ygc2FtcGxpbmcKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEVPU01QSUUgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9FT1NNUAorICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfRU9TTVAoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0VPU01QKSA9PSAoTExfQURDX0lUX0VPU01QKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24KKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEpFT0NJRSAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9KRU9DCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9KRU9DKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KRU9DKSA9PSAoTExfQURDX0lUX0pFT0MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBBREMgZ3JvdXAgaW5qZWN0ZWQgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBKRU9TSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfSkVPUworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfSkVPUyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfSkVPUykgPT0gKExMX0FEQ19JVF9KRU9TKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBpbnRlcnJ1cHRpb24gQURDIGdyb3VwIGluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXRlCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBKUU9WRklFICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfSlFPVkYKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0pRT1ZGKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9KUU9WRikgPT0gKExMX0FEQ19JVF9KUU9WRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMQorICAqICAgICAgICAgKDA6IGludGVycnVwdCBkaXNhYmxlZCwgMTogaW50ZXJydXB0IGVuYWJsZWQpLgorICAqIEBybXRvbGwgSUVSICAgICAgQVdEMUlFICAgICAgICAgTExfQURDX0lzRW5hYmxlZElUX0FXRDEKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQURDX0lzRW5hYmxlZElUX0FXRDEoQURDX1R5cGVEZWYgKkFEQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEFEQ3gtPklFUiwgTExfQURDX0lUX0FXRDEpID09IChMTF9BRENfSVRfQVdEMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc3RhdGUgb2YgaW50ZXJydXB0aW9uIEdldCBBREMgYW5hbG9nIHdhdGNoZG9nIDIKKyAgKiAgICAgICAgICgwOiBpbnRlcnJ1cHQgZGlzYWJsZWQsIDE6IGludGVycnVwdCBlbmFibGVkKS4KKyAgKiBAcm10b2xsIElFUiAgICAgIEFXRDJJRSAgICAgICAgIExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QyCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FEQ19Jc0VuYWJsZWRJVF9BV0QyKEFEQ19UeXBlRGVmICpBREN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChBREN4LT5JRVIsIExMX0FEQ19JVF9BV0QyKSA9PSAoTExfQURDX0lUX0FXRDIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN0YXRlIG9mIGludGVycnVwdGlvbiBHZXQgQURDIGFuYWxvZyB3YXRjaGRvZyAzCisgICogICAgICAgICAoMDogaW50ZXJydXB0IGRpc2FibGVkLCAxOiBpbnRlcnJ1cHQgZW5hYmxlZCkuCisgICogQHJtdG9sbCBJRVIgICAgICBBV0QzSUUgICAgICAgICBMTF9BRENfSXNFbmFibGVkSVRfQVdEMworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BRENfSXNFbmFibGVkSVRfQVdEMyhBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQURDeC0+SUVSLCBMTF9BRENfSVRfQVdEMykgPT0gKExMX0FEQ19JVF9BV0QzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEFEQ19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBhbmQgbXVsdGltb2RlICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKTsKK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19Db21tb25TdHJ1Y3RJbml0KExMX0FEQ19Db21tb25Jbml0VHlwZURlZiAqQURDX0NvbW1vbkluaXRTdHJ1Y3QpOworCisvKiBEZS1pbml0aWFsaXphdGlvbiBvZiBBREMgaW5zdGFuY2UsIEFEQyBncm91cCByZWd1bGFyIGFuZCBBREMgZ3JvdXAgaW5qZWN0ZWQgKi8KKy8qIChhdmFpbGFiaWxpdHkgb2YgQURDIGdyb3VwIGluamVjdGVkIGRlcGVuZHMgb24gU1RNMzIgZmFtaWxpZXMpICovCitFcnJvclN0YXR1cyBMTF9BRENfRGVJbml0KEFEQ19UeXBlRGVmICpBREN4KTsKKworLyogSW5pdGlhbGl6YXRpb24gb2Ygc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Jbml0KEFEQ19UeXBlRGVmICpBREN4LCBMTF9BRENfSW5pdFR5cGVEZWYgKkFEQ19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19TdHJ1Y3RJbml0KExMX0FEQ19Jbml0VHlwZURlZiAqQURDX0luaXRTdHJ1Y3QpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIHJlZ3VsYXIgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX0FEQ19SRUdfU3RydWN0SW5pdChMTF9BRENfUkVHX0luaXRUeXBlRGVmICpBRENfUkVHX0luaXRTdHJ1Y3QpOworCisvKiBJbml0aWFsaXphdGlvbiBvZiBzb21lIGZlYXR1cmVzIG9mIEFEQyBpbnN0YW5jZSBhbmQgQURDIGdyb3VwIGluamVjdGVkICovCitFcnJvclN0YXR1cyBMTF9BRENfSU5KX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEFEQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9BRENfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9idXMuaCBiL0luYy9zdG0zMndieHhfbGxfYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3YTNmMAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfYnVzLmgKQEAgLTAsMCArMSwyMjE4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2J1cy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBCVVMgTEwgbW9kdWxlLgorCisgIEB2ZXJiYXRpbQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBMaW1pdGF0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBBIGRlbGF5IGJldHdlZW4gYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxlIGFuZCB0aGUgZWZmZWN0aXZlIHBlcmlwaGVyYWwKKyAgICAgIGVuYWJsaW5nIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBwZXJpcGhlcmFsIHJlYWQvd3JpdGUKKyAgICAgIGZyb20vdG8gcmVnaXN0ZXJzLgorICAgICAgKCspIFRoaXMgZGVsYXkgZGVwZW5kcyBvbiB0aGUgcGVyaXBoZXJhbCBtYXBwaW5nLgorICAgICAgICAoKyspIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgMSBkdW1teSByZWFkIGlzIG5lY2Vzc2FyeQorCisgICAgWy4uXQorICAgICAgV29ya2Fyb3VuZHM6CisgICAgICAoIykgRm9yIEFIQiAmIEFQQiBwZXJpcGhlcmFscywgYSBkdW1teSByZWFkIHRvIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIGhhcyBiZWVuCisgICAgICAgICAgaW5zZXJ0ZWQgaW4gZWFjaCBMTF97QlVTfV9HUlB7eH1fRW5hYmxlQ2xvY2soKSBmdW5jdGlvbi4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9CVVNfSAorI2RlZmluZSBTVE0zMldCeHhfTExfQlVTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJDQykKKworLyoqIEBkZWZncm91cCBCVVNfTEwgQlVTCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEJVU19MTF9FeHBvcnRlZF9Db25zdGFudHMgQlVTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FIQjFfR1JQMV9QRVJJUEggIEFIQjEgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICgweEZGRkZGRkZGVSkKKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExICAgICAgICAgICBSQ0NfQUhCMUVOUl9ETUExRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyICAgICAgICAgICBSQ0NfQUhCMUVOUl9ETUEyRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxICAgICAgICBSQ0NfQUhCMUVOUl9ETUFNVVgxRU4KKyNkZWZpbmUgTExfQUhCMV9HUlAxX1BFUklQSF9TUkFNMSAgICAgICAgICBSQ0NfQUhCMVNNRU5SX1NSQU0xU01FTgorI2RlZmluZSBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyAgICAgICAgICAgIFJDQ19BSEIxRU5SX0NSQ0VOCisjZGVmaW5lIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDICAgICAgICAgICAgUkNDX0FIQjFFTlJfVFNDRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FIQjJfR1JQMV9QRVJJUEggIEFIQjIgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICgweEZGRkZGRkZGVSkKKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQSAgICAgICAgICBSQ0NfQUhCMkVOUl9HUElPQUVOCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IgICAgICAgICAgUkNDX0FIQjJFTlJfR1BJT0JFTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DICAgICAgICAgIFJDQ19BSEIyRU5SX0dQSU9DRU4KKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRCAgICAgICAgICBSQ0NfQUhCMkVOUl9HUElPREVOCisjZGVmaW5lIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UgICAgICAgICAgUkNDX0FIQjJFTlJfR1BJT0VFTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IICAgICAgICAgIFJDQ19BSEIyRU5SX0dQSU9IRU4KKyNkZWZpbmUgTExfQUhCMl9HUlAxX1BFUklQSF9BREMgICAgICAgICAgICBSQ0NfQUhCMkVOUl9BRENFTgorI2RlZmluZSBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUzEgICAgICAgICAgIFJDQ19BSEIyRU5SX0FFUzFFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQUhCM19HUlAxX1BFUklQSCAgQUhCMyBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgKDB4RkZGRkZGRkZVKQorI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkgICAgICAgIFJDQ19BSEIzRU5SX1FVQURTUElFTgorI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSAgICAgICAgICAgIFJDQ19BSEIzRU5SX1BLQUVOCisjZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMiAgICAgICAgICAgUkNDX0FIQjNFTlJfQUVTMkVOCisjZGVmaW5lIExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HICAgICAgICAgICAgUkNDX0FIQjNFTlJfUk5HRU4KKyNkZWZpbmUgTExfQUhCM19HUlAxX1BFUklQSF9IU0VNICAgICAgICAgICBSQ0NfQUhCM0VOUl9IU0VNRU4KKyNkZWZpbmUgTExfQUhCM19HUlAxX1BFUklQSF9JUENDICAgICAgICAgICBSQ0NfQUhCM0VOUl9JUENDRU4KKyNkZWZpbmUgTExfQUhCM19HUlAxX1BFUklQSF9TUkFNMiAgICAgICAgICBSQ0NfQUhCM1NNRU5SX1NSQU0yU01FTgorI2RlZmluZSBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIICAgICAgICAgIFJDQ19BSEIzRU5SX0ZMQVNIRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjFfR1JQMV9QRVJJUEggIEFQQjEgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICgweEZGRkZGRkZGVSkKKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yICAgICAgICAgICBSQ0NfQVBCMUVOUjFfVElNMkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfTENEICAgICAgICAgICAgUkNDX0FQQjFFTlIxX0xDREVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCICAgICAgICAgUkNDX0FQQjFFTlIxX1JUQ0FQQkVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERyAgICAgICAgICAgUkNDX0FQQjFFTlIxX1dXREdFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIgICAgICAgICAgIFJDQ19BUEIxRU5SMV9TUEkyRU4KKyNkZWZpbmUgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxICAgICAgICAgICBSQ0NfQVBCMUVOUjFfSTJDMUVOCisjZGVmaW5lIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyAgICAgICAgICAgUkNDX0FQQjFFTlIxX0kyQzNFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUyAgICAgICAgICAgIFJDQ19BUEIxRU5SMV9DUlNFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQiAgICAgICAgICAgIFJDQ19BUEIxRU5SMV9VU0JFTgorI2RlZmluZSBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMSAgICAgICAgIFJDQ19BUEIxRU5SMV9MUFRJTTFFTgorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FQ19BUEIxX0dSUDJfUEVSSVBIICBBUEIxIEdSUDIgUEVSSVBICisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQVBCMV9HUlAyX1BFUklQSF9BTEwgICAgICAgICAgICAoMHhGRkZGRkZGRlUpCisjZGVmaW5lIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMSAgICAgICAgUkNDX0FQQjFFTlIyX0xQVUFSVDFFTgorI2RlZmluZSBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMiAgICAgICAgIFJDQ19BUEIxRU5SMl9MUFRJTTJFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQVBCMl9HUlAxX1BFUklQSCAgQVBCMiBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfQUxMICAgICAgICAgICAgKDB4RkZGRkZGRkZVKQorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEgICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTFFTgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEgICAgICAgICAgIFJDQ19BUEIyRU5SX1NQSTFFTgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMSAgICAgICAgIFJDQ19BUEIyRU5SX1VTQVJUMUVOCisjZGVmaW5lIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYgICAgICAgICAgUkNDX0FQQjJFTlJfVElNMTZFTgorI2RlZmluZSBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3ICAgICAgICAgIFJDQ19BUEIyRU5SX1RJTTE3RU4KKyNkZWZpbmUgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxICAgICAgICAgICBSQ0NfQVBCMkVOUl9TQUkxRU4KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0FQQjNfR1JQMV9QRVJJUEggIEFQQjMgR1JQMSBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9BUEIzX0dSUDFfUEVSSVBIX0FMTCAgICAgICAgICAgICgweEZGRkZGRkZGVSkKKyNkZWZpbmUgTExfQVBCM19HUlAxX1BFUklQSF9SRiAgICAgICAgICAgICBSQ0NfQVBCM1JTVFJfUkZSU1QKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQzJfQUhCMV9HUlAxX1BFUklQSCAgQzIgQUhCMSBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMSAgICAgICAgIFJDQ19DMkFIQjFFTlJfRE1BMUVOCisjZGVmaW5lIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMiAgICAgICAgIFJDQ19DMkFIQjFFTlJfRE1BMkVOCisjZGVmaW5lIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMSAgICAgIFJDQ19DMkFIQjFFTlJfRE1BTVVYMUVOCisjZGVmaW5lIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEgICAgICAgIFJDQ19DMkFIQjFFTlJfU1JBTTFFTgorI2RlZmluZSBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQyAgICAgICAgICBSQ0NfQzJBSEIxRU5SX0NSQ0VOCisjZGVmaW5lIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfVFNDICAgICAgICAgIFJDQ19DMkFIQjFFTlJfVFNDRU4KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQzJfQUhCMl9HUlAxX1BFUklQSCAgQzIgQUhCMiBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EgICAgICAgIFJDQ19DMkFIQjJFTlJfR1BJT0FFTgorI2RlZmluZSBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CICAgICAgICBSQ0NfQzJBSEIyRU5SX0dQSU9CRU4KKyNkZWZpbmUgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQyAgICAgICAgUkNDX0MyQUhCMkVOUl9HUElPQ0VOCisjZGVmaW5lIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QgICAgICAgIFJDQ19DMkFIQjJFTlJfR1BJT0RFTgorI2RlZmluZSBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FICAgICAgICBSQ0NfQzJBSEIyRU5SX0dQSU9FRU4KKyNkZWZpbmUgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPSCAgICAgICAgUkNDX0MyQUhCMkVOUl9HUElPSEVOCisjZGVmaW5lIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQURDICAgICAgICAgIFJDQ19DMkFIQjJFTlJfQURDRU4KKyNkZWZpbmUgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxICAgICAgICAgUkNDX0MyQUhCMkVOUl9BRVMxRU4KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQzJfQUhCM19HUlAxX1BFUklQSCAgQzIgQUhCMyBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUEtBICAgICAgICAgIFJDQ19DMkFIQjNFTlJfUEtBRU4KKyNkZWZpbmUgTExfQzJfQUhCM19HUlAxX1BFUklQSF9BRVMyICAgICAgICAgUkNDX0MyQUhCM0VOUl9BRVMyRU4KKyNkZWZpbmUgTExfQzJfQUhCM19HUlAxX1BFUklQSF9STkcgICAgICAgICAgUkNDX0MyQUhCM0VOUl9STkdFTgorI2RlZmluZSBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0hTRU0gICAgICAgICBSQ0NfQzJBSEIzRU5SX0hTRU1FTgorI2RlZmluZSBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0lQQ0MgICAgICAgICBSQ0NfQzJBSEIzRU5SX0lQQ0NFTgorI2RlZmluZSBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNIICAgICAgICBSQ0NfQzJBSEIzRU5SX0ZMQVNIRU4KKyNkZWZpbmUgTExfQzJfQUhCM19HUlAxX1BFUklQSF9TUkFNMiAgICAgICAgUkNDX0MyQUhCM1NNRU5SX1NSQU0yU01FTgorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FQ19DMl9BUEIxX0dSUDFfUEVSSVBIICBDMiBBUEIxIEdSUDEgUEVSSVBICisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yICAgICAgICAgUkNDX0MyQVBCMUVOUjFfVElNMkVOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTENEICAgICAgICAgIFJDQ19DMkFQQjFFTlIxX0xDREVOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCICAgICAgIFJDQ19DMkFQQjFFTlIxX1JUQ0FQQkVOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfU1BJMiAgICAgICAgIFJDQ19DMkFQQjFFTlIxX1NQSTJFTgorI2RlZmluZSBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0kyQzEgICAgICAgICBSQ0NfQzJBUEIxRU5SMV9JMkMxRU4KKyNkZWZpbmUgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMzICAgICAgICAgUkNDX0MyQVBCMUVOUjFfSTJDM0VOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfQ1JTICAgICAgICAgIFJDQ19DMkFQQjFFTlIxX0NSU0VOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVVNCICAgICAgICAgIFJDQ19DMkFQQjFFTlIxX1VTQkVOCisjZGVmaW5lIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xICAgICAgIFJDQ19DMkFQQjFFTlIxX0xQVElNMUVOCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VDX0MyX0FQQjFfR1JQMl9QRVJJUEggIEMyIEFQQjEgR1JQMiBQRVJJUEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEgICAgICBSQ0NfQzJBUEIxRU5SMl9MUFVBUlQxRU4KKyNkZWZpbmUgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIgICAgICAgUkNDX0MyQVBCMUVOUjJfTFBUSU0yRU4KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBCVVNfTExfRUNfQzJfQVBCMl9HUlAxX1BFUklQSCAgQzIgQVBCMiBHUlAxIFBFUklQSAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMSAgICAgICAgIFJDQ19DMkFQQjJFTlJfVElNMUVOCisjZGVmaW5lIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU1BJMSAgICAgICAgIFJDQ19DMkFQQjJFTlJfU1BJMUVOCisjZGVmaW5lIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxICAgICAgIFJDQ19DMkFQQjJFTlJfVVNBUlQxRU4KKyNkZWZpbmUgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xNiAgICAgICAgUkNDX0MyQVBCMkVOUl9USU0xNkVOCisjZGVmaW5lIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcgICAgICAgIFJDQ19DMkFQQjJFTlJfVElNMTdFTgorI2RlZmluZSBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NBSTEgICAgICAgICBSQ0NfQzJBUEIyRU5SX1NBSTFFTgorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FQ19DMl9BUEIzX0dSUDFfUEVSSVBIICBDMiBBUEIzIEdSUDEgUEVSSVBICisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQzJfQVBCM19HUlAxX1BFUklQSF9CTEUgICAgICAgICAgUkNDX0MyQVBCM0VOUl9CTEVFTgorI2RlZmluZSBMTF9DMl9BUEIzX0dSUDFfUEVSSVBIXzgwMiAgICAgICAgICBSQ0NfQzJBUEIzRU5SXzgwMkVOCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBCVVMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQUhCMSBBSEIxCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQUhCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFIQjFFTlIgICAgICBETUExRU4gICAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIxRU5SICAgICAgRE1BMkVOICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMUVOUiAgICAgIERNQU1VWDFFTiAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIxRU5SICAgICAgQ1JDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMUVOUiAgICAgIFRTQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9UU0MKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFIQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQUhCMUVOUiAgICAgIERNQTFFTiAgICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjFFTlIgICAgICBETUEyRU4gICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIxRU5SICAgICAgRE1BTVVYMUVOICAgICAgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjFFTlIgICAgICBDUkNFTiAgICAgICAgIExMX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIxRU5SICAgICAgVFNDRU4gICAgICAgICBMTF9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqIEByZXR2YWwgdWludDMyX3QKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QUhCMUVOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQUhCMUVOUiAgICAgIERNQTFFTiAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEIxRU5SICAgICAgRE1BMkVOICAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjFFTlIgICAgICBETUFNVVgxRU4gICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjFFTlIgICAgICBDUkNFTiAgICAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMUVOUiAgICAgIFRTQ0VOICAgICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEIxRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQUhCMVJTVFIgICAgIERNQTFSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQTJSU1QgICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMVJTVFIgICAgIERNQU1VWDFSU1QgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjFSU1RSICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjFSU1RSICAgICBUU0NSU1QgICAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoUkNDLT5BSEIxUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSBBSEIxIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQUhCMVJTVFIgICAgIERNQTFSU1QgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEIxUlNUUiAgICAgRE1BMlJTVCAgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjFSU1RSICAgICBETUFNVVgxUlNUICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjFSU1RSICAgICBDUkNSU1QgICAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMVJTVFIgICAgIFRTQ1JTVCAgICAgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9UU0MKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQjFSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQUhCMSBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFIQjFTTUVOUiAgICBETUExU01FTiAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjFTTUVOUiAgICBETUEyU01FTiAgICAgIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjFTTUVOUiAgICBETUFNVVgxU01FTiAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIxU01FTlIgICAgU1JBTTFTTUVOICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIxU01FTlIgICAgQ1JDU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIxU01FTlIgICAgVFNDU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCMVNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIxU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBSEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQUhCMVNNRU5SICAgIERNQTFTTUVOICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjFTTUVOUiAgICBETUEyU01FTiAgICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIxU01FTlIgICAgRE1BTVVYMVNNRU4gICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjFTTUVOUiAgICBTUkFNMVNNRU4gICAgIExMX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIxU01FTlIgICAgQ1JDU01FTiAgICAgICBMTF9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCMVNNRU5SICAgIFRTQ1NNRU4gICAgICAgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFIQjFTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0FIQjIgQUhCMgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFIQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBSEIyRU5SICAgICAgR1BJT0FFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9CRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPQ0VOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0RFTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9FRU4gICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPSEVOICAgICAgIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgQURDRU4gICAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEFFUzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCMkVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCMkVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBSEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFIQjJFTlIgICAgICBHUElPQUVOICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0JFTiAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9DRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPREVOICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0VFTiAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9IRU4gICAgICAgTExfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBBRENFTiAgICAgICAgIExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgQUVTMUVOICAgICAgICBMTF9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUzEKKyAgKiBAcmV0dmFsIHVpbnQzMl90CisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkFIQjJFTlIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQUhCMiBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFIQjJFTlIgICAgICBHUElPQUVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9CRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0NFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBHUElPREVOICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEdQSU9FRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEIyRU5SICAgICAgR1BJT0hFTiAgICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjJFTlIgICAgICBBRENFTiAgICAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCMkVOUiAgICAgIEFFUzFFTiAgICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QUhCMkVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQUhCMiBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFIQjJSU1RSICAgICBHUElPQVJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPQlJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPQ1JTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPRFJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPRVJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPSFJTVCAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBBRENSU1QgICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBBRVMxUlNUICAgICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ICisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FFUzEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QUhCMlJTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgQUhCMiBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFIQjJSU1RSICAgICBHUElPQVJTVCAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMlJTVFIgICAgIEdQSU9CUlNUICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEIyUlNUUiAgICAgR1BJT0NSU1QgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBHUElPRFJTVCAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMlJTVFIgICAgIEdQSU9FUlNUICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEIyUlNUUiAgICAgR1BJT0hSU1QgICAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjJSU1RSICAgICBBRENSU1QgICAgICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCMlJTVFIgICAgIEFFUzFSU1QgICAgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BRVMxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEIyUlNUUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFIQjIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBSEIyU01FTlIgICAgR1BJT0FTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0JTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0NTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0RTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0VTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0hTTUVOICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgQURDU01FTiAgICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgQUVTMVNNRU4gICAgICBMTF9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCMlNNRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BSEIyU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBSEIyIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQUhCMlNNRU5SICAgIEdQSU9BU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPQlNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0NTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCMlNNRU5SICAgIEdQSU9EU01FTiAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjJTTUVOUiAgICBHUElPRVNNRU4gICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIyU01FTlIgICAgR1BJT0hTTUVOICAgICBMTF9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCMlNNRU5SICAgIEFEQ1NNRU4gICAgICAgTExfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjJTTUVOUiAgICBBRVMxU01FTiAgICAgIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ECisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIyX0dSUDFfUEVSSVBIX0FEQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjJfR1JQMV9QRVJJUEhfQUVTMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BSEIyU01FTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BSEIzIEFIQjMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBSEIzIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQUhCM0VOUiAgICAgIFFVQURTUElFTiAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBQS0FFTiAgICAgICAgIExMX0FIQjNfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgQUVTMkVOICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIFJOR0VOICAgICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBIU0VNRU4gICAgICAgIExMX0FIQjNfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgSVBDQ0VOICAgICAgICBMTF9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIEZMQVNIRU4gICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUVVBRFNQSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUEtBCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9BRVMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9STkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0hTRU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0lQQ0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNICisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBSEIzIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFIQjNFTlIgICAgICBRVUFEU1BJRU4gICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgUEtBRU4gICAgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIEFFUzJFTiAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBSTkdFTiAgICAgICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgSFNFTUVOICAgICAgICBMTF9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIElQQ0NFTiAgICAgICAgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBGTEFTSEVOICAgICAgIExMX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9IU0VNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9JUENDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSAorICAqIEByZXR2YWwgdWludDMyX3QKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBSEIzIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQUhCM0VOUiAgICAgIFFVQURTUElFTiAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgUEtBRU4gICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBBRVMyRU4gICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIFJOR0VOICAgICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBSEIzRU5SICAgICAgSFNFTUVOICAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFIQjNFTlIgICAgICBJUENDRU4gICAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQUhCM0VOUiAgICAgIEZMQVNIRU4gICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9IU0VNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9JUENDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSAorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM0VOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQUhCMyBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFIQjNSU1RSICAgICBRVUFEU1BJUlNUICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBQS0FSU1QgICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBBRVMyUlNUICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBSTkdSU1QgICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBIU0VNUlNUICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBJUENDUlNUICAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBGTEFTSFJTVCAgICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfSFNFTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfSVBDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QUhCM1JTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgQUhCMyBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFIQjNSU1RSICAgICBRVUFEU1BJUlNUICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCM1JTVFIgICAgIFBLQVJTVCAgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEIzUlNUUiAgICAgQUVTMlJTVCAgICAgICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBSTkdSU1QgICAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQUhCM1JTVFIgICAgIEhTRU1SU1QgICAgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBSEIzUlNUUiAgICAgSVBDQ1JTVCAgICAgICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFIQjNSU1RSICAgICBGTEFTSFJTVCAgICAgIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCMl9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9IU0VNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9JUENDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9GTEFTSAorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FIQjNfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM1JTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBSEIzIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQUhCM1NNRU5SICAgIFFVQURTUElTTUVOICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIFBLQVNNRU4gICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIEFFUzJTTUVOICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIFJOR1NNRU4gICAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIFNSQU0yU01FTiAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIEZMQVNIU01FTiAgICAgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9RVUFEU1BJCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfU1JBTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNICisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5BSEIzU01FTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFIQjNTTUVOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFIQjMgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBSEIzU01FTlIgICAgUVVBRFNQSVNNRU4gICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIFBLQVNNRU4gICAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjNTTUVOUiAgICBBRVMyU01FTiAgICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBSEIzU01FTlIgICAgUk5HU01FTiAgICAgICBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQUhCM1NNRU5SICAgIFNSQU0yU01FTiAgICAgTExfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFIQjNTTUVOUiAgICBGTEFTSFNNRU4gICAgIExMX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1FVQURTUEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQUhCM19HUlAxX1BFUklQSF9TUkFNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QUhCM1NNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQVBCMSBBUEIxCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgTENERU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIFJUQ0FQQkVOICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzFFTiAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgQ1JTRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCMUVOUjEsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFFTlIxLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBUEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMUVOUjIgICAgIExQVUFSVDFFTiAgICAgTExfQVBCMV9HUlAyX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIyICAgICBMUFRJTTJFTiAgICAgIExMX0FQQjFfR1JQMl9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFFTlIyLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEFQQjFFTlIxICAgICBUSU0yRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgTENERU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIFJUQ0FQQkVOICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBXV0RHRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgU1BJMkVOICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIEkyQzFFTiAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgQ1JTRU4gICAgICAgICBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIFVTQkVOICAgICAgICAgTExfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9XV0RHCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICogQHJldHZhbCB1aW50MzJfdAorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMSwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBUEIxRU5SMiAgICAgTFBVQVJUMUVOICAgICBMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjIgICAgIExQVElNMkVOICAgICAgTExfQVBCMV9HUlAyX0lzRW5hYmxlZENsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yCisgICogQHJldHZhbCB1aW50MzJfdAorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEIxRU5SMiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBUEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMUVOUjEgICAgIFRJTTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgTENERU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBSVENBUEJFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIFNQSTJFTiAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgSTJDMUVOICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBJMkMzRU4gICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjEgICAgIENSU0VOICAgICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIxRU5SMSAgICAgVVNCRU4gICAgICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjFFTlIxICAgICBMUFRJTTFFTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MQ0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEFQQjFFTlIyICAgICBMUFVBUlQxRU4gICAgIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMUVOUjIgICAgIExQVElNMkVOICAgICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMUVOUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZvcmNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIxUlNUUjEgICAgVElNMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgTENEUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgU1BJMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgSTJDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgSTJDM1JTVCAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgQ1JTUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgVVNCUlNUICAgICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgTFBUSU0xUlNUICAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTENECisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9DUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChSQ0MtPkFQQjFSU1RSMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgQVBCMSBwZXJpcGhlcmFscyByZXNldC4KKyAgKiBAcm10b2xsIEFQQjFSU1RSMiAgICBMUFVBUlQxUlNUICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSMiAgICBMUFRJTTJSU1QgICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0CisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfQUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKFJDQy0+QVBCMVJTVFIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIxUlNUUjEgICAgVElNMlJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSMSAgICBMQ0RSU1QgICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIxICAgIFNQSTJSU1QgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgSTJDMVJTVCAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSMSAgICBJMkMzUlNUICAgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMVJTVFIxICAgIENSU1JTVCAgICAgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIxUlNUUjEgICAgVVNCUlNUICAgICAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSMSAgICBMUFRJTTFSU1QgICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xDRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFQQjEgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIxUlNUUjIgICAgTFBVQVJUMVJTVCAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjFSU1RSMiAgICBMUFRJTTJSU1QgICAgIExMX0FQQjFfR1JQMl9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAyX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMVJTVFIyLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMSBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFQQjFTTUVOUjEgICBUSU0yU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBMQ0RTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBSVENBUEJTTUVOICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBXV0RHU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBTUEkyU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBJMkMxU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBJMkMzU01FTiAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBDUlNTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBVU0JTTUVOICAgICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBMUFRJTTFTTUVOICAgIExMX0FQQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfTENECisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1dXREcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0NSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfVVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjFTTUVOUjEsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBUEIxU01FTlIyICAgTFBVQVJUMVNNRU4gICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIyICAgTFBUSU0yU01FTiAgICBMTF9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMl9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QVBCMVNNRU5SMiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMVNNRU5SMiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBUEIxU01FTlIxICAgVElNMlNNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SMSAgIExDRFNNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBSVENBUEJTTUVOICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIxICAgV1dER1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SMSAgIFNQSTJTTUVOICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBJMkMxU01FTiAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIxICAgSTJDM1NNRU4gICAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SMSAgIENSU1NNRU4gICAgICAgTExfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjFTTUVOUjEgICBVU0JTTUVOICAgICAgIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIxU01FTlIxICAgTFBUSU0xU01FTiAgICBMTF9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9MQ0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfV1dERworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEIxU01FTlIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFQQjEgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBBUEIxU01FTlIyICAgTFBVQVJUMVNNRU4gICBMTF9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMVNNRU5SMiAgIExQVElNMlNNRU4gICAgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQjFTTUVOUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9BUEIyIEFQQjIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBUEIyIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQVBCMkVOUiAgICAgIFRJTTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVVNBUlQxRU4gICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE2RU4gICAgICAgTExfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgU0FJMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9VU0FSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU0FJMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjJfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjJFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkFQQjJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQVBCMiBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBBUEIyRU5SICAgICAgVElNMUVOICAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNQSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBVU0FSVDFFTiAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTZFTiAgICAgICBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFRJTTE3RU4gICAgICAgTExfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTQUkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCB1aW50MzJfdAorKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKSA9PSAoUGVyaXBocykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBBUEIyRU5SICAgICAgVElNMUVOICAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBTUEkxRU4gICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFVTQVJUMUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBBUEIyRU5SICAgICAgVElNMTZFTiAgICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEFQQjJFTlIgICAgICBUSU0xN0VOICAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQVBCMkVOUiAgICAgIFNBSTFFTiAgICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5BUEIyRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBBUEIyIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQVBCMlJTVFIgICAgIFRJTTFSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNQSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFVTQVJUMVJTVCAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFRJTTE2UlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFRJTTE3UlNUICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNBSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9BTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChSQ0MtPkFQQjJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFQQjIgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIyUlNUUiAgICAgVElNMVJTVCAgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBTUEkxUlNUICAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFVTQVJUMVJTVCAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldFxuCisgICogICAgICAgICBBUEIyUlNUUiAgICAgVElNMTZSU1QgICAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0XG4KKyAgKiAgICAgICAgIEFQQjJSU1RSICAgICBUSU0xN1JTVCAgICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXRcbgorICAqICAgICAgICAgQVBCMlJTVFIgICAgIFNBSTFSU1QgICAgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX0FMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkFQQjJSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQVBCMiBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFQQjJTTUVOUiAgICBUSU0xU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBTUEkxU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBVU0FSVDFTTUVOICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBUSU0xNlNNRU4gICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBUSU0xN1NNRU4gICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBTQUkxU01FTiAgICAgIExMX0FQQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkFQQjJTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQVBCMiBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEFQQjJTTUVOUiAgICBUSU0xU01FTiAgICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgU1BJMVNNRU4gICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMlNNRU5SICAgIFVTQVJUMVNNRU4gICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEFQQjJTTUVOUiAgICBUSU0xNlNNRU4gICAgIExMX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBBUEIyU01FTlIgICAgVElNMTdTTUVOICAgICBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQVBCMlNNRU5SICAgIFNBSTFTTUVOICAgICAgTExfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIyX0dSUDFfUEVSSVBIX1NBSTEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCMlNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQVBCMyBBUEIzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBBUEIzIHBlcmlwaGVyYWxzIHJlc2V0LgorICAqIEBybXRvbGwgQVBCM1JTVFIgICAgIFJGUlNUICAgICAgICBMTF9BUEIzX0dSUDFfRm9yY2VSZXNldAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9BUEIzX0dSUDFfUEVSSVBIX1JGCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQVBCM19HUlAxX0ZvcmNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChSQ0MtPkFQQjNSU1RSLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFQQjMgcGVyaXBoZXJhbHMgcmVzZXQuCisgICogQHJtdG9sbCBBUEIzUlNUUiAgICAgUkZSU1QgICAgICAgIExMX0FQQjNfR1JQMV9SZWxlYXNlUmVzZXQKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQVBCM19HUlAxX1BFUklQSF9SRgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0FQQjNfR1JQMV9SZWxlYXNlUmVzZXQodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QVBCM1JTVFIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9DMl9BSEIxIEMyIEFIQjEKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQzJBSEIxRU5SICAgIERNQTFFTiAgICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBETUEyRU4gICAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjFFTlIgICAgRE1BTVVYMUVOICAgICBMTF9DMl9BSEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIxRU5SICAgIFNSQU0xRU4gICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBDUkNFTiAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjFFTlIgICAgVFNDRU4gICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9TUkFNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MKKyAgKiBAcmV0dmFsIE5vbmUKKyovCisKK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkMyQUhCMUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBSEIxRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEMyQUhCMSBwZXJpcGhlcmFsIGNsb2NrIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDMkFIQjFFTlIgICAgRE1BMUVOICAgICAgICBMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIxRU5SICAgIERNQTJFTiAgICAgICAgTExfQzJfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBETUFNVVgxRU4gICAgIExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjFFTlIgICAgU1JBTTFFTiAgICAgICBMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIxRU5SICAgIENSQ0VOICAgICAgICAgTExfQzJfQUhCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBUU0NFTiAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9Jc0VuYWJsZWRDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0RNQU1VWDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX1NSQU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9DUkMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX1RTQworICAqIEByZXR2YWwgdWludDMyX3QKKyovCisKK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9BSEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DMkFIQjFFTlIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQzJBSEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQzJBSEIxRU5SICAgIERNQTFFTiAgICAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjFFTlIgICAgRE1BMkVOICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBETUFNVVgxRU4gICAgIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIxRU5SICAgIFNSQU0xRU4gICAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjFFTlIgICAgQ1JDRU4gICAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBUU0NFTiAgICAgICAgIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9TUkFNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MKKyAgKiBAcmV0dmFsIE5vbmUKKyovCisKK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QzJBSEIxRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBSEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBSEIxU01FTlIgIERNQTFTTUVOICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxU01FTlIgIERNQTJTTUVOICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxU01FTlIgIERNQU1VWDFTTUVOICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxRU5SICAgIFNSQU0xU01FTiAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxU01FTlIgIENSQ1NNRU4gICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxU01FTlIgIFRTQ1NNRU4gICAgICAgTExfQzJfQUhCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9TUkFNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfQ1JDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMV9HUlAxX1BFUklQSF9UU0MKKyAgKiBAcmV0dmFsIE5vbmUKKyovCisKK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FIQjFfR1JQMV9FbmFibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QzJBSEIxU01FTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkMyQUhCMVNNRU5SLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQzJBSEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBSEIxU01FTlIgIERNQTFTTUVOICAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMVNNRU5SICBETUEyU01FTiAgICAgIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFIQjFTTUVOUiAgRE1BTVVYMVNNRU4gICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMUVOUiAgICBTUkFNMVNNRU4gICAgIExMX0MyX0FIQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFIQjFTTUVOUiAgQ1JDU01FTiAgICAgICBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIxU01FTlIgIFRTQ1NNRU4gICAgICAgTExfQzJfQUhCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfRE1BTVVYMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfU1JBTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIxX0dSUDFfUEVSSVBIX0NSQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjFfR1JQMV9QRVJJUEhfVFNDCisgICogQHJldHZhbCBOb25lCisqLworCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BSEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QzJBSEIxU01FTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9DMl9BSEIyIEMyIEFIQjIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFIQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFIQjJFTlIgICAgR1BJT0FFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9CRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBHUElPQ0VOICAgICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgR1BJT0RFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9FRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBHUElPSEVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgQURDRU4gICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEFFUzFFTiAgICAgICAgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QzJBSEIyRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5DMkFIQjJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQzJBSEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEMyQUhCMkVOUiAgICBHUElPQUVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgR1BJT0JFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9DRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBHUElPREVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgR1BJT0VFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9IRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBBRENFTiAgICAgICAgIExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgQUVTMUVOICAgICAgICBMTF9DMl9BSEIyX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ICisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FFUzEKKyAgKiBAcmV0dmFsIHVpbnQzMl90CisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0FIQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkMyQUhCMkVOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFIQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFIQjJFTlIgICAgR1BJT0FFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBHUElPQkVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9DRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgR1BJT0RFTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBHUElPRUVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIyRU5SICAgIEdQSU9IRU4gICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjJFTlIgICAgQURDRU4gICAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCMkVOUiAgICBBRVMxRU4gICAgICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9ICisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0FFUzEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkMyQUhCMkVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEMyQUhCMiBwZXJpcGhlcmFscyBjbG9jayBkdXJpbmcgTG93IFBvd2VyIChTbGVlcCkgbW9kZS4KKyAgKiBAcm10b2xsIEMyQUhCMlNNRU5SICBHUElPQVNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPQlNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPQ1NNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPRFNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPRVNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPSFNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBBRENTTUVOICAgICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBBRVMxU01FTiAgICAgIExMX0MyX0FIQjJfR1JQMV9FbmFibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQUhCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFIQjJTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBSEIyU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFIQjIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFIQjJTTUVOUiAgR1BJT0FTTUVOICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIyU01FTlIgIEdQSU9CU01FTiAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPQ1NNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFIQjJTTUVOUiAgR1BJT0RTTUVOICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIyU01FTlIgIEdQSU9FU01FTiAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCMlNNRU5SICBHUElPSFNNRU4gICAgIExMX0MyX0FIQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFIQjJTTUVOUiAgQURDU01FTiAgICAgICBMTF9DMl9BSEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIyU01FTlIgIEFFUzFTTUVOICAgICAgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9CCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIyX0dSUDFfUEVSSVBIX0dQSU9FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9HUElPSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjJfR1JQMV9QRVJJUEhfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCMl9HUlAxX1BFUklQSF9BRVMxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQUhCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkMyQUhCMlNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQzJfQUhCMyBDMiBBSEIzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBSEIzIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQzJBSEIzRU5SICAgIFBLQUVOICAgICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBBRVMyRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjNFTlIgICAgUk5HRU4gICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIzRU5SICAgIEhTRU1FTiAgICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBJUENDRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjNFTlIgICAgRkxBU0hFTiAgICAgICBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSFNFTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BSEIzX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFIQjNFTlIsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkMyQUhCM0VOUiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDMkFIQjMgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQzJBSEIzRU5SICAgIFBLQUVOICAgICAgICAgTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBBRVMyRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjNFTlIgICAgUk5HRU4gICAgICAgICBMTF9DMl9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIzRU5SICAgIEhTRU1FTiAgICAgICAgTExfQzJfQUhCM19HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBJUENDRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFIQjNFTlIgICAgRkxBU0hFTiAgICAgICBMTF9DMl9BSEIzX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSFNFTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfSVBDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfRkxBU0gKKyAgKiBAcmV0dmFsIHVpbnQzMl90CisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0FIQjNfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkMyQUhCM0VOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFIQjMgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFIQjNFTlIgICAgUEtBRU4gICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBBRVMyRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIzRU5SICAgIFJOR0VOICAgICAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFIQjNFTlIgICAgSFNFTUVOICAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQUhCM0VOUiAgICBJUENDRU4gICAgICAgIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBSEIzRU5SICAgIEZMQVNIRU4gICAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9IU0VNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9JUENDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9GTEFTSAorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QzJBSEIzRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBSEIzIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBSEIzU01FTlIgIFBLQVNNRU4gICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIEFFUzJTTUVOICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIFJOR1NNRU4gICAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIFNSQU0yU01FTiAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIEZMQVNIU01FTiAgICAgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfU1JBTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX0ZMQVNICisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQUhCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBSEIzU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFIQjMgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFIQjNTTUVOUiAgUEtBU01FTiAgICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIEFFUzJTTUVOICAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQUhCM1NNRU5SICBSTkdTTUVOICAgICAgIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFIQjNTTUVOUiAgU1JBTTJTTUVOICAgICBMTF9DMl9BSEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBSEIzU01FTlIgIEZMQVNIU01FTiAgICAgTExfQzJfQUhCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FIQjNfR1JQMV9QRVJJUEhfUEtBCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9BRVMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9STkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BSEIzX0dSUDFfUEVSSVBIX1NSQU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQUhCM19HUlAxX1BFUklQSF9GTEFTSAorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FIQjNfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5DMkFIQjNTTUVOUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQlVTX0xMX0VGX0MyX0FQQjEgQzIgQVBCMQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEMyQVBCMSBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEMyQVBCMUVOUjEgICBUSU0yRU4gICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgTENERU4gICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIFJUQ0FQQkVOICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBTUEkyRU4gICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgSTJDMUVOICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIEkyQzNFTiAgICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBDUlNFTiAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgVVNCRU4gICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIExQVElNMUVOICAgICAgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVElNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTENECisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9SVENBUEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1NQSTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0kyQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0kyQzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0NSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfVVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFQQjFFTlIxLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5DMkFQQjFFTlIxLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFQQjFFTlIyICAgTFBVQVJUMUVOICAgICBMTF9DMl9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMiAgIExQVElNMkVOICAgICAgTExfQzJfQVBCMV9HUlAyX0VuYWJsZUNsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMV9HUlAyX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QzJBUEIxRU5SMiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBUEIxRU5SMiwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDMkFQQjEgcGVyaXBoZXJhbCBjbG9jayBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQzJBUEIxRU5SMSAgIFRJTTJFTiAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBMQ0RFTiAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgUlRDQVBCRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIFNQSTJFTiAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBJMkMxRU4gICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgSTJDM0VOICAgICAgICBMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIENSU0VOICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBVU0JFTiAgICAgICAgIExMX0MyX0FQQjFfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgTFBUSU0xRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9MQ0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgdWludDMyX3QKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfQVBCMV9HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QzJBUEIxRU5SMSwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQzJBUEIxIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEMyQVBCMUVOUjIgICBMUFVBUlQxRU4gICAgIExMX0MyX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIyICAgTFBUSU0yRU4gICAgICBMTF9DMl9BUEIxX0dSUDJfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIKKyAgKiBAcmV0dmFsIHVpbnQzMl90CisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0FQQjFfR1JQMl9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkMyQVBCMUVOUjIsIFBlcmlwaHMpID09IChQZXJpcGhzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQzJBUEIxIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQzJBUEIxRU5SMSAgIFRJTTJFTiAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgTENERU4gICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBSVENBUEJFTiAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIFNQSTJFTiAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgSTJDMUVOICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBJMkMzRU4gICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIxRU5SMSAgIENSU0VOICAgICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjFFTlIxICAgVVNCRU4gICAgICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjEgICBMUFRJTTFFTiAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9MQ0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2sodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QzJBUEIxRU5SMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFQQjEgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFQQjFFTlIyICAgTFBVQVJUMUVOICAgICBMTF9DMl9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMUVOUjIgICBMUFRJTTJFTiAgICAgIExMX0MyX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BUEIxX0dSUDJfRGlzYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkMyQVBCMUVOUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFQQjEgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFQQjFTTUVOUjEgVElNMlNNRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgTENEU01FTiAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgUlRDQVBCU01FTiAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgU1BJMlNNRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgSTJDMVNNRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgSTJDM1NNRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgQ1JTU01FTiAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgVVNCU01FTiAgICAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgTFBUSU0xU01FTiAgICBMTF9DMl9BUEIxX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1RJTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xDRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfUlRDQVBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9TUEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9JMkMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9DUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1VTQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMV9HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFBlcmlwaHMpOworICAvKiBEZWxheSBhZnRlciBhbiBSQ0MgcGVyaXBoZXJhbCBjbG9jayBlbmFibGluZyAqLworICB0bXByZWcgPSBSRUFEX0JJVChSQ0MtPkMyQVBCMVNNRU5SMSwgUGVyaXBocyk7CisgICh2b2lkKXRtcHJlZzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBUEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBUEIxU01FTlIyIExQVUFSVDFTTUVOICAgTExfQzJfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIxU01FTlIyIExQVElNMlNNRU4gICAgTExfQzJfQVBCMV9HUlAyX0VuYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFVBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAyX1BFUklQSF9MUFRJTTIKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BUEIxX0dSUDJfRW5hYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgU0VUX0JJVChSQ0MtPkMyQVBCMVNNRU5SMiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBUEIxU01FTlIyLCBQZXJpcGhzKTsKKyAgKHZvaWQpdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQzJBUEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBUEIxU01FTlIxIFRJTTJTTUVOICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMVNNRU5SMSBMQ0RTTUVOICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgUlRDQVBCU01FTiAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIxU01FTlIxIFNQSTJTTUVOICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMVNNRU5SMSBJMkMxU01FTiAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgSTJDM1NNRU4gICAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIxU01FTlIxIENSU1NNRU4gICAgICAgTExfQzJfQVBCMV9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMVNNRU5SMSBVU0JTTUVOICAgICAgIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjFTTUVOUjEgTFBUSU0xU01FTiAgICBMTF9DMl9BUEIxX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9USU0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9MQ0QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX1JUQ0FQQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfU1BJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfSTJDMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjFfR1JQMV9QRVJJUEhfQ1JTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMV9HUlAxX1BFUklQSF9VU0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDFfUEVSSVBIX0xQVElNMQorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FQQjFfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5DMkFQQjFTTUVOUjEsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQzJBUEIxIHBlcmlwaGVyYWxzIGNsb2NrIGR1cmluZyBMb3cgUG93ZXIgKFNsZWVwKSBtb2RlLgorICAqIEBybXRvbGwgQzJBUEIxU01FTlIyIExQVUFSVDFTTUVOICAgTExfQzJfQVBCMV9HUlAyX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMVNNRU5SMiBMUFRJTTJTTUVOICAgIExMX0MyX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMgorICAqIEByZXR2YWwgTm9uZQorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0FQQjFfR1JQMl9EaXNhYmxlQ2xvY2tTbGVlcCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5DMkFQQjFTTUVOUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEJVU19MTF9FRl9DMl9BUEIyIEMyIEFQQjIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFQQjJFTlIgICAgVElNMUVOICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFNQSTFFTiAgICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMkVOUiAgICBVU0FSVDFFTiAgICAgIExMX0MyX0FQQjJfR1JQMV9FbmFibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjJFTlIgICAgVElNMTZFTiAgICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFRJTTE3RU4gICAgICAgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMkVOUiAgICBTQUkxRU4gICAgICAgIExMX0MyX0FQQjJfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QzJBUEIyRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5DMkFQQjJFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQzJBUEIyIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEMyQVBCMkVOUiAgICBUSU0xRU4gICAgICAgIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjJFTlIgICAgU1BJMUVOICAgICAgICBMTF9DMl9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFVTQVJUMUVOICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMkVOUiAgICBUSU0xNkVOICAgICAgIExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjJFTlIgICAgVElNMTdFTiAgICAgICBMTF9DMl9BUEIyX0dSUDFfSXNFbmFibGVkQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFNBSTFFTiAgICAgICAgTExfQzJfQVBCMl9HUlAxX0lzRW5hYmxlZENsb2NrCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfU1BJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NBSTEKKyAgKiBAcmV0dmFsIHVpbnQzMl90CisqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0FQQjJfR1JQMV9Jc0VuYWJsZWRDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkMyQVBCMkVOUiwgUGVyaXBocykgPT0gKFBlcmlwaHMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFQQjIgcGVyaXBoZXJhbHMgY2xvY2suCisgICogQHJtdG9sbCBDMkFQQjJFTlIgICAgVElNMUVOICAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMkVOUiAgICBTUEkxRU4gICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFVTQVJUMUVOICAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1xuCisgICogICAgICAgICBDMkFQQjJFTlIgICAgVElNMTZFTiAgICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCMkVOUiAgICBUSU0xN0VOICAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIyRU5SICAgIFNBSTFFTiAgICAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5DMkFQQjJFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFQQjIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFQQjJTTUVOUiAgVElNMVNNRU4gICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgU1BJMVNNRU4gICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgVVNBUlQxU01FTiAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgVElNMTZTTUVOICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgVElNMTdTTUVOICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgU0FJMVNNRU4gICAgICBMTF9DMl9BUEIyX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMl9HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFQQjJTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBUEIyU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFQQjIgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFQQjJTTUVOUiAgVElNMVNNRU4gICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIyU01FTlIgIFNQSTFTTUVOICAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMlNNRU5SICBVU0FSVDFTTUVOICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjJTTUVOUiAgVElNMTZTTUVOICAgICBMTF9DMl9BUEIyX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIyU01FTlIgIFRJTTE3U01FTiAgICAgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwXG4KKyAgKiAgICAgICAgIEMyQVBCMlNNRU5SICBTQUkxU01FTiAgICAgIExMX0MyX0FQQjJfR1JQMV9EaXNhYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1NQSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1VTQVJUMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIyX0dSUDFfUEVSSVBIX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCMl9HUlAxX1BFUklQSF9TQUkxCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCMl9HUlAxX0Rpc2FibGVDbG9ja1NsZWVwKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChSQ0MtPkMyQVBCMlNNRU5SLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBCVVNfTExfRUZfQzJfQVBCMyBDMiBBUEIzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQzJBUEIzIHBlcmlwaGVyYWxzIGNsb2NrLgorICAqIEBybXRvbGwgQzJBUEIzRU5SICAgIEJMRUVOICAgICAgICAgTExfQzJfQVBCM19HUlAxX0VuYWJsZUNsb2NrXG4KKyAgKiAgICAgICAgIEMyQVBCM0VOUiAgICA4MDJFTiAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9FbmFibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIzX0dSUDFfUEVSSVBIX0JMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfODAyCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCM19HUlAxX0VuYWJsZUNsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICBTRVRfQklUKFJDQy0+QzJBUEIzRU5SLCBQZXJpcGhzKTsKKyAgLyogRGVsYXkgYWZ0ZXIgYW4gUkNDIHBlcmlwaGVyYWwgY2xvY2sgZW5hYmxpbmcgKi8KKyAgdG1wcmVnID0gUkVBRF9CSVQoUkNDLT5DMkFQQjNFTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQzJBUEIzIHBlcmlwaGVyYWwgY2xvY2sgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEMyQVBCM0VOUiAgICBCTEVFTiAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9Jc0VuYWJsZWRDbG9ja1xuCisgICogICAgICAgICBDMkFQQjNFTlIgICAgODAyRU4gICAgICAgICBMTF9DMl9BUEIzX0dSUDFfSXNFbmFibGVkQ2xvY2sKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCM19HUlAxX1BFUklQSF9CTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIzX0dSUDFfUEVSSVBIXzgwMgorICAqIEByZXR2YWwgdWludDMyX3QKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfQVBCM19HUlAxX0lzRW5hYmxlZENsb2NrKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QzJBUEIzRU5SLCBQZXJpcGhzKSA9PSAoUGVyaXBocykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEMyQVBCMyBwZXJpcGhlcmFscyBjbG9jay4KKyAgKiBAcm10b2xsIEMyQVBCM0VOUiAgICBCTEVFTiAgICAgICAgIExMX0MyX0FQQjNfR1JQMV9EaXNhYmxlQ2xvY2tcbgorICAqICAgICAgICAgQzJBUEIzRU5SICAgIDgwMkVOICAgICAgICAgTExfQzJfQVBCM19HUlAxX0Rpc2FibGVDbG9jaworICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIzX0dSUDFfUEVSSVBIX0JMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfODAyCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCM19HUlAxX0Rpc2FibGVDbG9jayh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoUkNDLT5DMkFQQjNFTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDMkFQQjMgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFQQjNTTUVOUiAgQkxFU01FTiAgICAgICBMTF9DMl9BUEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcFxuCisgICogICAgICAgICBDMkFQQjNTTUVOUiAgODAyU01FTiAgICAgICBMTF9DMl9BUEIzX0dSUDFfRW5hYmxlQ2xvY2tTbGVlcAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9BUEIzX0dSUDFfUEVSSVBIX0JMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfODAyCisgICogQHJldHZhbCBOb25lCisqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfQVBCM19HUlAxX0VuYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIFNFVF9CSVQoUkNDLT5DMkFQQjNTTUVOUiwgUGVyaXBocyk7CisgIC8qIERlbGF5IGFmdGVyIGFuIFJDQyBwZXJpcGhlcmFsIGNsb2NrIGVuYWJsaW5nICovCisgIHRtcHJlZyA9IFJFQURfQklUKFJDQy0+QzJBUEIzU01FTlIsIFBlcmlwaHMpOworICAodm9pZCl0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDMkFQQjMgcGVyaXBoZXJhbHMgY2xvY2sgZHVyaW5nIExvdyBQb3dlciAoU2xlZXApIG1vZGUuCisgICogQHJtdG9sbCBDMkFQQjNTTUVOUiAgQkxFU01FTiAgICAgICBMTF9DMl9BUEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXBcbgorICAqICAgICAgICAgQzJBUEIzU01FTlIgIDgwMlNNRU4gICAgICAgTExfQzJfQVBCM19HUlAxX0Rpc2FibGVDbG9ja1NsZWVwCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0FQQjNfR1JQMV9QRVJJUEhfQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfQVBCM19HUlAxX1BFUklQSF84MDIKKyAgKiBAcmV0dmFsIE5vbmUKKyovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9BUEIzX0dSUDFfRGlzYWJsZUNsb2NrU2xlZXAodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QzJBUEIzU01FTlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChSQ0MpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfQlVTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfY29tcC5oIGIvSW5jL3N0bTMyd2J4eF9sbF9jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzMDRlOAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfY29tcC5oCkBAIC0wLDAgKzEsNzYyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2NvbXAuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgQ09NUCBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0NPTVBfSAorI2RlZmluZSBTVE0zMldCeHhfTExfQ09NUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisKKworLyoqIEBkZWZncm91cCBDT01QX0xMIENPTVAKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfUHJpdmF0ZV9Db25zdGFudHMgQ09NUCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIENPTVAgcmVnaXN0ZXJzIGJpdHMgcG9zaXRpb25zICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUX0xFVkVMX0JJVE9GRlNFVF9QT1MgKDMwVUwpIC8qIFZhbHVlIGVxdWl2YWxlbnQgdG8gUE9TSVRJT05fVkFMKENPTVBfQ1NSX1ZBTFVFKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FU19JTklUIENPTVAgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0cnVjdHVyZSBkZWZpbml0aW9uIG9mIHNvbWUgZmVhdHVyZXMgb2YgQ09NUCBpbnN0YW5jZS4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBvd2VyTW9kZTsgICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvcGVyYXRpbmcgbW9kZSB0byBhZGp1c3QgcG93ZXIgYW5kIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX1BPV0VSTU9ERQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0UG93ZXJNb2RlKCkuICovCisKKyAgdWludDMyX3QgSW5wdXRQbHVzOyAgICAgICAgICAgICAgICAgICAvKiE8IFNldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcgaW5wdXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX0lOUFVUX1BMVVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0UGx1cygpLiAqLworCisgIHVpbnQzMl90IElucHV0TWludXM7ICAgICAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ09NUF9MTF9FQ19JTlBVVF9NSU5VUworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0SW5wdXRNaW51cygpLiAqLworCisgIHVpbnQzMl90IElucHV0SHlzdGVyZXNpczsgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBoeXN0ZXJlc2lzIG1vZGUgb2YgdGhlIGlucHV0IG1pbnVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDT01QX0xMX0VDX0lOUFVUX0hZU1RFUkVTSVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9DT01QX1NldElucHV0SHlzdGVyZXNpcygpLiAqLworCisgIHVpbnQzMl90IE91dHB1dFBvbGFyaXR5OyAgICAgICAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBvdXRwdXQgcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfT1VUUFVUX1BPTEFSSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eSgpLiAqLworCisgIHVpbnQzMl90IE91dHB1dEJsYW5raW5nU291cmNlOyAgICAgICAgLyohPCBTZXQgY29tcGFyYXRvciBibGFua2luZyBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENPTVBfTExfRUNfT1VUUFVUX0JMQU5LSU5HX1NPVVJDRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0NPTVBfU2V0T3V0cHV0QmxhbmtpbmdTb3VyY2UoKS4gKi8KKworfSBMTF9DT01QX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDT01QX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBDT01QIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19DT01NT05fV0lORE9XTU9ERSBDb21wYXJhdG9yIGNvbW1vbiBtb2RlcyAtIFdpbmRvdyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVUwpICAgICAgICAgIC8qITwgV2luZG93IG1vZGUgZGlzYWJsZTogQ29tcGFyYXRvcnMgMSBhbmQgMiBhcmUgaW5kZXBlbmRlbnQgKi8KKyNkZWZpbmUgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OIChDT01QX0NTUl9XSU5NT0RFKSAgICAgIC8qITwgV2luZG93IG1vZGUgZW5hYmxlOiBDb21wYXJhdG9ycyBpbnN0YW5jZXMgcGFpciBDT01QMSBhbmQgQ09NUDIgaGF2ZSB0aGVpciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0b2dldGhlci4gVGhlIGNvbW1vbiBpbnB1dCBpcyBDT01QMSBpbnB1dCBwbHVzIChDT01QMiBpbnB1dCBwbHVzIGlzIG5vIG1vcmUgYWNjZXNzaWJsZSkuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfUE9XRVJNT0RFIENvbXBhcmF0b3IgbW9kZXMgLSBQb3dlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9QT1dFUk1PREVfSElHSFNQRUVEICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENPTVAgcG93ZXIgbW9kZSB0byBoaWdoIHNwZWVkICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX01FRElVTVNQRUVEICAgKENPTVBfQ1NSX1BXUk1PREVfMCkgICAgICAgICAgICAgICAgICAgICAgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gbWVkaXVtIHNwZWVkICovCisjZGVmaW5lIExMX0NPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIgKENPTVBfQ1NSX1BXUk1PREVfMSB8IENPTVBfQ1NSX1BXUk1PREVfMCkgLyohPCBDT01QIHBvd2VyIG1vZGUgdG8gdWx0cmEtbG93IHBvd2VyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSU5QVVRfUExVUyBDb21wYXJhdG9yIGlucHV0cyAtIElucHV0IHBsdXMgKGlucHV0IG5vbi1pbnZlcnRpbmcpIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfUExVU19JTzEgICAgICAgICAgKDB4MDAwMDAwMDBVTCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBwbHVzIGNvbm5lY3RlZCB0byBJTzEgKHBpbiBQQzUgZm9yIENPTVAxLCBwaW4gUEI0IGZvciBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9QTFVTX0lPMiAgICAgICAgICAoQ09NUF9DU1JfSU5QU0VMXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IHBsdXMgY29ubmVjdGVkIHRvIElPMiAocGluIFBCMiBmb3IgQ09NUDEsIHBpbiBQQjYgZm9yIENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX1BMVVNfSU8zICAgICAgICAgIChDT01QX0NTUl9JTlBTRUxfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgcGx1cyBjb25uZWN0ZWQgdG8gSU8zIChwaW4gUEExIGZvciBDT01QMSwgcGluIFBBMyBmb3IgQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSU5QVVRfTUlOVVMgQ29tcGFyYXRvciBpbnB1dHMgLSBJbnB1dCBtaW51cyAoaW5wdXQgaW52ZXJ0aW5nKSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9TQ0FMRU4gfCBDT01QX0NTUl9CUkdFTikgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gMS80IFZyZWZJbnQgICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVCAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMCB8IENPTVBfQ1NSX1NDQUxFTiB8IENPTVBfQ1NSX0JSR0VOKSAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byAxLzIgVnJlZkludCAgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UICAoICAgICAgICAgICAgICAgICAgICBDT01QX0NTUl9JTk1TRUxfMSAgICAgICAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfU0NBTEVOIHwgQ09NUF9DU1JfQlJHRU4pICAgICAgICAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIDMvNCBWcmVmSW50ICAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQgICAgICggICAgICAgICAgICAgICAgICAgIENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzAgfCBDT01QX0NTUl9TQ0FMRU4gICAgICAgICAgICAgICAgICkgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gVnJlZkludCAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMSAgICAgICAgIChDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU8xIChwaW4gUEE5IGZvciBDT01QMSwgcGluIFBCMyBmb3IgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yICAgICAgICAgKENPTVBfQ1NSX0lOTVNFTF8yIHwgQ09NUF9DU1JfSU5NU0VMXzEgfCBDT01QX0NTUl9JTk1TRUxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzIgKHBpbiBQQzQgZm9yIENPTVAxLCBwaW4gUEI3IGZvciBDT01QMikgKi8KKyNkZWZpbmUgTExfQ09NUF9JTlBVVF9NSU5VU19JTzMgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfSU5NRVNFTF8wIHwgQ09NUF9DU1JfSU5NU0VMXzIgfCBDT01QX0NTUl9JTk1TRUxfMSB8IENPTVBfQ1NSX0lOTVNFTF8wKSAvKiE8IENvbXBhcmF0b3IgaW5wdXQgbWludXMgY29ubmVjdGVkIHRvIElPMyAocGluIFBBMCBmb3IgQ09NUDEsIHBpbiBQQTIgZm9yIENPTVAyKSAqLworI2RlZmluZSBMTF9DT01QX0lOUFVUX01JTlVTX0lPNCAgICAgICAgIChDT01QX0NTUl9JTk1FU0VMXzEgICAgICAgICAgICAgICAgICAgICAgfCBDT01QX0NTUl9JTk1TRUxfMiB8IENPTVBfQ1NSX0lOTVNFTF8xIHwgQ09NUF9DU1JfSU5NU0VMXzApIC8qITwgQ29tcGFyYXRvciBpbnB1dCBtaW51cyBjb25uZWN0ZWQgdG8gSU80IChwaW4gUEE0IGZvciBDT01QMSwgcGluIFBBNCBmb3IgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfSU5QVVRfTUlOVVNfSU81ICAgICAgICAgKENPTVBfQ1NSX0lOTUVTRUxfMSB8IENPTVBfQ1NSX0lOTUVTRUxfMCB8IENPTVBfQ1NSX0lOTVNFTF8yIHwgQ09NUF9DU1JfSU5NU0VMXzEgfCBDT01QX0NTUl9JTk1TRUxfMCkgLyohPCBDb21wYXJhdG9yIGlucHV0IG1pbnVzIGNvbm5lY3RlZCB0byBJTzUgKHBpbiBQQTUgZm9yIENPTVAxLCBwaW4gUEE1IGZvciBDT01QMikgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FQ19JTlBVVF9IWVNURVJFU0lTIENvbXBhcmF0b3IgaW5wdXQgLSBIeXN0ZXJlc2lzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX05PTkUgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgTExfQ09NUF9IWVNURVJFU0lTX0xPVyAgICAgICAgICAoICAgICAgICAgICAgICAgICAgQ09NUF9DU1JfSFlTVF8wKSAvKiE8IEh5c3RlcmVzaXMgbGV2ZWwgbG93ICovCisjZGVmaW5lIExMX0NPTVBfSFlTVEVSRVNJU19NRURJVU0gICAgICAgKENPTVBfQ1NSX0hZU1RfMSAgICAgICAgICAgICAgICAgICkgLyohPCBIeXN0ZXJlc2lzIGxldmVsIG1lZGl1bSAqLworI2RlZmluZSBMTF9DT01QX0hZU1RFUkVTSVNfSElHSCAgICAgICAgIChDT01QX0NTUl9IWVNUXzEgfCBDT01QX0NTUl9IWVNUXzApIC8qITwgSHlzdGVyZXNpcyBsZXZlbCBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX1BPTEFSSVRZIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IHBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAvKiE8IENPTVAgb3V0cHV0IHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDogY29tcGFyYXRvciBvdXRwdXQgaXMgaGlnaCB3aGVuIHRoZSBwbHVzIChub24taW52ZXJ0aW5nKSBpbnB1dCBpcyBhdCBhIGhpZ2hlciB2b2x0YWdlIHRoYW4gdGhlIG1pbnVzIChpbnZlcnRpbmcpIGlucHV0ICovCisjZGVmaW5lIExMX0NPTVBfT1VUUFVUUE9MX0lOVkVSVEVEICAgICAgKENPTVBfQ1NSX1BPTEFSSVRZKSAgICAgLyohPCBDT01QIG91dHB1dCBwb2xhcml0eSBpcyBpbnZlcnRlZDogY29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4gdGhlIHBsdXMgKG5vbi1pbnZlcnRpbmcpIGlucHV0IGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBtaW51cyAoaW52ZXJ0aW5nKSBpbnB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VDX09VVFBVVF9CTEFOS0lOR19TT1VSQ0UgQ29tcGFyYXRvciBvdXRwdXQgLSBCbGFua2luZyBzb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DT01QX0JMQU5LSU5HU1JDX05PTkUgICAgICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAvKiE8Q29tcGFyYXRvciBvdXRwdXQgd2l0aG91dCBibGFua2luZyAqLworLyogTm90ZTogT3V0cHV0IGJsYW5raW5nIHNvdXJjZSBjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMV9PQzUgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18wKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTEgT0M1IChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisjZGVmaW5lIExMX0NPTVBfQkxBTktJTkdTUkNfVElNMl9PQzMgICAgICAgIChDT01QX0NTUl9CTEFOS0lOR18xKSAgIC8qITwgQ29tcGFyYXRvciBvdXRwdXQgYmxhbmtpbmcgc291cmNlIFRJTTIgT0MzIChjb21tb24gdG8gYWxsIENPTVAgaW5zdGFuY2VzOiBDT01QMSwgQ09NUDIpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfT1VUUFVUX0xFVkVMIENvbXBhcmF0b3Igb3V0cHV0IC0gT3V0cHV0IGxldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfTE9XICAgICAgICAoMHgwMDAwMDAwMFVMKSAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGxvdyAoaWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZCwgb3RoZXJ3aXNlIHRvIGJlIGNvbXBsZW1lbnRlZCkgKi8KKyNkZWZpbmUgTExfQ09NUF9PVVRQVVRfTEVWRUxfSElHSCAgICAgICAoMHgwMDAwMDAwMVVMKSAgICAgICAgICAvKiE8IENvbXBhcmF0b3Igb3V0cHV0IGxldmVsIGhpZ2ggKGlmIHRoZSBwb2xhcml0eSBpcyBub3QgaW52ZXJ0ZWQsIG90aGVyd2lzZSB0byBiZSBjb21wbGVtZW50ZWQpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUNfSFdfREVMQVlTICBEZWZpbml0aW9ucyBvZiBDT01QIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cworICAqIEBub3RlICAgT25seSBDT01QIHBlcmlwaGVyYWwgSFcgZGVsYXlzIGFyZSBkZWZpbmVkIGluIENPTVAgTEwgZHJpdmVyIGRyaXZlciwKKyAgKiAgICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlcy4KKyAgKiAgICAgICAgIEZvciBkZXRhaWxzIG9uIGRlbGF5cyB2YWx1ZXMsIHJlZmVyIHRvIGRlc2NyaXB0aW9ucyBpbiBzb3VyY2UgY29kZQorICAqICAgICAgICAgYWJvdmUgZWFjaCBsaXRlcmFsIGRlZmluaXRpb24uCisgICogQHsKKyAgKi8KKworLyogRGVsYXkgZm9yIGNvbXBhcmF0b3Igc3RhcnR1cCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IERlbGF5IHJlcXVpcmVkIHRvIHJlYWNoIHByb3BhZ2F0aW9uIGRlbGF5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U1RBUlQiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0NPTVBfREVMQVlfU1RBUlRVUF9VUyAgICAgICAgICAoIDgwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisKKy8qIERlbGF5IGZvciBjb21wYXJhdG9yIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBWb2x0YWdlIHNjYWxlciBpcyB1c2VkIHdoZW4gc2VsZWN0aW5nIGNvbXBhcmF0b3IgaW5wdXQgICAgICAgICAgICAgICAqLworLyogICAgICAgYmFzZWQgb24gVnJlZkludDogVnJlZkludCBvciBzdWJkaXZpc2lvbiBvZiBWcmVmSW50LiAgICAgICAgICAgICAgICAgKi8KKy8qIExpdGVyYWwgc2V0IHRvIG1heGltdW0gdmFsdWUgKHJlZmVyIHRvIGRldmljZSBkYXRhc2hlZXQsICAgICAgICAgICAgICAgICAgICovCisvKiBwYXJhbWV0ZXIgInRTVEFSVF9TQ0FMRVIiKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVW5pdDogdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQ09NUF9ERUxBWV9WT0xUQUdFX1NDQUxFUl9TVEFCX1VTICggMjAwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgdm9sdGFnZSBzY2FsZXIgc3RhYmlsaXphdGlvbiB0aW1lICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPTVBfTExfRXhwb3J0ZWRfTWFjcm9zIENPTVAgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiB3cml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm8KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ09NUCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIGNvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0NPTVBfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENPTVAgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0NPTVBfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0xMX0VNX0hFTFBFUl9NQUNSTyBDT01QIGhlbHBlciBtYWNybworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHNlbGVjdCB0aGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIHRvIHdoaWNoIGlzIGJlbG9uZ2luZyB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENPTVAgY29tbW9uIHJlZ2lzdGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgICBzZXQgcGFyYW1ldGVycyBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcy4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9ucyBoYXZpbmcgYXJndW1lbnQgIkNPTVB4eV9DT01NT04iIGFzIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gIF9fQ09NUHhfXyBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBDT01QIGNvbW1vbiBpbnN0YW5jZSBvciB2YWx1ZSAiMCIgaWYgdGhlcmUgaXMgbm8gQ09NUCBjb21tb24gaW5zdGFuY2UuCisgICovCisjZGVmaW5lIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoX19DT01QeF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoQ09NUDEyX0NPTU1PTikKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09NUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfQ29uZmlndXJhdGlvbl9jb21wYXJhdG9yX2NvbW1vbiBDb25maWd1cmF0aW9uIG9mIENPTVAgaGllcmFyY2hpY2FsIHNjb3BlOiBjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHdpbmRvdyBtb2RlIG9mIGEgcGFpciBvZiBjb21wYXJhdG9ycyBpbnN0YW5jZXMKKyAgKiAgICAgICAgICgyIGNvbnNlY3V0aXZlIENPTVAgaW5zdGFuY2VzIG9kZCBhbmQgZXZlbiBDT01QPHg+IGFuZCBDT01QPHgrMT4pLgorICAqIEBybXRvbGwgQ1NSICAgICAgV0lOTU9ERSAgICAgICAgTExfQ09NUF9TZXRDb21tb25XaW5kb3dNb2RlCisgICogQHBhcmFtICBDT01QeHlfQ09NTU9OIENvbXBhcmF0b3IgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICAoY2FuIGJlIHNldCBkaXJlY3RseSBmcm9tIENNU0lTIGRlZmluaXRpb24gb3IgYnkgdXNpbmcgaGVscGVyIG1hY3JvIEByZWYgX19MTF9DT01QX0NPTU1PTl9JTlNUQU5DRSgpICkKKyAgKiBAcGFyYW0gIFdpbmRvd01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1dJTkRPV01PREVfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9DT01QMV9JTlBVVF9QTFVTX0NPTU1PTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRDb21tb25XaW5kb3dNb2RlKENPTVBfQ29tbW9uX1R5cGVEZWYgKkNPTVB4eV9DT01NT04sIHVpbnQzMl90IFdpbmRvd01vZGUpCit7CisgIC8qIE5vdGU6IE9uIHRoaXMgU1RNMzIgc2VyaWUsIHdpbmRvdyBtb2RlIGNhbiBiZSBzZXQgb25seSAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBmcm9tIENPTVAgaW5zdGFuY2U6IENPTVAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhDT01QeHlfQ09NTU9OLT5DU1IsIENPTVBfQ1NSX1dJTk1PREUsIFdpbmRvd01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB3aW5kb3cgbW9kZSBvZiBhIHBhaXIgb2YgY29tcGFyYXRvcnMgaW5zdGFuY2VzCisgICogICAgICAgICAoMiBjb25zZWN1dGl2ZSBDT01QIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFdJTk1PREUgICAgICAgIExMX0NPTVBfR2V0Q29tbW9uV2luZG93TW9kZQorICAqIEBwYXJhbSAgQ09NUHh5X0NPTU1PTiBDb21wYXJhdG9yIGNvbW1vbiBpbnN0YW5jZQorICAqICAgICAgICAgKGNhbiBiZSBzZXQgZGlyZWN0bHkgZnJvbSBDTVNJUyBkZWZpbml0aW9uIG9yIGJ5IHVzaW5nIGhlbHBlciBtYWNybyBAcmVmIF9fTExfQ09NUF9DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfV0lORE9XTU9ERV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRDb21tb25XaW5kb3dNb2RlKENPTVBfQ29tbW9uX1R5cGVEZWYgKkNPTVB4eV9DT01NT04pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENPTVB4eV9DT01NT04tPkNTUiwgQ09NUF9DU1JfV0lOTU9ERSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfQ29uZmlndXJhdGlvbl9jb21wYXJhdG9yX21vZGVzIENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBtb2RlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5zdGFuY2Ugb3BlcmF0aW5nIG1vZGUgdG8gYWRqdXN0IHBvd2VyIGFuZCBzcGVlZC4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBXUk1PREUgICAgICAgIExMX0NPTVBfU2V0UG93ZXJNb2RlCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0UG93ZXJNb2RlKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IFBvd2VyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9QV1JNT0RFLCBQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG9wZXJhdGluZyBtb2RlIHRvIGFkanVzdCBwb3dlciBhbmQgc3BlZWQuCisgICogQHJtdG9sbCBDU1IgICAgICBQV1JNT0RFICAgICAgICBMTF9DT01QX0dldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9ISUdIU1BFRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfUE9XRVJNT0RFX1VMVFJBTE9XUE9XRVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldFBvd2VyTW9kZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9QV1JNT0RFKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3JfaW5wdXRzIENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBpbnB1dHMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGlucHV0cyBtaW51cyAoaW52ZXJ0aW5nKSBhbmQgcGx1cyAobm9uLWludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzY2FsZXIgYnJpZGdlIGlzIGNvbmZpZ3VyYWJsZToKKyAgKiAgICAgICAgIHRvIG9wdGltaXplIHBvd2VyIGNvbnN1bXB0aW9uLCB0aGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlCisgICogICAgICAgICB2b2x0YWdlIHNjYWxlciBicmlkZ2Ugb25seSB3aGVuIHJlcXVpcmVkCisgICogICAgICAgICAod2hlbiBzZWxlY3RpbmcgY29tcGFyYXRvciBpbnB1dCBiYXNlZCBvbiBWcmVmSW50OiBWcmVmSW50IG9yCisgICogICAgICAgICBzdWJkaXZpc2lvbiBvZiBWcmVmSW50KS4KKyAgKiAgICAgICAgIC0gRm9yIHNjYWxlciBicmlkZ2UgcG93ZXIgY29uc3VtcHRpb24gdmFsdWVzLAorICAqICAgICAgICAgICByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgIklEREEoU0NBTEVSKSIuCisgICogICAgICAgICAtIFZvbHRhZ2Ugc2NhbGVyIHJlcXVpcmVzIGEgZGVsYXkgZm9yIHZvbHRhZ2Ugc3RhYmlsaXphdGlvbi4KKyAgKiAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlRfU0NBTEVSIi4KKyAgKiAgICAgICAgIC0gU2NhbGVyIGJyaWRnZSBpcyBjb21tb24gZm9yIGFsbCBjb21wYXJhdG9yIGluc3RhbmNlcywKKyAgKiAgICAgICAgICAgdGhlcmVmb3JlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29tcGFyYXRvciBpbnN0YW5jZQorICAqICAgICAgICAgICBpcyByZXF1aXJpbmcgdGhlIHNjYWxlciBicmlkZ2UsIGl0IHJlbWFpbnMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENTUiAgICAgIElOTVNFTCAgICAgICAgIExMX0NPTVBfQ29uZmlnSW5wdXRzXG4KKyAgKiAgICAgICAgIENTUiAgICAgIElOUFNFTCAgICAgICAgIExMX0NPTVBfQ29uZmlnSW5wdXRzXG4KKyAgKiAgICAgICAgIENTUiAgICAgIEJSR0VOICAgICAgICAgIExMX0NPTVBfQ29uZmlnSW5wdXRzXG4KKyAgKiAgICAgICAgIENTUiAgICAgIFNDQUxFTiAgICAgICAgIExMX0NPTVBfQ29uZmlnSW5wdXRzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE1pbnVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPNQorICAqIEBwYXJhbSAgSW5wdXRQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8zICgqKQorICAqCisgICogICAgICAgICAoKikgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX0NvbmZpZ0lucHV0cyhDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBJbnB1dE1pbnVzLCB1aW50MzJfdCBJbnB1dFBsdXMpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICBDT01QX0NTUl9JTk1FU0VMIHwgQ09NUF9DU1JfSU5NU0VMIHwgQ09NUF9DU1JfSU5QU0VMIHwgQ09NUF9DU1JfU0NBTEVOIHwgQ09NUF9DU1JfQlJHRU4sCisgICAgICAgICAgICAgSW5wdXRNaW51cyB8IElucHV0UGx1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5wdXQgcGx1cyAobm9uLWludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQHJtdG9sbCBDU1IgICAgICBJTlBTRUwgICAgICAgICBMTF9DT01QX1NldElucHV0UGx1cworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEBwYXJhbSAgSW5wdXRQbHVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8zICgqKQorICAqCisgICogICAgICAgICAoKikgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DT01QX1NldElucHV0UGx1cyhDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBJbnB1dFBsdXMpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgQ09NUF9DU1JfSU5QU0VMLCBJbnB1dFBsdXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGlucHV0IHBsdXMgKG5vbi1pbnZlcnRpbmcpLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBjb21wYXJhdG9yIGlucHV0IHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJTzoKKyAgKiAgICAgICAgIEdQSU8gcGlucyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgSU5QU0VMICAgICAgICAgTExfQ09NUF9HZXRJbnB1dFBsdXMKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9QTFVTX0lPMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfUExVU19JTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX1BMVVNfSU8zICgqKQorICAqCisgICogICAgICAgICAoKikgUGFyYW1ldGVyIG5vdCBhdmFpbGFibGUgb24gYWxsIGRldmljZXMuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRJbnB1dFBsdXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfSU5QU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5wdXQgbWludXMgKGludmVydGluZykuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGNvbXBhcmF0b3IgaW5wdXQgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElPOgorICAqICAgICAgICAgR1BJTyBwaW5zIGFyZSBzcGVjaWZpYyB0byBlYWNoIGNvbXBhcmF0b3IgaW5zdGFuY2UuCisgICogICAgICAgICBSZWZlciB0byBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXJzIG9yIHRvIHJlZmVyZW5jZSBtYW51YWwuCisgICogQG5vdGUgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzY2FsZXIgYnJpZGdlIGlzIGNvbmZpZ3VyYWJsZToKKyAgKiAgICAgICAgIHRvIG9wdGltaXplIHBvd2VyIGNvbnN1bXB0aW9uLCB0aGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlCisgICogICAgICAgICB2b2x0YWdlIHNjYWxlciBicmlkZ2Ugb25seSB3aGVuIHJlcXVpcmVkCisgICogICAgICAgICAod2hlbiBzZWxlY3RpbmcgY29tcGFyYXRvciBpbnB1dCBiYXNlZCBvbiBWcmVmSW50OiBWcmVmSW50IG9yCisgICogICAgICAgICBzdWJkaXZpc2lvbiBvZiBWcmVmSW50KS4KKyAgKiAgICAgICAgIC0gRm9yIHNjYWxlciBicmlkZ2UgcG93ZXIgY29uc3VtcHRpb24gdmFsdWVzLAorICAqICAgICAgICAgICByZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCBwYXJhbWV0ZXIgIklEREEoU0NBTEVSKSIuCisgICogICAgICAgICAtIFZvbHRhZ2Ugc2NhbGVyIHJlcXVpcmVzIGEgZGVsYXkgZm9yIHZvbHRhZ2Ugc3RhYmlsaXphdGlvbi4KKyAgKiAgICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlRfU0NBTEVSIi4KKyAgKiAgICAgICAgIC0gU2NhbGVyIGJyaWRnZSBpcyBjb21tb24gZm9yIGFsbCBjb21wYXJhdG9yIGluc3RhbmNlcywKKyAgKiAgICAgICAgICAgdGhlcmVmb3JlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29tcGFyYXRvciBpbnN0YW5jZQorICAqICAgICAgICAgICBpcyByZXF1aXJpbmcgdGhlIHNjYWxlciBicmlkZ2UsIGl0IHJlbWFpbnMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENTUiAgICAgIElOTVNFTCAgICAgICAgIExMX0NPTVBfU2V0SW5wdXRNaW51c1xuCisgICogICAgICAgICBDU1IgICAgICBCUkdFTiAgICAgICAgICBMTF9DT01QX1NldElucHV0TWludXNcbgorICAqICAgICAgICAgQ1NSICAgICAgU0NBTEVOICAgICAgICAgTExfQ09NUF9TZXRJbnB1dE1pbnVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dE1pbnVzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU18zXzRWUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19WUkVGSU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRJbnB1dE1pbnVzKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IElucHV0TWludXMpCit7CisgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwgQ09NUF9DU1JfSU5NRVNFTCB8IENPTVBfQ1NSX0lOTVNFTCB8IENPTVBfQ1NSX1NDQUxFTiB8IENPTVBfQ1NSX0JSR0VOLCBJbnB1dE1pbnVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyYXRvciBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nKS4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgY29tcGFyYXRvciBpbnB1dCBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSU86CisgICogICAgICAgICBHUElPIHBpbnMgYXJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAcm10b2xsIENTUiAgICAgIElOTVNFTCAgICAgICAgIExMX0NPTVBfR2V0SW5wdXRNaW51c1xuCisgICogICAgICAgICBDU1IgICAgICBCUkdFTiAgICAgICAgICBMTF9DT01QX0dldElucHV0TWludXNcbgorICAqICAgICAgICAgQ1NSICAgICAgU0NBTEVOICAgICAgICAgTExfQ09NUF9HZXRJbnB1dE1pbnVzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV80VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfMV8yVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfVlJFRklOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0lOUFVUX01JTlVTX0lPMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSU5QVVRfTUlOVVNfSU80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9JTlBVVF9NSU5VU19JTzUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0TWludXMoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfSU5NRVNFTCB8IENPTVBfQ1NSX0lOTVNFTCB8IENPTVBfQ1NSX1NDQUxFTiB8IENPTVBfQ1NSX0JSR0VOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmF0b3IgaW5zdGFuY2UgaHlzdGVyZXNpcyBtb2RlIG9mIHRoZSBpbnB1dCBtaW51cyAoaW52ZXJ0aW5nIGlucHV0KS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEhZU1QgICAgICAgICAgIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHBhcmFtICBJbnB1dEh5c3RlcmVzaXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfU2V0SW5wdXRIeXN0ZXJlc2lzKENPTVBfVHlwZURlZiAqQ09NUHgsIHVpbnQzMl90IElucHV0SHlzdGVyZXNpcykKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9IWVNULCBJbnB1dEh5c3RlcmVzaXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIGh5c3RlcmVzaXMgbW9kZSBvZiB0aGUgbWludXMgKGludmVydGluZykgaW5wdXQuCisgICogQHJtdG9sbCBDU1IgICAgICBIWVNUICAgICAgICAgICBMTF9DT01QX0dldElucHV0SHlzdGVyZXNpcworICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfSFlTVEVSRVNJU19MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9IWVNURVJFU0lTX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0dldElucHV0SHlzdGVyZXNpcyhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9IWVNUKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Db25maWd1cmF0aW9uX2NvbXBhcmF0b3Jfb3V0cHV0IENvbmZpZ3VyYXRpb24gb2YgY29tcGFyYXRvciBvdXRwdXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBPTEFSSVRZICAgICAgIExMX0NPTVBfU2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE91dHB1dFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBPdXRwdXRQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9QT0xBUklUWSwgT3V0cHV0UG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENTUiAgICAgIFBPTEFSSVRZICAgICAgIExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9PVVRQVVRQT0xfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfR2V0T3V0cHV0UG9sYXJpdHkoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfUE9MQVJJVFkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyYXRvciBpbnN0YW5jZSBibGFua2luZyBzb3VyY2UuCisgICogQG5vdGUgICBCbGFua2luZyBzb3VyY2UgbWF5IGJlIHNwZWNpZmljIHRvIGVhY2ggY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlcnMgb3IgdG8gcmVmZXJlbmNlIG1hbnVhbC4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIGJsYW5raW5nIHNvdXJjZSBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEJMQU5LSU5HICAgICAgIExMX0NPTVBfU2V0T3V0cHV0QmxhbmtpbmdTb3VyY2UKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJsYW5raW5nU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0xX09DNSAgKDEpCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMyAgKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBQYXJhbWV0ZXIgYXZhaWxhYmlsaXR5IGRlcGVuZGluZyBvbiB0aW1lciBhdmFpbGFiaWxpdHkKKyAgKiAgICAgICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9TZXRPdXRwdXRCbGFua2luZ1NvdXJjZShDT01QX1R5cGVEZWYgKkNPTVB4LCB1aW50MzJfdCBCbGFua2luZ1NvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhDT01QeC0+Q1NSLCBDT01QX0NTUl9CTEFOS0lORywgQmxhbmtpbmdTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGluc3RhbmNlIGJsYW5raW5nIHNvdXJjZS4KKyAgKiBAbm90ZSAgIEF2YWlsYWJpbGl0eSBvZiBwYXJhbWV0ZXJzIG9mIGJsYW5raW5nIHNvdXJjZSBmcm9tIHRpbWVyCisgICogICAgICAgICBkZXBlbmRzIG9uIHRpbWVycyBhdmFpbGFiaWxpdHkgb24gdGhlIHNlbGVjdGVkIGRldmljZS4KKyAgKiBAbm90ZSAgIEJsYW5raW5nIHNvdXJjZSBtYXkgYmUgc3BlY2lmaWMgdG8gZWFjaCBjb21wYXJhdG9yIGluc3RhbmNlLgorICAqICAgICAgICAgUmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVycyBvciB0byByZWZlcmVuY2UgbWFudWFsLgorICAqIEBybXRvbGwgQ1NSICAgICAgQkxBTktJTkcgICAgICAgTExfQ09NUF9HZXRPdXRwdXRCbGFua2luZ1NvdXJjZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1ICAoMSkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTJfT0MzICAoMSkKKyAgKgorICAqICAgICAgICAgKDEpIFBhcmFtZXRlciBhdmFpbGFiaWxpdHkgZGVwZW5kaW5nIG9uIHRpbWVyIGF2YWlsYWJpbGl0eQorICAqICAgICAgICAgICAgIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ09NUF9HZXRPdXRwdXRCbGFua2luZ1NvdXJjZShDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9CTEFOS0lORykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfTExfRUZfT3BlcmF0aW9uIE9wZXJhdGlvbiBvbiBjb21wYXJhdG9yIGluc3RhbmNlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFmdGVyIGVuYWJsZSBmcm9tIG9mZiBzdGF0ZSwgY29tcGFyYXRvciByZXF1aXJlcyBhIGRlbGF5CisgICogICAgICAgICB0byByZWFjaCByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLgorICAqICAgICAgICAgUmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgcGFyYW1ldGVyICJ0U1RBUlQiLgorICAqIEBybXRvbGwgQ1NSICAgICAgRU4gICAgICAgICAgICAgTExfQ09NUF9FbmFibGUKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfRW5hYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIFNFVF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENTUiAgICAgIEVOICAgICAgICAgICAgIExMX0NPTVBfRGlzYWJsZQorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ09NUF9EaXNhYmxlKENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIENMRUFSX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmF0b3IgZW5hYmxlIHN0YXRlCisgICogICAgICAgICAoMDogQ09NUCBpcyBkaXNhYmxlZCwgMTogQ09NUCBpcyBlbmFibGVkKQorICAqIEBybXRvbGwgQ1NSICAgICAgRU4gICAgICAgICAgICAgTExfQ09NUF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX0lzRW5hYmxlZChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKChSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9FTikgPT0gKENPTVBfQ1NSX0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgY29tcGFyYXRvciBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIE9uY2UgbG9ja2VkLCBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGFjY2Vzc2VkIGluIHJlYWQtb25seS4KKyAgKiBAbm90ZSAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHJtdG9sbCBDU1IgICAgICBMT0NLICAgICAgICAgICBMTF9DT01QX0xvY2sKKyAgKiBAcGFyYW0gIENPTVB4IENvbXBhcmF0b3IgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NPTVBfTG9jayhDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICBTRVRfQklUKENPTVB4LT5DU1IsIENPTVBfQ1NSX0xPQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJhdG9yIGxvY2sgc3RhdGUKKyAgKiAgICAgICAgICgwOiBDT01QIGlzIHVubG9ja2VkLCAxOiBDT01QIGlzIGxvY2tlZCkuCisgICogQG5vdGUgICBPbmNlIGxvY2tlZCwgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZCBpbiByZWFkLW9ubHkuCisgICogQG5vdGUgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorICAqIEBybXRvbGwgQ1NSICAgICAgTE9DSyAgICAgICAgICAgTExfQ09NUF9Jc0xvY2tlZAorICAqIEBwYXJhbSAgQ09NUHggQ29tcGFyYXRvciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NPTVBfSXNMb2NrZWQoQ09NUF9UeXBlRGVmICpDT01QeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ09NUHgtPkNTUiwgQ09NUF9DU1JfTE9DSykgPT0gKENPTVBfQ1NSX0xPQ0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZCBjb21wYXJhdG9yIGluc3RhbmNlIG91dHB1dCBsZXZlbC4KKyAgKiBAbm90ZSAgIFRoZSBjb21wYXJhdG9yIG91dHB1dCBsZXZlbCBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBwb2xhcml0eQorICAqICAgICAgICAgKFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQ09NUF9TZXRPdXRwdXRQb2xhcml0eSgpKS4KKyAgKiAgICAgICAgIElmIHRoZSBjb21wYXJhdG9yIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGxvdyB3aGVuIHRoZSBpbnB1dCBwbHVzCisgICogICAgICAgICAgICBpcyBhdCBhIGxvd2VyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cworICAqICAgICAgICAgICAgaXMgYXQgYSBoaWdoZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgSWYgdGhlIGNvbXBhcmF0b3IgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQ6CisgICogICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgbG93ZXIgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgIC0gQ29tcGFyYXRvciBvdXRwdXQgaXMgbG93IHdoZW4gdGhlIGlucHV0IHBsdXMKKyAgKiAgICAgICAgICAgIGlzIGF0IGEgaGlnaGVyIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcm10b2xsIENTUiAgICAgIFZBTFVFICAgICAgICAgIExMX0NPTVBfUmVhZE91dHB1dExldmVsCisgICogQHBhcmFtICBDT01QeCBDb21wYXJhdG9yIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NPTVBfT1VUUFVUX0xFVkVMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DT01QX1JlYWRPdXRwdXRMZXZlbChDT01QX1R5cGVEZWYgKkNPTVB4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDT01QeC0+Q1NSLCBDT01QX0NTUl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgPj4gTExfQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ09NUF9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9DT01QX0RlSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4KTsKK0Vycm9yU3RhdHVzIExMX0NPTVBfSW5pdChDT01QX1R5cGVEZWYgKkNPTVB4LCBMTF9DT01QX0luaXRUeXBlRGVmICpDT01QX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfQ09NUF9TdHJ1Y3RJbml0KExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX0NPTVBfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9jb3J0ZXguaCBiL0luYy9zdG0zMndieHhfbGxfY29ydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZDNlZAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfY29ydGV4LmgKQEAgLTAsMCArMSw2MzkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfY29ydGV4LmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIENPUlRFWCBMTCBtb2R1bGUuCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBMTCBDT1JURVggZHJpdmVyIGNvbnRhaW5zIGEgc2V0IG9mIGdlbmVyaWMgQVBJcyB0aGF0IGNhbiBiZQorICAgIHVzZWQgYnkgdXNlcjoKKyAgICAgICgrKSBTWVNUSUNLIGNvbmZpZ3VyYXRpb24gdXNlZCBieSBAcmVmIExMX21EZWxheSBhbmQgQHJlZiBMTF9Jbml0MW1zVGljaworICAgICAgICAgIGZ1bmN0aW9ucworICAgICAgKCspIExvdyBwb3dlciBtb2RlIGNvbmZpZ3VyYXRpb24gKFNDQiByZWdpc3RlciBvZiBDb3J0ZXgtTUNVKQorICAgICAgKCspIE1QVSBBUEkgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgcmVnaW9ucworICAgICAgKCspIEFQSSB0byBhY2Nlc3MgdG8gTUNVIGluZm8gKENQVUlEIHJlZ2lzdGVyKQorICAgICAgKCspIEFQSSB0byBlbmFibGUgZmF1bHQgaGFuZGxlciAoU0hDU1IgYWNjZXNzZXMpCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfQ09SVEVYX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX0NPUlRFWF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTCBDT1JURVgKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FeHBvcnRlZF9Db25zdGFudHMgQ09SVEVYIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0NMS1NPVVJDRV9IQ0xLIFNZU1RJQ0sgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4ICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBBSEIgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLiovCisjZGVmaW5lIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEsgICAgICAgICAgU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgIC8qITwgQUhCIGNsb2NrIHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfRkFVTFQgSGFuZGxlciBGYXVsdCB0eXBlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9VU0cgICAgICAgICAgICAgICBTQ0JfU0hDU1JfVVNHRkFVTFRFTkFfTXNrICAgICAgICAgICAgICAvKiE8IFVzYWdlIGZhdWx0ICovCisjZGVmaW5lIExMX0hBTkRMRVJfRkFVTFRfQlVTICAgICAgICAgICAgICAgU0NCX1NIQ1NSX0JVU0ZBVUxURU5BX01zayAgICAgICAgICAgICAgLyohPCBCdXMgZmF1bHQgKi8KKyNkZWZpbmUgTExfSEFORExFUl9GQVVMVF9NRU0gICAgICAgICAgICAgICBTQ0JfU0hDU1JfTUVNRkFVTFRFTkFfTXNrICAgICAgICAgICAgICAvKiE8IE1lbW9yeSBtYW5hZ2VtZW50IGZhdWx0ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgX19NUFVfUFJFU0VOVAorCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19DVFJMX0hGTk1JX1BSSVZERUYgTVBVIENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGX05PTkUgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXNhYmxlIE5NSSBhbmQgcHJpdmlsZWdlZCBTVyBhY2Nlc3MgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfSEFSREZBVUxUX05NSSAgICAgICAgICBNUFVfQ1RSTF9IRk5NSUVOQV9Nc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlcyB0aGUgb3BlcmF0aW9uIG9mIE1QVSBkdXJpbmcgaGFyZCBmYXVsdCwgTk1JLCBhbmQgRkFVTFRNQVNLIGhhbmRsZXJzICovCisjZGVmaW5lIExMX01QVV9DVFJMX1BSSVZJTEVHRURfREVGQVVMVCAgICAgTVBVX0NUUkxfUFJJVkRFRkVOQV9Nc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBwcml2aWxlZ2VkIHNvZnR3YXJlIGFjY2VzcyB0byBkZWZhdWx0IG1lbW9yeSBtYXAgKi8KKyNkZWZpbmUgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRiAgICAgICAgICAoTVBVX0NUUkxfSEZOTUlFTkFfTXNrIHwgTVBVX0NUUkxfUFJJVkRFRkVOQV9Nc2spIC8qITwgRW5hYmxlIE5NSSBhbmQgcHJpdmlsZWdlZCBTVyBhY2Nlc3MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX1JFR0lPTiBNUFUgUmVnaW9uIE51bWJlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMCAgICAgICAgICAgICAgMHgwMFUgLyohPCBSRUdJT04gTnVtYmVyIDAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVIxICAgICAgICAgICAgICAweDAxVSAvKiE8IFJFR0lPTiBOdW1iZXIgMSAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjIgICAgICAgICAgICAgIDB4MDJVIC8qITwgUkVHSU9OIE51bWJlciAyICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSMyAgICAgICAgICAgICAgMHgwM1UgLyohPCBSRUdJT04gTnVtYmVyIDMgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI0ICAgICAgICAgICAgICAweDA0VSAvKiE8IFJFR0lPTiBOdW1iZXIgNCAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX05VTUJFUjUgICAgICAgICAgICAgIDB4MDVVIC8qITwgUkVHSU9OIE51bWJlciA1ICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTlVNQkVSNiAgICAgICAgICAgICAgMHgwNlUgLyohPCBSRUdJT04gTnVtYmVyIDYgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9OVU1CRVI3ICAgICAgICAgICAgICAweDA3VSAvKiE8IFJFR0lPTiBOdW1iZXIgNyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OX1NJWkUgTVBVIFJlZ2lvbiBTaXplCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzMyQiAgICAgICAgICAgICAoMHgwNFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMzJCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNjRCICAgICAgICAgICAgICgweDA1VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA2NEIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xMjhCICAgICAgICAgICAgKDB4MDZVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDEyOEIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yNTZCICAgICAgICAgICAgKDB4MDdVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDI1NkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJCICAgICAgICAgICAgKDB4MDhVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDUxMkIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8xS0IgICAgICAgICAgICAgKDB4MDlVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDFLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzJLQiAgICAgICAgICAgICAoMHgwQVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNEtCICAgICAgICAgICAgICgweDBCVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA0S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV84S0IgICAgICAgICAgICAgKDB4MENVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDhLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0IgICAgICAgICAgICAoMHgwRFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTZLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzMyS0IgICAgICAgICAgICAoMHgwRVUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMzJLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzY0S0IgICAgICAgICAgICAoMHgwRlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNjRLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEtCICAgICAgICAgICAoMHgxMFUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMTI4S0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yNTZLQiAgICAgICAgICAgKDB4MTFVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDI1NktCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNTEyS0IgICAgICAgICAgICgweDEyVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA1MTJLQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiAgICAgICAgICAgICAoMHgxM1UgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMU1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMk1CICAgICAgICAgICAgICgweDE0VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAyTUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV80TUIgICAgICAgICAgICAgKDB4MTVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDRNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzhNQiAgICAgICAgICAgICAoMHgxNlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgOE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTZNQiAgICAgICAgICAgICgweDE3VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxNk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMzJNQiAgICAgICAgICAgICgweDE4VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAzMk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfNjRNQiAgICAgICAgICAgICgweDE5VSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCA2NE1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4TUIgICAgICAgICAgICgweDFBVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxMjhNQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzI1Nk1CICAgICAgICAgICAoMHgxQlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgMjU2TUIgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV81MTJNQiAgICAgICAgICAgKDB4MUNVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDUxMk1CIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1NJWkVfMUdCICAgICAgICAgICAgICgweDFEVSA8PCBNUFVfUkFTUl9TSVpFX1BvcykgLyohPCAxR0IgU2l6ZSBvZiB0aGUgTVBVIHByb3RlY3Rpb24gcmVnaW9uICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fU0laRV8yR0IgICAgICAgICAgICAgKDB4MUVVIDw8IE1QVV9SQVNSX1NJWkVfUG9zKSAvKiE8IDJHQiBTaXplIG9mIHRoZSBNUFUgcHJvdGVjdGlvbiByZWdpb24gKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9TSVpFXzRHQiAgICAgICAgICAgICAoMHgxRlUgPDwgTVBVX1JBU1JfU0laRV9Qb3MpIC8qITwgNEdCIFNpemUgb2YgdGhlIE1QVSBwcm90ZWN0aW9uIHJlZ2lvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfUkVHSU9OX1BSSVZJTEVER0VTIE1QVSBSZWdpb24gUHJpdmlsZWdlcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9SRUdJT05fTk9fQUNDRVNTICAgICAgICAgICAgKDB4MDBVIDw8IE1QVV9SQVNSX0FQX1BvcykgLyohPCBObyBhY2Nlc3MqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUlcgICAgICAgICAgICAgICgweDAxVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUlcgcHJpdmlsZWdlZCAocHJpdmlsZWdlZCBhY2Nlc3Mgb25seSkqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUldfVVJPICAgICAgICAgICgweDAyVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUlcgcHJpdmlsZWdlZCAtIFJPIHVzZXIgKFdyaXRlIGluIGEgdXNlciBwcm9ncmFtIGdlbmVyYXRlcyBhIGZhdWx0KSAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX0ZVTExfQUNDRVNTICAgICAgICAgICgweDAzVSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUlcgcHJpdmlsZWdlZCAmIHVzZXIgKEZ1bGwgYWNjZXNzKSAqLworI2RlZmluZSBMTF9NUFVfUkVHSU9OX1BSSVZfUk8gICAgICAgICAgICAgICgweDA1VSA8PCBNUFVfUkFTUl9BUF9Qb3MpIC8qITwgUk8gcHJpdmlsZWdlZCAocHJpdmlsZWdlZCByZWFkIG9ubHkpKi8KKyNkZWZpbmUgTExfTVBVX1JFR0lPTl9QUklWX1JPX1VSTyAgICAgICAgICAoMHgwNlUgPDwgTVBVX1JBU1JfQVBfUG9zKSAvKiE8IFJPIHByaXZpbGVnZWQgJiB1c2VyIChyZWFkIG9ubHkpICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FQ19URVggTVBVIFRFWCBMZXZlbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9URVhfTEVWRUwwICAgICAgICAgICAgICAgICAgKDB4MDBVIDw8IE1QVV9SQVNSX1RFWF9Qb3MpIC8qITwgYjAwMCBmb3IgVEVYIGJpdHMgKi8KKyNkZWZpbmUgTExfTVBVX1RFWF9MRVZFTDEgICAgICAgICAgICAgICAgICAoMHgwMVUgPDwgTVBVX1JBU1JfVEVYX1BvcykgLyohPCBiMDAxIGZvciBURVggYml0cyAqLworI2RlZmluZSBMTF9NUFVfVEVYX0xFVkVMMiAgICAgICAgICAgICAgICAgICgweDAyVSA8PCBNUFVfUkFTUl9URVhfUG9zKSAvKiE8IGIwMTAgZm9yIFRFWCBiaXRzICovCisjZGVmaW5lIExMX01QVV9URVhfTEVWRUw0ICAgICAgICAgICAgICAgICAgKDB4MDRVIDw8IE1QVV9SQVNSX1RFWF9Qb3MpIC8qITwgYjEwMCBmb3IgVEVYIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VDX0lOU1RSVUNUSU9OX0FDQ0VTUyBNUFUgSW5zdHJ1Y3Rpb24gQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX0lOU1RSVUNUSU9OX0FDQ0VTU19FTkFCTEUgICAweDAwVSAgICAgICAgICAgIC8qITwgSW5zdHJ1Y3Rpb24gZmV0Y2hlcyBlbmFibGVkICovCisjZGVmaW5lIExMX01QVV9JTlNUUlVDVElPTl9BQ0NFU1NfRElTQUJMRSAgTVBVX1JBU1JfWE5fTXNrICAvKiE8IEluc3RydWN0aW9uIGZldGNoZXMgZGlzYWJsZWQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfU0hBUkVBQkxFX0FDQ0VTUyBNUFUgU2hhcmVhYmxlIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfU0hBUkVBQkxFICAgICAgICAgICAgTVBVX1JBU1JfU19Nc2sgICAvKiE8IFNoYXJlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRSAgICAgICAgMHgwMFUgICAgICAgICAgICAvKiE8IE5vdCBTaGFyZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfQ0FDSEVBQkxFX0FDQ0VTUyBNUFUgQ2FjaGVhYmxlIEFjY2VzcworICAqIEB7CisgICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfQ0FDSEVBQkxFICAgICAgICAgICAgTVBVX1JBU1JfQ19Nc2sgICAvKiE8IENhY2hlYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfTk9UX0NBQ0hFQUJMRSAgICAgICAgMHgwMFUgICAgICAgICAgICAvKiE8IE5vdCBDYWNoZWFibGUgbWVtb3J5IGF0dHJpYnV0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUNfQlVGRkVSQUJMRV9BQ0NFU1MgTVBVIEJ1ZmZlcmFibGUgQWNjZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTVBVX0FDQ0VTU19CVUZGRVJBQkxFICAgICAgICAgICBNUFVfUkFTUl9CX01zayAgIC8qITwgQnVmZmVyYWJsZSBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIExMX01QVV9BQ0NFU1NfTk9UX0JVRkZFUkFCTEUgICAgICAgMHgwMFUgICAgICAgICAgICAvKiE8IE5vdCBCdWZmZXJhYmxlIG1lbW9yeSBhdHRyaWJ1dGUgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDT1JURVggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfU1lTVElDSyBTWVNUSUNLCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgU3lzdGljayBjb3VudGVyIGZsYWcgaXMgYWN0aXZlIG9yIG5vdC4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB1c2VkIGluIHRpbWVvdXQgZnVuY3Rpb24gb24gYXBwbGljYXRpb24gc2lkZS4KKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDT1VOVEZMQUcgICAgIExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZyh2b2lkKQoreworICByZXR1cm4gKCgoU3lzVGljay0+Q1RSTCAmIFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSA9PSAoU3lzVGlja19DVFJMX0NPVU5URkxBR19Nc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFNUS19DVFJMICAgICBDTEtTT1VSQ0UgICAgIExMX1NZU1RJQ0tfU2V0Q2xrU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNUSUNLX1NldENsa1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIGlmIChTb3VyY2UgPT0gTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSykKKyAgeworICAgIFNFVF9CSVQoU3lzVGljay0+Q1RSTCwgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgQ0xFQVJfQklUKFN5c1RpY2stPkNUUkwsIExMX1NZU1RJQ0tfQ0xLU09VUkNFX0hDTEspOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIENMS1NPVVJDRSAgICAgTExfU1lTVElDS19HZXRDbGtTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTVElDS19DTEtTT1VSQ0VfSENMSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfR2V0Q2xrU291cmNlKHZvaWQpCit7CisgIHJldHVybiBSRUFEX0JJVChTeXNUaWNrLT5DVFJMLCBMTF9TWVNUSUNLX0NMS1NPVVJDRV9IQ0xLKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU3lzVGljayBleGNlcHRpb24gcmVxdWVzdAorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19FbmFibGVJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19FbmFibGVJVCh2b2lkKQoreworICBTRVRfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTeXNUaWNrIGV4Y2VwdGlvbiByZXF1ZXN0CisgICogQHJtdG9sbCBTVEtfQ1RSTCAgICAgVElDS0lOVCAgICAgICBMTF9TWVNUSUNLX0Rpc2FibGVJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTVElDS19EaXNhYmxlSVQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFN5c1RpY2stPkNUUkwsIFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIHRoZSBTWVNUSUNLIGludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1RLX0NUUkwgICAgIFRJQ0tJTlQgICAgICAgTExfU1lTVElDS19Jc0VuYWJsZWRJVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU1RJQ0tfSXNFbmFibGVkSVQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU3lzVGljay0+Q1RSTCwgU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSA9PSAoU3lzVGlja19DVFJMX1RJQ0tJTlRfTXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENPUlRFWF9MTF9FRl9MT1dfUE9XRVJfTU9ERSBMT1cgUE9XRVIgTU9ERQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUHJvY2Vzc29yIHVzZXMgc2xlZXAgYXMgaXRzIGxvdyBwb3dlciBtb2RlCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBERUVQICAgICBMTF9MUE1fRW5hYmxlU2xlZXAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVTbGVlcCh2b2lkKQoreworICAvKiBDbGVhciBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvY2Vzc29yIHVzZXMgZGVlcCBzbGVlcCBhcyBpdHMgbG93IHBvd2VyIG1vZGUKKyAgKiBAcm10b2xsIFNDQl9TQ1IgICAgICBTTEVFUERFRVAgICAgIExMX0xQTV9FbmFibGVEZWVwU2xlZXAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVEZWVwU2xlZXAodm9pZCkKK3sKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyBzbGVlcC1vbi1leGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gSGFuZGxlciBtb2RlIHRvIFRocmVhZCBtb2RlLgorICAqIEBub3RlICAgU2V0dGluZyB0aGlzIGJpdCB0byAxIGVuYWJsZXMgYW4gaW50ZXJydXB0LWRyaXZlbiBhcHBsaWNhdGlvbiB0byBhdm9pZCByZXR1cm5pbmcgdG8gYW4KKyAgKiAgICAgICAgIGVtcHR5IG1haW4gYXBwbGljYXRpb24uCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0xFRVBPTkVYSVQgICBMTF9MUE1fRW5hYmxlU2xlZXBPbkV4aXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVTbGVlcE9uRXhpdCh2b2lkKQoreworICAvKiBTZXQgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBPTkVYSVRfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRG8gbm90IHNsZWVwIHdoZW4gcmV0dXJuaW5nIHRvIFRocmVhZCBtb2RlLgorICAqIEBybXRvbGwgU0NCX1NDUiAgICAgIFNMRUVQT05FWElUICAgTExfTFBNX0Rpc2FibGVTbGVlcE9uRXhpdAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBNX0Rpc2FibGVTbGVlcE9uRXhpdCh2b2lkKQoreworICAvKiBDbGVhciBTTEVFUE9ORVhJVCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZWQgZXZlbnRzIGFuZCBhbGwgaW50ZXJydXB0cywgaW5jbHVkaW5nIGRpc2FibGVkIGludGVycnVwdHMsIGNhbiB3YWtldXAgdGhlCisgICogICAgICAgICBwcm9jZXNzb3IuCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0VWRU9OUEVORCAgICBMTF9MUE1fRW5hYmxlRXZlbnRPblBlbmQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQTV9FbmFibGVFdmVudE9uUGVuZCh2b2lkKQoreworICAvKiBTZXQgU0VWRU9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgT25seSBlbmFibGVkIGludGVycnVwdHMgb3IgZXZlbnRzIGNhbiB3YWtldXAgdGhlIHByb2Nlc3NvciwgZGlzYWJsZWQgaW50ZXJydXB0cyBhcmUKKyAgKiAgICAgICAgIGV4Y2x1ZGVkCisgICogQHJtdG9sbCBTQ0JfU0NSICAgICAgU0VWRU9OUEVORCAgICBMTF9MUE1fRGlzYWJsZUV2ZW50T25QZW5kCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUE1fRGlzYWJsZUV2ZW50T25QZW5kKHZvaWQpCit7CisgIC8qIENsZWFyIFNFVkVPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX0hBTkRMRVIgSEFORExFUgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGEgZmF1bHQgaW4gU3lzdGVtIGhhbmRsZXIgY29udHJvbCByZWdpc3RlciAoU0hDU1IpCisgICogQHJtdG9sbCBTQ0JfU0hDU1IgICAgTUVNRkFVTFRFTkEgICBMTF9IQU5ETEVSX0VuYWJsZUZhdWx0CisgICogQHBhcmFtICBGYXVsdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX1VTRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfQlVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9NRU0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hBTkRMRVJfRW5hYmxlRmF1bHQodWludDMyX3QgRmF1bHQpCit7CisgIC8qIEVuYWJsZSB0aGUgc3lzdGVtIGhhbmRsZXIgZmF1bHQgKi8KKyAgU0VUX0JJVChTQ0ItPlNIQ1NSLCBGYXVsdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhIGZhdWx0IGluIFN5c3RlbSBoYW5kbGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFNIQ1NSKQorICAqIEBybXRvbGwgU0NCX1NIQ1NSICAgIE1FTUZBVUxURU5BICAgTExfSEFORExFUl9EaXNhYmxlRmF1bHQKKyAgKiBAcGFyYW0gIEZhdWx0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hBTkRMRVJfRkFVTFRfVVNHCisgICogICAgICAgICBAYXJnIEByZWYgTExfSEFORExFUl9GQVVMVF9CVVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IQU5ETEVSX0ZBVUxUX01FTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSEFORExFUl9EaXNhYmxlRmF1bHQodWludDMyX3QgRmF1bHQpCit7CisgIC8qIERpc2FibGUgdGhlIHN5c3RlbSBoYW5kbGVyIGZhdWx0ICovCisgIENMRUFSX0JJVChTQ0ItPlNIQ1NSLCBGYXVsdCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09SVEVYX0xMX0VGX01DVV9JTkZPIE1DVSBJTkZPCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgSW1wbGVtZW50ZXIgY29kZQorICAqIEBybXRvbGwgU0NCX0NQVUlEICAgIElNUExFTUVOVEVSICAgTExfQ1BVSURfR2V0SW1wbGVtZW50ZXIKKyAgKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweDQxIGZvciBBUk0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUFVJRF9HZXRJbXBsZW1lbnRlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfSU1QTEVNRU5URVJfTXNrKSA+PiBTQ0JfQ1BVSURfSU1QTEVNRU5URVJfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVmFyaWFudCBudW1iZXIgKFRoZSByIHZhbHVlIGluIHRoZSBybnBuIHByb2R1Y3QgcmV2aXNpb24gaWRlbnRpZmllcikKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBWQVJJQU5UICAgICAgIExMX0NQVUlEX0dldFZhcmlhbnQKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gMCBhbmQgMjU1ICgweDA6IHJldmlzaW9uIDApCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0VmFyaWFudCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTQ0ItPkNQVUlELCBTQ0JfQ1BVSURfVkFSSUFOVF9Nc2spID4+IFNDQl9DUFVJRF9WQVJJQU5UX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENvbnN0YW50IG51bWJlcgorICAqIEBybXRvbGwgU0NCX0NQVUlEICAgIEFSQ0hJVEVDVFVSRSAgTExfQ1BVSURfR2V0Q29uc3RhbnQKKyAgKiBAcmV0dmFsIFZhbHVlIHNob3VsZCBiZSBlcXVhbCB0byAweEYgZm9yIENvcnRleC1NNCBkZXZpY2VzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1BVSURfR2V0Q29uc3RhbnQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU0NCLT5DUFVJRCwgU0NCX0NQVUlEX0FSQ0hJVEVDVFVSRV9Nc2spID4+IFNDQl9DUFVJRF9BUkNISVRFQ1RVUkVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUGFydCBudW1iZXIKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBQQVJUTk8gICAgICAgIExMX0NQVUlEX0dldFBhck5vCisgICogQHJldHZhbCBWYWx1ZSBzaG91bGQgYmUgZXF1YWwgdG8gMHhDMjQgZm9yIENvcnRleC1NNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFBhck5vKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9QQVJUTk9fTXNrKSA+PiBTQ0JfQ1BVSURfUEFSVE5PX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJldmlzaW9uIG51bWJlciAoVGhlIHAgdmFsdWUgaW4gdGhlIHJucG4gcHJvZHVjdCByZXZpc2lvbiBpZGVudGlmaWVyLCBpbmRpY2F0ZXMgcGF0Y2ggcmVsZWFzZSkKKyAgKiBAcm10b2xsIFNDQl9DUFVJRCAgICBSRVZJU0lPTiAgICAgIExMX0NQVUlEX0dldFJldmlzaW9uCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSAoMHgxOiBwYXRjaCAxKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NQVUlEX0dldFJldmlzaW9uKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNDQi0+Q1BVSUQsIFNDQl9DUFVJRF9SRVZJU0lPTl9Nc2spID4+IFNDQl9DUFVJRF9SRVZJU0lPTl9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgX19NUFVfUFJFU0VOVAorLyoqIEBkZWZncm91cCBDT1JURVhfTExfRUZfTVBVIE1QVQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIE1QVSB3aXRoIGlucHV0IG9wdGlvbnMKKyAgKiBAcm10b2xsIE1QVV9DVFJMICAgICBFTkFCTEUgICAgICAgIExMX01QVV9FbmFibGUKKyAgKiBAcGFyYW0gIE9wdGlvbnMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IRk5NSV9QUklWREVGX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQ1RSTF9IQVJERkFVTFRfTk1JCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfUFJJVklMRUdFRF9ERUZBVUxUCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0NUUkxfSEZOTUlfUFJJVkRFRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0VuYWJsZSh1aW50MzJfdCBPcHRpb25zKQoreworICAvKiBFbmFibGUgdGhlIE1QVSovCisgIFdSSVRFX1JFRyhNUFUtPkNUUkwsIChNUFVfQ1RSTF9FTkFCTEVfTXNrIHwgT3B0aW9ucykpOworICAvKiBFbnN1cmUgTVBVIHNldHRpbmdzIHRha2UgZWZmZWN0cyAqLworICBfX0RTQigpOworICAvKiBTZXF1ZW5jZSBpbnN0cnVjdGlvbiBmZXRjaGVzIHVzaW5nIHVwZGF0ZSBzZXR0aW5ncyAqLworICBfX0lTQigpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTVBVCisgICogQHJtdG9sbCBNUFVfQ1RSTCAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0Rpc2FibGUodm9pZCkKK3sKKyAgLyogTWFrZSBzdXJlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBhcmUgZG9uZSAqLworICBfX0RNQigpOworICAvKiBEaXNhYmxlIE1QVSovCisgIFdSSVRFX1JFRyhNUFUtPkNUUkwsIDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBNUFUgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIE1QVV9DVFJMICAgICBFTkFCTEUgICAgICAgIExMX01QVV9Jc0VuYWJsZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9NUFVfSXNFbmFibGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKE1QVS0+Q1RSTCwgTVBVX0NUUkxfRU5BQkxFX01zaykgPT0gKE1QVV9DVFJMX0VOQUJMRV9Nc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGEgTVBVIHJlZ2lvbgorICAqIEBybXRvbGwgTVBVX1JBU1IgICAgIEVOQUJMRSAgICAgICAgTExfTVBVX0VuYWJsZVJlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRW5hYmxlUmVnaW9uKHVpbnQzMl90IFJlZ2lvbikKK3sKKyAgLyogU2V0IFJlZ2lvbiBudW1iZXIgKi8KKyAgV1JJVEVfUkVHKE1QVS0+Uk5SLCBSZWdpb24pOworICAvKiBFbmFibGUgdGhlIE1QVSByZWdpb24gKi8KKyAgU0VUX0JJVChNUFUtPlJBU1IsIE1QVV9SQVNSX0VOQUJMRV9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGEgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQkFSICAgICBSRUdJT04gICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JCQVIgICAgIEFERFIgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgWE4gICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBBUCAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFMgICAgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgQyAgICAgICAgICAgICBMTF9NUFVfQ29uZmlnUmVnaW9uXG4KKyAgKiAgICAgICAgIE1QVV9SQVNSICAgICBCICAgICAgICAgICAgIExMX01QVV9Db25maWdSZWdpb25cbgorICAqICAgICAgICAgTVBVX1JBU1IgICAgIFNJWkUgICAgICAgICAgTExfTVBVX0NvbmZpZ1JlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHBhcmFtICBBZGRyZXNzIFZhbHVlIG9mIHJlZ2lvbiBiYXNlIGFkZHJlc3MKKyAgKiBAcGFyYW0gIFN1YlJlZ2lvbkRpc2FibGUgU3ViLXJlZ2lvbiBkaXNhYmxlIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYKKyAgKiBAcGFyYW0gIEF0dHJpYnV0ZXMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzMyQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NEIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMTI4QiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMkIKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMUtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzJLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV80S0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzE2S0IKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMzJLQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV82NEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzEyOEtCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzI1NktCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzUxMktCCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzFNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNE1CIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzhNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xNk1CCisgICogICAgICAgICAgIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzMyTUIgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfNjRNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xMjhNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8yNTZNQiBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV81MTJNQgorICAqICAgICAgICAgICBvciBAcmVmIExMX01QVV9SRUdJT05fU0laRV8xR0Igb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1NJWkVfMkdCIG9yIEByZWYgTExfTVBVX1JFR0lPTl9TSVpFXzRHQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9SRUdJT05fTk9fQUNDRVNTIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXIG9yIEByZWYgTExfTVBVX1JFR0lPTl9QUklWX1JXX1VSTyBvciBAcmVmIExMX01QVV9SRUdJT05fRlVMTF9BQ0NFU1MKKyAgKiAgICAgICAgICAgb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUk8gb3IgQHJlZiBMTF9NUFVfUkVHSU9OX1BSSVZfUk9fVVJPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1RFWF9MRVZFTDAgb3IgQHJlZiBMTF9NUFVfVEVYX0xFVkVMMSBvciBAcmVmIExMX01QVV9URVhfTEVWRUwyIG9yIEByZWYgTExfTVBVX1RFWF9MRVZFTDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0VOQUJMRSBvciAgQHJlZiBMTF9NUFVfSU5TVFJVQ1RJT05fQUNDRVNTX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9NUFVfQUNDRVNTX1NIQVJFQUJMRSBvciBAcmVmIExMX01QVV9BQ0NFU1NfTk9UX1NIQVJFQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX01QVV9BQ0NFU1NfQ0FDSEVBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfQ0FDSEVBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX0FDQ0VTU19CVUZGRVJBQkxFIG9yIEByZWYgTExfTVBVX0FDQ0VTU19OT1RfQlVGRkVSQUJMRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTVBVX0NvbmZpZ1JlZ2lvbih1aW50MzJfdCBSZWdpb24sIHVpbnQzMl90IFN1YlJlZ2lvbkRpc2FibGUsIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IEF0dHJpYnV0ZXMpCit7CisgIC8qIFNldCBSZWdpb24gbnVtYmVyICovCisgIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsKKyAgLyogU2V0IGJhc2UgYWRkcmVzcyAqLworICBXUklURV9SRUcoTVBVLT5SQkFSLCAoQWRkcmVzcyAmIDB4RkZGRkZGRTBVKSk7CisgIC8qIENvbmZpZ3VyZSBNUFUgKi8KKyAgV1JJVEVfUkVHKE1QVS0+UkFTUiwgKE1QVV9SQVNSX0VOQUJMRV9Nc2sgfCBBdHRyaWJ1dGVzIHwgKFN1YlJlZ2lvbkRpc2FibGUgPDwgTVBVX1JBU1JfU1JEX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGEgcmVnaW9uCisgICogQHJtdG9sbCBNUFVfUk5SICAgICAgUkVHSU9OICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvblxuCisgICogICAgICAgICBNUFVfUkFTUiAgICAgRU5BQkxFICAgICAgICBMTF9NUFVfRGlzYWJsZVJlZ2lvbgorICAqIEBwYXJhbSAgUmVnaW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTVBVX1JFR0lPTl9OVU1CRVI3CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9NUFVfRGlzYWJsZVJlZ2lvbih1aW50MzJfdCBSZWdpb24pCit7CisgIC8qIFNldCBSZWdpb24gbnVtYmVyICovCisgIFdSSVRFX1JFRyhNUFUtPlJOUiwgUmVnaW9uKTsKKyAgLyogRGlzYWJsZSB0aGUgTVBVIHJlZ2lvbiAqLworICBDTEVBUl9CSVQoTVBVLT5SQVNSLCBNUFVfUkFTUl9FTkFCTEVfTXNrKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIF9fTVBVX1BSRVNFTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfQ09SVEVYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfY3JjLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTU4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2NyYy5oCkBAIC0wLDAgKzEsNDY0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2NyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUkMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9DUkNfSAorI2RlZmluZSBTVE0zMldCeHhfTExfQ1JDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKENSQykKKworLyoqIEBkZWZncm91cCBDUkNfTEwgQ1JDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgQ1JDIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX1BPTFlMRU5HVEggUG9seW5vbWlhbCBsZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF8zMkIgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAzMiBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF8xNkIgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRV8wICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAxNiBiaXRzIFBvbHlub21pYWwgc2l6ZSAqLworI2RlZmluZSBMTF9DUkNfUE9MWUxFTkdUSF84QiAgICAgICAgICAgICAgIENSQ19DUl9QT0xZU0laRV8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCA4IGJpdHMgUG9seW5vbWlhbCBzaXplICovCisjZGVmaW5lIExMX0NSQ19QT0xZTEVOR1RIXzdCICAgICAgICAgICAgICAgKENSQ19DUl9QT0xZU0laRV8xIHwgQ1JDX0NSX1BPTFlTSVpFXzApICAvKiE8IDcgYml0cyBQb2x5bm9taWFsIHNpemUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0lOREFUQV9SRVZFUlNFIElucHV0IERhdGEgUmV2ZXJzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9OT05FICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IERhdGEgYml0IG9yZGVyIG5vdCBhZmZlY3RlZCAqLworI2RlZmluZSBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfQllURSAgICAgICAgIENSQ19DUl9SRVZfSU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBEYXRhIGJpdCByZXZlcnNhbCBkb25lIGJ5IGJ5dGUgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0hBTEZXT1JEICAgICBDUkNfQ1JfUkVWX0lOXzEgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSBoYWxmLXdvcmQgKi8KKyNkZWZpbmUgTExfQ1JDX0lOREFUQV9SRVZFUlNFX1dPUkQgICAgICAgICAoQ1JDX0NSX1JFVl9JTl8xIHwgQ1JDX0NSX1JFVl9JTl8wKSAgICAgIC8qITwgSW5wdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSB3b3JkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FQ19PVVREQVRBX1JFVkVSU0UgT3V0cHV0IERhdGEgUmV2ZXJzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfTk9ORSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgRGF0YSBiaXQgb3JkZXIgbm90IGFmZmVjdGVkICovCisjZGVmaW5lIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfQklUICAgICAgICAgQ1JDX0NSX1JFVl9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPdXRwdXQgRGF0YSBiaXQgcmV2ZXJzYWwgZG9uZSBieSBiaXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0RlZmF1bHRfUG9seW5vbWlhbF9WYWx1ZSAgICBEZWZhdWx0IENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgdmFsdWUKKyAgKiBAYnJpZWYgICAgTm9ybWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcG9seW5vbWlhbCB2YWx1ZSBpcworICAqICAgICAgICAgICBYXjMyICsgWF4yNiArIFheMjMgKyBYXjIyICsgWF4xNiArIFheMTIgKyBYXjExICsgWF4xMCArWF44ICsgWF43ICsgWF41ICsgWF40ICsgWF4yICsgWCArIDEgLgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSQ19ERUZBVUxUX0NSQzMyX1BPTFkgICAgICAgICAgMHgwNEMxMURCN1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWZhdWx0IENSQyBnZW5lcmF0aW5nIHBvbHlub21pYWwgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VDX0RlZmF1bHRfSW5pdFZhbHVlICAgIERlZmF1bHQgQ1JDIGNvbXB1dGF0aW9uIGluaXRpYWxpemF0aW9uIHZhbHVlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX0RFRkFVTFRfQ1JDX0lOSVRWQUxVRSAgICAgICAweEZGRkZGRkZGVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERlZmF1bHQgQ1JDIGNvbXB1dGF0aW9uIGluaXRpYWxpemF0aW9uIHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBDUkNfTExfRXhwb3J0ZWRfTWFjcm9zIENSQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIENSQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfQ1JDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCBfX1ZBTFVFX18pCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIENSQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9DUkNfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfTExfRUZfQ29uZmlndXJhdGlvbiBDUkMgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBDUkMgY2FsY3VsYXRpb24gdW5pdC4KKyAgKiBAbm90ZSAgIElmIFByb2dyYW1tYWJsZSBJbml0aWFsIENSQyB2YWx1ZSBmZWF0dXJlCisgICogICAgICAgICBpcyBhdmFpbGFibGUsIGFsc28gc2V0IHRoZSBEYXRhIFJlZ2lzdGVyIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlCisgICogICAgICAgICBDUkNfSU5JVCByZWdpc3Rlciwgb3RoZXJ3aXNlLCByZXNldCBEYXRhIFJlZ2lzdGVyIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFU0VUICAgICAgICAgTExfQ1JDX1Jlc2V0Q1JDQ2FsY3VsYXRpb25Vbml0CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1Jlc2V0Q1JDQ2FsY3VsYXRpb25Vbml0KENSQ19UeXBlRGVmICpDUkN4KQoreworICBTRVRfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUkVTRVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaXplIG9mIHRoZSBwb2x5bm9taWFsLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBPTFlTSVpFICAgICAgTExfQ1JDX1NldFBvbHlub21pYWxTaXplCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9seVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8zMkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF8xNkIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19QT0xZTEVOR1RIXzdCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0UG9seW5vbWlhbFNpemUoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IFBvbHlTaXplKQoreworICBNT0RJRllfUkVHKENSQ3gtPkNSLCBDUkNfQ1JfUE9MWVNJWkUsIFBvbHlTaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gc2l6ZSBvZiB0aGUgcG9seW5vbWlhbC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQT0xZU0laRSAgICAgIExMX0NSQ19HZXRQb2x5bm9taWFsU2l6ZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMzJCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfMTZCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX1BPTFlMRU5HVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfUE9MWUxFTkdUSF83QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRQb2x5bm9taWFsU2l6ZShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JDeC0+Q1IsIENSQ19DUl9QT0xZU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcmV2ZXJzYWwgb2YgdGhlIGJpdCBvcmRlciBvZiB0aGUgaW5wdXQgZGF0YQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJFVl9JTiAgICAgICAgTExfQ1JDX1NldElucHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmV2ZXJzZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX1dPUkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19TZXRJbnB1dERhdGFSZXZlcnNlTW9kZShDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgUmV2ZXJzZU1vZGUpCit7CisgIE1PRElGWV9SRUcoQ1JDeC0+Q1IsIENSQ19DUl9SRVZfSU4sIFJldmVyc2VNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdHlwZSBvZiByZXZlcnNhbCBmb3IgaW5wdXQgZGF0YSBiaXQgb3JkZXIKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfSU4gICAgICAgIExMX0NSQ19HZXRJbnB1dERhdGFSZXZlcnNlTW9kZQorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JDX0lOREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfSU5EQVRBX1JFVkVSU0VfQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19JTkRBVEFfUkVWRVJTRV9XT1JECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX0dldElucHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUkN4LT5DUiwgQ1JDX0NSX1JFVl9JTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcmV2ZXJzYWwgb2YgdGhlIGJpdCBvcmRlciBvZiB0aGUgT3V0cHV0IGRhdGEKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRVZfT1VUICAgICAgIExMX0NSQ19TZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHBhcmFtICBSZXZlcnNlTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSQ19PVVREQVRBX1JFVkVSU0VfQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfU2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBSZXZlcnNlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhDUkN4LT5DUiwgQ1JDX0NSX1JFVl9PVVQsIFJldmVyc2VNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHJldmVyc2FsIG9mIHRoZSBiaXQgb3JkZXIgb2YgdGhlIE91dHB1dCBkYXRhCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVWX09VVCAgICAgICBMTF9DUkNfR2V0T3V0cHV0RGF0YVJldmVyc2VNb2RlCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUkNfT1VUREFUQV9SRVZFUlNFX0JJVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRPdXRwdXREYXRhUmV2ZXJzZU1vZGUoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSQ3gtPkNSLCBDUkNfQ1JfUkVWX09VVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZS4KKyAgKiBAbm90ZSAgIElmIHRoZSBDUkMgc2l6ZSBpcyBsZXNzIHRoYW4gMzIgYml0cywgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKyAgKiAgICAgICAgIGFyZSB1c2VkIHRvIHdyaXRlIHRoZSBjb3JyZWN0IHZhbHVlCisgICogQG5vdGUgICBMTF9DUkNfREVGQVVMVF9DUkNfSU5JVFZBTFVFIGNvdWxkIGJlIHVzZWQgYXMgdmFsdWUgZm9yIEluaXRDcmMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgSU5JVCAgICAgICAgIElOSVQgICAgICAgICAgTExfQ1JDX1NldEluaXRpYWxEYXRhCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5pdENyYyBWYWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldEluaXRpYWxEYXRhKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBJbml0Q3JjKQoreworICBXUklURV9SRUcoQ1JDeC0+SU5JVCwgSW5pdENyYyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgSW5pdGlhbCBDUkMgdmFsdWUuCisgICogQG5vdGUgICBJZiB0aGUgQ1JDIHNpemUgaXMgbGVzcyB0aGFuIDMyIGJpdHMsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgICogICAgICAgICBhcmUgdXNlZCB0byByZWFkIHRoZSBjb3JyZWN0IHZhbHVlCisgICogQHJtdG9sbCBJTklUICAgICAgICAgSU5JVCAgICAgICAgICBMTF9DUkNfR2V0SW5pdGlhbERhdGEKKyAgKiBAcGFyYW0gIENSQ3ggQ1JDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBwcm9ncmFtbWVkIGluIFByb2dyYW1tYWJsZSBpbml0aWFsIENSQyB2YWx1ZSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19HZXRJbml0aWFsRGF0YShDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoQ1JDeC0+SU5JVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFByb2dyYW1tYWJsZSBwb2x5bm9taWFsIHZhbHVlCisgICogICAgICAgICAoY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIHRvIGJlIHVzZWQgZm9yIENSQyBjYWxjdWxhdGlvbikuCisgICogQG5vdGUgICBMTF9DUkNfREVGQVVMVF9DUkMzMl9QT0xZIGNvdWxkIGJlIHVzZWQgYXMgdmFsdWUgZm9yIFBvbHlub21Db2VmIHBhcmFtZXRlci4KKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBSZWZlcmVuY2UgTWFudWFsIGFuZCBleGlzdGluZyBFcnJhdGEgU2hlZXRzLAorICAqICAgICAgICAgcmVnYXJkaW5nIHBvc3NpYmxlIGxpbWl0YXRpb25zIGZvciBQb2x5bm9taWFsIHZhbHVlcyB1c2FnZS4KKyAgKiAgICAgICAgIEZvciBleGFtcGxlLCBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3LCBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxIGlzIHdyaXR0ZW4gMHg2NQorICAqIEBybXRvbGwgUE9MICAgICAgICAgIFBPTCAgICAgICAgICAgTExfQ1JDX1NldFBvbHlub21pYWxDb2VmCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG9seW5vbUNvZWYgVmFsdWUgdG8gYmUgcHJvZ3JhbW1lZCBpbiBQcm9ncmFtbWFibGUgUG9seW5vbWlhbCB2YWx1ZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX1NldFBvbHlub21pYWxDb2VmKENSQ19UeXBlRGVmICpDUkN4LCB1aW50MzJfdCBQb2x5bm9tQ29lZikKK3sKKyAgV1JJVEVfUkVHKENSQ3gtPlBPTCwgUG9seW5vbUNvZWYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFByb2dyYW1tYWJsZSBwb2x5bm9taWFsIHZhbHVlCisgICogQG5vdGUgICBQbGVhc2UgY2hlY2sgUmVmZXJlbmNlIE1hbnVhbCBhbmQgZXhpc3RpbmcgRXJyYXRhIFNoZWV0cywKKyAgKiAgICAgICAgIHJlZ2FyZGluZyBwb3NzaWJsZSBsaW1pdGF0aW9ucyBmb3IgUG9seW5vbWlhbCB2YWx1ZXMgdXNhZ2UuCisgICogICAgICAgICBGb3IgZXhhbXBsZSwgZm9yIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNywgWF43ICsgWF42ICsgWF41ICsgWF4yICsgMSBpcyB3cml0dGVuIDB4NjUKKyAgKiBAcm10b2xsIFBPTCAgICAgICAgICBQT0wgICAgICAgICAgIExMX0NSQ19HZXRQb2x5bm9taWFsQ29lZgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIHByb2dyYW1tZWQgaW4gUHJvZ3JhbW1hYmxlIFBvbHlub21pYWwgdmFsdWUgcmVnaXN0ZXIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUkNfR2V0UG9seW5vbWlhbENvZWYoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKENSQ3gtPlBPTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBnaXZlbiAzMi1iaXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19GZWVkRGF0YTMyCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIHZhbHVlIHRvIGJlIHByb3ZpZGVkIHRvIENSQyBjYWxjdWxhdG9yIGJldHdlZW4gYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfRmVlZERhdGEzMihDUkNfVHlwZURlZiAqQ1JDeCwgdWludDMyX3QgSW5EYXRhKQoreworICBXUklURV9SRUcoQ1JDeC0+RFIsIEluRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgZ2l2ZW4gMTYtYml0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfRmVlZERhdGExNgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluRGF0YSAxNiBiaXQgdmFsdWUgdG8gYmUgcHJvdmlkZWQgdG8gQ1JDIGNhbGN1bGF0b3IgYmV0d2VlbiBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JDX0ZlZWREYXRhMTYoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQxNl90IEluRGF0YSkKK3sKKyAgX19JTyB1aW50MTZfdCAqcFJlZzsKKworICBwUmVnID0gKF9fSU8gdWludDE2X3QgKikoX19JTyB2b2lkICopKCZDUkN4LT5EUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICpwUmVnID0gSW5EYXRhOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGdpdmVuIDgtYml0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9DUkNfRmVlZERhdGE4CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSW5EYXRhIDggYml0IHZhbHVlIHRvIGJlIHByb3ZpZGVkIHRvIENSQyBjYWxjdWxhdG9yIGJldHdlZW4gYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUkNfRmVlZERhdGE4KENSQ19UeXBlRGVmICpDUkN4LCB1aW50OF90IEluRGF0YSkKK3sKKyAgKih1aW50OF90IF9fSU8gKikoJkNSQ3gtPkRSKSA9ICh1aW50OF90KSBJbkRhdGE7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdC4gMzIgYml0cyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19SZWFkRGF0YTMyCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDMyIGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSQ19SZWFkRGF0YTMyKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhDUkN4LT5EUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IENSQyBjYWxjdWxhdGlvbiByZXN1bHQuIDE2IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSAxNiBiaXRzIENSQyBwb2x5bm9taWFsIHNpemUgY29udGV4dC4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX0NSQ19SZWFkRGF0YTE2CisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0IGFzIHN0b3JlZCBpbiBDUkNfRFIgcmVnaXN0ZXIgKDE2IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX0NSQ19SZWFkRGF0YTE2KENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQxNl90KVJFQURfUkVHKENSQ3gtPkRSKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiA4IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSA4IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhOAorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdCBhcyBzdG9yZWQgaW4gQ1JDX0RSIHJlZ2lzdGVyICg4IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQ1JDX1JlYWREYXRhOChDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KVJFQURfUkVHKENSQ3gtPkRSKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBDUkMgY2FsY3VsYXRpb24gcmVzdWx0LiA3IGJpdHMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gYSA3IGJpdHMgQ1JDIHBvbHlub21pYWwgc2l6ZSBjb250ZXh0LgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfQ1JDX1JlYWREYXRhNworICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEN1cnJlbnQgQ1JDIGNhbGN1bGF0aW9uIHJlc3VsdCBhcyBzdG9yZWQgaW4gQ1JDX0RSIHJlZ2lzdGVyICg3IGJpdHMpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQ4X3QgTExfQ1JDX1JlYWREYXRhNyhDUkNfVHlwZURlZiAqQ1JDeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX1JFRyhDUkN4LT5EUikgJiAweDdGVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGRhdGEgc3RvcmVkIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhKElEUikgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGlzIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgbG9jYXRpb24gZm9yIG9uZSAzMi1iaXQgbG9uZyBkYXRhLgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEUiAgICAgICAgICAgTExfQ1JDX1JlYWRfSURSCisgICogQHBhcmFtICBDUkN4IENSQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgc3RvcmVkIGluIENSQ19JRFIgcmVnaXN0ZXIgKEdlbmVyYWwtcHVycG9zZSAzMi1iaXQgZGF0YSByZWdpc3RlcikuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JDX1JlYWRfSURSKENSQ19UeXBlRGVmICpDUkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhDUkN4LT5JRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9yZSBkYXRhIGluIHRoZSBJbmRlcGVuZGVudCBEYXRhKElEUikgcmVnaXN0ZXIuCisgICogQG5vdGUgICBUaGlzIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgbG9jYXRpb24gZm9yIG9uZSAzMi1iaXQgbG9uZyBkYXRhLgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEUiAgICAgICAgICAgTExfQ1JDX1dyaXRlX0lEUgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEluRGF0YSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gQ1JDX0lEUiByZWdpc3RlciAoMzItYml0KSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSQ19Xcml0ZV9JRFIoQ1JDX1R5cGVEZWYgKkNSQ3gsIHVpbnQzMl90IEluRGF0YSkKK3sKKyAgKigodWludDMyX3QgX19JTyAqKSgmQ1JDeC0+SURSKSkgPSAodWludDMyX3QpIEluRGF0YTsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgQ1JDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0NSQ19EZUluaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUkMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfQ1JDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfY3JzLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2Nycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2ZmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2Nycy5oCkBAIC0wLDAgKzEsNzk4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2Nycy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBDUlMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0NSU19ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9DUlNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JTKQorCisvKiogQGRlZmdyb3VwIENSU19MTCBDUlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX1ByaXZhdGVfQ29uc3RhbnRzIENSUyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIERlZmluZXMgdXNlZCBmb3IgdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgcmVnaXN0ZXIgYW5kIHBlcmZvcm0gb2Zmc2V0cyovCisjZGVmaW5lIENSU19QT1NJVElPTl9UUklNICAgICAgICAoQ1JTX0NSX1RSSU1fUG9zKSAgICAgLyogYml0IHBvc2l0aW9uIGluIENSIHJlZyAqLworI2RlZmluZSBDUlNfUE9TSVRJT05fRkVDQVAgICAgICAgKENSU19JU1JfRkVDQVBfUG9zKSAgIC8qIGJpdCBwb3NpdGlvbiBpbiBJU1IgcmVnICovCisjZGVmaW5lIENSU19QT1NJVElPTl9GRUxJTSAgICAgICAoQ1JTX0NGR1JfRkVMSU1fUG9zKSAgLyogYml0IHBvc2l0aW9uIGluIENGR1IgcmVnICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9Db25zdGFudHMgQ1JTIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9DUlNfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ09LRiAgICAgICAgICAgICAgICAgQ1JTX0lTUl9TWU5DT0tGCisjZGVmaW5lIExMX0NSU19JU1JfU1lOQ1dBUk5GICAgICAgICAgICAgICAgQ1JTX0lTUl9TWU5DV0FSTkYKKyNkZWZpbmUgTExfQ1JTX0lTUl9FUlJGICAgICAgICAgICAgICAgICAgICBDUlNfSVNSX0VSUkYKKyNkZWZpbmUgTExfQ1JTX0lTUl9FU1lOQ0YgICAgICAgICAgICAgICAgICBDUlNfSVNSX0VTWU5DRgorI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNFUlIgICAgICAgICAgICAgICAgIENSU19JU1JfU1lOQ0VSUgorI2RlZmluZSBMTF9DUlNfSVNSX1NZTkNNSVNTICAgICAgICAgICAgICAgIENSU19JU1JfU1lOQ01JU1MKKyNkZWZpbmUgTExfQ1JTX0lTUl9UUklNT1ZGICAgICAgICAgICAgICAgICBDUlNfSVNSX1RSSU1PVkYKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0NSU19SZWFkUmVnIGFuZCAgTExfQ1JTX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX0NSU19DUl9TWU5DT0tJRSAgICAgICAgICAgICAgICAgQ1JTX0NSX1NZTkNPS0lFCisjZGVmaW5lIExMX0NSU19DUl9TWU5DV0FSTklFICAgICAgICAgICAgICAgQ1JTX0NSX1NZTkNXQVJOSUUKKyNkZWZpbmUgTExfQ1JTX0NSX0VSUklFICAgICAgICAgICAgICAgICAgICBDUlNfQ1JfRVJSSUUKKyNkZWZpbmUgTExfQ1JTX0NSX0VTWU5DSUUgICAgICAgICAgICAgICAgICBDUlNfQ1JfRVNZTkNJRQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19ESVYgU3luY2hyb25pemF0aW9uIFNpZ25hbCBEaXZpZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIG5vdCBkaXZpZGVkIChkZWZhdWx0KSAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMiAgICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVZfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX0NSU19TWU5DX0RJVl80ICAgICAgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ0RJVl8xICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfRElWXzggICAgICAgICAgICAgICAgICAoQ1JTX0NGR1JfU1lOQ0RJVl8xIHwgQ1JTX0NGR1JfU1lOQ0RJVl8wKSAvKiE8IFN5bmNocm8gU2lnbmFsIGRpdmlkZWQgYnkgOCAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMTYgICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVZfMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMzIgICAgICAgICAgICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzIgfCBDUlNfQ0ZHUl9TWU5DRElWXzApIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfNjQgICAgICAgICAgICAgICAgIChDUlNfQ0ZHUl9TWU5DRElWXzIgfCBDUlNfQ0ZHUl9TWU5DRElWXzEpIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSA2NCAqLworI2RlZmluZSBMTF9DUlNfU1lOQ19ESVZfMTI4ICAgICAgICAgICAgICAgIENSU19DRkdSX1NZTkNESVYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hybyBTaWduYWwgZGl2aWRlZCBieSAxMjggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX1NZTkNfU09VUkNFIFN5bmNocm9uaXphdGlvbiBTaWduYWwgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfU09VUkNFX0dQSU8gICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFN5bmNocm8gU2lnbmFsIHNvdWNyZSBHUElPICovCisjZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9MU0UgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ1NSQ18wICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgTFNFICovCisjZGVmaW5lIExMX0NSU19TWU5DX1NPVVJDRV9VU0IgICAgICAgICAgICAgQ1JTX0NGR1JfU1lOQ1NSQ18xICAgICAgLyohPCBTeW5jaHJvIFNpZ25hbCBzb3VyY2UgVVNCIFNPRiAoZGVmYXVsdCkqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUNfU1lOQ19QT0xBUklUWSBTeW5jaHJvbml6YXRpb24gU2lnbmFsIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiByaXNpbmcgZWRnZSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORyAgICAgICBDUlNfQ0ZHUl9TWU5DUE9MICAgICAgLyohPCBTeW5jaHJvIEFjdGl2ZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VDX0ZSRVFFUlJPUkRJUiBGcmVxdWVuY3kgRXJyb3IgRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX0ZSRVFfRVJST1JfRElSX1VQICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFVwY291bnRpbmcgZGlyZWN0aW9uLCB0aGUgYWN0dWFsIGZyZXF1ZW5jeSBpcyBhYm92ZSB0aGUgdGFyZ2V0ICovCisjZGVmaW5lIExMX0NSU19GUkVRX0VSUk9SX0RJUl9ET1dOICAgICAgICAgICBDUlNfSVNSX0ZFRElSICAgICAgLyohPCBEb3duY291bnRpbmcgZGlyZWN0aW9uLCB0aGUgYWN0dWFsIGZyZXF1ZW5jeSBpcyBiZWxvdyB0aGUgdGFyZ2V0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FQ19ERUZBVUxUVkFMVUVTIERlZmF1bHQgVmFsdWVzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiBSZXNldCB2YWx1ZSBvZiB0aGUgUkVMT0FEIGZpZWxkCisgICogQG5vdGUgVGhlIHJlc2V0IHZhbHVlIG9mIHRoZSBSRUxPQUQgZmllbGQgY29ycmVzcG9uZHMgdG8gYSB0YXJnZXQgZnJlcXVlbmN5IG9mIDQ4IE1IegorICAqICAgICAgIGFuZCBhIHN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJlcXVlbmN5IG9mIDEga0h6IChTT0Ygc2lnbmFsIGZyb20gVVNCKQorICAqLworI2RlZmluZSBMTF9DUlNfUkVMT0FEVkFMVUVfREVGQVVMVCAgICAgICAgIDB4MDAwMEJCN0ZVCisKKy8qKgorICAqIEBicmllZiBSZXNldCB2YWx1ZSBvZiBGcmVxdWVuY3kgZXJyb3IgbGltaXQuCisgICovCisjZGVmaW5lIExMX0NSU19FUlJPUkxJTUlUX0RFRkFVTFQgICAgICAgICAgMHgwMDAwMDAyMlUKKworLyoqCisgICogQGJyaWVmIFJlc2V0IHZhbHVlIG9mIHRoZSBIU0k0OCBDYWxpYnJhdGlvbiBmaWVsZAorICAqIEBub3RlIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMyLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgbWlkZGxlIG9mIHRoZSB0cmltbWluZyBpbnRlcnZhbC4gCisgICogICAgICAgVGhlIHRyaW1taW5nIHN0ZXAgaXMgYXJvdW5kIDY3IGtIeiBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBUUklNIHN0ZXBzLiAKKyAgKiAgICAgICBBIGhpZ2hlciBUUklNIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGEgaGlnaGVyIG91dHB1dCBmcmVxdWVuY3kKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX0hTSTQ4Q0FMSUJSQVRJT05fREVGQVVMVCAgICAweDAwMDAwMDIwVSAKKy8qKgorICAqIEB9CisgICovIAorICAKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSU19MTF9FeHBvcnRlZF9NYWNyb3MgQ1JTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gQ1JTIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gQ1JTIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9DUlNfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBDUlMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBDUlMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfQ1JTX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FTV9FeHBvcnRlZF9NYWNyb3NfQ2FsY3VsYXRlX1JlbG9hZCBFeHBvcnRlZF9NYWNyb3NfQ2FsY3VsYXRlX1JlbG9hZAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFjcm8gdG8gY2FsY3VsYXRlIHJlbG9hZCB2YWx1ZSB0byBiZSBzZXQgaW4gQ1JTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0YXJnZXQgYW5kIHN5bmMgZnJlcXVlbmNpZXMKKyAgKiBAbm90ZSAgIFRoZSBSRUxPQUQgdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUgcmF0aW8gYmV0d2VlbiAKKyAgKiAgICAgICAgIHRoZSB0YXJnZXQgZnJlcXVlbmN5IGFuZCB0aGUgZnJlcXVlbmN5IG9mIHRoZSBzeW5jaHJvbml6YXRpb24gc291cmNlIGFmdGVyCisgICogICAgICAgICBwcmVzY2FsaW5nLiBJdCBpcyB0aGVuIGRlY3JlYXNlZCBieSBvbmUgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGV4cGVjdGVkCisgICogICAgICAgICBzeW5jaHJvbml6YXRpb24gb24gdGhlIHplcm8gdmFsdWUuIFRoZSBmb3JtdWxhIGlzIHRoZSBmb2xsb3dpbmc6CisgICogICAgICAgICAgICAgIFJFTE9BRCA9IChmVEFSR0VUIC8gZlNZTkMpIC0xCisgICogQHBhcmFtICBfX0ZUQVJHRVRfXyBUYXJnZXQgZnJlcXVlbmN5ICh2YWx1ZSBpbiBIeikKKyAgKiBAcGFyYW0gIF9fRlNZTkNfXyBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopCisgICogQHJldHZhbCBSZWxvYWQgdmFsdWUgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX0NSU19DQUxDX0NBTENVTEFURV9SRUxPQURWQUxVRShfX0ZUQVJHRVRfXywgX19GU1lOQ19fKSAoKChfX0ZUQVJHRVRfXykgLyAoX19GU1lOQ19fKSkgLSAxVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgQ1JTX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUlMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIKKyAgKiBAbm90ZSBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlIENSU19DRkdSIHJlZ2lzdGVyIGlzIHdyaXRlLXByb3RlY3RlZCBhbmQgY2Fubm90IGJlIG1vZGlmaWVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfRW5hYmxlRnJlcUVycm9yQ291bnRlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUZyZXFFcnJvckNvdW50ZXIodm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZyZXF1ZW5jeSBlcnJvciBjb3VudGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9DUlNfRGlzYWJsZUZyZXFFcnJvckNvdW50ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlRnJlcUVycm9yQ291bnRlcih2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDRU4gICAgICAgICAgIExMX0NSU19Jc0VuYWJsZWRGcmVxRXJyb3JDb3VudGVyCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzRW5hYmxlZEZyZXFFcnJvckNvdW50ZXIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0NFTikgPT0gKENSU19DUl9DRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEF1dG9tYXRpYyB0cmltbWluZyBjb3VudGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQVVUT1RSSU1FTiAgICBMTF9DUlNfRW5hYmxlQXV0b1RyaW1taW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlQXV0b1RyaW1taW5nKHZvaWQpCit7CisgIFNFVF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQXV0b21hdGljIHRyaW1taW5nIGNvdW50ZXIKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBVVRPVFJJTUVOICAgIExMX0NSU19EaXNhYmxlQXV0b1RyaW1taW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUF1dG9UcmltbWluZyh2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEF1dG9tYXRpYyB0cmltbWluZyBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFVVE9UUklNRU4gICAgTExfQ1JTX0lzRW5hYmxlZEF1dG9UcmltbWluZworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRBdXRvVHJpbW1pbmcodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0FVVE9UUklNRU4pID09IChDUlNfQ1JfQVVUT1RSSU1FTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIEFVVE9UUklNRU4gYml0IGlzIHNldCwgdGhpcyBmaWVsZCBpcyBjb250cm9sbGVkIGJ5IGhhcmR3YXJlIGFuZCBpcyByZWFkLW9ubHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUUklNICAgICAgICAgIExMX0NSU19TZXRIU0k0OFNtb290aFRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA2MworICAqIEBub3RlICAgRGVmYXVsdCB2YWx1ZSBjYW4gYmUgc2V0IHRoYW5rcyB0byBAcmVmIExMX0NSU19IU0k0OENBTElCUkFUSU9OX0RFRkFVTFQgCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0SFNJNDhTbW9vdGhUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhDUlMtPkNSLCBDUlNfQ1JfVFJJTSwgVmFsdWUgPDwgQ1JTX1BPU0lUSU9OX1RSSU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRSSU0gICAgICAgICAgTExfQ1JTX0dldEhTSTQ4U21vb3RoVHJpbW1pbmcKKyAgKiBAcmV0dmFsIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDYzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldEhTSTQ4U21vb3RoVHJpbW1pbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1RSSU0pID4+IENSU19QT1NJVElPTl9UUklNKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY291bnRlciByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBSRUxPQUQgICAgICAgIExMX0NSU19TZXRSZWxvYWRDb3VudGVyCisgICogQHBhcmFtICBWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKiBAbm90ZSAgIERlZmF1bHQgdmFsdWUgY2FuIGJlIHNldCB0aGFua3MgdG8gQHJlZiBMTF9DUlNfUkVMT0FEVkFMVUVfREVGQVVMVCAKKyAgKiAgICAgICAgIE90aGVyd2lzZSBpdCBjYW4gYmUgY2FsY3VsYXRlZCBpbiB1c2luZyBtYWNybyBAcmVmIF9fTExfQ1JTX0NBTENfQ0FMQ1VMQVRFX1JFTE9BRFZBTFVFIChfRlRBUkdFVF8sIF9GU1lOQ18pCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0UmVsb2FkQ291bnRlcih1aW50MzJfdCBWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1JFTE9BRCwgVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb3VudGVyIHJlbG9hZCB2YWx1ZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFJFTE9BRCAgICAgICAgTExfQ1JTX0dldFJlbG9hZENvdW50ZXIKKyAgKiBAcmV0dmFsIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRSZWxvYWRDb3VudGVyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfUkVMT0FEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZyZXF1ZW5jeSBlcnJvciBsaW1pdAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEZFTElNICAgICAgICAgTExfQ1JTX1NldEZyZXFFcnJvckxpbWl0CisgICogQHBhcmFtICBWYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAgKiBAbm90ZSAgIERlZmF1bHQgdmFsdWUgY2FuIGJlIHNldCB0aGFua3MgdG8gQHJlZiBMTF9DUlNfRVJST1JMSU1JVF9ERUZBVUxUIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX1NldEZyZXFFcnJvckxpbWl0KHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfRkVMSU0sIFZhbHVlIDw8IENSU19QT1NJVElPTl9GRUxJTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZyZXF1ZW5jeSBlcnJvciBsaW1pdAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEZFTElNICAgICAgICAgTExfQ1JTX0dldEZyZXFFcnJvckxpbWl0CisgICogQHJldHZhbCBBIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yTGltaXQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9GRUxJTSkgPj4gQ1JTX1BPU0lUSU9OX0ZFTElNKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZGl2aXNpb24gZmFjdG9yIGZvciBTWU5DIHNpZ25hbAorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFNZTkNESVYgICAgICAgTExfQ1JTX1NldFN5bmNEaXZpZGVyCisgICogQHBhcmFtICBEaXZpZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTI4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY0RpdmlkZXIodWludDMyX3QgRGl2aWRlcikKK3sKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNESVYsIERpdmlkZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBkaXZpc2lvbiBmYWN0b3IgZm9yIFNZTkMgc2lnbmFsCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgU1lOQ0RJViAgICAgICBMTF9DUlNfR2V0U3luY0RpdmlkZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMTI4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldFN5bmNEaXZpZGVyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKENSUy0+Q0ZHUiwgQ1JTX0NGR1JfU1lOQ0RJVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTWU5DIHNpZ25hbCBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19TZXRTeW5jU2lnbmFsU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfR1BJTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfVVNCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfU2V0U3luY1NpZ25hbFNvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DU1JDLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTWU5DIHNpZ25hbCBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DU1JDICAgICAgIExMX0NSU19HZXRTeW5jU2lnbmFsU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9VU0IKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0U3luY1NpZ25hbFNvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNTUkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgaW5wdXQgcG9sYXJpdHkgZm9yIHRoZSBTWU5DIHNpZ25hbCBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DUE9MICAgICAgIExMX0NSU19TZXRTeW5jUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX1NldFN5bmNQb2xhcml0eSh1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhDUlMtPkNGR1IsIENSU19DRkdSX1NZTkNQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgaW5wdXQgcG9sYXJpdHkgZm9yIHRoZSBTWU5DIHNpZ25hbCBzb3VyY2UKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTWU5DUE9MICAgICAgIExMX0NSU19HZXRTeW5jUG9sYXJpdHkKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19HZXRTeW5jUG9sYXJpdHkodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoQ1JTLT5DRkdSLCBDUlNfQ0ZHUl9TWU5DUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENSUyBmb3IgdGhlIHN5bmNocm9uaXphdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRSSU0gICAgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvblxuCisgICogICAgICAgICBDRkdSICAgICAgICAgUkVMT0FEICAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBGRUxJTSAgICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb25cbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIFNZTkNESVYgICAgICAgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvblxuCisgICogICAgICAgICBDRkdSICAgICAgICAgU1lOQ1NSQyAgICAgICBMTF9DUlNfQ29uZmlnU3luY2hyb25pemF0aW9uXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBTWU5DUE9MICAgICAgIExMX0NSU19Db25maWdTeW5jaHJvbml6YXRpb24KKyAgKiBAcGFyYW0gIEhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA2MworICAqIEBwYXJhbSAgRXJyb3JMaW1pdFZhbHVlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqIEBwYXJhbSAgUmVsb2FkVmFsdWUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMjU1CisgICogQHBhcmFtICBTZXR0aW5ncyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19ESVZfMSBvciBAcmVmIExMX0NSU19TWU5DX0RJVl8yIG9yIEByZWYgTExfQ1JTX1NZTkNfRElWXzQgb3IgQHJlZiBMTF9DUlNfU1lOQ19ESVZfOAorICAqICAgICAgICAgICAgICBvciBAcmVmIExMX0NSU19TWU5DX0RJVl8xNiBvciBAcmVmIExMX0NSU19TWU5DX0RJVl8zMiBvciBAcmVmIExMX0NSU19TWU5DX0RJVl82NCBvciBAcmVmIExMX0NSU19TWU5DX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfR1BJTyBvciBAcmVmIExMX0NSU19TWU5DX1NPVVJDRV9MU0Ugb3IgQHJlZiBMTF9DUlNfU1lOQ19TT1VSQ0VfVVNCCisgICogICAgICAgICBAYXJnIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfUklTSU5HIG9yIEByZWYgTExfQ1JTX1NZTkNfUE9MQVJJVFlfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NvbmZpZ1N5bmNocm9uaXphdGlvbih1aW50MzJfdCBIU0k0OENhbGlicmF0aW9uVmFsdWUsIHVpbnQzMl90IEVycm9yTGltaXRWYWx1ZSwgdWludDMyX3QgUmVsb2FkVmFsdWUsIHVpbnQzMl90IFNldHRpbmdzKQoreworICBNT0RJRllfUkVHKENSUy0+Q1IsIENSU19DUl9UUklNLCBIU0k0OENhbGlicmF0aW9uVmFsdWUpOworICBNT0RJRllfUkVHKENSUy0+Q0ZHUiwgCisgICAgICAgICAgICAgQ1JTX0NGR1JfUkVMT0FEIHwgQ1JTX0NGR1JfRkVMSU0gfCBDUlNfQ0ZHUl9TWU5DRElWIHwgQ1JTX0NGR1JfU1lOQ1NSQyB8IENSU19DRkdSX1NZTkNQT0wsIAorICAgICAgICAgICAgIFJlbG9hZFZhbHVlIHwgKEVycm9yTGltaXRWYWx1ZSA8PCBDUlNfUE9TSVRJT05fRkVMSU0pIHwgU2V0dGluZ3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSU19MTF9FRl9DUlNfTWFuYWdlbWVudCBDUlNfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgc29mdHdhcmUgU1lOQyBldmVudAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNXU1lOQyAgICAgICAgTExfQ1JTX0dlbmVyYXRlRXZlbnRfU1dTWU5DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfR2VuZXJhdGVFdmVudF9TV1NZTkModm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1dTWU5DKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGZyZXF1ZW5jeSBlcnJvciBkaXJlY3Rpb24gbGF0Y2hlZCBpbiB0aGUgdGltZSBvZiB0aGUgbGFzdCAKKyAgKiBTWU5DIGV2ZW50CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRkVESVIgICAgICAgICBMTF9DUlNfR2V0RnJlcUVycm9yRGlyZWN0aW9uCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19GUkVRX0VSUk9SX0RJUl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0NSU19GUkVRX0VSUk9SX0RJUl9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0dldEZyZXFFcnJvckRpcmVjdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRURJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgdmFsdWUgbGF0Y2hlZCBpbiB0aGUgdGltZSBvZiB0aGUgbGFzdCBTWU5DIGV2ZW50CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRkVDQVAgICAgICAgICBMTF9DUlNfR2V0RnJlcUVycm9yQ2FwdHVyZQorICAqIEByZXR2YWwgQSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfR2V0RnJlcUVycm9yQ2FwdHVyZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9GRUNBUCkgPj4gQ1JTX1BPU0lUSU9OX0ZFQ0FQKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyBldmVudCBPSyBzaWduYWwgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU1lOQ09LRiAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNPSworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ09LKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNPS0YpID09IChDUlNfSVNSX1NZTkNPS0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1lOQyB3YXJuaW5nIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DV0FSTkYgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNXQVJOKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNXQVJORikgPT0gKENSU19JU1JfU1lOQ1dBUk5GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFN5bmNocm9uaXphdGlvbiBvciB0cmltbWluZyBlcnJvciBzaWduYWwgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRVJSRiAgICAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX0VSUgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfRVJSKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX0VSUkYpID09IChDUlNfSVNSX0VSUkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRXhwZWN0ZWQgU1lOQyBzaWduYWwgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRVNZTkNGICAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX0VTWU5DCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQ1JTX0lzQWN0aXZlRmxhZ19FU1lOQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9FU1lOQ0YpID09IChDUlNfSVNSX0VTWU5DRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DRVJSICAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ0VSUih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChDUlMtPklTUiwgQ1JTX0lTUl9TWU5DRVJSKSA9PSAoQ1JTX0lTUl9TWU5DRVJSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNZTkMgbWlzc2VkIGVycm9yIHNpZ25hbCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTWU5DTUlTUyAgICAgIExMX0NSU19Jc0FjdGl2ZUZsYWdfU1lOQ01JU1MKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1NZTkNNSVNTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKENSUy0+SVNSLCBDUlNfSVNSX1NZTkNNSVNTKSA9PSAoQ1JTX0lTUl9TWU5DTUlTUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmltbWluZyBvdmVyZmxvdyBvciB1bmRlcmZsb3cgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFJJTU9WRiAgICAgICBMTF9DUlNfSXNBY3RpdmVGbGFnX1RSSU1PVkYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNBY3RpdmVGbGFnX1RSSU1PVkYodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5JU1IsIENSU19JU1JfVFJJTU9WRikgPT0gKENSU19JU1JfVFJJTU9WRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgU1lOQyBldmVudCBPSyBmbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgU1lOQ09LQyAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX1NZTkNPSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19TWU5DT0sodm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNPS0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSAgU1lOQyB3YXJuaW5nIGZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBTWU5DV0FSTkMgICAgIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19DbGVhckZsYWdfU1lOQ1dBUk4odm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX1NZTkNXQVJOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVFJJTU9WRiwgU1lOQ01JU1MgYW5kIFNZTkNFUlIgYml0cyBhbmQgY29uc2VxdWVudGx5IGFsc28gCisgICogdGhlIEVSUiBmbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRVJSQyAgICAgICAgICBMTF9DUlNfQ2xlYXJGbGFnX0VSUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19FUlIodm9pZCkKK3sKKyAgV1JJVEVfUkVHKENSUy0+SUNSLCBDUlNfSUNSX0VSUkMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEV4cGVjdGVkIFNZTkMgZmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIEVTWU5DQyAgICAgICAgTExfQ1JTX0NsZWFyRmxhZ19FU1lOQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0NsZWFyRmxhZ19FU1lOQyh2b2lkKQoreworICBXUklURV9SRUcoQ1JTLT5JQ1IsIENSU19JQ1JfRVNZTkNDKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUlNfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19FbmFibGVJVF9TWU5DT0sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9TWU5DT0sodm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfU1lOQ09LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1lOQyBldmVudCBPSyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DT0tJRSAgICAgIExMX0NSU19EaXNhYmxlSVRfU1lOQ09LCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRGlzYWJsZUlUX1NZTkNPSyh2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIGV2ZW50IE9LIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFNZTkNPS0lFICAgICAgTExfQ1JTX0lzRW5hYmxlZElUX1NZTkNPSworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9TWU5DT0sodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNPS0lFKSA9PSAoQ1JTX0NSX1NZTkNPS0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTWU5DIHdhcm5pbmcgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ1dBUk5JRSAgICBMTF9DUlNfRW5hYmxlSVRfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19FbmFibGVJVF9TWU5DV0FSTih2b2lkKQoreworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNZTkMgd2FybmluZyBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTWU5DV0FSTklFICAgIExMX0NSU19EaXNhYmxlSVRfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0NSU19EaXNhYmxlSVRfU1lOQ1dBUk4odm9pZCkKK3sKKyAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9TWU5DV0FSTklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTWU5DIHdhcm5pbmcgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1lOQ1dBUk5JRSAgICBMTF9DUlNfSXNFbmFibGVkSVRfU1lOQ1dBUk4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkSVRfU1lOQ1dBUk4odm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX1NZTkNXQVJOSUUpID09IChDUlNfQ1JfU1lOQ1dBUk5JRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0VuYWJsZUlUX0VSUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0VuYWJsZUlUX0VSUih2b2lkKQoreworICBTRVRfQklUKENSUy0+Q1IsIENSU19DUl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTeW5jaHJvbml6YXRpb24gb3IgdHJpbW1pbmcgZXJyb3IgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9DUlNfRGlzYWJsZUlUX0VSUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVJVF9FUlIodm9pZCkKK3sKKyAgQ0xFQVJfQklUKENSUy0+Q1IsIENSU19DUl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU3luY2hyb25pemF0aW9uIG9yIHRyaW1taW5nIGVycm9yIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVSUklFICAgICAgICAgTExfQ1JTX0lzRW5hYmxlZElUX0VSUgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0NSU19Jc0VuYWJsZWRJVF9FUlIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VSUklFKSA9PSAoQ1JTX0NSX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0VuYWJsZUlUX0VTWU5DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DUlNfRW5hYmxlSVRfRVNZTkModm9pZCkKK3sKKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfRVNZTkNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHBlY3RlZCBTWU5DIGludGVycnVwdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVTWU5DSUUgICAgICAgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQ1JTX0Rpc2FibGVJVF9FU1lOQyh2b2lkKQoreworICBDTEVBUl9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VTWU5DSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEV4cGVjdGVkIFNZTkMgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRVNZTkNJRSAgICAgICBMTF9DUlNfSXNFbmFibGVkSVRfRVNZTkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DUlNfSXNFbmFibGVkSVRfRVNZTkModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoQ1JTLT5DUiwgQ1JTX0NSX0VTWU5DSUUpID09IChDUlNfQ1JfRVNZTkNJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBDUlNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyAgCitFcnJvclN0YXR1cyBMTF9DUlNfRGVJbml0KHZvaWQpOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUlMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfQ1JTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfZG1hLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODlkODcKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2RtYS5oCkBAIC0wLDAgKzEsMjEyNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9kbWEuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRE1BIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9ETUFfSAorI2RlZmluZSBTVE0zMldCeHhfTExfRE1BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9kbWFtdXguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRE1BMSkgfHwgZGVmaW5lZCAoRE1BMikKKworLyoqIEBkZWZncm91cCBETUFfTEwgRE1BCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX1ByaXZhdGVfTWFjcm9zIERNQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgRE1BIEluc3RhbmNlIGFuZCBpbmRleCBpbnRvIERNQSBjaGFubmVsCisgICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTkRFWF9fIDAgdG8gNiB0byBtYXAgRE1BeF9DaGFubmVsMSB0byBETUF4X0NoYW5uZWw3CisgICogQHJldHZhbCBQb2ludGVyIHRvIHRoZSBETUEgY2hhbm5lbAorICAqLworI2RlZmluZSBfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9JTkRFWF9fKSAgIFwKKygoKF9fRE1BX0lOU1RBTkNFX18pID09IERNQTEpID8gKERNQTFfQ2hhbm5lbDEgKyAoX19DSEFOTkVMX0lOREVYX18pKSA6IChETUEyX0NoYW5uZWwxICsgKF9fQ0hBTk5FTF9JTkRFWF9fKSkpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNvbnZlcnQgRE1BIEluc3RhbmNlIGFuZCBpbmRleCBpbnRvIERNQU1VWCBjaGFubmVsCisgICogQG5vdGUgICBETUFNVVggY2hhbm5lbCAwIHRvIDYgYXJlIG1hcHBlZCB0byBETUExIGNoYW5uZWwgMSB0byA3LgorICAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgNyB0byAxMyBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDcuCisgICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTkRFWF9fIDAgdG8gNiB0byBtYXAgRE1BeF9DaGFubmVsMSB0byBETUF4X0NoYW5uZWw3CisgICogQHJldHZhbCBQb2ludGVyIHRvIHRoZSBETUEgY2hhbm5lbAorICAqLworI2RlZmluZSBfX0xMX0RNQV9JTlNUQU5DRV9UT19ETUFNVVhfQ0NSKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9JTkRFWF9fKVwKKygoKF9fRE1BX0lOU1RBTkNFX18pID09IERNQTEpID8gKERNQU1VWDFfQ2hhbm5lbDAgKyAoX19DSEFOTkVMX0lOREVYX18pKSA6IChETUFNVVgxX0NoYW5uZWw3ICsgKF9fQ0hBTk5FTF9JTkRFWF9fKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBETUFfTExfRVNfSU5JVCBETUEgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNBZGRyZXNzOyAgLyohPCBTcGVjaWZpZXMgdGhlIHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzIGZvciBETUEgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhcyBTb3VyY2UgYmFzZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEFkZHJlc3M7ICAvKiE8IFNwZWNpZmllcyB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBmb3IgRE1BIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXMgRGVzdGluYXRpb24gYmFzZSBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRi4gKi8KKworICB1aW50MzJfdCBEaXJlY3Rpb247ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgZGF0YSB3aWxsIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIHBlcmlwaGVyYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtZW1vcnkgdG8gbWVtb3J5IG9yIGZyb20gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfRElSRUNUSU9OCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oKS4gKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbm9ybWFsIG9yIGNpcmN1bGFyIG9wZXJhdGlvbiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZTogVGhlIGNpcmN1bGFyIGJ1ZmZlciBtb2RlIGNhbm5vdCBiZSB1c2VkIGlmIHRoZSBtZW1vcnkgdG8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHNlbGVjdGVkIENoYW5uZWwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldE1vZGUoKS4gKi8KKworICB1aW50MzJfdCBQZXJpcGhPck0yTVNyY0luY01vZGU7ICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQZXJpcGhlcmFsIGFkZHJlc3Mgb3IgU291cmNlIGFkZHJlc3MgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY3JlbWVudGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19QRVJJUEgKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRE1BX1NldFBlcmlwaEluY01vZGUoKS4gKi8KKworICB1aW50MzJfdCBNZW1vcnlPck0yTURzdEluY01vZGU7ICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBNZW1vcnkgYWRkcmVzcyBvciBEZXN0aW5hdGlvbiBhZGRyZXNzIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbmNyZW1lbnRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfTUVNT1JZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRNZW1vcnlJbmNNb2RlKCkuICovCisKKyAgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZTsgLyohPCBTcGVjaWZpZXMgdGhlIFBlcmlwaGVyYWwgZGF0YSBzaXplIGFsaWdubWVudCBvciBTb3VyY2UgZGF0YSBzaXplIGFsaWdubWVudCAoYnl0ZSwgaGFsZiB3b3JkLCB3b3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgbWVtb3J5IHRvIG1lbW9yeSB0cmFuc2ZlciBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFfTExfRUNfUERBVEFBTElHTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoU2l6ZSgpLiAqLworCisgIHVpbnQzMl90IE1lbW9yeU9yTTJNRHN0RGF0YVNpemU7IC8qITwgU3BlY2lmaWVzIHRoZSBNZW1vcnkgZGF0YSBzaXplIGFsaWdubWVudCBvciBEZXN0aW5hdGlvbiBkYXRhIHNpemUgYWxpZ25tZW50IChieXRlLCBoYWxmIHdvcmQsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtZW1vcnkgdG8gbWVtb3J5IHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERNQV9MTF9FQ19NREFUQUFMSUdOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRNZW1vcnlTaXplKCkuICovCisKKyAgdWludDMyX3QgTmJEYXRhOyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLCBpbiBkYXRhIHVuaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGEgdW5pdCBpcyBlcXVhbCB0byB0aGUgc291cmNlIGJ1ZmZlciBjb25maWd1cmF0aW9uIHNldCBpbiBQZXJpcGhlcmFsU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE1lbW9yeVNpemUgcGFyYW1ldGVycyBkZXBlbmRpbmcgaW4gdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0RGF0YUxlbmd0aCgpLiAqLworCisgIHVpbnQzMl90IFBlcmlwaFJlcXVlc3Q7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBETUFNVVhfTExfRUNfUkVRVUVTVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9ETUFfU2V0UGVyaXBoUmVxdWVzdCgpLiAqLworCisgIHVpbnQzMl90IFByaW9yaXR5OyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRE1BX0xMX0VDX1BSSU9SSVRZCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbCgpLiAqLworCit9IExMX0RNQV9Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBETUFfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGMSAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjEgICAgICAgIC8qITwgQ2hhbm5lbCAxIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUYxICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGMSAgICAgICAvKiE8IENoYW5uZWwgMSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGMSAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjEgICAgICAgLyohPCBDaGFubmVsIDEgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjEgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUYxICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjIgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUYyICAgICAgICAvKiE8IENoYW5uZWwgMiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGMiAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjIgICAgICAgLyohPCBDaGFubmVsIDIgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjIgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUYyICAgICAgIC8qITwgQ2hhbm5lbCAyIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUYyICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGMiAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUYzICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGMyAgICAgICAgLyohPCBDaGFubmVsIDMgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjMgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUYzICAgICAgIC8qITwgQ2hhbm5lbCAzIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUYzICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGMyAgICAgICAvKiE8IENoYW5uZWwgMyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGMyAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjMgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNCAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjQgICAgICAgIC8qITwgQ2hhbm5lbCA0IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY0ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNCAgICAgICAvKiE8IENoYW5uZWwgNCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNCAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjQgICAgICAgLyohPCBDaGFubmVsIDQgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjQgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY0ICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0dJRjUgICAgICAgICAgICAgICAgIERNQV9JRkNSX0NHSUY1ICAgICAgICAvKiE8IENoYW5uZWwgNSBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NUQ0lGNSAgICAgICAgICAgICAgICBETUFfSUZDUl9DVENJRjUgICAgICAgLyohPCBDaGFubmVsIDUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DSFRJRjUgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0hUSUY1ICAgICAgIC8qITwgQ2hhbm5lbCA1IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RFSUY1ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NURUlGNSAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NHSUY2ICAgICAgICAgICAgICAgICBETUFfSUZDUl9DR0lGNiAgICAgICAgLyohPCBDaGFubmVsIDYgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVENJRjYgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RDSUY2ICAgICAgIC8qITwgQ2hhbm5lbCA2IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ0hUSUY2ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NIVElGNiAgICAgICAvKiE8IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NURUlGNiAgICAgICAgICAgICAgICBETUFfSUZDUl9DVEVJRjYgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DR0lGNyAgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ0dJRjcgICAgICAgIC8qITwgQ2hhbm5lbCA3IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lGQ1JfQ1RDSUY3ICAgICAgICAgICAgICAgIERNQV9JRkNSX0NUQ0lGNyAgICAgICAvKiE8IENoYW5uZWwgNyB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JRkNSX0NIVElGNyAgICAgICAgICAgICAgICBETUFfSUZDUl9DSFRJRjcgICAgICAgLyohPCBDaGFubmVsIDcgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSUZDUl9DVEVJRjcgICAgICAgICAgICAgICAgRE1BX0lGQ1JfQ1RFSUY3ICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGMSAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjEgICAgICAgICAgLyohPCBDaGFubmVsIDEgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUYxICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGMSAgICAgICAgIC8qITwgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGMSAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjEgICAgICAgICAvKiE8IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjEgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUYxICAgICAgICAgLyohPCBDaGFubmVsIDEgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjIgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUYyICAgICAgICAgIC8qITwgQ2hhbm5lbCAyIGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGMiAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjIgICAgICAgICAvKiE8IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjIgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUYyICAgICAgICAgLyohPCBDaGFubmVsIDIgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUYyICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGMiAgICAgICAgIC8qITwgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUYzICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGMyAgICAgICAgICAvKiE8IENoYW5uZWwgMyBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjMgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUYzICAgICAgICAgLyohPCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUYzICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGMyAgICAgICAgIC8qITwgQ2hhbm5lbCAzIGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGMyAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjMgICAgICAgICAvKiE8IENoYW5uZWwgMyB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNCAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjQgICAgICAgICAgLyohPCBDaGFubmVsIDQgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY0ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNCAgICAgICAgIC8qITwgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNCAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjQgICAgICAgICAvKiE8IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjQgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY0ICAgICAgICAgLyohPCBDaGFubmVsIDQgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX0dJRjUgICAgICAgICAgICAgICAgICAgRE1BX0lTUl9HSUY1ICAgICAgICAgIC8qITwgQ2hhbm5lbCA1IGdsb2JhbCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9UQ0lGNSAgICAgICAgICAgICAgICAgIERNQV9JU1JfVENJRjUgICAgICAgICAvKiE8IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisjZGVmaW5lIExMX0RNQV9JU1JfSFRJRjUgICAgICAgICAgICAgICAgICBETUFfSVNSX0hUSUY1ICAgICAgICAgLyohPCBDaGFubmVsIDUgaGFsZiB0cmFuc2ZlciBmbGFnICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RFSUY1ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9URUlGNSAgICAgICAgIC8qITwgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9HSUY2ICAgICAgICAgICAgICAgICAgIERNQV9JU1JfR0lGNiAgICAgICAgICAvKiE8IENoYW5uZWwgNiBnbG9iYWwgZmxhZyAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVENJRjYgICAgICAgICAgICAgICAgICBETUFfSVNSX1RDSUY2ICAgICAgICAgLyohPCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9ETUFfSVNSX0hUSUY2ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9IVElGNiAgICAgICAgIC8qITwgQ2hhbm5lbCA2IGhhbGYgdHJhbnNmZXIgZmxhZyAgICAgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9URUlGNiAgICAgICAgICAgICAgICAgIERNQV9JU1JfVEVJRjYgICAgICAgICAvKiE8IENoYW5uZWwgNiB0cmFuc2ZlciBlcnJvciBmbGFnICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfR0lGNyAgICAgICAgICAgICAgICAgICBETUFfSVNSX0dJRjcgICAgICAgICAgLyohPCBDaGFubmVsIDcgZ2xvYmFsIGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfSVNSX1RDSUY3ICAgICAgICAgICAgICAgICAgRE1BX0lTUl9UQ0lGNyAgICAgICAgIC8qITwgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyNkZWZpbmUgTExfRE1BX0lTUl9IVElGNyAgICAgICAgICAgICAgICAgIERNQV9JU1JfSFRJRjcgICAgICAgICAvKiE8IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcgICAgICovCisjZGVmaW5lIExMX0RNQV9JU1JfVEVJRjcgICAgICAgICAgICAgICAgICBETUFfSVNSX1RFSUY3ICAgICAgICAgLyohPCBDaGFubmVsIDcgdHJhbnNmZXIgZXJyb3IgZmxhZyAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kICBMTF9ETUFfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX0NDUl9UQ0lFICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfVENJRSAgICAgICAgICAvKiE8IFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCAqLworI2RlZmluZSBMTF9ETUFfQ0NSX0hUSUUgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9IVElFICAgICAgICAgIC8qITwgSGFsZiBUcmFuc2ZlciBpbnRlcnJ1cHQgICAgICovCisjZGVmaW5lIExMX0RNQV9DQ1JfVEVJRSAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1RFSUUgICAgICAgICAgLyohPCBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0NIQU5ORUwgQ0hBTk5FTAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAvKiE8IERNQSBDaGFubmVsIDEgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRE1BIENoYW5uZWwgMiAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF8zICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UgLyohPCBETUEgQ2hhbm5lbCAzICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzQgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSBDaGFubmVsIDQgKi8KKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfNSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRE1BIENoYW5uZWwgNSAqLworI2RlZmluZSBMTF9ETUFfQ0hBTk5FTF82ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNlUgLyohPCBETUEgQ2hhbm5lbCA2ICovCisjZGVmaW5lIExMX0RNQV9DSEFOTkVMXzcgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3VSAvKiE8IERNQSBDaGFubmVsIDcgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKyNkZWZpbmUgTExfRE1BX0NIQU5ORUxfQUxMICAgICAgICAgICAgICAgIDB4RkZGRjAwMDBVIC8qITwgRE1BIENoYW5uZWwgYWxsICh1c2VkIG9ubHkgZm9yIGZ1bmN0aW9uIEByZWYgTExfRE1BX0RlSW5pdCgpLiAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VDX0RJUkVDVElPTiBUcmFuc2ZlciBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIHRvIG1lbW9yeSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIERNQV9DQ1JfRElSICAgICAgICAgICAgIC8qITwgTWVtb3J5IHRvIHBlcmlwaGVyYWwgZGlyZWN0aW9uICovCisjZGVmaW5lIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBETUFfQ0NSX01FTTJNRU0gICAgICAgICAvKiE8IE1lbW9yeSB0byBtZW1vcnkgZGlyZWN0aW9uICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTU9ERSBUcmFuc2ZlciBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BX01PREVfTk9STUFMICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm9ybWFsIE1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9ETUFfTU9ERV9DSVJDVUxBUiAgICAgICAgICAgICAgRE1BX0NDUl9DSVJDICAgICAgICAgICAgLyohPCBDaXJjdWxhciBNb2RlICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QRVJJUEggUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UICAgICAgICAgICBETUFfQ0NSX1BJTkMgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRW5hYmxlICovCisjZGVmaW5lIExMX0RNQV9QRVJJUEhfTk9JTkNSRU1FTlQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUgRGlzYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTUVNT1JZIE1lbW9yeSBpbmNyZW1lbnQgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQV9NRU1PUllfSU5DUkVNRU5UICAgICAgICAgICBETUFfQ0NSX01JTkMgICAgICAgICAgICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBFbmFibGUgICovCisjZGVmaW5lIExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE1lbW9yeSBpbmNyZW1lbnQgbW9kZSBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FQ19QREFUQUFMSUdOIFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfUERBVEFBTElHTl9CWVRFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIGRhdGEgYWxpZ25tZW50IDogQnl0ZSAgICAgKi8KKyNkZWZpbmUgTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQgICAgICAgIERNQV9DQ1JfUFNJWkVfMCAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBkYXRhIGFsaWdubWVudCA6IEhhbGZXb3JkICovCisjZGVmaW5lIExMX0RNQV9QREFUQUFMSUdOX1dPUkQgICAgICAgICAgICBETUFfQ0NSX1BTSVpFXzEgICAgICAgICAvKiE8IFBlcmlwaGVyYWwgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfTURBVEFBTElHTiBNZW1vcnkgZGF0YSBhbGlnbm1lbnQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9CWVRFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBCeXRlICAgICAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCAgICAgICAgRE1BX0NDUl9NU0laRV8wICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBIYWxmV29yZCAqLworI2RlZmluZSBMTF9ETUFfTURBVEFBTElHTl9XT1JEICAgICAgICAgICAgRE1BX0NDUl9NU0laRV8xICAgICAgICAgLyohPCBNZW1vcnkgZGF0YSBhbGlnbm1lbnQgOiBXb3JkICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRUNfUFJJT1JJVFkgVHJhbnNmZXIgUHJpb3JpdHkgbGV2ZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IExvdyAgICAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNICAgICAgICAgICAgRE1BX0NDUl9QTF8wICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IE1lZGl1bSAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfSElHSCAgICAgICAgICAgICAgRE1BX0NDUl9QTF8xICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IEhpZ2ggICAgICAqLworI2RlZmluZSBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0ggICAgICAgICAgRE1BX0NDUl9QTCAgICAgICAgICAgICAgLyohPCBQcmlvcml0eSBsZXZlbCA6IFZlcnlfSGlnaCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0V4cG9ydGVkX01hY3JvcyBETUEgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIG1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gRE1BIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRE1BIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9ETUFfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBETUEgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUEgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfRE1BX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FTV9DT05WRVJUX0RNQXhDSEFOTkVMeSBDb252ZXJ0IERNQXhDaGFubmVseQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgRE1BeF9DaGFubmVseSBpbnRvIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTlNUQU5DRV9fIERNQXhfQ2hhbm5lbHkKKyAgKiBAcmV0dmFsIERNQXgKKyAgKi8KKyNpZiBkZWZpbmVkKERNQTIpCisjZGVmaW5lIF9fTExfRE1BX0dFVF9JTlNUQU5DRShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICBcCisoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID4gKCh1aW50MzJfdClETUExX0NoYW5uZWw3KSkgPyAgRE1BMiA6IERNQTEpCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfSU5TVEFOQ0UoX19DSEFOTkVMX0lOU1RBTkNFX18pICAoRE1BMSkKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgRE1BeF9DaGFubmVseSBpbnRvIExMX0RNQV9DSEFOTkVMX3kKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9JTlNUQU5DRV9fIERNQXhfQ2hhbm5lbHkKKyAgKiBAcmV0dmFsIExMX0RNQV9DSEFOTkVMX3kKKyAgKi8KKyNpZiBkZWZpbmVkIChETUEyKQorI2lmIGRlZmluZWQgKERNQTJfQ2hhbm5lbDYpICYmIGRlZmluZWQgKERNQTJfQ2hhbm5lbDcpCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSAgIFwKKygoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwxKSkgPyBMTF9ETUFfQ0hBTk5FTF8xIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMikpID8gTExfRE1BX0NIQU5ORUxfMiA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMykpID8gTExfRE1BX0NIQU5ORUxfMyA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw0KSkgPyBMTF9ETUFfQ0hBTk5FTF80IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNSkpID8gTExfRE1BX0NIQU5ORUxfNSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWw1KSkgPyBMTF9ETUFfQ0hBTk5FTF81IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSA/IExMX0RNQV9DSEFOTkVMXzYgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNikpID8gTExfRE1BX0NIQU5ORUxfNiA6IFwKKyBMTF9ETUFfQ0hBTk5FTF83KQorI2Vsc2UKKyNkZWZpbmUgX19MTF9ETUFfR0VUX0NIQU5ORUwoX19DSEFOTkVMX0lOU1RBTkNFX18pICAgXAorKCgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA/IExMX0RNQV9DSEFOTkVMXzEgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsMSkpID8gTExfRE1BX0NIQU5ORUxfMSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIpKSA/IExMX0RNQV9DSEFOTkVMXzIgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMykpID8gTExfRE1BX0NIQU5ORUxfMyA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyX0NoYW5uZWwzKSkgPyBMTF9ETUFfQ0hBTk5FTF8zIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDQpKSA/IExMX0RNQV9DSEFOTkVMXzQgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMl9DaGFubmVsNCkpID8gTExfRE1BX0NIQU5ORUxfNCA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgPyBMTF9ETUFfQ0hBTk5FTF81IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDUpKSA/IExMX0RNQV9DSEFOTkVMXzUgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNikpID8gTExfRE1BX0NIQU5ORUxfNiA6IFwKKyBMTF9ETUFfQ0hBTk5FTF83KQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX0xMX0RNQV9HRVRfQ0hBTk5FTChfX0NIQU5ORUxfSU5TVEFOQ0VfXykgICBcCisoKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsMSkpID8gTExfRE1BX0NIQU5ORUxfMSA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWwyKSkgPyBMTF9ETUFfQ0hBTk5FTF8yIDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDMpKSA/IExMX0RNQV9DSEFOTkVMXzMgOiBcCisgKCh1aW50MzJfdCkoX19DSEFOTkVMX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMV9DaGFubmVsNCkpID8gTExfRE1BX0NIQU5ORUxfNCA6IFwKKyAoKHVpbnQzMl90KShfX0NIQU5ORUxfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExX0NoYW5uZWw1KSkgPyBMTF9ETUFfQ0hBTk5FTF81IDogXAorICgodWludDMyX3QpKF9fQ0hBTk5FTF9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDYpKSA/IExMX0RNQV9DSEFOTkVMXzYgOiBcCisgTExfRE1BX0NIQU5ORUxfNykKKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIENvbnZlcnQgRE1BIEluc3RhbmNlIERNQXggYW5kIExMX0RNQV9DSEFOTkVMX3kgaW50byBETUF4X0NoYW5uZWx5CisgICogQHBhcmFtICBfX0RNQV9JTlNUQU5DRV9fIERNQXgKKyAgKiBAcGFyYW0gIF9fQ0hBTk5FTF9fIExMX0RNQV9DSEFOTkVMX3kKKyAgKiBAcmV0dmFsIERNQXhfQ2hhbm5lbHkKKyAgKi8KKyNpZiBkZWZpbmVkIChETUEyKQorI2lmIGRlZmluZWQgKERNQTJfQ2hhbm5lbDYpICYmIGRlZmluZWQgKERNQTJfQ2hhbm5lbDcpCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMX0lOU1RBTkNFKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKygoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSA/IERNQTFfQ2hhbm5lbDEgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUEyX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSA/IERNQTJfQ2hhbm5lbDIgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzMpKSkgPyBETUExX0NoYW5uZWwzIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMl9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSA/IERNQTFfQ2hhbm5lbDQgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUEyX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpID8gRE1BMV9DaGFubmVsNSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSA/IERNQTJfQ2hhbm5lbDUgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzYpKSkgPyBETUExX0NoYW5uZWw2IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF82KSkpID8gRE1BMl9DaGFubmVsNiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNykpKSA/IERNQTFfQ2hhbm5lbDcgOiBcCisgRE1BMl9DaGFubmVsNykKKyNlbHNlCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMX0lOU1RBTkNFKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKygoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSA/IERNQTFfQ2hhbm5lbDEgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzEpKSkgPyBETUEyX0NoYW5uZWwxIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8yKSkpID8gRE1BMV9DaGFubmVsMiA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMikpKSA/IERNQTJfQ2hhbm5lbDIgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzMpKSkgPyBETUExX0NoYW5uZWwzIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTIpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMl9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSA/IERNQTFfQ2hhbm5lbDQgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMikpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzQpKSkgPyBETUEyX0NoYW5uZWw0IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF81KSkpID8gRE1BMV9DaGFubmVsNSA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUEyKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNSkpKSA/IERNQTJfQ2hhbm5lbDUgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzYpKSkgPyBETUExX0NoYW5uZWw2IDogXAorIERNQTFfQ2hhbm5lbDcpCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fTExfRE1BX0dFVF9DSEFOTkVMX0lOU1RBTkNFKF9fRE1BX0lOU1RBTkNFX18sIF9fQ0hBTk5FTF9fKSAgIFwKKygoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfMSkpKSA/IERNQTFfQ2hhbm5lbDEgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzIpKSkgPyBETUExX0NoYW5uZWwyIDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF8zKSkpID8gRE1BMV9DaGFubmVsMyA6IFwKKyAoKCh1aW50MzJfdCkoX19ETUFfSU5TVEFOQ0VfXykgPT0gKCh1aW50MzJfdClETUExKSkgJiYgKCh1aW50MzJfdCkoX19DSEFOTkVMX18pID09ICgodWludDMyX3QpTExfRE1BX0NIQU5ORUxfNCkpKSA/IERNQTFfQ2hhbm5lbDQgOiBcCisgKCgodWludDMyX3QpKF9fRE1BX0lOU1RBTkNFX18pID09ICgodWludDMyX3QpRE1BMSkpICYmICgodWludDMyX3QpKF9fQ0hBTk5FTF9fKSA9PSAoKHVpbnQzMl90KUxMX0RNQV9DSEFOTkVMXzUpKSkgPyBETUExX0NoYW5uZWw1IDogXAorICgoKHVpbnQzMl90KShfX0RNQV9JTlNUQU5DRV9fKSA9PSAoKHVpbnQzMl90KURNQTEpKSAmJiAoKHVpbnQzMl90KShfX0NIQU5ORUxfXykgPT0gKCh1aW50MzJfdClMTF9ETUFfQ0hBTk5FTF82KSkpID8gRE1BMV9DaGFubmVsNiA6IFwKKyBETUExX0NoYW5uZWw3KQorI2VuZGlmCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfRW5hYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0VuYWJsZUNoYW5uZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsIERNQV9DQ1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRU4gICAgICAgICAgICBMTF9ETUFfRGlzYWJsZUNoYW5uZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlQ2hhbm5lbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLCBETUFfQ0NSX0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgY2hhbm5lbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIEVOICAgICAgICAgICAgTExfRE1BX0lzRW5hYmxlZENoYW5uZWwKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkQ2hhbm5lbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9FTikgPT0gKERNQV9DQ1JfRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGFsbCBwYXJhbWV0ZXJzIGxpbmsgdG8gRE1BIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgQ0lSQyAgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIFBJTkMgICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNSU5DICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlclxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgUFNJWkUgICAgICAgICBMTF9ETUFfQ29uZmlnVHJhbnNmZXJcbgorICAqICAgICAgICAgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBQTCAgICAgICAgICAgIExMX0RNQV9Db25maWdUcmFuc2ZlcgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgQ29uZmlndXJhdGlvbiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgY29tYmluYXRpb24gb2YgYWxsIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvciBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTCBvciBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQgb3IgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fQllURSBvciBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JEIG9yIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NREFUQUFMSUdOX0JZVEUgb3IgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCBvciBAcmVmIExMX0RNQV9NREFUQUFMSUdOX1dPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTE9XIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX01FRElVTSBvciBAcmVmIExMX0RNQV9QUklPUklUWV9ISUdIIG9yIEByZWYgTExfRE1BX1BSSU9SSVRZX1ZFUllISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ29uZmlnVHJhbnNmZXIoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENvbmZpZ3VyYXRpb24pCit7CisgIE1PRElGWV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0gfCBETUFfQ0NSX0NJUkMgfCBETUFfQ0NSX1BJTkMgfCBETUFfQ0NSX01JTkMgfCBETUFfQ0NSX1BTSVpFIHwgRE1BX0NDUl9NU0laRSB8IERNQV9DQ1JfUEwsCisgICAgICAgICAgICAgQ29uZmlndXJhdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIChyZWFkIGZyb20gcGVyaXBoZXJhbCBvciBmcm9tIG1lbW9yeSkuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgRElSICAgICAgICAgICBMTF9ETUFfU2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENDUiAgICAgICAgICBNRU0yTUVNICAgICAgIExMX0RNQV9TZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFUcmFuc2ZlckRpcmVjdGlvbihETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICBNT0RJRllfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLAorICAgICAgICAgICAgIERNQV9DQ1JfRElSIHwgRE1BX0NDUl9NRU0yTUVNLCBEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAocmVhZCBmcm9tIHBlcmlwaGVyYWwgb3IgZnJvbSBtZW1vcnkpLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRE1BX0dldERhdGFUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDQ1IgICAgICAgICAgTUVNMk1FTSAgICAgICBMTF9ETUFfR2V0RGF0YVRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXREYXRhVHJhbnNmZXJEaXJlY3Rpb24oRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9ESVIgfCBETUFfQ0NSX01FTTJNRU0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BIG1vZGUgY2lyY3VsYXIgb3Igbm9ybWFsLgorICAqIEBub3RlIFRoZSBjaXJjdWxhciBidWZmZXIgbW9kZSBjYW5ub3QgYmUgdXNlZCBpZiB0aGUgbWVtb3J5LXRvLW1lbW9yeQorICAqIGRhdGEgdHJhbnNmZXIgaXMgY29uZmlndXJlZCBvbiB0aGUgc2VsZWN0ZWQgQ2hhbm5lbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9TZXRNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01PREVfQ0lSQ1VMQVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLCBETUFfQ0NSX0NJUkMsCisgICAgICAgICAgICAgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IERNQSBtb2RlIGNpcmN1bGFyIG9yIG5vcm1hbC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBDSVJDICAgICAgICAgIExMX0RNQV9HZXRNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX05PUk1BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9NT0RFX0NJUkNVTEFSCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9DSVJDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFBlcmlwaGVyYWwgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgUElOQyAgICAgICAgICBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgUGVyaXBoT3JNMk1TcmNJbmNNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0UGVyaXBoSW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUGVyaXBoT3JNMk1TcmNJbmNNb2RlKQoreworICBNT0RJRllfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLCBETUFfQ0NSX1BJTkMsCisgICAgICAgICAgICAgUGVyaXBoT3JNMk1TcmNJbmNNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQSU5DICAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhJbmNNb2RlCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QRVJJUEhfSU5DUkVNRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BFUklQSF9OT0lOQ1JFTUVOVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9HZXRQZXJpcGhJbmNNb2RlKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKFJFQURfQklUKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfUElOQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNZW1vcnkgaW5jcmVtZW50IG1vZGUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTUlOQyAgICAgICAgICBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TWVtb3J5SW5jTW9kZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKQoreworICBNT0RJRllfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLCBETUFfQ0NSX01JTkMsCisgICAgICAgICAgICAgTWVtb3J5T3JNMk1Ec3RJbmNNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWVtb3J5IGluY3JlbWVudCBtb2RlLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1JTkMgICAgICAgICAgTExfRE1BX0dldE1lbW9yeUluY01vZGUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01FTU9SWV9JTkNSRU1FTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeUluY01vZGUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NSU5DKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQZXJpcGhPck0yTVNyY0RhdGFTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fQllURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0hBTEZXT1JECisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BEQVRBQUxJR05fV09SRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldFBlcmlwaFNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFBlcmlwaE9yTTJNU3JjRGF0YVNpemUpCit7CisgIE1PRElGWV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsIERNQV9DQ1JfUFNJWkUsCisgICAgICAgICAgICAgUGVyaXBoT3JNMk1TcmNEYXRhU2l6ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgc2l6ZS4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBQU0laRSAgICAgICAgIExMX0RNQV9HZXRQZXJpcGhTaXplCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX0JZVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUERBVEFBTElHTl9IQUxGV09SRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QREFUQUFMSUdOX1dPUkQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoU2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwKKyAgICAgICAgICAgICAgICAgICBETUFfQ0NSX1BTSVpFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IE1lbW9yeSBzaXplLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIE1TSVpFICAgICAgICAgTExfRE1BX1NldE1lbW9yeVNpemUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeU9yTTJNRHN0RGF0YVNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9XT1JECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TWVtb3J5U2l6ZShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSkKK3sKKyAgTU9ESUZZX1JFRyhfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BX0NDUl9NU0laRSwKKyAgICAgICAgICAgICBNZW1vcnlPck0yTURzdERhdGFTaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWVtb3J5IHNpemUuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgTVNJWkUgICAgICAgICBMTF9ETUFfR2V0TWVtb3J5U2l6ZQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9CWVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX01EQVRBQUxJR05fSEFMRldPUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfTURBVEFBTElHTl9XT1JECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeVNpemUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9NU0laRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX1NldENoYW5uZWxQcmlvcml0eUxldmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQcmlvcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRDaGFubmVsUHJpb3JpdHlMZXZlbChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUHJpb3JpdHkpCit7CisgIE1PRElGWV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsIERNQV9DQ1JfUEwsCisgICAgICAgICAgICAgUHJpb3JpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIHByaW9yaXR5IGxldmVsLgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFBMICAgICAgICAgICAgTExfRE1BX0dldENoYW5uZWxQcmlvcml0eUxldmVsCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9QUklPUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfTUVESVVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX1BSSU9SSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfUFJJT1JJVFlfVkVSWUhJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0Q2hhbm5lbFByaW9yaXR5TGV2ZWwoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9QTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBOdW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4KKyAgKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYKKyAgKiAgICAgICAgIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENORFRSICAgICAgICBORFQgICAgICAgICAgIExMX0RNQV9TZXREYXRhTGVuZ3RoCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBOYkRhdGEgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHgwMDAwRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldERhdGFMZW5ndGgoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE5iRGF0YSkKK3sKKyAgTU9ESUZZX1JFRyhfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNORFRSLAorICAgICAgICAgICAgIERNQV9DTkRUUl9ORFQsIE5iRGF0YSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLgorICAqIEBub3RlICAgT25jZSB0aGUgY2hhbm5lbCBpcyBlbmFibGVkLCB0aGUgcmV0dXJuIHZhbHVlIGluZGljYXRlIHRoZQorICAqICAgICAgICAgcmVtYWluaW5nIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkLgorICAqIEBybXRvbGwgQ05EVFIgICAgICAgIE5EVCAgICAgICAgICAgTExfRE1BX0dldERhdGFMZW5ndGgKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0RGF0YUxlbmd0aChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNORFRSLAorICAgICAgICAgICAgICAgICAgIERNQV9DTkRUUl9ORFQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gYWRkcmVzc2VzLgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBFYWNoIElQIHVzaW5nIERNQSBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGRpcmVjdGx5IHRoZSByZWdpc3RlciBhZHJlc3MgKExMX1BQUF9ETUFfR2V0UmVnQWRkcikuCisgICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfQ29uZmlnQWRkcmVzc2VzXG4KKyAgKiAgICAgICAgIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9Db25maWdBZGRyZXNzZXMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFNyY0FkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEBwYXJhbSAgRHN0QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9Db25maWdBZGRyZXNzZXMoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFNyY0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERpcmVjdGlvbikKK3sKKyAgLyogRGlyZWN0aW9uIE1lbW9yeSB0byBQZXJpcGggKi8KKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEgpCisgIHsKKyAgICBXUklURV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DTUFSLCBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DUEFSLCBEc3RBZGRyZXNzKTsKKyAgfQorICAvKiBEaXJlY3Rpb24gUGVyaXBoIHRvIE1lbW9yeSBhbmQgTWVtb3J5IHRvIE1lbW9yeSAqLworICBlbHNlCisgIHsKKyAgICBXUklURV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DUEFSLCBTcmNBZGRyZXNzKTsKKyAgICBXUklURV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DTUFSLCBEc3RBZGRyZXNzKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTWVtb3J5IGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIE1lbW9yeUFkZHJlc3MgQmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX1NldE1lbW9yeUFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1lbW9yeUFkZHJlc3MpCit7CisgIFdSSVRFX1JFRyhfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNNQVIsIE1lbW9yeUFkZHJlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUGVyaXBoZXJhbCBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkgb3IgTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIIG9ubHkuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9TZXRQZXJpcGhBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBQZXJpcGhBZGRyZXNzIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhBZGRyZXNzKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQZXJpcGhBZGRyZXNzKQoreworICBXUklURV9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DUEFSLCBQZXJpcGhBZGRyZXNzKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWVtb3J5IGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fUEVSSVBIX1RPX01FTU9SWSBvciBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19QRVJJUEggb25seS4KKyAgKiBAcm10b2xsIENNQVIgICAgICAgICBNQSAgICAgICAgICAgIExMX0RNQV9HZXRNZW1vcnlBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE1lbW9yeUFkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DTUFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBlcmlwaGVyYWwgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEludGVyZmFjZSB1c2VkIGZvciBkaXJlY3Rpb24gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZIG9yIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX1BFUklQSCBvbmx5LgorICAqIEBybXRvbGwgQ1BBUiAgICAgICAgIFBBICAgICAgICAgICAgTExfRE1BX0dldFBlcmlwaEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRyhfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNQQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIE1lbW9yeSB0byBNZW1vcnkgU291cmNlIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUEFSICAgICAgICAgUEEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TTJNU3JjQWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5QWRkcmVzcykKK3sKKyAgV1JJVEVfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q1BBUiwgTWVtb3J5QWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IERlc3RpbmF0aW9uIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDTUFSICAgICAgICAgTUEgICAgICAgICAgICBMTF9ETUFfU2V0TTJNRHN0QWRkcmVzcworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEBwYXJhbSAgTWVtb3J5QWRkcmVzcyBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfU2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgTWVtb3J5QWRkcmVzcykKK3sKKyAgV1JJVEVfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q01BUiwgTWVtb3J5QWRkcmVzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IFNvdXJjZSBhZGRyZXNzLgorICAqIEBub3RlICAgSW50ZXJmYWNlIHVzZWQgZm9yIGRpcmVjdGlvbiBMTF9ETUFfRElSRUNUSU9OX01FTU9SWV9UT19NRU1PUlkgb25seS4KKyAgKiBAcm10b2xsIENQQVIgICAgICAgICBQQSAgICAgICAgICAgIExMX0RNQV9HZXRNMk1TcmNBZGRyZXNzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAweEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0dldE0yTVNyY0FkZHJlc3MoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoUkVBRF9SRUcoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DUEFSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBNZW1vcnkgdG8gTWVtb3J5IERlc3RpbmF0aW9uIGFkZHJlc3MuCisgICogQG5vdGUgICBJbnRlcmZhY2UgdXNlZCBmb3IgZGlyZWN0aW9uIExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSBvbmx5LgorICAqIEBybXRvbGwgQ01BUiAgICAgICAgIE1BICAgICAgICAgICAgTExfRE1BX0dldE0yTURzdEFkZHJlc3MKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRkZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0TTJNRHN0QWRkcmVzcyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRyhfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNNQVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BIHJlcXVlc3QgZm9yIERNQSBDaGFubmVscyBvbiBETUFNVVggQ2hhbm5lbCB4LgorICAqIEBub3RlICAgRE1BTVVYIGNoYW5uZWwgMCB0byA2IGFyZSBtYXBwZWQgdG8gRE1BMSBjaGFubmVsIDEgdG8gNy4KKyAgKiAgICAgICAgIERNQU1VWCBjaGFubmVsIDcgdG8gMTMgYXJlIG1hcHBlZCB0byBETUEyIGNoYW5uZWwgMSB0byA3LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIERNQVJFUV9JRCAgICAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcGFyYW0gIFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfUVVBRFNQSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9JTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9PVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBSZXF1ZXN0KQoreworICBNT0RJRllfUkVHKF9fTExfRE1BX0lOU1RBTkNFX1RPX0RNQU1VWF9DQ1IoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLCBETUFNVVhfQ3hDUl9ETUFSRVFfSUQsIFJlcXVlc3QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBETUEgcmVxdWVzdCBmb3IgRE1BIENoYW5uZWxzIG9uIERNQU1VWCBDaGFubmVsIHguCisgICogQG5vdGUgICBETUFNVVggY2hhbm5lbCAwIHRvIDYgYXJlIG1hcHBlZCB0byBETUExIGNoYW5uZWwgMSB0byA3LgorICAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgNyB0byAxMyBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfUVVBRFNQSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9JTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9PVVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfR2V0UGVyaXBoUmVxdWVzdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19ETUFNVVhfQ0NSKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDEgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjEgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kxKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGMSkgPT0gKERNQV9JU1JfR0lGMSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAyIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUYyICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0kyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjIpID09IChETUFfSVNSX0dJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGMyAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUYzKSA9PSAoRE1BX0lTUl9HSUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDQgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjQgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k0KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNCkgPT0gKERNQV9JU1JfR0lGNCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA1IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBHSUY1ICAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX0dJRjUpID09IChETUFfSVNSX0dJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgR0lGNiAgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0dJNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9HSUY2KSA9PSAoRE1BX0lTUl9HSUY2KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDcgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEdJRjcgICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19HSTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfR0k3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfR0lGNykgPT0gKERNQV9JU1JfR0lGNykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAxIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGMSkgPT0gKERNQV9JU1JfVENJRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMiB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUYyICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMyKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjIpID09IChETUFfSVNSX1RDSUYyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDMgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGMyAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEMzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUYzKSA9PSAoRE1BX0lTUl9UQ0lGMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNCkgPT0gKERNQV9JU1JfVENJRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDSUY1ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM1KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVENJRjUpID09IChETUFfSVNSX1RDSUY1KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDYgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0lGNiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEM2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RDSUY2KSA9PSAoRE1BX0lTUl9UQ0lGNikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA3IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19UQzcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9UQ0lGNykgPT0gKERNQV9JU1JfVENJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMSBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjEgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDEoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMSkgPT0gKERNQV9JU1JfSFRJRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMiBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjIgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMikgPT0gKERNQV9JU1JfSFRJRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMyBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjMgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGMykgPT0gKERNQV9JU1JfSFRJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNCBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjQgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDQoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNCkgPT0gKERNQV9JU1JfSFRJRjQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNSBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjUgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNSkgPT0gKERNQV9JU1JfSFRJRjUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNiBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNikgPT0gKERNQV9JU1JfSFRJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSFRJRjcgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX0hUNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19IVDcoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9IVElGNykgPT0gKERNQV9JU1JfSFRJRjcpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgMSB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUYxICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTEKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUxKERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjEpID09IChETUFfSVNSX1RFSUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDIgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGMiAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEUyCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUYyKSA9PSAoRE1BX0lTUl9URUlGMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjMgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTMoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGMykgPT0gKERNQV9JU1JfVEVJRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNCB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY0ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU0KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjQpID09IChETUFfSVNSX1RFSUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDaGFubmVsIDUgdHJhbnNmZXIgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUlGNSAgICAgICAgIExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU1CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BeC0+SVNSLCBETUFfSVNSX1RFSUY1KSA9PSAoRE1BX0lTUl9URUlGNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEVJRjYgICAgICAgICBMTF9ETUFfSXNBY3RpdmVGbGFnX1RFNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BX0lzQWN0aXZlRmxhZ19URTYoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKERNQXgtPklTUiwgRE1BX0lTUl9URUlGNikgPT0gKERNQV9JU1JfVEVJRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENoYW5uZWwgNyB0cmFuc2ZlciBlcnJvciBmbGFnLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFSUY3ICAgICAgICAgTExfRE1BX0lzQWN0aXZlRmxhZ19URTcKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0FjdGl2ZUZsYWdfVEU3KERNQV9UeXBlRGVmICpETUF4KQoreworICByZXR1cm4gKChSRUFEX0JJVChETUF4LT5JU1IsIERNQV9JU1JfVEVJRjcpID09IChETUFfSVNSX1RFSUY3KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMSBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjEgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUYxKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDIgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUYyICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzIGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGMyAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0kzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNCBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjQgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY0KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDUgZ2xvYmFsIGludGVycnVwdCBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENHSUY1ICAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19HSTUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DR0lGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IGdsb2JhbCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDR0lGNiAgICAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfR0k2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ0dJRjYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNyBnbG9iYWwgaW50ZXJydXB0IGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0dJRjcgICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0dJNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NHSUY3KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDEgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGMiAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzIKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzIoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgMyAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjMgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEMzCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEMzKERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUYzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDQgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1ICB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnLgorICAqIEBybXRvbGwgSUZDUiAgICAgICAgIENUQ0lGNSAgICAgICAgTExfRE1BX0NsZWFyRmxhZ19UQzUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BX0NsZWFyRmxhZ19UQzUoRE1BX1R5cGVEZWYgKkRNQXgpCit7CisgIFdSSVRFX1JFRyhETUF4LT5JRkNSLCBETUFfSUZDUl9DVENJRjUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYW5uZWwgNiAgdHJhbnNmZXIgY29tcGxldGUgZmxhZy4KKyAgKiBAcm10b2xsIElGQ1IgICAgICAgICBDVENJRjYgICAgICAgIExMX0RNQV9DbGVhckZsYWdfVEM2CisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9DbGVhckZsYWdfVEM2KERNQV9UeXBlRGVmICpETUF4KQoreworICBXUklURV9SRUcoRE1BeC0+SUZDUiwgRE1BX0lGQ1JfQ1RDSUY2KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDaGFubmVsIDcgIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RDSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RDNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RDNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NUQ0lGNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3ICBoYWxmIHRyYW5zZmVyIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ0hUSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0hUNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX0hUNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NIVElGNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAxIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYxICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAyIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYyICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCAzIHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUYzICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFMworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFMyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA0IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY0ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNAorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNChETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA1IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY1ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNShETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA2IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY2ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNihETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhbm5lbCA3IHRyYW5zZmVyIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBJRkNSICAgICAgICAgQ1RFSUY3ICAgICAgICBMTF9ETUFfQ2xlYXJGbGFnX1RFNworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfQ2xlYXJGbGFnX1RFNyhETUFfVHlwZURlZiAqRE1BeCkKK3sKKyAgV1JJVEVfUkVHKERNQXgtPklGQ1IsIERNQV9JRkNSX0NURUlGNyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVENJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BX0NDUl9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSGFsZiB0cmFuc2ZlciBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfRW5hYmxlSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9FbmFibGVJVF9IVChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BX0NDUl9IVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNmZXIgZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ0NSICAgICAgICAgIFRFSUUgICAgICAgICAgTExfRE1BX0VuYWJsZUlUX1RFCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRW5hYmxlSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsIERNQV9DQ1JfVEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgVENJRSAgICAgICAgICBMTF9ETUFfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFfRGlzYWJsZUlUX1RDKERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBDTEVBUl9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsIERNQV9DQ1JfVENJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIYWxmIHRyYW5zZmVyIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBIVElFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BX0NDUl9IVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zZmVyIGVycm9yIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9EaXNhYmxlSVRfVEUKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQV9EaXNhYmxlSVRfVEUoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVChfX0xMX0RNQV9JTlNUQU5DRV9UT19DSEFOTkVMKERNQXgsIENoYW5uZWwgLSAxVSktPkNDUiwgRE1BX0NDUl9URUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9UQworICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9UQyhETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9UQ0lFKSA9PSAoRE1BX0NDUl9UQ0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhhbGYgdHJhbnNmZXIgSW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDQ1IgICAgICAgICAgSFRJRSAgICAgICAgICBMTF9ETUFfSXNFbmFibGVkSVRfSFQKKyAgKiBAcGFyYW0gIERNQXggRE1BeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFfSXNFbmFibGVkSVRfSFQoRE1BX1R5cGVEZWYgKkRNQXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoKFJFQURfQklUKF9fTExfRE1BX0lOU1RBTkNFX1RPX0NIQU5ORUwoRE1BeCwgQ2hhbm5lbCAtIDFVKS0+Q0NSLAorICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfSFRJRSkgPT0gKERNQV9DQ1JfSFRJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBlcnJvciBJbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENDUiAgICAgICAgICBURUlFICAgICAgICAgIExMX0RNQV9Jc0VuYWJsZWRJVF9URQorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQV9Jc0VuYWJsZWRJVF9URShETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoX19MTF9ETUFfSU5TVEFOQ0VfVE9fQ0hBTk5FTChETUF4LCBDaGFubmVsIC0gMVUpLT5DQ1IsCisgICAgICAgICAgICAgICAgICAgRE1BX0NDUl9URUlFKSA9PSAoRE1BX0NDUl9URUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIERNQV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9ETUFfSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9ETUFfRGVJbml0KERNQV9UeXBlRGVmICpETUF4LCB1aW50MzJfdCBDaGFubmVsKTsKK3ZvaWQgTExfRE1BX1N0cnVjdEluaXQoTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUExIHx8IERNQTIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9ETUFfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9kbWFtdXguaCBiL0luYy9zdG0zMndieHhfbGxfZG1hbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYTUxMwotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfZG1hbXV4LmgKQEAgLTAsMCArMSwxNjQ5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2RtYW11eC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBETUFNVVggTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0RNQU1VWF9ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9ETUFNVVhfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKERNQU1VWDEpCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMIERNQU1VWAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX1ByaXZhdGVfQ29uc3RhbnRzIERNQU1VWCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBEZWZpbmUgdXNlZCB0byBnZXQgRE1BTVVYIENDUiByZWdpc3RlciBzaXplICovCisjZGVmaW5lIERNQU1VWF9DQ1JfU0laRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKworLyogRGVmaW5lIHVzZWQgdG8gZ2V0IERNQU1VWCBSR0NSIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgRE1BTVVYX1JHQ1JfU0laRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIERNQU1VWCBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFNVVhfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YwICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAwICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YyICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMiAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAyICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YzICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMyAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAzICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y0ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GNCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y1ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GNSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA1ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y2ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GNiAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA2ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y3ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GNyAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y4ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GOCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA4ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0Y5ICAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GOSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA5ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMCAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMTAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMCAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMSAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMTEgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMSAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMiAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMTIgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMiAqLworI2RlZmluZSBMTF9ETUFNVVhfQ0ZSX0NTT0YxMyAgICAgICAgICAgICAgRE1BTVVYX0NGUl9DU09GMTMgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YwICAgICAgICAgICAgRE1BTVVYX1JHQ0ZSX0NPRjAgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHQ0ZSX1JHQ09GMSAgICAgICAgICAgIERNQU1VWF9SR0NGUl9DT0YxICAgICAgLyohPCBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnICovCisjZGVmaW5lIExMX0RNQU1VWF9SR0NGUl9SR0NPRjIgICAgICAgICAgICBETUFNVVhfUkdDRlJfQ09GMiAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdDRlJfUkdDT0YzICAgICAgICAgICAgRE1BTVVYX1JHQ0ZSX0NPRjMgICAgICAvKiE8IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9ETUFNVVhfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMCAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GMSAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjIgICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0YyICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMyAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjMgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y0ICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GNCAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjUgICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0Y1ICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDUgICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GNiAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjYgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0Y3ICAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GNyAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjggICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0Y4ICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDggICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GOSAgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjkgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxMCAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GMTAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMCAqLworI2RlZmluZSBMTF9ETUFNVVhfQ1NSX1NPRjExICAgICAgICAgICAgICAgRE1BTVVYX0NTUl9TT0YxMSAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDExICovCisjZGVmaW5lIExMX0RNQU1VWF9DU1JfU09GMTIgICAgICAgICAgICAgICBETUFNVVhfQ1NSX1NPRjEyICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTIgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NTUl9TT0YxMyAgICAgICAgICAgICAgIERNQU1VWF9DU1JfU09GMTMgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdTUl9SR09GMCAgICAgICAgICAgICAgRE1BTVVYX1JHU1JfT0YwICAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMCBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdTUl9SR09GMSAgICAgICAgICAgICAgRE1BTVVYX1JHU1JfT0YxICAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMSBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdTUl9SR09GMiAgICAgICAgICAgICAgRE1BTVVYX1JHU1JfT0YyICAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkdTUl9SR09GMyAgICAgICAgICAgICAgRE1BTVVYX1JHU1JfT0YzICAgICAgIC8qITwgUmVxdWVzdCBHZW5lcmF0b3IgMyBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRE1BX1JlYWRSZWcgYW5kICBMTF9ETUFNVVhfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX0NDUl9TT0lFICAgICAgICAgICAgICAgIERNQU1VWF9DeENSX1NPSUUgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JHQ1JfUkdPSUUgICAgICAgICAgICAgIERNQU1VWF9SR3hDUl9PSUUgICAgICAgICAgLyohPCBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBPdmVycnVuIEludGVycnVwdCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfUkVRVUVTVCBUcmFuc2ZlciByZXF1ZXN0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9NRU0yTUVNICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IG1lbW9yeSB0byBtZW1vcnkgdHJhbnNmZXIgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMCAgICAgICAgICAweDAwMDAwMDAxVSAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDEgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IyICAgICAgICAgIDB4MDAwMDAwMDNVICAvKiE8IERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciAyICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VORVJBVE9SMyAgICAgICAgICAweDAwMDAwMDA0VSAgLyohPCBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgMyAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0FEQzEgICAgICAgICAgICAgICAgMHgwMDAwMDAwNVUgIC8qITwgRE1BTVVYIEFEQzEgcmVxdWVzdCAgICAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkxX1JYICAgICAgICAgICAgIDB4MDAwMDAwMDZVICAvKiE8IERNQU1VWCBTUEkxIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfU1BJMV9UWCAgICAgICAgICAgICAweDAwMDAwMDA3VSAgLyohPCBETUFNVVggU1BJMSBUWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1NQSTJfUlggICAgICAgICAgICAgMHgwMDAwMDAwOFUgIC8qITwgRE1BTVVYIFNQSTIgUlggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TUEkyX1RYICAgICAgICAgICAgIDB4MDAwMDAwMDlVICAvKiE8IERNQU1VWCBTUEkyIFRYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDMV9SWCAgICAgICAgICAgICAweDAwMDAwMDBBVSAgLyohPCBETUFNVVggSTJDMSBSWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0kyQzFfVFggICAgICAgICAgICAgMHgwMDAwMDAwQlUgIC8qITwgRE1BTVVYIEkyQzEgVFggcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9JMkMzX1JYICAgICAgICAgICAgIDB4MDAwMDAwMENVICAvKiE8IERNQU1VWCBJMkMzIFJYIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfSTJDM19UWCAgICAgICAgICAgICAweDAwMDAwMDBEVSAgLyohPCBETUFNVVggSTJDMyBUWCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWCAgICAgICAgICAgMHgwMDAwMDAwRVUgIC8qITwgRE1BTVVYIFVTQVJUMSBSWCByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9VU0FSVDFfVFggICAgICAgICAgIDB4MDAwMDAwMEZVICAvKiE8IERNQU1VWCBVU0FSVDEgVFggcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9SWCAgICAgICAgICAweDAwMDAwMDEwVSAgLyohPCBETUFNVVggTFBVQVJUMSBSWCByZXF1ZXN0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0xQVUFSVDFfVFggICAgICAgICAgMHgwMDAwMDAxMVUgIC8qITwgRE1BTVVYIExQVUFSVDEgVFggcmVxdWVzdCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9TQUkxX0EgICAgICAgICAgICAgIDB4MDAwMDAwMTJVICAvKiE8IERNQU1VWCBTQUkxIEEgcmVxdWVzdCAgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfU0FJMV9CICAgICAgICAgICAgICAweDAwMDAwMDEzVSAgLyohPCBETUFNVVggU0FJMSBCIHJlcXVlc3QgICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1FVQURTUEkgICAgICAgICAgICAgMHgwMDAwMDAxNFUgIC8qITwgRE1BTVVYIFFVQURTUEkgcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NIMSAgICAgICAgICAgIDB4MDAwMDAwMTVVICAvKiE8IERNQU1VWCBUSU0xIENIMSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9DSDIgICAgICAgICAgICAweDAwMDAwMDE2VSAgLyohPCBETUFNVVggVElNMSBDSDIgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gzICAgICAgICAgICAgMHgwMDAwMDAxN1UgIC8qITwgRE1BTVVYIFRJTTEgQ0gzIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NINCAgICAgICAgICAgIDB4MDAwMDAwMThVICAvKiE8IERNQU1VWCBUSU0xIENINCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMV9VUCAgICAgICAgICAgICAweDAwMDAwMDE5VSAgLyohPCBETUFNVVggVElNMSBVUCByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRyAgICAgICAgICAgMHgwMDAwMDAxQVUgIC8qITwgRE1BTVVYIFRJTTEgVFJJRyByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xX0NPTSAgICAgICAgICAgIDB4MDAwMDAwMUJVICAvKiE8IERNQU1VWCBUSU0xIENPTSByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDEgICAgICAgICAgICAweDAwMDAwMDFDVSAgLyohPCBETUFNVVggVElNMiBDSDEgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gyICAgICAgICAgICAgMHgwMDAwMDAxRFUgIC8qITwgRE1BTVVYIFRJTTIgQ0gyIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0yX0NIMyAgICAgICAgICAgIDB4MDAwMDAwMUVVICAvKiE8IERNQU1VWCBUSU0yIENIMyByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMl9DSDQgICAgICAgICAgICAweDAwMDAwMDFGVSAgLyohPCBETUFNVVggVElNMiBDSDQgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTJfVVAgICAgICAgICAgICAgMHgwMDAwMDAyMFUgIC8qITwgRE1BTVVYIFRJTTIgVVAgcmVxdWVzdCAgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEgICAgICAgICAgIDB4MDAwMDAwMjFVICAvKiE8IERNQU1VWCBUSU0xNiBDSDEgcmVxdWVzdCAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfVElNMTZfVVAgICAgICAgICAgICAweDAwMDAwMDIyVSAgLyohPCBETUFNVVggVElNMTYgVVAgcmVxdWVzdCAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX1RJTTE3X0NIMSAgICAgICAgICAgMHgwMDAwMDAyM1UgIC8qITwgRE1BTVVYIFRJTTE3IENIMSByZXF1ZXN0ICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9USU0xN19VUCAgICAgICAgICAgIDB4MDAwMDAwMjRVICAvKiE8IERNQU1VWCBUSU0xNyBVUCByZXF1ZXN0ICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQUVTMV9JTiAgICAgICAgICAgICAweDAwMDAwMDI1VSAgLyohPCBETUFNVVggQUVTMV9JTiByZXF1ZXN0ICAgICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0FFUzFfT1VUICAgICAgICAgICAgMHgwMDAwMDAyNlUgIC8qITwgRE1BTVVYIEFFUzFfT1VUIHJlcXVlc3QgICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9BRVMyX0lOICAgICAgICAgICAgIDB4MDAwMDAwMjdVICAvKiE8IERNQU1VWCBBRVMyX0lOIHJlcXVlc3QgICAgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfQUVTMl9PVVQgICAgICAgICAgICAweDAwMDAwMDI4VSAgLyohPCBETUFNVVggQUVTMl9PVVQgcmVxdWVzdCAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfQ0hBTk5FTCBETUFNVVggQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMCBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDEgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMSBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzIgICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMiBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDMgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzMgICAgICAgICAgICAgICAweDAwMDAwMDAzVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMyBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDQgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzQgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgNCBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDUgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzUgICAgICAgICAgICAgICAweDAwMDAwMDA1VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgNSBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDYgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzYgICAgICAgICAgICAgICAweDAwMDAwMDA2VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgNiBjb25uZWN0ZWQgdG8gRE1BMSBDaGFubmVsIDcgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzcgICAgICAgICAgICAgICAweDAwMDAwMDA3VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgNyBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDEgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzggICAgICAgICAgICAgICAweDAwMDAwMDA4VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgOCBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDIgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzkgICAgICAgICAgICAgICAweDAwMDAwMDA5VSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgOSBjb25uZWN0ZWQgdG8gRE1BMiBDaGFubmVsIDMgICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEwICAgICAgICAgICAgICAweDAwMDAwMDBBVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMTAgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA0ICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzExICAgICAgICAgICAgICAweDAwMDAwMDBCVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMTEgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA1ICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEyICAgICAgICAgICAgICAweDAwMDAwMDBDVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMTIgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA2ICovCisjZGVmaW5lIExMX0RNQU1VWF9DSEFOTkVMXzEzICAgICAgICAgICAgICAweDAwMDAwMDBEVSAgICAgICAgICAgICAgIC8qITwgRE1BTVVYIENoYW5uZWwgMTMgY29ubmVjdGVkIHRvIERNQTIgQ2hhbm5lbCA3ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19TWU5DX05PIFN5bmNocm9uaXphdGlvbiBTaWduYWwgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVCAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQWxsIHJlcXVlc3RzIGFyZSBibG9ja2VkICAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lORyAgICAgICAgICBETUFNVVhfQ3hDUl9TUE9MXzAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBvbiBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORyAgICAgICAgIERNQU1VWF9DeENSX1NQT0xfMSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIG9uIGV2ZW50IG9uIGZhbGxpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19QT0xfUklTSU5HX0ZBTExJTkcgIChETUFNVVhfQ3hDUl9TUE9MXzAgfCBETUFNVVhfQ3hDUl9TUE9MXzEpIC8qITwgU3luY2hyb25pemF0aW9uIG9uIGV2ZW50IG9uIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FQ19TWU5DX0VWVCBTeW5jaHJvbml6YXRpb24gU2lnbmFsIEV2ZW50CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTAgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUyICAgICAgICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMiAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMyAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTMgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTQgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU0ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU1ICAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lNSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNiAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzIgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTYgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTcgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmU3ICAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU4ICAgICAgICAgRE1BTVVYX0N4Q1JfU1lOQ19JRF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lOCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOSAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTkgICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEwICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMCAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMSAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMSB8IERNQU1VWF9DeENSX1NZTkNfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTEgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTIgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTEyICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEzICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF8zIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8yIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBFWFRJIExpbmUxMyAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNCAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfMyB8IERNQU1VWF9DeENSX1NZTkNfSURfMiB8IERNQU1VWF9DeENSX1NZTkNfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gRVhUSSBMaW5lMTQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTUgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzMgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzIgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzEgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIEVYVEkgTGluZTE1ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDAgICAgICAgICBETUFNVVhfQ3hDUl9TWU5DX0lEXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBETUFNVVggY2hhbm5lbDAgRXZlbnQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMSAgICAgICAgIChETUFNVVhfQ3hDUl9TWU5DX0lEXzQgfCBETUFNVVhfQ3hDUl9TWU5DX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3luY2hyb25pemF0aW9uIHNpZ25hbCBmcm9tIERNQU1VWCBjaGFubmVsMSBFdmVudCAqLworI2RlZmluZSBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUICAgICAgICAgKERNQU1VWF9DeENSX1NZTkNfSURfNCB8IERNQU1VWF9DeENSX1NZTkNfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTeW5jaHJvbml6YXRpb24gc2lnbmFsIGZyb20gTFBUSU0xIE91cHV0ICovCisjZGVmaW5lIExMX0RNQU1VWF9TWU5DX0xQVElNMl9PVVQgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRF80IHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8xIHwgRE1BTVVYX0N4Q1JfU1lOQ19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFN5bmNocm9uaXphdGlvbiBzaWduYWwgZnJvbSBMUFRJTTIgT3VwdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VORVJBVE9SIFJlcXVlc3QgR2VuZXJhdG9yIENoYW5uZWwKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8wICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fMSAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOXzIgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl8zICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BTVVYX0xMX0VDX1JFUVVFU1RfR0VOX1BPTEFSSVRZIEV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIEdlbmVyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9OT19FVkVOVCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5vIGV4dGVybmFsIERNQSByZXF1ZXN0ICBnZW5lcmF0aW9uICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkcgICAgICAgICAgIERNQU1VWF9SR3hDUl9HUE9MXzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiBldmVudCBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9QT0xfRkFMTElORyAgICAgICAgICBETUFNVVhfUkd4Q1JfR1BPTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEV4dGVybmFsIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gb24gZXZlbnQgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9SSVNJTkdfRkFMTElORyAgIChETUFNVVhfUkd4Q1JfR1BPTF8wIHwgRE1BTVVYX1JHeENSX0dQT0xfMSkgIC8qITwgRXh0ZXJuYWwgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBvbiByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUNfUkVRVUVTVF9HRU4gRXh0ZXJuYWwgUmVxdWVzdCBTaWduYWwgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUwICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMSAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMiAgICAgIERNQU1VWF9SR3hDUl9TSUdfSURfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTIgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTMgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8xIHxETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUzICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU0ICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNCAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNSAgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTUgICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTYgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8yIHwgRE1BTVVYX1JHeENSX1NJR19JRF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU2ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU3ICAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lNyAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOCAgICAgIERNQU1VWF9SR3hDUl9TSUdfSURfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTggICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTkgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmU5ICAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMCAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTAgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzApICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTExICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEyICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUxMiAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMyAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfMyB8IERNQU1VWF9SR3hDUl9TSUdfSURfMiB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRVhUSSBMaW5lMTMgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzMgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzIgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIEVYVEkgTGluZTE0ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTE1ICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF8zIHwgRE1BTVVYX1JHeENSX1NJR19JRF8yIHwgRE1BTVVYX1JHeENSX1NJR19JRF8xIHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBFWFRJIExpbmUxNSAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gwICAgICAgRE1BTVVYX1JHeENSX1NJR19JRF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gRE1BTVVYIGNoYW5uZWwwIEV2ZW50ICovCisjZGVmaW5lIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDEgICAgICAoRE1BTVVYX1JHeENSX1NJR19JRF80IHwgRE1BTVVYX1JHeENSX1NJR19JRF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlcXVlc3Qgc2lnbmFsIGdlbmVyYXRpb24gZnJvbSBETUFNVVggY2hhbm5lbDEgRXZlbnQgKi8KKyNkZWZpbmUgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVCAgICAgIChETUFNVVhfUkd4Q1JfU0lHX0lEXzQgfCBETUFNVVhfUkd4Q1JfU0lHX0lEXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUmVxdWVzdCBzaWduYWwgZ2VuZXJhdGlvbiBmcm9tIExQVElNMSBPdXB1dCAqLworI2RlZmluZSBMTF9ETUFNVVhfUkVRX0dFTl9MUFRJTTJfT1VUICAgICAgKERNQU1VWF9SR3hDUl9TSUdfSURfNCB8IERNQU1VWF9SR3hDUl9TSUdfSURfMSB8IERNQU1VWF9SR3hDUl9TSUdfSURfMCkgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSZXF1ZXN0IHNpZ25hbCBnZW5lcmF0aW9uIGZyb20gTFBUSU0yIE91cHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRXhwb3J0ZWRfTWFjcm9zIERNQU1VWCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBETUFNVVggcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBETUFNVVggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0RNQU1VWF9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIERNQU1VWCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIERNQU1VWCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9ETUFNVVhfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRE1BTVVYIEV4cG9ydGVkIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgRE1BTVVYIHJlcXVlc3QgSUQgZm9yIERNQU1VWCBDaGFubmVsIHguCisgICogQG5vdGUgICBETUFNVVggY2hhbm5lbCAwIHRvIDYgYXJlIG1hcHBlZCB0byBETUExIGNoYW5uZWwgMSB0byA3LgorICAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgNyB0byAxMyBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFNVVhfU2V0UmVxdWVzdElECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAgKiBAcGFyYW0gIFJlcXVlc3QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX01FTTJNRU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTkVSQVRPUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FEQzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NQSTJfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzFfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0kyQzNfVFgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVVNBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9MUFVBUlQxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1NBSTFfQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfUVVBRFNQSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfVFJJRworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DT00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE2X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTE3X1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BRVMxX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9JTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMl9PVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRSZXF1ZXN0SUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiogRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRE1BUkVRX0lELCBSZXF1ZXN0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRE1BTVVYIHJlcXVlc3QgSUQgZm9yIERNQU1VWCBDaGFubmVsIHguCisgICogQG5vdGUgICBETUFNVVggY2hhbm5lbCAwIHRvIDYgYXJlIG1hcHBlZCB0byBETUExIGNoYW5uZWwgMSB0byA3LgorICAqICAgICAgICAgRE1BTVVYIGNoYW5uZWwgNyB0byAxMyBhcmUgbWFwcGVkIHRvIERNQTIgY2hhbm5lbCAxIHRvIDcuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgRE1BUkVRX0lEICAgICBMTF9ETUFNVVhfR2V0UmVxdWVzdElECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9NRU0yTUVNCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5FUkFUT1IzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9BREMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TUEkyX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMxX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9JMkMzX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9VU0FSVDFfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1VTQVJUMV9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfTFBVQVJUMV9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfU0FJMV9BCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9TQUkxX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1FVQURTUEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMV9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xX1RSSUcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTFfQ09NCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX1RJTTJfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0yX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTZfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xNl9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfVElNMTdfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9USU0xN19VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMV9JTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfQUVTMV9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFUzJfSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0FFUzJfT1VUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFJlcXVlc3RJRChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfRE1BUkVRX0lEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIHN5bmNocm9uaXphdGlvbiBldmVudCBhbmQvb3IgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXZlbnQuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgTkJSRVEgICAgICAgICBMTF9ETUFNVVhfU2V0U3luY1JlcXVlc3ROYgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgICogQHBhcmFtICBSZXF1ZXN0TmIgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFN5bmNSZXF1ZXN0TmIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUmVxdWVzdE5iKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIE1PRElGWV9SRUcoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9OQlJFUSwgKChSZXF1ZXN0TmIgLSAxVSkgPDwgRE1BTVVYX0N4Q1JfTkJSRVFfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIHN5bmNocm9uaXphdGlvbiBldmVudCBhbmQvb3IgdGhlIG51bWJlciBvZiBETUEgcmVxdWVzdCBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXZlbnQuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgTkJSRVEgICAgICAgICBMTF9ETUFNVVhfR2V0U3luY1JlcXVlc3ROYgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRTeW5jUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX05CUkVRKSkgPj4gRE1BTVVYX0N4Q1JfTkJSRVFfUG9zKSArIDFVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIHN5bmNocm9uaXplZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTUE9MICAgICAgICAgIExMX0RNQU1VWF9TZXRTeW5jUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19OT19FVkVOVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19QT0xfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX1NldFN5bmNQb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU1BPTCwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcG9sYXJpdHkgb2YgdGhlIHNpZ25hbCBvbiB3aGljaCB0aGUgRE1BIHJlcXVlc3QgaXMgc3luY2hyb25pemVkLgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNQT0wgICAgICAgICAgTExfRE1BTVVYX0dldFN5bmNQb2xhcml0eQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX05PX0VWRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX1BPTF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfUE9MX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFN5bmNQb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU1BPTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIEVHRSAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZUV2ZW50R2VuZXJhdGlvbgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlRXZlbnRHZW5lcmF0aW9uKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRXZlbnQgR2VuZXJhdGlvbiBvbiBETUFNVVggY2hhbm5lbCB4LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIEVHRSAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVFdmVudEdlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVFdmVudEdlbmVyYXRpb24oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9FR0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFdmVudCBHZW5lcmF0aW9uIG9uIERNQU1VWCBjaGFubmVsIHggaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBFR0UgICAgICAgICAgIExMX0RNQU1VWF9Jc0VuYWJsZWRFdmVudEdlbmVyYXRpb24KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0VuYWJsZWRFdmVudEdlbmVyYXRpb24oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX0VHRSkgPT0gKERNQU1VWF9DeENSX0VHRSkpPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU0UgICAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlU3luYworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlU3luYyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUuCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU0UgICAgICAgICAgICBMTF9ETUFNVVhfRGlzYWJsZVN5bmMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVTeW5jKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgQ0xFQVJfQklUKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBzeW5jaHJvbml6YXRpb24gbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNFICAgICAgICAgICAgTExfRE1BTVVYX0lzRW5hYmxlZFN5bmMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0VuYWJsZWRTeW5jKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TRSkgPT0gKERNQU1VWF9DeENSX1NFKSk/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IERNQU1VWCBzeW5jaHJvbml6YXRpb24gSUQgIG9uIERNQU1VWCBDaGFubmVsIHguCisgICogQHJtdG9sbCBDeENSICAgICAgICAgU1lOQ19JRCAgICAgICBMTF9ETUFNVVhfU2V0U3luY0lECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAgKiBAcGFyYW0gIFN5bmNJRCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19ETUFNVVhfQ0gwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0xQVElNMV9PVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19MUFRJTTJfT1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0U3luY0lEKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IFN5bmNJRCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKChETUFNVVgxX0NoYW5uZWwwICsgQ2hhbm5lbCktPkNDUiwgRE1BTVVYX0N4Q1JfU1lOQ19JRCwgU3luY0lEKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBJRCAgb24gRE1BTVVYIENoYW5uZWwgeC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTWU5DX0lEICAgICAgIExMX0RNQU1VWF9HZXRTeW5jSUQKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkU5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRVhUSV9MSU5FMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19FWFRJX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0VYVElfTElORTE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfRE1BTVVYX0NIMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9TWU5DX0RNQU1VWF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfU1lOQ19MUFRJTTFfT1VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1NZTkNfTFBUSU0yX09VVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9HZXRTeW5jSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NZTkNfSUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJlcXVlc3QgR2VuZXJhdG9yLgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdFICAgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZVJlcXVlc3RHZW4KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRW5hYmxlUmVxdWVzdEdlbihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRvci4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHRSAgICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlUmVxdWVzdEdlbgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9EaXNhYmxlUmVxdWVzdEdlbihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpLT5SR0NSLCBETUFNVVhfUkd4Q1JfR0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBSZXF1ZXN0IEdlbmVyYXRvciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIEdFICAgICAgICAgICAgTExfRE1BTVVYX0lzRW5hYmxlZFJlcXVlc3RHZW4KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzRW5hYmxlZFJlcXVlc3RHZW4oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKChETUFNVVhfUmVxdWVzdEdlbl9UeXBlRGVmICopKCh1aW50MzJfdCkoKHVpbnQzMl90KURNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyAoRE1BTVVYX1JHQ1JfU0laRSAqIChSZXF1ZXN0R2VuQ2hhbm5lbCkpKSkpLT5SR0NSLCBETUFNVVhfUkd4Q1JfR0UpID09IChETUFNVVhfUkd4Q1JfR0UpKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIGdlbmVyYXRlZC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHUE9MICAgICAgICAgIExMX0RNQU1VWF9TZXRSZXF1ZXN0R2VuUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfU2V0UmVxdWVzdEdlblBvbGFyaXR5KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dQT0wsIFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHBvbGFyaXR5IG9mIHRoZSBzaWduYWwgb24gd2hpY2ggdGhlIERNQSByZXF1ZXN0IGlzIGdlbmVyYXRlZC4KKyAgKiBAcm10b2xsIFJHeENSICAgICAgICBHUE9MICAgICAgICAgIExMX0RNQU1VWF9HZXRSZXF1ZXN0R2VuUG9sYXJpdHkKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX05PX0VWRU5UCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX1BPTF9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fUE9MX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0dldFJlcXVlc3RHZW5Qb2xhcml0eShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSktPlJHQ1IsIERNQU1VWF9SR3hDUl9HUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIGdlbmVyYXRpb24gZXZlbnQuCisgICogQG5vdGUgICBUaGlzIGZpZWxkIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiBHZW5lcmF0b3IgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgR05CUkVRICAgICAgICBMTF9ETUFNVVhfU2V0R2VuUmVxdWVzdE5iCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEBwYXJhbSAgUmVxdWVzdE5iIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAzMi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRHZW5SZXF1ZXN0TmIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwsIHVpbnQzMl90IFJlcXVlc3ROYikKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX0dOQlJFUSwgKFJlcXVlc3ROYiAtIDFVKSA8PCBETUFNVVhfUkd4Q1JfR05CUkVRX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgRE1BIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGF1dG9yaXplZCBhZnRlciBhIGdlbmVyYXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgR05CUkVRICAgICAgICBMTF9ETUFNVVhfR2V0R2VuUmVxdWVzdE5iCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEByZXR2YWwgQmV0d2VlbiBNaW5fRGF0YSA9IDEgYW5kIE1heF9EYXRhID0gMzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0R2VuUmVxdWVzdE5iKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVCgoKERNQU1VWF9SZXF1ZXN0R2VuX1R5cGVEZWYgKikoKHVpbnQzMl90KSgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCArIChETUFNVVhfUkdDUl9TSVpFICogKFJlcXVlc3RHZW5DaGFubmVsKSkpKSktPlJHQ1IsIERNQU1VWF9SR3hDUl9HTkJSRVEpID4+IERNQU1VWF9SR3hDUl9HTkJSRVFfUG9zKSArIDFVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRE1BTVVYIGV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIElEIG9uIERNQU1VWCBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBDaGFubmVsIHguCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgU0lHX0lEICAgICAgICBMTF9ETUFNVVhfU2V0UmVxdWVzdFNpZ25hbElECisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEBwYXJhbSAgUmVxdWVzdFNpZ25hbElEIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMl9PVVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9TZXRSZXF1ZXN0U2lnbmFsSUQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwsIHVpbnQzMl90IFJlcXVlc3RTaWduYWxJRCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBNT0RJRllfUkVHKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX1NJR19JRCwgUmVxdWVzdFNpZ25hbElEKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRE1BTVVYIGV4dGVybmFsIFJlcXVlc3QgU2lnbmFsIElEIHNldCBvbiBETUFNVVggQ2hhbm5lbCB4LgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIFNJR19JRCAgICAgICAgTExfRE1BTVVYX0dldFJlcXVlc3RTaWduYWxJRAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHBhcmFtICBSZXF1ZXN0R2VuQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzMKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkU4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0VYVElfTElORTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fRVhUSV9MSU5FMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9FWFRJX0xJTkUxNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0RNQU1VWF9DSDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl9ETUFNVVhfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fTFBUSU0xX09VVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOX0xQVElNMl9PVVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfR2V0UmVxdWVzdFNpZ25hbElEKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgsIHVpbnQzMl90IFJlcXVlc3RHZW5DaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKCgoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCh1aW50MzJfdClETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgKERNQU1VWF9SR0NSX1NJWkUgKiAoUmVxdWVzdEdlbkNoYW5uZWwpKSkpKS0+UkdDUiwgRE1BTVVYX1JHeENSX1NJR19JRCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIERNQU1VWF9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDAuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMCAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMChETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjApID09IChETUFNVVhfQ1NSX1NPRjApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxLgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjEgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzEoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxKSA9PSAoRE1BTVVYX0NTUl9TT0YxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMi4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YyICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08yCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GMikgPT0gKERNQU1VWF9DU1JfU09GMikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDMuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GMyAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjMpID09IChETUFNVVhfQ1NSX1NPRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA0LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjQgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzQKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzQoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y0KSA9PSAoRE1BTVVYX0NTUl9TT0Y0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgNS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y1ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU081CisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GNSkgPT0gKERNQU1VWF9DU1JfU09GNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GNiAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPNihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjYpID09IChETUFNVVhfQ1NSX1NPRjYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCA3LgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFNPRjcgICAgICAgICAgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzcKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19TTzcoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0Y3KSA9PSAoRE1BTVVYX0NTUl9TT0Y3KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgOC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0Y4ICAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU084CisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU084KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DU1IsIERNQU1VWF9DU1JfU09GOCkgPT0gKERNQU1VWF9DU1JfU09GOCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDkuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgU09GOSAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPOQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPOShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIHJldHVybiAoKFJFQURfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q1NSLCBETUFNVVhfQ1NSX1NPRjkpID09IChETUFNVVhfQ1NSX1NPRjkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMCAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMCkgPT0gKERNQU1VWF9DU1JfU09GMTApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMS4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMSAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTEoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMSkgPT0gKERNQU1VWF9DU1JfU09GMTEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMi4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMiAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMikgPT0gKERNQU1VWF9DU1JfU09GMTIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMy4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTT0YxMyAgICAgICAgIExMX0RNQU1VWF9Jc0FjdGl2ZUZsYWdfU08xMworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1NPMTMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKChSRUFEX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNTUiwgRE1BTVVYX0NTUl9TT0YxMykgPT0gKERNQU1VWF9DU1JfU09GMTMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YwICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzAKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjApID09IChETUFNVVhfUkdTUl9PRjApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDEgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YxICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzEKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjEpID09IChETUFNVVhfUkdTUl9PRjEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDIgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YyICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzIKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjIpID09IChETUFNVVhfUkdTUl9PRjIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR1NSICAgICAgICAgT0YzICAgICAgICAgICBMTF9ETUFNVVhfSXNBY3RpdmVGbGFnX1JHTzMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRE1BTVVYX0lzQWN0aXZlRmxhZ19SR08zKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR1NSLCBETUFNVVhfUkdTUl9PRjMpID09IChETUFNVVhfUkdTUl9PRjMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDAuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08wKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjEgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDIuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjIgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08yKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDMuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjMgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08zKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDQuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjQgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU080KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDUuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjUgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU081KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GNSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDYuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjYgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU082KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GNik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDcuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjcgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPNworICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU083KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GNyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDguCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjggICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPOAorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU084KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GOCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDkuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjkgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPOQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU085KERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GOSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEwLgorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMCAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEwCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEwKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMTApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEZsYWcgQ2hhbm5lbCAxMS4KKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBDU09GMTEgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMQorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfU08xMShETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoRE1BTVVYMV9DaGFubmVsU3RhdHVzLT5DRlIsIERNQU1VWF9DRlJfQ1NPRjExKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBGbGFnIENoYW5uZWwgMTIuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgQ1NPRjEyICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMTIKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1NPMTIoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfQ2hhbm5lbFN0YXR1cy0+Q0ZSLCBETUFNVVhfQ0ZSX0NTT0YxMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU3luY2hyb25pemF0aW9uIEV2ZW50IE92ZXJydW4gRmxhZyBDaGFubmVsIDEzLgorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIENTT0YxMyAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEzCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19TTzEzKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX0NoYW5uZWxTdGF0dXMtPkNGUiwgRE1BTVVYX0NGUl9DU09GMTMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDAgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMCAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzAoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdDRlIsIERNQU1VWF9SR0NGUl9DT0YwKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBSZXF1ZXN0IEdlbmVyYXRvciAxIFRyaWdnZXIgRXZlbnQgT3ZlcnJ1biBGbGFnLgorICAqIEBybXRvbGwgUkdDRlIgICAgICAgIENPRjEgICAgICAgICAgTExfRE1BTVVYX0NsZWFyRmxhZ19SR08xCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0NsZWFyRmxhZ19SR08xKERNQU1VWF9DaGFubmVsX1R5cGVEZWYgKkRNQU1VWHgpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgU0VUX0JJVChETUFNVVgxX1JlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSLCBETUFNVVhfUkdDRlJfQ09GMSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUmVxdWVzdCBHZW5lcmF0b3IgMiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gRmxhZy4KKyAgKiBAcm10b2xsIFJHQ0ZSICAgICAgICBDT0YyICAgICAgICAgIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMgorICAqIEBwYXJhbSAgRE1BTVVYeCBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9DbGVhckZsYWdfUkdPMihETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4KQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgRE1BTVVYX1JHQ0ZSX0NPRjIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlcXVlc3QgR2VuZXJhdG9yIDMgVHJpZ2dlciBFdmVudCBPdmVycnVuIEZsYWcuCisgICogQHJtdG9sbCBSR0NGUiAgICAgICAgQ09GMyAgICAgICAgICBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMKKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBETUFNVVh4IEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfQ2xlYXJGbGFnX1JHTzMoRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKERNQU1VWDFfUmVxdWVzdEdlblN0YXR1cy0+UkdDRlIsIERNQU1VWF9SR0NGUl9DT0YzKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFNVVhfTExfRUZfSVRfTWFuYWdlbWVudCBJVF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFN5bmNocm9uaXphdGlvbiBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVggY2hhbm5lbCB4LgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNPSUUgICAgICAgICAgTExfRE1BTVVYX0VuYWJsZUlUX1NPCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RNQU1VWF9FbmFibGVJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIFNFVF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgb24gRE1BTVVYIGNoYW5uZWwgeC4KKyAgKiBAcm10b2xsIEN4Q1IgICAgICAgICBTT0lFICAgICAgICAgIExMX0RNQU1VWF9EaXNhYmxlSVRfU08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0Rpc2FibGVJVF9TTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBDaGFubmVsKQoreworICAodm9pZCkoRE1BTVVYeCk7CisgIENMRUFSX0JJVCgoRE1BTVVYMV9DaGFubmVsMCArIENoYW5uZWwpLT5DQ1IsIERNQU1VWF9DeENSX1NPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTeW5jaHJvbml6YXRpb24gRXZlbnQgT3ZlcnJ1biBJbnRlcnJ1cHQgb24gRE1BTVVYIGNoYW5uZWwgeCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ3hDUiAgICAgICAgIFNPSUUgICAgICAgICAgTExfRE1BTVVYX0lzRW5hYmxlZElUX1NPCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfQ0hBTk5FTF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9DSEFOTkVMXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX0NIQU5ORUxfMTMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9ETUFNVVhfSXNFbmFibGVkSVRfU08oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICByZXR1cm4gKCgoUkVBRF9CSVQoKERNQU1VWDFfQ2hhbm5lbDAgKyBDaGFubmVsKS0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKSkgPT0gKERNQU1VWF9DeENSX1NPSUUpKT8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJlcXVlc3QgR2VuZXJhdGlvbiBUcmlnZ2VyIEV2ZW50IE92ZXJydW4gSW50ZXJydXB0IG9uIERNQU1VWCBjaGFubmVsIHguCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfRW5hYmxlSVRfUkdPCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRE1BTVVYX0VuYWJsZUlUX1JHTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBTRVRfQklUKChETUFNVVgxX1JlcXVlc3RHZW5lcmF0b3IwICsgUmVxdWVzdEdlbkNoYW5uZWwpLT5SR0NSLCBETUFNVVhfUkd4Q1JfT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVggY2hhbm5lbCB4LgorICAqIEBybXRvbGwgUkd4Q1IgICAgICAgIE9JRSAgICAgICAgICAgTExfRE1BTVVYX0Rpc2FibGVJVF9SR08KKyAgKiBAcGFyYW0gIERNQU1VWHggRE1BTVVYeCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUmVxdWVzdEdlbkNoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8zCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9ETUFNVVhfRGlzYWJsZUlUX1JHTyhETUFNVVhfQ2hhbm5lbF9UeXBlRGVmICpETUFNVVh4LCB1aW50MzJfdCBSZXF1ZXN0R2VuQ2hhbm5lbCkKK3sKKyAgKHZvaWQpKERNQU1VWHgpOworICBDTEVBUl9CSVQoKERNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyBSZXF1ZXN0R2VuQ2hhbm5lbCktPlJHQ1IsIERNQU1VWF9SR3hDUl9PSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBSZXF1ZXN0IEdlbmVyYXRpb24gVHJpZ2dlciBFdmVudCBPdmVycnVuIEludGVycnVwdCBvbiBETUFNVVggY2hhbm5lbCB4IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBSR3hDUiAgICAgICAgT0lFICAgICAgICAgICBMTF9ETUFNVVhfSXNFbmFibGVkSVRfUkdPCisgICogQHBhcmFtICBETUFNVVh4IERNQU1VWHggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcXVlc3RHZW5DaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQU1VWF9SRVFfR0VOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFNVVhfUkVRX0dFTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BTVVYX1JFUV9HRU5fMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RNQU1VWF9Jc0VuYWJsZWRJVF9SR08oRE1BTVVYX0NoYW5uZWxfVHlwZURlZiAqRE1BTVVYeCwgdWludDMyX3QgUmVxdWVzdEdlbkNoYW5uZWwpCit7CisgICh2b2lkKShETUFNVVh4KTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKERNQU1VWDFfUmVxdWVzdEdlbmVyYXRvcjAgKyBSZXF1ZXN0R2VuQ2hhbm5lbCktPlJHQ1IsIERNQU1VWF9SR3hDUl9PSUUpID09IChETUFNVVhfUkd4Q1JfT0lFKSk/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBETUFNVVgxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfRE1BTVVYX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfZXh0aS5oIGIvSW5jL3N0bTMyd2J4eF9sbF9leHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzOGM2YQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfZXh0aS5oCkBAIC0wLDAgKzEsMTU5OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9leHRpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIEVYVEkgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0VYVElfSAorI2RlZmluZSBTVE0zMldCeHhfTExfRVhUSV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRVhUSSkKKworLyoqIEBkZWZncm91cCBFWFRJX0xMIEVYVEkKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX1ByaXZhdGVfTWFjcm9zIEVYVEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBFWFRJX0xMX0VTX0lOSVQgRVhUSSBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZQorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworCisgIHVpbnQzMl90IExpbmVfMF8zMTsgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9MTF9FQ19MSU5FICovCisKKyAgdWludDMyX3QgTGluZV8zMl82MzsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEVYVEkgbGluZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIEByZWYgRVhUSV9MTF9FQ19MSU5FICovCisKKyAgRnVuY3Rpb25hbFN0YXRlIExpbmVDb21tYW5kOyAgLyohPCBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IGVpdGhlciB0byBFTkFCTEUgb3IgRElTQUJMRSAqLworCisgIHVpbnQ4X3QgTW9kZTsgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBtb2RlIGZvciB0aGUgRVhUSSBsaW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEVYVElfTExfRUNfTU9ERS4gKi8KKworICB1aW50OF90IFRyaWdnZXI7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgdHJpZ2dlciBzaWduYWwgYWN0aXZlIGVkZ2UgZm9yIHRoZSBFWFRJIGxpbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9MTF9FQ19UUklHR0VSLiAqLworfSBMTF9FWFRJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9Db25zdGFudHMgRVhUSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfTElORSBMSU5FCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzAgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTAgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAwICovCisjZGVmaW5lIExMX0VYVElfTElORV8xICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMiAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMiAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzMgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTMgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzICovCisjZGVmaW5lIExMX0VYVElfTElORV80ICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU00ICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNSAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNNSAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDUgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzYgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTYgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA2ICovCisjZGVmaW5lIExMX0VYVElfTElORV83ICAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU03ICAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfOCAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNOCAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDggKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzkgICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTkgICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA5ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMCAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xMCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTAgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzExICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTExICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxMSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTIgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDEyICovCisjZGVmaW5lIExMX0VYVElfTElORV8xMyAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTMgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE0ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTE0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTUgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTUgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE1ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xNiAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xNiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTYgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzE3ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTE3ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAxNyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMTggICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMTggICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDE4ICovCisjZGVmaW5lIExMX0VYVElfTElORV8xOSAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0xOSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMTkgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIwICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTIwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyMCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMjEgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMjEgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDIxICovCisjZGVmaW5lIExMX0VYVElfTElORV8yMiAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yMiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzIzICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTIzICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyMyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMjQgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMjQgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI0ICovCisjZGVmaW5lIExMX0VYVElfTElORV8yNSAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yNSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjUgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI2ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI2ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyNiAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMjcgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMjcgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDI3ICovCisjZGVmaW5lIExMX0VYVElfTElORV8yOCAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0yOCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMjggKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzI5ICAgICAgICAgICAgICAgIEVYVElfSU1SMV9JTTI5ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAyOSAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMzAgICAgICAgICAgICAgICAgRVhUSV9JTVIxX0lNMzAgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDMwICovCisjZGVmaW5lIExMX0VYVElfTElORV8zMSAgICAgICAgICAgICAgICBFWFRJX0lNUjFfSU0zMSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzEgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTF8wXzMxICAgICAgICAgIEVYVElfSU1SMV9JTSAgICAgICAgICAgIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgbm90IHJlc2VydmVkKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBMTF9FWFRJX0xJTkVfMzIgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNMzIgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDMyICovCisjZGVmaW5lIExMX0VYVElfTElORV8zMyAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zMyAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzMgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzM0ICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTM0ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzNCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMzUgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNMzUgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDM1ICovCisjZGVmaW5lIExMX0VYVElfTElORV8zNiAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zNiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzYgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzM3ICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTM3ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSAzNyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfMzggICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNMzggICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDM4ICovCisjZGVmaW5lIExMX0VYVElfTElORV8zOSAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU0zOSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgMzkgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzQwICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTQwICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA0MCAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNDEgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNNDEgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDQxICovCisjZGVmaW5lIExMX0VYVElfTElORV80MiAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU00MiAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNDIgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzQzICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTQzICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA0MyAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNDQgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNNDQgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDQ0ICovCisjZGVmaW5lIExMX0VYVElfTElORV80NSAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU00NSAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNDUgKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FXzQ2ICAgICAgICAgICAgICAgIEVYVElfSU1SMl9JTTQ2ICAgICAgICAgIC8qITwgRXh0ZW5kZWQgbGluZSA0NiAqLworI2RlZmluZSBMTF9FWFRJX0xJTkVfNDcgICAgICAgICAgICAgICAgRVhUSV9JTVIyX0lNNDcgICAgICAgICAgLyohPCBFeHRlbmRlZCBsaW5lIDQ3ICovCisjZGVmaW5lIExMX0VYVElfTElORV80OCAgICAgICAgICAgICAgICBFWFRJX0lNUjJfSU00OCAgICAgICAgICAvKiE8IEV4dGVuZGVkIGxpbmUgNDggKi8KKyNkZWZpbmUgTExfRVhUSV9MSU5FX0FMTF8zMl82MyAgICAgICAgIEVYVElfSU1SMl9JTSAgICAgICAgICAgIC8qITwgQWxsIEV4dGVuZGVkIGxpbmUgbm90IHJlc2VydmVkKi8KKworCisjZGVmaW5lIExMX0VYVElfTElORV9BTEwgICAgICAgICAgICAgICAoMHhGRkZGRkZGRlUpICAvKiE8IEFsbCBFeHRlbmRlZCBsaW5lICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKyNkZWZpbmUgTExfRVhUSV9MSU5FX05PTkUgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgIC8qITwgTm9uZSBFeHRlbmRlZCBsaW5lICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKioKKyAgKiBAfQorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfTU9ERSBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0lUICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpIC8qITwgSW50ZXJydXB0IE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9NT0RFX0VWRU5UICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpIC8qITwgRXZlbnQgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX01PREVfSVRfRVZFTlQgICAgICAgICAgICgodWludDhfdCkweDAyVSkgLyohPCBJbnRlcnJ1cHQgJiBFdmVudCBNb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUNfVFJJR0dFUiBFZGdlIFRyaWdnZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfTk9ORSAgICAgICAgICAgICgodWludDhfdCkweDAwVSkgLyohPCBObyBUcmlnZ2VyIE1vZGUgKi8KKyNkZWZpbmUgTExfRVhUSV9UUklHR0VSX1JJU0lORyAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpIC8qITwgVHJpZ2dlciBSaXNpbmcgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORyAgICAgICAgICgodWludDhfdCkweDAyVSkgLyohPCBUcmlnZ2VyIEZhbGxpbmcgTW9kZSAqLworI2RlZmluZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcgICgodWludDhfdCkweDAzVSkgLyohPCBUcmlnZ2VyIFJpc2luZyAmIEZhbGxpbmcgTW9kZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9NYWNyb3MgRVhUSSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9FWFRJX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKEVYVEktPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBFWFRJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0VYVElfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhFWFRJLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgRVhUSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAqIEB7CisgKi8KKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUlUXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+SU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMSBmb3IgY3B1MgorICAqIEBybXRvbGwgQzJJTVIxICAgICAgICAgSU14ICAgICAgICAgICBMTF9DMl9FWFRJX0VuYWJsZUlUXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0VYVElfRW5hYmxlSVRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5DMklNUjEsIEV4dGlMaW5lKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBJTVIyICAgICAgICAgSU14ICAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMgZm9yIGNwdTIKKyAgKiBAcm10b2xsIEMySU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfQzJfRVhUSV9FbmFibGVJVF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9FWFRJX0VuYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkMySU1SMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIElNUjEgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5JTVIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMSBmb3IgY3B1MgorICAqIEBybXRvbGwgQzJJTVIxICAgICAgICAgSU14ICAgICAgICAgICBMTF9DMl9FWFRJX0Rpc2FibGVJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9FWFRJX0Rpc2FibGVJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+QzJJTVIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBJbnRlcnJ1cHQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+SU1SMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzIGZvciBjcHUyCisgICogQHJtdG9sbCBDMklNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0MyX0VYVElfRGlzYWJsZUlUXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80NworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0VYVElfRGlzYWJsZUlUXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+QzJJTVIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBybXRvbGwgSU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5JTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEludGVycnVwdCByZXF1ZXN0IGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEgZm9yIGNwdTIKKyAgKiBAcm10b2xsIEMySU1SMSAgICAgICAgIElNeCAgICAgICAgICAgTExfQzJfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfRVhUSV9Jc0VuYWJsZWRJVF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5DMklNUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIElNUjIgICAgICAgICBJTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQ0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQ1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQ2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkSVRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPklNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgSW50ZXJydXB0IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMgZm9yIGNwdTIKKyAgKiBAcm10b2xsIEMySU1SMiAgICAgICAgIElNeCAgICAgICAgICAgTExfQzJfRVhUSV9Jc0VuYWJsZWRJVF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzMyXzYzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfRVhUSV9Jc0VuYWJsZWRJVF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+QzJJTVIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfRXZlbnRfTWFuYWdlbWVudCBFdmVudF9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBybXRvbGwgRU1SMSAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+RU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxIGZvciBjcHUyCisgICogQHJtdG9sbCBDMkVNUjEgICAgICAgICBFTXggICAgICAgICAgIExMX0MyX0VYVElfRW5hYmxlRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfRVhUSV9FbmFibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkMyRU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8zMl82MworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9FbmFibGVFdmVudF8zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5FTVIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzIGZvciBjcHUyCisgICogQHJtdG9sbCBDMkVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0MyX0VYVElfRW5hYmxlRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0VYVElfRW5hYmxlRXZlbnRfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIFNFVF9CSVQoRVhUSS0+QzJFTVIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIxICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+RU1SMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMSBmb3IgY3B1MgorICAqIEBybXRvbGwgQzJFTVIxICAgICAgICAgRU14ICAgICAgICAgICBMTF9DMl9FWFRJX0Rpc2FibGVFdmVudF8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FX0FMTF8wXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+QzJFTVIxLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBFdmVudCByZXF1ZXN0IGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBybXRvbGwgRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+RU1SMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMgZm9yIGNwdTIKKyAgKiBAcm10b2xsIEMyRU1SMiAgICAgICAgIEVNeCAgICAgICAgICAgTExfQzJfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+QzJFTVIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQHJtdG9sbCBFTVIxICAgICAgICAgRU14ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfQUxMXzBfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkVNUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRXh0aUxpbmUgRXZlbnQgcmVxdWVzdCBpcyBlbmFibGVkIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxIGZvciBjcHUyCisgICogQHJtdG9sbCBDMkVNUjEgICAgICAgICBFTXggICAgICAgICAgIExMX0MyX0VYVElfSXNFbmFibGVkRXZlbnRfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMF8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0VYVElfSXNFbmFibGVkRXZlbnRfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+QzJFTVIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzRW5hYmxlZEV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5FTVIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEV4dGlMaW5lIEV2ZW50IHJlcXVlc3QgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMgZm9yIGNwdTIKKyAgKiBAcm10b2xsIEVNUjIgICAgICAgICBFTXggICAgICAgICAgIExMX0MyX0VYVElfSXNFbmFibGVkRXZlbnRfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV9BTExfMzJfNjMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9FWFRJX0lzRW5hYmxlZEV2ZW50XzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5DMkVNUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9SaXNpbmdfVHJpZ2dlcl9NYW5hZ2VtZW50IFJpc2luZ19UcmlnZ2VyX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBSaXNpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUjEgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5SVFNSMSwgRXh0aUxpbmUpOworCit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIFJpc2luZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC5SaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUjIgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5SVFNSMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgUmlzaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgcmlzaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX1JUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPlJUU1IxLCBFeHRpTGluZSk7CisKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEV4dGlMaW5lIFJpc2luZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSByaXNpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfUlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlRTUjIgICAgICAgIFJUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlUmlzaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBDTEVBUl9CSVQoRVhUSS0+UlRTUjIsIEV4dGlMaW5lKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDAgdG8gMzEKKyAgKiBAcm10b2xsIFJUU1IxICAgICAgICBSVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKChSRUFEX0JJVChFWFRJLT5SVFNSMSwgRXh0aUxpbmUpID09IChFeHRpTGluZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByaXNpbmcgZWRnZSB0cmlnZ2VyIGlzIGVuYWJsZWQgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQHJtdG9sbCBSVFNSMiAgICAgICAgUlR4ICAgICAgICAgICBMTF9FWFRJX0lzRW5hYmxlZFJpc2luZ1RyaWdfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80MQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkUmlzaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UlRTUjIsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9GYWxsaW5nX1RyaWdnZXJfTWFuYWdlbWVudCBGYWxsaW5nX1RyaWdnZXJfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEV4dGlMaW5lIEZhbGxpbmcgRWRnZSBUcmlnZ2VyIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSBmYWxsaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IKKyAgKiAgICAgICB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZS4gSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlcgorICAqICAgICAgIGNvbmRpdGlvbi4KKyAgKiBAcm10b2xsIEZUU1IxICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgU0VUX0JJVChFWFRJLT5GVFNSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGUgY29uZmlndXJhYmxlIHdha2V1cCBsaW5lcyBhcmUgZWRnZS10cmlnZ2VyZWQuIE5vIGdsaXRjaCBtdXN0IGJlCisgICogICAgICAgZ2VuZXJhdGVkIG9uIHRoZXNlIGxpbmVzLiBJZiBhIEZhbGxpbmcgZWRnZSBvbiBhIGNvbmZpZ3VyYWJsZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lIG9jY3VycyBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24gaW4gdGhlIEVYVElfRlRTUiByZWdpc3RlciwgdGhlCisgICogICAgICAgcGVuZGluZyBiaXQgaXMgbm90IHNldC4KKyAgKiAgICAgICBSaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSB0cmlnZ2VycyBjYW4gYmUgc2V0IGZvcgorICAqICAgICAgIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIGJvdGggZ2VuZXJhdGUgYSB0cmlnZ2VyCisgICogICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUjIgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFeHRpTGluZSBGYWxsaW5nIEVkZ2UgVHJpZ2dlciBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoZSBjb25maWd1cmFibGUgd2FrZXVwIGxpbmVzIGFyZSBlZGdlLXRyaWdnZXJlZC4gTm8gZ2xpdGNoIG11c3QgYmUKKyAgKiAgICAgICBnZW5lcmF0ZWQgb24gdGhlc2UgbGluZXMuIElmIGEgRmFsbGluZyBlZGdlIG9uIGEgY29uZmlndXJhYmxlIGludGVycnVwdAorICAqICAgICAgIGxpbmUgb2NjdXJzIGR1cmluZyBhIHdyaXRlIG9wZXJhdGlvbiBpbiB0aGUgRVhUSV9GVFNSIHJlZ2lzdGVyLCB0aGUKKyAgKiAgICAgICBwZW5kaW5nIGJpdCBpcyBub3Qgc2V0LgorICAqICAgICAgIFJpc2luZyBhbmQgZmFsbGluZyBlZGdlIHRyaWdnZXJzIGNhbiBiZSBzZXQgZm9yIHRoZSBzYW1lIGludGVycnVwdCBsaW5lLgorICAqICAgICAgIEluIHRoaXMgY2FzZSwgYm90aCBnZW5lcmF0ZSBhIHRyaWdnZXIgY29uZGl0aW9uLgorICAqIEBybXRvbGwgRlRTUjEgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAbm90ZSAgIFBsZWFzZSBjaGVjayBlYWNoIGRldmljZSBsaW5lIG1hcHBpbmcgZm9yIEVYVEkgTGluZSBhdmFpbGFiaWxpdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfRGlzYWJsZUZhbGxpbmdUcmlnXzBfMzEodWludDMyX3QgRXh0aUxpbmUpCit7CisgIENMRUFSX0JJVChFWFRJLT5GVFNSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXh0aUxpbmUgRmFsbGluZyBFZGdlIFRyaWdnZXIgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhlIGNvbmZpZ3VyYWJsZSB3YWtldXAgbGluZXMgYXJlIGVkZ2UtdHJpZ2dlcmVkLiBObyBnbGl0Y2ggbXVzdCBiZQorICAqICAgICAgIGdlbmVyYXRlZCBvbiB0aGVzZSBsaW5lcy4gSWYgYSBGYWxsaW5nIGVkZ2Ugb24gYSBjb25maWd1cmFibGUgaW50ZXJydXB0CisgICogICAgICAgbGluZSBvY2N1cnMgZHVyaW5nIGEgd3JpdGUgb3BlcmF0aW9uIGluIHRoZSBFWFRJX0ZUU1IgcmVnaXN0ZXIsIHRoZQorICAqICAgICAgIHBlbmRpbmcgYml0IGlzIG5vdCBzZXQuCisgICogICAgICAgUmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UgdHJpZ2dlcnMgY2FuIGJlIHNldCBmb3IgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUuCisgICogICAgICAgSW4gdGhpcyBjYXNlLCBib3RoIGdlbmVyYXRlIGEgdHJpZ2dlciBjb25kaXRpb24uCisgICogQHJtdG9sbCBGVFNSMiAgICAgICAgRlR4ICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgQ0xFQVJfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgZmFsbGluZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBybXRvbGwgRlRTUjEgICAgICAgIEZUeCAgICAgICAgICAgTExfRVhUSV9Jc0VuYWJsZWRGYWxsaW5nVHJpZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+RlRTUjEsIEV4dGlMaW5lKSA9PSAoRXh0aUxpbmUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgZmFsbGluZyBlZGdlIHRyaWdnZXIgaXMgZW5hYmxlZCBmb3IgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAcm10b2xsIEZUU1IyICAgICAgICBGVHggICAgICAgICAgIExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMzJfNjMKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zOAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfSXNFbmFibGVkRmFsbGluZ1RyaWdfMzJfNjModWludDMyX3QgRXh0aUxpbmUpCit7CisgIHJldHVybiAoKFJFQURfQklUKEVYVEktPkZUU1IyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQgU29mdHdhcmVfSW50ZXJydXB0X01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgSW50ZXJydXB0IEV2ZW50IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgSWYgdGhlIGludGVycnVwdCBpcyBlbmFibGVkIG9uIHRoaXMgbGluZSBpbiB0aGUgRVhUSV9JTVIxLCB3cml0aW5nIGEgMSB0bworICAqICAgICAgIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUjEKKyAgKiAgICAgICByZXN1bHRpbmcgaW4gYW4gaW50ZXJydXB0IHJlcXVlc3QgZ2VuZXJhdGlvbi4KKyAgKiAgICAgICBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IGNsZWFyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgRVhUSV9QUjEKKyAgKiAgICAgICByZWdpc3RlciAoYnkgd3JpdGluZyBhIDEgaW50byB0aGUgYml0KQorICAqIEBybXRvbGwgU1dJRVIxICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEBub3RlICAgUGxlYXNlIGNoZWNrIGVhY2ggZGV2aWNlIGxpbmUgbWFwcGluZyBmb3IgRVhUSSBMaW5lIGF2YWlsYWJpbGl0eQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9HZW5lcmF0ZVNXSV8wXzMxKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlNXSUVSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgSW50ZXJydXB0IEV2ZW50IGZvciBMaW5lcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIElmIHRoZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvbiB0aGlzIGxpbmUgaW50aGUgRVhUSV9JTVIyLCB3cml0aW5nIGEgMSB0bworICAqICAgICAgIHRoaXMgYml0IHdoZW4gaXQgaXMgYXQgJzAnIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgcGVuZGluZyBiaXQgaW4gRVhUSV9QUjIKKyAgKiAgICAgICByZXN1bHRpbmcgaW4gYW4gaW50ZXJydXB0IHJlcXVlc3QgZ2VuZXJhdGlvbi4KKyAgKiAgICAgICBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IGNsZWFyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgRVhUSV9QUjIKKyAgKiAgICAgICByZWdpc3RlciAoYnkgd3JpdGluZyBhIDEgaW50byB0aGUgYml0KQorICAqIEBybXRvbGwgU1dJRVIyICAgICAgIFNXSXggICAgICAgICAgTExfRVhUSV9HZW5lcmF0ZVNXSV8zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM3CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzM4CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9FWFRJX0dlbmVyYXRlU1dJXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBTRVRfQklUKEVYVEktPlNXSUVSMiwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEVYVElfTExfRUZfRmxhZ19NYW5hZ2VtZW50IEZsYWdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEV4dExpbmUgRmxhZyBpcyBzZXQgb3Igbm90IGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIxICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzBfMzEKKyAgKiBAcGFyYW0gIEV4dGlMaW5lIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMxCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UFIxLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBFeHRMaW5lIEZsYWcgaXMgc2V0IG9yIG5vdCBmb3IgIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIyICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfSXNBY3RpdmVGbGFnXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX0lzQWN0aXZlRmxhZ18zMl82Myh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRVhUSS0+UFIyLCBFeHRpTGluZSkgPT0gKEV4dGlMaW5lKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciBMaW5lcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIxICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfUmVhZEZsYWdfMF8zMQorICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzEKKyAgKiBAcmV0dmFsIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0VYVElfUmVhZEZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRVhUSS0+UFIxLCBFeHRpTGluZSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgRXh0TGluZSBDb21iaW5hdGlvbiBGbGFnIGZvciAgTGluZXMgaW4gcmFuZ2UgMzIgdG8gNjMKKyAgKiBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKiAgICAgICBsaW5lLiBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQuCisgICogQHJtdG9sbCBQUjIgICAgICAgICAgUElGeCAgICAgICAgICAgTExfRVhUSV9SZWFkRmxhZ18zMl82MworICAqIEBwYXJhbSAgRXh0aUxpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzMzCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQwCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzQxCisgICogQHJldHZhbCBAbm90ZSBUaGlzIGJpdCBpcyBzZXQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBldmVudCBhcnJpdmVzIG9uIHRoZSBpbnRlcnJ1cHQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9FWFRJX1JlYWRGbGFnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChFWFRJLT5QUjIsIEV4dGlMaW5lKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRXh0TGluZSBGbGFncyBmb3IgTGluZXMgaW4gcmFuZ2UgMCB0byAzMQorICAqIEBub3RlIFRoaXMgYml0IGlzIHNldCB3aGVuIHRoZSBzZWxlY3RlZCBlZGdlIGV2ZW50IGFycml2ZXMgb24gdGhlIGludGVycnVwdAorICAqICAgICAgIGxpbmUuIFRoaXMgYml0IGlzIGNsZWFyZWQgYnkgd3JpdGluZyBhIDEgdG8gdGhlIGJpdC4KKyAgKiBAcm10b2xsIFBSMSAgICAgICAgICBQSUZ4ICAgICAgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfRVhUSV9MSU5FXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0VYVElfTElORV8zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRVhUSV9DbGVhckZsYWdfMF8zMSh1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgV1JJVEVfUkVHKEVYVEktPlBSMSwgRXh0aUxpbmUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEV4dExpbmUgRmxhZ3MgZm9yIExpbmVzIGluIHJhbmdlIDMyIHRvIDYzCisgICogQG5vdGUgVGhpcyBiaXQgaXMgc2V0IHdoZW4gdGhlIHNlbGVjdGVkIGVkZ2UgZXZlbnQgYXJyaXZlcyBvbiB0aGUgaW50ZXJydXB0CisgICogICAgICAgbGluZS4gVGhpcyBiaXQgaXMgY2xlYXJlZCBieSB3cml0aW5nIGEgMSB0byB0aGUgYml0LgorICAqIEBybXRvbGwgUFIyICAgICAgICAgIFBJRnggICAgICAgICAgIExMX0VYVElfQ2xlYXJGbGFnXzMyXzYzCisgICogQHBhcmFtICBFeHRpTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfMzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9FWFRJX0xJTkVfNDEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0VYVElfQ2xlYXJGbGFnXzMyXzYzKHVpbnQzMl90IEV4dGlMaW5lKQoreworICBXUklURV9SRUcoRVhUSS0+UFIyLCBFeHRpTGluZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRVhUSV9MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9FWFRJX0luaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX0VYVElfRGVJbml0KHZvaWQpOwordm9pZCBMTF9FWFRJX1N0cnVjdEluaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KTsKKworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogRVhUSSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX0VYVElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9ncGlvLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTRkNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9sbF9ncGlvLmgKQEAgLTAsMCArMSw5OTEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfZ3Bpby5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBHUElPIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9HUElPX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX0dQSU9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0gpCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTCBHUElPCisgICogQHsKKyAgKi8KKy8qKiBNSVNSQSBDOjIwMTIgZGV2aWF0aW9uIHJ1bGUgaGFzIGJlZW4gZ3JhbnRlZCBmb3IgZm9sbG93aW5nIHJ1bGVzOgorICAqIFJ1bGUtMTguMV9kIC0gTWVkaXVtOiBBcnJheSBwb2ludGVyIGBHUElPeCcgaXMgYWNjZXNzZWQgd2l0aCBpbmRleCBbLi4sLi5dCisgICogd2hpY2ggbWF5IGJlIG91dCBvZiBhcnJheSBib3VuZHMgWy4uLFVOS05PV05dIGluIGZvbGxvd2luZyBBUElzOgorICAqIExMX0dQSU9fR2V0QUZQaW5fMF83CisgICogTExfR1BJT19TZXRBRlBpbl8wXzcKKyAgKiBMTF9HUElPX1NldEFGUGluXzhfMTUKKyAgKiBMTF9HUElPX0dldEFGUGluXzhfMTUKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9Qcml2YXRlX01hY3JvcyBHUElPIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRVNfSU5JVCBHUElPIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBMTCBHUElPIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBpbjsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIEdQSU8gcGlucyB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfUElOICovCisKKyAgdWludDMyX3QgTW9kZTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5Nb2RlKCkuKi8KKworICB1aW50MzJfdCBTcGVlZDsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzcGVlZCBmb3IgdGhlIHNlbGVjdGVkIHBpbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEdQSU9fTExfRUNfU1BFRUQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5TcGVlZCgpLiovCisKKyAgdWludDMyX3QgT3V0cHV0VHlwZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgb3BlcmF0aW5nIG91dHB1dCB0eXBlIGZvciB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19PVVRQVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKCkuKi8KKworICB1aW50MzJfdCBQdWxsOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBvcGVyYXRpbmcgUHVsbC11cC9QdWxsIGRvd24gZm9yIHRoZSBzZWxlY3RlZCBwaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBHUElPX0xMX0VDX1BVTEwuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8gSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfR1BJT19TZXRQaW5QdWxsKCkuKi8KKworICB1aW50MzJfdCBBbHRlcm5hdGU7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc2VsZWN0ZWQgcGlucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgR1BJT19MTF9FQ19BRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTyBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9HUElPX1NldEFGUGluXzBfNygpIGFuZCBMTF9HUElPX1NldEFGUGluXzhfMTUoKS4qLworfSBMTF9HUElPX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBHUElPIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19QSU4gUElOCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMCAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMwIC8qITwgU2VsZWN0IHBpbiAwICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMSAvKiE8IFNlbGVjdCBwaW4gMSAqLworI2RlZmluZSBMTF9HUElPX1BJTl8yICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzIgLyohPCBTZWxlY3QgcGluIDIgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fMyAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMzIC8qITwgU2VsZWN0IHBpbiAzICovCisjZGVmaW5lIExMX0dQSU9fUElOXzQgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTNCAvKiE8IFNlbGVjdCBwaW4gNCAqLworI2RlZmluZSBMTF9HUElPX1BJTl81ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzUgLyohPCBTZWxlY3QgcGluIDUgKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fNiAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM2IC8qITwgU2VsZWN0IHBpbiA2ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzcgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTNyAvKiE8IFNlbGVjdCBwaW4gNyAqLworI2RlZmluZSBMTF9HUElPX1BJTl84ICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzggLyohPCBTZWxlY3QgcGluIDggKi8KKyNkZWZpbmUgTExfR1BJT19QSU5fOSAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM5IC8qITwgU2VsZWN0IHBpbiA5ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEwICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTAgLyohPCBTZWxlY3QgcGluIDEwICovCisjZGVmaW5lIExMX0dQSU9fUElOXzExICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTEgLyohPCBTZWxlY3QgcGluIDExICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEyICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTIgLyohPCBTZWxlY3QgcGluIDEyICovCisjZGVmaW5lIExMX0dQSU9fUElOXzEzICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTMgLyohPCBTZWxlY3QgcGluIDEzICovCisjZGVmaW5lIExMX0dQSU9fUElOXzE0ICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTQgLyohPCBTZWxlY3QgcGluIDE0ICovCisjZGVmaW5lIExMX0dQSU9fUElOXzE1ICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTMTUgLyohPCBTZWxlY3QgcGluIDE1ICovCisjZGVmaW5lIExMX0dQSU9fUElOX0FMTCAgICAgICAgICAgICAgICAgICAgKEdQSU9fQlNSUl9CUzAgfCBHUElPX0JTUlJfQlMxICB8IEdQSU9fQlNSUl9CUzIgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzMgIHwgR1BJT19CU1JSX0JTNCAgfCBHUElPX0JTUlJfQlM1ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlM2ICB8IEdQSU9fQlNSUl9CUzcgIHwgR1BJT19CU1JSX0JTOCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19CU1JSX0JTOSAgfCBHUElPX0JTUlJfQlMxMCB8IEdQSU9fQlNSUl9CUzExIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQlNSUl9CUzEyIHwgR1BJT19CU1JSX0JTMTMgfCBHUElPX0JTUlJfQlMxNCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0JTUlJfQlMxNSkgLyohPCBTZWxlY3QgYWxsIHBpbnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FQ19NT0RFIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX01PREVfSU5QVVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgaW5wdXQgbW9kZSAqLworI2RlZmluZSBMTF9HUElPX01PREVfT1VUUFVUICAgICAgICAgICAgICAgIEdQSU9fTU9ERVJfTU9ERTBfMCAgLyohPCBTZWxlY3Qgb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgTExfR1BJT19NT0RFX0FMVEVSTkFURSAgICAgICAgICAgICBHUElPX01PREVSX01PREUwXzEgIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlICovCisjZGVmaW5lIExMX0dQSU9fTU9ERV9BTkFMT0cgICAgICAgICAgICAgICAgR1BJT19NT0RFUl9NT0RFMCAgICAvKiE8IFNlbGVjdCBhbmFsb2cgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX09VVFBVVCBPdXRwdXQgVHlwZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBwdXNoLXB1bGwgYXMgb3V0cHV0IHR5cGUgKi8KKyNkZWZpbmUgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOICAgICAgICAgICBHUElPX09UWVBFUl9PVDAgLyohPCBTZWxlY3Qgb3Blbi1kcmFpbiBhcyBvdXRwdXQgdHlwZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1NQRUVEIE91dHB1dCBTcGVlZAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9MT1cgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAvKiE8IFNlbGVjdCBJL08gbG93IG91dHB1dCBzcGVlZCAgICAqLworI2RlZmluZSBMTF9HUElPX1NQRUVEX0ZSRVFfTUVESVVNICAgICAgICAgIEdQSU9fT1NQRUVEUl9PU1BFRUQwXzAgLyohPCBTZWxlY3QgSS9PIG1lZGl1bSBvdXRwdXQgc3BlZWQgKi8KKyNkZWZpbmUgTExfR1BJT19TUEVFRF9GUkVRX0hJR0ggICAgICAgICAgICBHUElPX09TUEVFRFJfT1NQRUVEMF8xIC8qITwgU2VsZWN0IEkvTyBmYXN0IG91dHB1dCBzcGVlZCAgICovCisjZGVmaW5lIExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0ggICAgICAgR1BJT19PU1BFRURSX09TUEVFRDAgICAvKiE8IFNlbGVjdCBJL08gaGlnaCBvdXRwdXQgc3BlZWQgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX1BVTEwgUHVsbCBVcCBQdWxsIERvd24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9HUElPX1BVTExfTk8gICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgLyohPCBTZWxlY3QgSS9PIG5vIHB1bGwgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX1VQICAgICAgICAgICAgICAgICAgICBHUElPX1BVUERSX1BVUEQwXzAgLyohPCBTZWxlY3QgSS9PIHB1bGwgdXAgKi8KKyNkZWZpbmUgTExfR1BJT19QVUxMX0RPV04gICAgICAgICAgICAgICAgICBHUElPX1BVUERSX1BVUEQwXzEgLyohPCBTZWxlY3QgSS9PIHB1bGwgZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBHUElPX0xMX0VDX0FGIEFsdGVybmF0ZSBGdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0dQSU9fQUZfMCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAwICovCisjZGVmaW5lIExMX0dQSU9fQUZfMSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxICovCisjZGVmaW5lIExMX0dQSU9fQUZfMiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwM1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAzICovCisjZGVmaW5lIExMX0dQSU9fQUZfNCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA0ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA1ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNlUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA2ICovCisjZGVmaW5lIExMX0dQSU9fQUZfNyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwN1UpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA3ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwOFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA4ICovCisjZGVmaW5lIExMX0dQSU9fQUZfOSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwOVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiA5ICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwQVUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMCAqLworI2RlZmluZSBMTF9HUElPX0FGXzExICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMEJVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTEgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xMiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDBDVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDEyICovCisjZGVmaW5lIExMX0dQSU9fQUZfMTMgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwRFUpIC8qITwgU2VsZWN0IGFsdGVybmF0ZSBmdW5jdGlvbiAxMyAqLworI2RlZmluZSBMTF9HUElPX0FGXzE0ICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMEVVKSAvKiE8IFNlbGVjdCBhbHRlcm5hdGUgZnVuY3Rpb24gMTQgKi8KKyNkZWZpbmUgTExfR1BJT19BRl8xNSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDBGVSkgLyohPCBTZWxlY3QgYWx0ZXJuYXRlIGZ1bmN0aW9uIDE1ICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBHUElPX0xMX0V4cG9ydGVkX01hY3JvcyBHUElPIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEdQSU8gcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBHUElPIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9HUElPX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gR1BJTyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEdQSU8gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfR1BJT19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgR1BJTyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfUG9ydF9Db25maWd1cmF0aW9uIFBvcnQgQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE1PREVSICAgICAgICBNT0RFeSAgICAgICAgIExMX0dQSU9fU2V0UGluTW9kZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9BTFRFUk5BVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQU5BTE9HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk1vZGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLCB1aW50MzJfdCBNb2RlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5NT0RFUiwgKEdQSU9fTU9ERVJfTU9ERTAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSwgKE1vZGUgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGdwaW8gbW9kZSBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIG1vZGUgY2FuIGJlIElucHV0IG1vZGUsIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQsIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIG9yIEFuYWxvZy4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIE1PREVSICAgICAgICBNT0RFeSAgICAgICAgIExMX0dQSU9fR2V0UGluTW9kZQorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9JTlBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fTU9ERV9PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX01PREVfQUxURVJOQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19NT0RFX0FOQUxPRworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0UGluTW9kZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5NT0RFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQSU9fTU9ERVJfTU9ERTAgPDwgKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKSkgPj4gKFBPU0lUSU9OX1ZBTChQaW4pICogMlUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBvdXRwdXQgdHlwZSBmb3Igc2V2ZXJhbCBwaW5zIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgT3V0cHV0IHR5cGUgYXMgdG8gYmUgc2V0IHdoZW4gZ3BpbyBwaW4gaXMgaW4gb3V0cHV0IG9yCisgICogICAgICAgICBhbHRlcm5hdGUgbW9kZXMuIFBvc3NpYmxlIHR5cGUgYXJlIFB1c2gtcHVsbCBvciBPcGVuLWRyYWluLgorICAqIEBybXRvbGwgT1RZUEVSICAgICAgIE9UeSAgICAgICAgICAgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEBwYXJhbSAgT3V0cHV0VHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX1BVU0hQVUxMCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfT1BFTkRSQUlOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaywgdWludDMyX3QgT3V0cHV0VHlwZSkKK3sKKyAgTU9ESUZZX1JFRyhHUElPeC0+T1RZUEVSLCBQaW5NYXNrLCAoUGluTWFzayAqIE91dHB1dFR5cGUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBvdXRwdXQgdHlwZSBmb3Igc2V2ZXJhbCBwaW5zIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgT3V0cHV0IHR5cGUgYXMgdG8gYmUgc2V0IHdoZW4gZ3BpbyBwaW4gaXMgaW4gb3V0cHV0IG9yCisgICogICAgICAgICBhbHRlcm5hdGUgbW9kZXMuIFBvc3NpYmxlIHR5cGUgYXJlIFB1c2gtcHVsbCBvciBPcGVuLWRyYWluLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBybXRvbGwgT1RZUEVSICAgICAgIE9UeSAgICAgICAgICAgTExfR1BJT19HZXRQaW5PdXRwdXRUeXBlCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19PVVRQVVRfUFVTSFBVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX09VVFBVVF9PUEVORFJBSU4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpbk91dHB1dFR5cGUoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+T1RZUEVSLCBQaW4pID4+IFBPU0lUSU9OX1ZBTChQaW4pKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgZ3BpbyBzcGVlZCBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIHNwZWVkIGNhbiBiZSBMb3csIE1lZGl1bSwgRmFzdCBvciBIaWdoIHNwZWVkLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgUmVmZXIgdG8gZGF0YXNoZWV0IGZvciBmcmVxdWVuY3kgc3BlY2lmaWNhdGlvbnMgYW5kIHRoZSBwb3dlcgorICAqICAgICAgICAgc3VwcGx5IGFuZCBsb2FkIGNvbmRpdGlvbnMgZm9yIGVhY2ggc3BlZWQuCisgICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX1NldFBpblNwZWVkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcGFyYW0gIFNwZWVkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluU3BlZWQoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluLCB1aW50MzJfdCAgU3BlZWQpCit7CisgIE1PRElGWV9SRUcoR1BJT3gtPk9TUEVFRFIsIChHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLAorICAgICAgICAgICAgIChTcGVlZCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBzcGVlZCBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgSS9PIHNwZWVkIGNhbiBiZSBMb3csIE1lZGl1bSwgRmFzdCBvciBIaWdoIHNwZWVkLgorICAqIEBub3RlICAgV2FybmluZzogb25seSBvbmUgcGluIGNhbiBiZSBwYXNzZWQgYXMgcGFyYW1ldGVyLgorICAqIEBub3RlICAgUmVmZXIgdG8gZGF0YXNoZWV0IGZvciBmcmVxdWVuY3kgc3BlY2lmaWNhdGlvbnMgYW5kIHRoZSBwb3dlcgorICAqICAgICAgICAgc3VwcGx5IGFuZCBsb2FkIGNvbmRpdGlvbnMgZm9yIGVhY2ggc3BlZWQuCisgICogQHJtdG9sbCBPU1BFRURSICAgICAgT1NQRUVEeSAgICAgICBMTF9HUElPX0dldFBpblNwZWVkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19TUEVFRF9GUkVRX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9NRURJVU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0dldFBpblNwZWVkKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPk9TUEVFRFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKSA+PiAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIHB1bGwtdXAgb3IgcHVsbC1kb3duIGZvciBhIGRlZGljYXRlZCBwaW4gb24gYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFBVUERSICAgICAgICBQVVBEeSAgICAgICAgIExMX0dQSU9fU2V0UGluUHVsbAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHBhcmFtICBQdWxsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX05PCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QVUxMX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluUHVsbChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4sIHVpbnQzMl90IFB1bGwpCit7CisgIE1PRElGWV9SRUcoR1BJT3gtPlBVUERSLCAoR1BJT19QVVBEUl9QVVBEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpLCAoUHVsbCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBwdWxsLXVwIG9yIHB1bGwtZG93biBmb3IgYSBkZWRpY2F0ZWQgcGluIG9uIGEgZGVkaWNhdGVkIHBvcnQKKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFBVUERSICAgICAgICBQVVBEeSAgICAgICAgIExMX0dQSU9fR2V0UGluUHVsbAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9OTworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9VUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUFVMTF9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRQaW5QdWxsKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbikKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoR1BJT3gtPlBVUERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1BJT19QVVBEUl9QVVBEMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpKSA+PiAoUE9TSVRJT05fVkFMKFBpbikgKiAyVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSAwIHRvIDcgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQG5vdGUgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gQUYwIHRvIEFGMTUgZGVwZW5kaW5nIG9uIHRhcmdldC4KKyAgKiBAbm90ZSAgIFdhcm5pbmc6IG9ubHkgb25lIHBpbiBjYW4gYmUgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIEFGUkwgICAgICAgICBBRlNFTHkgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogQHBhcmFtICBBbHRlcm5hdGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgQWx0ZXJuYXRlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMF0sIChHUElPX0FGUkxfQUZTRUwwIDw8IChQT1NJVElPTl9WQUwoUGluKSAqIDRVKSksCisgICAgICAgICAgICAgKEFsdGVybmF0ZSA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiA0VSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gMCB0byA3IGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBybXRvbGwgQUZSTCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl8wXzcKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE1CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19HZXRBRlBpbl8wXzcoR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChHUElPeC0+QUZSWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1BJT19BRlJMX0FGU0VMMCA8PCAoUE9TSVRJT05fVkFMKFBpbikgKiA0VSkpKSA+PiAoUE9TSVRJT05fVkFMKFBpbikgKiA0VSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBncGlvIGFsdGVybmF0ZSBmdW5jdGlvbiBvZiBhIGRlZGljYXRlZCBwaW4gZnJvbSA4IHRvIDE1IGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIEFGMCB0byBBRjE1IGRlcGVuZGluZyBvbiB0YXJnZXQuCisgICogQG5vdGUgICBXYXJuaW5nOiBvbmx5IG9uZSBwaW4gY2FuIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBBRlJIICAgICAgICAgQUZTRUx5ICAgICAgICBMTF9HUElPX1NldEFGUGluXzhfMTUKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiBAcGFyYW0gIEFsdGVybmF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRBRlBpbl84XzE1KEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgQWx0ZXJuYXRlKQoreworICBNT0RJRllfUkVHKEdQSU94LT5BRlJbMV0sIChHUElPX0FGUkhfQUZTRUw4IDw8IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSksCisgICAgICAgICAgICAgKEFsdGVybmF0ZSA8PCAoUE9TSVRJT05fVkFMKFBpbiA+PiA4VSkgKiA0VSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gb2YgYSBkZWRpY2F0ZWQgcGluIGZyb20gOCB0byAxNSBmb3IgYSBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAbm90ZSAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSBBRjAgdG8gQUYxNSBkZXBlbmRpbmcgb24gdGFyZ2V0LgorICAqIEBybXRvbGwgQUZSSCAgICAgICAgIEFGU0VMeSAgICAgICAgTExfR1BJT19HZXRBRlBpbl84XzE1CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fQUZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX0FGXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19BRl8xNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fR2V0QUZQaW5fOF8xNShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW4pCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEdQSU94LT5BRlJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUElPX0FGUkhfQUZTRUw4IDw8IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSkpID4+IChQT1NJVElPTl9WQUwoUGluID4+IDhVKSAqIDRVKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBMb2NrIGNvbmZpZ3VyYXRpb24gb2Ygc2V2ZXJhbCBwaW5zIGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBub3RlICAgV2hlbiB0aGUgbG9jayBzZXF1ZW5jZSBoYXMgYmVlbiBhcHBsaWVkIG9uIGEgcG9ydCBiaXQsIHRoZQorICAqICAgICAgICAgdmFsdWUgb2YgdGhpcyBwb3J0IGJpdCBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkIHVudGlsIHRoZQorICAqICAgICAgICAgbmV4dCByZXNldC4KKyAgKiBAbm90ZSAgIEVhY2ggbG9jayBiaXQgZnJlZXplcyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAgKiAgICAgICAgIChjb250cm9sIGFuZCBhbHRlcm5hdGUgZnVuY3Rpb24gcmVnaXN0ZXJzKS4KKyAgKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0tLICAgICAgICAgIExMX0dQSU9fTG9ja1BpbgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fTG9ja1BpbihHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICBfX0lPIHVpbnQzMl90IHRlbXA7CisgIFdSSVRFX1JFRyhHUElPeC0+TENLUiwgR1BJT19MQ0tSX0xDS0sgfCBQaW5NYXNrKTsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBQaW5NYXNrKTsKKyAgV1JJVEVfUkVHKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSyB8IFBpbk1hc2spOworICAvKiBSZWFkIExDS0sgcmVnaXN0ZXIuIFRoaXMgcmVhZCBpcyBtYW5kYXRvcnkgdG8gY29tcGxldGUga2V5IGxvY2sgc2VxdWVuY2UgKi8KKyAgdGVtcCA9IFJFQURfUkVHKEdQSU94LT5MQ0tSKTsKKyAgKHZvaWQpIHRlbXA7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDEgaWYgYWxsIHBpbnMgcGFzc2VkIGFzIHBhcmFtZXRlciwgb2YgYSBkZWRpY2F0ZWQgcG9ydCwgYXJlIGxvY2tlZC4gZWxzZSBSZXR1cm4gMC4KKyAgKiBAcm10b2xsIExDS1IgICAgICAgICBMQ0t5ICAgICAgICAgIExMX0dQSU9fSXNQaW5Mb2NrZWQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc1BpbkxvY2tlZChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChHUElPeC0+TENLUiwgUGluTWFzaykgPT0gKFBpbk1hc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDEgaWYgb25lIG9mIHRoZSBwaW4gb2YgYSBkZWRpY2F0ZWQgcG9ydCBpcyBsb2NrZWQuIGVsc2UgcmV0dXJuIDAuCisgICogQHJtdG9sbCBMQ0tSICAgICAgICAgTENLSyAgICAgICAgICBMTF9HUElPX0lzQW55UGluTG9ja2VkCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HUElPX0lzQW55UGluTG9ja2VkKEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEdQSU94LT5MQ0tSLCBHUElPX0xDS1JfTENLSykgPT0gKEdQSU9fTENLUl9MQ0tLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEdQSU9fTExfRUZfRGF0YV9BY2Nlc3MgRGF0YSBBY2Nlc3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBmdWxsIGlucHV0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgZm9yIGEgZGVkaWNhdGVkIHBvcnQuCisgICogQHJtdG9sbCBJRFIgICAgICAgICAgSUR5ICAgICAgICAgICBMTF9HUElPX1JlYWRJbnB1dFBvcnQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEByZXR2YWwgSW5wdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19SZWFkSW5wdXRQb3J0KEdQSU9fVHlwZURlZiAqR1BJT3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKEdQSU94LT5JRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gaWYgaW5wdXQgZGF0YSBsZXZlbCBmb3Igc2V2ZXJhbCBwaW5zIG9mIGRlZGljYXRlZCBwb3J0IGlzIGhpZ2ggb3IgbG93LgorICAqIEBybXRvbGwgSURSICAgICAgICAgIElEeSAgICAgICAgICAgTExfR1BJT19Jc0lucHV0UGluU2V0CisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0dQSU9fSXNJbnB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChHUElPeC0+SURSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBvdXRwdXQgZGF0YSByZWdpc3RlciBmb3IgdGhlIHBvcnQuCisgICogQHJtdG9sbCBPRFIgICAgICAgICAgT0R5ICAgICAgICAgICBMTF9HUElPX1dyaXRlT3V0cHV0UG9ydAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQb3J0VmFsdWUgTGV2ZWwgdmFsdWUgZm9yIGVhY2ggcGluIG9mIHRoZSBwb3J0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9HUElPX1dyaXRlT3V0cHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQb3J0VmFsdWUpCit7CisgIFdSSVRFX1JFRyhHUElPeC0+T0RSLCBQb3J0VmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBmdWxsIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHZhbHVlIGZvciBhIGRlZGljYXRlZCBwb3J0LgorICAqIEBybXRvbGwgT0RSICAgICAgICAgIE9EeSAgICAgICAgICAgTExfR1BJT19SZWFkT3V0cHV0UG9ydAorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHJldHZhbCBPdXRwdXQgZGF0YSByZWdpc3RlciB2YWx1ZSBvZiBwb3J0CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19SZWFkT3V0cHV0UG9ydChHUElPX1R5cGVEZWYgKkdQSU94KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhHUElPeC0+T0RSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGlmIGlucHV0IGRhdGEgbGV2ZWwgZm9yIHNldmVyYWwgcGlucyBvZiBkZWRpY2F0ZWQgcG9ydCBpcyBoaWdoIG9yIGxvdy4KKyAgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fSXNPdXRwdXRQaW5TZXQKKyAgKiBAcGFyYW0gIEdQSU94IEdQSU8gUG9ydAorICAqIEBwYXJhbSAgUGluTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fQUxMCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR1BJT19Jc091dHB1dFBpblNldChHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChHUElPeC0+T0RSLCBQaW5NYXNrKSA9PSAoUGluTWFzaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2V2ZXJhbCBwaW5zIHRvIGhpZ2ggbGV2ZWwgb24gZGVkaWNhdGVkIGdwaW8gcG9ydC4KKyAgKiBAcm10b2xsIEJTUlIgICAgICAgICBCU3kgICAgICAgICAgIExMX0dQSU9fU2V0T3V0cHV0UGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRPdXRwdXRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgV1JJVEVfUkVHKEdQSU94LT5CU1JSLCBQaW5NYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2V2ZXJhbCBwaW5zIHRvIGxvdyBsZXZlbCBvbiBkZWRpY2F0ZWQgZ3BpbyBwb3J0LgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSeSAgICAgICAgICAgTExfR1BJT19SZXNldE91dHB1dFBpbgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHBhcmFtICBQaW5NYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl9BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fUmVzZXRPdXRwdXRQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgV1JJVEVfUkVHKEdQSU94LT5CUlIsIFBpbk1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRvZ2dsZSBkYXRhIHZhbHVlIGZvciBzZXZlcmFsIHBpbiBvZiBkZWRpY2F0ZWQgcG9ydC4KKyAgKiBAcm10b2xsIE9EUiAgICAgICAgICBPRHkgICAgICAgICAgIExMX0dQSU9fVG9nZ2xlUGluCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gIFBpbk1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfR1BJT19QSU5fMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9HUElPX1BJTl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fUElOX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19Ub2dnbGVQaW4oR1BJT19UeXBlRGVmICpHUElPeCwgdWludDMyX3QgUGluTWFzaykKK3sKKyAgV1JJVEVfUkVHKEdQSU94LT5PRFIsIFJFQURfUkVHKEdQSU94LT5PRFIpIF4gUGluTWFzayk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgR1BJT19MTF9FRl9Jbml0IEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94KTsKK0Vycm9yU3RhdHVzIExMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCBMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfR1BJT19TdHJ1Y3RJbml0KExMX0dQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChHUElPQSkgfHwgZGVmaW5lZCAoR1BJT0IpIHx8IGRlZmluZWQgKEdQSU9DKSB8fCBkZWZpbmVkIChHUElPRCkgfHwgZGVmaW5lZCAoR1BJT0UpIHx8IGRlZmluZWQgKEdQSU9IKSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9HUElPX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfaHNlbS5oIGIvSW5jL3N0bTMyd2J4eF9sbF9oc2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfaHNlbS5oCkBAIC0wLDAgKzEsODc5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2hzZW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSFNFTSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0hTRU1fSAorI2RlZmluZSBTVE0zMldCeHhfTExfSFNFTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChIU0VNKQorCisvKiogQGRlZmdyb3VwIEhTRU1fTEwgSFNFTQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEhTRU1fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEhTRU0gRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIU0VNX0xMX0VDX0NPUkVJRCBDT1JFSUQgRGVmaW5lcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0hTRU1fQ09SRUlEX05PTkUgICAgICAgICAgICAgMFUKKyNkZWZpbmUgTExfSFNFTV9DT1JFSURfQ1BVMSAgICAgICAgICAgICBIU0VNX0NSX0NPUkVJRF9DUFUxCisjZGVmaW5lIExMX0hTRU1fQ09SRUlEX0NQVTIgICAgICAgICAgICAgSFNFTV9DUl9DT1JFSURfQ1BVMgorI2RlZmluZSBMTF9IU0VNX0NPUkVJRCAgICAgICAgICAgICAgICAgIEhTRU1fQ1JfQ09SRUlEX0NVUlJFTlQKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFNFTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSFNFTV9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKworI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8wICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8xICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMQorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8yICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMgorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8zICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMworI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV80ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFNAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV81ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFNQorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV82ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFNgorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV83ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFNworI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV84ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFOAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV85ICAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFOQorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8xMCAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMTAKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMTEgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTExCisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzEyICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UxMgorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8xMyAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMTMKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMTQgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTE0CisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzE1ICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UxNQorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8xNiAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMTYKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMTcgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTE3CisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzE4ICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UxOAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8xOSAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMTkKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMjAgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTIwCisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzIxICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UyMQorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8yMiAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMjIKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMjMgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTIzCisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzI0ICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UyNAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8yNSAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMjUKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMjYgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTI2CisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzI3ICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UyNworI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8yOCAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMjgKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfMjkgICAgICAgICAgICAgICBIU0VNX0MxSUVSX0lTRTI5CisjZGVmaW5lIExMX0hTRU1fU0VNQVBIT1JFXzMwICAgICAgICAgICAgICAgSFNFTV9DMUlFUl9JU0UzMAorI2RlZmluZSBMTF9IU0VNX1NFTUFQSE9SRV8zMSAgICAgICAgICAgICAgIEhTRU1fQzFJRVJfSVNFMzEKKyNkZWZpbmUgTExfSFNFTV9TRU1BUEhPUkVfQUxMICAgICAgICAgICAgICAweEZGRkZGRkZGVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSFNFTV9MTF9FeHBvcnRlZF9NYWNyb3MgSFNFTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhTRU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBIU0VNIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSFNFTSBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfSFNFTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIEhTRU0gcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBIU0VNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0hTRU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEhTRU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIEhTRU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIU0VNX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDEgaWYgdGhlIHNlbWFwaG9yZSBpcyBsb2NrZWQsIGVsc2UgcmV0dXJuIDAuCisgICogQHJtdG9sbCBSICAgICAgICAgICAgTE9DSyAgICAgICAgICBMTF9IU0VNX0lzU2VtYXBob3JlTG9ja2VkCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlIFNlbWFwaG9yZSBudW1iZXIuIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IU0VNX0lzU2VtYXBob3JlTG9ja2VkKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSFNFTXgtPlJbU2VtYXBob3JlXSwgSFNFTV9SX0xPQ0spID09IChIU0VNX1JfTE9DS19Nc2spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvcmUgaWQuCisgICogQHJtdG9sbCBSICAgICAgICAgICAgQ09SRUlEICAgICAgICBMTF9IU0VNX0dldENvcmVJZAorICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNlbWFwaG9yZSBTZW1hcGhvcmUgbnVtYmVyLiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fQ09SRUlEX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX0NPUkVJRF9DUFUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9DT1JFSURfQ1BVMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fR2V0Q29yZUlkKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSFNFTXgtPlJbU2VtYXBob3JlXSwgSFNFTV9SX0NPUkVJRF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcHJvY2VzcyBpZC4KKyAgKiBAcm10b2xsIFIgICAgICAgICAgICBQUk9DSUQgICAgICAgIExMX0hTRU1fR2V0UHJvY2Vzc0lkCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlIFNlbWFwaG9yZSBudW1iZXIuIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIFByb2Nlc3MgbnVtYmVyLiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fR2V0UHJvY2Vzc0lkKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSFNFTXgtPlJbU2VtYXBob3JlXSwgSFNFTV9SX1BST0NJRF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGxvY2sgYnkgd3JpdGluZyBpbiBSIHJlZ2lzdGVyLgorICAqIEBub3RlIFRoZSBSIHJlZ2lzdGVyIGhhcyB0byBiZSByZWFkIHRvIGRldGVybWluZWQgaWYgdGhlIGxvY2sgaXMgdGFrZW4uCisgICogQHJtdG9sbCBSICAgICAgICAgICAgTE9DSyAgICAgICAgICBMTF9IU0VNX1NldExvY2sKKyAgKiBAcm10b2xsIFIgICAgICAgICAgICBDT1JFSUQgICAgICAgIExMX0hTRU1fU2V0TG9jaworICAqIEBybXRvbGwgUiAgICAgICAgICAgIFBST0NJRCAgICAgICAgTExfSFNFTV9TZXRMb2NrCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlIFNlbWFwaG9yZSBudW1iZXIuIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcGFyYW0gIHByb2Nlc3MgUHJvY2VzcyBpZC4gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hTRU1fU2V0TG9jayhIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmUsIHVpbnQzMl90IHByb2Nlc3MpCit7CisgIFdSSVRFX1JFRyhIU0VNeC0+UltTZW1hcGhvcmVdLCAoSFNFTV9SX0xPQ0sgfCBMTF9IU0VNX0NPUkVJRCB8IHByb2Nlc3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGxvY2sgd2l0aCAyLXN0ZXAgbG9jay4KKyAgKiBAcm10b2xsIFIgICAgICAgICAgICBMT0NLICAgICAgICAgIExMX0hTRU1fMlN0ZXBMb2NrCisgICogQHJtdG9sbCBSICAgICAgICAgICAgQ09SRUlEICAgICAgICBMTF9IU0VNXzJTdGVwTG9jaworICAqIEBybXRvbGwgUiAgICAgICAgICAgIFBST0NJRCAgICAgICAgTExfSFNFTV8yU3RlcExvY2sKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmUgU2VtYXBob3JlIG51bWJlci4gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEBwYXJhbSAgcHJvY2VzcyBQcm9jZXNzIGlkLiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQorICAqIEByZXR2YWwgMSBsb2NrIGZhaWwsIDAgbG9jayBzdWNjZXNzZnVsIG9yIGFscmVhZHkgbG9ja2VkIGJ5IHNhbWUgcHJvY2VzcyBhbmQgY29yZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fMlN0ZXBMb2NrKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSwgdWludDMyX3QgcHJvY2VzcykKK3sKKyAgV1JJVEVfUkVHKEhTRU14LT5SW1NlbWFwaG9yZV0sIChIU0VNX1JfTE9DSyB8IExMX0hTRU1fQ09SRUlEIHwgcHJvY2VzcykpOworICByZXR1cm4gKChIU0VNeC0+UltTZW1hcGhvcmVdICE9IChIU0VNX1JfTE9DSyB8IExMX0hTRU1fQ09SRUlEIHwgcHJvY2VzcykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGxvY2sgd2l0aCAxLXN0ZXAgbG9jay4KKyAgKiBAcm10b2xsIFJMUiAgICAgICAgICBMT0NLICAgICAgICAgIExMX0hTRU1fMVN0ZXBMb2NrCisgICogQHJtdG9sbCBSTFIgICAgICAgICAgQ09SRUlEICAgICAgICBMTF9IU0VNXzFTdGVwTG9jaworICAqIEBybXRvbGwgUkxSICAgICAgICAgIFBST0NJRCAgICAgICAgTExfSFNFTV8xU3RlcExvY2sKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmUgU2VtYXBob3JlIG51bWJlci4gVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgMSBsb2NrIGZhaWwsIDAgbG9jayBzdWNjZXNzZnVsIG9yIGFscmVhZHkgbG9ja2VkIGJ5IHNhbWUgY29yZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fMVN0ZXBMb2NrKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSkKK3sKKyAgcmV0dXJuICgoSFNFTXgtPlJMUltTZW1hcGhvcmVdICE9IChIU0VNX1JfTE9DSyB8IExMX0hTRU1fQ09SRUlEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgdGhlIGxvY2sgb2YgdGhlIHNlbWFwaG9yZS4KKyAgKiBAbm90ZSBJbiBjYXNlIG9mIExMX0hTRU1fMVN0ZXBMb2NrIHVzYWdlIHRvIGxvY2sgYSBzZW1hcGhvcmUsIHRoZSBwcm9jZXNzIGlzIDAuCisgICogQHJtdG9sbCBSICAgICAgICAgICAgTE9DSyAgICAgICAgICBMTF9IU0VNX1JlbGVhc2VMb2NrCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlIFNlbWFwaG9yZSBudW1iZXIuIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcGFyYW0gIHByb2Nlc3MgUHJvY2VzcyBudW1iZXIuIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IU0VNX1JlbGVhc2VMb2NrKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZSwgdWludDMyX3QgcHJvY2VzcykKK3sKKyAgV1JJVEVfUkVHKEhTRU14LT5SW1NlbWFwaG9yZV0sIChMTF9IU0VNX0NPUkVJRCB8IHByb2Nlc3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGxvY2sgc3RhdHVzIG9mIHRoZSBzZW1hcGhvcmUuCisgICogQHJtdG9sbCBSICAgICAgICAgICAgTE9DSyAgICAgICAgICBMTF9IU0VNX0dldFN0YXR1cworICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNlbWFwaG9yZSBTZW1hcGhvcmUgbnVtYmVyLiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCAwIHNlbWFwaG9yZSBpcyBmcmVlLCAxIHNlbWFwaG9yZSBpcyBsb2NrZWQgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFNFTV9HZXRTdGF0dXMoSFNFTV9UeXBlRGVmICpIU0VNeCwgdWludDMyX3QgU2VtYXBob3JlKQoreworICByZXR1cm4gKChIU0VNeC0+UltTZW1hcGhvcmVdICE9IDBVKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBrZXkuCisgICogQHJtdG9sbCBLRVlSICAgICAgICAgS0VZICAgICAgICAgICBMTF9IU0VNX1NldEtleQorICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIGtleSBLZXkgdmFsdWUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IU0VNX1NldEtleShIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBrZXkpCit7CisgIFdSSVRFX1JFRyhIU0VNeC0+S0VZUiwga2V5IDw8IEhTRU1fS0VZUl9LRVlfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGtleS4KKyAgKiBAcm10b2xsIEtFWVIgICAgICAgICBLRVkgICAgICAgICAgIExMX0hTRU1fR2V0S2V5CisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEByZXR2YWwga2V5IHRvIHVubG9jayBhbGwgc2VtYXBob3JlIGZyb20gdGhlIHNhbWUgY29yZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fR2V0S2V5KEhTRU1fVHlwZURlZiAqSFNFTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEhTRU14LT5LRVlSLCBIU0VNX0tFWVJfS0VZKSA+PiBIU0VNX0tFWVJfS0VZX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSBhbGwgc2VtYXBob3JlIHdpdGggdGhlIHNhbWUgY29yZSBpZC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0hTRU1fUmVzZXRBbGxMb2NrCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAga2V5IEtleSB2YWx1ZS4KKyAgKiBAcGFyYW0gIGNvcmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX0NPUkVJRF9DUFUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9DT1JFSURfQ1BVMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFNFTV9SZXNldEFsbExvY2soSFNFTV9UeXBlRGVmICpIU0VNeCwgdWludDMyX3Qga2V5LCB1aW50MzJfdCBjb3JlKQoreworICBXUklURV9SRUcoSFNFTXgtPkNSLCAoa2V5IDw8IEhTRU1fQ1JfS0VZX1BvcykgfCBjb3JlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIU0VNX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVycnVwdC4KKyAgKiBAcm10b2xsIEMxSUVSICAgICAgICAgSVNFTSAgICAgICAgICBMTF9IU0VNX0VuYWJsZUlUX0MxSUVSCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV9BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hTRU1fRW5hYmxlSVRfQzFJRVIoSFNFTV9UeXBlRGVmICpIU0VNeCwgdWludDMyX3QgU2VtYXBob3JlTWFzaykKK3sKKyAgU0VUX0JJVChIU0VNeC0+QzFJRVIsIFNlbWFwaG9yZU1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQzFJRVIgICAgICAgICAgSVNFTSAgICAgICAgICBMTF9IU0VNX0Rpc2FibGVJVF9DMUlFUgorICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNlbWFwaG9yZU1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IU0VNX0Rpc2FibGVJVF9DMUlFUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICBDTEVBUl9CSVQoSFNFTXgtPkMxSUVSLCBTZW1hcGhvcmVNYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIEMxSUVSICAgICAgICAgIElTRU0gICAgICAgICAgTExfSFNFTV9Jc0VuYWJsZWRJVF9DMUlFUgorICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNlbWFwaG9yZU1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfQUxMCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSFNFTV9Jc0VuYWJsZWRJVF9DMUlFUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChIU0VNeC0+QzFJRVIsIFNlbWFwaG9yZU1hc2spID09IChTZW1hcGhvcmVNYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDMklFUiAgICAgICAgIElTRU0gICAgICAgICAgTExfSFNFTV9FbmFibGVJVF9DMklFUgorICAqIEBwYXJhbSAgSFNFTXggSFNFTSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNlbWFwaG9yZU1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9IU0VNX0VuYWJsZUlUX0MySUVSKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZU1hc2spCit7CisgIFNFVF9CSVQoSFNFTXgtPkMySUVSLCBTZW1hcGhvcmVNYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVycnVwdC4KKyAgKiBAcm10b2xsIEMySUVSICAgICAgICAgIElTRU0gICAgICAgICAgTExfSFNFTV9EaXNhYmxlSVRfQzJJRVIKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmVNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFX0FMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSFNFTV9EaXNhYmxlSVRfQzJJRVIoSFNFTV9UeXBlRGVmICpIU0VNeCwgdWludDMyX3QgU2VtYXBob3JlTWFzaykKK3sKKyAgQ0xFQVJfQklUKEhTRU14LT5DMklFUiwgU2VtYXBob3JlTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgaW50ZXJydXB0IGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDMklFUiAgICAgICAgICBJU0VNICAgICAgICAgIExMX0hTRU1fSXNFbmFibGVkSVRfQzJJRVIKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmVNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fSXNFbmFibGVkSVRfQzJJRVIoSFNFTV9UeXBlRGVmICpIU0VNeCwgdWludDMyX3QgU2VtYXBob3JlTWFzaykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSFNFTXgtPkMySUVSLCBTZW1hcGhvcmVNYXNrKSA9PSAoU2VtYXBob3JlTWFzaykpID8gMVVMIDogMFVMKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFNFTV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzLgorICAqIEBybXRvbGwgQzFJQ1IgICAgICAgICBJU0VNICAgICAgICAgIExMX0hTRU1fQ2xlYXJGbGFnX0MxSUNSCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV9BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hTRU1fQ2xlYXJGbGFnX0MxSUNSKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZU1hc2spCit7CisgIFdSSVRFX1JFRyhIU0VNeC0+QzFJQ1IsIFNlbWFwaG9yZU1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQzFJU1IgICAgICAgICBJU0VNICAgICAgICAgIExMX0hTRU1fSXNBY3RpdmVGbGFnX0MxSVNSCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV9BTEwKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IU0VNX0lzQWN0aXZlRmxhZ19DMUlTUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChIU0VNeC0+QzFJU1IsIFNlbWFwaG9yZU1hc2spID09IChTZW1hcGhvcmVNYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gTUlTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIEMxTUlTUiAgICAgICAgSVNFTSAgICAgICAgICBMTF9IU0VNX0lzQWN0aXZlRmxhZ19DMU1JU1IKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmVNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fSXNBY3RpdmVGbGFnX0MxTUlTUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChIU0VNeC0+QzFNSVNSLCBTZW1hcGhvcmVNYXNrKSA9PSAoU2VtYXBob3JlTWFzaykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzLgorICAqIEBybXRvbGwgQzJJQ1IgICAgICAgICBJU0VNICAgICAgICAgIExMX0hTRU1fQ2xlYXJGbGFnX0MySUNSCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV9BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0hTRU1fQ2xlYXJGbGFnX0MySUNSKEhTRU1fVHlwZURlZiAqSFNFTXgsIHVpbnQzMl90IFNlbWFwaG9yZU1hc2spCit7CisgIFdSSVRFX1JFRyhIU0VNeC0+QzJJQ1IsIFNlbWFwaG9yZU1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQzJJU1IgICAgICAgICBJU0VNICAgICAgICAgIExMX0hTRU1fSXNBY3RpdmVGbGFnX0MySVNSCisgICogQHBhcmFtICBIU0VNeCBIU0VNIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2VtYXBob3JlTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV9BTEwKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9IU0VNX0lzQWN0aXZlRmxhZ19DMklTUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChIU0VNeC0+QzJJU1IsIFNlbWFwaG9yZU1hc2spID09IChTZW1hcGhvcmVNYXNrKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gTUlTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIEMyTUlTUiAgICAgICAgSVNFTSAgICAgICAgICBMTF9IU0VNX0lzQWN0aXZlRmxhZ19DMk1JU1IKKyAgKiBAcGFyYW0gIEhTRU14IEhTRU0gSW5zdGFuY2UuCisgICogQHBhcmFtICBTZW1hcGhvcmVNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfSFNFTV9TRU1BUEhPUkVfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9IU0VNX1NFTUFQSE9SRV8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0hTRU1fU0VNQVBIT1JFX0FMTAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0hTRU1fSXNBY3RpdmVGbGFnX0MyTUlTUihIU0VNX1R5cGVEZWYgKkhTRU14LCB1aW50MzJfdCBTZW1hcGhvcmVNYXNrKQoreworICByZXR1cm4gKChSRUFEX0JJVChIU0VNeC0+QzJNSVNSLCBTZW1hcGhvcmVNYXNrKSA9PSAoU2VtYXBob3JlTWFzaykpID8gMVVMIDogMFVMKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKEhTRU0pICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyV0J4eF9MTF9IU0VNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfaTJjLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzMyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2kyYy5oCkBAIC0wLDAgKzEsMjIyOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9pMmMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSTJDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfSTJDX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX0kyQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSTJDMSkgfHwgZGVmaW5lZCAoSTJDMykKKworLyoqIEBkZWZncm91cCBJMkNfTEwgSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEkyQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBJMkMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX1ByaXZhdGVfTWFjcm9zIEkyQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VTX0lOSVQgSTJDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaGVyYWxNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfTExfRUNfUEVSSVBIRVJBTF9NT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRNb2RlKCkuICovCisKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2QgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IGJ5IHJlZmVycmluZyB0byB0aGUgU1RNMzJDdWJlTVggVG9vbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVscGVyIG1hY3JvIEByZWYgX19MTF9JMkNfQ09OVkVSVF9USU1JTkdTKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX1NldFRpbWluZygpLiAqLworCisgIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcjsgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyBhbmFsb2cgbm9pc2UgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgSTJDX0xMX0VDX0FOQUxPR0ZJTFRFUl9TRUxFQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX0kyQ19FbmFibGVBbmFsb2dGaWx0ZXIoKSBvciBMTF9JMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcigpLiAqLworCisgIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXI7ICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4MEYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX1NldERpZ2l0YWxGaWx0ZXIoKS4gKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGV2aWNlIG93biBhZGRyZXNzIDEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4M0ZGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19TZXRPd25BZGRyZXNzMSgpLiAqLworCisgIHVpbnQzMl90IFR5cGVBY2tub3dsZWRnZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBBQ0tub3dsZWRnZSBvciBOb24gQUNLbm93bGVkZ2UgY29uZGl0aW9uIGFmdGVyIHRoZSBhZGRyZXNzIHJlY2VpdmUgbWF0Y2ggY29kZSBvciBuZXh0IHJlY2VpdmVkIGJ5dGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfTExfRUNfSTJDX0FDS05PV0xFREdFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKCkuICovCisKKyAgdWludDMyX3QgT3duQWRkclNpemU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRldmljZSBvd24gYWRkcmVzcyAxIHNpemUgKDctYml0IG9yIDEwLWJpdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBJMkNfTExfRUNfT1dOQUREUkVTUzEKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfSTJDX1NldE93bkFkZHJlc3MxKCkuICovCit9IExMX0kyQ19Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEkyQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0kyQ19Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfQUREUkNGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfQUREUkNGICAgICAgICAgIC8qITwgQWRkcmVzcyBNYXRjaGVkIGZsYWcgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX05BQ0tDRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX05BQ0tDRiAgICAgICAgICAvKiE8IE5vdCBBY2tub3dsZWRnZSBmbGFnICAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9TVE9QQ0YgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9TVE9QQ0YgICAgICAgICAgLyohPCBTdG9wIGRldGVjdGlvbiBmbGFnICAgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfQkVSUkNGICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfQkVSUkNGICAgICAgICAgIC8qITwgQnVzIGVycm9yIGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX0FSTE9DRiAgICAgICAgICAgICAgICAgICBJMkNfSUNSX0FSTE9DRiAgICAgICAgICAvKiE8IEFyYml0cmF0aW9uIExvc3QgZmxhZyAgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9PVlJDRiAgICAgICAgICAgICAgICAgICAgSTJDX0lDUl9PVlJDRiAgICAgICAgICAgLyohPCBPdmVycnVuL1VuZGVycnVuIGZsYWcgICovCisjZGVmaW5lIExMX0kyQ19JQ1JfUEVDQ0YgICAgICAgICAgICAgICAgICAgIEkyQ19JQ1JfUEVDQ0YgICAgICAgICAgIC8qITwgUEVDIGVycm9yIGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSUNSX1RJTU9VVENGICAgICAgICAgICAgICAgICBJMkNfSUNSX1RJTU9VVENGICAgICAgICAvKiE8IFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfSTJDX0lDUl9BTEVSVENGICAgICAgICAgICAgICAgICAgSTJDX0lDUl9BTEVSVENGICAgICAgICAgLyohPCBBbGVydCBmbGFnICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSTJDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RYRSAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RYRSAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfVFhJUyAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVFhJUyAgICAgICAgICAgIC8qITwgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cyAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9SWE5FICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9SWE5FICAgICAgICAgICAgLyohPCBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX0FERFIgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FERFIgICAgICAgICAgICAvKiE8IEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfTkFDS0YgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfTkFDS0YgICAgICAgICAgIC8qITwgTm90IEFja25vd2xlZGdlIHJlY2VpdmVkIGZsYWcgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9TVE9QRiAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9TVE9QRiAgICAgICAgICAgLyohPCBTdG9wIGRldGVjdGlvbiBmbGFnICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RDICAgICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RDICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIChtYXN0ZXIgbW9kZSkgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfVENSICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfVENSICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9CRVJSICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CRVJSICAgICAgICAgICAgLyohPCBCdXMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfSVNSX0FSTE8gICAgICAgICAgICAgICAgICAgICBJMkNfSVNSX0FSTE8gICAgICAgICAgICAvKiE8IEFyYml0cmF0aW9uIGxvc3QgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19JU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfT1ZSICAgICAgICAgICAgIC8qITwgT3ZlcnJ1bi9VbmRlcnJ1biAoc2xhdmUgbW9kZSkgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9QRUNFUlIgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9QRUNFUlIgICAgICAgICAgLyohPCBQRUMgRXJyb3IgaW4gcmVjZXB0aW9uIChTTUJ1cyBtb2RlKSAqLworI2RlZmluZSBMTF9JMkNfSVNSX1RJTUVPVVQgICAgICAgICAgICAgICAgICBJMkNfSVNSX1RJTUVPVVQgICAgICAgICAvKiE8IFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgKFNNQnVzIG1vZGUpICovCisjZGVmaW5lIExMX0kyQ19JU1JfQUxFUlQgICAgICAgICAgICAgICAgICAgIEkyQ19JU1JfQUxFUlQgICAgICAgICAgIC8qITwgU01CdXMgYWxlcnQgKFNNQnVzIG1vZGUpICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0lTUl9CVVNZICAgICAgICAgICAgICAgICAgICAgSTJDX0lTUl9CVVNZICAgICAgICAgICAgLyohPCBCdXMgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfSTJDX1JlYWRSZWcgYW5kICBMTF9JMkNfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9UWElFICAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9UWElFICAgICAgICAgICAgLyohPCBUWCBJbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfUlhJRSAgICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfUlhJRSAgICAgICAgICAgIC8qITwgUlggSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX0FERFJJRSAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX0FERFJJRSAgICAgICAgICAvKiE8IEFkZHJlc3MgbWF0Y2ggSW50ZXJydXB0IGVuYWJsZSAoc2xhdmUgb25seSkgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9OQUNLSUUgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9OQUNLSUUgICAgICAgICAgLyohPCBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgSW50ZXJydXB0IGVuYWJsZSAgICovCisjZGVmaW5lIExMX0kyQ19DUjFfU1RPUElFICAgICAgICAgICAgICAgICAgIEkyQ19DUjFfU1RPUElFICAgICAgICAgIC8qITwgU1RPUCBkZXRlY3Rpb24gSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfQ1IxX1RDSUUgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IxX1RDSUUgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdCBlbmFibGUgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0NSMV9FUlJJRSAgICAgICAgICAgICAgICAgICAgSTJDX0NSMV9FUlJJRSAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHRzIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19QRVJJUEhFUkFMX01PREUgUGVyaXBoZXJhbCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfSTJDICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBJMkMgTWFzdGVyIG9yIFNsYXZlIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19IT1NUICAgICAgICAgICAgIEkyQ19DUjFfU01CSEVOICAgICAgICAgICAvKiE8IFNNQnVzIEhvc3QgYWRkcmVzcyBhY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgU01CdXMgRGV2aWNlIGRlZmF1bHQgbW9kZSAoRGVmYXVsdCBhZGRyZXNzIG5vdCBhY2tub3dsZWRnZSkgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfREVWSUNFX0FSUCAgICAgICBJMkNfQ1IxX1NNQkRFTiAgICAgICAgICAgLyohPCBTTUJ1cyBEZXZpY2UgRGVmYXVsdCBhZGRyZXNzIGFja25vd2xlZGdlICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQU5BTE9HRklMVEVSX1NFTEVDVElPTiBBbmFsb2cgRmlsdGVyIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQW5hbG9nIGZpbHRlciBpcyBlbmFibGVkLiAgKi8KKyNkZWZpbmUgTExfSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFICAgICAgICAgSTJDX0NSMV9BTkZPRkYgICAgICAgICAgLyohPCBBbmFsb2cgZmlsdGVyIGlzIGRpc2FibGVkLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfQUREUkVTU0lOR19NT0RFIE1hc3RlciBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzdCSVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgb3BlcmF0ZXMgaW4gNy1iaXQgYWRkcmVzc2luZyBtb2RlLiAqLworI2RlZmluZSBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzEwQklUICAgICAgICBJMkNfQ1IyX0FERDEwICAgICAgICAgICAgLyohPCBNYXN0ZXIgb3BlcmF0ZXMgaW4gMTAtYml0IGFkZHJlc3NpbmcgbW9kZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfT1dOQUREUkVTUzEgT3duIEFkZHJlc3MgMSBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzFfN0JJVCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE93biBhZGRyZXNzIDEgaXMgYSA3LWJpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzFfMTBCSVQgICAgICAgICAgICBJMkNfT0FSMV9PQTFNT0RFICAgICAgICAvKiE8IE93biBhZGRyZXNzIDEgaXMgYSAxMC1iaXQgYWRkcmVzcy4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfT1dOQUREUkVTUzIgT3duIEFkZHJlc3MgMiBNYXNrcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9OT01BU0sgICAgICAgICAgIEkyQ19PQVIyX09BMk5PTUFTSyAgICAgIC8qITwgT3duIEFkZHJlc3MyIE5vIG1hc2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAxICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDEgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjJdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swMiAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzAyICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzozXSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDMgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swMyAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6NF0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA0ICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDQgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjVdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX09XTkFERFJFU1MyX01BU0swNSAgICAgICAgICAgSTJDX09BUjJfT0EyTUFTSzA1ICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzo2XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDYgICAgICAgICAgIEkyQ19PQVIyX09BMk1BU0swNiAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzddIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA3ICAgICAgICAgICBJMkNfT0FSMl9PQTJNQVNLMDcgICAgICAvKiE8IE5vIGNvbXBhcmlzb24gaXMgZG9uZS4gQWxsIEFkZHJlc3MyIGFyZSBhY2tub3dsZWRnZWQuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0kyQ19BQ0tOT1dMRURHRSBBY2tub3dsZWRnZSBHZW5lcmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgQUNLIGlzIHNlbnQgYWZ0ZXIgY3VycmVudCByZWNlaXZlZCBieXRlLiAqLworI2RlZmluZSBMTF9JMkNfTkFDSyAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ1IyX05BQ0sgICAgICAgICAgICAgLyohPCBOQUNLIGlzIHNlbnQgYWZ0ZXIgY3VycmVudCByZWNlaXZlZCBieXRlLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19BRERSU0xBVkUgU2xhdmUgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfQUREUlNMQVZFXzdCSVQgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBTbGF2ZSBBZGRyZXNzIGluIDctYml0LiAqLworI2RlZmluZSBMTF9JMkNfQUREUlNMQVZFXzEwQklUICAgICAgICAgICAgICBJMkNfQ1IyX0FERDEwICAgICAgICAgICAgLyohPCBTbGF2ZSBBZGRyZXNzIGluIDEwLWJpdC4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfUkVRVUVTVCBUcmFuc2ZlciBSZXF1ZXN0IERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19SRVFVRVNUX1dSSVRFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IE1hc3RlciByZXF1ZXN0IGEgd3JpdGUgdHJhbnNmZXIuICovCisjZGVmaW5lIExMX0kyQ19SRVFVRVNUX1JFQUQgICAgICAgICAgICAgICAgIEkyQ19DUjJfUkRfV1JOICAgICAgICAgICAvKiE8IE1hc3RlciByZXF1ZXN0IGEgcmVhZCB0cmFuc2Zlci4gICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19NT0RFIFRyYW5zZmVyIEVuZCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfUkVMT0FEICAgICAgICAgICAgICAgICAgSTJDX0NSMl9SRUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEkyQyBSZWxvYWQgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX0FVVE9FTkQgICAgICAgICAgICAgICAgIEkyQ19DUjJfQVVUT0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBJMkMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggbm8gSFcgUEVDIGNvbXBhcmlzb24uICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TT0ZURU5EICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgSTJDIFNvZnR3YXJlIGVuZCBtb2RlIHdpdGggbm8gSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfUkVMT0FEICAgICAgICAgICAgTExfSTJDX01PREVfUkVMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFNNQlVTIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfTk9fUEVDICAgIExMX0kyQ19NT0RFX0FVVE9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX05PX1BFQyAgICBMTF9JMkNfTU9ERV9TT0ZURU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgU01CVVMgU29mdHdhcmUgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAgKi8KKyNkZWZpbmUgTExfSTJDX01PREVfU01CVVNfQVVUT0VORF9XSVRIX1BFQyAgKHVpbnQzMl90KShMTF9JMkNfTU9ERV9BVVRPRU5EIHwgSTJDX0NSMl9QRUNCWVRFKSAgIC8qITwgRW5hYmxlIFNNQlVTIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0kyQ19NT0RFX1NNQlVTX1NPRlRFTkRfV0lUSF9QRUMgICh1aW50MzJfdCkoTExfSTJDX01PREVfU09GVEVORCB8IEkyQ19DUjJfUEVDQllURSkgICAvKiE8IEVuYWJsZSBTTUJVUyBTb2Z0d2FyZSBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfR0VORVJBVEUgU3RhcnQgQW5kIFN0b3AgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9OT1NUQVJUU1RPUCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRG9uJ3QgR2VuZXJhdGUgU3RvcCBhbmQgU3RhcnQgY29uZGl0aW9uLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfU1RPUCAgICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFN0b3AgY29uZGl0aW9uIChTaXplIHNob3VsZCBiZSBzZXQgdG8gMCkuICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1JEX1dSTikgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBTdGFydCBmb3IgcmVhZCByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9TVEFSVF9XUklURSAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgU3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF83QklUX1JFQUQgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfUkRfV1JOKSAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdCwgc2xhdmUgN0JpdCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9XUklURSAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEkyQ19DUjJfU1RBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LCBzbGF2ZSA3Qml0IGFkZHJlc3MuICovCisjZGVmaW5lIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzEwQklUX1JFQUQgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBJMkNfQ1IyX1NUQVJUIHwgSTJDX0NSMl9SRF9XUk4gfCBJMkNfQ1IyX0hFQUQxMFIpIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LCBzbGF2ZSAxMEJpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9XUklURSAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgSTJDX0NSMl9TVEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QsIHNsYXZlIDEwQml0IGFkZHJlc3MuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VDX0RJUkVDVElPTiBSZWFkIFdyaXRlIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19ESVJFQ1RJT05fV1JJVEUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IFdyaXRlIHRyYW5zZmVyIHJlcXVlc3QgYnkgbWFzdGVyLCBzbGF2ZSBlbnRlcnMgcmVjZWl2ZXIgbW9kZS4gICovCisjZGVmaW5lIExMX0kyQ19ESVJFQ1RJT05fUkVBRCAgICAgICAgICAgICAgIEkyQ19JU1JfRElSICAgICAgICAgICAgICAvKiE8IFJlYWQgdHJhbnNmZXIgcmVxdWVzdCBieSBtYXN0ZXIsIHNsYXZlIGVudGVycyB0cmFuc21pdHRlciBtb2RlLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19ETUFfUkVHX0RBVEEgRE1BIFJlZ2lzdGVyIERhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JMkNfRE1BX1JFR19EQVRBX1RSQU5TTUlUICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9JMkNfRE1BX1JFR19EQVRBX1JFQ0VJVkUgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHJlY2VwdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUNfU01CVVNfVElNRU9VVEFfTU9ERSBTTUJ1cyBUaW1lb3V0QSBNb2RlIFNDTCBTREEgVGltZW91dAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NDTF9MT1cgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFRpbWVvdXRBIGlzIHVzZWQgdG8gZGV0ZWN0IFNDTCBsb3cgbGV2ZWwgdGltZW91dC4gICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSCBJMkNfVElNRU9VVFJfVElETEUgICAvKiE8IFRpbWVvdXRBIGlzIHVzZWQgdG8gZGV0ZWN0IGJvdGggU0NMIGFuZCBTREEgaGlnaCBsZXZlbCB0aW1lb3V0LiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FQ19TTUJVU19USU1FT1VUX1NFTEVDVElPTiBTTUJ1cyBUaW1lb3V0IFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0kyQ19TTUJVU19USU1FT1VUQSAgICAgICAgICAgICAgIEkyQ19USU1FT1VUUl9USU1PVVRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0QSBlbmFibGUgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9JMkNfU01CVVNfVElNRU9VVEIgICAgICAgICAgICAgICBJMkNfVElNRU9VVFJfVEVYVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZW91dEIgKGV4dGVuZGVkIGNsb2NrKSBlbmFibGUgYml0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfSTJDX1NNQlVTX0FMTF9USU1FT1VUICAgICAgICAgICAgKHVpbnQzMl90KShJMkNfVElNRU9VVFJfVElNT1VURU4gfCBJMkNfVElNRU9VVFJfVEVYVEVOKSAvKiE8IFRpbWVvdXRBIGFuZCBUaW1lb3V0QiAoZXh0ZW5kZWQgY2xvY2spIGVuYWJsZSBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJMkNfTExfRXhwb3J0ZWRfTWFjcm9zIEkyQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEkyQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEkyQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfSTJDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gSTJDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSTJDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0kyQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRU1fQ09OVkVSVF9USU1JTkdTIENvbnZlcnQgU0RBIFNDTCB0aW1pbmdzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGLgorICAqIEBwYXJhbSAgX19EQVRBX1NFVFVQX1RJTUVfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEYuICh0c2NsZGVsID0gKFNDTERFTCsxKXh0cHJlc2MpCisgICogQHBhcmFtICBfX0RBVEFfSE9MRF9USU1FX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGLiAodHNkYWRlbCA9IFNEQURFTHh0cHJlc2MpCisgICogQHBhcmFtICBfX0NMT0NLX0hJR0hfUEVSSU9EX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRi4gKHRzY2xoID0gKFNDTEgrMSl4dHByZXNjKQorICAqIEBwYXJhbSAgX19DTE9DS19MT1dfUEVSSU9EX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkYuICh0c2NsbCA9IChTQ0xMKzEpeHRwcmVzYykKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqLworI2RlZmluZSBfX0xMX0kyQ19DT05WRVJUX1RJTUlOR1MoX19QUkVTQ0FMRVJfXywgX19EQVRBX1NFVFVQX1RJTUVfXywgX19EQVRBX0hPTERfVElNRV9fLCBfX0NMT0NLX0hJR0hfUEVSSU9EX18sIF9fQ0xPQ0tfTE9XX1BFUklPRF9fKSAgIFwKKyAgICAgICAgKCgoKHVpbnQzMl90KShfX1BSRVNDQUxFUl9fKSAgICAgICAgIDw8IEkyQ19USU1JTkdSX1BSRVNDX1BvcykgICYgSTJDX1RJTUlOR1JfUFJFU0MpICAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19EQVRBX1NFVFVQX1RJTUVfXykgICA8PCBJMkNfVElNSU5HUl9TQ0xERUxfUG9zKSAmIEkyQ19USU1JTkdSX1NDTERFTCkgIHwgXAorICAgICAgICAgKCgodWludDMyX3QpKF9fREFUQV9IT0xEX1RJTUVfXykgICAgPDwgSTJDX1RJTUlOR1JfU0RBREVMX1BvcykgJiBJMkNfVElNSU5HUl9TREFERUwpICB8IFwKKyAgICAgICAgICgoKHVpbnQzMl90KShfX0NMT0NLX0hJR0hfUEVSSU9EX18pIDw8IEkyQ19USU1JTkdSX1NDTEhfUG9zKSAgICYgSTJDX1RJTUlOR1JfU0NMSCkgICAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19DTE9DS19MT1dfUEVSSU9EX18pICA8PCBJMkNfVElNSU5HUl9TQ0xMX1BvcykgICAmIEkyQ19USU1JTkdSX1NDTEwpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSTJDIHBlcmlwaGVyYWwgKFBFID0gMSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEUgICAgICAgICAgICBMTF9JMkNfRW5hYmxlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyQyBwZXJpcGhlcmFsIChQRSA9IDApLgorICAqIEBub3RlICAgV2hlbiBQRSA9IDAsIHRoZSBJMkMgU0NMIGFuZCBTREEgbGluZXMgYXJlIHJlbGVhc2VkLgorICAqICAgICAgICAgSW50ZXJuYWwgc3RhdGUgbWFjaGluZXMgYW5kIHN0YXR1cyBiaXRzIGFyZSBwdXQgYmFjayB0byB0aGVpciByZXNldCB2YWx1ZS4KKyAgKiAgICAgICAgIFdoZW4gY2xlYXJlZCwgUEUgbXVzdCBiZSBrZXB0IGxvdyBmb3IgYXQgbGVhc3QgMyBBUEIgY2xvY2sgY3ljbGVzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFICAgICAgICAgICAgTExfSTJDX0Rpc2FibGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBJMkMgcGVyaXBoZXJhbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFICAgICAgICAgICAgTExfSTJDX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFKSA9PSAoSTJDX0NSMV9QRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTm9pc2UgRmlsdGVycyAoQW5hbG9nIGFuZCBEaWdpdGFsKS4KKyAgKiBAbm90ZSAgIElmIHRoZSBhbmFsb2cgZmlsdGVyIGlzIGFsc28gZW5hYmxlZCwgdGhlIGRpZ2l0YWwgZmlsdGVyIGlzIGFkZGVkIHRvIGFuYWxvZyBmaWx0ZXIuCisgICogICAgICAgICBUaGUgZmlsdGVycyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTkZPRkYgICAgICAgIExMX0kyQ19Db25maWdGaWx0ZXJzXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0kyQ19Db25maWdGaWx0ZXJzCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19Db25maWdGaWx0ZXJzKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRiB8IEkyQ19DUjFfRE5GLCBBbmFsb2dGaWx0ZXIgfCAoRGlnaXRhbEZpbHRlciA8PCBJMkNfQ1IxX0RORl9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgRGlnaXRhbCBOb2lzZSBGaWx0ZXIuCisgICogQG5vdGUgICBJZiB0aGUgYW5hbG9nIGZpbHRlciBpcyBhbHNvIGVuYWJsZWQsIHRoZSBkaWdpdGFsIGZpbHRlciBpcyBhZGRlZCB0byBhbmFsb2cgZmlsdGVyLgorICAqICAgICAgICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRE5GICAgICAgICAgICBMTF9JMkNfU2V0RGlnaXRhbEZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXREaWdpdGFsRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMSwgSTJDX0NSMV9ETkYsIERpZ2l0YWxGaWx0ZXIgPDwgSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgRGlnaXRhbCBOb2lzZSBGaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0kyQ19HZXREaWdpdGFsRmlsdGVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0RGlnaXRhbEZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0RORikgPj4gSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQW5hbG9nIE5vaXNlIEZpbHRlci4KKyAgKiBAbm90ZSAgIFRoaXMgZmlsdGVyIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFORk9GRiAgICAgICAgTExfSTJDX0VuYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlQW5hbG9nRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FORk9GRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbmFsb2cgTm9pc2UgRmlsdGVyLgorICAqIEBub3RlICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9JMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQU5GT0ZGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBbmFsb2cgTm9pc2UgRmlsdGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9JMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQU5GT0ZGKSAhPSAoSTJDX0NSMV9BTkZPRkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMkNfRW5hYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVETUFSZXFfVFgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIHRyYW5zbWlzc2lvbiByZXF1ZXN0cy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWERNQUVOICAgICAgIExMX0kyQ19EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlRE1BUmVxX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9JMkNfSXNFbmFibGVkRE1BUmVxX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkRE1BUmVxX1RYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVFhETUFFTikgPT0gKEkyQ19DUjFfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIHJlY2VwdGlvbiByZXF1ZXN0cy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyQ19FbmFibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZURNQVJlcV9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgcmVjZXB0aW9uIHJlcXVlc3RzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfSTJDX0Rpc2FibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVETUFSZXFfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIHJlY2VwdGlvbiByZXF1ZXN0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWERNQUVOICAgICAgIExMX0kyQ19Jc0VuYWJsZWRETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRETUFSZXFfUlgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWERNQUVOKSA9PSAoSTJDX0NSMV9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgVFhEUiAgICAgICAgIFRYREFUQSAgICAgICAgTExfSTJDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIFJYRFIgICAgICAgICBSWERBVEEgICAgICAgIExMX0kyQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19ETUFfR2V0UmVnQWRkcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfSTJDX0RNQV9SRUdfREFUQV9UUkFOU01JVCkKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFRYRFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChJMkN4LT5UWERSKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBSWERSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoSTJDeC0+UlhEUik7CisgIH0KKworICByZXR1cm4gZGF0YV9yZWdfYWRkcjsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgc3RyZXRjaGluZy4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5PU1RSRVRDSCAgICAgTExfSTJDX0VuYWJsZUNsb2NrU3RyZXRjaGluZworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlQ2xvY2tTdHJldGNoaW5nKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX05PU1RSRVRDSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDbG9jayBzdHJldGNoaW5nLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTk9TVFJFVENIICAgICBMTF9JMkNfRGlzYWJsZUNsb2NrU3RyZXRjaGluZworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUNsb2NrU3RyZXRjaGluZyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTk9TVFJFVENIKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDbG9jayBzdHJldGNoaW5nIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTk9TVFJFVENIICAgICBMTF9JMkNfSXNFbmFibGVkQ2xvY2tTdHJldGNoaW5nCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNFbmFibGVkQ2xvY2tTdHJldGNoaW5nKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTk9TVFJFVENIKSAhPSAoSTJDX0NSMV9OT1NUUkVUQ0gpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGhhcmR3YXJlIGJ5dGUgY29udHJvbCBpbiBzbGF2ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2woSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NCQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTQkMgICAgICAgICAgIExMX0kyQ19EaXNhYmxlU2xhdmVCeXRlQ29udHJvbAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNsYXZlQnl0ZUNvbnRyb2woSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU0JDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfSTJDX0lzRW5hYmxlZFNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTbGF2ZUJ5dGVDb250cm9sKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfU0JDKSA9PSAoSTJDX0NSMV9TQkMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2V1cCBmcm9tIFNUT1AuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0kyQ19XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2VVcEZyb21TdG9wIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIERpZ2l0YWwgRmlsdGVyIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdVUEVOICAgICAgICAgTExfSTJDX0VuYWJsZVdha2VVcEZyb21TdG9wCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVXYWtlVXBGcm9tU3RvcChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfV1VQRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgV2FrZXVwIGZyb20gU1RPUC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZVVwRnJvbVN0b3AgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV1VQRU4gICAgICAgICBMTF9JMkNfRGlzYWJsZVdha2VVcEZyb21TdG9wCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlV2FrZVVwRnJvbVN0b3AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfV1VQRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFdha2V1cCBmcm9tIFNUT1AgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZVVwRnJvbVN0b3AgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV1VQRU4gICAgICAgICBMTF9JMkNfSXNFbmFibGVkV2FrZVVwRnJvbVN0b3AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRXYWtlVXBGcm9tU3RvcChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1dVUEVOKSA9PSAoSTJDX0NSMV9XVVBFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgR2VuZXJhbCBDYWxsLgorICAqIEBub3RlICAgV2hlbiBlbmFibGVkIHRoZSBBZGRyZXNzIDB4MDAgaXMgQUNLZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9JMkNfRW5hYmxlR2VuZXJhbENhbGwKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUdlbmVyYWxDYWxsKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9HQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEdlbmVyYWwgQ2FsbC4KKyAgKiBAbm90ZSAgIFdoZW4gZGlzYWJsZWQgdGhlIEFkZHJlc3MgMHgwMCBpcyBOQUNLZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9JMkNfRGlzYWJsZUdlbmVyYWxDYWxsCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlR2VuZXJhbENhbGwoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfR0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR2VuZXJhbCBDYWxsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkR2VuZXJhbENhbGwKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRHZW5lcmFsQ2FsbChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0dDRU4pID09IChJMkNfQ1IxX0dDRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBNYXN0ZXIgdG8gb3BlcmF0ZSBpbiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhpcyBiaXQgaXMgbm90IGFsbG93ZWQsIHdoZW4gdGhlIFNUQVJUIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9JMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQWRkcmVzc2luZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUkVTU0lOR19NT0RFXzEwQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9BREQxMCwgQWRkcmVzc2luZ01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTWFzdGVyIGFkZHJlc3NpbmcgbW9kZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQxMCAgICAgICAgIExMX0kyQ19HZXRNYXN0ZXJBZGRyZXNzaW5nTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSRVNTSU5HX01PREVfN0JJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19BRERSRVNTSU5HX01PREVfMTBCSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BREQxMCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgT3duIEFkZHJlc3MxLgorICAqIEBybXRvbGwgT0FSMSAgICAgICAgIE9BMSAgICAgICAgICAgTExfSTJDX1NldE93bkFkZHJlc3MxXG4KKyAgKiAgICAgICAgIE9BUjEgICAgICAgICBPQTFNT0RFICAgICAgIExMX0kyQ19TZXRPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBPd25BZGRyZXNzMSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDNGRi4KKyAgKiBAcGFyYW0gIE93bkFkZHJTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MxXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzFfMTBCSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRPd25BZGRyZXNzMShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgT3duQWRkcmVzczEsIHVpbnQzMl90IE93bkFkZHJTaXplKQoreworICBNT0RJRllfUkVHKEkyQ3gtPk9BUjEsIEkyQ19PQVIxX09BMSB8IEkyQ19PQVIxX09BMU1PREUsIE93bkFkZHJlc3MxIHwgT3duQWRkclNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2tub3dsZWRnZSBvbiBPd24gQWRkcmVzczEgbWF0Y2ggYWRkcmVzcy4KKyAgKiBAcm10b2xsIE9BUjEgICAgICAgICBPQTFFTiAgICAgICAgIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlT3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+T0FSMSwgSTJDX09BUjFfT0ExRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MxIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MxCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczEoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5PQVIxLCBJMkNfT0FSMV9PQTFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgT3duIEFkZHJlc3MxIGFja25vd2xlZGdlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRPd25BZGRyZXNzMShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+T0FSMSwgSTJDX09BUjFfT0ExRU4pID09IChJMkNfT0FSMV9PQTFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIDdiaXRzIE93biBBZGRyZXNzMi4KKyAgKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYgb3duIGFkZHJlc3MyIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyICAgICAgICAgICBMTF9JMkNfU2V0T3duQWRkcmVzczJcbgorICAqICAgICAgICAgT0FSMiAgICAgICAgIE9BMk1TSyAgICAgICAgTExfSTJDX1NldE93bkFkZHJlc3MyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIE93bkFkZHJlc3MyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHg3Ri4KKyAgKiBAcGFyYW0gIE93bkFkZHJNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX05PTUFTSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfT1dOQUREUkVTUzJfTUFTSzA1CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX09XTkFERFJFU1MyX01BU0swNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19PV05BRERSRVNTMl9NQVNLMDcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19TZXRPd25BZGRyZXNzMihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgT3duQWRkcmVzczIsIHVpbnQzMl90IE93bkFkZHJNYXNrKQoreworICBNT0RJRllfUkVHKEkyQ3gtPk9BUjIsIEkyQ19PQVIyX09BMiB8IEkyQ19PQVIyX09BMk1TSywgT3duQWRkcmVzczIgfCBPd25BZGRyTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGFja25vd2xlZGdlIG9uIE93biBBZGRyZXNzMiBtYXRjaCBhZGRyZXNzLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfSTJDX0VuYWJsZU93bkFkZHJlc3MyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVPd25BZGRyZXNzMihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5PQVIyLCBJMkNfT0FSMl9PQTJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MyIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyRU4gICAgICAgICBMTF9JMkNfRGlzYWJsZU93bkFkZHJlc3MyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5PQVIyLCBJMkNfT0FSMl9PQTJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgT3duIEFkZHJlc3MxIGFja25vd2xlZGdlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyRU4gICAgICAgICBMTF9JMkNfSXNFbmFibGVkT3duQWRkcmVzczIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRPd25BZGRyZXNzMihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+T0FSMiwgSTJDX09BUjJfT0EyRU4pID09IChJMkNfT0FSMl9PQTJFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2QuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBUSU1JTkdSICAgICAgIExMX0kyQ19TZXRUaW1pbmcKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltaW5nIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYuCisgICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBpcyBjb21wdXRlZCB3aXRoIHRoZSBTVE0zMkN1YmVNWCBUb29sLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFRpbWluZyhJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVGltaW5nKQoreworICBXUklURV9SRUcoSTJDeC0+VElNSU5HUiwgVGltaW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFRpbWluZyBQcmVzY2FsZXIgc2V0dGluZy4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBQUkVTQyAgICAgICAgIExMX0kyQ19HZXRUaW1pbmdQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRUaW1pbmdQcmVzY2FsZXIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUlOR1IsIEkyQ19USU1JTkdSX1BSRVNDKSA+PiBJMkNfVElNSU5HUl9QUkVTQ19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU0NMIGxvdyBwZXJpb2Qgc2V0dGluZy4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBTQ0xMICAgICAgICAgIExMX0kyQ19HZXRDbG9ja0xvd1BlcmlvZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0Q2xvY2tMb3dQZXJpb2QoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUlOR1IsIEkyQ19USU1JTkdSX1NDTEwpID4+IEkyQ19USU1JTkdSX1NDTExfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNDTCBoaWdoIHBlcmlvZCBzZXR0aW5nLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNDTEggICAgICAgICAgTExfSTJDX0dldENsb2NrSGlnaFBlcmlvZAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0Q2xvY2tIaWdoUGVyaW9kKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1JTkdSLCBJMkNfVElNSU5HUl9TQ0xIKSA+PiBJMkNfVElNSU5HUl9TQ0xIX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTREEgaG9sZCB0aW1lLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNEQURFTCAgICAgICAgTExfSTJDX0dldERhdGFIb2xkVGltZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldERhdGFIb2xkVGltZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNSU5HUiwgSTJDX1RJTUlOR1JfU0RBREVMKSA+PiBJMkNfVElNSU5HUl9TREFERUxfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNEQSBzZXR1cCB0aW1lLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNDTERFTCAgICAgICAgTExfSTJDX0dldERhdGFTZXR1cFRpbWUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXREYXRhU2V0dXBUaW1lKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1JTkdSLCBJMkNfVElNSU5HUl9TQ0xERUwpID4+IEkyQ19USU1JTkdSX1NDTERFTF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBwZXJpcGhlcmFsIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU01CSEVOICAgICAgICBMTF9JMkNfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU01CREVOICAgICAgICBMTF9JMkNfU2V0TW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBQZXJpcGhlcmFsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX0kyQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0hPU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19ERVZJQ0VfQVJQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0TW9kZShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgUGVyaXBoZXJhbE1vZGUpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NNQkhFTiB8IEkyQ19DUjFfU01CREVOLCBQZXJpcGhlcmFsTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBlcmlwaGVyYWwgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTTUJIRU4gICAgICAgIExMX0kyQ19HZXRNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBTTUJERU4gICAgICAgIExMX0kyQ19HZXRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfSTJDCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfSE9TVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlAKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0TW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NNQkhFTiB8IEkyQ19DUjFfU01CREVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgU01CdXMgRGV2aWNlIG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBpcyBkcml2ZWQgbG93IGFuZAorICAqICAgICAgICAgICBBbGVydCBSZXNwb25zZSBBZGRyZXNzIEhlYWRlciBhY2tub3dsZWRnZSBpcyBlbmFibGVkLgorICAqICAgICAgICAgU01CdXMgSG9zdCBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9JMkNfRW5hYmxlU01CdXNBbGVydAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlU01CdXNBbGVydChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUxFUlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTTUJ1cyBhbGVydCAoSG9zdCBvciBEZXZpY2UgbW9kZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFNNQnVzIERldmljZSBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gaXMgbm90IGRyaXZlZCAoY2FuIGJlIHVzZWQgYXMgYSBzdGFuZGFyZCBHUElPKSBhbmQKKyAgKiAgICAgICAgICAgQWxlcnQgUmVzcG9uc2UgQWRkcmVzcyBIZWFkZXIgYWNrbm93bGVkZ2UgaXMgZGlzYWJsZWQuCisgICogICAgICAgICBTTUJ1cyBIb3N0IG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9JMkNfRGlzYWJsZVNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVTTUJ1c0FsZXJ0KEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX0FMRVJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFMRVJURU4gICAgICAgTExfSTJDX0lzRW5hYmxlZFNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c0FsZXJ0KEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUxFUlRFTikgPT0gKEkyQ19DUjFfQUxFUlRFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0VuYWJsZVNNQnVzUEVDCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVTTUJ1c1BFQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUEVDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfSTJDX0Rpc2FibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTTUJ1cyBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gKFBFQykgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUEVDRU4pID09IChJMkNfQ1IxX1BFQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gYXNzb2NpYXRlZCBUaW1lb3V0IGlzIGRpc2FibGVkIChUaW1lb3V0QSBhbmQvb3JUaW1lb3V0QikuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9JMkNfQ29uZmlnU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0kyQ19Db25maWdTTUJ1c1RpbWVvdXRcbgorICAqICAgICAgICAgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfSTJDX0NvbmZpZ1NNQnVzVGltZW91dAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHBhcmFtICBUaW1lb3V0QU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICogQHBhcmFtICBUaW1lb3V0QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NvbmZpZ1NNQnVzVGltZW91dChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVGltZW91dEEsIHVpbnQzMl90IFRpbWVvdXRBTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dEIpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+VElNRU9VVFIsIEkyQ19USU1FT1VUUl9USU1FT1VUQSB8IEkyQ19USU1FT1VUUl9USURMRSB8IEkyQ19USU1FT1VUUl9USU1FT1VUQiwKKyAgICAgICAgICAgICBUaW1lb3V0QSB8IFRpbWVvdXRBTW9kZSB8IChUaW1lb3V0QiA8PCBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0QSAoU0NMIGxvdyB0aW1lb3V0IG9yIFNDTCBhbmQgU0RBIGhpZ2ggdGltZW91dCBkZXBlbmRzIG9uIFRpbWVvdXRBIG1vZGUpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgYml0cyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVGltZW91dEEpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5USU1FT1VUUiwgVGltZW91dEEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgc2V0dGluZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQSAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRBCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+VElNRU9VVFIsIEkyQ19USU1FT1VUUl9USU1FT1VUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBUaW1lb3V0QSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0kyQ19TZXRTTUJ1c1RpbWVvdXRBTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U01CdXNUaW1lb3V0QU1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBTW9kZSkKK3sKKyAgV1JJVEVfUkVHKEkyQ3gtPlRJTUVPVVRSLCBUaW1lb3V0QU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRBTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NDTF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TREFfU0NMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U01CdXNUaW1lb3V0QU1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPlRJTUVPVVRSLCBJMkNfVElNRU9VVFJfVElETEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQnVzIEV4dGVuZGVkIEN1bXVsYXRpdmUgQ2xvY2sgVGltZW91dEIgKE1hc3RlciBvciBTbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIGJpdHMgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIFRpbWVvdXRCIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfSTJDX1NldFNNQnVzVGltZW91dEIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEIgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFNNQnVzVGltZW91dEIoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IFRpbWVvdXRCKQoreworICBXUklURV9SRUcoSTJDeC0+VElNRU9VVFIsIFRpbWVvdXRCIDw8IEkyQ19USU1FT1VUUl9USU1FT1VUQl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgRXh0ZW50ZWQgQ3VtdWxhdGl2ZSBDbG9jayBUaW1lb3V0QiBzZXR0aW5nLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfSTJDX0dldFNNQnVzVGltZW91dEIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRTTUJ1c1RpbWVvdXRCKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgSTJDX1RJTUVPVVRSX1RJTUVPVVRCKSA+PiBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlU01CdXNUaW1lb3V0KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBDbG9ja1RpbWVvdXQpCit7CisgIFNFVF9CSVQoSTJDeC0+VElNRU9VVFIsIENsb2NrVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1PVVRFTiAgICAgIExMX0kyQ19EaXNhYmxlU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0kyQ19EaXNhYmxlU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVTTUJ1c1RpbWVvdXQoSTJDX1R5cGVEZWYgKkkyQ3gsIHVpbnQzMl90IENsb2NrVGltZW91dCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPlRJTUVPVVRSLCBDbG9ja1RpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9JMkNfSXNFbmFibGVkU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFNNQnVzVGltZW91dChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgQ2xvY2tUaW1lb3V0KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5USU1FT1VUUiwgKEkyQ19USU1FT1VUUl9USU1PVVRFTiB8IEkyQ19USU1FT1VUUl9URVhURU4pKSA9PSAoQ2xvY2tUaW1lb3V0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWElTIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWElFICAgICAgICAgIExMX0kyQ19FbmFibGVJVF9UWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfVFgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFhJUyBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1RYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfVFgoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVFhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFRYSVMgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfVFgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9UWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RYSUUpID09IChJMkNfQ1IxX1RYSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYTkUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYSUUgICAgICAgICAgTExfSTJDX0VuYWJsZUlUX1JYCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWE5FIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfUlgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9SWChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9SWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgUlhORSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9SWAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1JYKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfUlhJRSkgPT0gKEkyQ19DUjFfUlhJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgKHNsYXZlIG1vZGUgb25seSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUREUklFICAgICAgICBMTF9JMkNfRW5hYmxlSVRfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfQUREUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfQUREUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IChzbGF2ZSBtb2RlIG9ubHkpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfSTJDX0Rpc2FibGVJVF9BRERSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19EaXNhYmxlSVRfQUREUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BRERSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUREUklFICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfQUREUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX0FERFIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9BRERSSUUpID09IChJMkNfQ1IxX0FERFJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOQUNLSUUgICAgICAgIExMX0kyQ19FbmFibGVJVF9OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVJVF9OQUNLKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9OQUNLSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOQUNLSUUgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX05BQ0soSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfTkFDS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfTkFDSworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX05BQ0soSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9OQUNLSUUpID09IChJMkNfQ1IxX05BQ0tJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfSTJDX0VuYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUlUX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9JMkNfSXNFbmFibGVkSVRfU1RPUAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1NUT1AoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9TVE9QSUUpID09IChJMkNfQ1IxX1NUT1BJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0LgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGV2ZW50cyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSAoVEMpCisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSBSZWxvYWQgKFRDUikKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0kyQ19FbmFibGVJVF9UQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfVEMoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IxLCBJMkNfQ1IxX1RDSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0LgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGV2ZW50cyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSAoVEMpCisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSBSZWxvYWQgKFRDUikKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0kyQ19EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVJVF9UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9UQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZElUX1RDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjEsIEkyQ19DUjFfVENJRSkgPT0gKEkyQ19DUjFfVENJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXJyb3IgaW50ZXJydXB0cy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBlcnJvcnMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgQXJiaXRyYXRpb24gTG9zcyAoQVJMTykKKyAgKiAgICAgICAgIEJ1cyBFcnJvciBkZXRlY3Rpb24gKEJFUlIpCisgICogICAgICAgICBPdmVycnVuL1VuZGVycnVuIChPVlIpCisgICogICAgICAgICBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiAoVElNRU9VVCkKKyAgKiAgICAgICAgIFNNQnVzIFBFQyBlcnJvciBkZXRlY3Rpb24gKFBFQ0VSUikKKyAgKiAgICAgICAgIFNNQnVzIEFsZXJ0IHBpbiBldmVudCBkZXRlY3Rpb24gKEFMRVJUKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfSTJDX0VuYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRW5hYmxlSVRfRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFcnJvciBpbnRlcnJ1cHRzLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGVycm9ycyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBBcmJpdHJhdGlvbiBMb3NzIChBUkxPKQorICAqICAgICAgICAgQnVzIEVycm9yIGRldGVjdGlvbiAoQkVSUikKKyAgKiAgICAgICAgIE92ZXJydW4vVW5kZXJydW4gKE9WUikKKyAgKiAgICAgICAgIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIChUSU1FT1VUKQorICAqICAgICAgICAgU01CdXMgUEVDIGVycm9yIGRldGVjdGlvbiAoUEVDRVJSKQorICAqICAgICAgICAgU01CdXMgQWxlcnQgcGluIGV2ZW50IGRldGVjdGlvbiAoQUxFUlQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9JMkNfRGlzYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZUlUX0VSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0kyQ19Jc0VuYWJsZWRJVF9FUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRJVF9FUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMSwgSTJDX0NSMV9FUlJJRSkgPT0gKEkyQ19DUjFfRVJSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0xMX0VGX0ZMQUdfbWFuYWdlbWVudCBGTEFHX21hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gbmV4dCBkYXRhIGlzIHdyaXR0ZW4gaW4gVHJhbnNtaXQgZGF0YSByZWdpc3Rlci4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGlzIGVtcHR5LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhFKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVFhFKSA9PSAoSTJDX0lTUl9UWEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc21pdCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXaGVuIG5leHQgZGF0YSBpcyB3cml0dGVuIGluIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIuCisgICogICAgICAgICBTRVQ6IFdoZW4gVHJhbnNtaXQgZGF0YSByZWdpc3RlciBpcyBlbXB0eS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWElTICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfVFhJUworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19UWElTKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfVFhJUykgPT0gKEkyQ19JU1JfVFhJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXaGVuIFJlY2VpdmUgZGF0YSByZWdpc3RlciBpcyByZWFkLgorICAqICAgICAgICAgU0VUOiBXaGVuIHRoZSByZWNlaXZlZCBkYXRhIGlzIGNvcGllZCBpbiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhORSAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1JYTkUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfUlhORShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1JYTkUpID09IChJMkNfSVNSX1JYTkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiB0aGUgcmVjZWl2ZWQgc2xhdmUgYWRkcmVzcyBtYXRjaGVkIHdpdGggb25lIG9mIHRoZSBlbmFibGVkIHNsYXZlIGFkZHJlc3MuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUREUiAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfQUREUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0FERFIpID09IChJMkNfSVNSX0FERFIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBOb3QgQWNrbm93bGVkZ2UgcmVjZWl2ZWQgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGEgTkFDSyBpcyByZWNlaXZlZCBhZnRlciBhIGJ5dGUgdHJhbnNtaXNzaW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE5BQ0tGICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX05BQ0soSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9OQUNLRikgPT0gKEkyQ19JU1JfTkFDS0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTdG9wIGRldGVjdGlvbiBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBTdG9wIGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTVE9QRiAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfU1RPUAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19TVE9QKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5JU1IsIEkyQ19JU1JfU1RPUEYpID09IChJMkNfSVNSX1NUT1BGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNmZXIgY29tcGxldGUgZmxhZyAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gUkVMT0FEPTAsIEFVVE9FTkQ9MCBhbmQgTkJZVEVTIGRhdGUgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19UQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19UQyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX1RDKSA9PSAoSTJDX0lTUl9UQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIFJFTE9BRD0xIGFuZCBOQllURVMgZGF0ZSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENSICAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX1RDUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlRmxhZ19UQ1IoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9UQ1IpID09IChJMkNfSVNSX1RDUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEJ1cyBlcnJvciBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBtaXNwbGFjZWQgU3RhcnQgb3IgU3RvcCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQkVSUiAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX0JFUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfQkVSUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0JFUlIpID09IChJMkNfSVNSX0JFUlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhcmJpdHJhdGlvbiBsb3N0LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSTE8gICAgICAgICAgTExfSTJDX0lzQWN0aXZlRmxhZ19BUkxPCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX0FSTE8oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9BUkxPKSA9PSAoSTJDX0lTUl9BUkxPKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChzbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGFuIG92ZXJydW4vdW5kZXJydW4gZXJyb3Igb2NjdXJzIChDbG9jayBTdHJldGNoaW5nIERpc2FibGVkKS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBPVlIgICAgICAgICAgIExMX0kyQ19Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVGbGFnX09WUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX09WUikgPT0gKEkyQ19JU1JfT1ZSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU01CdXMgUEVDIGVycm9yIGZsYWcgaW4gcmVjZXB0aW9uLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gdGhlIHJlY2VpdmVkIFBFQyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBQRUMgcmVnaXN0ZXIgY29udGVudC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBQRUNFUlIgICAgICAgIExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19QRUNFUlIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19QRUNFUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9QRUNFUlIpID09IChJMkNfSVNSX1BFQ0VSUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQlVTX0FMTF9JTlNUQU5DRShJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIHRpbWVvdXQgb3IgZXh0ZW5kZWQgY2xvY2sgdGltZW91dCBvY2N1cnMuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVElNRU9VVCAgICAgICBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfVElNRU9VVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX1RJTUVPVVQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9USU1FT1VUKSA9PSAoSTJDX0lTUl9USU1FT1VUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU01CdXMgYWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIFNNQnVzIGhvc3QgY29uZmlndXJhdGlvbiwgU01CdXMgYWxlcnQgZW5hYmxlZCBhbmQKKyAgKiAgICAgICAgICAgICAgYSBmYWxsaW5nIGVkZ2UgZXZlbnQgb2NjdXJzIG9uIFNNQkEgcGluLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMRVJUICAgICAgICAgTExfSTJDX0lzQWN0aXZlU01CdXNGbGFnX0FMRVJUCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfQUxFUlQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9BTEVSVCkgPT0gKEkyQ19JU1JfQUxFUlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBCdXMgQnVzeSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBTdGFydCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9JMkNfSXNBY3RpdmVGbGFnX0JVU1kKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0FjdGl2ZUZsYWdfQlVTWShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0JVU1kpID09IChJMkNfSVNSX0JVU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQWRkcmVzcyBNYXRjaGVkIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQUREUkNGICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19BRERSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9BRERSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vdCBBY2tub3dsZWRnZSBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIE5BQ0tDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19OQUNLCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfTkFDSyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfTkFDS0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTdG9wIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFNUT1BDRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19TVE9QCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfU1RPUChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfU1RPUENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKFRYRSkuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gYmUgY2xlYXIgYnkgc29mdHdhcmUgaW4gb3JkZXIgdG8gZmx1c2ggdGhlIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgKFRYRFIpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0NsZWFyRmxhZ19UWEUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5JU1IsIEkyQ19JU1JfVFhFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBCdXMgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBCRVJSQ0YgICAgICAgIExMX0kyQ19DbGVhckZsYWdfQkVSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX0JFUlIoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0JFUlJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQXJiaXRyYXRpb24gbG9zdCBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFSTE9DRiAgICAgICAgTExfSTJDX0NsZWFyRmxhZ19BUkxPCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhckZsYWdfQVJMTyhJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfQVJMT0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBPdmVycnVuL1VuZGVycnVuIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgT1ZSQ0YgICAgICAgICBMTF9JMkNfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJGbGFnX09WUihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5JQ1IsIEkyQ19JQ1JfT1ZSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIFBFQyBlcnJvciBmbGFnLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUJVU19BTExfSU5TVEFOQ0UoSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0NGICAgICAgICAgTExfSTJDX0NsZWFyU01CdXNGbGFnX1BFQ0VSUgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfUEVDRVJSKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9QRUNDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUSU1PVVRDRiAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPklDUiwgSTJDX0lDUl9USU1PVVRDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgQWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBTEVSVENGICAgICAgIExMX0kyQ19DbGVhclNNQnVzRmxhZ19BTEVSVAorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQ2xlYXJTTUJ1c0ZsYWdfQUxFUlQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+SUNSLCBJMkNfSUNSX0FMRVJUQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIEF1dG9tYXRpYyBlbmQgbW9kZSA6IGEgU1RPUCBjb25kaXRpb24gaXMgYXV0b21hdGljYWxseSBzZW50IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmVkLgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBpbiBzbGF2ZSBtb2RlIG9yIHdoZW4gUkVMT0FEIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfRW5hYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZUF1dG9FbmRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBTb2Z0d2FyZSBlbmQgbW9kZSA6IFRDIGZsYWcgaXMgc2V0IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmUsIHN0cmV0Y2hpbmcgU0NMIGxvdy4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19EaXNhYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVBdXRvRW5kTW9kZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhdXRvbWF0aWMgU1RPUCBjb25kaXRpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0kyQ19Jc0VuYWJsZWRBdXRvRW5kTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZEF1dG9FbmRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfQVVUT0VORCkgPT0gKEkyQ19DUjJfQVVUT0VORCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcmVsb2FkIG1vZGUgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSB0cmFuc2ZlciBpcyBub3QgY29tcGxldGVkIGFmdGVyIHRoZSBOQllURVMgZGF0YSB0cmFuc2ZlciwgTkJZVEVTIHdpbGwgYmUgcmVsb2FkZWQgd2hlbiBUQ1IgZmxhZyBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkVMT0FEICAgICAgIExMX0kyQ19FbmFibGVSZWxvYWRNb2RlCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVSZWxvYWRNb2RlKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRUxPQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmVsb2FkIG1vZGUgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgYWZ0ZXIgdGhlIE5CWVRFUyBkYXRhIHRyYW5zZmVyKFNUT1Agb3IgUkVTVEFSVCB3aWxsIGZvbGxvdykuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkVMT0FEICAgICAgIExMX0kyQ19EaXNhYmxlUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfRGlzYWJsZVJlbG9hZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIENMRUFSX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUkVMT0FEKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByZWxvYWQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9JMkNfSXNFbmFibGVkUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0lzRW5hYmxlZFJlbG9hZE1vZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRUxPQUQpID09IChJMkNfQ1IyX1JFTE9BRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIG51bWJlciBvZiBieXRlcyBmb3IgdHJhbnNmZXIuCisgICogQG5vdGUgICBDaGFuZ2luZyB0aGVzZSBiaXRzIHdoZW4gU1RBUlQgYml0IGlzIHNldCBpcyBub3QgYWxsb3dlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOQllURVMgICAgICAgICAgIExMX0kyQ19TZXRUcmFuc2ZlclNpemUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVHJhbnNmZXJTaXplIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0VHJhbnNmZXJTaXplKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBUcmFuc2ZlclNpemUpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX05CWVRFUywgVHJhbnNmZXJTaXplIDw8IEkyQ19DUjJfTkJZVEVTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uZmlndXJlZCBmb3IgdHJhbnNmZXIuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTkJZVEVTICAgICAgICAgICBMTF9JMkNfR2V0VHJhbnNmZXJTaXplCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFRyYW5zZmVyU2l6ZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX05CWVRFUykgPj4gSTJDX0NSMl9OQllURVNfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmVwYXJlIHRoZSBnZW5lcmF0aW9uIG9mIGEgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlLgorICAqIEBub3RlICAgVXNhZ2UgaW4gU2xhdmUgbW9kZSBvbmx5LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfSTJDX0Fja25vd2xlZGdlTmV4dERhdGEKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVHlwZUFja25vd2xlZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0FDSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19OQUNLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfQWNrbm93bGVkZ2VOZXh0RGF0YShJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVHlwZUFja25vd2xlZGdlKQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9OQUNLLCBUeXBlQWNrbm93bGVkZ2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU1RBUlQgb3IgUkVTVEFSVCBjb25kaXRpb24KKyAgKiBAbm90ZSAgIFRoZSBTVEFSVCBiaXQgY2FuIGJlIHNldCBldmVuIGlmIGJ1cyBpcyBCVVNZIG9yIEkyQyBpcyBpbiBzbGF2ZSBtb2RlLgorICAqICAgICAgICAgVGhpcyBhY3Rpb24gaGFzIG5vIGVmZmVjdCB3aGVuIFJFTE9BRCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RBUlQgICAgICAgICAgIExMX0kyQ19HZW5lcmF0ZVN0YXJ0Q29uZGl0aW9uCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19HZW5lcmF0ZVN0YXJ0Q29uZGl0aW9uKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9TVEFSVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTVE9QIGNvbmRpdGlvbiBhZnRlciB0aGUgY3VycmVudCBieXRlIHRyYW5zZmVyIChtYXN0ZXIgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9JMkNfR2VuZXJhdGVTdG9wQ29uZGl0aW9uCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19HZW5lcmF0ZVN0b3BDb25kaXRpb24oSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIFNFVF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIG1hc3RlciBzZW5kcyB0aGUgY29tcGxldGUgMTBiaXQgc2xhdmUgYWRkcmVzcyByZWFkIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIFN0YXJ0ICsgMiBieXRlcyAxMGJpdCBhZGRyZXNzIGluIFdyaXRlIGRpcmVjdGlvbiArIFJlc3RhcnQgKyBmaXJzdCA3IGJpdHMgb2YgMTBiaXQgYWRkcmVzcyBpbiBSZWFkIGRpcmVjdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0kyQ19FbmFibGVBdXRvMTBCaXRSZWFkCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19FbmFibGVBdXRvMTBCaXRSZWFkKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBDTEVBUl9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX0hFQUQxMFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0b21hdGljIFJFU1RBUlQgUmVhZCByZXF1ZXN0IGNvbmRpdGlvbiBmb3IgMTBiaXQgYWRkcmVzcyBoZWFkZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSBtYXN0ZXIgb25seSBzZW5kcyB0aGUgZmlyc3QgNyBiaXRzIG9mIDEwYml0IGFkZHJlc3MgaW4gUmVhZCBkaXJlY3Rpb24uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9JMkNfRGlzYWJsZUF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0Rpc2FibGVBdXRvMTBCaXRSZWFkKEkyQ19UeXBlRGVmICpJMkN4KQoreworICBTRVRfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9IRUFEMTBSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0lzRW5hYmxlZEF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRBdXRvMTBCaXRSZWFkKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfSEVBRDEwUikgIT0gKEkyQ19DUjJfSEVBRDEwUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbiAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhlc2UgYml0cyB3aGVuIFNUQVJUIGJpdCBpcyBzZXQgaXMgbm90IGFsbG93ZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9JMkNfU2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19SRVFVRVNUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfUkVBRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX1NldFRyYW5zZmVyUmVxdWVzdChJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgVHJhbnNmZXJSZXF1ZXN0KQoreworICBNT0RJRllfUkVHKEkyQ3gtPkNSMiwgSTJDX0NSMl9SRF9XUk4sIFRyYW5zZmVyUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24gcmVxdWVzdGVkIChtYXN0ZXIgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9JMkNfR2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX1JFUVVFU1RfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfUkVRVUVTVF9SRUFECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFRyYW5zZmVyUmVxdWVzdChJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+Q1IyLCBJMkNfQ1IyX1JEX1dSTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc2xhdmUgYWRkcmVzcyBmb3IgdHJhbnNmZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0kyQ19TZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2xhdmVBZGRyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JMkNfU2V0U2xhdmVBZGRyKEkyQ19UeXBlRGVmICpJMkN4LCB1aW50MzJfdCBTbGF2ZUFkZHIpCit7CisgIE1PRElGWV9SRUcoSTJDeC0+Q1IyLCBJMkNfQ1IyX1NBREQsIFNsYXZlQWRkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzbGF2ZSBhZGRyZXNzIHByb2dyYW1tZWQgZm9yIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0kyQ19HZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4M0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JMkNfR2V0U2xhdmVBZGRyKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfU0FERCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgSTJDeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTQUREICAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJEX1dSTiAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVEFSVCAgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBOQllURVMgICAgICAgIExMX0kyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9JMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfSTJDX0hhbmRsZVRyYW5zZmVyCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkciBTcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkclNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUlNMQVZFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfQUREUlNMQVZFXzEwQklUCisgICogQHBhcmFtICBUcmFuc2ZlclNpemUgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1LgorICAqIEBwYXJhbSAgRW5kTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1JFTE9BRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX0FVVE9FTkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TT0ZURU5ECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfUkVMT0FECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX01PREVfU01CVVNfQVVUT0VORF9OT19QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX05PX1BFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19NT0RFX1NNQlVTX0FVVE9FTkRfV0lUSF9QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfTU9ERV9TTUJVU19TT0ZURU5EX1dJVEhfUEVDCisgICogQHBhcmFtICBSZXF1ZXN0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX05PU1RBUlRTVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfU1RBUlRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9TVEFSVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9SRUFECisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfV1JJVEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19IYW5kbGVUcmFuc2ZlcihJMkNfVHlwZURlZiAqSTJDeCwgdWludDMyX3QgU2xhdmVBZGRyLCB1aW50MzJfdCBTbGF2ZUFkZHJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyYW5zZmVyU2l6ZSwgdWludDMyX3QgRW5kTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgTU9ESUZZX1JFRyhJMkN4LT5DUjIsIEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfQUREMTAgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1AgfCBJMkNfQ1IyX1JFTE9BRCB8CisgICAgICAgICAgICAgSTJDX0NSMl9OQllURVMgfCBJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX0hFQUQxMFIsCisgICAgICAgICAgICAgU2xhdmVBZGRyIHwgU2xhdmVBZGRyU2l6ZSB8IChUcmFuc2ZlclNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSB8IEVuZE1vZGUgfCBSZXF1ZXN0KTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgdmFsdWUgb2YgdHJhbnNmZXIgZGlyZWN0aW9uIChzbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXcml0ZSB0cmFuc2ZlciwgU2xhdmUgZW50ZXJzIGluIHJlY2VpdmVyIG1vZGUuCisgICogICAgICAgICBTRVQ6IFJlYWQgdHJhbnNmZXIsIFNsYXZlIGVudGVycyBpbiB0cmFuc21pdHRlciBtb2RlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIERJUiAgICAgICAgICAgTExfSTJDX0dldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSTJDX0RJUkVDVElPTl9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0kyQ19ESVJFQ1RJT05fUkVBRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19HZXRUcmFuc2ZlckRpcmVjdGlvbihJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoSTJDeC0+SVNSLCBJMkNfSVNSX0RJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgc2xhdmUgbWF0Y2hlZCBhZGRyZXNzLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFERENPREUgICAgICAgTExfSTJDX0dldEFkZHJlc3NNYXRjaENvZGUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldEFkZHJlc3NNYXRjaENvZGUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEkyQ3gtPklTUiwgSTJDX0lTUl9BRERDT0RFKSA+PiBJMkNfSVNSX0FERENPREVfUG9zIDw8IDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcm5hbCBjb21wYXJpc29uIG9mIHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSAodHJhbnNtaXNzaW9uIG9yIHJlY2VwdGlvbiBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgZmVhdHVyZSBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gdGhlIFBFQyBieXRlIGlzIHRyYW5zZmVycmVkLCBvciB3aGVuIGEgU1RPUCBjb25kaXRpb24gb3IgYW4gQWRkcmVzcyBNYXRjaGVkIGlzIHJlY2VpdmVkLgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCB3aGVuIFJFTE9BRCBiaXQgaXMgc2V0LgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBpbiBkZXZpY2UgbW9kZSB3aGVuIFNCQyBiaXQgaXMgbm90IHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQRUNCWVRFICAgICAgIExMX0kyQ19FbmFibGVTTUJ1c1BFQ0NvbXBhcmUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSTJDX0VuYWJsZVNNQnVzUEVDQ29tcGFyZShJMkNfVHlwZURlZiAqSTJDeCkKK3sKKyAgU0VUX0JJVChJMkN4LT5DUjIsIEkyQ19DUjJfUEVDQllURSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNNQnVzIFBhY2tldCBFcnJvciBieXRlIGludGVybmFsIGNvbXBhcmlzb24gaXMgcmVxdWVzdGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQRUNCWVRFICAgICAgIExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0kyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEkyQ3gtPkNSMiwgSTJDX0NSMl9QRUNCWVRFKSA9PSAoSTJDX0NSMl9QRUNCWVRFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgUGFja2V0IEVycm9yIGJ5dGUgY2FsY3VsYXRlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01CVVNfQUxMX0lOU1RBTkNFKEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFBFQ1IgICAgICAgICBQRUMgICAgICAgICAgIExMX0kyQ19HZXRTTUJ1c1BFQworICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSTJDX0dldFNNQnVzUEVDKEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChJMkN4LT5QRUNSLCBJMkNfUEVDUl9QRUMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIFJlY2VpdmUgRGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIFJYRFIgICAgICAgICBSWERBVEEgICAgICAgIExMX0kyQ19SZWNlaXZlRGF0YTgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9JMkNfUmVjZWl2ZURhdGE4KEkyQ19UeXBlRGVmICpJMkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKEkyQ3gtPlJYRFIsIEkyQ19SWERSX1JYREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgLgorICAqIEBybXRvbGwgVFhEUiAgICAgICAgIFRYREFUQSAgICAgICAgTExfSTJDX1RyYW5zbWl0RGF0YTgKKyAgKiBAcGFyYW0gIEkyQ3ggSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0kyQ19UcmFuc21pdERhdGE4KEkyQ19UeXBlRGVmICpJMkN4LCB1aW50OF90IERhdGEpCit7CisgIFdSSVRFX1JFRyhJMkN4LT5UWERSLCBEYXRhKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBJMkNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfSTJDX0luaXQoSTJDX1R5cGVEZWYgKkkyQ3gsIExMX0kyQ19Jbml0VHlwZURlZiAqSTJDX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfSTJDX0RlSW5pdChJMkNfVHlwZURlZiAqSTJDeCk7Cit2b2lkIExMX0kyQ19TdHJ1Y3RJbml0KExMX0kyQ19Jbml0VHlwZURlZiAqSTJDX0luaXRTdHJ1Y3QpOworCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJMkMxIHx8IEkyQzMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9JMkNfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9pcGNjLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2lwY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhhZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9sbF9pcGNjLmgKQEAgLTAsMCArMSw3MjMgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfaXBjYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBJUENDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9JUENDX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX0lQQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoSVBDQykKKworLyoqIEBkZWZncm91cCBJUENDX0xMIElQQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElQQ0NfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIElQQ0MgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUENDX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9JUENDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JUENDX0MxVE9DMlNSX0NIMUYgSVBDQ19DMVRPQzJTUl9DSDFGX01zayAvKiE8IEMxIHRyYW5zbWl0IHRvIEMyIHJlY2VpdmUgQ2hhbm5lbDEgc3RhdHVzIGZsYWcgYmVmb3JlIG1hc2tpbmcgKi8KKyNkZWZpbmUgTExfSVBDQ19DMVRPQzJTUl9DSDJGIElQQ0NfQzFUT0MyU1JfQ0gyRl9Nc2sgLyohPCBDMSB0cmFuc21pdCB0byBDMiByZWNlaXZlIENoYW5uZWwyIHN0YXR1cyBmbGFnIGJlZm9yZSBtYXNraW5nICovCisjZGVmaW5lIExMX0lQQ0NfQzFUT0MyU1JfQ0gzRiBJUENDX0MxVE9DMlNSX0NIM0ZfTXNrIC8qITwgQzEgdHJhbnNtaXQgdG8gQzIgcmVjZWl2ZSBDaGFubmVsMyBzdGF0dXMgZmxhZyBiZWZvcmUgbWFza2luZyAqLworI2RlZmluZSBMTF9JUENDX0MxVE9DMlNSX0NINEYgSVBDQ19DMVRPQzJTUl9DSDRGX01zayAvKiE8IEMxIHRyYW5zbWl0IHRvIEMyIHJlY2VpdmUgQ2hhbm5lbDQgc3RhdHVzIGZsYWcgYmVmb3JlIG1hc2tpbmcgKi8KKyNkZWZpbmUgTExfSVBDQ19DMVRPQzJTUl9DSDVGIElQQ0NfQzFUT0MyU1JfQ0g1Rl9Nc2sgLyohPCBDMSB0cmFuc21pdCB0byBDMiByZWNlaXZlIENoYW5uZWw1IHN0YXR1cyBmbGFnIGJlZm9yZSBtYXNraW5nICovCisjZGVmaW5lIExMX0lQQ0NfQzFUT0MyU1JfQ0g2RiBJUENDX0MxVE9DMlNSX0NINkZfTXNrIC8qITwgQzEgdHJhbnNtaXQgdG8gQzIgcmVjZWl2ZSBDaGFubmVsNiBzdGF0dXMgZmxhZyBiZWZvcmUgbWFza2luZyAqLworI2RlZmluZSBMTF9JUENDX0MyVE9DMVNSX0NIMUYgSVBDQ19DMlRPQzFTUl9DSDFGX01zayAvKiE8IEMyIHRyYW5zbWl0IHRvIEMxIHJlY2VpdmUgQ2hhbm5lbDEgc3RhdHVzIGZsYWcgYmVmb3JlIG1hc2tpbmcgKi8KKyNkZWZpbmUgTExfSVBDQ19DMlRPQzFTUl9DSDJGIElQQ0NfQzJUT0MxU1JfQ0gyRl9Nc2sgLyohPCBDMiB0cmFuc21pdCB0byBDMSByZWNlaXZlIENoYW5uZWwyIHN0YXR1cyBmbGFnIGJlZm9yZSBtYXNraW5nICovCisjZGVmaW5lIExMX0lQQ0NfQzJUT0MxU1JfQ0gzRiBJUENDX0MyVE9DMVNSX0NIM0ZfTXNrIC8qITwgQzIgdHJhbnNtaXQgdG8gQzEgcmVjZWl2ZSBDaGFubmVsMyBzdGF0dXMgZmxhZyBiZWZvcmUgbWFza2luZyAqLworI2RlZmluZSBMTF9JUENDX0MyVE9DMVNSX0NINEYgSVBDQ19DMlRPQzFTUl9DSDRGX01zayAvKiE8IEMyIHRyYW5zbWl0IHRvIEMxIHJlY2VpdmUgQ2hhbm5lbDQgc3RhdHVzIGZsYWcgYmVmb3JlIG1hc2tpbmcgKi8KKyNkZWZpbmUgTExfSVBDQ19DMlRPQzFTUl9DSDVGIElQQ0NfQzJUT0MxU1JfQ0g1Rl9Nc2sgLyohPCBDMiB0cmFuc21pdCB0byBDMSByZWNlaXZlIENoYW5uZWw1IHN0YXR1cyBmbGFnIGJlZm9yZSBtYXNraW5nICovCisjZGVmaW5lIExMX0lQQ0NfQzJUT0MxU1JfQ0g2RiBJUENDX0MyVE9DMVNSX0NINkZfTXNrIC8qITwgQzIgdHJhbnNtaXQgdG8gQzEgcmVjZWl2ZSBDaGFubmVsNiBzdGF0dXMgZmxhZyBiZWZvcmUgbWFza2luZyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIElQQ0NfTExfRUNfQ2hhbm5lbCBDaGFubmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfSVBDQ19DSEFOTkVMXzEgKDB4MDAwMDAwMDFVKSAvKiE8IElQQ0MgQ2hhbm5lbCAxICovCisjZGVmaW5lIExMX0lQQ0NfQ0hBTk5FTF8yICgweDAwMDAwMDAyVSkgLyohPCBJUENDIENoYW5uZWwgMiAqLworI2RlZmluZSBMTF9JUENDX0NIQU5ORUxfMyAoMHgwMDAwMDAwNFUpIC8qITwgSVBDQyBDaGFubmVsIDMgKi8KKyNkZWZpbmUgTExfSVBDQ19DSEFOTkVMXzQgKDB4MDAwMDAwMDhVKSAvKiE8IElQQ0MgQ2hhbm5lbCA0ICovCisjZGVmaW5lIExMX0lQQ0NfQ0hBTk5FTF81ICgweDAwMDAwMDEwVSkgLyohPCBJUENDIENoYW5uZWwgNSAqLworI2RlZmluZSBMTF9JUENDX0NIQU5ORUxfNiAoMHgwMDAwMDAyMFUpIC8qITwgSVBDQyBDaGFubmVsIDYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElQQ0NfTExfRXhwb3J0ZWRfTWFjcm9zIElQQ0MgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUENDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gSVBDQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIElQQ0MgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX0lQQ0NfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBJUENDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSVBDQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9JUENDX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElQQ0NfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIElQQ0MgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUENDX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxLgorICAqIEBybXRvbGwgQzFDUiAgICAgICAgICBUWEZJRSAgICAgICAgIExMX0MxX0lQQ0NfRW5hYmxlSVRfVFhGCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzFfSVBDQ19FbmFibGVJVF9UWEYoSVBDQ19UeXBlRGVmICpJUENDeCkKK3sKKyAgU0VUX0JJVChJUENDeC0+QzFDUiwgSVBDQ19DMUNSX1RYRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxLgorICAqIEBybXRvbGwgQzFDUiAgICAgICAgICBUWEZJRSAgICAgICAgIExMX0MxX0lQQ0NfRGlzYWJsZUlUX1RYRgorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MxX0lQQ0NfRGlzYWJsZUlUX1RYRihJUENDX1R5cGVEZWYgKklQQ0N4KQoreworICBDTEVBUl9CSVQoSVBDQ3gtPkMxQ1IsIElQQ0NfQzFDUl9UWEZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNtaXQgY2hhbm5lbCBmcmVlIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDEgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIEMxQ1IgICAgICAgICAgVFhGSUUgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZElUX1RYRgorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMV9JUENDX0lzRW5hYmxlZElUX1RYRihJUENDX1R5cGVEZWYgY29uc3QgKmNvbnN0IElQQ0N4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJUENDeC0+QzFDUiwgSVBDQ19DMUNSX1RYRklFKSA9PSAoSVBDQ19DMUNSX1RYRklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMS4KKyAgKiBAcm10b2xsIEMxQ1IgICAgICAgICAgUlhPSUUgICAgICAgICBMTF9DMV9JUENDX0VuYWJsZUlUX1JYTworICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MxX0lQQ0NfRW5hYmxlSVRfUlhPKElQQ0NfVHlwZURlZiAqSVBDQ3gpCit7CisgIFNFVF9CSVQoSVBDQ3gtPkMxQ1IsIElQQ0NfQzFDUl9SWE9JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMS4KKyAgKiBAcm10b2xsIEMxQ1IgICAgICAgICAgUlhPSUUgICAgICAgICBMTF9DMV9JUENDX0Rpc2FibGVJVF9SWE8KKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMV9JUENDX0Rpc2FibGVJVF9SWE8oSVBDQ19UeXBlRGVmICpJUENDeCkKK3sKKyAgQ0xFQVJfQklUKElQQ0N4LT5DMUNSLCBJUENDX0MxQ1JfUlhPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJlY2VpdmUgY2hhbm5lbCBvY2N1cGllZCBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDMUNSICAgICAgICAgIFJYT0lFICAgICAgICAgTExfQzFfSVBDQ19Jc0VuYWJsZWRJVF9SWE8KKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzFfSVBDQ19Jc0VuYWJsZWRJVF9SWE8oSVBDQ19UeXBlRGVmICBjb25zdCAqY29uc3QgSVBDQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElQQ0N4LT5DMUNSLCBJUENDX0MxQ1JfUlhPSUUpID09IChJUENDX0MxQ1JfUlhPSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAyLgorICAqIEBybXRvbGwgQzJDUiAgICAgICAgICBUWEZJRSAgICAgICAgIExMX0MyX0lQQ0NfRW5hYmxlSVRfVFhGCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfSVBDQ19FbmFibGVJVF9UWEYoSVBDQ19UeXBlRGVmICpJUENDeCkKK3sKKyAgU0VUX0JJVChJUENDeC0+QzJDUiwgSVBDQ19DMkNSX1RYRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAyLgorICAqIEBybXRvbGwgQzJDUiAgICAgICAgICBUWEZJRSAgICAgICAgIExMX0MyX0lQQ0NfRGlzYWJsZUlUX1RYRgorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0lQQ0NfRGlzYWJsZUlUX1RYRihJUENDX1R5cGVEZWYgKklQQ0N4KQoreworICBDTEVBUl9CSVQoSVBDQ3gtPkMyQ1IsIElQQ0NfQzJDUl9UWEZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNtaXQgY2hhbm5lbCBmcmVlIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDIgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIEMyQ1IgICAgICAgICAgVFhGSUUgICAgICAgICBMTF9DMl9JUENDX0lzRW5hYmxlZElUX1RYRgorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9JUENDX0lzRW5hYmxlZElUX1RYRihJUENDX1R5cGVEZWYgIGNvbnN0ICpjb25zdCBJUENDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVBDQ3gtPkMyQ1IsIElQQ0NfQzJDUl9UWEZJRSkgPT0gKElQQ0NfQzJDUl9UWEZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmVjZWl2ZSBjaGFubmVsIG9jY3VwaWVkIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDIuCisgICogQHJtdG9sbCBDMkNSICAgICAgICAgIFJYT0lFICAgICAgICAgTExfQzJfSVBDQ19FbmFibGVJVF9SWE8KKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9JUENDX0VuYWJsZUlUX1JYTyhJUENDX1R5cGVEZWYgKklQQ0N4KQoreworICBTRVRfQklUKElQQ0N4LT5DMkNSLCBJUENDX0MyQ1JfUlhPSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUmVjZWl2ZSBjaGFubmVsIG9jY3VwaWVkIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDIuCisgICogQHJtdG9sbCBDMkNSICAgICAgICAgIFJYT0lFICAgICAgICAgTExfQzJfSVBDQ19EaXNhYmxlSVRfUlhPCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfSVBDQ19EaXNhYmxlSVRfUlhPKElQQ0NfVHlwZURlZiAqSVBDQ3gpCit7CisgIENMRUFSX0JJVChJUENDeC0+QzJDUiwgSVBDQ19DMkNSX1JYT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQzJDUiAgICAgICAgICBSWE9JRSAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkSVRfUlhPCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX0lQQ0NfSXNFbmFibGVkSVRfUlhPKElQQ0NfVHlwZURlZiBjb25zdCAqY29uc3QgSVBDQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElQQ0N4LT5DMkNSLCBJUENDX0MyQ1JfUlhPSUUpID09IChJUENDX0MyQ1JfUlhPSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVBDQ19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVubWFzayB0cmFuc21pdCBjaGFubmVsIGZyZWUgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMS4KKyAgKiBAcm10b2xsIEMxTVIgICAgICAgIENIMUZNICAgICAgICAgICBMTF9DMV9JUENDX0VuYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDJGTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0gzRk0gICAgICAgICAgIExMX0MxX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINEZNICAgICAgICAgICBMTF9DMV9JUENDX0VuYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDVGTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0g2Rk0gICAgICAgICAgIExMX0MxX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MxX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVChJUENDeC0+QzFNUiwgQ2hhbm5lbCA8PCBJUENDX0MxTVJfQ0gxRk1fUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYXNrIHRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxLgorICAqIEBybXRvbGwgQzFNUiAgICAgICAgQ0gxRk0gICAgICAgICAgIExMX0MxX0lQQ0NfRGlzYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDJGTSAgICAgICAgICAgTExfQzFfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENIM0ZNICAgICAgICAgICBMTF9DMV9JUENDX0Rpc2FibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0g0Rk0gICAgICAgICAgIExMX0MxX0lQQ0NfRGlzYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDVGTSAgICAgICAgICAgTExfQzFfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINkZNICAgICAgICAgICBMTF9DMV9JUENDX0Rpc2FibGVUcmFuc21pdENoYW5uZWwKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzFfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoSVBDQ3gtPkMxTVIsIENoYW5uZWwgPDwgSVBDQ19DMU1SX0NIMUZNX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHJhbnNtaXQgY2hhbm5lbCBmcmVlIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDEgaXMgbWFza2VkLgorICAqIEBybXRvbGwgQzFNUiAgICAgICAgQ0gxRk0gICAgICAgICAgIExMX0MxX0lQQ0NfSXNFbmFibGVkVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENIMkZNICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDNGTSAgICAgICAgICAgTExfQzFfSVBDQ19Jc0VuYWJsZWRUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0g0Rk0gICAgICAgICAgIExMX0MxX0lQQ0NfSXNFbmFibGVkVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINUZNICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDZGTSAgICAgICAgICAgTExfQzFfSVBDQ19Jc0VuYWJsZWRUcmFuc21pdENoYW5uZWwKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF82CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzFfSVBDQ19Jc0VuYWJsZWRUcmFuc21pdENoYW5uZWwoSVBDQ19UeXBlRGVmIGNvbnN0ICpjb25zdCBJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVBDQ3gtPkMxTVIsIENoYW5uZWwgPDwgSVBDQ19DMU1SX0NIMUZNX1BvcykgIT0gKENoYW5uZWwgPDwgSVBDQ19DMU1SX0NIMUZNX1BvcykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbm1hc2sgcmVjZWl2ZSBjaGFubmVsIG9jY3VwaWVkIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDEuCisgICogQHJtdG9sbCBDMU1SICAgICAgICBDSDFPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDJPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDNPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDRPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDVPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDZPTSAgICAgICAgICAgTExfQzFfSVBDQ19FbmFibGVSZWNlaXZlQ2hhbm5lbAorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF82CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMV9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVChJUENDeC0+QzFNUiwgQ2hhbm5lbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFzayByZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMS4KKyAgKiBAcm10b2xsIEMxTVIgICAgICAgIENIMU9NICAgICAgICAgICBMTF9DMV9JUENDX0Rpc2FibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDJPTSAgICAgICAgICAgTExfQzFfSVBDQ19EaXNhYmxlUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0gzT00gICAgICAgICAgIExMX0MxX0lQQ0NfRGlzYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINE9NICAgICAgICAgICBMTF9DMV9JUENDX0Rpc2FibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMU1SICAgICAgICBDSDVPTSAgICAgICAgICAgTExfQzFfSVBDQ19EaXNhYmxlUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzFNUiAgICAgICAgQ0g2T00gICAgICAgICAgIExMX0MxX0lQQ0NfRGlzYWJsZVJlY2VpdmVDaGFubmVsCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MxX0lQQ0NfRGlzYWJsZVJlY2VpdmVDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoSVBDQ3gtPkMxTVIsIENoYW5uZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJlY2VpdmUgY2hhbm5lbCBvY2N1cGllZCBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxIGlzIG1hc2tlZC4KKyAgKiBAcm10b2xsIEMxTVIgICAgICAgIENIMU9NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENIMk9NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENIM09NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINE9NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINU9NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMxTVIgICAgICAgIENINk9NICAgICAgICAgICBMTF9DMV9JUENDX0lzRW5hYmxlZFJlY2VpdmVDaGFubmVsCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MxX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWwoSVBDQ19UeXBlRGVmIGNvbnN0ICpjb25zdCBJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoSVBDQ3gtPkMxTVIsIENoYW5uZWwpICE9IChDaGFubmVsKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVubWFzayB0cmFuc21pdCBjaGFubmVsIGZyZWUgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMi4KKyAgKiBAcm10b2xsIEMyTVIgICAgICAgIENIMUZNICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDJGTSAgICAgICAgICAgTExfQzJfSVBDQ19FbmFibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0gzRk0gICAgICAgICAgIExMX0MyX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINEZNICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDVGTSAgICAgICAgICAgTExfQzJfSVBDQ19FbmFibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g2Rk0gICAgICAgICAgIExMX0MyX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0lQQ0NfRW5hYmxlVHJhbnNtaXRDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIENMRUFSX0JJVChJUENDeC0+QzJNUiwgQ2hhbm5lbCA8PCBJUENDX0MyTVJfQ0gxRk1fUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYXNrIHRyYW5zbWl0IGNoYW5uZWwgZnJlZSBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAyLgorICAqIEBybXRvbGwgQzJNUiAgICAgICAgQ0gxRk0gICAgICAgICAgIExMX0MyX0lQQ0NfRGlzYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDJGTSAgICAgICAgICAgTExfQzJfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENIM0ZNICAgICAgICAgICBMTF9DMl9JUENDX0Rpc2FibGVUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g0Rk0gICAgICAgICAgIExMX0MyX0lQQ0NfRGlzYWJsZVRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDVGTSAgICAgICAgICAgTExfQzJfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINkZNICAgICAgICAgICBMTF9DMl9JUENDX0Rpc2FibGVUcmFuc21pdENoYW5uZWwKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfSVBDQ19EaXNhYmxlVHJhbnNtaXRDaGFubmVsKElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFNFVF9CSVQoSVBDQ3gtPkMyTVIsIENoYW5uZWwgPDwgKElQQ0NfQzJNUl9DSDFGTV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc21pdCBjaGFubmVsIGZyZWUgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMiBpcyBtYXNrZWQuCisgICogQHJtdG9sbCBDMk1SICAgICAgICBDSDFGTSAgICAgICAgICAgTExfQzJfSVBDQ19Jc0VuYWJsZWRUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0gyRk0gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENIM0ZNICAgICAgICAgICBMTF9DMl9JUENDX0lzRW5hYmxlZFRyYW5zbWl0Q2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDRGTSAgICAgICAgICAgTExfQzJfSVBDQ19Jc0VuYWJsZWRUcmFuc21pdENoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g1Rk0gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkVHJhbnNtaXRDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINkZNICAgICAgICAgICBMTF9DMl9JUENDX0lzRW5hYmxlZFRyYW5zbWl0Q2hhbm5lbAorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9JUENDX0lzRW5hYmxlZFRyYW5zbWl0Q2hhbm5lbChJUENDX1R5cGVEZWYgY29uc3QgKmNvbnN0IElQQ0N4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVChJUENDeC0+QzJNUiwgQ2hhbm5lbCA8PCBJUENDX0MyTVJfQ0gxRk1fUG9zKSAhPSAoQ2hhbm5lbCA8PCBJUENDX0MyTVJfQ0gxRk1fUG9zKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVubWFzayByZWNlaXZlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0IGZvciBwcm9jZXNzb3IgMi4KKyAgKiBAcm10b2xsIEMyTVIgICAgICAgIENIMU9NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENIMk9NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENIM09NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINE9NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINU9NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINk9NICAgICAgICAgICBMTF9DMl9JUENDX0VuYWJsZVJlY2VpdmVDaGFubmVsCisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX0lQQ0NfRW5hYmxlUmVjZWl2ZUNoYW5uZWwoSVBDQ19UeXBlRGVmICpJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgQ0xFQVJfQklUKElQQ0N4LT5DMk1SLCBDaGFubmVsKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYXNrIHJlY2VpdmUgY2hhbm5lbCBvY2N1cGllZCBpbnRlcnJ1cHQgZm9yIHByb2Nlc3NvciAxLgorICAqIEBybXRvbGwgQzJNUiAgICAgICAgQ0gxT00gICAgICAgICAgIExMX0MyX0lQQ0NfRGlzYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENIMk9NICAgICAgICAgICBMTF9DMl9JUENDX0Rpc2FibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDNPTSAgICAgICAgICAgTExfQzJfSVBDQ19EaXNhYmxlUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g0T00gICAgICAgICAgIExMX0MyX0lQQ0NfRGlzYWJsZVJlY2VpdmVDaGFubmVsXG4KKyAgKiAgICAgICAgIEMyTVIgICAgICAgIENINU9NICAgICAgICAgICBMTF9DMl9JUENDX0Rpc2FibGVSZWNlaXZlQ2hhbm5lbFxuCisgICogICAgICAgICBDMk1SICAgICAgICBDSDZPTSAgICAgICAgICAgTExfQzJfSVBDQ19EaXNhYmxlUmVjZWl2ZUNoYW5uZWwKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfSVBDQ19EaXNhYmxlUmVjZWl2ZUNoYW5uZWwoSVBDQ19UeXBlRGVmICpJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgU0VUX0JJVChJUENDeC0+QzJNUiwgQ2hhbm5lbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUmVjZWl2ZSBjaGFubmVsIG9jY3VwaWVkIGludGVycnVwdCBmb3IgcHJvY2Vzc29yIDIgaXMgbWFza2VkLgorICAqIEBybXRvbGwgQzJNUiAgICAgICAgQ0gxT00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0gyT00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0gzT00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g0T00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g1T00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWxcbgorICAqICAgICAgICAgQzJNUiAgICAgICAgQ0g2T00gICAgICAgICAgIExMX0MyX0lQQ0NfSXNFbmFibGVkUmVjZWl2ZUNoYW5uZWwKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF82CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfSVBDQ19Jc0VuYWJsZWRSZWNlaXZlQ2hhbm5lbChJUENDX1R5cGVEZWYgY29uc3QgKmNvbnN0IElQQ0N4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVChJUENDeC0+QzJNUiwgQ2hhbm5lbCkgIT0gKENoYW5uZWwpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVBDQ19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBJUENDIHJlY2VpdmUgY2hhbm5lbCBzdGF0dXMgZm9yIHByb2Nlc3NvciAxLgorICAqIEBub3RlICAgQXNzb2NpYXRlZCB3aXRoIElQQ0NfQzJUT0MxU1IuQ0h4RgorICAqIEBybXRvbGwgQzFTQ1IgICAgICAgIENIMUMgICAgICAgICAgIExMX0MxX0lQQ0NfQ2xlYXJGbGFnX0NIeFxuCisgICogICAgICAgICBDMVNDUiAgICAgICAgQ0gyQyAgICAgICAgICAgTExfQzFfSVBDQ19DbGVhckZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDNDICAgICAgICAgICBMTF9DMV9JUENDX0NsZWFyRmxhZ19DSHhcbgorICAqICAgICAgICAgQzFTQ1IgICAgICAgIENINEMgICAgICAgICAgIExMX0MxX0lQQ0NfQ2xlYXJGbGFnX0NIeFxuCisgICogICAgICAgICBDMVNDUiAgICAgICAgQ0g1QyAgICAgICAgICAgTExfQzFfSVBDQ19DbGVhckZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDZDICAgICAgICAgICBMTF9DMV9JUENDX0NsZWFyRmxhZ19DSHgKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzFfSVBDQ19DbGVhckZsYWdfQ0h4KElQQ0NfVHlwZURlZiAqSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIFdSSVRFX1JFRyhJUENDeC0+QzFTQ1IsIENoYW5uZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBJUENDIHRyYW5zbWl0IGNoYW5uZWwgc3RhdHVzIGZvciBwcm9jZXNzb3IgMS4KKyAgKiBAbm90ZSAgIEFzc29jaWF0ZWQgd2l0aCBJUENDX0MxVE9DMlNSLkNIeEYKKyAgKiBAcm10b2xsIEMxU0NSICAgICAgICBDSDFTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDJTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDNTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDRTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDVTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxU0NSICAgICAgICBDSDZTICAgICAgICAgICBMTF9DMV9JUENDX1NldEZsYWdfQ0h4CisgICogQHBhcmFtICBJUENDeCBJUENDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MxX0lQQ0NfU2V0RmxhZ19DSHgoSVBDQ19UeXBlRGVmICpJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgV1JJVEVfUkVHKElQQ0N4LT5DMVNDUiwgQ2hhbm5lbCA8PCBJUENDX0MxU0NSX0NIMVNfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2hhbm5lbCBzdGF0dXMgZm9yIHByb2Nlc3NvciAxLgorICAqIEBybXRvbGwgQzFUT0MyU1IgICAgICAgIENIMUYgICAgICAgICAgIExMX0MxX0lQQ0NfSXNBY3RpdmVGbGFnX0NIeFxuCisgICogICAgICAgICBDMVRPQzJTUiAgICAgICAgQ0gyRiAgICAgICAgICAgTExfQzFfSVBDQ19Jc0FjdGl2ZUZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxVE9DMlNSICAgICAgICBDSDNGICAgICAgICAgICBMTF9DMV9JUENDX0lzQWN0aXZlRmxhZ19DSHhcbgorICAqICAgICAgICAgQzFUT0MyU1IgICAgICAgIENINEYgICAgICAgICAgIExMX0MxX0lQQ0NfSXNBY3RpdmVGbGFnX0NIeFxuCisgICogICAgICAgICBDMVRPQzJTUiAgICAgICAgQ0g1RiAgICAgICAgICAgTExfQzFfSVBDQ19Jc0FjdGl2ZUZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMxVE9DMlNSICAgICAgICBDSDZGICAgICAgICAgICBMTF9DMV9JUENDX0lzQWN0aXZlRmxhZ19DSHgKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF82CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzFfSVBDQ19Jc0FjdGl2ZUZsYWdfQ0h4KElQQ0NfVHlwZURlZiAgY29uc3QgKmNvbnN0IElQQ0N4LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZXR1cm4gKChSRUFEX0JJVChJUENDeC0+QzFUT0MyU1IsIENoYW5uZWwpID09IChDaGFubmVsKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIElQQ0MgcmVjZWl2ZSBjaGFubmVsIHN0YXR1cyBmb3IgcHJvY2Vzc29yIDIuCisgICogQG5vdGUgICBBc3NvY2lhdGVkIHdpdGggSVBDQ19DMVRPQzJTUi5DSHhGCisgICogQHJtdG9sbCBDMlNDUiAgICAgICAgQ0gxQyAgICAgICAgICAgTExfQzJfSVBDQ19DbGVhckZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMyU0NSICAgICAgICBDSDJDICAgICAgICAgICBMTF9DMl9JUENDX0NsZWFyRmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENIM0MgICAgICAgICAgIExMX0MyX0lQQ0NfQ2xlYXJGbGFnX0NIeFxuCisgICogICAgICAgICBDMlNDUiAgICAgICAgQ0g0QyAgICAgICAgICAgTExfQzJfSVBDQ19DbGVhckZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMyU0NSICAgICAgICBDSDVDICAgICAgICAgICBMTF9DMl9JUENDX0NsZWFyRmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENINkMgICAgICAgICAgIExMX0MyX0lQQ0NfQ2xlYXJGbGFnX0NIeAorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF82CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9JUENDX0NsZWFyRmxhZ19DSHgoSVBDQ19UeXBlRGVmICpJUENDeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgV1JJVEVfUkVHKElQQ0N4LT5DMlNDUiwgQ2hhbm5lbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IElQQ0MgdHJhbnNtaXQgY2hhbm5lbCBzdGF0dXMgZm9yIHByb2Nlc3NvciAyLgorICAqIEBub3RlICAgQXNzb2NpYXRlZCB3aXRoIElQQ0NfQzJUT0MxU1IuQ0h4RgorICAqIEBybXRvbGwgQzJTQ1IgICAgICAgIENIMVMgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENIMlMgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENIM1MgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENINFMgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENINVMgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHhcbgorICAqICAgICAgICAgQzJTQ1IgICAgICAgIENINlMgICAgICAgICAgIExMX0MyX0lQQ0NfU2V0RmxhZ19DSHgKKyAgKiBAcGFyYW0gIElQQ0N4IElQQ0MgSW5zdGFuY2UuCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfSVBDQ19TZXRGbGFnX0NIeChJUENDX1R5cGVEZWYgKklQQ0N4LCB1aW50MzJfdCBDaGFubmVsKQoreworICBXUklURV9SRUcoSVBDQ3gtPkMyU0NSLCBDaGFubmVsIDw8IElQQ0NfQzJTQ1JfQ0gxU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjaGFubmVsIHN0YXR1cyBmb3IgcHJvY2Vzc29yIDIuCisgICogQHJtdG9sbCBDMlRPQzFTUiAgICAgICAgQ0gxRiAgICAgICAgICAgTExfQzJfSVBDQ19Jc0FjdGl2ZUZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMyVE9DMVNSICAgICAgICBDSDJGICAgICAgICAgICBMTF9DMl9JUENDX0lzQWN0aXZlRmxhZ19DSHhcbgorICAqICAgICAgICAgQzJUT0MxU1IgICAgICAgIENIM0YgICAgICAgICAgIExMX0MyX0lQQ0NfSXNBY3RpdmVGbGFnX0NIeFxuCisgICogICAgICAgICBDMlRPQzFTUiAgICAgICAgQ0g0RiAgICAgICAgICAgTExfQzJfSVBDQ19Jc0FjdGl2ZUZsYWdfQ0h4XG4KKyAgKiAgICAgICAgIEMyVE9DMVNSICAgICAgICBDSDVGICAgICAgICAgICBMTF9DMl9JUENDX0lzQWN0aXZlRmxhZ19DSHhcbgorICAqICAgICAgICAgQzJUT0MxU1IgICAgICAgIENINkYgICAgICAgICAgIExMX0MyX0lQQ0NfSXNBY3RpdmVGbGFnX0NIeAorICAqIEBwYXJhbSAgSVBDQ3ggSVBDQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JUENDX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lQQ0NfQ0hBTk5FTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVBDQ19DSEFOTkVMXzYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9JUENDX0lzQWN0aXZlRmxhZ19DSHgoSVBDQ19UeXBlRGVmICBjb25zdCAqY29uc3QgSVBDQ3gsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJldHVybiAoKFJFQURfQklUKElQQ0N4LT5DMlRPQzFTUiwgQ2hhbm5lbCkgPT0gKENoYW5uZWwpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoSVBDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9JUENDX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfaXdkZy5oIGIvSW5jL3N0bTMyd2J4eF9sbF9pd2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhZTJiOQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfaXdkZy5oCkBAIC0wLDAgKzEsMzQyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2l3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgSVdERyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX0lXREdfSAorI2RlZmluZSBTVE0zMldCeHhfTExfSVdER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChJV0RHKQorCisvKiogQGRlZmdyb3VwIElXREdfTEwgSVdERworICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBJV0RHX0xMX1ByaXZhdGVfQ29uc3RhbnRzIElXREcgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9SRUxPQUQgICAgICAgICAgICAgICAgIDB4MDAwMEFBQUFVICAgICAgICAgICAgICAgLyohPCBJV0RHIFJlbG9hZCBDb3VudGVyIEVuYWJsZSAgICovCisjZGVmaW5lIExMX0lXREdfS0VZX0VOQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwQ0NDQ1UgICAgICAgICAgICAgICAvKiE8IElXREcgUGVyaXBoZXJhbCBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgTExfSVdER19LRVlfV1JfQUNDRVNTX0VOQUJMRSAgICAgICAweDAwMDA1NTU1VSAgICAgICAgICAgICAgIC8qITwgSVdERyBLUiBXcml0ZSBBY2Nlc3MgRW5hYmxlICAqLworI2RlZmluZSBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRElTQUJMRSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBJV0RHIEtSIFdyaXRlIEFjY2VzcyBEaXNhYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9Db25zdGFudHMgSVdERyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0lXREdfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0lXREdfU1JfUFZVICAgICAgICAgICAgICAgICAgICAgSVdER19TUl9QVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdhdGNoZG9nIHByZXNjYWxlciB2YWx1ZSB1cGRhdGUgKi8KKyNkZWZpbmUgTExfSVdER19TUl9SVlUgICAgICAgICAgICAgICAgICAgICBJV0RHX1NSX1JWVSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgV2F0Y2hkb2cgY291bnRlciByZWxvYWQgdmFsdWUgdXBkYXRlICovCisjZGVmaW5lIExMX0lXREdfU1JfV1ZVICAgICAgICAgICAgICAgICAgICAgSVdER19TUl9XVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdhdGNoZG9nIGNvdW50ZXIgd2luZG93IHZhbHVlIHVwZGF0ZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VDX1BSRVNDQUxFUiAgUHJlc2NhbGVyIERpdmlkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl80ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDQgICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl84ICAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDggICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8xNiAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDE2ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8zMiAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzEgfCBJV0RHX1BSX1BSXzApICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDMyICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl82NCAgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIpICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDY0ICAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8xMjggICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzApICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDEyOCAqLworI2RlZmluZSBMTF9JV0RHX1BSRVNDQUxFUl8yNTYgICAgICAgICAgICAgIChJV0RHX1BSX1BSXzIgfCBJV0RHX1BSX1BSXzEpICAgICAgICAgLyohPCBEaXZpZGVyIGJ5IDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9NYWNyb3MgSVdERyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIElXREdfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBJV0RHIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gSVdERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfSVdER19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIElXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0lXREdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgSVdERyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBJV0RHX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIEluZGVwZW5kZW50IFdhdGNoZG9nCisgICogQG5vdGUgICBFeGNlcHQgaWYgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9wdGlvbiBpcyBzZWxlY3RlZAorICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19FbmFibGUKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRW5hYmxlKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX0VOQUJMRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsb2FkcyBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIEtSICAgICAgICAgICBLRVkgICAgICAgICAgIExMX0lXREdfUmVsb2FkQ291bnRlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19SZWxvYWRDb3VudGVyKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX1JFTE9BRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycworICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19FbmFibGVXcml0ZUFjY2VzcworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfSVdER19FbmFibGVXcml0ZUFjY2VzcyhJV0RHX1R5cGVEZWYgKklXREd4KQoreworICBXUklURV9SRUcoSVdER3gtPktSLCBMTF9JV0RHX0tFWV9XUl9BQ0NFU1NfRU5BQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHdyaXRlIGFjY2VzcyB0byBJV0RHX1BSLCBJV0RHX1JMUiBhbmQgSVdER19XSU5SIHJlZ2lzdGVycworICAqIEBybXRvbGwgS1IgICAgICAgICAgIEtFWSAgICAgICAgICAgTExfSVdER19EaXNhYmxlV3JpdGVBY2Nlc3MKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfRGlzYWJsZVdyaXRlQWNjZXNzKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+S1IsIExMX0lXREdfS0VZX1dSX0FDQ0VTU19ESVNBQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIHByZXNjYWxlciBvZiB0aGUgSVdERworICAqIEBybXRvbGwgUFIgICAgICAgICAgIFBSICAgICAgICAgICAgTExfSVdER19TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9JV0RHX1NldFByZXNjYWxlcihJV0RHX1R5cGVEZWYgKklXREd4LCB1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIFdSSVRFX1JFRyhJV0RHeC0+UFIsIElXREdfUFJfUFIgJiBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgc2VsZWN0ZWQgcHJlc2NhbGVyIG9mIHRoZSBJV0RHCisgICogQHJtdG9sbCBQUiAgICAgICAgICAgUFIgICAgICAgICAgICBMTF9JV0RHX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfSVdER19QUkVTQ0FMRVJfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9JV0RHX1BSRVNDQUxFUl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0lXREdfUFJFU0NBTEVSXzI1NgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfR2V0UHJlc2NhbGVyKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoUkVBRF9SRUcoSVdER3gtPlBSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3BlY2lmeSB0aGUgSVdERyBkb3duLWNvdW50ZXIgcmVsb2FkIHZhbHVlCisgICogQHJtdG9sbCBSTFIgICAgICAgICAgUkwgICAgICAgICAgICBMTF9JV0RHX1NldFJlbG9hZENvdW50ZXIKKyAgKiBAcGFyYW0gIElXREd4IElXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0UmVsb2FkQ291bnRlcihJV0RHX1R5cGVEZWYgKklXREd4LCB1aW50MzJfdCBDb3VudGVyKQoreworICBXUklURV9SRUcoSVdER3gtPlJMUiwgSVdER19STFJfUkwgJiBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHNwZWNpZmllZCBJV0RHIGRvd24tY291bnRlciByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFJMUiAgICAgICAgICBSTCAgICAgICAgICAgIExMX0lXREdfR2V0UmVsb2FkQ291bnRlcgorICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFJlbG9hZENvdW50ZXIoSVdER19UeXBlRGVmICpJV0RHeCkKK3sKKyAgcmV0dXJuIChSRUFEX1JFRyhJV0RHeC0+UkxSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3BlY2lmeSBoaWdoIGxpbWl0IG9mIHRoZSB3aW5kb3cgdmFsdWUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGRvd24tY291bnRlci4KKyAgKiBAcm10b2xsIFdJTlIgICAgICAgICBXSU4gICAgICAgICAgIExMX0lXREdfU2V0V2luZG93CisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBXaW5kb3cgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0lXREdfU2V0V2luZG93KElXREdfVHlwZURlZiAqSVdER3gsIHVpbnQzMl90IFdpbmRvdykKK3sKKyAgV1JJVEVfUkVHKElXREd4LT5XSU5SLCBJV0RHX1dJTlJfV0lOICYgV2luZG93KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGhpZ2ggbGltaXQgb2YgdGhlIHdpbmRvdyB2YWx1ZSBzcGVjaWZpZWQuCisgICogQHJtdG9sbCBXSU5SICAgICAgICAgV0lOICAgICAgICAgICBMTF9JV0RHX0dldFdpbmRvdworICAqIEBwYXJhbSAgSVdER3ggSVdERyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDBGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9JV0RHX0dldFdpbmRvdyhJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKFJFQURfUkVHKElXREd4LT5XSU5SKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVdER19MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFByZXNjYWxlciBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFBWVSAgICAgICAgICAgTExfSVdER19Jc0FjdGl2ZUZsYWdfUFZVCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc0FjdGl2ZUZsYWdfUFZVKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9QVlUpID09IChJV0RHX1NSX1BWVSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFJlbG9hZCBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFJWVSAgICAgICAgICAgTExfSVdER19Jc0FjdGl2ZUZsYWdfUlZVCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc0FjdGl2ZUZsYWdfUlZVKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9SVlUpID09IChJV0RHX1NSX1JWVSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBmbGFnIFdpbmRvdyBWYWx1ZSBVcGRhdGUgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFdWVSAgICAgICAgICAgTExfSVdER19Jc0FjdGl2ZUZsYWdfV1ZVCisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfSVdER19Jc0FjdGl2ZUZsYWdfV1ZVKElXREdfVHlwZURlZiAqSVdER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKElXREd4LT5TUiwgSVdER19TUl9XVlUpID09IChJV0RHX1NSX1dWVSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhbGwgZmxhZ3MgUHJlc2NhbGVyLCBSZWxvYWQgJiBXaW5kb3cgVmFsdWUgVXBkYXRlIGFyZSByZXNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBQVlUgICAgICAgICAgIExMX0lXREdfSXNSZWFkeVxuCisgICogICAgICAgICBTUiAgICAgICAgICAgV1ZVICAgICAgICAgICBMTF9JV0RHX0lzUmVhZHlcbgorICAqICAgICAgICAgU1IgICAgICAgICAgIFJWVSAgICAgICAgICAgTExfSVdER19Jc1JlYWR5CisgICogQHBhcmFtICBJV0RHeCBJV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXRzICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0lXREdfSXNSZWFkeShJV0RHX1R5cGVEZWYgKklXREd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChJV0RHeC0+U1IsIElXREdfU1JfUFZVIHwgSVdER19TUl9SVlUgfCBJV0RHX1NSX1dWVSkgPT0gMFUpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSVdERyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX0lXREdfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9scHRpbS5oIGIvSW5jL3N0bTMyd2J4eF9sbF9scHRpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2xwdGltLmgKQEAgLTAsMCArMSwxNDUzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2xwdGltLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIExQVElNIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfTFBUSU1fSAorI2RlZmluZSBTVE0zMldCeHhfTExfTFBUSU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVElNMSkgfHwgZGVmaW5lZCAoTFBUSU0yKQorCisvKiogQGRlZmdyb3VwIExQVElNX0xMIExQVElNCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIExQVElNX0xMX1ByaXZhdGVfTWFjcm9zIExQVElNIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FU19JTklUIExQVElNIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBMUFRJTSBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBDbG9ja1NvdXJjZTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgY2xvY2sgdXNlZCBieSB0aGUgTFBUSU0gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fTExfRUNfQ0xLX1NPVVJDRS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX1NldENsb2NrU291cmNlKCkuKi8KKworICB1aW50MzJfdCBQcmVzY2FsZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHByZXNjYWxlciBkaXZpc2lvbiByYXRpby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9MUFRJTV9TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IFdhdmVmb3JtOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgd2F2ZWZvcm0gc2hhcGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fTExfRUNfT1VUUFVUX1dBVkVGT1JNLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBUSU1fQ29uZmlnT3V0cHV0KCkuKi8KKworICB1aW50MzJfdCBQb2xhcml0eTsgICAgICAgLyohPCBTcGVjaWZpZXMgd2F2ZWZvcm0gcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fTExfRUNfT1VUUFVUX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBUSU1fQ29uZmlnT3V0cHV0KCkuKi8KK30gTExfTFBUSU1fSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBMUFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFRJTV9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX0NNUE0gICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfQ01QTSAgICAgLyohPCBDb21wYXJlIG1hdGNoICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9BUlJNICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0FSUk0gICAgIC8qITwgQXV0b3JlbG9hZCBtYXRjaCAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfRVhUVFJJRyAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9FWFRUUklHICAvKiE8IEV4dGVybmFsIHRyaWdnZXIgZWRnZSBldmVudCAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfQ01QT0sgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9DTVBPSyAgICAvKiE8IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LICovCisjZGVmaW5lIExMX0xQVElNX0lTUl9BUlJPSyAgICAgICAgICAgICAgICAgICAgTFBUSU1fSVNSX0FSUk9LICAgIC8qITwgQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgKi8KKyNkZWZpbmUgTExfTFBUSU1fSVNSX1VQICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JU1JfVVAgICAgICAgLyohPCBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgZG93biB0byB1cCAqLworI2RlZmluZSBMTF9MUFRJTV9JU1JfRE9XTiAgICAgICAgICAgICAgICAgICAgIExQVElNX0lTUl9ET1dOICAgICAvKiE8IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSB1cCB0byBkb3duICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVElNX1JlYWRSZWcgYW5kICBMTF9MUFRJTV9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfQ01QTUlFICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9DTVBNSUUgICAgICAgLyohPCBDb21wYXJlIG1hdGNoIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX0FSUk1JRSAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfQVJSTUlFICAgICAgIC8qITwgQXV0b3JlbG9hZCBtYXRjaCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9FWFRUUklHSUUgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0VYVFRSSUdJRSAgICAvKiE8IEV4dGVybmFsIHRyaWdnZXIgdmFsaWQgZWRnZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX0xQVElNX0lFUl9DTVBPS0lFICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX0NNUE9LSUUgICAgICAvKiE8IENvbXBhcmUgcmVnaXN0ZXIgdXBkYXRlIE9LIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX0FSUk9LSUUgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfQVJST0tJRSAgICAgIC8qITwgQXV0b3JlbG9hZCByZWdpc3RlciB1cGRhdGUgT0sgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9MUFRJTV9JRVJfVVBJRSAgICAgICAgICAgICAgICAgICAgIExQVElNX0lFUl9VUElFICAgICAgICAgLyohPCBEaXJlY3Rpb24gY2hhbmdlIHRvIFVQIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTExfTFBUSU1fSUVSX0RPV05JRSAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfRE9XTklFICAgICAgIC8qITwgRGlyZWN0aW9uIGNoYW5nZSB0byBkb3duIEludGVycnVwdCBFbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfT1BFUkFUSU5HX01PREUgT3BlcmF0aW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9PUEVSQVRJTkdfTU9ERV9DT05USU5VT1VTICAgIExQVElNX0NSX0NOVFNUUlQgLyohPExQIFRpbWVyIHN0YXJ0cyBpbiBjb250aW51b3VzIG1vZGUqLworI2RlZmluZSBMTF9MUFRJTV9PUEVSQVRJTkdfTU9ERV9PTkVTSE9UICAgICAgIExQVElNX0NSX1NOR1NUUlQgLyohPExQIFRpbG1lciBzdGFydHMgaW4gc2luZ2xlIG1vZGUqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19VUERBVEVfTU9ERSBVcGRhdGUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1VQREFURV9NT0RFX0lNTUVESUFURSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITxQcmVsb2FkIGlzIGRpc2FibGVkOiByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBBUEIgYnVzIHdyaXRlIGFjY2VzcyovCisjZGVmaW5lIExMX0xQVElNX1VQREFURV9NT0RFX0VORE9GUEVSSU9EICAgICAgTFBUSU1fQ0ZHUl9QUkVMT0FEIC8qITxwcmVsb2FkIGlzIGVuYWJsZWQ6IHJlZ2lzdGVycyBhcmUgdXBkYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IExQVElNIHBlcmlvZCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0NPVU5URVJfTU9ERSBDb3VudGVyIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DT1VOVEVSX01PREVfSU5URVJOQUwgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITxUaGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBmb2xsb3dpbmcgZWFjaCBpbnRlcm5hbCBjbG9jayBwdWxzZSovCisjZGVmaW5lIExMX0xQVElNX0NPVU5URVJfTU9ERV9FWFRFUk5BTCAgICAgICAgTFBUSU1fQ0ZHUl9DT1VOVE1PREUgLyohPFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvbGxvd2luZyBlYWNoIHZhbGlkIGNsb2NrIHB1bHNlIG9uIHRoZSBMUFRJTSBleHRlcm5hbCBJbnB1dDEqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19PVVRQVVRfV0FWRUZPUk0gT3V0cHV0IFdhdmVmb3JtIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8TFBUSU0gIGdlbmVyYXRlcyBlaXRoZXIgYSBQV00gd2F2ZWZvcm0gb3IgYSBPbmUgcHVsc2Ugd2F2ZWZvcm0gZGVwZW5kaW5nIG9uIGNob3NlbiBvcGVyYXRpbmcgbW9kZSBDT05USU5PVVMgb3IgU0lOR0xFKi8KKyNkZWZpbmUgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1NFVE9OQ0UgICAgICBMUFRJTV9DRkdSX1dBVkUgLyohPExQVElNICBnZW5lcmF0ZXMgYSBTZXQgT25jZSB3YXZlZm9ybSovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09VVFBVVF9QT0xBUklUWSBPdXRwdXQgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfUkVHVUxBUiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxUaGUgTFBUSU0gb3V0cHV0IHJlZmxlY3RzIHRoZSBjb21wYXJlIHJlc3VsdHMgYmV0d2VlbiBMUFRJTXhfQVJSIGFuZCBMUFRJTXhfQ01QIHJlZ2lzdGVycyovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wgICAgICAgLyohPFRoZSBMUFRJTSBvdXRwdXQgcmVmbGVjdHMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBhcmUgcmVzdWx0cyBiZXR3ZWVuIExQVElNeF9BUlIgYW5kIExQVElNeF9DTVAgcmVnaXN0ZXJzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfUFJFU0NBTEVSIFByZXNjYWxlciBWYWx1ZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDEqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMCAgICAgICAgICAgICAgICAgICAgICAgIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byAyKi8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzEgICAgICAgICAgICAgICAgICAgICAgICAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gNCovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMSB8IExQVElNX0NGR1JfUFJFU0NfMCkgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDgqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0NfMiAgICAgICAgICAgICAgICAgICAgICAgIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byAxNiovCisjZGVmaW5lIExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMiAgICAgICAgICAgICAgKExQVElNX0NGR1JfUFJFU0NfMiB8IExQVElNX0NGR1JfUFJFU0NfMCkgLyohPFByZXNjYWxlciBkaXZpc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDMyKi8KKyNkZWZpbmUgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjY0ICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18yIHwgTFBUSU1fQ0ZHUl9QUkVTQ18xKSAvKiE8UHJlc2NhbGVyIGRpdmlzaW9uIGZhY3RvciBpcyBzZXQgdG8gNjQqLworI2RlZmluZSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTI4ICAgICAgICAgICAgIExQVElNX0NGR1JfUFJFU0MgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxQcmVzY2FsZXIgZGl2aXNpb24gZmFjdG9yIGlzIHNldCB0byAxMjgqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19UUklHX1NPVVJDRSBUcmlnZ2VyIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX0dQSU8gICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFRJTXhfRVRSIGlucHV0Ki8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIEFsYXJtIEEqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENBTEFSTUIgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgQWxhcm0gQiovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAxICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8xIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMSovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAyICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMiovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAzICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8yIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzApICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMyovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAxICAgICAgICAgICAgKExQVElNX0NGR1JfVFJJR1NFTF8yIHwgTFBUSU1fQ0ZHUl9UUklHU0VMXzEpICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIENPTVAyIG91dHB1dCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfRklMVEVSIFRyaWdnZXIgRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgIC8qITxBbnkgdHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIGlzIGNvbnNpZGVyZWQgYXMgYSB2YWxpZCB0cmlnZ2VyKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfMiAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8wIC8qITxUcmlnZ2VyIGFjdGl2ZSBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDIgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmlnZ2VyKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfNCAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8xIC8qITxUcmlnZ2VyIGFjdGl2ZSBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDQgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmlnZ2VyKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfOCAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSR0ZMVCAgIC8qITxUcmlnZ2VyIGFjdGl2ZSBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDggY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmlnZ2VyKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfVFJJR19QT0xBUklUWSBUcmlnZ2VyIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkcgICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8wIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgcmlzaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgIExQVElNX0NGR1JfVFJJR0VOXzEgLyohPExQVElNIGNvdW50ZXIgc3RhcnRzIHdoZW4gYSBmYWxsaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HIExQVElNX0NGR1JfVFJJR0VOICAgLyohPExQVElNIGNvdW50ZXIgc3RhcnRzIHdoZW4gYSByaXNpbmcgb3IgYSBmYWxsaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19DTEtfU09VUkNFIENsb2NrIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAvKiE8TFBUSU0gaXMgY2xvY2tlZCBieSBpbnRlcm5hbCBjbG9jayBzb3VyY2UgKEFQQiBjbG9jayBvciBhbnkgb2YgdGhlIGVtYmVkZGVkIG9zY2lsbGF0b3JzKSovCisjZGVmaW5lIExMX0xQVElNX0NMS19TT1VSQ0VfRVhURVJOQUwgICAgICAgICAgTFBUSU1fQ0ZHUl9DS1NFTCAvKiE8TFBUSU0gaXMgY2xvY2tlZCBieSBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UgdGhyb3VnaCB0aGUgTFBUSU0gZXh0ZXJuYWwgSW5wdXQxKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ0xLX0ZJTFRFUiBDbG9jayBGaWx0ZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8QW55IGV4dGVybmFsIGNsb2NrIHNpZ25hbCBsZXZlbCBjaGFuZ2UgaXMgY29uc2lkZXJlZCBhcyBhIHZhbGlkIHRyYW5zaXRpb24qLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSXzIgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tGTFRfMCAvKiE8RXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgMiBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyYW5zaXRpb24qLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSXzQgICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tGTFRfMSAvKiE8RXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgNCBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyYW5zaXRpb24qLworI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSXzggICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tGTFQgICAvKiE8RXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgOCBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyYW5zaXRpb24qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19DTEtfUE9MQVJJVFkgQ2xvY2sgUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfUklTSU5HICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IFRoZSByaXNpbmcgZWRnZSBpcyB0aGUgYWN0aXZlIGVkZ2UgdXNlZCBmb3IgY291bnRpbmcqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfRkFMTElORyAgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMCAvKiE8IFRoZSBmYWxsaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KKyNkZWZpbmUgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICBMUFRJTV9DRkdSX0NLUE9MXzEgLyohPCBCb3RoIGVkZ2VzIGFyZSBhY3RpdmUgZWRnZXMqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19FTkNPREVSX01PREUgRW5jb2RlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lORyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgLyohPCBUaGUgcmlzaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KKyNkZWZpbmUgTExfTFBUSU1fRU5DT0RFUl9NT0RFX0ZBTExJTkcgICAgICAgICBMUFRJTV9DRkdSX0NLUE9MXzAgLyohPCBUaGUgZmFsbGluZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkdfRkFMTElORyAgTFBUSU1fQ0ZHUl9DS1BPTF8xIC8qITwgQm90aCBlZGdlcyBhcmUgYWN0aXZlIGVkZ2VzKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRUNfSU5QVVQxX1NSQyBJbnB1dDEgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBUSU1fSU5QVVQxX1NSQ19HUElPICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IEZvciBMUFRJTTEgYW5kIExQVElNMiAqLworI2RlZmluZSBMTF9MUFRJTV9JTlBVVDFfU1JDX0NPTVAxICAgICAgICBMUFRJTV9PUl9PUl8wICAgICAgICAgIC8qITwgRm9yIExQVElNMSBhbmQgTFBUSU0yICovCisjZGVmaW5lIExMX0xQVElNX0lOUFVUMV9TUkNfQ09NUDIgICAgICAgIExQVElNX09SX09SXzEgICAgICAgICAgLyohPCBGb3IgTFBUSU0yICovCisjZGVmaW5lIExMX0xQVElNX0lOUFVUMV9TUkNfQ09NUDFfQ09NUDIgIExQVElNX09SX09SICAgICAgICAgICAgLyohPCBGb3IgTFBUSU0yICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0VDX0lOUFVUMl9TUkMgSW5wdXQyIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVElNX0lOUFVUMl9TUkNfR1BJTyAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgRm9yIExQVElNMSAqLworI2RlZmluZSBMTF9MUFRJTV9JTlBVVDJfU1JDX0NPTVAyICAgICAgICBMUFRJTV9PUl9PUl8xICAgICAgICAgICAgICAgICAvKiE8IEZvciBMUFRJTTEgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIExQVElNIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBMUFRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9MUFRJTV9Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKChfX0lOU1RBTkNFX18pLT4oX19SRUdfXyksIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBMUFRJTSByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0xQVElNX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRygoX19JTlNUQU5DRV9fKS0+KF9fUkVHX18pKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfSW5pdCBJbml0aWFsaXNhdGlvbiBhbmQgZGVpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCitFcnJvclN0YXR1cyBMTF9MUFRJTV9EZUluaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KTsKK3ZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9MUFRJTV9Jbml0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYgKkxQVElNX0luaXRTdHJ1Y3QpOwordm9pZCBMTF9MUFRJTV9EaXNhYmxlKExQVElNX1R5cGVEZWYgKkxQVElNeCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX0xQVElNX0NvbmZpZ3VyYXRpb24gTFBUSU0gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBMUFRJTSBpbnN0YW5jZQorICAqIEBub3RlIEFmdGVyIHNldHRpbmcgdGhlIEVOQUJMRSBiaXQsIGEgZGVsYXkgb2YgdHdvIGNvdW50ZXIgY2xvY2sgaXMgbmVlZGVkCisgICogICAgICAgYmVmb3JlIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBhY3R1YWxseSBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fRW5hYmxlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9FbmFibGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX0VOQUJMRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIExQVElNIGluc3RhbmNlIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU5BQkxFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfRU5BQkxFKSA9PSBMUFRJTV9DUl9FTkFCTEUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIGNvdW50ZXIgaW4gdGhlIGRlc2lyZWQgbW9kZS4KKyAgKiBAbm90ZSBMUFRJTSBpbnN0YW5jZSBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb3VudGVyLgorICAqIEBub3RlIEl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSBvbiB0aGUgZmx5IGZyb20gT25lIFNob3QgbW9kZSB0bworICAqICAgICAgIENvbnRpbnVvdXMgbW9kZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDTlRTVFJUICAgICAgIExMX0xQVElNX1N0YXJ0Q291bnRlclxuCisgICogICAgICAgICBDUiAgICAgICAgICAgU05HU1RSVCAgICAgICBMTF9MUFRJTV9TdGFydENvdW50ZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9wZXJhdGluZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PUEVSQVRJTkdfTU9ERV9DT05USU5VT1VTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU3RhcnRDb3VudGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgT3BlcmF0aW5nTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNSLCBMUFRJTV9DUl9DTlRTVFJUIHwgTFBUSU1fQ1JfU05HU1RSVCwgT3BlcmF0aW5nTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHJlc2V0IGFmdGVyIHJlYWQuCisgICogQG5vdGUgQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFueSByZWFkIGFjY2VzcyB0byBMUFRJTV9DTlQKKyAgKiAgICAgICAgcmVnaXN0ZXIgd2lsbCBhc3luY2hyb25vdXNseSByZXNldCB0aGUgTFBUSU1fQ05UIHJlZ2lzdGVyIGNvbnRlbnQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUlNUQVJFICAgICAgICBMTF9MUFRJTV9FbmFibGVSZXNldEFmdGVyUmVhZAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlUmVzZXRBZnRlclJlYWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX1JTVEFSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSByZXNldCBhZnRlciByZWFkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJTVEFSRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZVJlc2V0QWZ0ZXJSZWFkCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlUmVzZXRBZnRlclJlYWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfUlNUQVJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByZXNldCBhZnRlciByZWFkIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSU1RBUkUgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZFJlc2V0QWZ0ZXJSZWFkCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkUmVzZXRBZnRlclJlYWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfUlNUQVJFKSA9PSBMUFRJTV9DUl9SU1RBUkUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXNldCBvZiB0aGUgTFBUSU1fQ05UIGNvdW50ZXIgcmVnaXN0ZXIgKHN5bmNocm9ub3VzKS4KKyAgKiBAbm90ZSBEdWUgdG8gdGhlIHN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGlzIHJlc2V0LCBpdCBvbmx5IHRha2VzCisgICogICAgICAgcGxhY2UgYWZ0ZXIgYSBzeW5jaHJvbml6YXRpb24gZGVsYXkgb2YgMyBMUFRJTSBjb3JlIGNsb2NrIGN5Y2xlcworICAqICAgICAgKExQVElNIGNvcmUgY2xvY2sgbWF5IGJlIGRpZmZlcmVudCBmcm9tIEFQQiBjbG9jaykuCisgICogQG5vdGUgQ09VTlRSU1QgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGJ5IGhhcmR3YXJlCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ09VTlRSU1QgICAgICAgTExfTFBUSU1fUmVzZXRDb3VudGVyXG4KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1Jlc2V0Q291bnRlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfQ09VTlRSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgTFBUSU0gcmVnaXN0ZXJzIHVwZGF0ZSBtb2RlIChlbmFibGUvZGlzYWJsZSByZWdpc3RlciBwcmVsb2FkKQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFJFTE9BRCAgICAgICBMTF9MUFRJTV9TZXRVcGRhdGVNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBVcGRhdGVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVVBEQVRFX01PREVfSU1NRURJQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVVBEQVRFX01PREVfRU5ET0ZQRVJJT0QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1NldFVwZGF0ZU1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBVcGRhdGVNb2RlKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9QUkVMT0FELCBVcGRhdGVNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIExQVElNIHJlZ2lzdGVycyB1cGRhdGUgbW9kZQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBSRUxPQUQgICAgICAgTExfTFBUSU1fR2V0VXBkYXRlTW9kZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9VUERBVEVfTU9ERV9JTU1FRElBVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9VUERBVEVfTU9ERV9FTkRPRlBFUklPRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldFVwZGF0ZU1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfUFJFTE9BRCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYXV0byByZWxvYWQgdmFsdWUKKyAgKiBAbm90ZSBUaGUgTFBUSU14X0FSUiByZWdpc3RlciBjb250ZW50IG11c3Qgb25seSBiZSBtb2RpZmllZCB3aGVuIHRoZSBMUFRJTSBpcyBlbmFibGVkCisgICogQG5vdGUgQWZ0ZXIgYSB3cml0ZSB0byB0aGUgTFBUSU14X0FSUiByZWdpc3RlciBhIG5ldyB3cml0ZSBvcGVyYXRpb24gdG8gdGhlCisgICogICAgICAgc2FtZSByZWdpc3RlciBjYW4gb25seSBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcHJldmlvdXMgd3JpdGUgb3BlcmF0aW9uCisgICogICAgICAgaXMgY29tcGxldGVkLiBBbnkgc3VjY2Vzc2l2ZSB3cml0ZSBiZWZvcmUgIHRoZSBBUlJPSyBmbGFnIGJlIHNldCwgd2lsbAorICAqICAgICAgIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHRzLgorICAqIEBub3RlIGF1dG9yZWxvYWQgdmFsdWUgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoZSBjb21wYXJlIHZhbHVlLgorICAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfTFBUSU1fU2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JlbG9hZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0QXV0b1JlbG9hZChMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IEF1dG9SZWxvYWQpCit7CisgIE1PRElGWV9SRUcoTFBUSU14LT5BUlIsIExQVElNX0FSUl9BUlIsIEF1dG9SZWxvYWQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgYXV0byByZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX0xQVElNX0dldEF1dG9SZWxvYWQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEF1dG9SZWxvYWQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRBdXRvUmVsb2FkKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5BUlIsIExQVElNX0FSUl9BUlIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNvbXBhcmUgdmFsdWUKKyAgKiBAbm90ZSBBZnRlciBhIHdyaXRlIHRvIHRoZSBMUFRJTXhfQ01QIHJlZ2lzdGVyIGEgbmV3IHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKKyAgKiAgICAgICBzYW1lIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwcmV2aW91cyB3cml0ZSBvcGVyYXRpb24KKyAgKiAgICAgICBpcyBjb21wbGV0ZWQuIEFueSBzdWNjZXNzaXZlIHdyaXRlIGJlZm9yZSB0aGUgQ01QT0sgZmxhZyBiZSBzZXQsIHdpbGwKKyAgKiAgICAgICBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0cy4KKyAgKiBAcm10b2xsIENNUCAgICAgICAgICBDTVAgICAgICAgICAgIExMX0xQVElNX1NldENvbXBhcmUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0Q29tcGFyZShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNNUCwgTFBUSU1fQ01QX0NNUCwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGNvbXBhcmUgdmFsdWUKKyAgKiBAcm10b2xsIENNUCAgICAgICAgICBDTVAgICAgICAgICAgIExMX0xQVElNX0dldENvbXBhcmUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldENvbXBhcmUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNNUCwgTFBUSU1fQ01QX0NNUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY291bnRlciB2YWx1ZQorICAqIEBub3RlIFdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIHJ1bm5pbmcgd2l0aCBhbiBhc3luY2hyb25vdXMgY2xvY2ssIHJlYWRpbmcKKyAgKiAgICAgICB0aGUgTFBUSU14X0NOVCByZWdpc3RlciBtYXkgcmV0dXJuIHVucmVsaWFibGUgdmFsdWVzLiBTbyBpbiB0aGlzIGNhc2UKKyAgKiAgICAgICBpdCBpcyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0d28gY29uc2VjdXRpdmUgcmVhZCBhY2Nlc3NlcyBhbmQgdmVyaWZ5CisgICogICAgICAgdGhhdCB0aGUgdHdvIHJldHVybmVkIHZhbHVlcyBhcmUgaWRlbnRpY2FsLgorICAqIEBybXRvbGwgQ05UICAgICAgICAgIENOVCAgICAgICAgICAgTExfTFBUSU1fR2V0Q291bnRlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ291bnRlciB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldENvdW50ZXIoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNOVCwgTFBUSU1fQ05UX0NOVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY291bnRlciBtb2RlIChzZWxlY3Rpb24gb2YgdGhlIExQVElNIGNvdW50ZXIgY2xvY2sgc291cmNlKS4KKyAgKiBAbm90ZSBUaGUgY291bnRlciBtb2RlIGNhbiBiZSBzZXQgb25seSB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDT1VOVE1PREUgICAgIExMX0xQVElNX1NldENvdW50ZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb3VudGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NPVU5URVJfTU9ERV9JTlRFUk5BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NPVU5URVJfTU9ERV9FWFRFUk5BTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0Q291bnRlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBDb3VudGVyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ09VTlRNT0RFLCBDb3VudGVyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjb3VudGVyIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDT1VOVE1PREUgICAgIExMX0xQVElNX0dldENvdW50ZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NPVU5URVJfTU9ERV9JTlRFUk5BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NPVU5URVJfTU9ERV9FWFRFUk5BTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldENvdW50ZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NPVU5UTU9ERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTFBUSU0gaW5zdGFuY2Ugb3V0cHV0IChMUFRJTXhfT1VUKQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgUmVnYXJkaW5nIHRoZSBMUFRJTSBvdXRwdXQgcG9sYXJpdHkgdGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QKKyAgKiAgICAgICBpbW1lZGlhdGVseSwgc28gdGhlIG91dHB1dCBkZWZhdWx0IHZhbHVlIHdpbGwgY2hhbmdlIGltbWVkaWF0ZWx5IGFmdGVyCisgICogICAgICAgdGhlIHBvbGFyaXR5IGlzIHJlLWNvbmZpZ3VyZWQsIGV2ZW4gYmVmb3JlIHRoZSB0aW1lciBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFdBVkUgICAgICAgICAgTExfTFBUSU1fQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBXQVZQT0wgICAgICAgIExMX0xQVElNX0NvbmZpZ091dHB1dAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgV2F2ZWZvcm0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fUFdNCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1NFVE9OQ0UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnT3V0cHV0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgV2F2ZWZvcm0sIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9XQVZFIHwgTFBUSU1fQ0ZHUl9XQVZQT0wsIFdhdmVmb3JtIHwgUG9sYXJpdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCAgd2F2ZWZvcm0gc2hhcGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBXQVZFICAgICAgICAgIExMX0xQVElNX1NldFdhdmVmb3JtCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBXYXZlZm9ybSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fU0VUT05DRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0V2F2ZWZvcm0oTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBXYXZlZm9ybSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfV0FWRSwgV2F2ZWZvcm0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgd2F2ZWZvcm0gc2hhcGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBXQVZFICAgICAgICAgIExMX0xQVElNX0dldFdhdmVmb3JtCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fU0VUT05DRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldFdhdmVmb3JtKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1dBVkUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgIG91dHB1dCBwb2xhcml0eQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFdBVlBPTCAgICAgICAgTExfTFBUSU1fU2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0UG9sYXJpdHkoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfV0FWUE9MLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBvdXRwdXQgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBXQVZQT0wgICAgICAgIExMX0xQVElNX0dldFBvbGFyaXR5CisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRQb2xhcml0eShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9XQVZQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYWN0dWFsIHByZXNjYWxlciBkaXZpc2lvbiByYXRpby4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIFdoZW4gdGhlIExQVElNIGlzIGNvbmZpZ3VyZWQgdG8gYmUgY2xvY2tlZCBieSBhbiBpbnRlcm5hbCBjbG9jayBzb3VyY2UKKyAgKiAgICAgICBhbmQgdGhlIExQVElNIGNvdW50ZXIgaXMgY29uZmlndXJlZCB0byBiZSB1cGRhdGVkIGJ5IGFjdGl2ZSBlZGdlcworICAqICAgICAgIGRldGVjdGVkIG9uIHRoZSBMUFRJTSBleHRlcm5hbCBJbnB1dDEsIHRoZSBpbnRlcm5hbCBjbG9jayBwcm92aWRlZCB0bworICAqICAgICAgIHRoZSBMUFRJTSBtdXN0IGJlIG5vdCBiZSBwcmVzY2FsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFJFU0MgICAgICAgICBMTF9MUFRJTV9TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0UHJlc2NhbGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9QUkVTQywgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIHByZXNjYWxlciBkaXZpc2lvbiByYXRpby4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUkVTQyAgICAgICAgIExMX0xQVElNX0dldFByZXNjYWxlcgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1BSRVNDQUxFUl9ESVYxMjgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRQcmVzY2FsZXIoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfUFJFU0MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTFBUSU0gaW5wdXQgMSBzb3VyY2UgKGRlZmF1bHQgR1BJTykuCisgICogQHJtdG9sbCBPUiAgICAgICAgIE9SXzAgICAgICAgICBMTF9MUFRJTV9TZXRJbnB1dDFTcmMKKyAgKiBAcm10b2xsIE9SICAgICAgICAgT1JfMSAgICAgICAgIExMX0xQVElNX1NldElucHV0MVNyYworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fSU5QVVQxX1NSQ19HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fSU5QVVQxX1NSQ19DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0lOUFVUMV9TUkNfQ09NUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9JTlBVVDFfU1JDX0NPTVAxX0NPTVAyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRJbnB1dDFTcmMoTFBUSU1fVHlwZURlZiAqTFBUSU14LCB1aW50MzJfdCBTcmMpCit7CisgIFdSSVRFX1JFRyhMUFRJTXgtPk9SLCBTcmMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBMUFRJTSBpbnB1dCAyIHNvdXJjZSAoZGVmYXVsdCBHUElPKS4KKyAgKiBAcm10b2xsIE9SICAgICAgICAgT1JfMCAgICAgICAgIExMX0xQVElNX1NldElucHV0MlNyYworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgU3JjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fSU5QVVQyX1NSQ19HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fSU5QVVQyX1NSQ19DT01QMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fU2V0SW5wdXQyU3JjKExQVElNX1R5cGVEZWYgKkxQVElNeCwgdWludDMyX3QgU3JjKQoreworICBXUklURV9SRUcoTFBUSU14LT5PUiwgU3JjKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9UcmlnZ2VyX0NvbmZpZ3VyYXRpb24gVHJpZ2dlciBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIFRoZSBmaXJzdCB0cmlnZ2VyIGV2ZW50IHdpbGwgc3RhcnQgdGhlIHRpbWVyLCBhbnkgc3VjY2Vzc2l2ZSB0cmlnZ2VyCisgICogICAgICAgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHdpbGwgcmVzdGFydC4KKyAgKiBAbm90ZSBUaGUgdGltZW91dCB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgY29tcGFyZSB2YWx1ZTsgaWYgbm8gdHJpZ2dlcgorICAqICAgICAgIG9jY3VycyB3aXRoaW4gdGhlIGV4cGVjdGVkIHRpbWUgZnJhbWUsIHRoZSBNQ1UgaXMgd2FrZWQtdXAgYnkgdGhlCisgICogICAgICAgY29tcGFyZSBtYXRjaCBldmVudC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUSU1PVVQgICAgICAgIExMX0xQVElNX0VuYWJsZVRpbWVvdXQKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZVRpbWVvdXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9USU1PVVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIEEgdHJpZ2dlciBldmVudCBhcnJpdmluZyB3aGVuIHRoZSB0aW1lciBpcyBhbHJlYWR5IHN0YXJ0ZWQgd2lsbCBiZQorICAqICAgICAgIGlnbm9yZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVElNT1VUICAgICAgICBMTF9MUFRJTV9EaXNhYmxlVGltZW91dAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZVRpbWVvdXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RJTU9VVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0aGUgdGltZW91dCBmdW5jdGlvbiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRJTU9VVCAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkVGltZW91dAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZFRpbWVvdXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RJTU9VVCkgPT0gTFBUSU1fQ0ZHUl9USU1PVVQpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gY291bnRlcgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJJR0VOICAgICAgICBMTF9MUFRJTV9UcmlnU3cKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX1RyaWdTdyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGV4dGVybmFsIHRyaWdnZXIgdXNlZCBhcyBhIHRyaWdnZXIgZXZlbnQgZm9yIHRoZSBMUFRJTS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIEFuIGludGVybmFsIGNsb2NrIHNvdXJjZSBtdXN0IGJlIHByZXNlbnQgd2hlbiBhIGRpZ2l0YWwgZmlsdGVyIGlzCisgICogICAgICAgcmVxdWlyZWQgZm9yIHRoZSB0cmlnZ2VyLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSSUdTRUwgICAgICAgTExfTFBUSU1fQ29uZmlnVHJpZ2dlclxuCisgICogICAgICAgICBDRkdSICAgICAgICAgVFJHRkxUICAgICAgICBMTF9MUFRJTV9Db25maWdUcmlnZ2VyXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBUUklHRU4gICAgICAgIExMX0xQVElNX0NvbmZpZ1RyaWdnZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENBTEFSTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENBTEFSTUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyCisgICogQHBhcmFtICBGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl84CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ29uZmlnVHJpZ2dlcihMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgRmlsdGVyLCB1aW50MzJfdCBQb2xhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR1NFTCB8IExQVElNX0NGR1JfVFJHRkxUIHwgTFBUSU1fQ0ZHUl9UUklHRU4sIFNvdXJjZSB8IEZpbHRlciB8IFBvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGV4dGVybmFsIHRyaWdnZXIgc291cmNlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFRSSUdTRUwgICAgICAgTExfTFBUSU1fR2V0VHJpZ2dlclNvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9HUElPCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAzCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0dldFRyaWdnZXJTb3VyY2UoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXh0ZXJuYWwgdHJpZ2dlciBmaWx0ZXIuCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgVFJHRkxUICAgICAgICBMTF9MUFRJTV9HZXRUcmlnZ2VyRmlsdGVyCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX0ZJTFRFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fVFJJR19GSUxURVJfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfRklMVEVSXzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRUcmlnZ2VyRmlsdGVyKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RSR0ZMVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBUUklHRU4gICAgICAgIExMX0xQVElNX0dldFRyaWdnZXJQb2xhcml0eQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRUcmlnZ2VyUG9sYXJpdHkoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVFJJR0VOKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfQ2xvY2tfQ29uZmlndXJhdGlvbiBDbG9jayBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNvdXJjZSBvZiB0aGUgY2xvY2sgdXNlZCBieSB0aGUgTFBUSU0gaW5zdGFuY2UuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBDS1NFTCAgICAgICAgIExMX0xQVElNX1NldENsb2NrU291cmNlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1NvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRDbG9ja1NvdXJjZShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IENsb2NrU291cmNlKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS1NFTCwgQ2xvY2tTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgTFBUSU0gaW5zdGFuY2UgY2xvY2sgc291cmNlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLU0VMICAgICAgICAgTExfTFBUSU1fR2V0Q2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1NPVVJDRV9JTlRFUk5BTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19TT1VSQ0VfRVhURVJOQUwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRDbG9ja1NvdXJjZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgYWN0aXZlIGVkZ2Ugb3IgZWRnZXMgdXNlZCBieSB0aGUgY291bnRlciB3aGVuIHRoZSBMUFRJTSBpcyBjbG9ja2VkIGJ5IGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIFdoZW4gYm90aCBleHRlcm5hbCBjbG9jayBzaWduYWwgZWRnZXMgYXJlIGNvbnNpZGVyZWQgYWN0aXZlIG9uZXMsCisgICogICAgICAgdGhlIExQVElNIG11c3QgYWxzbyBiZSBjbG9ja2VkIGJ5IGFuIGludGVybmFsIGNsb2NrIHNvdXJjZSB3aXRoIGEKKyAgKiAgICAgICBmcmVxdWVuY3kgZXF1YWwgdG8gYXQgbGVhc3QgZm91ciB0aW1lcyB0aGUgZXh0ZXJuYWwgY2xvY2sgZnJlcXVlbmN5LgorICAqIEBub3RlIEFuIGludGVybmFsIGNsb2NrIHNvdXJjZSBtdXN0IGJlIHByZXNlbnQgd2hlbiBhIGRpZ2l0YWwgZmlsdGVyIGlzCisgICogICAgICAgcmVxdWlyZWQgZm9yIGV4dGVybmFsIGNsb2NrLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLRkxUICAgICAgICAgTExfTFBUSU1fQ29uZmlnQ2xvY2tcbgorICAqICAgICAgICAgQ0ZHUiAgICAgICAgIENLUE9MICAgICAgICAgTExfTFBUSU1fQ29uZmlnQ2xvY2sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl84CisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0NMS19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9Db25maWdDbG9jayhMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IENsb2NrRmlsdGVyLCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS0ZMVCB8IExQVElNX0NGR1JfQ0tQT0wsIENsb2NrRmlsdGVyIHwgQ2xvY2tQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjbG9jayBwb2xhcml0eQorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLUE9MICAgICAgICAgTExfTFBUSU1fR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9HZXRDbG9ja1BvbGFyaXR5KExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0NLUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCBjbG9jayBkaWdpdGFsIGZpbHRlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLRkxUICAgICAgICAgTExfTFBUSU1fR2V0Q2xvY2tGaWx0ZXIKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fQ0xLX0ZJTFRFUl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0Q2xvY2tGaWx0ZXIoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tGTFQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9FbmNvZGVyX01vZGUgRW5jb2RlciBNb2RlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGVuY29kZXIgbW9kZS4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLUE9MICAgICAgICAgTExfTFBUSU1fU2V0RW5jb2Rlck1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEVuY29kZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lOR19GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9TZXRFbmNvZGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgsIHVpbnQzMl90IEVuY29kZXJNb2RlKQoreworICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwgTFBUSU1fQ0ZHUl9DS1BPTCwgRW5jb2Rlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZW5jb2RlciBtb2RlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIENLUE9MICAgICAgICAgTExfTFBUSU1fR2V0RW5jb2Rlck1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVElNX0VOQ09ERVJfTU9ERV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lOR19GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fR2V0RW5jb2Rlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfQ0tQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGVuY29kZXIgbW9kZQorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgSW4gdGhpcyBtb2RlIHRoZSBMUFRJTSBpbnN0YW5jZSBtdXN0IGJlIGNsb2NrZWQgYnkgYW4gaW50ZXJuYWwgY2xvY2sKKyAgKiAgICAgICBzb3VyY2UuIEFsc28sIHRoZSBwcmVzY2FsZXIgZGl2aXNpb24gcmF0aW8gbXVzdCBiZSBlcXVhbCB0byAxLgorICAqIEBub3RlIExQVElNIGluc3RhbmNlIG11c3QgYmUgY29uZmlndXJlZCBpbiBjb250aW51b3VzIG1vZGUgcHJpb3IgZW5hYmxpbmcKKyAgKiAgICAgICB0aGUgZW5jb2RlciBtb2RlLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEVOQyAgICAgICAgICAgTExfTFBUSU1fRW5hYmxlRW5jb2Rlck1vZGUKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUVuY29kZXJNb2RlKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfRU5DKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBlbmNvZGVyIG1vZGUKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEVOQyAgICAgICAgICAgTExfTFBUSU1fRGlzYWJsZUVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlRW5jb2Rlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0VOQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIExQVElNIG9wZXJhdGVzIGluIGVuY29kZXIgbW9kZS4KKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBFTkMgICAgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZEVuY29kZXJNb2RlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkRW5jb2Rlck1vZGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0VOQykgPT0gTFBUSU1fQ0ZHUl9FTkMpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY29tcGFyZSBtYXRjaCBmbGFnIChDTVBNQ0YpCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01QTUNGICAgICAgICBMTF9MUFRJTV9DbGVhckZMQUdfQ01QTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGTEFHX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfQ01QTUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmZvcm0gYXBwbGljYXRpb24gd2hldGhlciBhIGNvbXBhcmUgbWF0Y2ggaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTVBNICAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9DTVBNKSA9PSBMUFRJTV9JU1JfQ01QTSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBhdXRvcmVsb2FkIG1hdGNoIGZsYWcgKEFSUk1DRikKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBUlJNQ0YgICAgICAgIExMX0xQVElNX0NsZWFyRkxBR19BUlJNCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZMQUdfQVJSTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9BUlJNQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybSBhcHBsaWNhdGlvbiB3aGV0aGVyIGEgYXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgaGFzIG9jY3VyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQVJSTSAgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19BUlJNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQVJSTSkgPT0gTFBUSU1fSVNSX0FSUk0pPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgZXh0ZXJuYWwgdHJpZ2dlciB2YWxpZCBlZGdlIGZsYWcoRVhUVFJJR0NGKS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBFWFRUUklHQ0YgICAgIExMX0xQVElNX0NsZWFyRmxhZ19FWFRUUklHCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZsYWdfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9FWFRUUklHQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybSBhcHBsaWNhdGlvbiB3aGV0aGVyIGEgdmFsaWQgZWRnZSBvbiB0aGUgc2VsZWN0ZWQgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBoYXMgb2NjdXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRVhUVFJJRyAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfRVhUVFJJRworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfRVhUVFJJRykgPT0gTFBUSU1fSVNSX0VYVFRSSUcpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgY29tcGFyZSByZWdpc3RlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKENNUE9LQ0YpLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIENNUE9LQ0YgICAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX0NNUE9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZsYWdfQ01QT0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfQ01QT0tDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtcyBhcHBsaWNhdGlvbiB3aGV0aGVyIHRoZSBBUEIgYnVzIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU14X0NNUCByZWdpc3RlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBJZiBzbywgYSBuZXcgb25lIGNhbiBiZSBpbml0aWF0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ01QT0sgICAgICAgICBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QT0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QT0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9DTVBPSykgPT0gTFBUSU1fSVNSX0NNUE9LKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgdXBkYXRlIGludGVycnVwdCBmbGFnIChBUlJPS0NGKS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBUlJPS0NGICAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19BUlJPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fQ2xlYXJGbGFnX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklDUiwgTFBUSU1fSUNSX0FSUk9LQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybXMgYXBwbGljYXRpb24gd2hldGhlciB0aGUgQVBCIGJ1cyB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNeF9BUlIgcmVnaXN0ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gSWYgc28sIGEgbmV3IG9uZSBjYW4gYmUgaW5pdGlhdGVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSUk9LICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQVJST0spID09IExQVElNX0lTUl9BUlJPSyk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdG8gdXAgaW50ZXJydXB0IGZsYWcgKFVQQ0YpLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFVQQ0YgICAgICAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX1VQCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZsYWdfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUNSLCBMUFRJTV9JQ1JfVVBDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5mb3JtcyB0aGUgYXBwbGljYXRpb24gd2hldGhlciB0aGUgY291bnRlciBkaXJlY3Rpb24gaGFzIGNoYW5nZWQgZnJvbSBkb3duIHRvIHVwICh3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBvcGVyYXRlcyBpbiBlbmNvZGVyIG1vZGUpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFVQICAgICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX1VQCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX1VQKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfVVApID09IExQVElNX0lTUl9VUCk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBjb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBpbnRlcnJ1cHQgZmxhZyAoRE9XTkNGKS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBET1dOQ0YgICAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19ET1dOCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9DbGVhckZsYWdfRE9XTihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JQ1IsIExQVElNX0lDUl9ET1dOQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZm9ybXMgdGhlIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIGNvdW50ZXIgZGlyZWN0aW9uIGhhcyBjaGFuZ2VkIGZyb20gdXAgdG8gZG93biAod2hlbiB0aGUgTFBUSU0gaW5zdGFuY2Ugb3BlcmF0ZXMgaW4gZW5jb2RlciBtb2RlKS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBET1dOICAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19ET1dOCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0RPV04oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9ET1dOKSA9PSBMUFRJTV9JU1JfRE9XTik/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0xMX0VGX0lUX01hbmFnZW1lbnQgSW50ZXJydXB0IE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjb21wYXJlIG1hdGNoIGludGVycnVwdCAoQ01QTUlFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBNSUUgICAgICAgIExMX0xQVElNX0VuYWJsZUlUX0NNUE0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNvbXBhcmUgbWF0Y2ggaW50ZXJydXB0IChDTVBNSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE1JRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZUlUX0NNUE0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKENNUE1JRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBNSUUgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE0KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9DTVBNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QTUlFKSA9PSBMUFRJTV9JRVJfQ01QTUlFKT8gMVVMIDogMFVMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0IChBUlJNSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk1JRSAgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfQVJSTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKEFSUk1JRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgQVJSTUlFICAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAoQVJSTUlFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk1JRSAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfQVJSTQorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJNSUUpID09IExQVElNX0lFUl9BUlJNSUUpPyAxVUwgOiAwVUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciB2YWxpZCBlZGdlIGludGVycnVwdCAoRVhUVFJJR0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBFWFRUUklHSUUgICAgIExMX0xQVElNX0VuYWJsZUlUX0VYVFRSSUcKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0VYVFRSSUcoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfRVhUVFJJR0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgdmFsaWQgZWRnZSBpbnRlcnJ1cHQgKEVYVFRSSUdJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRVhUVFJJR0lFICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfRVhUVFJJRworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0VYVFRSSUcoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBDTEVBUl9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9FWFRUUklHSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyBleHRlcm5hbCB0cmlnZ2VyIHZhbGlkIGVkZ2UgaW50ZXJydXB0IChFWFRUUklHSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgRVhUVFJJR0lFICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9FWFRUUklHCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0VYVFRSSUdJRSkgPT0gTFBUSU1fSUVSX0VYVFRSSUdJRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKENNUE9LSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIENNUE9LSUUgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfQ01QT0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE9LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChDTVBPS0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBPS0lFICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9DTVBPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QT0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQ01QT0tJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBDTVBPS0lFICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfQ01QT0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBPS0lFKSA9PSBMUFRJTV9JRVJfQ01QT0tJRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlZCBpbnRlcnJ1cHQgKEFSUk9LSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk9LSUUgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfQVJST0sKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0VuYWJsZUlUX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgU0VUX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk9LSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0b3JlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChBUlJPS0lFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJPS0lFICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9BUlJPSworICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZUlUX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgQ0xFQVJfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJST0tJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGVkIGludGVycnVwdCAoQVJST0tJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBBUlJPS0lFICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0FSUk9LCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfQVJST0soTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJPS0lFKSA9PSBMUFRJTV9JRVJfQVJST0tJRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBkaXJlY3Rpb24gY2hhbmdlIHRvIHVwIGludGVycnVwdCAoVVBJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgVVBJRSAgICAgICAgICBMTF9MUFRJTV9FbmFibGVJVF9VUAorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBTRVRfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfVVBJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBkaXJlY3Rpb24gY2hhbmdlIHRvIHVwIGludGVycnVwdCAoVVBJRSkuCisgICogQHJtdG9sbCBJRVIgICAgICAgICAgVVBJRSAgICAgICAgICBMTF9MUFRJTV9EaXNhYmxlSVRfVVAKKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVElNX0Rpc2FibGVJVF9VUChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX1VQSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXJlY3Rpb24gY2hhbmdlIHRvIHVwIGludGVycnVwdCAoVVBJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBVUElFICAgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX1VQCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9VUElFKSA9PSBMUFRJTV9JRVJfVVBJRSk/IDFVTCA6IDBVTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBkaXJlY3Rpb24gY2hhbmdlIHRvIGRvd24gaW50ZXJydXB0IChET1dOSUUpLgorICAqIEBybXRvbGwgSUVSICAgICAgICAgIERPV05JRSAgICAgICAgTExfTFBUSU1fRW5hYmxlSVRfRE9XTgorICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRW5hYmxlSVRfRE9XTihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIFNFVF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9ET1dOSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZGlyZWN0aW9uIGNoYW5nZSB0byBkb3duIGludGVycnVwdCAoRE9XTklFKS4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBET1dOSUUgICAgICAgIExMX0xQVElNX0Rpc2FibGVJVF9ET1dOCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFRJTV9EaXNhYmxlSVRfRE9XTihMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIENMRUFSX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0RPV05JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpcmVjdGlvbiBjaGFuZ2UgdG8gZG93biBpbnRlcnJ1cHQgKERPV05JRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIElFUiAgICAgICAgICBET1dOSUUgICAgICAgIExMX0xQVElNX0lzRW5hYmxlZElUX0RPV04KKyAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9ET1dOSUUpID09IExQVElNX0lFUl9ET1dOSUUpPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBUSU0xIHx8IExQVElNMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX0xQVElNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfbHB1YXJ0LmggYi9JbmMvc3RtMzJ3Ynh4X2xsX2xwdWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzdlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX2xwdWFydC5oCkBAIC0wLDAgKzEsMjYzMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9scHVhcnQuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgTFBVQVJUIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfTFBVQVJUX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX0xQVUFSVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBVQVJUMSkKKworLyoqIEBkZWZncm91cCBMUFVBUlRfTEwgTFBVQVJUCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBMUFVBUlQgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworLyogQXJyYXkgdXNlZCB0byBnZXQgdGhlIExQVUFSVCBwcmVzY2FsZXIgZGl2aXNpb24gZGVjaW1hbCB2YWx1ZXMgdmVyc3VzIEByZWYgTFBVQVJUX0xMX0VDX1BSRVNDQUxFUiB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBMUFVBUlRfUFJFU0NBTEVSX1RBQltdID0KK3sKKyAgKHVpbnQxNl90KTEsCisgICh1aW50MTZfdCkyLAorICAodWludDE2X3QpNCwKKyAgKHVpbnQxNl90KTYsCisgICh1aW50MTZfdCk4LAorICAodWludDE2X3QpMTAsCisgICh1aW50MTZfdCkxMiwKKyAgKHVpbnQxNl90KTE2LAorICAodWludDE2X3QpMzIsCisgICh1aW50MTZfdCk2NCwKKyAgKHVpbnQxNl90KTEyOCwKKyAgKHVpbnQxNl90KTI1NgorfTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBMUFVBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogRGVmaW5lcyB1c2VkIGluIEJhdWQgUmF0ZSByZWxhdGVkIG1hY3JvcyBhbmQgY29ycmVzcG9uZGluZyByZWdpc3RlciBzZXR0aW5nIGNvbXB1dGF0aW9uICovCisjZGVmaW5lIExQVUFSVF9MUFVBUlRESVZfRlJFUV9NVUwgICAgIDI1NlUKKyNkZWZpbmUgTFBVQVJUX0JSUl9NQVNLICAgICAgICAgICAgICAgMHgwMDBGRkZGRlUKKyNkZWZpbmUgTFBVQVJUX0JSUl9NSU5fVkFMVUUgICAgICAgICAgMHgwMDAwMDMwMFUKKy8qKgorICAqIEB9CisgICovCisKKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfTWFjcm9zIExQVUFSVCBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VTX0lOSVQgTFBVQVJUIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBMTCBMUFVBUlQgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUHJlc2NhbGVyVmFsdWU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFByZXNjYWxlciB0byBjb21wdXRlIHRoZSBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVUFSVF9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IEJhdWRSYXRlOyAgICAgICAgICAgICAgICAgIC8qITwgVGhpcyBmaWVsZCBkZWZpbmVzIGV4cGVjdGVkIExQVUFSVCBjb21tdW5pY2F0aW9uIGJhdWQgcmF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldERhdGFXaWR0aCgpLiovCisKKyAgdWludDMyX3QgU3RvcEJpdHM7ICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgdHJhbnNtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFVBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aCgpLiovCisKKyAgdWludDMyX3QgUGFyaXR5OyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBhcml0eSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX1BBUklUWS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0RJUkVDVElPTi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBIYXJkd2FyZUZsb3dDb250cm9sOyAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBVQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfTFBVQVJUX1NldEhXRmxvd0N0cmwoKS4qLworCit9IExMX0xQVUFSVF9Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBMUFVBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX05DRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9ORUNGICAgICAgICAgICAgICAgIC8qITwgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAgVVNBUlRfSUNSX0lETEVDRiAgICAgICAgICAgICAgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX1RYRkVDRiAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UWEZFQ0YgICAgICAgICAgICAgIC8qITwgVFggRklGTyBFbXB0eSBDbGVhciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSUNSX0NUU0NGICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lDUl9DTUNGICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAvKiE8IENoYXJhY3RlciBtYXRjaCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0xQVUFSVF9SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9QRSAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfRkUgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0ZFICAgICAgICAgICAgICAgICAgLyohPCBGcmFtaW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9ORSAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9PUkUgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0lETEUgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9JRExFICAgICAgICAgICAgICAgIC8qITwgSWRsZSBsaW5lIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9SWE5FX1JYRk5FICAgICAgICAgICBVU0FSVF9JU1JfUlhORV9SWEZORSAgICAgICAgICAvKiE8IFJlYWQgZGF0YSByZWdpc3RlciBvciBSWCBGSUZPIG5vdCBlbXB0eSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgIFVTQVJUX0lTUl9UWEVfVFhGTkYgICAgICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBvciBUWCBGSUZPIE5vdCBGdWxsIGZsYWcqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0NUU0lGICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFNJRiAgICAgICAgICAgICAgIC8qITwgQ1RTIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ1RTICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgLyohPCBDVFMgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX0JVU1kgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9CVVNZICAgICAgICAgICAgICAgIC8qITwgQnVzeSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfQ01GICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgIC8qITwgU2VuZCBicmVhayBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUldVICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB3YWtldXAgZnJvbSBNdXRlIG1vZGUgZmxhZyAqLworI2RlZmluZSBMTF9MUFVBUlRfSVNSX1dVRiAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JFQUNLICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGRSAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRkUgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lTUl9SWEZGICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfUlhGVCAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYRlQgICAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisjZGVmaW5lIExMX0xQVUFSVF9JU1JfVFhGVCAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRlQgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19JVCBJVCBEZWZpbmVzCisgICogQGJyaWVmICAgIElUIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9MUFVBUlRfUmVhZFJlZyBhbmQgIExMX0xQVUFSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgIFVTQVJUX0NSMV9JRExFSUUgICAgICAgICAgICAgIC8qITwgSURMRSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhORUlFX1JYRk5FSUUgICAgICAgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFICAgICAgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgYW5kIFJYRklGTyBub3QgZW1wdHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RDSUUgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgICBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgYW5kIFRYIEZJRk8gbm90IGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1BFSUUgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QRUlFICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfQ01JRSAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IxX1RYRkVJRSAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEZFSUUgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjFfUlhGRklFICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JYRkZJRSAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIGZ1bGwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19FSUUgICAgICAgICAgICAgICAgIC8qITwgRXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9MUFVBUlRfQ1IzX0NUU0lFICAgICAgICAgICAgICAgIFVTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgIC8qITwgQ1RTIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfVFhGVElFICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1RYRlRJRSAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX0xQVUFSVF9DUjNfUlhGVElFICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1JYRlRJRSAgICAgICAgICAgICAgLyohPCBSWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgZW5hYmxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19GSUZPVEhSRVNIT0xEIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfMV84ICAgICAgICAweDAwMDAwMDAwVSAvKiE8IEZJRk8gcmVhY2hlcyAxLzggb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNCAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBGSUZPIHJlYWNoZXMgMS80IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfTFBVQVJUX0ZJRk9USFJFU0hPTERfM180ICAgICAgICAweDAwMDAwMDAzVSAvKiE8IEZJRk8gcmVhY2hlcyAzLzQgb2YgaXRzIGRlcHRoICovCisjZGVmaW5lIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOCAgICAgICAgMHgwMDAwMDAwNFUgLyohPCBGSUZPIHJlYWNoZXMgNy84IG9mIGl0cyBkZXB0aCAqLworI2RlZmluZSBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzggICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRklGTyBiZWNvbWVzIGVtcHR5IGZvciBUWCBhbmQgZnVsbCBmb3IgUlggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX0RJUkVDVElPTiBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fUlggICAgICAgICAgICAgVVNBUlRfQ1IxX1JFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIGFuZCBSZWNlaXZlciBpcyBlbmFibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFggICAgICAgICAgICAgVVNBUlRfQ1IxX1RFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlggICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfUEFSSVRZIFBhcml0eSBDb250cm9sCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9FVkVOICAgICAgICAgICAgICBVU0FSVF9DUjFfUENFICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgRXZlbiBQYXJpdHkgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZW5hYmxlZCBhbmQgT2RkIFBhcml0eSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfV0FLRVVQIFdha2V1cAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8ICBMUFVBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBJZGxlIExpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9BRERSRVNTTUFSSyAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgICAgICAgICAgICAgIC8qITwgIExQVUFSVCB3YWtlIHVwIGZyb20gTXV0ZSBtb2RlIG9uIEFkZHJlc3MgTWFyayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfN0IgICAgICAgICAgICAgVVNBUlRfQ1IxX00xICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIgICAgICAgICAgICAgVVNBUlRfQ1IxX00wICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19QUkVTQ0FMRVIgQ2xvY2sgU291cmNlIFByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBub3QgZGV2aWRlZCAgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDIgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNCAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDQgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNiAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDYgICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDggICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEwICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMCkgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDE2ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4ICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1NiAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMyB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAyNTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9TVE9QQklUU18xICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1NUT1BCSVRTXzIgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8xICAgICAgICAgICAgICAgICAgIC8qITwgMiBzdG9wIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1RYUlggVFggUlggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUlhfU1RBTkRBUkQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFgvUlggcGlucyBhcmUgdXNlZCBhcyBkZWZpbmVkIGluIHN0YW5kYXJkIHBpbm91dCAqLworI2RlZmluZSBMTF9MUFVBUlRfVFhSWF9TV0FQUEVEICAgICAgICAgICAgIChVU0FSVF9DUjJfU1dBUCkgICAgICAgICAgICAgICAgICAgLyohPCBUWCBhbmQgUlggcGlucyBmdW5jdGlvbnMgYXJlIHN3YXBwZWQuICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19SWFBJTl9MRVZFTCBSWCBQaW4gQWN0aXZlIExldmVsIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJYIHBpbiBzaWduYWwgd29ya3MgdXNpbmcgdGhlIHN0YW5kYXJkIGxvZ2ljIGxldmVscyAqLworI2RlZmluZSBMTF9MUFVBUlRfUlhQSU5fTEVWRUxfSU5WRVJURUQgICAgIChVU0FSVF9DUjJfUlhJTlYpICAgICAgICAgICAgICAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VDX1RYUElOX0xFVkVMIFRYIFBpbiBBY3RpdmUgTGV2ZWwgSW52ZXJzaW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJEICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX0xQVUFSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRCAgICAgKFVTQVJUX0NSMl9UWElOVikgICAgICAgICAgICAgICAgICAvKiE8IFRYIHBpbiBzaWduYWwgdmFsdWVzIGFyZSBpbnZlcnRlZC4gICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYy4gKDE9SCwgMD1MKSAqLworI2RlZmluZSBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAgICAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBuZWdhdGl2ZS9pbnZlcnNlIGxvZ2ljLiAoMT1MLCAwPUgpLiBUaGUgcGFyaXR5IGJpdCBpcyBhbHNvIGludmVydGVkLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQklUT1JERVIgQml0IE9yZGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0ICovCisjZGVmaW5lIExMX0xQVUFSVF9CSVRPUkRFUl9NU0JGSVJTVCAgICAgICAgVVNBUlRfQ1IyX01TQkZJUlNUICAgICAgICAgICAgICAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfQUREUkVTU19ERVRFQ1QgQWRkcmVzcyBMZW5ndGggRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgNC1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gbWV0aG9kIHNlbGVjdGVkICovCisjZGVmaW5lIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF83QiAgICAgICAgVVNBUlRfQ1IyX0FERE03ICAgICAgICAgICAgICAgICAgICAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfSFdDT05UUk9MIEhhcmR3YXJlIENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfSFdDT05UUk9MX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMgICAgICAgICAgICBVU0FSVF9DUjNfUlRTRSAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRTIG91dHB1dCBlbmFibGVkLCBkYXRhIGlzIG9ubHkgcmVxdWVzdGVkIHdoZW4gdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAvKiE8IENUUyBtb2RlIGVuYWJsZWQsIGRhdGEgaXMgb25seSB0cmFuc21pdHRlZCB3aGVuIHRoZSBuQ1RTIGlucHV0IGlzIGFzc2VydGVkICh0aWVkIHRvIDApICovCisjZGVmaW5lIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUyAgICAgICAgKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpICAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FQ19XQUtFVVBfT04gV2FrZXVwIEFjdGl2YXRpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9MUFVBUlRfV0FLRVVQX09OX0FERFJFU1MgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdha2UgdXAgYWN0aXZlIG9uIGFkZHJlc3MgbWF0Y2ggKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX0xQVUFSVF9XQUtFVVBfT05fUlhORSAgICAgICAgICAgKFVTQVJUX0NSM19XVVNfMCB8IFVTQVJUX0NSM19XVVNfMSkgICAgIC8qITwgV2FrZSB1cCBhY3RpdmUgb24gUlhORSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX0xQVUFSVF9ERV9QT0xBUklUWV9ISUdIICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBMTF9MUFVBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAgICAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGxvdyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUNfRE1BX1JFR19EQVRBIERNQSBSZWdpc3RlciBEYXRhCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRXhwb3J0ZWRfTWFjcm9zIExQVUFSVCBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIExQVUFSVCByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfTFBVQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gTFBVQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0xQVUFSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRU1fRXhwb3J0ZWRfTWFjcm9zX0hlbHBlciBIZWxwZXIgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb21wdXRlIExQVUFSVERJViB2YWx1ZSBhY2NvcmRpbmcgdG8gUGVyaXBoZXJhbCBDbG9jayBhbmQKKyAgKiAgICAgICAgIGV4cGVjdGVkIEJhdWQgUmF0ZSAoMjAtYml0IHZhbHVlIG9mIExQVUFSVERJViBpcyByZXR1cm5lZCkKKyAgKiBAcGFyYW0gIF9fUEVSSVBIQ0xLX18gUGVyaXBoZXJhbCBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCBSYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIExQVUFSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZworICAqLworI2RlZmluZSBfX0xMX0xQVUFSVF9ESVYoX19QRVJJUEhDTEtfXywgX19QUkVTQ0FMRVJfXywgX19CQVVEUkFURV9fKSAodWludDMyX3QpKCgoKCgodWludDY0X3QpKF9fUEVSSVBIQ0xLX18pLyh1aW50NjRfdCkoTFBVQVJUX1BSRVNDQUxFUl9UQUJbKHVpbnQxNl90KShfX1BSRVNDQUxFUl9fKV0pKSAqIExQVUFSVF9MUFVBUlRESVZfRlJFUV9NVUwpICsgKHVpbnQzMl90KSgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKSAmIExQVUFSVF9CUlJfTUFTSykKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBMUFVBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIEVuYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIERpc2FibGUKKyAgKiBAbm90ZSAgIFdoZW4gTFBVQVJUIGlzIGRpc2FibGVkLCBMUFVBUlQgcHJlc2NhbGVycyBhbmQgb3V0cHV0cyBhcmUgc3RvcHBlZCBpbW1lZGlhdGVseSwKKyAgKiAgICAgICAgIGFuZCBjdXJyZW50IG9wZXJhdGlvbnMgYXJlIGRpc2NhcmRlZC4gVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIExQVUFSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMKKyAgKiAgICAgICAgIGZsYWdzLCBpbiB0aGUgTFBVQVJUeF9JU1IgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIEluIG9yZGVyIHRvIGdvIGludG8gbG93LXBvd2VyIG1vZGUgd2l0aG91dCBnZW5lcmF0aW5nIGVycm9ycyBvbiB0aGUgbGluZSwKKyAgKiAgICAgICAgIHRoZSBURSBiaXQgbXVzdCBiZSByZXNldCBiZWZvcmUgYW5kIHRoZSBzb2Z0d2FyZSBtdXN0IHdhaXQKKyAgKiAgICAgICAgIGZvciB0aGUgVEMgYml0IGluIHRoZSBMUFVBUlRfSVNSIHRvIGJlIHNldCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBVRSBiaXQuCisgICogICAgICAgICBUaGUgRE1BIHJlcXVlc3RzIGFyZSBhbHNvIHJlc2V0IHdoZW4gVUUgPSAwIHNvIHRoZSBETUEgY2hhbm5lbCBtdXN0CisgICogICAgICAgICBiZSBkaXNhYmxlZCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBVRSBiaXQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgTFBVQVJUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRklGTworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVGSUZPCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVGSUZPKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEZJRk8gTW9kZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkRklGTworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRklGTyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9GSUZPRU4pID09IChVU0FSVF9DUjFfRklGT0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBGSUZPIFRocmVzaG9sZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRDRkcgICAgICAgTExfTFBVQVJUX1NldFRYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkIDw8IFVTQVJUX0NSM19UWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFRYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggRklGTyBUaHJlc2hvbGQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9TZXRSWEZJRk9UaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRSWEZJRk9UaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfR2V0UlhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UlhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcpID4+IFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIGFuZCBSWCBGSUZPcyBUaHJlc2hvbGQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX0xQVUFSVF9Db25maWdGSUZPc1RocmVzaG9sZFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgUlhGVENGRyAgICAgICBMTF9MUFVBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUWFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEBwYXJhbSAgUlhUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdGSUZPc1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUWFRocmVzaG9sZCwgdWludDMyX3QgUlhUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHLCAoVFhUaHJlc2hvbGQgPDwgVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSB8IChSWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfUlhGVENGR19Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBMUFVBUlQgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBMUFVBUlQgaXMgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBTdG9wIG1vZGUsIHByb3ZpZGVkIHRoYXQKKyAgKiAgICAgICAgIExQVUFSVCBjbG9jayBzZWxlY3Rpb24gaXMgSFNJIG9yIExTRSBpbiBSQ0MuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTFBVQVJUIGRpc2FibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBMUFVBUlQgaXMgbm90IGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIExQVUFSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZQorICAqICAgICAgICAgKGFibGUgdG8gd2FrZSB1cCBNQ1UgZnJvbSBTdG9wIG1vZGUgb3Igbm90KQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSkgPT0gKFVTQVJUX0NSMV9VRVNNKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVyIEVuYWJsZSAoUmVjZWl2ZXIgaXMgZW5hYmxlZCBhbmQgYmVnaW5zIHNlYXJjaGluZyBmb3IgYSBzdGFydCBiaXQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZXIgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHRlciBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBURSAgICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdHRlciBEaXNhYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBzaW11bHRhbmVvdXNseSBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcworICAqICAgICAgICAgb2YgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9MUFVBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfTFBVQVJUX1NldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fVFhfUlgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBlbmFibGVkL2Rpc2FibGVkIHN0YXRlcyBvZiBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9MUFVBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ESVJFQ1RJT05fUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRElSRUNUSU9OX1RYCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RJUkVDVElPTl9UWF9SWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRUcmFuc2ZlckRpcmVjdGlvbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQYXJpdHkgKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgaGFyZHdhcmUgcGFyaXR5IGNvbnRyb2wgKGdlbmVyYXRpb24gYW5kIGRldGVjdGlvbikgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiAgICAgICAgIFdoZW4gdGhlIHBhcml0eSBjb250cm9sIGlzIGVuYWJsZWQgKE9kZCBvciBFdmVuKSwgY29tcHV0ZWQgcGFyaXR5IGJpdCBpcyBpbnNlcnRlZCBhdCB0aGUgTVNCIHBvc2l0aW9uCisgICogICAgICAgICAoZGVwZW5kaW5nIG9uIGRhdGEgd2lkdGgpIGFuZCBwYXJpdHkgaXMgY2hlY2tlZCBvbiB0aGUgcmVjZWl2ZWQgZGF0YS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9TZXRQYXJpdHlcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX1NldFBhcml0eQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfTFBVQVJUX0dldFBhcml0eVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgUENFICAgICAgICAgICBMTF9MUFVBUlRfR2V0UGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUEFSSVRZX09ERAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfUENFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJlY2VpdmVyIFdha2UgVXAgbWV0aG9kIGZyb20gTXV0ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfTFBVQVJUX1NldFdha2VVcE1ldGhvZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfSURMRUxJTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IE1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfTFBVQVJUX0dldFdha2VVcE1ldGhvZAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1dBS0VVUF9JRExFTElORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfQUREUkVTU01BUksKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1dBS0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgV29yZCBsZW5ndGggKG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF0YVdpZHRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERhdGFXaWR0aCkKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBXb3JkIGxlbmd0aCAoaS5lLiBuYiBvZiBkYXRhIGJpdHMsIGV4Y2x1ZGluZyBzdGFydCBhbmQgc3RvcCBiaXRzKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE0gICAgICAgICAgICAgTExfTFBVQVJUX0dldERhdGFXaWR0aAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzlCCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldERhdGFXaWR0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxsb3cgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZU11dGVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmV2ZW50IE11dGUgTW9kZSB1c2UuIFNldCBSZWNlaXZlciBpbiBhY3RpdmUgbW9kZSBwZXJtYW5lbnRseS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNTUUgICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlTXV0ZU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU11dGVNb2RlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHN3aXRjaCBiZXR3ZWVuIE11dGUgTW9kZSBhbmQgQWN0aXZlIG1vZGUgaXMgYWxsb3dlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZE11dGVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpID09IChVU0FSVF9DUjFfTU1FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzb3VyY2UgcHJlc2NhbGVyIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IgYW5kIG92ZXJzYW1wbGluZworICAqIEBybXRvbGwgUFJFU0MgICAgICAgIFBSRVNDQUxFUiAgICAgTExfTFBVQVJUX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgdGhlIENsb2NrIHNvdXJjZSBwcmVzY2FsZXIgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciBhbmQgb3ZlcnNhbXBsaW5nCisgICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QLCBTdG9wQml0cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9MUFVBUlRfR2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0U3RvcEJpdHNMZW5ndGgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDaGFyYWN0ZXIgZnJhbWUgZm9ybWF0IChEYXRhd2lkdGgsIFBhcml0eSBjb250cm9sLCBTdG9wIEJpdHMpCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIERhdGEgV2lkdGggY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX0xQVUFSVF9TZXREYXRhV2lkdGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBQYXJpdHkgQ29udHJvbCBhbmQgbW9kZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfTFBVQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFN0b3AgYml0cyBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfTFBVQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQUyAgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfTFBVQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTSAgICAgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREFUQVdJRFRIXzdCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfRVZFTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QQVJJVFlfT0RECisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1NUT1BCSVRTXzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoLCB1aW50MzJfdCBQYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0b3BCaXRzKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9NLCBQYXJpdHkgfCBEYXRhV2lkdGgpOworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIFN0b3BCaXRzKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVFgvUlggcGlucyBzd2FwcGluZyBzZXR0aW5nLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfTFBVQVJUX1NldFRYUlhTd2FwCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgU3dhcENvbmZpZyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUlhfU1dBUFBFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFRYUlhTd2FwKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFN3YXBDb25maWcpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfTFBVQVJUX0dldFRYUlhTd2FwCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9UWFJYX1NXQVBQRUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGxvZ2ljCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9MUFVBUlRfU2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBpbkludk1ldGhvZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUGluSW52TWV0aG9kKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfTFBVQVJUX0dldFJYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX0xQVUFSVF9TZXRUWFBpbkxldmVsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBQaW5JbnZNZXRob2QpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhJTlYgICAgICAgICBMTF9MUFVBUlRfR2V0VFhQaW5MZXZlbAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldFRYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQmluYXJ5IGRhdGEgbG9naWMuCisgICoKKyAgKiBAbm90ZSAgIEFsbG93IHRvIGRlZmluZSBob3cgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgOgorICAqICAgICAgICAgZWl0aGVyIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYyAoMT1ILCAwPUwpIG9yIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfTFBVQVJUX1NldEJpbmFyeURhdGFMb2dpYworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IERhdGFMb2dpYykKK3sKKyAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBEYXRhTG9naWMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIEJpbmFyeSBkYXRhIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEQVRBSU5WICAgICAgIExMX0xQVUFSVF9HZXRCaW5hcnlEYXRhTG9naWMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldEJpbmFyeURhdGFMb2dpYyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX0xQVUFSVF9TZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQml0T3JkZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRUcmFuc2ZlckJpdE9yZGVyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEJpdE9yZGVyKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNULCBCaXRPcmRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX0xQVUFSVF9HZXRUcmFuc2ZlckJpdE9yZGVyCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTFNCRklSU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9NU0JGSVJTVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqIEBub3RlICAgNGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChiNy1iNCBzaG91bGQgYmUgc2V0IHRvIDApCisgICogICAgICAgICA4Yml0cyBhZGRyZXNzIG5vZGUgaXMgdXNlZCB3aGVuIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LgorICAqICAgICAgICAgKFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqICAgICAgICAgVGhlIE1TQiBvZiB0aGUgY2hhcmFjdGVyIHNlbnQgYnkgdGhlIHRyYW5zbWl0dGVyIHNob3VsZCBiZSBlcXVhbCB0byAxLgorICAqICAgICAgICAgSXQgbWF5IGFsc28gYmUgdXNlZCBmb3IgY2hhcmFjdGVyIGRldGVjdGlvbiBkdXJpbmcgbm9ybWFsIHJlY2VwdGlvbiwKKyAgKiAgICAgICAgIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzIHByb3RvY29sKS4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHdob2xlIHJlY2VpdmVkIGNoYXJhY3RlciAoOC1iaXQpIGlzIGNvbXBhcmVkIHRvIHRoZSBBRERbNzowXQorICAqICAgICAgICAgdmFsdWUgYW5kIENNRiBmbGFnIGlzIHNldCBvbiBtYXRjaCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX0xQVUFSVF9Db25maWdOb2RlQWRkcmVzc1xuCisgICogICAgICAgICBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9MUFVBUlRfQ29uZmlnTm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBZGRyZXNzTGVuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0FERFJFU1NfREVURUNUXzdCCisgICogQHBhcmFtICBOb2RlQWRkcmVzcyA0IG9yIDcgYml0IEFkZHJlc3Mgb2YgdGhlIExQVUFSVCBub2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NvbmZpZ05vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEFkZHJlc3NMZW4sIHVpbnQzMl90IE5vZGVBZGRyZXNzKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCB8IFVTQVJUX0NSMl9BRERNNywKKyAgICAgICAgICAgICAodWludDMyX3QpKEFkZHJlc3NMZW4gfCAoTm9kZUFkZHJlc3MgPDwgVVNBUlRfQ1IyX0FERF9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIDggYml0IEFkZHJlc3Mgb2YgdGhlIExQVUFSVCBub2RlIGFzIHNldCBpbiBBREQgZmllbGQgb2YgQ1IyLgorICAqIEBub3RlICAgSWYgNC1iaXQgQWRkcmVzcyBEZXRlY3Rpb24gaXMgc2VsZWN0ZWQgaW4gQURETTcsCisgICogICAgICAgICBvbmx5IDRiaXRzIChiMy1iMCkgb2YgcmV0dXJuZWQgdmFsdWUgYXJlIHJlbGV2YW50IChiMzEtYjQgYXJlIG5vdCByZWxldmFudCkKKyAgKiAgICAgICAgIElmIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICAqICAgICAgICAgb25seSA4Yml0cyAoYjctYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI4IGFyZSBub3QgcmVsZXZhbnQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREICAgICAgICAgICBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBBZGRyZXNzIG9mIHRoZSBMUFVBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldE5vZGVBZGRyZXNzKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCkgPj4gVVNBUlRfQ1IyX0FERF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBMZW5ndGggb2YgTm9kZSBBZGRyZXNzIHVzZWQgaW4gQWRkcmVzcyBEZXRlY3Rpb24gbW9kZSAoNy1iaXQgb3IgNC1iaXQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9MUFVBUlRfR2V0Tm9kZUFkZHJlc3NMZW4KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9BRERSRVNTX0RFVEVDVF83QgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXROb2RlQWRkcmVzc0xlbihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjIsIFVTQVJUX0NSMl9BRERNNykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlUlRTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVSVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZVJUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUNUU0hXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBIVyBGbG93IENvbnRyb2wgbW9kZSAoYm90aCBDVFMgYW5kIFJUUykKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgSGFyZHdhcmVGbG93Q29udHJvbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX1JUU19DVFMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IEhhcmR3YXJlRmxvd0NvbnRyb2wpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFLCBIYXJkd2FyZUZsb3dDb250cm9sKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSFcgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gKGJvdGggQ1RTIGFuZCBSVFMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybFxuCisgICogICAgICAgICBDUjMgICAgICAgICAgQ1RTRSAgICAgICAgICBMTF9MUFVBUlRfR2V0SFdGbG93Q3RybAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9HZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfTFBVQVJUX0VuYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE92ZXJydW4gZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZU92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBldmVudCB0eXBlIGZvciBXYWtlIFVQIEludGVycnVwdCBGbGFnIChXVVNbMTowXSBiaXRzKQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfTFBVQVJUX1NldFdLVVBUeXBlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRXS1VQVHlwZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBUeXBlKQoreworICBNT0RJRllfUkVHKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VTICAgICAgICAgICBMTF9MUFVBUlRfR2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfV0FLRVVQX09OX1JYTkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0V0tVUFR5cGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIExQVUFSVCBCUlIgcmVnaXN0ZXIgZm9yIGFjaGlldmluZyBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWUuCisgICoKKyAgKiBAbm90ZSAgIENvbXB1dGUgYW5kIHNldCBMUFVBUlRESVYgdmFsdWUgaW4gQlJSIFJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KQorICAqICAgICAgICAgYWNjb3JkaW5nIHRvIHVzZWQgUGVyaXBoZXJhbCBDbG9jayBhbmQgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlcworICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBhbmQgQmF1ZCBSYXRlIHZhbHVlcyBwcm92aWRlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB2YWxpZAorICAqICAgICAgICAgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKS4KKyAgKiBAbm90ZSAgIFByb3ZpZGVkIHRoYXQgTFBVQVJUeF9CUlIgbXVzdCBiZSA+ID0gMHgzMDAgYW5kIExQVUFSVF9CUlIgaXMgMjAtYml0LAorICAqICAgICAgICAgYSBjYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGdlbmVyYXRpbmcgaGlnaCBiYXVkIHJhdGVzIHVzaW5nIGhpZ2ggUGVyaXBoQ2xrCisgICogICAgICAgICB2YWx1ZXMuIFBlcmlwaENsayBtdXN0IGJlIGluIHRoZSByYW5nZSBbMyB4IEJhdWRSYXRlLCA0MDk2IHggQmF1ZFJhdGVdLgorICAqIEBybXRvbGwgQlJSICAgICAgICAgIEJSUiAgICAgICAgICAgTExfTFBVQVJUX1NldEJhdWRSYXRlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrIFBlcmlwaGVyYWwgQ2xvY2sKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBCYXVkUmF0ZSBCYXVkIFJhdGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9TZXRCYXVkUmF0ZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLCB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgTFBVQVJUeC0+QlJSID0gX19MTF9MUFVBUlRfRElWKFBlcmlwaENsaywgKHVpbnQxNl90KVByZXNjYWxlclZhbHVlLCBCYXVkUmF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGN1cnJlbnQgQmF1ZCBSYXRlIHZhbHVlLCBhY2NvcmRpbmcgdG8gTFBVQVJURElWIHByZXNlbnQgaW4gQlJSIHJlZ2lzdGVyCisgICogICAgICAgICAoZnVsbCBCUlIgY29udGVudCksIGFuZCB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2sgdmFsdWVzCisgICogQG5vdGUgICBJbiBjYXNlIG9mIG5vbi1pbml0aWFsaXplZCBvciBpbnZhbGlkIHZhbHVlIHN0b3JlZCBpbiBCUlIgcmVnaXN0ZXIsIHZhbHVlIDAgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX0xQVUFSVF9HZXRCYXVkUmF0ZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEByZXR2YWwgQmF1ZCBSYXRlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0dldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFBlcmlwaENsaywgdWludDMyX3QgUHJlc2NhbGVyVmFsdWUpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGxwdWFydGRpdjsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYnJycmVzdWx0OworICByZWdpc3RlciB1aW50MzJfdCBwZXJpcGhjbGtwcmVzYyA9ICh1aW50MzJfdCkoUGVyaXBoQ2xrIC8gKExQVUFSVF9QUkVTQ0FMRVJfVEFCWyh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZV0pKTsKKworICBscHVhcnRkaXYgPSBMUFVBUlR4LT5CUlIgJiBMUFVBUlRfQlJSX01BU0s7CisKKyAgaWYgKGxwdWFydGRpdiA+PSBMUFVBUlRfQlJSX01JTl9WQUxVRSkKKyAgeworICAgIGJycnJlc3VsdCA9ICh1aW50MzJfdCkoKCh1aW50NjRfdCkocGVyaXBoY2xrcHJlc2MpICogTFBVQVJUX0xQVUFSVERJVl9GUkVRX01VTCkgLyBscHVhcnRkaXYpOworICB9CisgIGVsc2UKKyAgeworICAgIGJycnJlc3VsdCA9IDB4MFVMOworICB9CisKKyAgcmV0dXJuIChicnJyZXN1bHQpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSGFsZkR1cGxleAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFNpbmdsZSBXaXJlIEhhbGYtRHVwbGV4IG1vZGUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZEhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZEhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpID09IChVU0FSVF9DUjNfSERTRUwpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fREUgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBEcml2ZXIgRW5hYmxlIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX0xQVUFSVF9TZXRERURlYXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldERFRGVhc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFRpbWUpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCwgVGltZSA8PCBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfTFBVQVJUX0dldERFRGVhc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IGMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCkgPj4gVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9MUFVBUlRfU2V0REVBc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfU2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgsIHVpbnQzMl90IFRpbWUpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCwgVGltZSA8PCBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfTFBVQVJUX0dldERFQXNzZXJ0aW9uVGltZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBUaW1lIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0RFQVQpID4+IFVTQVJUX0NSMV9ERUFUX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERyaXZlciBFbmFibGUgKERFKSBNb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlREVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVERU1vZGUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBEcml2ZXIgRW5hYmxlIChERSkgTW9kZSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVNICAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkREVNb2RlCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRERU1vZGUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVNKSA9PSAoVVNBUlRfQ1IzX0RFTSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFUCAgICAgICAgICAgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfTFBVQVJUX0RFX1BPTEFSSVRZX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1NldERFU2lnbmFsUG9sYXJpdHkoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX0xQVUFSVF9HZXRERVNpZ25hbFBvbGFyaXR5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfREVfUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ERV9QT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfR2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERVApKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFVBUlRfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUEUgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUEUpID09IChVU0FSVF9JU1JfUEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBGcmFtaW5nIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEZFICAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19GRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0ZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0ZFKSA9PSAoVVNBUlRfSVNSX0ZFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgTm9pc2UgZXJyb3IgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgTkUgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX05FCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfTkUpID09IChVU0FSVF9JU1JfTkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBPdmVyUnVuIEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE9SRSAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfT1JFKSA9PSAoVVNBUlRfSVNSX09SRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIElETEUgbGluZSBkZXRlY3RlZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJRExFICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfSURMRQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfSURMRSkgPT0gKFVTQVJUX0lTUl9JRExFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORSAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSZWFkIERhdGEgUmVnaXN0ZXIgb3IgTFBVQVJUIFJYIEZJRk8gTm90IEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhORV9SWEZORShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSA9PSAoVVNBUlRfSVNSX1JYTkVfUlhGTkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RDCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVEMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEUgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IG9yIExQVUFSVCBUWCBGSUZPIE5vdCBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRV9UWEZORiAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfVFhFX1RYRk5GKSA9PSAoVVNBUlRfSVNSX1RYRV9UWEZORikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENUUyBpbnRlcnJ1cHQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQ1RTSUYgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX25DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19uQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0NUU0lGKSA9PSAoVVNBUlRfSVNSX0NUU0lGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ1RTIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENUUyAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19DVFMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19DVFMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIEJ1c3kgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX0JVU1kKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19CVVNZKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX0JVU1kpID09IChVU0FSVF9JU1JfQlVTWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENoYXJhY3RlciBNYXRjaCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTUYgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfQ00KKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9DTUYpID09IChVU0FSVF9JU1JfQ01GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgU2VuZCBCcmVhayBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTQktGICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfU0JLCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfU0JLKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1NCS0YpID09IChVU0FSVF9JU1JfU0JLRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJlY2VpdmUgV2FrZSBVcCBmcm9tIG11dGUgbW9kZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSV1UgICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUldVCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUldVKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JXVSkgPT0gKFVTQVJUX0lTUl9SV1UpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVRiAgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9XVUYpID09IChVU0FSVF9JU1JfV1VGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19URUFDSworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1RFQUNLKSA9PSAoVVNBUlRfSVNSX1RFQUNLKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgUmVjZWl2ZSBFbmFibGUgQWNrbm93bGVkZ2UgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUkVBQ0sgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JFQUNLCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0soVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUkVBQ0spID09IChVU0FSVF9JU1JfUkVBQ0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUWCBGSUZPIEVtcHR5IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRkUgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZFKSA9PSAoVVNBUlRfSVNSX1RYRkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIEZ1bGwgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGRiAgICAgICAgICBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19SWEZGKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPklTUiwgVVNBUlRfSVNSX1JYRkYpID09IChVU0FSVF9JU1JfUlhGRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFRYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRlQgICAgICAgICAgTExfTFBVQVJUX0lzQWN0aXZlRmxhZ19UWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZUKSA9PSAoVVNBUlRfSVNSX1RYRlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBSWCBGSUZPIFRocmVzaG9sZCBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWEZUICAgICAgICAgIExMX0xQVUFSVF9Jc0FjdGl2ZUZsYWdfUlhGVAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNBY3RpdmVGbGFnX1JYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGVCkgPT0gKFVTQVJUX0lTUl9SWEZUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFBhcml0eSBFcnJvciBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUEVDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfUEVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRnJhbWluZyBFcnJvciBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgRkVDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0ZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19GRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRkVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgTm9pc2UgZGV0ZWN0ZWQgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIE5FQ0YgICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19ORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX05FQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE92ZXJSdW4gRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIE9SRUNGICAgICAgICAgTExfTFBVQVJUX0NsZWFyRmxhZ19PUkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX09SRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIElETEUgbGluZSBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVFggRklGTyBFbXB0eSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVFhGRUNGICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RYRkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1RYRkVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUQ0NGICAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFdSSVRFX1JFRyhMUFVBUlR4LT5JQ1IsIFVTQVJUX0lDUl9UQ0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDVFMgSW50ZXJydXB0IEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDVFNDRiAgICAgICAgIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ1RTQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENoYXJhY3RlciBNYXRjaCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ01DRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX0NNCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0NsZWFyRmxhZ19DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBXUklURV9SRUcoTFBVQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ01DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgV1VDRiAgICAgICAgICBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgV1JJVEVfUkVHKExQVUFSVHgtPklDUiwgVVNBUlRfSUNSX1dVQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfSURMRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0VuYWJsZUlUX1JYTkUgIExMX0xQVUFSVF9FbmFibGVJVF9SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9MUFVBUlRfRW5hYmxlSVRfUlhORV9SWEZORQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVEMoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9MUFVBUlRfRW5hYmxlSVRfVFhFICBMTF9MUFVBUlRfRW5hYmxlSVRfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRV9UWEZORgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9UWEVfVFhGTkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9DTQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVJVF9DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9SWEZGCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIEJpdCBpcyBlbmFibGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGEgZnJhbWluZworICAqICAgICAgICAgZXJyb3IsIG92ZXJydW4gZXJyb3Igb3Igbm9pc2UgZmxhZyAoRkU9MSBvciBPUkU9MSBvciBORj0xIGluIHRoZSBMUFVBUlR4X0lTUiByZWdpc3RlcikuCisgICogICAgICAgICAtIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQKKyAgKiAgICAgICAgIC0gMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9MUFVBUlRfRW5hYmxlSVRfQ1RTCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX0NUUyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX0xQVUFSVF9FbmFibGVJVF9XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0VuYWJsZUlUX1dLVVAoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1RYRlQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfTFBVQVJUX0VuYWJsZUlUX1JYRlQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9JRExFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX0xQVUFSVF9EaXNhYmxlSVRfUlhORSAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEUgIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWCBFbXB0eSBhbmQgVFggRklGTyBOb3QgRnVsbCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQYXJpdHkgRXJyb3IgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX1BFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9QRShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDaGFyYWN0ZXIgTWF0Y2ggSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ01JRSAgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0NNCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9DTShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWCBGSUZPIEVtcHR5IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEZFCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlggRklGTyBGdWxsIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZGCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZGKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9SWEZGSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRXJyb3IgSW50ZXJydXB0CisgICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBhIGZyYW1pbmcKKyAgKiAgICAgICAgIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgTFBVQVJUeF9JU1IgcmVnaXN0ZXIpLgorICAqICAgICAgICAgLSAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgICogICAgICAgICAtIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIExQVUFSVHhfSVNSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9FUlJPUgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfRVJST1IoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDVFMgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9MUFVBUlRfRGlzYWJsZUlUX0NUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19XVUZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGVAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9EaXNhYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIENMRUFSX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgSURMRSBJbnRlcnJ1cHQgIHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0lETEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX0lETEUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKSA9PSAoVVNBUlRfQ1IxX0lETEVJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUlhORSAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJYIE5vdCBFbXB0eSBhbmQgTFBVQVJUIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICBSWE5FSUVfUlhGTkVJRSAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpID09IChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RDKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpID09IChVU0FSVF9DUjFfVENJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBUWCBFbXB0eSBhbmQgTFBVQVJUIFRYIEZJRk8gTm90IEZ1bGwgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSA9PSAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIExQVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9MUFVBUlRfSXNFbmFibGVkSVRfUEUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1BFKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpID09IChVU0FSVF9DUjFfUEVJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9DTQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ00oVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSkgPT0gKFVTQVJUX0NSMV9DTUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRkUKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRkUoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVFhGRUlFKSA9PSAoVVNBUlRfQ1IxX1RYRkVJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIFJYIEZJRk8gRnVsbCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRkZJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYRkYKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1JYRkYoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKSA9PSAoVVNBUlRfQ1IxX1JYRkZJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgTFBVQVJUIEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0VSUk9SCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9FUlJPUihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpID09IChVU0FSVF9DUjNfRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0lFICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX0NUUworICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKSA9PSAoVVNBUlRfQ1IzX0NUU0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBMUFVBUlQgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9XS1VQCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKSA9PSAoVVNBUlRfQ1IzX1dVRklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExQVUFSVCBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRYRlRJRSAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRlQKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZElUX1RYRlQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKSA9PSAoVVNBUlRfQ1IzX1RYRlRJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMUFVBUlQgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZUCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9Jc0VuYWJsZWRJVF9SWEZUKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSkgPT0gKFVTQVJUX0NSM19SWEZUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERNQVJlcV9SWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRE1BUmVxX1JYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpID09IChVU0FSVF9DUjNfRE1BUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9FbmFibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX0xQVUFSVF9EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgQ0xFQVJfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVQgICAgICAgICAgTExfTFBVQVJUX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFVBUlRfSXNFbmFibGVkRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKExQVUFSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVQpID09IChVU0FSVF9DUjNfRE1BVCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9FbmFibGVETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRW5hYmxlRE1BRGVhY3RPblJ4RXJyKFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpCit7CisgIFNFVF9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvcgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfTFBVQVJUX0Rpc2FibGVETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfRGlzYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBDTEVBUl9CSVQoTFBVQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRERSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRE1BIERpc2FibGluZyBvbiBSZWNlcHRpb24gRXJyb3IgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERFJFICAgICAgICAgIExMX0xQVUFSVF9Jc0VuYWJsZWRETUFEZWFjdE9uUnhFcnIKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBVQVJUX0lzRW5hYmxlZERNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChMUFVBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKSA9PSAoVVNBUlRfQ1IzX0REUkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBMUFVBUlQgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgUkRSICAgICAgICAgIFJEUiAgICAgICAgICAgTExfTFBVQVJUX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX0xQVUFSVF9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0xQVUFSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVUFSVF9ETUFfR2V0UmVnQWRkcihVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGRhdGFfcmVnX2FkZHI7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9MUFVBUlRfRE1BX1JFR19EQVRBX1RSQU5TTUlUKQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgVERSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoTFBVQVJUeC0+VERSKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBSRFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChMUFVBUlR4LT5SRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9MUFVBUlRfUmVjZWl2ZURhdGE4CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX0xQVUFSVF9SZWNlaXZlRGF0YTgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50OF90KShSRUFEX0JJVChMUFVBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpICYgMHhGRlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA5IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9MUFVBUlRfUmVjZWl2ZURhdGE5CisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfTFBVQVJUX1JlY2VpdmVEYXRhOShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICByZXR1cm4gKHVpbnQxNl90KShSRUFEX0JJVChMUFVBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBpbiBUcmFuc21pdHRlciBEYXRhIFJlZ2lzdGVyIChUcmFuc21pdCBEYXRhIHZhbHVlLCA4IGJpdHMpCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTgoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgdWludDhfdCBWYWx1ZSkKK3sKKyAgTFBVQVJUeC0+VERSID0gVmFsdWU7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOSBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfTFBVQVJUX1RyYW5zbWl0RGF0YTkKKyAgKiBAcGFyYW0gIExQVUFSVHggTFBVQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MUZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9MUFVBUlRfVHJhbnNtaXREYXRhOShVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCB1aW50MTZfdCBWYWx1ZSkKK3sKKyAgTFBVQVJUeC0+VERSID0gVmFsdWUgJiAweDFGRlVMOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVUFSVF9MTF9FRl9FeGVjdXRpb24gRXhlY3V0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IEJyZWFrIHNlbmRpbmcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBTQktSUSAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBVQVJUX1JlcXVlc3RCcmVha1NlbmRpbmcoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5SUVIsIFVTQVJUX1JRUl9TQktSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHV0IExQVUFSVCBpbiBtdXRlIG1vZGUgYW5kIHNldCB0aGUgUldVIGZsYWcKKyAgKiBAcm10b2xsIFJRUiAgICAgICAgICBNTVJRICAgICAgICAgIExMX0xQVUFSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZQorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBTRVRfQklUKExQVUFSVHgtPlJRUiwgVVNBUlRfUlFSX01NUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgYSBSZWNlaXZlIERhdGEgYW5kIEZJRk8gZmx1c2gKKyAgKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQgYW4gb3ZlcnJ1bgorICAqICAgICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfTFBVQVJUX1JlcXVlc3RSeERhdGFGbHVzaAorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0xQVUFSVF9SZXF1ZXN0UnhEYXRhRmx1c2goVVNBUlRfVHlwZURlZiAqTFBVQVJUeCkKK3sKKyAgU0VUX0JJVChMUFVBUlR4LT5SUVIsIFVTQVJUX1JRUl9SWEZSUSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgTFBVQVJUX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCitFcnJvclN0YXR1cyBMTF9MUFVBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYgKkxQVUFSVHgpOworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0luaXQoVVNBUlRfVHlwZURlZiAqTFBVQVJUeCwgTExfTFBVQVJUX0luaXRUeXBlRGVmICpMUFVBUlRfSW5pdFN0cnVjdCk7Cit2b2lkICAgICAgICBMTF9MUFVBUlRfU3RydWN0SW5pdChMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBMUFVBUlQxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfTFBVQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfcGthLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX3BrYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTNhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX3BrYS5oCkBAIC0wLDAgKzEsNTMyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3BrYS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBQS0EgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9QS0FfSAorI2RlZmluZSBTVE0zMldCeHhfTExfUEtBX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFBLQSkKKworLyoqIEBkZWZncm91cCBQS0FfTEwgUEtBCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUEtBX0xMX0VTX0lOSVQgUEtBIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQS0EgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IE1vZGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQS0Egb3BlcmF0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBQS0FfTExfRUNfTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUEtBX1NldE1vZGUoKS4gKi8KK30gTExfUEtBX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQS0FfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFBLQSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBLQV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUEtBX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QS0FfU1JfQUREUkVSUkYgICAgICAgICAgICAgICAgIFBLQV9TUl9BRERSRVJSRgorI2RlZmluZSBMTF9QS0FfU1JfUkFNRVJSRiAgICAgICAgICAgICAgICAgIFBLQV9TUl9SQU1FUlJGCisjZGVmaW5lIExMX1BLQV9TUl9QUk9DRU5ERiAgICAgICAgICAgICAgICAgUEtBX1NSX1BST0NFTkRGCisjZGVmaW5lIExMX1BLQV9TUl9CVVNZICAgICAgICAgICAgICAgICAgICAgUEtBX1NSX0JVU1kKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BLQV9SZWFkUmVnIGFuZCAgTExfUEtBX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1BLQV9DUl9BRERSRVJSSUUgICAgICAgICAgICAgICAgUEtBX0NSX0FERFJFUlJJRQorI2RlZmluZSBMTF9QS0FfQ1JfUkFNRVJSSUUgICAgICAgICAgICAgICAgIFBLQV9DUl9SQU1FUlJJRQorI2RlZmluZSBMTF9QS0FfQ1JfUFJPQ0VORElFICAgICAgICAgICAgICAgIFBLQV9DUl9QUk9DRU5ESUUKKyNkZWZpbmUgTExfUEtBX0NMUkZSX1BST0NFTkRGQyAgICAgICAgICAgICBQS0FfQ0xSRlJfUFJPQ0VOREZDCisjZGVmaW5lIExMX1BLQV9DTFJGUl9SQU1FUlJGQyAgICAgICAgICAgICAgUEtBX0NMUkZSX1JBTUVSUkZDCisjZGVmaW5lIExMX1BLQV9DTFJGUl9BRERSRVJSRkMgICAgICAgICAgICAgUEtBX0NMUkZSX0FERFJFUlJGQworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQS0FfTExfRUNfTU9ERSBPcGVyYXRpb24gTW9kZQorICAqIEBicmllZiAgICBMaXN0IG9mIG9wZWFyYXRpb24gbW9kZS4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX01PRF9FWFAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBDb21wdXRlIE1vbnRnb21lcnkgcGFyYW1ldGVyIGFuZCBtb2R1bGFyIGV4cG9uZW50aWF0aW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX01PTlRHT01FUllfUEFSQU0gICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAvKiE8IENvbXB1dGUgTW9udGdvbWVyeSBwYXJhbWV0ZXIgb25seSAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9NT0RVTEFSX0VYUCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgLyohPCBDb21wdXRlIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gb25seSAoTW9udGdvbWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGxvYWRlZCkgKi8KKyNkZWZpbmUgTExfUEtBX01PREVfTU9OVEdPTUVSWV9QQVJBTV9FQ0MgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpIC8qITwgQ29tcHV0ZSBNb250Z29tZXJ5IHBhcmFtZXRlciBhbmQgY29tcHV0ZSBFQ0Mga1Agb3BlcmF0aW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX0VDQ19LUF9QUklNSVRJVkUgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjJVKSAvKiE8IENvbXB1dGUgdGhlIEVDQyBrUCBwcmltaXRpdmUgb25seSAoTW9udGdvbWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGxvYWRlZCkgKi8KKyNkZWZpbmUgTExfUEtBX01PREVfRUNEU0FfU0lHTkFUVVJFICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyNFUpIC8qITwgRUNEU0Egc2lnbmF0dXJlICovCisjZGVmaW5lIExMX1BLQV9NT0RFX0VDRFNBX1ZFUklGSUNBVElPTiAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjZVKSAvKiE8IEVDRFNBIHZlcmlmaWNhdGlvbiAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9QT0lOVF9DSEVDSyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDI4VSkgLyohPCBQb2ludCBjaGVjayAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9SU0FfQ1JUX0VYUCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA3VSkgLyohPCBSU0EgQ1JUIGV4cG9uZW50aWF0aW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX01PRFVMQVJfSU5WICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAvKiE8IE1vZHVsYXIgaW52ZXJzaW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX0FSSVRITUVUSUNfQUREICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDlVKSAvKiE8IEFyaXRobWV0aWMgYWRkaXRpb24gKi8KKyNkZWZpbmUgTExfUEtBX01PREVfQVJJVEhNRVRJQ19TVUIgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwQVUpIC8qITwgQXJpdGhtZXRpYyBzdWJ0cmFjdGlvbiAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9BUklUSE1FVElDX01VTCAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDBCVSkgLyohPCBBcml0aG1ldGljIG11bHRpcGxpY2F0aW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX0NPTVBBUklTT04gICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMENVKSAvKiE8IENvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUEtBX01PREVfTU9EVUxBUl9SRURVQyAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwRFUpIC8qITwgTW9kdWxhciByZWR1Y3Rpb24gKi8KKyNkZWZpbmUgTExfUEtBX01PREVfTU9EVUxBUl9BREQgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwRVUpIC8qITwgTW9kdWxhciBhZGRpdGlvbiAqLworI2RlZmluZSBMTF9QS0FfTU9ERV9NT0RVTEFSX1NVQiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDBGVSkgLyohPCBNb2R1bGFyIHN1YnRyYWN0aW9uICovCisjZGVmaW5lIExMX1BLQV9NT0RFX01PTlRHT01FUllfTVVMICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAvKiE8IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBLQV9MTF9FeHBvcnRlZF9NYWNyb3MgUEtBIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUEtBIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gUEtBIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9QS0FfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBQS0EgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBQS0EgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfUEtBX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQS0FfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFBLQSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBLQV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQS0EgcGVyaXBoZXJhbC4KKyAgKiBAYnJpZWYgIFNldCBQS0Egb3BlcmF0aW5nIG1vZGUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTU9ERSAgICAgICAgICBMTF9QS0FfQ29uZmlnCisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX01PRF9FWFAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9FWFAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX0VDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0VDQ19LUF9QUklNSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9FQ0RTQV9TSUdOQVRVUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9FQ0RTQV9WRVJJRklDQVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9QT0lOVF9DSEVDSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX1JTQV9DUlRfRVhQCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9JTlYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9BUklUSE1FVElDX0FERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0FSSVRITUVUSUNfU1VCCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfQVJJVEhNRVRJQ19NVUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9DT01QQVJJU09OCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9SRURVQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PRFVMQVJfQURECisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9TVUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX01VTAorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUEtBX0NvbmZpZyhQS0FfVHlwZURlZiAqUEtBeCwgdWludDMyX3QgTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQS0F4LT5DUiwgKFBLQV9DUl9NT0RFKSwgKE1vZGUgPDwgUEtBX0NSX01PREVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBLQSBwZXJpcGhlcmFsLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOICAgICAgICAgICAgTExfUEtBX0VuYWJsZQorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfRW5hYmxlKFBLQV9UeXBlRGVmICpQS0F4KQoreworICBTRVRfQklUKFBLQXgtPkNSLCBQS0FfQ1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUEtBIHBlcmlwaGVyYWwuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU4gICAgICAgICAgICBMTF9QS0FfRGlzYWJsZQorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfRGlzYWJsZShQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgQ0xFQVJfQklUKFBLQXgtPkNSLCBQS0FfQ1JfRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBQS0EgcGVyaXBoZXJhbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOICAgICAgICAgICAgTExfUEtBX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUEtBX0lzRW5hYmxlZChQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUEtBeC0+Q1IsIFBLQV9DUl9FTikgPT0gKFBLQV9DUl9FTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUEtBIG9wZXJhdGluZyBtb2RlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1PREUgICAgICAgICAgTExfUEtBX1NldE1vZGUKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PTlRHT01FUllfUEFSQU1fTU9EX0VYUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PTlRHT01FUllfUEFSQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT0RVTEFSX0VYUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PTlRHT01FUllfUEFSQU1fRUNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfRUNDX0tQX1BSSU1JVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0VDRFNBX1NJR05BVFVSRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0VDRFNBX1ZFUklGSUNBVElPTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX1BPSU5UX0NIRUNLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfUlNBX0NSVF9FWFAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT0RVTEFSX0lOVgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0FSSVRITUVUSUNfQURECisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfQVJJVEhNRVRJQ19TVUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9BUklUSE1FVElDX01VTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0NPTVBBUklTT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT0RVTEFSX1JFRFVDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9BREQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT0RVTEFSX1NVQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PTlRHT01FUllfTVVMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfU2V0TW9kZShQS0FfVHlwZURlZiAqUEtBeCwgdWludDMyX3QgTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQS0F4LT5DUiwgUEtBX0NSX01PREUsIE1vZGUgPDwgUEtBX0NSX01PREVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUEtBIG9wZXJhdGluZyBtb2RlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1PREUgICAgICAgICAgTExfUEtBX0dldE1vZGUKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX01PRF9FWFAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9FWFAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX0VDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0VDQ19LUF9QUklNSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9FQ0RTQV9TSUdOQVRVUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9FQ0RTQV9WRVJJRklDQVRJT04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9QT0lOVF9DSEVDSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX1JTQV9DUlRfRVhQCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9JTlYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9BUklUSE1FVElDX0FERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX0FSSVRITUVUSUNfU1VCCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfQVJJVEhNRVRJQ19NVUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9DT01QQVJJU09OCisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9SRURVQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BLQV9NT0RFX01PRFVMQVJfQURECisgICogICAgICAgICBAYXJnIEByZWYgTExfUEtBX01PREVfTU9EVUxBUl9TVUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QS0FfTU9ERV9NT05UR09NRVJZX01VTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BLQV9HZXRNb2RlKFBLQV9UeXBlRGVmICpQS0F4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQS0F4LT5DUiwgUEtBX0NSX01PREUpID4+IFBLQV9DUl9NT0RFX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIG9wZXJhdGlvbiBzZWxlY3RlZCB1c2luZyBMTF9QS0FfU2V0TW9kZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBTVEFSVCAgICAgICAgIExMX1BLQV9TdGFydAorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfU3RhcnQoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIFNFVF9CSVQoUEtBeC0+Q1IsIFBLQV9DUl9TVEFSVCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGFkZHJlc3MgZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFERFJFUlJJRSAgICAgTExfUEtBX0VuYWJsZUlUX0FERFJFUlIKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUEtBX0VuYWJsZUlUX0FERFJFUlIoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIFNFVF9CSVQoUEtBeC0+Q1IsIFBLQV9DUl9BRERSRVJSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSQU0gZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJBTUVSUklFICAgICAgTExfUEtBX0VuYWJsZUlUX1JBTUVSUgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfRW5hYmxlSVRfUkFNRVJSKFBLQV9UeXBlRGVmICpQS0F4KQoreworICBTRVRfQklUKFBLQXgtPkNSLCBQS0FfQ1JfUkFNRVJSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQUk9DRU5ESUUgICAgIExMX1BLQV9FbmFibGVJVF9QUk9DRU5ECisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BLQV9FbmFibGVJVF9QUk9DRU5EKFBLQV9UeXBlRGVmICpQS0F4KQoreworICBTRVRfQklUKFBLQXgtPkNSLCBQS0FfQ1JfUFJPQ0VORElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFkZHJlc3MgZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFERFJFUlJJRSAgICAgTExfUEtBX0Rpc2FibGVJVF9BRERFUlIKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUEtBX0Rpc2FibGVJVF9BRERFUlIoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIENMRUFSX0JJVChQS0F4LT5DUiwgUEtBX0NSX0FERFJFUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSQU0gZXJyb3IgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJBTUVSUklFICAgICAgTExfUEtBX0Rpc2FibGVJVF9SQU1FUlIKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUEtBX0Rpc2FibGVJVF9SQU1FUlIoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIENMRUFSX0JJVChQS0F4LT5DUiwgUEtBX0NSX1JBTUVSUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVuZCBvZiBvcGVyYXRpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBST0NFTkRJRSAgICAgTExfUEtBX0Rpc2FibGVJVF9QUk9DRU5ECisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BLQV9EaXNhYmxlSVRfUFJPQ0VORChQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgQ0xFQVJfQklUKFBLQXgtPkNSLCBQS0FfQ1JfUFJPQ0VORElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhZGRyZXNzIGVycm9yIGludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFERFJFUlJJRSAgICAgTExfUEtBX0lzRW5hYmxlZElUX0FERFJFUlIKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BLQV9Jc0VuYWJsZWRJVF9BRERSRVJSKFBLQV9UeXBlRGVmICpQS0F4KQoreworICByZXR1cm4gKChSRUFEX0JJVChQS0F4LT5DUiwgUEtBX0NSX0FERFJFUlJJRSkgPT0gKFBLQV9DUl9BRERSRVJSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkFNIGVycm9yIGludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJBTUVSUklFICAgICAgTExfUEtBX0lzRW5hYmxlZElUX1JBTUVSUgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUEtBX0lzRW5hYmxlZElUX1JBTUVSUihQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUEtBeC0+Q1IsIFBLQV9DUl9SQU1FUlJJRSkgPT0gKFBLQV9DUl9SQU1FUlJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdCBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBST0NFTkRJRSAgICAgTExfUEtBX0lzRW5hYmxlZElUX1BST0NFTkQKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BLQV9Jc0VuYWJsZWRJVF9QUk9DRU5EKFBLQV9UeXBlRGVmICpQS0F4KQoreworICByZXR1cm4gKChSRUFEX0JJVChQS0F4LT5DUiwgUEtBX0NSX1BST0NFTkRJRSkgPT0gKFBLQV9DUl9QUk9DRU5ESUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBQS0EgZmxhZyBtYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgUEtBIGFkZHJlc3MgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBBRERSRVJSRiAgICAgIExMX1BLQV9Jc0FjdGl2ZUZsYWdfQUREUkVSUgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUEtBX0lzQWN0aXZlRmxhZ19BRERSRVJSKFBLQV9UeXBlRGVmICpQS0F4KQoreworICByZXR1cm4gKChSRUFEX0JJVChQS0F4LT5TUiwgUEtBX1NSX0FERFJFUlJGKSA9PSAoUEtBX1NSX0FERFJFUlJGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQS0EgUkFNIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUkFNRVJSRiAgICAgICBMTF9QS0FfSXNBY3RpdmVGbGFnX1JBTUVSUgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUEtBX0lzQWN0aXZlRmxhZ19SQU1FUlIoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBLQXgtPlNSLCBQS0FfU1JfUkFNRVJSRikgPT0gKFBLQV9TUl9SQU1FUlJGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBQS0EgZW5kIG9mIG9wZXJhdGlvbiBmbGFnLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFBST0NFTkRGICAgICAgTExfUEtBX0lzQWN0aXZlRmxhZ19QUk9DRU5ECisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QS0FfSXNBY3RpdmVGbGFnX1BST0NFTkQoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBLQXgtPlNSLCBQS0FfU1JfUFJPQ0VOREYpID09IChQS0FfU1JfUFJPQ0VOREYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFBLQSBidXN5IGZsYWcuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9QS0FfSXNBY3RpdmVGbGFnX0JVU1kKKyAgKiBAcGFyYW0gIFBLQXggUEtBIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BLQV9Jc0FjdGl2ZUZsYWdfQlVTWShQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUEtBeC0+U1IsIFBLQV9TUl9CVVNZKSA9PSAoUEtBX1NSX0JVU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUEtBIGFkZHJlc3MgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIENMUkZSICAgICAgICBBRERSRVJSRkMgICAgIExMX1BLQV9DbGVhckZsYWdfQURERVJSCisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BLQV9DbGVhckZsYWdfQURERVJSKFBLQV9UeXBlRGVmICpQS0F4KQoreworICBTRVRfQklUKFBLQXgtPkNMUkZSLCBQS0FfQ0xSRlJfQUREUkVSUkZDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBQS0EgUkFNIGVycm9yIGZsYWcuCisgICogQHJtdG9sbCBDTFJGUiAgICAgICAgUkFNRVJSRkMgICAgICBMTF9QS0FfQ2xlYXJGbGFnX1JBTUVSUgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QS0FfQ2xlYXJGbGFnX1JBTUVSUihQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgU0VUX0JJVChQS0F4LT5DTFJGUiwgUEtBX0NMUkZSX1JBTUVSUkZDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBQS0EgZW5kIG9mIG9wZXJhdGlvbiBmbGFnLgorICAqIEBybXRvbGwgQ0xSRlIgICAgICAgIFBST0NFTkRGQyAgICAgTExfUEtBX0NsZWFyRmxhZ19QUk9DRU5ECisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BLQV9DbGVhckZsYWdfUFJPQ0VORChQS0FfVHlwZURlZiAqUEtBeCkKK3sKKyAgU0VUX0JJVChQS0F4LT5DTFJGUiwgUEtBX0NMUkZSX1BST0NFTkRGQyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBQS0FfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfUEtBX0RlSW5pdChQS0FfVHlwZURlZiAqUEtBeCk7CitFcnJvclN0YXR1cyBMTF9QS0FfSW5pdChQS0FfVHlwZURlZiAqUEtBeCwgTExfUEtBX0luaXRUeXBlRGVmICpQS0FfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1BLQV9TdHJ1Y3RJbml0KExMX1BLQV9Jbml0VHlwZURlZiAqUEtBX0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChQS0EpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfUEtBX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfcHdyLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX3B3ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OTU1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX3B3ci5oCkBAIC0wLDAgKzEsMjU4NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9wd3IuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUFdSIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9QV1JfSAorI2RlZmluZSBTVE0zMldCeHhfTExfUFdSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFBXUikKKworLyoqIEBkZWZncm91cCBQV1JfTEwgUFdSCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9Qcml2YXRlX0NvbnN0YW50cyBQV1IgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqIEBkZWZncm91cCBQV1JfU01QU19DYWxpYnJhdGlvbiBQV1IgU01QUyBjYWxpYnJhdGlvbgorICAqIEB7CisgICovIAorI2RlZmluZSBTTVBTX1ZPTFRBR0VfQ0FMX0FERFIgICAgICAgICAgICAgICgodWludDMyX3QqKSAoMHgxRkZGNzU1OFVMKSkgICAgICAgICAvKiBTTVBTIG91dHB1dCB2b2x0YWdlIGNhbGlicmF0aW9uIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdm9sdGFnZSAiU01QU19WT0xUQUdFX0NBTF9WT0xUQUdFX01WIiAqLworI2RlZmluZSBTTVBTX1ZPTFRBR0VfQ0FMX1BPUyAgICAgICAgICAgICAgICg4VUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTVBTIG91dHB1dCB2b2x0YWdlIGNhbGlicmF0aW9uIGxldmVsIGJpdGZpZWxkIHBvc2l0aW9uICovCisjZGVmaW5lIFNNUFNfVk9MVEFHRV9DQUwgICAgICAgICAgICAgICAgICAgKDB4RlVMIDw8IFNNUFNfVk9MVEFHRV9DQUxfUE9TKSAgICAgIC8qIFNNUFMgb3V0cHV0IHZvbHRhZ2UgY2FsaWJyYXRpb24gbGV2ZWwgYml0ZmllbGQgbWFzayAqLworI2RlZmluZSBTTVBTX1ZPTFRBR0VfQ0FMX1ZPTFRBR0VfTVYgICAgICAgICgxNTAwVUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTVBTIG91dHB1dCB2b2x0YWdlIGNhbGlicmF0aW9uIHZhbHVlICh1bml0OiBtVikgKi8KKyNkZWZpbmUgU01QU19WT0xUQUdFX0JBU0VfTVYgICAgICAgICAgICAgICAoMTIwMFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU01QUyBvdXRwdXQgdm9sdGFnZSBiYXNlIHZhbHVlICh1bml0OiBtVikgKi8KKyNkZWZpbmUgU01QU19WT0xUQUdFX1NURVBfTVYgICAgICAgICAgICAgICAoICA1MFVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU01QUyBvdXRwdXQgdm9sdGFnZSBzdGVwICh1bml0OiBtVikgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFBXUiBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1BXUl9Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRiAgICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DV1VGCisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjUgICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DV1VGNQorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUY0ICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1dVRjQKKyNkZWZpbmUgTExfUFdSX1NDUl9DV1VGMyAgICAgICAgICAgICAgICAgICBQV1JfU0NSX0NXVUYzCisjZGVmaW5lIExMX1BXUl9TQ1JfQ1dVRjIgICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DV1VGMgorI2RlZmluZSBMTF9QV1JfU0NSX0NXVUYxICAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ1dVRjEKKyNkZWZpbmUgTExfUFdSX1NDUl9DQzJIRiAgICAgICAgICAgICAgICAgICBQV1JfU0NSX0NDMkhGCisjZGVmaW5lIExMX1BXUl9TQ1JfQzgwMkFGICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DODAyQUYKKyNkZWZpbmUgTExfUFdSX1NDUl9DQkxFQUYgICAgICAgICAgICAgICAgICBQV1JfU0NSX0NCTEVBRgorI2RlZmluZSBMTF9QV1JfU0NSX0NDUlBFRiAgICAgICAgICAgICAgICAgIFBXUl9TQ1JfQ0NSUEVGCisjZGVmaW5lIExMX1BXUl9TQ1JfQzgwMldVRiAgICAgICAgICAgICAgICAgUFdSX1NDUl9DODAyV1VGCisjZGVmaW5lIExMX1BXUl9TQ1JfQ0JMRVdVRiAgICAgICAgICAgICAgICAgUFdSX1NDUl9DQkxFV1VGCisjZGVmaW5lIExMX1BXUl9TQ1JfQ0JPUkhGICAgICAgICAgICAgICAgICAgUFdSX1NDUl9DQk9SSEYKKyNkZWZpbmUgTExfUFdSX1NDUl9DU01QU0ZCRiAgICAgICAgICAgICAgICBQV1JfU0NSX0NTTVBTRkJGCisjZGVmaW5lIExMX1BXUl9FWFRTQ1JfQ0NSUEYgICAgICAgICAgICAgICAgUFdSX0VYVFNDUl9DQ1JQRgorI2RlZmluZSBMTF9QV1JfRVhUU0NSX0MyQ1NTRiAgICAgICAgICAgICAgIFBXUl9FWFRTQ1JfQzJDU1NGCisjZGVmaW5lIExMX1BXUl9FWFRTQ1JfQzFDU1NGICAgICAgICAgICAgICAgUFdSX0VYVFNDUl9DMUNTU0YKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0dFVF9GTEFHIEdldCBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9QV1JfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGSSAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUZJCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGNSAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUY1CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGNCAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUY0CisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMyAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUYzCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMiAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUYyCisjZGVmaW5lIExMX1BXUl9TUjFfV1VGMSAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9XVUYxCisjZGVmaW5lIExMX1BXUl9TUjJfUFZNTzMgICAgICAgICAgICAgICAgICAgUFdSX1NSMl9QVk1PMworI2RlZmluZSBMTF9QV1JfU1IyX1BWTU8xICAgICAgICAgICAgICAgICAgIFBXUl9TUjJfUFZNTzEKKyNkZWZpbmUgTExfUFdSX1NSMl9QVkRPICAgICAgICAgICAgICAgICAgICBQV1JfU1IyX1BWRE8KKyNkZWZpbmUgTExfUFdSX1NSMl9WT1NGICAgICAgICAgICAgICAgICAgICBQV1JfU1IyX1ZPU0YKKyNkZWZpbmUgTExfUFdSX1NSMl9SRUdMUEYgICAgICAgICAgICAgICAgICBQV1JfU1IyX1JFR0xQRgorI2RlZmluZSBMTF9QV1JfU1IyX1JFR0xQUyAgICAgICAgICAgICAgICAgIFBXUl9TUjJfUkVHTFBTCisKKy8qIEJPUiBmbGFncyAqLworI2RlZmluZSBMTF9QV1JfRkxBR19CT1JIICAgICAgICAgICAgICAgICAgIFBXUl9TUjFfQk9SSEYgIC8qIEJPUkggaW50ZXJydXB0IGZsYWcgKi8KKworLyogU01QUyBmbGFncyAqLworI2RlZmluZSBMTF9QV1JfRkxBR19TTVBTICAgICAgICAgICAgICAgICAgIFBXUl9TUjJfU01QU0YgIC8qIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciByZWFkeSBmbGFnICovCisjZGVmaW5lIExMX1BXUl9GTEFHX1NNUFNCICAgICAgICAgICAgICAgICAgUFdSX1NSMl9TTVBTQkYgLyogU01QUyBzdGVwIGRvd24gY29udmVydGVyIGluIGJ5cGFzcyBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTExfUFdSX0ZMQUdfU01QU0ZCICAgICAgICAgICAgICAgICBQV1JfU1IxX1NNUFNGQiAvKiBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgZm9yY2VkIGluIGJ5cGFzcyBtb2RlIGludGVycnVwdCBmbGFnICovCisKKy8qIFJhZGlvIChCTEUgb3IgODAyLjE1LjQpIGZsYWdzICovCisjZGVmaW5lIExMX1BXUl9GTEFHX0JMRVdVICAgICAgICAgICAgICAgICAgUFdSX1NSMV9CTEVXVUYgIC8qIEJMRSB3YWtldXAgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUFdSX0ZMQUdfODAyV1UgICAgICAgICAgICAgICAgICBQV1JfU1IxXzgwMldVRiAgLyogODAyLjE1LjQgd2FrZXVwIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1BXUl9GTEFHX0JMRUEgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9CTEVBRiAgIC8qIEJMRSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUFdSX0ZMQUdfODAyQSAgICAgICAgICAgICAgICAgICBQV1JfU1IxXzgwMkFGICAgLyogODAyLjE1LjQgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1BXUl9GTEFHX0NSUEUgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9DUlBFRiAgIC8qIENyaXRpY2FsIHJhZGlvIHBoYXNlIGVuZCBvZiBhY3Rpdml0eSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9QV1JfRkxBR19DUlAgICAgICAgICAgICAgICAgICAgIFBXUl9FWFRTQ1JfQ1JQRiAvKiBDcml0aWNhbCByYWRpbyBzeXN0ZW0gcGhhc2UgKi8KKworLyogTXVsdGljb3JlIGZsYWdzICovCisjZGVmaW5lIExMX1BXUl9FWFRTQ1JfQzFTQkYgICAgICAgICAgICAgICAgUFdSX0VYVFNDUl9DMVNCRiAgIC8qIFN5c3RlbSBzdGFuZGJ5IGZsYWcgZm9yIENQVTEgKi8KKyNkZWZpbmUgTExfUFdSX0VYVFNDUl9DMVNUT1BGICAgICAgICAgICAgICBQV1JfRVhUU0NSX0MxU1RPUEYgLyogU3lzdGVtIHN0b3AgZmxhZyBmb3IgQ1BVMSAqLworI2RlZmluZSBMTF9QV1JfRVhUU0NSX0MxRFMgICAgICAgICAgICAgICAgIFBXUl9FWFRTQ1JfQzFEUyAgICAvKiBDUFUxIGRlZXBzbGVlcCBtb2RlICovCisjZGVmaW5lIExMX1BXUl9FWFRTQ1JfQzJTQkYgICAgICAgICAgICAgICAgUFdSX0VYVFNDUl9DMlNCRiAgIC8qIFN5c3RlbSBzdGFuZGJ5IGZsYWcgZm9yIENQVTIgKi8KKyNkZWZpbmUgTExfUFdSX0VYVFNDUl9DMlNUT1BGICAgICAgICAgICAgICBQV1JfRVhUU0NSX0MyU1RPUEYgLyogU3lzdGVtIHN0b3AgZmxhZyBmb3IgQ1BVMiAqLworI2RlZmluZSBMTF9QV1JfRVhUU0NSX0MyRFMgICAgICAgICAgICAgICAgIFBXUl9FWFRTQ1JfQzJEUyAgICAvKiBDUFUyIGRlZXBzbGVlcCBtb2RlICovCisjZGVmaW5lIExMX1BXUl9TUjFfQzJIRiAgICAgICAgICAgICAgICAgICAgUFdSX1NSMV9DMkhGICAgICAgIC8qIENQVTIgaG9sZCBpbnRlcnJ1cHQgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfUkVHVV9WT0xUQUdFIFJFR1UgVk9MVEFHRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxICAgICAgICAgKFBXUl9DUjFfVk9TXzApIC8qIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCByYW5nZSAxIG1vZGUsIHR5cGljYWwgb3V0cHV0IHZvbHRhZ2UgYXQgMS4yIFYsIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gNjQgTUh6LiAqLworI2RlZmluZSBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMiAgICAgICAgIChQV1JfQ1IxX1ZPU18xKSAvKiBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMiBtb2RlLCB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMCBWLCBzeXN0ZW0gZnJlcXVlbmN5IHVwIHRvIDE2IE1Iei4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX01PREVfUFdSIE1PREUgUFdSCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX01PREVfU1RPUDAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMDBVKQorI2RlZmluZSBMTF9QV1JfTU9ERV9TVE9QMSAgICAgICAgICAgICAgICAgIChQV1JfQ1IxX0xQTVNfMCkKKyNkZWZpbmUgTExfUFdSX01PREVfU1RPUDIgICAgICAgICAgICAgICAgICAoUFdSX0NSMV9MUE1TXzEpCisjZGVmaW5lIExMX1BXUl9NT0RFX1NUQU5EQlkgICAgICAgICAgICAgICAgKFBXUl9DUjFfTFBNU18xIHwgUFdSX0NSMV9MUE1TXzApCisjZGVmaW5lIExMX1BXUl9NT0RFX1NIVVRET1dOICAgICAgICAgICAgICAgKFBXUl9DUjFfTFBNU18yKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfRkxBU0hfTFBSVU5fUE9XRVJfRE9XTl9NT0RFIEZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgbG93LXBvd2VyIHJ1biBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0ZMQVNIX0xQUlVOX01PREVfSURMRSAgICAgICAoMHgwMDAwMDAwMDBVKQorI2RlZmluZSBMTF9QV1JfRkxBU0hfTFBSVU5fTU9ERV9QT1dFUl9ET1dOIChQV1JfQ1IxX0ZQRFIpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19GTEFTSF9TTEVFUF9QT1dFUl9ET1dOX01PREUgRmxhc2ggcG93ZXItZG93biBtb2RlIGR1cmluZyBzbGVlcCBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0ZMQVNIX1NMRUVQX01PREVfSURMRSAgICAgICAoMHgwMDAwMDAwMDBVKQorI2RlZmluZSBMTF9QV1JfRkxBU0hfU0xFRVBfTU9ERV9QT1dFUl9ET1dOIChQV1JfQ1IxX0ZQRFMpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19QVk1fVkREVVNCXzEgUGVyaXBoZXJhbCB2b2x0YWdlIG1vbml0b3JpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfUFZNX1ZERFVTQl8xXzJWICAgICAgICAgICAgIChQV1JfQ1IyX1BWTUUxKSAgICAgLyogTW9uaXRvcmluZyBWRERVU0IgdnMuIDEuMlYgKi8KKyNkZWZpbmUgTExfUFdSX1BWTV9WRERBXzFfNjJWICAgICAgICAgICAgICAoUFdSX0NSMl9QVk1FMykgICAgIC8qIE1vbml0b3JpbmcgVkREQSB2cy4gMS42MlYgICovCisvKioKKyAgKiBAfQorICAqLworICAKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1BWRExFVkVMIFBWRExFVkVMCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMCBhcm91bmQgMi4wIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzEgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMSBhcm91bmQgMi4yIFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzIgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZEMiBhcm91bmQgMi40IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzMgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMSB8IFBXUl9DUjJfUExTXzApICAgICAgICAgICAgICAgICAvKiBWUFZEMyBhcm91bmQgMi41IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzQgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWUFZENCBhcm91bmQgMi42IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzUgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMiB8IFBXUl9DUjJfUExTXzApICAgICAgICAgICAgICAgICAvKiBWUFZENSBhcm91bmQgMi44IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzYgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMiB8IFBXUl9DUjJfUExTXzEpICAgICAgICAgICAgICAgICAvKiBWUFZENiBhcm91bmQgMi45IFYgKi8KKyNkZWZpbmUgTExfUFdSX1BWRExFVkVMXzcgICAgICAgICAgICAgICAgICAoUFdSX0NSMl9QTFNfMiB8IFBXUl9DUjJfUExTXzEgfCBQV1JfQ1IyX1BMU18wKSAvKiBFeHRlcm5hbCBpbnB1dCBhbmFsb2cgdm9sdGFnZSAgIChDb21wYXJlIGludGVybmFsbHkgdG8gVlJFRklOVCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1dBS0VVUCBXQUtFVVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjEgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVAxKQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjIgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVAyKQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjMgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVAzKQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjQgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVA0KQorI2RlZmluZSBMTF9QV1JfV0FLRVVQX1BJTjUgICAgICAgICAgICAgICAgIChQV1JfQ1IzX0VXVVA1KQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfQkFUVF9DSEFSR19SRVNJU1RPUiBCQVRUIENIQVJHIFJFU0lTVE9SCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0JBVFRfQ0hBUkdfUkVTSVNUT1JfNUsgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIExMX1BXUl9CQVRUX0NIQVJHUkVTSVNUT1JfMV81SyAgICAgKFBXUl9DUjRfVkJSUykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0dQSU8gR1BJTworICAqIEB7CisgICovCisjZGVmaW5lIExMX1BXUl9HUElPX0EgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JBKSkpCisjZGVmaW5lIExMX1BXUl9HUElPX0IgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JCKSkpCisjZGVmaW5lIExMX1BXUl9HUElPX0MgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JDKSkpCisjZGVmaW5lIExMX1BXUl9HUElPX0QgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JEKSkpCisjZGVmaW5lIExMX1BXUl9HUElPX0UgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JFKSkpCisjZGVmaW5lIExMX1BXUl9HUElPX0ggICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoJihQV1ItPlBVQ1JIKSkpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19HUElPX0JJVCBHUElPIEJJVAorICAqIEB7CisgICovCisvKiBOb3RlOiBMTF9QV1JfR1BJT19CSVRfeCBkZWZpbmVkIGZyb20gcG9ydCBDIGJlY2F1c2UgYWxsIHBpbnMgYXJlIGF2YWlsYWJsZSAqLworLyogICAgICAgZm9yIFBXUiBwdWxsLXVwIGFuZCBwdWxsLWRvd24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzAgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMCkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzIgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMikKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzMgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMykKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzQgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDNCkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzUgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDNSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzYgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDNikKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzcgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDNykKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzggICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDOCkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzkgICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDOSkKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEwICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMTApCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xMSAgICAgICAgICAgICAgICAgKFBXUl9QVUNSQ19QQzExKQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTIgICAgICAgICAgICAgICAgIChQV1JfUFVDUkNfUEMxMikKKyNkZWZpbmUgTExfUFdSX0dQSU9fQklUXzEzICAgICAgICAgICAgICAgICAoUFdSX1BVQ1JDX1BDMTMpCisjZGVmaW5lIExMX1BXUl9HUElPX0JJVF8xNCAgICAgICAgICAgICAgICAgKFBXUl9QVUNSQ19QQzE0KQorI2RlZmluZSBMTF9QV1JfR1BJT19CSVRfMTUgICAgICAgICAgICAgICAgIChQV1JfUFVDUkNfUEMxNSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX0JPUl9DT05GSUdVUkFUSU9OIEJPUiBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUFdSX0JPUl9TWVNURU1fUkVTRVQgICAgICAgICAgICAoMHgwMDAwMDAwMFUpICAgICAvKiE8IEJPUiB3aWxsIGdlbmVyYXRlIGEgc3lzdGVtIHJlc2V0ICAqLworI2RlZmluZSBMTF9QV1JfQk9SX1NNUFNfRk9SQ0VfQllQQVNTICAgICAgIChQV1JfQ1I1X0JPUkhDKSAgIC8qITwgQk9SIHdpbGwgZm9yIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBpbiBieXBhc3MgbW9kZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUNfU01QU19PUEVSQVRJTkdfTU9ERVMgU01QUyBzdGVwIGRvd24gY29udmVydGVyIG9wZXJhdGluZyBtb2RlcworICAqIEB7CisgICovCisvKiBOb3RlOiBMaXRlcmFscyB2YWx1ZXMgYXJlIGRlZmluZWQgZnJvbSByZWdpc3RlciBTUjIgYml0cyBTTVBTRiBhbmQgU01QU0JGICAqLworLyogICAgICAgYnV0IHRoZXkgYXJlIGFsc28gdXNlZCBhcyByZWdpc3RlciBDUjUgYml0cyBTTVBTRU4gYW5kIFNNUFNCRU4sICAgICAgKi8KKy8qICAgICAgIGFzIHVzZWQgYnkgYWxsIFNNUFMgb3BlcmF0aW5nIG1vZGUgZnVuY3Rpb25zIHRhcmdldHRpbmcgZGlmZmVyZW50ICAgICovCisvKiAgICAgICByZWdpc3RlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIkxMX1BXUl9TTVBTX1NldE1vZGUoKSIsICJMTF9QV1JfU01QU19HZXRNb2RlKCkiICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCAiTExfUFdSX1NNUFNfR2V0RWZmZWN0aXZlTW9kZSgpIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1BXUl9TTVBTX0JZUEFTUyAgICAgICAgICAgICAgICAgKFBXUl9TUjJfU01QU0JGKSAvKiE8IFNNUFMgc3RlcCBkb3duIGluIGJ5cGFzcyBtb2RlLiAqLworI2RlZmluZSBMTF9QV1JfU01QU19TVEVQX0RPV04gICAgICAgICAgICAgIChQV1JfU1IyX1NNUFNGKSAgLyohPCBTTVBTIHN0ZXAgZG93biBpbiBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcDAuIElmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBzdG9wMSwgc3RvcDIsIHN0YW5kYnksIHNodXRkb3duLCB0aGVuIFNNUFMgaXMgZm9yY2VkIGluIG1vZGUgb3BlbiB0byBwcmVzZXJ2ZSBlbmVyZ3kgc3RvcmVkIGluIGRlY291cGxpbmcgY2FwYWNpdG9yIGFzIGxvbmcgYXMgcG9zc2libGUuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FQ19TTVBTX1NUQVJUVVBfQ1VSUkVOVCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfODBNQSAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgODBtQSAqLworI2RlZmluZSBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTAwTUEgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1NDXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgMTAwbUEgKi8KKyNkZWZpbmUgTExfUFdSX1NNUFNfU1RBUlRVUF9DVVJSRU5UXzEyME1BICAoICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1NDXzEgICAgICAgICAgICAgICAgICAgKSAvKiE8IFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IDEyMG1BICovCisjZGVmaW5lIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xNDBNQSAgKCAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNTQ18xIHwgUFdSX0NSNV9TTVBTU0NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCAxNDBtQSAqLworI2RlZmluZSBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTYwTUEgIChQV1JfQ1I1X1NNUFNTQ18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgMTYwbUEgKi8KKyNkZWZpbmUgTExfUFdSX1NNUFNfU1RBUlRVUF9DVVJSRU5UXzE4ME1BICAoUFdSX0NSNV9TTVBTU0NfMiB8ICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNTQ18wKSAvKiE8IFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IDE4MG1BICovCisjZGVmaW5lIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8yMDBNQSAgKFBXUl9DUjVfU01QU1NDXzIgfCBQV1JfQ1I1X1NNUFNTQ18xICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IHN0YXJ0dXAgY3VycmVudCAyMDBtQSAqLworI2RlZmluZSBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMjIwTUEgIChQV1JfQ1I1X1NNUFNTQ18yIHwgUFdSX0NSNV9TTVBTU0NfMSB8IFBXUl9DUjVfU01QU1NDXzApIC8qITwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgMjIwbUEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VDX1NNUFNfT1VUUFVUX1ZPTFRBR0VfTEVWRUwgU01QUyBzdGVwIGRvd24gY29udmVydGVyIG91dHB1dCB2b2x0YWdlIHNjYWxpbmcgdm9sdGFnZSBsZXZlbAorICAqIEB7CisgICovCisvKiBOb3RlOiBTTVBTIHZvbHRhZ2UgaXMgdHJpbW1lZCBkdXJpbmcgZGV2aWNlIHByb2R1Y3Rpb24gdG8gY29udHJvbAorICAgICAgICAgdGhlIGFjdHVhbCB2b2x0YWdlIGxldmVsIHZhcmlhdGlvbiBmcm9tIGRldmljZSB0byBkZXZpY2UuICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMjAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuMjBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMjUgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuMjVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMzAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuMzBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMzUgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzEgfCBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuMzVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNDAgICggICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNDBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNDUgICggICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18yIHwgICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNDVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTAgICggICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18yIHwgUFdSX0NSNV9TTVBTVk9TXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNTBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTUgICggICAgICAgICAgICAgICAgICAgIFBXUl9DUjVfU01QU1ZPU18yIHwgUFdSX0NSNV9TTVBTVk9TXzEgfCBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNTVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNjAgIChQV1JfQ1I1X1NNUFNWT1NfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNjBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNjUgIChQV1JfQ1I1X1NNUFNWT1NfMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNjVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNzAgIChQV1JfQ1I1X1NNUFNWT1NfMyB8ICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNzBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNzUgIChQV1JfQ1I1X1NNUFNWT1NfMyB8ICAgICAgICAgICAgICAgICAgICAgUFdSX0NSNV9TTVBTVk9TXzEgfCBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuNzVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWODAgIChQV1JfQ1I1X1NNUFNWT1NfMyB8IFBXUl9DUjVfU01QU1ZPU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuODBWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWODUgIChQV1JfQ1I1X1NNUFNWT1NfMyB8IFBXUl9DUjVfU01QU1ZPU18yIHwgICAgICAgICAgICAgICAgICAgICBQV1JfQ1I1X1NNUFNWT1NfMCkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuODVWICovCisjZGVmaW5lIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWOTAgIChQV1JfQ1I1X1NNUFNWT1NfMyB8IFBXUl9DUjVfU01QU1ZPU18yIHwgUFdSX0NSNV9TTVBTVk9TXzEgICAgICAgICAgICAgICAgICAgICkgLyohPCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgc3VwcGx5IG91dHB1dCB2b2x0YWdlIDEuOTBWICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfTExfRXhwb3J0ZWRfTWFjcm9zIFBXUiBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFBXUiByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfUFdSX1dyaXRlUmVnKF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKFBXUi0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFBXUiByZWdpc3RlcgorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9QV1JfUmVhZFJlZyhfX1JFR19fKSBSRUFEX1JFRyhQV1ItPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUFdSIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3dpdGNoIGZyb20gcnVuIG1haW4gbW9kZSB0byBydW4gbG93LXBvd2VyIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfRW50ZXJMb3dQb3dlclJ1bk1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbnRlckxvd1Bvd2VyUnVuTW9kZSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3dpdGNoIGZyb20gcnVuIG1haW4gbW9kZSB0byBsb3ctcG93ZXIgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBMUFIgICAgICAgICAgIExMX1BXUl9FeGl0TG93UG93ZXJSdW5Nb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRXhpdExvd1Bvd2VyUnVuTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgcmVndWxhdG9yIGlzIGluIGxvdy1wb3dlciBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBSICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkTG93UG93ZXJSdW5Nb2RlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZExvd1Bvd2VyUnVuTW9kZSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpID09IChQV1JfQ1IxX0xQUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIG1haW4gaW50ZXJuYWwgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlCisgICogQG5vdGUgICBBIGRlbGF5IGlzIHJlcXVpcmVkIGZvciB0aGUgaW50ZXJuYWwgcmVndWxhdG9yIHRvIGJlIHJlYWR5IAorICAqICAgICAgICAgYWZ0ZXIgdGhlIHZvbHRhZ2Ugc2NhbGluZyBoYXMgYmVlbiBjaGFuZ2VkLgorICAqICAgICAgICAgQ2hlY2sgd2hldGhlciByZWd1bGF0b3IgcmVhY2hlZCB0aGUgc2VsZWN0ZWQgdm9sdGFnZSBsZXZlbAorICAqICAgICAgICAgY2FuIGJlIGRvbmUgdXNpbmcgZnVuY3Rpb24gQHJlZiBMTF9QV1JfSXNBY3RpdmVGbGFnX1ZPUygpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFZPUyAgICAgICAgICAgTExfUFdSX1NldFJlZ3VsVm9sdGFnZVNjYWxpbmcKKyAgKiBAcGFyYW0gIFZvbHRhZ2VTY2FsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFJlZ3VsVm9sdGFnZVNjYWxpbmcodWludDMyX3QgVm9sdGFnZVNjYWxpbmcpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfVk9TLCBWb2x0YWdlU2NhbGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBtYWluIGludGVybmFsIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFZPUyAgICAgICAgICAgTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1JFR1VfVk9MVEFHRV9TQ0FMRTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRSZWd1bFZvbHRhZ2VTY2FsaW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBEQlAgICAgICAgICAgIExMX1BXUl9FbmFibGVCa1VwQWNjZXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmtVcEFjY2Vzcyh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBEQlAgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBiYWNrdXAgZG9tYWluIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBEQlAgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRCa1VwQWNjZXNzCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZEJrVXBBY2Nlc3Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSA9PSAoUFdSX0NSMV9EQlApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExvdy1Qb3dlciBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBNUyAgICAgICAgICBMTF9QV1JfU2V0UG93ZXJNb2RlCisgICogQHBhcmFtICBMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVEFOREJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU0hVVERPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRQb3dlck1vZGUodWludDMyX3QgTG93UG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIExvd1Bvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IExvdy1Qb3dlciBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFBNUyAgICAgICAgICBMTF9QV1JfR2V0UG93ZXJNb2RlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUQU5EQlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TSFVURE9XTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQb3dlck1vZGUodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBmbGFzaCBwb3dlci1kb3duIG1vZGUgZHVyaW5nIGxvdy1wb3dlciBydW4gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZQRFIgICAgICAgICAgTExfUFdSX1NldEZsYXNoUG93ZXJNb2RlTFBSdW4KKyAgKiBAcGFyYW0gIEZsYXNoTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX0xQUlVOX01PREVfSURMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9GTEFTSF9MUFJVTl9NT0RFX1BPV0VSX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRGbGFzaFBvd2VyTW9kZUxQUnVuKHVpbnQzMl90IEZsYXNoTG93UG93ZXJNb2RlKQoreworICAvKiBVbmxvY2sgYml0IEZQRFIgKi8KKyAgV1JJVEVfUkVHKFBXUi0+Q1IxLCAweDAwMDBDMUIwVSk7CisgIAorICAvKiBVcGRhdGUgYml0IEZQRFIgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9GUERSLCBGbGFzaExvd1Bvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgbG93LXBvd2VyIHJ1biBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRlBEUiAgICAgICAgICBMTF9QV1JfR2V0Rmxhc2hQb3dlck1vZGVMUFJ1bgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfRkxBU0hfTFBSVU5fTU9ERV9JRExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX0xQUlVOX01PREVfUE9XRVJfRE9XTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRGbGFzaFBvd2VyTW9kZUxQUnVuKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0ZQRFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZmxhc2ggcG93ZXItZG93biBtb2RlIGR1cmluZyBzbGVlcCBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRlBEUyAgICAgICAgICBMTF9QV1JfU2V0Rmxhc2hQb3dlck1vZGVTbGVlcAorICAqIEBwYXJhbSAgRmxhc2hMb3dQb3dlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfRkxBU0hfU0xFRVBfTU9ERV9JRExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX1NMRUVQX01PREVfUE9XRVJfRE9XTgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldEZsYXNoUG93ZXJNb2RlU2xlZXAodWludDMyX3QgRmxhc2hMb3dQb3dlck1vZGUpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfRlBEUywgRmxhc2hMb3dQb3dlck1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmbGFzaCBwb3dlci1kb3duIG1vZGUgZHVyaW5nIHNsZWVwIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBGUERTICAgICAgICAgIExMX1BXUl9HZXRGbGFzaFBvd2VyTW9kZVNsZWVwCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9GTEFTSF9TTEVFUF9NT0RFX0lETEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfRkxBU0hfU0xFRVBfTU9ERV9QT1dFUl9ET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0dldEZsYXNoUG93ZXJNb2RlU2xlZXAodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfRlBEUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBWRERVU0Igc3VwcGx5CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVVNWICAgICAgICAgICBMTF9QV1JfRW5hYmxlVmRkVVNCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlVmRkVVNCKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfVVNWKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFZERFVTQiBzdXBwbHkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBVU1YgICAgICAgICAgIExMX1BXUl9EaXNhYmxlVmRkVVNCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVZkZFVTQih2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfVVNWKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBWRERVU0Igc3VwcGx5IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBVU1YgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRWZGRVU0IKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkVmRkVVNCKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1VTVikgPT0gKFBXUl9DUjJfVVNWKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3Jpbmcgb24gYSBwZXJpcGhlcmFsCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUFZNRTEgICAgICAgICBMTF9QV1JfRW5hYmxlUFZNXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FMyAgICAgICAgIExMX1BXUl9FbmFibGVQVk0KKyAgKiBAcGFyYW0gIFBlcmlwaFZvbHRhZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZERFVTQl8xXzJWCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERBXzFfNjJWCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUFZNKHVpbnQzMl90IFBlcmlwaFZvbHRhZ2UpCit7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBlcmlwaFZvbHRhZ2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyBvbiBhIHBlcmlwaGVyYWwKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQVk1FMSAgICAgICAgIExMX1BXUl9EaXNhYmxlUFZNXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBQVk1FMyAgICAgICAgIExMX1BXUl9EaXNhYmxlUFZNCisgICogQHBhcmFtICBQZXJpcGhWb2x0YWdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWTV9WRERVU0JfMV8yVgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREQV8xXzYyVgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVQVk0odWludDMyX3QgUGVyaXBoVm9sdGFnZSkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IyLCBQZXJpcGhWb2x0YWdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgaXMgZW5hYmxlZCBvbiBhIHBlcmlwaGVyYWwKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQVk1FMSAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVk1cbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFBWTUUzICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBWTQorICAqIEBwYXJhbSAgUGVyaXBoVm9sdGFnZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVk1fVkREVVNCXzFfMlYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZNX1ZEREFfMV82MlYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFZNKHVpbnQzMl90IFBlcmlwaFZvbHRhZ2UpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IyLCBQZXJpcGhWb2x0YWdlKSA9PSAoUGVyaXBoVm9sdGFnZSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUExTICAgICAgICAgICBMTF9QV1JfU2V0UFZETGV2ZWwKKyAgKiBAcGFyYW0gIFBWRExldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFBWRExldmVsKHVpbnQzMl90IFBWRExldmVsKQoreworICBNT0RJRllfUkVHKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUywgUFZETGV2ZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgdm9sdGFnZSB0aHJlc2hvbGQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUExTICAgICAgICAgICBMTF9QV1JfR2V0UFZETGV2ZWwKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9QVkRMRVZFTF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1BWRExFVkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfUFZETEVWRUxfNworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRQVkRMZXZlbCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QTFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0VuYWJsZVBWRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFBWREUgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlUFZEKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBQb3dlciBWb2x0YWdlIERldGVjdG9yIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQVkRFICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRQVkQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFZEKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IyLCBQV1JfQ1IyX1BWREUpID09IChQV1JfQ1IyX1BWREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEludGVybmFsIFdha2UtdXAgbGluZQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0VuYWJsZUludGVybldVCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlSW50ZXJuV1Uodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJbnRlcm5hbCBXYWtlLXVwIGxpbmUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSVdGICAgICAgICAgIExMX1BXUl9EaXNhYmxlSW50ZXJuV1UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlSW50ZXJuV1Uodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV1VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBJbnRlcm5hbCBXYWtlLXVwIGxpbmUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJV0YgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZEludGVybldVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZEludGVybldVKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV1VMKSA9PSAoUFdSX0NSM19FSVdVTCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBBUEMgICAgICAgICAgIExMX1BXUl9FbmFibGVQVVBEQ2ZnCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlUFVQRENmZyh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0Rpc2FibGVQVVBEQ2ZnCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZVBVUERDZmcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0FQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24gaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEFQQyAgICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFBVUERDZmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkUFVQRENmZyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpID09IChQV1JfQ1IzX0FQQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlJTICAgICAgICAgICBMTF9QV1JfRW5hYmxlU1JBTTJSZXRlbnRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVTUkFNMlJldGVudGlvbih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTUkFNMiBjb250ZW50IHJldGVudGlvbiBpbiBTdGFuZGJ5IG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSUlMgICAgICAgICAgIExMX1BXUl9EaXNhYmxlU1JBTTJSZXRlbnRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlU1JBTTJSZXRlbnRpb24odm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX1JSUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1JBTTIgY29udGVudCByZXRlbnRpb24gaW4gU3RhbmRieSBtb2RlICBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlJTICAgICAgICAgICBMTF9QV1JfSXNFbmFibGVkU1JBTTJSZXRlbnRpb24KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkU1JBTTJSZXRlbnRpb24odm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfUlJTKSA9PSAoUFdSX0NSM19SUlMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQMiAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAzICAgICAgICAgTExfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNSAgICAgICAgIExMX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5CisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRVdVUDEgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDIgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDMgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDQgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDUgICAgICAgICBMTF9QV1JfRGlzYWJsZVdha2VVcFBpblxuCisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBXYWtlVXBQaW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFV1VQMSAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVAyICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgICogICAgICAgICBDUjMgICAgICAgICAgRVdVUDMgICAgICAgICBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBFV1VQNCAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIEVXVVA1ICAgICAgICAgTExfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbikKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjMsIFdha2VVcFBpbikgPT0gKFdha2VVcFBpbikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHJlc2lzdG9yIGltcGVkYW5jZQorICAqIEBybXRvbGwgQ1I0ICAgICAgICAgIFZCUlMgICAgICAgICAgTExfUFdSX1NldEJhdHRDaGFyZ1Jlc2lzdG9yCisgICogQHBhcmFtICBSZXNpc3RvciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CQVRUX0NIQVJHX1JFU0lTVE9SXzVLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JBVFRfQ0hBUkdSRVNJU1RPUl8xXzVLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU2V0QmF0dENoYXJnUmVzaXN0b3IodWludDMyX3QgUmVzaXN0b3IpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUjQsIFBXUl9DUjRfVkJSUywgUmVzaXN0b3IpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcmVzaXN0b3IgaW1wZWRhbmNlCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJSUyAgICAgICAgICBMTF9QV1JfR2V0QmF0dENoYXJnUmVzaXN0b3IKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JBVFRfQ0hBUkdfUkVTSVNUT1JfNUsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfQkFUVF9DSEFSR1JFU0lTVE9SXzFfNUsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfR2V0QmF0dENoYXJnUmVzaXN0b3Iodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJSUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBiYXR0ZXJ5IGNoYXJnaW5nCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgVkJFICAgICAgICAgICBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQmF0dGVyeUNoYXJnaW5nKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGJhdHRlcnkgY2hhcmdpbmcKKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9EaXNhYmxlQmF0dGVyeUNoYXJnaW5nCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUJhdHRlcnlDaGFyZ2luZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfVkJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBiYXR0ZXJ5IGNoYXJnaW5nIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBWQkUgICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRCYXR0ZXJ5Q2hhcmdpbmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkQmF0dGVyeUNoYXJnaW5nKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSkgPT0gKFBXUl9DUjRfVkJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2FrZS1VcCBwaW4gcG9sYXJpdHkgbG93IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMiAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93XG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDMgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlMb3dcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQNSAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5TG93CisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUxvdyh1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIFNFVF9CSVQoUFdSLT5DUjQsIFdha2VVcFBpbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBXYWtlLVVwIHBpbiBwb2xhcml0eSBoaWdoIGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDIgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2hcbgorICAqICAgICAgICAgQ1I0ICAgICAgICAgIFdQMyAgICAgICAgICAgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaFxuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfU2V0V2FrZVVwUGluUG9sYXJpdHlIaWdoXG4KKyAgKiAgICAgICAgIENSNCAgICAgICAgICBXUDUgICAgICAgICAgIExMX1BXUl9TZXRXYWtlVXBQaW5Qb2xhcml0eUhpZ2gKKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NldFdha2VVcFBpblBvbGFyaXR5SGlnaCh1aW50MzJfdCBXYWtlVXBQaW4pCit7CisgIENMRUFSX0JJVChQV1ItPkNSNCwgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFdha2UtVXAgcGluIHBvbGFyaXR5IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgV1AxICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1AyICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1AzICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A0ICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvd1xuCisgICogICAgICAgICBDUjQgICAgICAgICAgV1A1ICAgICAgICAgICBMTF9QV1JfSXNXYWtlVXBQaW5Qb2xhcml0eUxvdworICAqIEBwYXJhbSAgV2FrZVVwUGluIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU4zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU40CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1dBS0VVUF9QSU41CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzV2FrZVVwUGluUG9sYXJpdHlMb3codWludDMyX3QgV2FrZVVwUGluKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSNCwgV2FrZVVwUGluKSA9PSAoV2FrZVVwUGluKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMKKyAgKiBAbm90ZSAgIFNvbWUgcGlucyBhcmUgbm90IGNvbmZpZ3VyYWJsZSBmb3IgcHVsbGluZyBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93bgorICAqICAgICAgICAgbW9kZXMuIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGF2YWlsYWJsZSBwaW5zIGFuZCBwb3J0cy4KKyAgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JIICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbFVwCisgICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ICisgICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIFNFVF9CSVQoKigodWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMKKyAgKiBAbm90ZSAgIFNvbWUgcGlucyBhcmUgbm90IGNvbmZpZ3VyYWJsZSBmb3IgcHVsbGluZyBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93bgorICAqICAgICAgICAgbW9kZXMuIFJlZmVyIHRvIHJlZmVyZW5jZSBtYW51YWwgZm9yIGF2YWlsYWJsZSBwaW5zIGFuZCBwb3J0cy4KKyAgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgICogICAgICAgICBQVUNSQiAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkMgICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcFxuCisgICogICAgICAgICBQVUNSRSAgICAgICAgUFUwLTE1ICAgICAgICBMTF9QV1JfRGlzYWJsZUdQSU9QdWxsVXBcbgorICAqICAgICAgICAgUFVDUkggICAgICAgIFBVMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbFVwCisgICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ICisgICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICBDTEVBUl9CSVQoKigodWludDMyX3QgKilHUElPKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLXVwIHN0YXRlIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIFBVQ1JBICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JCICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JDICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JEICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JFICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwXG4KKyAgKiAgICAgICAgIFBVQ1JIICAgICAgICBQVTAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbFVwCisgICogQHBhcmFtICBHUElPIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19DCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ICisgICogQHBhcmFtICBHUElPTnVtYmVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMTUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICByZXR1cm4gKChSRUFEX0JJVCgqKCh1aW50MzJfdCAqKShHUElPKSksIEdQSU9OdW1iZXIpID09IChHUElPTnVtYmVyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICAqIEBub3RlICAgU29tZSBwaW5zIGFyZSBub3QgY29uZmlndXJhYmxlIGZvciBwdWxsaW5nIGluIFN0YW5kYnkgYW5kIFNodXRkb3duCisgICogICAgICAgICBtb2Rlcy4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYXZhaWxhYmxlIHBpbnMgYW5kIHBvcnRzLgorICAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSQiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSRSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfRW5hYmxlR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JIICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9FbmFibGVHUElPUHVsbERvd24KKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0gKKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUdQSU9QdWxsRG93bih1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90IHRlbXAgPSAodWludDMyX3QpKEdQSU8pICsgNFVMOworICBTRVRfQklUKCooKHVpbnQzMl90ICopKHRlbXApKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICAqIEBub3RlICAgU29tZSBwaW5zIGFyZSBub3QgY29uZmlndXJhYmxlIGZvciBwdWxsaW5nIGluIFN0YW5kYnkgYW5kIFNodXRkb3duCisgICogICAgICAgICBtb2Rlcy4gUmVmZXIgdG8gcmVmZXJlbmNlIG1hbnVhbCBmb3IgYXZhaWxhYmxlIHBpbnMgYW5kIHBvcnRzLgorICAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkIgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkMgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkUgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkggICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd24KKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0gKKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcikKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCB0ZW1wID0gKHVpbnQzMl90KShHUElPKSArIDRVTDsKKyAgQ0xFQVJfQklUKCooKHVpbnQzMl90ICopKHRlbXApKSwgR1BJT051bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR1BJTyBwdWxsLWRvd24gc3RhdGUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgUERDUkEgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSQiAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JDICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd25cbgorICAqICAgICAgICAgUERDUkQgICAgICAgIFBEMC0xNSAgICAgICAgTExfUFdSX0lzRW5hYmxlZEdQSU9QdWxsRG93blxuCisgICogICAgICAgICBQRENSRSAgICAgICAgUEQwLTE1ICAgICAgICBMTF9QV1JfSXNFbmFibGVkR1BJT1B1bGxEb3duXG4KKyAgKiAgICAgICAgIFBEQ1JIICAgICAgICBQRDAtMTUgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd24KKyAgKiBAcGFyYW0gIEdQSU8gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19ECisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0gKKyAgKiBAcGFyYW0gIEdQSU9OdW1iZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0dQSU9fQklUXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfR1BJT19CSVRfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9HUElPX0JJVF8xNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcikKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCB0ZW1wID0gKHVpbnQzMl90KShHUElPKSArIDRVTDsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKigodWludDMyX3QgKikodGVtcCkpLCBHUElPTnVtYmVyKSA9PSAoR1BJT051bWJlcikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQk9SIGNvbmZpZ3VyYXRpb24KKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBCT1JIQyAgICAgICAgIExMX1BXUl9TZXRCT1JDb25maWcKKyAgKiBAcGFyYW0gIEJPUkNvbmZpZ3VyYXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfQk9SX1NZU1RFTV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CT1JfU01QU19GT1JDRV9CWVBBU1MKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9TZXRCT1JDb25maWcodWludDMyX3QgQk9SQ29uZmlndXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSNSwgUFdSX0NSNV9CT1JIQywgQk9SQ29uZmlndXJhdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEJPUiBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjUgICAgICAgICAgQk9SSEMgICAgICAgICBMTF9QV1JfR2V0Qk9SQ29uZmlnCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9CT1JfU1lTVEVNX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0JPUl9TTVBTX0ZPUkNFX0JZUEFTUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9HZXRCT1JDb25maWcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfQk9SSEMpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfQ29uZmlndXJhdGlvbl9TTVBTIENvbmZpZ3VyYXRpb24gb2YgU01QUworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFNNUFMgb3BlcmF0aW5nIG1vZGUKKyAgKiBAbm90ZSAgIFdoZW4gU01QUyBzdGVwIGRvd24gY29udmVydGVyIFNNUFMgbW9kZSBpcyBlbmFibGVkLAorICAqICAgICAgICAgaXQgaXMgZ29vZCBwcmFjdGljZSB0byBlbmFibGUgdGhlIEJPUkggdG8gbW9uaXRvciB0aGUgc3VwcGx5OgorICAqICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHRoZSBzdXBwbHkgZHJvcHMgYmVsb3cgdGhlIFNNUFMgc3RlcCBkb3duCisgICogICAgICAgICBjb252ZXJ0ZXIgU01QUyBtb2RlIG9wZXJhdGluZyBzdXBwbHkgbGV2ZWwsIAorICAqICAgICAgICAgc3dpdGNoaW5nIG9uIHRoZSBmbHkgaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2NhbHkKKyAgKiAgICAgICAgIGFuZCBpbnRlcnJ1cHRpb24gaXMgZ2VuZXJhdGVkLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9QV1JfU2V0Qk9SQ29uZmlnKCkuCisgICogQG5vdGUgICBPY2N1cmVuY2Ugb2YgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGZvcmNlZCBpbiBieXBhc3MgbW9kZQorICAqICAgICAgICAgY2FuIGJlIG1vbml0b3JlZCBieSBmbGFnIGFuZCBpbnRlcnJ1cHRpb24uCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMKKyAgKiAgICAgICAgIEByZWYgTExfUFdSX0lzQWN0aXZlRmxhZ19TTVBTRkIoKSwgQHJlZiBMTF9QV1JfQ2xlYXJGbGFnX1NNUFNGQigpLAorICAqICAgICAgICAgQHJlZiBMTF9QV1JfRW5hYmxlSVRfQk9SSF9TTVBTRkIoKS4KKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBTTVBTRU4gICAgICAgIExMX1BXUl9TTVBTX1NldE1vZGUgXG4KKyAgKiAgICAgICAgIENSNSAgICAgICAgICBTTVBTQkVOICAgICAgIExMX1BXUl9TTVBTX1NldE1vZGUKKyAgKiBAcGFyYW0gIE9wZXJhdGluZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19CWVBBU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEVQX0RPV04gKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBTTVBTIG9wZXJhdGluZyBtb2RlIHN0ZXAgZG93biBvciBvcGVuIGRlcGVuZHMgb24gc3lzdGVtIGxvdy1wb3dlciBtb2RlOgorICAqICAgICAgICAgICAgICAtIHN0ZXAgZG93biBtb2RlIGlmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBydW4sIExQIHJ1biBvciBzdG9wMCwKKyAgKiAgICAgICAgICAgICAgLSBvcGVuIG1vZGUgaWYgc3lzdGVtIGxvdyBwb3dlciBtb2RlIGlzIHN0b3AxLCBzdG9wMiwgc3RhbmRieSBvciBzaHV0ZG93bgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NNUFNfU2V0TW9kZSh1aW50MzJfdCBPcGVyYXRpbmdNb2RlKQoreworICAvKiBOb3RlOiBPcGVyYXRpb24gb24gYml0cyBwZXJmb3JtZWQgdG8ga2VlcCBjb21wYXRpYmlsaXR5IG9mIGxpdGVyYWxzICAgICAgKi8KKyAgLyogICAgICAgZm9yIGFsbCBTTVBTIG9wZXJhdGluZyBtb2RlIGZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICJMTF9QV1JfU01QU19TZXRNb2RlKCkiLCAiTExfUFdSX1NNUFNfR2V0TW9kZSgpIiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBhbmQgIkxMX1BXUl9TTVBTX0dldEVmZmVjdGl2ZU1vZGUoKSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSNSwgUFdSX0NSNV9TTVBTRU4sIChPcGVyYXRpbmdNb2RlICYgUFdSX1NSMl9TTVBTRikgPDwgKFBXUl9DUjVfU01QU0VOX1BvcyAtIFBXUl9TUjJfU01QU0ZfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNNUFMgb3BlcmF0aW5nIG1vZGUKKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBTTVBTRU4gICAgICAgIExMX1BXUl9TTVBTX0dldE1vZGUgXG4KKyAgKiAgICAgICAgIENSNSAgICAgICAgICBTTVBTQkVOICAgICAgIExMX1BXUl9TTVBTX0dldE1vZGUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfQllQQVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfU1RFUF9ET1dOICgxKQorICAqCisgICogICAgICAgICAoMSkgU01QUyBvcGVyYXRpbmcgbW9kZSBzdGVwIGRvd24gb3Igb3BlbiBkZXBlbmRzIG9uIHN5c3RlbSBsb3ctcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgICAgLSBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcDAsCisgICogICAgICAgICAgICAgIC0gb3BlbiBtb2RlIGlmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBzdG9wMSwgc3RvcDIsIHN0YW5kYnkgb3Igc2h1dGRvd24KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfU01QU19HZXRNb2RlKHZvaWQpCit7CisgIC8qIE5vdGU6IE9wZXJhdGlvbiBvbiBiaXRzIHBlcmZvcm1lZCB0byBrZWVwIGNvbXBhdGliaWxpdHkgb2YgbGl0ZXJhbHMgICAgICAqLworICAvKiAgICAgICBmb3IgYWxsIFNNUFMgb3BlcmF0aW5nIG1vZGUgZnVuY3Rpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIkxMX1BXUl9TTVBTX1NldE1vZGUoKSIsICJMTF9QV1JfU01QU19HZXRNb2RlKCkiICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGFuZCAiTExfUFdSX1NNUFNfR2V0RWZmZWN0aXZlTW9kZSgpIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdpc3RlciB1aW50MzJfdCBPcGVyYXRpbmdNb2RlID0gKFJFQURfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1NNUFNFTikgPj4gKFBXUl9DUjVfU01QU0VOX1BvcyAtIFBXUl9TUjJfU01QU0ZfUG9zKSk7CisgIAorICBPcGVyYXRpbmdNb2RlID0gKE9wZXJhdGluZ01vZGUgfCAoKH5PcGVyYXRpbmdNb2RlID4+IDFVKSAmIFBXUl9TUjJfU01QU0JGKSk7CisgIAorICByZXR1cm4gT3BlcmF0aW5nTW9kZTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU01QUyBlZmZlY3RpdmUgb3BlcmF0aW5nIG1vZGUKKyAgKiBAbm90ZSAgIFNNUFMgb3BlcmF0aW5nIG1vZGUgY2FuIGJlIGNoYW5nZWQgYnkgaGFyZHdhcmUsIHRoZXJlZm9yZQorICAqICAgICAgICAgcmVxdWVzdGVkIG9wZXJhdGluZyBtb2RlIGNhbiBkaWZmZXIgZnJvbSBlZmZlY3RpdmUgbG93IHBvd2VyIG1vZGUuCisgICogICAgICAgICAtIGRlcGVuZGVuY3kgb24gc3lzdGVtIGxvdy1wb3dlciBtb2RlOgorICAqICAgICAgICAgICAtIHN0ZXAgZG93biBtb2RlIGlmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBydW4sIExQIHJ1biBvciBzdG9wMCwKKyAgKiAgICAgICAgICAgLSBvcGVuIG1vZGUgaWYgc3lzdGVtIGxvdyBwb3dlciBtb2RlIGlzIHN0b3AxLCBzdG9wMiwgc3RhbmRieSBvciBzaHV0ZG93bgorICAqICAgICAgICAgLSBkZXBlbmRlbmN5IG9uIEJPUiBsZXZlbDoKKyAgKiAgICAgICAgICAgLSBieXBhc3MgbW9kZSBpZiBzdXBwbHkgdm9sdGFnZSBkcm9wcyBiZWxvdyBCT1IgbGV2ZWwKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb25zIGNoZWNrIGZsYWdzIG9mIFNNUFMgb3BlcmF0aW5nIG1vZGVzIHN0ZXAgZG93bgorICAqICAgICAgICAgYW5kIGJ5cGFzcy4gSWYgdGhlIFNNUFMgaXMgbm90IGFtb25nIHRoZXNlIDIgb3BlcmF0aW5nIG1vZGVzLAorICAqICAgICAgICAgdGhlbiBpdCBjYW4gYmUgaW4gbW9kZSBvZmYgb3Igb3Blbi4KKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBTTVBTRiAgICAgICAgIExMX1BXUl9TTVBTX0dldEVmZmVjdGl2ZU1vZGUgXG4KKyAgKiAgICAgICAgIFNSMiAgICAgICAgICBTTVBTQkYgICAgICAgIExMX1BXUl9TTVBTX0dldEVmZmVjdGl2ZU1vZGUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfQllQQVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfU1RFUF9ET1dOICgxKQorICAqCisgICogICAgICAgICAoMSkgU01QUyBvcGVyYXRpbmcgbW9kZSBzdGVwIGRvd24gb3Igb3BlbiBkZXBlbmRzIG9uIHN5c3RlbSBsb3ctcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgICAgLSBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcDAsCisgICogICAgICAgICAgICAgIC0gb3BlbiBtb2RlIGlmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBzdG9wMSwgc3RvcDIsIHN0YW5kYnkgb3Igc2h1dGRvd24KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfU01QU19HZXRFZmZlY3RpdmVNb2RlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+U1IyLCAoUFdSX1NSMl9TTVBTRiB8IFBXUl9TUjJfU01QU0JGKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBlbmFibGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIHRoZSBTTVBTLAorICAqICAgICAgICAgZm9yIGdlbmVyYWwgdXNhZ2Ugb2YgdGhlIFNNUFMgdGhlIGZ1bmN0aW9uCisgICogICAgICAgICBAcmVmIExMX1BXUl9TTVBTX1NldE1vZGUoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAqIEBybXRvbGwgQ1I1ICAgICAgICAgIFNNUFNFTiAgICAgICAgTExfUFdSX1NNUFNfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU01QU19FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9TTVBTRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBlbmFibGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIHRoZSBTTVBTLAorICAqICAgICAgICAgZm9yIGdlbmVyYWwgdXNhZ2Ugb2YgdGhlIFNNUFMgdGhlIGZ1bmN0aW9uCisgICogICAgICAgICBAcmVmIExMX1BXUl9TTVBTX1NldE1vZGUoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAqIEBybXRvbGwgQ1I1ICAgICAgICAgIFNNUFNFTiAgICAgICAgTExfUFdSX1NNUFNfRGlzYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NNUFNfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjUsIFBXUl9DUjVfU01QU0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBTTVBTRU4gICAgICAgIExMX1BXUl9TTVBTX0lzRW5hYmxlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9TTVBTX0lzRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9TTVBTRU4pID09IChQV1JfQ1I1X1NNUFNFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU01QUyBzdGVwIGRvd24gY29udmVydGVyIHN1cHBseSBzdGFydHVwIGN1cnJlbnQgc2VsZWN0aW9uCisgICogQHJtdG9sbCBDUjUgICAgICAgICAgU01QU1NDICAgICAgICBMTF9QV1JfU01QU19TZXRTdGFydHVwQ3VycmVudAorICAqIEBwYXJhbSAgU3RhcnR1cEN1cnJlbnQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfODBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xMDBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xMjBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xNDBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xNjBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8xODBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8yMDBNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX1NUQVJUVVBfQ1VSUkVOVF8yMjBNQQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX1NNUFNfU2V0U3RhcnR1cEN1cnJlbnQodWludDMyX3QgU3RhcnR1cEN1cnJlbnQpCit7CisgIE1PRElGWV9SRUcoUFdSLT5DUjUsIFBXUl9DUjVfU01QU1NDLCBTdGFydHVwQ3VycmVudCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBzdXBwbHkgc3RhcnR1cCBjdXJyZW50IHNlbGVjdGlvbgorICAqIEBybXRvbGwgQ1I1ICAgICAgICAgIFNNUFNTQyAgICAgICAgTExfUFdSX1NNUFNfR2V0U3RhcnR1cEN1cnJlbnQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfU1RBUlRVUF9DVVJSRU5UXzgwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTAwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTIwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTQwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTYwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMTgwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMjAwTUEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19TVEFSVFVQX0NVUlJFTlRfMjIwTUEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfU01QU19HZXRTdGFydHVwQ3VycmVudCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkNSNSwgUFdSX0NSNV9TTVBTU0MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgU01QUyBzdGVwIGRvd24gY29udmVydGVyIG91dHB1dCB2b2x0YWdlIHNjYWxpbmcKKyAgKiBAbm90ZSAgIFNNUFMgb3V0cHV0IHZvbHRhZ2UgaXMgY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uLAorICAqICAgICAgICAgY2FsaWJyYXRpb24gcGFyYW1ldGVycyBhcmUgYXBwbGllZCB0byB0aGUgdm9sdGFnZSBsZXZlbCBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIHRvIHJlYWNoIHRoZSByZXF1ZXN0ZWQgdm9sdGFnZSB2YWx1ZS4KKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBTTVBTVk9TICAgICAgIExMX1BXUl9TTVBTX1NldE91dHB1dFZvbHRhZ2VMZXZlbAorICAqIEBwYXJhbSAgT3V0cHV0Vm9sdGFnZUxldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVYyMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVYzNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjQ1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY1MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjYwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY2NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjc1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY4MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWODUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjkwCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfU01QU19TZXRPdXRwdXRWb2x0YWdlTGV2ZWwodWludDMyX3QgT3V0cHV0Vm9sdGFnZUxldmVsKQoreworICByZWdpc3RlciBfX0lPIGNvbnN0IHVpbnQzMl90IE91dHB1dFZvbHRhZ2VMZXZlbF9jYWxpYnJhdGlvbiA9ICgoKCpTTVBTX1ZPTFRBR0VfQ0FMX0FERFIpICYgU01QU19WT0xUQUdFX0NBTCkgPj4gU01QU19WT0xUQUdFX0NBTF9QT1MpOyAgLyogU01QUyBvdXRwdXQgdm9sdGFnZSBsZXZlbCBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKi8KKyAgcmVnaXN0ZXIgaW50MzJfdCBUcmltbWluZ1N0ZXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmltbWluZyBzdGVwcyBiZXR3ZWVuIHRoZW9yaWNhbCBvdXRwdXQgdm9sdGFnZSBhbmQgY2FsaWJyYXRlZCBvdXRwdXQgdm9sdGFnZSAqLworICByZWdpc3RlciBpbnQzMl90IE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQ7ICAgICAgICAgICAgICAgICAgIC8qIFNNUFMgb3V0cHV0IHZvbHRhZ2UgbGV2ZWwgYWZ0ZXIgY2FsaWJyYXRpb246IHRyaW1taW5nIHZhbHVlIGFkZGVkIHRvIHJlcXVpcmVkIGxldmVsICovCisKKyAgaWYoT3V0cHV0Vm9sdGFnZUxldmVsX2NhbGlicmF0aW9uID09IDBVTCkKKyAgeworICAgIC8qIERldmljZSB3aXRoIFNNUFMgb3V0cHV0IHZvbHRhZ2Ugbm90IGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbjogQXBwbHkgb3V0cHV0IHZvbHRhZ2UgdmFsdWUgZGlyZWN0bHkgKi8KKyAgICAKKyAgICAvKiBVcGRhdGUgcmVnaXN0ZXIgKi8KKyAgICBNT0RJRllfUkVHKFBXUi0+Q1I1LCBQV1JfQ1I1X1NNUFNWT1MsIE91dHB1dFZvbHRhZ2VMZXZlbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGV2aWNlIHdpdGggU01QUyBvdXRwdXQgdm9sdGFnZSBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb246IEFwcGx5IG91dHB1dCB2b2x0YWdlIHZhbHVlIGFmdGVyIGNvcnJlY3Rpb24gYnkgY2FsaWJyYXRpb24gdmFsdWUgKi8KKworICAgIFRyaW1taW5nU3RlcHMgPSAoKGludDMyX3QpT3V0cHV0Vm9sdGFnZUxldmVsX2NhbGlicmF0aW9uIC0gKGludDMyX3QpKExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTAgPj4gUFdSX0NSNV9TTVBTVk9TX1BvcykpOworICAgIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPSAoKGludDMyX3QpKCh1aW50MzJfdCkoT3V0cHV0Vm9sdGFnZUxldmVsID4+IFBXUl9DUjVfU01QU1ZPU19Qb3MpKSArIChpbnQzMl90KVRyaW1taW5nU3RlcHMpOworCisgICAgLyogQ2xhbXAgdmFsdWUgdG8gdm9sdGFnZSB0cmltbWluZyBiaXRmaWVsZCByYW5nZSAqLworICAgIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPCAwKQorICAgIHsKKyAgICAgIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPSAwOworICAgIH0KKyAgICBlbHNlIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPiAoaW50MzJfdClQV1JfQ1I1X1NNUFNWT1MpCisgICAgeworICAgICAgT3V0cHV0Vm9sdGFnZUxldmVsVHJpbW1lZCA9IChpbnQzMl90KVBXUl9DUjVfU01QU1ZPUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgcmVnaXN0ZXIgKi8KKyAgICBNT0RJRllfUkVHKFBXUi0+Q1I1LCBQV1JfQ1I1X1NNUFNWT1MsICh1aW50MzJfdClPdXRwdXRWb2x0YWdlTGV2ZWxUcmltbWVkKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgb3V0cHV0IHZvbHRhZ2Ugc2NhbGluZworICAqIEBub3RlICAgU01QUyBvdXRwdXQgdm9sdGFnZSBpcyBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24sCisgICogICAgICAgICBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBhcHBsaWVkIHRvIHRoZSB2b2x0YWdlIGxldmVsIHBhcmFtZXRlcgorICAqICAgICAgICAgdG8gcmV0dXJuIHRoZSBlZmZlY3RpdmUgdm9sdGFnZSB2YWx1ZS4KKyAgKiBAcm10b2xsIENSNSAgICAgICAgICBTTVBTVk9TICAgICAgIExMX1BXUl9TTVBTX0dldE91dHB1dFZvbHRhZ2VMZXZlbAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVYyNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY0MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY1NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjY1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY3MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjgwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX1NNUFNfT1VUUFVUX1ZPTFRBR0VfMVY4NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWOTAKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfU01QU19HZXRPdXRwdXRWb2x0YWdlTGV2ZWwodm9pZCkKK3sKKyAgcmVnaXN0ZXIgX19JTyBjb25zdCB1aW50MzJfdCBPdXRwdXRWb2x0YWdlTGV2ZWxfY2FsaWJyYXRpb24gPSAoKCgqU01QU19WT0xUQUdFX0NBTF9BRERSKSAmIFNNUFNfVk9MVEFHRV9DQUwpID4+IFNNUFNfVk9MVEFHRV9DQUxfUE9TKTsgIC8qIFNNUFMgb3V0cHV0IHZvbHRhZ2UgbGV2ZWwgY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uICovCisgIHJlZ2lzdGVyIGludDMyX3QgVHJpbW1pbmdTdGVwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJpbW1pbmcgc3RlcHMgYmV0d2VlbiB0aGVvcmljYWwgb3V0cHV0IHZvbHRhZ2UgYW5kIGNhbGlicmF0ZWQgb3V0cHV0IHZvbHRhZ2UgKi8KKyAgcmVnaXN0ZXIgaW50MzJfdCBPdXRwdXRWb2x0YWdlTGV2ZWxUcmltbWVkOyAgICAgICAgICAgICAgICAgICAvKiBTTVBTIG91dHB1dCB2b2x0YWdlIGxldmVsIGFmdGVyIGNhbGlicmF0aW9uOiB0cmltbWluZyB2YWx1ZSBhZGRlZCB0byByZXF1aXJlZCBsZXZlbCAqLworCisgIGlmKE91dHB1dFZvbHRhZ2VMZXZlbF9jYWxpYnJhdGlvbiA9PSAwVUwpCisgIHsKKyAgICAvKiBEZXZpY2Ugd2l0aCBTTVBTIG91dHB1dCB2b2x0YWdlIG5vdCBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb246IFJldHVybiBvdXRwdXQgdm9sdGFnZSB2YWx1ZSBkaXJlY3RseSAqLworICAgIAorICAgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1NNUFNWT1MpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEZXZpY2Ugd2l0aCBTTVBTIG91dHB1dCB2b2x0YWdlIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbjogUmV0dXJuIG91dHB1dCB2b2x0YWdlIHZhbHVlIGFmdGVyIGNvcnJlY3Rpb24gYnkgY2FsaWJyYXRpb24gdmFsdWUgKi8KKworICAgIFRyaW1taW5nU3RlcHMgPSAoKGludDMyX3QpT3V0cHV0Vm9sdGFnZUxldmVsX2NhbGlicmF0aW9uIC0gKGludDMyX3QpKExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTAgPj4gUFdSX0NSNV9TTVBTVk9TX1BvcykpOyAvKiBUcmltbWluZyBzdGVwcyBiZXR3ZWVuIHRoZW9yaWNhbCBvdXRwdXQgdm9sdGFnZSBhbmQgY2FsaWJyYXRlZCBvdXRwdXQgdm9sdGFnZSAqLworCisgICAgT3V0cHV0Vm9sdGFnZUxldmVsVHJpbW1lZCA9ICgoaW50MzJfdCkoKHVpbnQzMl90KVJFQURfQklUKFBXUi0+Q1I1LCBQV1JfQ1I1X1NNUFNWT1MpKSAtIFRyaW1taW5nU3RlcHMpOworCisgICAgLyogQ2xhbXAgdmFsdWUgdG8gdm9sdGFnZSByYW5nZSAqLworICAgIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPCAwKQorICAgIHsKKyAgICAgIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPSAoaW50MzJfdClMTF9QV1JfU01QU19PVVRQVVRfVk9MVEFHRV8xVjIwOworICAgIH0KKyAgICBlbHNlIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPiAoaW50MzJfdClQV1JfQ1I1X1NNUFNWT1MpCisgICAgeworICAgICAgT3V0cHV0Vm9sdGFnZUxldmVsVHJpbW1lZCA9IChpbnQzMl90KUxMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWOTA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgfQorCisgICAgcmV0dXJuICh1aW50MzJfdClPdXRwdXRWb2x0YWdlTGV2ZWxUcmltbWVkOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb25fTXVsdGljb3JlIENvbmZpZ3VyYXRpb24gb2YgbXVsdGljb3JlLCBpbnRlbmRlZCB0byBiZSBleGVjdXRlZCBieSBDUFUxCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBCb290IENQVTIgYWZ0ZXIgcmVzZXQgb3Igd2FrZXVwIGZyb20gc3RvcCBvciBzdGFuZGJ5IG1vZGVzCisgICogQHJtdG9sbCBDUjQgICAgICAgICAgQzJCT09UICAgICAgICBMTF9QV1JfRW5hYmxlQm9vdEMyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRW5hYmxlQm9vdEMyKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfQzJCT09UKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIGJpdCB0byBib290IENQVTIgYWZ0ZXIgcmVzZXQgb3Igd2FrZXVwIGZyb20gc3RvcCBvciBzdGFuZGJ5CisgICogICAgICAgICBtb2RlcworICAqIEBybXRvbGwgQ1I0ICAgICAgICAgIEMyQk9PVCAgICAgICAgTExfUFdSX0Rpc2FibGVCb290QzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlQm9vdEMyKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSNCwgUFdSX0NSNF9DMkJPT1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGJpdCB0byBib290IENQVTIgYWZ0ZXIgcmVzZXQgb3Igd2FrZXVwIGZyb20gc3RvcCBvciBzdGFuZGJ5CisgICogICAgICAgICBtb2RlcyBpcyBzZXQKKyAgKiBAcm10b2xsIENSNCAgICAgICAgICBDMkJPT1QgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRCb290QzIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRCb290QzIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjQsIFBXUl9DUjRfQzJCT09UKSA9PSAoUFdSX0NSNF9DMkJPT1QpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0NvbmZpZ3VyYXRpb25fQ1BVMiBDb25maWd1cmF0aW9uIG9mIENQVTIsIGludGVuZGVkIHRvIGJlIGV4ZWN1dGVkIGJ5IENQVTIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBMb3ctUG93ZXIgbW9kZSBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIExQTVMgICAgICAgICAgTExfQzJfUFdSX1NldFBvd2VyTW9kZQorICAqIEBwYXJhbSAgTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9QV1JfU2V0UG93ZXJNb2RlKHVpbnQzMl90IExvd1Bvd2VyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkMyQ1IxLCBQV1JfQzJDUjFfTFBNUywgTG93UG93ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTG93LVBvd2VyIG1vZGUgZm9yIENQVTIKKyAgKiBAcm10b2xsIEMyQ1IxICAgICAgICBMUE1TICAgICAgICAgIExMX0MyX1BXUl9HZXRQb3dlck1vZGUKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RPUDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfTU9ERV9TVE9QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NUT1AyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX01PREVfU1RBTkRCWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9NT0RFX1NIVVRET1dOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfUFdSX0dldFBvd2VyTW9kZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkMyQ1IxLCBQV1JfQzJDUjFfTFBNUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBmbGFzaCBwb3dlci1kb3duIG1vZGUgZHVyaW5nIGxvdy1wb3dlciBydW4gbW9kZSBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIEZQRFIgICAgICAgICAgTExfQzJfUFdSX1NldEZsYXNoUG93ZXJNb2RlTFBSdW4KKyAgKiBAcGFyYW0gIEZsYXNoTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX0xQUlVOX01PREVfSURMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9GTEFTSF9MUFJVTl9NT0RFX1BPV0VSX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1BXUl9TZXRGbGFzaFBvd2VyTW9kZUxQUnVuKHVpbnQzMl90IEZsYXNoTG93UG93ZXJNb2RlKQoreworICAvKiBVbmxvY2sgYml0IEZQRFIgKi8KKyAgV1JJVEVfUkVHKFBXUi0+QzJDUjEsIDB4MDAwMEMxQjBVKTsKKyAgCisgIC8qIFVwZGF0ZSBiaXQgRlBEUiAqLworICBNT0RJRllfUkVHKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV9GUERSLCBGbGFzaExvd1Bvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgbG93LXBvd2VyIHJ1biBtb2RlIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMSAgICAgICAgRlBEUiAgICAgICAgICBMTF9DMl9QV1JfR2V0Rmxhc2hQb3dlck1vZGVMUFJ1bgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfRkxBU0hfTFBSVU5fTU9ERV9JRExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX0xQUlVOX01PREVfUE9XRVJfRE9XTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX1BXUl9HZXRGbGFzaFBvd2VyTW9kZUxQUnVuKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV9GUERSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgc2xlZXAgbW9kZSBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIEZQRFMgICAgICAgICAgTExfQzJfUFdSX1NldEZsYXNoUG93ZXJNb2RlU2xlZXAKKyAgKiBAcGFyYW0gIEZsYXNoTG93UG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX1NMRUVQX01PREVfSURMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9GTEFTSF9TTEVFUF9NT0RFX1BPV0VSX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1BXUl9TZXRGbGFzaFBvd2VyTW9kZVNsZWVwKHVpbnQzMl90IEZsYXNoTG93UG93ZXJNb2RlKQoreworICBNT0RJRllfUkVHKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV9GUERTLCBGbGFzaExvd1Bvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZsYXNoIHBvd2VyLWRvd24gbW9kZSBkdXJpbmcgc2xlZXAgbW9kZSBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIEZQRFMgICAgICAgICAgTExfQzJfUFdSX0dldEZsYXNoUG93ZXJNb2RlU2xlZXAKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUFdSX0ZMQVNIX1NMRUVQX01PREVfSURMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9GTEFTSF9TTEVFUF9NT0RFX1BPV0VSX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9QV1JfR2V0Rmxhc2hQb3dlck1vZGVTbGVlcCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPkMyQ1IxLCBQV1JfQzJDUjFfRlBEUykpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEludGVybmFsIFdha2UtdXAgbGluZSBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEVJV1VMICAgICAgICAgTExfQzJfUFdSX0VuYWJsZUludGVybldVCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9QV1JfRW5hYmxlSW50ZXJuV1Uodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkMyQ1IzLCBQV1JfQzJDUjNfRUlXVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSW50ZXJuYWwgV2FrZS11cCBsaW5lIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgRUlXVUwgICAgICAgICBMTF9DMl9QV1JfRGlzYWJsZUludGVybldVCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9QV1JfRGlzYWJsZUludGVybldVKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkMyQ1IzLCBQV1JfQzJDUjNfRUlXVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEludGVybmFsIFdha2UtdXAgbGluZSBpcyBlbmFibGVkIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgRUlXVUwgICAgICAgICBMTF9DMl9QV1JfSXNFbmFibGVkSW50ZXJuV1UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9QV1JfSXNFbmFibGVkSW50ZXJuV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0VJV1VMKSA9PSAoUFdSX0MyQ1IzX0VJV1VMKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEVXVVAxICAgICAgICAgTExfQzJfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDMkNSMyAgICAgICAgRVdVUDIgICAgICAgICBMTF9DMl9QV1JfRW5hYmxlV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIEMyQ1IzICAgICAgICBFV1VQMyAgICAgICAgIExMX0MyX1BXUl9FbmFibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVA0ICAgICAgICAgTExfQzJfUFdSX0VuYWJsZVdha2VVcFBpblxuCisgICogICAgICAgICBDMkNSMyAgICAgICAgRVdVUDUgICAgICAgICBMTF9DMl9QV1JfRW5hYmxlV2FrZVVwUGluCisgICogQHBhcmFtICBXYWtlVXBQaW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9QV1JfV0FLRVVQX1BJTjUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1BXUl9FbmFibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICBTRVRfQklUKFBXUi0+QzJDUjMsIFdha2VVcFBpbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eQorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEVXVVAxICAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVAyICAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVAzICAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVA0ICAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVA1ICAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUFdSX0Rpc2FibGVXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICBDTEVBUl9CSVQoUFdSLT5DMkNSMywgV2FrZVVwUGluKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgRVdVUDEgICAgICAgICBMTF9DMl9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIEMyQ1IzICAgICAgICBFV1VQMiAgICAgICAgIExMX0MyX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW5cbgorICAqICAgICAgICAgQzJDUjMgICAgICAgIEVXVVAzICAgICAgICAgTExfQzJfUFdSX0lzRW5hYmxlZFdha2VVcFBpblxuCisgICogICAgICAgICBDMkNSMyAgICAgICAgRVdVUDQgICAgICAgICBMTF9DMl9QV1JfSXNFbmFibGVkV2FrZVVwUGluXG4KKyAgKiAgICAgICAgIEMyQ1IzICAgICAgICBFV1VQNSAgICAgICAgIExMX0MyX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4KKyAgKiBAcGFyYW0gIFdha2VVcFBpbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElOMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1BXUl9XQUtFVVBfUElONQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX1BXUl9Jc0VuYWJsZWRXYWtlVXBQaW4odWludDMyX3QgV2FrZVVwUGluKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkMyQ1IzLCBXYWtlVXBQaW4pID09IChXYWtlVXBQaW4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgQVBDICAgICAgICAgICBMTF9DMl9QV1JfRW5hYmxlUFVQRENmZworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUFdSX0VuYWJsZVBVUERDZmcodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkMyQ1IzLCBQV1JfQzJDUjNfQVBDKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgQVBDICAgICAgICAgICBMTF9DMl9QV1JfRGlzYWJsZVBVUERDZmcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1BXUl9EaXNhYmxlUFVQRENmZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0FQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb24gaXMgZW5hYmxlZCBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEFQQyAgICAgICAgICAgTExfQzJfUFdSX0lzRW5hYmxlZFBVUERDZmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9QV1JfSXNFbmFibGVkUFVQRENmZyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkMyQ1IzLCBQV1JfQzJDUjNfQVBDKSA9PSAoUFdSX0MyQ1IzX0FQQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfQ29uZmlndXJhdGlvbl9DUFUyX1JhZGlvIENvbmZpZ3VyYXRpb24gb2YgcmFkaW8gKEJMRSBvciA4MDIuMTUuNCkgb2YgQ1BVMiwgaW50ZW5kZWQgdG8gYmUgZXhlY3V0ZWQgYnkgQ1BVMgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV2FrZXVwIEJMRSBjb250cm9sbGVyIGZyb20gaXRzIHNsZWVwIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgd2hlbiBCTEUgY29udHJvbGxlcgorICAqICAgICAgICAgZXhpdCBpdHMgc2xlZXAgbW9kZS4KKyAgKiBAcm10b2xsIEMyQ1IxICAgICAgICBCTEVFV0tVUCAgICAgIExMX0MyX1BXUl9XYWtlVXBfQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9QV1JfV2FrZVVwX0JMRSh2b2lkKQoreworICBTRVRfQklUKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV9CTEVFV0tVUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEJMRSBjb250cm9sbGVyIGlzIHdva2VuLXVwIGZyb20KKyAgKiAgICAgICAgIGxvdy1wb3dlciBtb2RlLgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIEJMRUVXS1VQICAgICAgTExfQzJfUFdSX0lzV29rZW5VcF9CTEUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKSAodmFsdWUgIjAiOiBCTEUgaXMgbm90IHdva2VuLXVwKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX1BXUl9Jc1dva2VuVXBfQkxFKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV9CTEVFV0tVUCkgPT0gKFBXUl9DMkNSMV9CTEVFV0tVUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBXYWtldXAgODAyLjE1LjQgY29udHJvbGxlciBmcm9tIGl0cyBzbGVlcCBtb2RlCisgICogQG5vdGUgICBUaGlzIGJpdCBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHdoZW4gODAyLjE1LjQgY29udHJvbGxlcgorICAqICAgICAgICAgZXhpdCBpdHMgc2xlZXAgbW9kZS4KKyAgKiBAcm10b2xsIEMyQ1IxICAgICAgICA4MDJFV0tVUCAgICAgIExMX0MyX1BXUl9XYWtlVXBfODAyXzE1XzQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1BXUl9XYWtlVXBfODAyXzE1XzQodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkMyQ1IxLCBQV1JfQzJDUjFfODAyRVdLVVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSA4MDIuMTUuNCBjb250cm9sbGVyIGlzIHdva2VuLXVwIGZyb20KKyAgKiAgICAgICAgIGxvdy1wb3dlciBtb2RlLgorICAqIEBybXRvbGwgQzJDUjEgICAgICAgIDgwMkVXS1VQICAgICAgTExfQzJfUFdSX0lzV29rZW5VcF84MDJfMTVfNAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApICh2YWx1ZSAiMCI6IDgwMi4xNS40IGlzIG5vdCB3b2tlbi11cCkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9QV1JfSXNXb2tlblVwXzgwMl8xNV80KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+QzJDUjEsIFBXUl9DMkNSMV84MDJFV0tVUCkgPT0gKFBXUl9DMkNSMV84MDJFV0tVUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IEludGVybmFsIFdha2UtdXAgbGluZSBGbGFnCisgICogQHJtdG9sbCBTUjEgICAgICAgICAgV1VGSSAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0ludGVybldVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19JbnRlcm5XVSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUZJKSA9PSAoUFdSX1NSMV9XVUZJKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgNQorICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjUgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUY1KSA9PSAoUFdSX1NSMV9XVUY1KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgNAorICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjQgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVNCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUY0KSA9PSAoUFdSX1NSMV9XVUY0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgMworICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjMgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUYzKSA9PSAoUFdSX1NSMV9XVUYzKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgMgorICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjIgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTIKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUYyKSA9PSAoUFdSX1NSMV9XVUYyKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtlLXVwIEZsYWcgMQorICAqIEBybXRvbGwgU1IxICAgICAgICAgIFdVRjEgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19XVTEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX1dVMSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9XVUYxKSA9PSAoUFdSX1NSMV9XVUYxKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZ3MKKyAgKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGICAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1Uodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyA1CisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjUgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTUodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUY1KTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgNAorICAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUY0ICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1U0KHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgV2FrZS11cCBGbGFnIDMKKyAgKiBAcm10b2xsIFNDUiAgICAgICAgICBDV1VGMyAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfV1UzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX1dVMyh2b2lkKQoreworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQ1dVRjMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFdha2UtdXAgRmxhZyAyCisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgQ1dVRjIgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX1dVMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19XVTIodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NXVUYyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlLXVwIEZsYWcgMQorICAqIEBybXRvbGwgU0NSICAgICAgICAgIENXVUYxICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19XVTEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfV1UxKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DV1VGMSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIFZEREEgdm9sdGFnZSBpcyBiZWxvdyBvciBhYm92ZSBQVk0zIHRocmVzaG9sZAorICAqIEBybXRvbGwgU1IyICAgICAgICAgIFBWTU8zICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PMworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUFZNTzMpID09IChQV1JfU1IyX1BWTU8zKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBWRERVU0Igdm9sdGFnZSBpcyBiZWxvdyBvciBhYm92ZSBQVk0xIHRocmVzaG9sZAorICAqIEBybXRvbGwgU1IyICAgICAgICAgIFBWTU8xICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19QVk1PMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZNTzEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfUFZNTzEpID09IChQV1JfU1IyX1BWTU8xKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgVkREIHZvbHRhZ2UgaXMgYmVsb3cgb3IgYWJvdmUgdGhlIHNlbGVjdGVkIFBWRCB0aHJlc2hvbGQKKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBQVkRPICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUFZETyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMiwgUFdSX1NSMl9QVkRPKSA9PSAoUFdSX1NSMl9QVkRPKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgdGhlIHJlZ3VsYXRvciBpcyByZWFkeSBpbiB0aGUgc2VsZWN0ZWQgdm9sdGFnZSByYW5nZSBvciBpZiBpdHMgb3V0cHV0IHZvbHRhZ2UgaXMgc3RpbGwgY2hhbmdpbmcgdG8gdGhlIHJlcXVpcmVkIHZvbHRhZ2UgbGV2ZWwKKyAgKiBAcm10b2xsIFNSMiAgICAgICAgICBWT1NGICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfVk9TCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19WT1Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikgPT0gKFBXUl9TUjJfVk9TRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkgaW4gbWFpbiBtb2RlIG9yIGlzIGluIGxvdy1wb3dlciBtb2RlCisgICogQG5vdGUgICBUYWtlIGNhcmUsIHJldHVybiB2YWx1ZSAiMCIgbWVhbnMgdGhlIHJlZ3VsYXRvciBpcyByZWFkeS4gUmV0dXJuIHZhbHVlICIxIiBtZWFucyB0aGUgb3V0cHV0IHZvbHRhZ2UgcmFuZ2UgaXMgc3RpbGwgY2hhbmdpbmcuCisgICogQHJtdG9sbCBTUjIgICAgICAgICAgUkVHTFBGICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1JFR0xQRgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBGKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQRikgPT0gKFBXUl9TUjJfUkVHTFBGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSBsb3ctcG93ZXIgcmVndWxhdG9yIGlzIHJlYWR5CisgICogQHJtdG9sbCBTUjIgICAgICAgICAgUkVHTFBTICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1JFR0xQUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfUkVHTFBTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQUykgPT0gKFBXUl9TUjJfUkVHTFBTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBCT1JIIGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBTUjEgICAgICAgICAgQk9SSEYgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0JPUkgKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0JPUkgodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfQk9SSEYpID09IChQV1JfU1IxX0JPUkhGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEJPUkggaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIFNDUiAgICAgICAgICBDQk9SSEYgICAgICAgIExMX1BXUl9DbGVhckZsYWdfQk9SSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19CT1JIKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DQk9SSEYpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FRl9GTEFHX01hbmFnZW1lbnRfU01QUyBGTEFHIG1hbmFnZW1lbnQgZm9yIFNNUFMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgZm9yY2VkIGluIGJ5cGFzcyBtb2RlIGludGVycnVwdCBmbGFnCisgICogQG5vdGUgICBUbyBhY3RpdmF0ZSBmbGFnIG9mIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBmb3JjZWQgaW4gYnlwYXNzIG1vZGUKKyAgKiAgICAgICAgIGJ5IEJPUkgsIEJPUiBtdXN0IGJlIHByZWxpbWluYXJpbHkgY29uZmlndXJlZCB0byBjb250cm9sIFNNUFMKKyAgKiAgICAgICAgIG9wZXJhdGluZyBtb2RlLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9QV1JfU2V0Qk9SQ29uZmlnKCkuCisgICogQHJtdG9sbCBTUjEgICAgICAgICAgU01QU0ZCRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX1NNUFNGQgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfU01QU0ZCKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxX1NNUFNGQkYpID09IChQV1JfU1IxX1NNUFNGQkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGZvcmNlZCBpbiBieXBhc3MgbW9kZSBpbnRlcnJ1cHQgZmxhZworICAqIEBub3RlICAgVG8gYWN0aXZhdGUgZmxhZyBvZiBTTVBTIHN0ZXAgZG93biBjb252ZXJ0ZXIgZm9yY2VkIGluIGJ5cGFzcyBtb2RlCisgICogICAgICAgICBieSBCT1JILCBCT1IgbXVzdCBiZSBwcmVsaW1pbmFyaWx5IGNvbmZpZ3VyZWQgdG8gY29udHJvbCBTTVBTCisgICogICAgICAgICBvcGVyYXRpbmcgbW9kZS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfUFdSX1NldEJPUkNvbmZpZygpLgorICAqIEBybXRvbGwgU0NSICAgICAgICAgIENTTVBTRkJGICAgICAgTExfUFdSX0NsZWFyRmxhZ19TTVBTRkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfU01QU0ZCKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DU01QU0ZCRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0ZMQUdfTWFuYWdlbWVudF9SYWRpbyBGTEFHIG1hbmFnZW1lbnQgZm9yIHJhZGlvIChCTEUgb3IgODAyLjE1LjQpCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgQkxFIHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU1IxICAgICAgICAgIEJMRVdVRiAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19CTEVXVQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQkxFV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfQkxFV1VGKSA9PSAoUFdSX1NSMV9CTEVXVUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IDgwMi4xNS40IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU1IxICAgICAgICAgIDgwMldVRiAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ184MDJXVQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfODAyV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfODAyV1VGKSA9PSAoUFdSX1NSMV84MDJXVUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEJMRSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIFNSMSAgICAgICAgICBCTEVBRiAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfQkxFQQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQkxFQSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9CTEVBRikgPT0gKFBXUl9TUjFfQkxFQUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IDgwMi4xNS40IGVuZCBvZiBhY3Rpdml0eSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU1IxICAgICAgICAgIDgwMkFGICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ184MDJBCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ184MDJBKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+U1IxLCBQV1JfU1IxXzgwMkFGKSA9PSAoUFdSX1NSMV84MDJBRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY3JpdGljYWwgcmFkaW8gcGhhc2UgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBTUjEgICAgICAgICAgQ1JQRUYgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0NSUEUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0NSUEUodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5TUjEsIFBXUl9TUjFfQ1JQRUYpID09IChQV1JfU1IxX0NSUEVGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjcml0aWNhbCByYWRpbyBzeXN0ZW0gcGhhc2UgZmxhZworICAqIEBybXRvbGwgRVhUU0NSICAgICAgIENSUEYgICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19DUlAKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0NSUCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkVYVFNDUiwgUFdSX0VYVFNDUl9DUlBGKSA9PSAoUFdSX0VYVFNDUl9DUlBGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEJMRSB3YWtldXAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIFNDUiAgICAgICAgICBCTEVXVSAgICAgICAgIExMX1BXUl9DbGVhckZsYWdfQkxFV1UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfQkxFV1Uodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NCTEVXVUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIDgwMi4xNS40IHdha2V1cCBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU0NSICAgICAgICAgIDgwMldVICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ184MDJXVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ184MDJXVSh2b2lkKQoreworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQzgwMldVRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQkxFIGVuZCBvZiBhY3Rpdml0eSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU0NSICAgICAgICAgIEJMRUFGICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19CTEVBCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX0JMRUEodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+U0NSLCBQV1JfU0NSX0NCTEVBRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgODAyLjE1LjQgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBTQ1IgICAgICAgICAgODAyQUYgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnXzgwMkEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfODAyQSh2b2lkKQoreworICBXUklURV9SRUcoUFdSLT5TQ1IsIFBXUl9TQ1JfQzgwMkFGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBjcml0aWNhbCByYWRpbyBwaGFzZSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIFNDUiAgICAgICAgICBDQ1JQRUYgICAgICAgIExMX1BXUl9DbGVhckZsYWdfQ1JQRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19DUlBFKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DQ1JQRUYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGNyaXRpY2FsIHJhZGlvIHN5c3RlbSBwaGFzZSBmbGFnCisgICogQHJtdG9sbCBFWFRTQ1IgICAgICAgQ0NSUCAgICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX0NSUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19DUlAodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0NDUlBGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfRkxBR19NYW5hZ2VtZW50X011bHRpY29yZSBGTEFHIG1hbmFnZW1lbnQgZm9yIG11bHRpY29yZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IENQVTIgaG9sZCBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU0NSICAgICAgICAgIENDMkhGICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19DMkgKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0MySCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPlNSMSwgUFdSX1NSMV9DMkhGKSA9PSAoUFdSX1NSMV9DMkhGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzeXN0ZW0gc3RvcCBmbGFnIGZvciBDUFUxCisgICogQHJtdG9sbCBFWFRTQ1IgICAgICAgQzFTVE9QRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0MxU1RPUAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzFTVE9QKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0MxU1RPUEYpID09IChQV1JfRVhUU0NSX0MxU1RPUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHN5c3RlbSBzdGFuZGJ5IGZsYWcgZm9yIENQVTEKKyAgKiBAcm10b2xsIEVYVFNDUiAgICAgICBDMVNCRiAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzFTQgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzFTQih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkVYVFNDUiwgUFdSX0VYVFNDUl9DMVNCRikgPT0gKFBXUl9FWFRTQ1JfQzFTQkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGRlZXBzbGVlcCBtb2RlIGZvciBDUFUxCisgICogQHJtdG9sbCBFWFRTQ1IgICAgICAgQzFEUyAgICAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0MxRFMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNBY3RpdmVGbGFnX0MxRFModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5FWFRTQ1IsIFBXUl9FWFRTQ1JfQzFEUykgPT0gKFBXUl9FWFRTQ1JfQzFEUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTeXN0ZW0gc3RvcCBmbGFnIGZvciBDUFUyCisgICogQHJtdG9sbCBFWFRTQ1IgICAgICAgQzJTVE9QRiAgICAgICBMTF9QV1JfSXNBY3RpdmVGbGFnX0MyU1RPUAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzJTVE9QKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0MyU1RPUEYpID09IChQV1JfRVhUU0NSX0MyU1RPUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3lzdGVtIHN0YW5kYnkgZmxhZyBmb3IgQ1BVMgorICAqIEBybXRvbGwgRVhUU0NSICAgICAgIEMyU0JGICAgICAgICAgTExfUFdSX0lzQWN0aXZlRmxhZ19DMlNCCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzQWN0aXZlRmxhZ19DMlNCKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0MyU0JGKSA9PSAoUFdSX0VYVFNDUl9DMlNCRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgZGVlcHNsZWVwIG1vZGUgZm9yIENQVTIKKyAgKiBAcm10b2xsIEVYVFNDUiAgICAgICBDMkRTICAgICAgICAgIExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzJEUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0FjdGl2ZUZsYWdfQzJEUyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkVYVFNDUiwgUFdSX0VYVFNDUl9DMkRTKSA9PSAoUFdSX0VYVFNDUl9DMkRTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIENQVTIgaG9sZCBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgU0NSICAgICAgICAgIENDMkhGICAgICAgICAgTExfUFdSX0NsZWFyRmxhZ19DMkgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9DbGVhckZsYWdfQzJIKHZvaWQpCit7CisgIFdSSVRFX1JFRyhQV1ItPlNDUiwgUFdSX1NDUl9DQzJIRik7Cit9CisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHN0YW5kYnkgYW5kIHN0b3AgZmxhZ3MgZm9yIENQVTEKKyAgKiBAcm10b2xsIEVYVFNDUiAgICAgICBDMUNTU0YgICAgICAgIExMX1BXUl9DbGVhckZsYWdfQzFTVE9QX0MxU1RCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfQ2xlYXJGbGFnX0MxU1RPUF9DMVNUQih2b2lkKQoreworICBXUklURV9SRUcoUFdSLT5FWFRTQ1IsIFBXUl9FWFRTQ1JfQzFDU1NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBzdGFuZGJ5IGFuZCBzdG9wIGZsYWdzIGZvciBDUFUyCisgICogQHJtdG9sbCBFWFRTQ1IgICAgICAgQzJDU1NGICAgICAgICBMTF9QV1JfQ2xlYXJGbGFnX0MyU1RPUF9DMlNUQgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0NsZWFyRmxhZ19DMlNUT1BfQzJTVEIodm9pZCkKK3sKKyAgV1JJVEVfUkVHKFBXUi0+RVhUU0NSLCBQV1JfRVhUU0NSX0MyQ1NTRik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0lUX01hbmFnZW1lbnRfU01QUyBQV1IgSVQgbWFuYWdlbWVudCBmb3IgU01QUworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBmb3JjZWQgaW4gYnlwYXNzIG1vZGUgYnkgQk9SSAorICAqICAgICAgICAgaW50ZXJydXB0IGZvciBDUFUxCisgICogQG5vdGUgICBUbyBhY3RpdmF0ZSBmbGFnIG9mIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBmb3JjZWQgaW4gYnlwYXNzIG1vZGUKKyAgKiAgICAgICAgIGJ5IEJPUkgsIEJPUiBtdXN0IGJlIHByZWxpbWluYXJpbHkgY29uZmlndXJlZCB0byBjb250cm9sIFNNUFMKKyAgKiAgICAgICAgIG9wZXJhdGluZyBtb2RlLgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9QV1JfU2V0Qk9SQ29uZmlnKCkuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUJPUkhTTVBTRkIgICBMTF9QV1JfRW5hYmxlSVRfQk9SSF9TTVBTRkIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVJVF9CT1JIX1NNUFNGQih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VCT1JIU01QU0ZCKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBmb3JjZWQgaW4gYnlwYXNzIG1vZGUgYnkgQk9SSAorICAqICAgICAgICAgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUJPUkhTTVBTRkIgICBMTF9QV1JfRGlzYWJsZUlUX0JPUkhfU01QU0ZCCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUlUX0JPUkhfU01QU0ZCKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FQk9SSFNNUFNGQik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGZvcmNlZCBpbiBieXBhc3MgbW9kZSBieSBCT1JICisgICogICAgICAgICBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBmb3IgQ1BVMQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVCT1JIU01QU0ZCICAgTExfUFdSX0lzRW5hYmxlZElUX0JPUkhfU01QU0ZCCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZElUX0JPUkhfU01QU0ZCKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VCT1JIU01QU0ZCKSA9PSAoUFdSX0NSM19FQk9SSFNNUFNGQikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfRUZfSVRfTWFuYWdlbWVudF9SYWRpbyBQV1IgSVQgbWFuYWdlbWVudCBmb3IgcmFkaW8gKEJMRSBvciA4MDIuMTUuNCkKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBCTEUgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBmb3IgQ1BVMQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVCTEVBICAgICAgICAgTExfUFdSX0VuYWJsZUlUX0JMRUEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVJVF9CTEVBKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUJMRUEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSA4MDIuMTUuNCBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRTgwMkEgICAgICAgICBMTF9QV1JfRW5hYmxlSVRfODAyQQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUlUXzgwMkEodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FODAyQSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEJMRSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUJMRUEgICAgICAgICBMTF9QV1JfRGlzYWJsZUlUX0JMRUEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlSVRfQkxFQSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUJMRUEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgODAyLjE1LjQgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBmb3IgQ1BVMQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEU4MDJBICAgICAgICAgTExfUFdSX0Rpc2FibGVJVF84MDJBCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUlUXzgwMkEodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0U4MDJBKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBCTEUgZW5kIG9mIGFjdGl2aXR5IGludGVycnVwdCBpcyBlbmFibGVkIGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUJMRUEgICAgICAgICBMTF9QV1JfSXNFbmFibGVkSVRfQkxFQQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRJVF9CTEVBKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VCTEVBKSA9PSAoUFdSX0NSM19FQkxFQSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiA4MDIuMTUuNCBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIENQVTEKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFODAyQSAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRJVF84MDJBCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUFdSX0lzRW5hYmxlZElUXzgwMkEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRTgwMkEpID09IChQV1JfQ1IzX0U4MDJBKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjcml0aWNhbCByYWRpbyBwaGFzZSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUNSUEUgICAgICAgICBMTF9QV1JfRW5hYmxlSVRfODAyQQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUFdSX0VuYWJsZUlUX0NSUEUodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FQ1JQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjcml0aWNhbCByYWRpbyBwaGFzZSBlbmQgb2YgYWN0aXZpdHkgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUNSUEUgICAgICAgICBMTF9QV1JfRGlzYWJsZUlUXzgwMkEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9EaXNhYmxlSVRfQ1JQRSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUNSUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGNyaXRpY2FsIHJhZGlvIHBoYXNlIGVuZCBvZiBhY3Rpdml0eSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBmb3IgQ1BVMQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVDUlBFICAgICAgICAgTExfUFdSX0lzRW5hYmxlZElUXzgwMkEKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9QV1JfSXNFbmFibGVkSVRfQ1JQRSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19FQ1JQRSkgPT0gKFBXUl9DUjNfRUNSUEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0lUX01hbmFnZW1lbnRfTXVsdGljb3JlIFBXUiBJVCBtYW5hZ2VtZW50IGZvciBtdWx0aWNvcmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDUFUyIGhvbGQgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUMySCAgICAgICAgICBMTF9QV1JfRW5hYmxlSVRfSG9sZENQVTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1BXUl9FbmFibGVJVF9Ib2xkQ1BVMih2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VDMkgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgODAyLjE1LjQgaG9zdCB3YWtldXAgaW50ZXJydXB0IGZvciBDUFUyCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUMySCAgICAgICAgICBMTF9QV1JfRGlzYWJsZUlUX0hvbGRDUFUyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9QV1JfRGlzYWJsZUlUX0hvbGRDUFUyKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FQzJIKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBCTEUgaG9zdCB3YWtldXAgaW50ZXJydXB0IGlzIGVuYWJsZWQgZm9yIENQVTIKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFQzJIICAgICAgICAgIExMX1BXUl9Jc0VuYWJsZWRJVF9Ib2xkQ1BVMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1BXUl9Jc0VuYWJsZWRJVF9Ib2xkQ1BVMih2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChQV1ItPkNSMywgUFdSX0NSM19FQzJIKSA9PSAoUFdSX0NSM19FQzJIKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFBXUl9MTF9FRl9JVF9NYW5hZ2VtZW50X0NQVTIgUFdSIElUIG1hbmFnZW1lbnQgb2YgQ1BVMiwgaW50ZW5kZWQgdG8gYmUgZXhlY3V0ZWQgYnkgQ1BVMgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEJMRSBob3N0IHdha2V1cCBpbnRlcnJ1cHQgZm9yIENQVTIKKyAgKiBAcm10b2xsIEMyQ1IzICAgICAgICBFQkxFV1VQICAgICAgIExMX0MyX1BXUl9FbmFibGVJVF9CTEVXVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUFdSX0VuYWJsZUlUX0JMRVdVKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0VCTEVXVVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSA4MDIuMTUuNCBob3N0IHdha2V1cCBpbnRlcnJ1cHQgZm9yIENQVTIKKyAgKiBAcm10b2xsIEMyQ1IzICAgICAgICBFODAyV1VQICAgICAgIExMX0MyX1BXUl9FbmFibGVJVF84MDJXVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUFdSX0VuYWJsZUlUXzgwMldVKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0U4MDJXVVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQkxFIGhvc3Qgd2FrZXVwIGludGVycnVwdCBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEVCTEVXVVAgICAgICAgTExfQzJfUFdSX0Rpc2FibGVJVF9CTEVXVQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUFdSX0Rpc2FibGVJVF9CTEVXVSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0VCTEVXVVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgODAyLjE1LjQgaG9zdCB3YWtldXAgaW50ZXJydXB0IGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgRTgwMldVUCAgICAgICBMTF9DMl9QV1JfRGlzYWJsZUlUXzgwMldVCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9QV1JfRGlzYWJsZUlUXzgwMldVKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkMyQ1IzLCBQV1JfQzJDUjNfRTgwMldVUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQkxFIGhvc3Qgd2FrZXVwIGludGVycnVwdCBpcyBlbmFibGVkIGZvciBDUFUyCisgICogQHJtdG9sbCBDMkNSMyAgICAgICAgRUJMRVdVUCAgICAgICBMTF9DMl9QV1JfSXNFbmFibGVkSVRfQkxFV1UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9DMl9QV1JfSXNFbmFibGVkSVRfQkxFV1Uodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUFdSLT5DMkNSMywgUFdSX0MyQ1IzX0VCTEVXVVApID09IChQV1JfQzJDUjNfRUJMRVdVUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiA4MDIuMTUuNCBob3N0IHdha2V1cCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBmb3IgQ1BVMgorICAqIEBybXRvbGwgQzJDUjMgICAgICAgIEU4MDJXVVAgICAgICAgTExfQzJfUFdSX0lzRW5hYmxlZElUXzgwMldVCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfUFdSX0lzRW5hYmxlZElUXzgwMldVKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFBXUi0+QzJDUjMsIFBXUl9DMkNSM19FODAyV1VQKSA9PSAoUFdSX0MyQ1IzX0U4MDJXVVApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUFdSX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFBXUikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9QV1JfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9yY2MuaCBiL0luYy9zdG0zMndieHhfbGxfcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2MzFkZgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfcmNjLmgKQEAgLTAsMCArMSw0NDAwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3JjYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBSQ0MgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1JDQ19ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9SQ0NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUkNDKQorCisvKiogQGRlZmdyb3VwIFJDQ19MTCBSQ0MKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfVmFyaWFibGVzIFJDQyBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisKKyNkZWZpbmUgSFNFX0NPTlRST0xfVU5MT0NLX0tFWSAweENBRkVDQUZFVQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfTWFjcm9zIFJDQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0V4cG9ydGVkX1R5cGVzIFJDQyBFeHBvcnRlZCBUeXBlcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTExfRVNfQ0xPQ0tfRlJFUSBDbG9ja3MgRnJlcXVlbmN5IFN0cnVjdHVyZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUkNDIENsb2NrcyBGcmVxdWVuY3kgU3RydWN0dXJlCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5OyAgICAgICAgIC8qITwgU1lTQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICB1aW50MzJfdCBIQ0xLMV9GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSzEgY2xvY2sgZnJlcXVlbmN5ICAqLworICB1aW50MzJfdCBIQ0xLMl9GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSzIgY2xvY2sgZnJlcXVlbmN5ICAqLworICB1aW50MzJfdCBIQ0xLNF9GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSzQgY2xvY2sgZnJlcXVlbmN5ICAqLworICB1aW50MzJfdCBIQ0xLNV9GcmVxdWVuY3k7ICAgICAgICAgIC8qITwgSENMSzUgY2xvY2sgZnJlcXVlbmN5ICovCisgIHVpbnQzMl90IFBDTEsxX0ZyZXF1ZW5jeTsgICAgICAgICAgLyohPCBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgICovCisgIHVpbnQzMl90IFBDTEsyX0ZyZXF1ZW5jeTsgICAgICAgICAgLyohPCBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgICovCit9IExMX1JDQ19DbG9ja3NUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFJDQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19PU0NfVkFMVUVTIE9zY2lsbGF0b3IgVmFsdWVzIGFkYXB0YXRpb24KKyAgKiBAYnJpZWYgICAgRGVmaW5lcyB1c2VkIHRvIGFkYXB0IHZhbHVlcyBvZiBkaWZmZXJlbnQgb3NjaWxsYXRvcnMKKyAgKiBAbm90ZSAgICAgVGhlc2UgdmFsdWVzIGNvdWxkIGJlIG1vZGlmaWVkIGluIHRoZSB1c2VyIGVudmlyb25tZW50IGFjY29yZGluZyB0bworICAqICAgICAgICAgICBIVyBzZXQtdXAuCisgICogQHsKKyAgKi8KKyNpZiAhZGVmaW5lZCAgKEhTRV9WQUxVRSkKKyNkZWZpbmUgSFNFX1ZBTFVFICAgIDMyMDAwMDAwVSAgLyohPCBWYWx1ZSBvZiB0aGUgSFNFIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBIU0VfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoSFNJX1ZBTFVFKQorI2RlZmluZSBIU0lfVkFMVUUgICAgMTYwMDAwMDBVICAvKiE8IFZhbHVlIG9mIHRoZSBIU0kgb3NjaWxsYXRvciBpbiBIeiAqLworI2VuZGlmIC8qIEhTSV9WQUxVRSAqLworCisjaWYgIWRlZmluZWQgIChMU0VfVkFMVUUpCisjZGVmaW5lIExTRV9WQUxVRSAgICAzMjc2OFUgICAgIC8qITwgVmFsdWUgb2YgdGhlIExTRSBvc2NpbGxhdG9yIGluIEh6ICovCisjZW5kaWYgLyogTFNFX1ZBTFVFICovCisKKyNpZiAhZGVmaW5lZCAgKExTSV9WQUxVRSkKKyNkZWZpbmUgTFNJX1ZBTFVFICAgIDMyMDAwVSAgICAgLyohPCBWYWx1ZSBvZiB0aGUgTFNJIG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBMU0lfVkFMVUUgKi8KKworI2lmICFkZWZpbmVkICAoSFNJNDhfVkFMVUUpCisjZGVmaW5lIEhTSTQ4X1ZBTFVFICA0ODAwMDAwMFUgIC8qITwgVmFsdWUgb2YgdGhlIEhTSTQ4IG9zY2lsbGF0b3IgaW4gSHogKi8KKyNlbmRpZiAvKiBIU0k0OF9WQUxVRSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQ0xFQVJfRkxBRyBDbGVhciBGbGFncyBEZWZpbmVzCisgICogQGJyaWVmICAgIEZsYWdzIGRlZmluZXMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMTF9SQ0NfV3JpdGVSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQ0lDUl9MU0kxUkRZQyAgICAgICAgICAgICAgIFJDQ19DSUNSX0xTSTFSRFlDICAgIC8qITwgTFNJMSBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfTFNJMlJEWUMgICAgICAgICAgICAgICBSQ0NfQ0lDUl9MU0kyUkRZQyAgICAvKiE8IExTSTEgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTFNFUkRZQyAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX01TSVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTVNJUkRZQyAgICAgLyohPCBNU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0hTSVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfSFNJUkRZQyAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0hTRVJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfSFNFUkRZQyAgICAgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX1BMTFJEWUMgICAgICAgICAgICAgICAgUkNDX0NJQ1JfUExMUkRZQyAgICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0hTSTQ4UkRZQyAgICAgICAgICAgICAgUkNDX0NJQ1JfSFNJNDhSRFlDICAgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgQ2xlYXIgKi8KKyNkZWZpbmUgTExfUkNDX0NJQ1JfUExMU0FJMVJEWUMgICAgICAgICAgICBSQ0NfQ0lDUl9QTExTQUkxUkRZQyAvKiE8IFBMTFNBSTEgUmVhZHkgSW50ZXJydXB0IENsZWFyICovCisjZGVmaW5lIExMX1JDQ19DSUNSX0xTRUNTU0MgICAgICAgICAgICAgICAgUkNDX0NJQ1JfTFNFQ1NTQyAgICAgLyohPCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBDbGVhciAqLworI2RlZmluZSBMTF9SQ0NfQ0lDUl9DU1NDICAgICAgICAgICAgICAgICAgIFJDQ19DSUNSX0NTU0MgICAgICAgIC8qITwgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBDbGVhciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JDQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTFNJMVJEWUYgICAgICAgICAgICAgICBSQ0NfQ0lGUl9MU0kxUkRZRiAgICAvKiE8IExTSTEgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTFNJMlJEWUYgICAgICAgICAgICAgICBSQ0NfQ0lGUl9MU0kyUkRZRiAgICAvKiE8IExTSTIgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfTFNFUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9MU0VSRFlGICAgICAvKiE8IExTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9NU0lSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX01TSVJEWUYgICAgIC8qITwgTVNJIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0hTSVJEWUYgICAgICAgICAgICAgICAgUkNDX0NJRlJfSFNJUkRZRiAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NJRlJfSFNFUkRZRiAgICAgICAgICAgICAgICBSQ0NfQ0lGUl9IU0VSRFlGICAgICAvKiE8IEhTRSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9QTExSRFlGICAgICAgICAgICAgICAgIFJDQ19DSUZSX1BMTFJEWUYgICAgIC8qITwgUExMIFJlYWR5IEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DSUZSX0hTSTQ4UkRZRiAgICAgICAgICAgICAgUkNDX0NJRlJfSFNJNDhSRFlGICAgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9QTExTQUkxUkRZRiAgICAgICAgICAgIFJDQ19DSUZSX1BMTFNBSTFSRFlGIC8qITwgUExMU0FJMSBSZWFkeSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9MU0VDU1NGICAgICAgICAgICAgICAgIFJDQ19DSUZSX0xTRUNTU0YgICAgIC8qITwgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ0lGUl9DU1NGICAgICAgICAgICAgICAgICAgIFJDQ19DSUZSX0NTU0YgICAgICAgIC8qITwgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIEludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfTFBXUlJTVEYgICAgICAgICAgICAgICAgUkNDX0NTUl9MUFdSUlNURiAgICAgLyohPCBMb3ctUG93ZXIgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX09CTFJTVEYgICAgICAgICAgICAgICAgIFJDQ19DU1JfT0JMUlNURiAgICAgIC8qITwgT0JMIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgTExfUkNDX0NTUl9QSU5SU1RGICAgICAgICAgICAgICAgICBSQ0NfQ1NSX1BJTlJTVEYgICAgICAvKiE8IFBJTiByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfU0ZUUlNURiAgICAgICAgICAgICAgICAgUkNDX0NTUl9TRlRSU1RGICAgICAgLyohPCBTb2Z0d2FyZSBSZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfSVdER1JTVEYgICAgICAgICAgICAgICAgUkNDX0NTUl9JV0RHUlNURiAgICAgLyohPCBJbmRlcGVuZGVudCBXYXRjaGRvZyByZXNldCBmbGFnICovCisjZGVmaW5lIExMX1JDQ19DU1JfV1dER1JTVEYgICAgICAgICAgICAgICAgUkNDX0NTUl9XV0RHUlNURiAgICAgLyohPCBXaW5kb3cgd2F0Y2hkb2cgcmVzZXQgZmxhZyAqLworI2RlZmluZSBMTF9SQ0NfQ1NSX0JPUlJTVEYgICAgICAgICAgICAgICAgIFJDQ19DU1JfQk9SUlNURiAgICAgIC8qITwgQk9SIHJlc2V0IGZsYWcgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JDQ19SZWFkUmVnIGFuZCAgTExfUkNDX1dyaXRlUmVnIGZ1bmN0aW9ucworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19DSUVSX0xTSTFSRFlJRSAgICAgICAgICAgICAgUkNDX0NJRVJfTFNJMVJEWUlFICAgICAvKiE8IExTSTEgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0kyUkRZSUUgICAgICAgICAgICAgIFJDQ19DSUVSX0xTSTJSRFlJRSAgICAgLyohPCBMU0kgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0VSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX0xTRVJEWUlFICAgICAgLyohPCBMU0UgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9NU0lSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX01TSVJEWUlFICAgICAgLyohPCBNU0kgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0lSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX0hTSVJEWUlFICAgICAgLyohPCBIU0kgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0VSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX0hTRVJEWUlFICAgICAgLyohPCBIU0UgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9QTExSRFlJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX1BMTFJEWUlFICAgICAgLyohPCBQTEwgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9IU0k0OFJEWUlFICAgICAgICAgICAgIFJDQ19DSUVSX0hTSTQ4UkRZSUUgICAgLyohPCBIU0k0OCBSZWFkeSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIExMX1JDQ19DSUVSX1BMTFNBSTFSRFlJRSAgICAgICAgICAgUkNDX0NJRVJfUExMU0FJMVJEWUlFICAvKiE8IFBMTFNBSTEgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMTF9SQ0NfQ0lFUl9MU0VDU1NJRSAgICAgICAgICAgICAgIFJDQ19DSUVSX0xTRUNTU0lFICAgICAgLyohPCBMU0UgQ1NTIEludGVycnVwdCBFbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xTRURSSVZFICBMU0Ugb3NjaWxsYXRvciBkcml2ZSBjYXBhYmlsaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFh0YWwgbW9kZSBsb3dlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVyAgICAgICAgICBSQ0NfQkRDUl9MU0VEUlZfMCAgICAgICAvKiE8IFh0YWwgbW9kZSBtZWRpdW0gbG93IGRyaXZpbmcgY2FwYWJpbGl0eSAqLworI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNSElHSCAgICAgICAgIFJDQ19CRENSX0xTRURSVl8xICAgICAgIC8qITwgWHRhbCBtb2RlIG1lZGl1bSBoaWdoIGRyaXZpbmcgY2FwYWJpbGl0eSAqLworI2RlZmluZSBMTF9SQ0NfTFNFRFJJVkVfSElHSCAgICAgICAgICAgICAgIFJDQ19CRENSX0xTRURSViAgICAgICAgIC8qITwgWHRhbCBtb2RlIGhpZ2hlciBkcml2aW5nIGNhcGFiaWxpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01TSVJBTkdFICBNU0kgY2xvY2sgcmFuZ2VzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX01TSVJBTkdFXzAgICAgICAgICAgICAgICAgICBSQ0NfQ1JfTVNJUkFOR0VfMCAgLyohPCBNU0kgPSAxMDAgS0h6ICAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfMSAgICAgICAgICAgICAgICAgIFJDQ19DUl9NU0lSQU5HRV8xICAvKiE8IE1TSSA9IDIwMCBLSHogICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV8yICAgICAgICAgICAgICAgICAgUkNDX0NSX01TSVJBTkdFXzIgIC8qITwgTVNJID0gNDAwIEtIeiAgKi8KKyNkZWZpbmUgTExfUkNDX01TSVJBTkdFXzMgICAgICAgICAgICAgICAgICBSQ0NfQ1JfTVNJUkFOR0VfMyAgLyohPCBNU0kgPSA4MDAgS0h6ICAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfNCAgICAgICAgICAgICAgICAgIFJDQ19DUl9NU0lSQU5HRV80ICAvKiE8IE1TSSA9IDEgTUh6ICAgICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV81ICAgICAgICAgICAgICAgICAgUkNDX0NSX01TSVJBTkdFXzUgIC8qITwgTVNJID0gMiBNSHogICAgKi8KKyNkZWZpbmUgTExfUkNDX01TSVJBTkdFXzYgICAgICAgICAgICAgICAgICBSQ0NfQ1JfTVNJUkFOR0VfNiAgLyohPCBNU0kgPSA0IE1IeiAgICAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfNyAgICAgICAgICAgICAgICAgIFJDQ19DUl9NU0lSQU5HRV83ICAvKiE8IE1TSSA9IDggTUh6ICAgICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV84ICAgICAgICAgICAgICAgICAgUkNDX0NSX01TSVJBTkdFXzggIC8qITwgTVNJID0gMTYgTUh6ICAgKi8KKyNkZWZpbmUgTExfUkNDX01TSVJBTkdFXzkgICAgICAgICAgICAgICAgICBSQ0NfQ1JfTVNJUkFOR0VfOSAgLyohPCBNU0kgPSAyNCBNSHogICAqLworI2RlZmluZSBMTF9SQ0NfTVNJUkFOR0VfMTAgICAgICAgICAgICAgICAgIFJDQ19DUl9NU0lSQU5HRV8xMCAvKiE8IE1TSSA9IDMyIE1IeiAgICovCisjZGVmaW5lIExMX1JDQ19NU0lSQU5HRV8xMSAgICAgICAgICAgICAgICAgUkNDX0NSX01TSVJBTkdFXzExIC8qITwgTVNJID0gNDggTUh6ICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSFNFX0NVUlJFTlRfQ09OVFJPTCAgSFNFIGN1cnJlbnQgY29udHJvbCBtYXggbGltaXRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzAgICAgICAgICAgICAweDAwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0UgY3VycmVudCBjb250cm9sIG1heCBsaW1pdCA9IDAuMTggbWEvViovCisjZGVmaW5lIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF8xICAgICAgICAgICAgUkNDX0hTRUNSX0hTRUdNQzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIGN1cnJlbnQgY29udHJvbCBtYXggbGltaXQgPSAwLjU3IG1hL1YqLworI2RlZmluZSBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMiAgICAgICAgICAgIFJDQ19IU0VDUl9IU0VHTUMxICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBjdXJyZW50IGNvbnRyb2wgbWF4IGxpbWl0ID0gMC43OCBtYS9WKi8KKyNkZWZpbmUgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzMgICAgICAgICAgICAoUkNDX0hTRUNSX0hTRUdNQzF8UkNDX0hTRUNSX0hTRUdNQzApICAgICAgLyohPCBIU0UgY3VycmVudCBjb250cm9sIG1heCBsaW1pdCA9IDEuMTMgbWEvViovCisjZGVmaW5lIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF80ICAgICAgICAgICAgUkNDX0hTRUNSX0hTRUdNQzIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNFIGN1cnJlbnQgY29udHJvbCBtYXggbGltaXQgPSAwLjYxIG1hL1YqLworI2RlZmluZSBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfNSAgICAgICAgICAgIChSQ0NfSFNFQ1JfSFNFR01DMnxSQ0NfSFNFQ1JfSFNFR01DMCkgICAgICAvKiE8IEhTRSBjdXJyZW50IGNvbnRyb2wgbWF4IGxpbWl0ID0gMS42NSBtYS9WKi8KKyNkZWZpbmUgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzYgICAgICAgICAgICAoUkNDX0hTRUNSX0hTRUdNQzJ8UkNDX0hTRUNSX0hTRUdNQzEpICAgICAgLyohPCBIU0UgY3VycmVudCBjb250cm9sIG1heCBsaW1pdCA9IDIuMTIgbWEvViovCisjZGVmaW5lIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF83ICAgICAgICAgICAgKFJDQ19IU0VDUl9IU0VHTUMyfFJDQ19IU0VDUl9IU0VHTUMxfFJDQ19IU0VDUl9IU0VHTUMwKSAvKiE8IEhTRSBjdXJyZW50IGNvbnRyb2wgbWF4IGxpbWl0ID0gMi44NCBtYS9WKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0hTRV9TRU5TRV9BTVBMSUZJRVIgIEhTRSBzZW5zZSBhbXBsaWZpZXIgdGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0hTRUFNUFRIUkVTSE9MRF8xXzIgICAgICAgICAoMHgwMDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIU0Ugc2Vuc2UgYW1wbGlmaWVyIGJpYXMgY3VycmVudCBmYWN0b3IgPSAxLzIqLworI2RlZmluZSBMTF9SQ0NfSFNFQU1QVEhSRVNIT0xEXzNfNCAgICAgICAgIFJDQ19IU0VDUl9IU0VTICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBzZW5zZSBhbXBsaWZpZXIgYmlhcyBjdXJyZW50IGZhY3RvciA9IDMvNCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MU0NPX0NMS1NPVVJDRSAgTFNDTyBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNJICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IExTSSBzZWxlY3Rpb24gZm9yIGxvdyBzcGVlZCBjbG9jayAgKi8KKyNkZWZpbmUgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRSAgICAgICAgICBSQ0NfQkRDUl9MU0NPU0VMICAgICAgLyohPCBMU0Ugc2VsZWN0aW9uIGZvciBsb3cgc3BlZWQgY2xvY2sgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNfQ0xLU09VUkNFICBTeXN0ZW0gY2xvY2sgc3dpdGNoCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfTVNJICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IE1TSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTSSAgICAgICAgICAgUkNDX0NGR1JfU1dfMCAgICAvKiE8IEhTSSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX0hTRSAgICAgICAgICAgUkNDX0NGR1JfU1dfMSAgICAvKiE8IEhTRSBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1BMTCAgICAgICAgICAgKFJDQ19DRkdSX1NXXzEgfCBSQ0NfQ0ZHUl9TV18wKSAgICAvKiE8IFBMTCBzZWxlY3Rpb24gYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNfQ0xLU09VUkNFX1NUQVRVUyAgU3lzdGVtIGNsb2NrIHN3aXRjaCBzdGF0dXMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfTVNJICAgIDB4MDAwMDAwMDBVICAgLyohPCBNU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTSSAgICBSQ0NfQ0ZHUl9TV1NfMCAgIC8qITwgSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19IU0UgICAgUkNDX0NGR1JfU1dTXzEgICAvKiE8IEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMICAgIChSQ0NfQ0ZHUl9TV1NfMSB8IFJDQ19DRkdSX1NXU18wKSAgIC8qITwgUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19SRl9DTEtTT1VSQ0VfU1RBVFVTICBSRiBzeXN0ZW0gY2xvY2sgc3dpdGNoIHN0YXR1cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19SRl9DTEtTT1VSQ0VfSFNJICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgSFNJIHVzZWQgYXMgUkYgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SRl9DTEtTT1VSQ0VfSFNFX0RJVjIgICAgICAgUkNDX0VYVENGR1JfUkZDU1MgIC8qITwgSFNFIGRpdmlkZWQgYnkgMiB1c2VkIGFzIFJGIHN5c3RlbSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TWVNDTEtfRElWICBBSEIgcHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMSAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgU1lTQ0xLIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzIgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV8zICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzMgICAgICAgICAgICAgICAgUkNDX0NGR1JfSFBSRV8wICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAzICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzQgICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMCkgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfNSAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9IUFJFXzEgICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDUgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfNiAgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8yIHwgUkNDX0NGR1JfSFBSRV8wKSAgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl84ICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzMgfCBSQ0NfQ0ZHUl9IUFJFXzEpICAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzEwICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMiB8IFJDQ19DRkdSX0hQUkVfMSkgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMTAgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTYgICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8xIHwgUkNDX0NGR1JfSFBSRV8wKSAgLyohPCBTWVNDTEsgZGl2aWRlZCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8zMiAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzIgfCBSQ0NfQ0ZHUl9IUFJFXzEgfCBSQ0NfQ0ZHUl9IUFJFXzApICAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDMyICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzY0ICAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMikgIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgNjQgKi8KKyNkZWZpbmUgTExfUkNDX1NZU0NMS19ESVZfMTI4ICAgICAgICAgICAgICAoUkNDX0NGR1JfSFBSRV8zIHwgUkNDX0NGR1JfSFBSRV8yIHwgUkNDX0NGR1JfSFBSRV8wKSAvKiE8IFNZU0NMSyBkaXZpZGVkIGJ5IDEyOCAqLworI2RlZmluZSBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9IUFJFXzMgfCBSQ0NfQ0ZHUl9IUFJFXzIgfCBSQ0NfQ0ZHUl9IUFJFXzEpIC8qITwgU1lTQ0xLIGRpdmlkZWQgYnkgMjU2ICovCisjZGVmaW5lIExMX1JDQ19TWVNDTEtfRElWXzUxMiAgICAgICAgICAgICAgKFJDQ19DRkdSX0hQUkVfMyB8IFJDQ19DRkdSX0hQUkVfMiB8IFJDQ19DRkdSX0hQUkVfMSB8IFJDQ19DRkdSX0hQUkVfMCkgLyohPCBTWVNDTEsgZGl2aWRlZCBieSA1MTIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FQQjFfRElWICBBUEIgbG93LXNwZWVkIHByZXNjYWxlciAoQVBCMSkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSENMSzEgbm90IGRpdmlkZWQgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzIgICAgICAgICAgICAgICAgICBSQ0NfQ0ZHUl9QUFJFMV8yICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhDTEsxIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfQVBCMV9ESVZfNCAgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFMV8yIHwgUkNDX0NGR1JfUFBSRTFfMCkgIC8qITwgSENMSzEgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19BUEIxX0RJVl84ICAgICAgICAgICAgICAgICAgKFJDQ19DRkdSX1BQUkUxXzIgfCBSQ0NfQ0ZHUl9QUFJFMV8xKSAgLyohPCBIQ0xLMSBkaXZpZGVkIGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX0FQQjFfRElWXzE2ICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfUFBSRTFfMiB8IFJDQ19DRkdSX1BQUkUxXzEgfCBSQ0NfQ0ZHUl9QUFJFMV8wKSAvKiE8IEhDTEsxIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0FQQjJfRElWICBBUEIgaGlnaC1zcGVlZCBwcmVzY2FsZXIgKEFQQjIpCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhDTEsxIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfUFBSRTJfMiAgICAgICAgICAgICAgICAgICAgICAgLyohPCBIQ0xLMSBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX0FQQjJfRElWXzQgICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfUFBSRTJfMiB8IFJDQ19DRkdSX1BQUkUyXzApICAvKiE8IEhDTEsxIGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfQVBCMl9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfQ0ZHUl9QUFJFMl8yIHwgUkNDX0NGR1JfUFBSRTJfMSkgIC8qITwgSENMSzEgZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19BUEIyX0RJVl8xNiAgICAgICAgICAgICAgICAgKFJDQ19DRkdSX1BQUkUyXzIgfCBSQ0NfQ0ZHUl9QUFJFMl8xIHwgUkNDX0NGR1JfUFBSRTJfMCkgLyohPCBIQ0xLMSBkaXZpZGVkIGJ5IDE2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TVE9QX1dBS0VVUENMT0NLICBXYWtldXAgZnJvbSBTdG9wIGFuZCBDU1MgYmFja3VwIGNsb2NrIHNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TVE9QX1dBS0VVUENMT0NLX01TSSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNU0kgc2VsZWN0aW9uIGFmdGVyIHdha2UtdXAgZnJvbSBTVE9QICovCisjZGVmaW5lIExMX1JDQ19TVE9QX1dBS0VVUENMT0NLX0hTSSAgICAgICAgUkNDX0NGR1JfU1RPUFdVQ0sgICAgICAgLyohPCBIU0kgc2VsZWN0aW9uIGFmdGVyIHdha2UtdXAgZnJvbSBTVE9QICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19NQ08xU09VUkNFICBNQ08xIFNPVVJDRSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBvdXRwdXQgZGlzYWJsZWQsIG5vIGNsb2NrIG9uIE1DTyAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9TWVNDTEsgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNZU0NMSyBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfTVNJICAgICAgICAgICAgICBSQ0NfQ0ZHUl9NQ09TRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNU0kgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0hTSSAgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8wfCBSQ0NfQ0ZHUl9NQ09TRUxfMSkgICAgICAgIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9IU0UgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1NFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSBhZnRlciBzdGFiaWxpemF0aW9uIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfMHxSQ0NfQ0ZHUl9NQ09TRUxfMikgICAgICAgICAvKiE8IE1haW4gUExMIHNlbGVjdGlvbiBhcyBNQ08xIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfTUNPMVNPVVJDRV9MU0kxICAgICAgICAgICAgIChSQ0NfQ0ZHUl9NQ09TRUxfMXxSQ0NfQ0ZHUl9NQ09TRUxfMikgICAgICAgICAvKiE8IExTSTEgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTSTIgICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8wfFJDQ19DRkdSX01DT1NFTF8xfFJDQ19DRkdSX01DT1NFTF8yKSAvKiE8IExTSTIgc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0xTRSAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPU0VMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBMU0Ugc2VsZWN0aW9uIGFzIE1DTzEgc291cmNlICovCisjZGVmaW5lIExMX1JDQ19NQ08xU09VUkNFX0hTSTQ4ICAgICAgICAgICAgKFJDQ19DRkdSX01DT1NFTF8wfFJDQ19DRkdSX01DT1NFTF8zKSAgICAgICAgLyohPCBIU0k0OCBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFTT1VSQ0VfSFNFX0JFRk9SRV9TVEFCICAoUkNDX0NGR1JfTUNPU0VMXzJ8UkNDX0NGR1JfTUNPU0VMXzMpICAgICAgICAvKiE8IEhTRSBiZWZvcmUgc3RhYmlsaXphdGlvbiBzZWxlY3Rpb24gYXMgTUNPMSBzb3VyY2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX01DTzFfRElWICBNQ08xIHByZXNjYWxlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPIG5vdCBkaXZpZGVkICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPIGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBMTF9SQ0NfTUNPMV9ESVZfNCAgICAgICAgICAgICAgICAgIFJDQ19DRkdSX01DT1BSRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1DTyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX01DTzFfRElWXzggICAgICAgICAgICAgICAgICAoUkNDX0NGR1JfTUNPUFJFXzEgfCBSQ0NfQ0ZHUl9NQ09QUkVfMCkgICAgICAgLyohPCBNQ08gZGl2aWRlZCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19NQ08xX0RJVl8xNiAgICAgICAgICAgICAgICAgUkNDX0NGR1JfTUNPUFJFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTUNPIGRpdmlkZWQgYnkgMTYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NNUFNfQ0xLU09VUkNFICBTTVBTIGNsb2NrIHN3aXRjaAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9IU0kgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgSFNJIHNlbGVjdGlvbiBhcyBTTVBTIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9NU0kgICAgICAgICAgIFJDQ19TTVBTQ1JfU01QU1NFTF8wICAgIC8qITwgTVNJIHNlbGVjdGlvbiBhcyBTTVBTIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9IU0UgICAgICAgICAgIFJDQ19TTVBTQ1JfU01QU1NFTF8xICAgIC8qITwgSFNFIHNlbGVjdGlvbiBhcyBTTVBTIGNsb2NrICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NNUFNfQ0xLU09VUkNFX1NUQVRVUyAgU01QUyBjbG9jayBzd2l0Y2ggc3RhdHVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0kgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSFNJIHVzZWQgYXMgU01QUyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU01QU19DTEtTT1VSQ0VfU1RBVFVTX01TSSAgICAgICBSQ0NfU01QU0NSX1NNUFNTV1NfMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNU0kgdXNlZCBhcyBTTVBTIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9TVEFUVVNfSFNFICAgICAgIFJDQ19TTVBTQ1JfU01QU1NXU18xICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEhTRSB1c2VkIGFzIFNNUFMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19OT19DTE9DSyAgKFJDQ19TTVBTQ1JfU01QU1NXU18wfFJDQ19TTVBTQ1JfU01QU1NXU18xKSAgIC8qITwgTm8gQ2xvY2sgdXNlZCBhcyBTTVBTIGNsb2NrICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1NNUFNfRElWICBTTVBTIHByZXNjYWxlcgorICAgICogQHsKKyAgICAqLworI2RlZmluZSBMTF9SQ0NfU01QU19ESVZfMCAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTVBTIGNsb2NrIGRpdmlzaW9uIDAgKi8KKyNkZWZpbmUgTExfUkNDX1NNUFNfRElWXzEgICAgICAgICAgICAgICAgICBSQ0NfU01QU0NSX1NNUFNESVZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU01QUyBjbG9jayBkaXZpc2lvbiAxICovCisjZGVmaW5lIExMX1JDQ19TTVBTX0RJVl8yICAgICAgICAgICAgICAgICAgUkNDX1NNUFNDUl9TTVBTRElWXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFNNUFMgY2xvY2sgZGl2aXNpb24gMiAqLworI2RlZmluZSBMTF9SQ0NfU01QU19ESVZfMyAgICAgICAgICAgICAgICAgIChSQ0NfU01QU0NSX1NNUFNESVZfMHxSQ0NfU01QU0NSX1NNUFNESVZfMSkgICAgICAgLyohPCBTTVBTIGNsb2NrIGRpdmlzaW9uIDMgKi8KKworLyoqCisgICAgKiBAfQorICAgICovCisKKworCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BFUklQSF9GUkVRVUVOQ1kgUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IE5vIGNsb2NrIGVuYWJsZWQgZm9yIHRoZSBwZXJpcGhlcmFsICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkEgICAgICAgICAweEZGRkZGRkZGVSAgICAgICAgICAgICAgICAgLyohPCBGcmVxdWVuY3kgY2Fubm90IGJlIHByb3ZpZGVkIGFzIGV4dGVybmFsIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0FSVDFfQ0xLU09VUkNFIFVTQVJUMSBDTEtTT1VSQ0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITwgUENMSzIgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSyAgICAgUkNDX0NDSVBSX1VTQVJUMVNFTF8wICAgICAgLyohPCBTWVNDTEsgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSSAgICAgICAgUkNDX0NDSVBSX1VTQVJUMVNFTF8xICAgICAgLyohPCBIU0kgc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRSAgICAgICAgUkNDX0NDSVBSX1VTQVJUMVNFTCAgICAgICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgVVNBUlQxIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19MUFVBUlQxX0NMS1NPVVJDRSBMUFVBUlQxIENMS1NPVVJDRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMSAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IFBDTEsxIHNlbGVjdGVkIGFzIExQVUFSVDEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSyAgICBSQ0NfQ0NJUFJfTFBVQVJUMVNFTF8wICAgIC8qITwgU1lDTEsgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMXzEgICAgLyohPCBIU0kgc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFICAgICAgIFJDQ19DQ0lQUl9MUFVBUlQxU0VMICAgICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgTFBVQVJUMSBjbG9jayAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfSTJDeF9DTEtTT1VSQ0UgSTJDeCBDTEtTT1VSQ0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzEgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9JMkMxU0VMIDw8IDQpIHwgKDB4MDAwMDAwMDBVID4+IDQpKSAgICAgICAgIC8qITwgUENMSzEgc2VsZWN0ZWQgYXMgSTJDMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9JMkMxU0VMIDw8IDQpIHwgKFJDQ19DQ0lQUl9JMkMxU0VMXzAgPj4gNCkpIC8qITwgU1lTQ0xLIHNlbGVjdGVkIGFzIEkyQzEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSSAgICAgICAgICAodWludDMyX3QpKChSQ0NfQ0NJUFJfSTJDMVNFTCA8PCA0KSB8IChSQ0NfQ0NJUFJfSTJDMVNFTF8xID4+IDQpKSAvKiE8IEhTSSBzZWxlY3RlZCBhcyBJMkMxIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMSAgICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX0kyQzNTRUwgPDwgNCkgfCAoMHgwMDAwMDAwMFUgPj4gNCkpICAgICAgICAgLyohPCBQQ0xLMSBzZWxlY3RlZCBhcyBJMkMzIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsgICAgICAgKHVpbnQzMl90KSgoUkNDX0NDSVBSX0kyQzNTRUwgPDwgNCkgfCAoUkNDX0NDSVBSX0kyQzNTRUxfMCA+PiA0KSkgLyohPCBTWVNDTEsgc2VsZWN0ZWQgYXMgSTJDMyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJICAgICAgICAgICh1aW50MzJfdCkoKFJDQ19DQ0lQUl9JMkMzU0VMIDw8IDQpIHwgKFJDQ19DQ0lQUl9JMkMzU0VMXzEgPj4gNCkpIC8qITwgSFNJIHNlbGVjdGVkIGFzIEkyQzMgY2xvY2sgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVElNeF9DTEtTT1VSQ0UgTFBUSU14IENMS1NPVVJDRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxICAgICAgKHVpbnQzMl90KShSQ0NfQ0NJUFJfTFBUSU0xU0VMIHwgKDB4MDAwMDAwMDBVID4+IDE2KSkgICAgICAgICAgIC8qITwgUENMSzEgc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSSAgICAgICAgKHVpbnQzMl90KShSQ0NfQ0NJUFJfTFBUSU0xU0VMIHwgKFJDQ19DQ0lQUl9MUFRJTTFTRUxfMCA+PiAxNikpIC8qITwgTFNJIHNlbGVjdGVkIGFzIExQVElNMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoUkNDX0NDSVBSX0xQVElNMVNFTCB8IChSQ0NfQ0NJUFJfTFBUSU0xU0VMXzEgPj4gMTYpKSAvKiE8IEhTSSBzZWxlY3RlZCBhcyBMUFRJTTEgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFICAgICAgICAodWludDMyX3QpKFJDQ19DQ0lQUl9MUFRJTTFTRUwgfCAoUkNDX0NDSVBSX0xQVElNMVNFTCA+PiAxNikpICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgTFBUSU0xIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX1BDTEsxICAgICAgKHVpbnQzMl90KShSQ0NfQ0NJUFJfTFBUSU0yU0VMIHwgKDB4MDAwMDAwMDBVID4+IDE2KSkgICAgICAgICAgIC8qITwgUENMSzEgc2VsZWN0ZWQgYXMgTFBUSU0yIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSSAgICAgICAgKHVpbnQzMl90KShSQ0NfQ0NJUFJfTFBUSU0yU0VMIHwgKFJDQ19DQ0lQUl9MUFRJTTJTRUxfMCA+PiAxNikpIC8qITwgTFNJIHNlbGVjdGVkIGFzIExQVElNMiBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9IU0kgICAgICAgICh1aW50MzJfdCkoUkNDX0NDSVBSX0xQVElNMlNFTCB8IChSQ0NfQ0NJUFJfTFBUSU0yU0VMXzEgPj4gMTYpKSAvKiE8IEhTSSBzZWxlY3RlZCBhcyBMUFRJTTIgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNFICAgICAgICAodWludDMyX3QpKFJDQ19DQ0lQUl9MUFRJTTJTRUwgfCAoUkNDX0NDSVBSX0xQVElNMlNFTCA+PiAxNikpICAgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgTFBUSU0yIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19TQUkxX0NMS1NPVVJDRSBTQUkxIENMS1NPVVJDRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTExTQUkxICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IFBMTFNBSTEgc2VsZWN0ZWQgYXMgU0FJMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUExMICAgICAgICAgIFJDQ19DQ0lQUl9TQUkxU0VMXzAgICAgLyohPCBQTEwgc2VsZWN0ZWQgYXMgU0FJMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfSFNJICAgICAgICAgIFJDQ19DQ0lQUl9TQUkxU0VMXzEgICAgLyohPCBIU0kgc2VsZWN0ZWQgYXMgU0FJMSBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUElOICAgICAgICAgIFJDQ19DQ0lQUl9TQUkxU0VMICAgICAgLyohPCBFeHRlcm5hbCBpbnB1dCBzZWxlY3RlZCBhcyBTQUkxIGNsb2NrICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19DTEs0OF9DTEtTT1VSQ0UgQ0xLNDggQ0xLU09VUkNFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9IU0k0OCAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBIU0k0OCBzZWxlY3RlZCBhcyBDTEs0OCBjbG9jayovCisjZGVmaW5lIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMU0FJMSAgICAgUkNDX0NDSVBSX0NMSzQ4U0VMXzAgIC8qITwgUExMU0FJMSBzZWxlY3RlZCBhcyBDTEs0OCBjbG9jayovCisjZGVmaW5lIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMICAgICAgICAgUkNDX0NDSVBSX0NMSzQ4U0VMXzEgIC8qITwgUExMIHNlbGVjdGVkIGFzIENMSzQ4IGNsb2NrKi8KKyNkZWZpbmUgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9NU0kgICAgICAgICBSQ0NfQ0NJUFJfQ0xLNDhTRUwgICAgLyohPCBNU0kgc2VsZWN0ZWQgYXMgQ0xLNDggY2xvY2sqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfVVNCX0NMS1NPVVJDRSBVU0IgQ0xLU09VUkNFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfSFNJNDggICAgICAgICBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX0hTSTQ4ICAgIC8qITwgSFNJNDggc2VsZWN0ZWQgYXMgVVNCIGNsb2NrKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfUExMU0FJMSAgICAgICBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX1BMTFNBSTEgIC8qITwgUExMU0FJMSBzZWxlY3RlZCBhcyBVU0IgY2xvY2sqLworI2RlZmluZSBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwgICAgICAgICAgIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMICAgICAgLyohPCBQTEwgc2VsZWN0ZWQgYXMgVVNCIGNsb2NrKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0VfTVNJICAgICAgICAgICBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX01TSSAgICAgIC8qITwgTVNJIHNlbGVjdGVkIGFzIFVTQiBjbG9jayovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19BRENfQ0xLU1JDIEFEQyBDTEtTUkMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfQURDX0NMS1NPVVJDRV9OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IG5vIENsb2NrIHVzZWQgYXMgQURDIGNsb2NrKi8KKyNkZWZpbmUgTExfUkNDX0FEQ19DTEtTT1VSQ0VfUExMU0FJMSAgICAgICAgICBSQ0NfQ0NJUFJfQURDU0VMXzAgLyohPCBQTExTQUkxIHNlbGVjdGVkIGFzIEFEQyBjbG9jayovCisjZGVmaW5lIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTCAgICAgICAgICAgICAgUkNDX0NDSVBSX0FEQ1NFTF8xIC8qITwgUExMIHNlbGVjdGVkIGFzIEFEQyBjbG9jayovCisjZGVmaW5lIExMX1JDQ19BRENfQ0xLU09VUkNFX1NZU0NMSyAgICAgICAgICAgUkNDX0NDSVBSX0FEQ1NFTCAgIC8qITwgU1lTQ0xLIHNlbGVjdGVkIGFzIEFEQyBjbG9jayovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19STkdfQ0xLU1JDIFJORyBDTEtTUkMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9DTEs0OCAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IENMSzQ4IGRpdmlkZWQgYnkgMyBzZWxlY3RlZCBhcyBSTkcgQ2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNJICAgICAgICAgICAgICBSQ0NfQ0NJUFJfUk5HU0VMXzAgLyohPCBMU0kgc2VsZWN0ZWQgYXMgQURDIGNsb2NrKi8KKyNkZWZpbmUgTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNFICAgICAgICAgICAgICBSQ0NfQ0NJUFJfUk5HU0VMXzEgLyohPCBMU0Ugc2VsZWN0ZWQgYXMgQURDIGNsb2NrKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1VTQVJUMSBVU0FSVDEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DQ0lQUl9VU0FSVDFTRUwgICAvKiE8IFVTQVJUMSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVUFSVDEgTFBVQVJUMQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRSAgICAgICAgICAgUkNDX0NDSVBSX0xQVUFSVDFTRUwgIC8qITwgTFBVQVJUMSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0kyQzEgSTJDMQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19JMkMxX0NMS1NPVVJDRSAgICAgICAgICAgICAgUkNDX0NDSVBSX0kyQzFTRUwgICAgLyohPCBJMkMxIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworI2RlZmluZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UgICAgICAgICAgICAgIFJDQ19DQ0lQUl9JMkMzU0VMICAgIC8qITwgSTJDMyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0xQVElNMSBMUFRJTTEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DQ0lQUl9MUFRJTTFTRUwgIC8qITwgTFBUSU0xIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworI2RlZmluZSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRSAgICAgICAgICAgIFJDQ19DQ0lQUl9MUFRJTTJTRUwgIC8qITwgTFBUSU0yIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfU0FJMSBTQUkxCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1NBSTFfQ0xLU09VUkNFICAgICAgICAgICAgICBSQ0NfQ0NJUFJfU0FJMVNFTCAgIC8qITwgU0FJMSBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX0NMSzQ4IENMSzQ4CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRSAgICAgICAgICAgICBSQ0NfQ0NJUFJfQ0xLNDhTRUwgIC8qITwgVVNCIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19VU0IgVVNCCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1VTQl9DTEtTT1VSQ0UgICAgICAgICAgICAgICBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFICAvKiE8IFVTQiBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGJpdHMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1JORyBSTkcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUk5HX0NMS1NPVVJDRSAgICAgICAgICAgICAgIFJDQ19DQ0lQUl9STkdTRUwgIC8qITwgUk5HIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfQURDIEFEQworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19BRENfQ0xLU09VUkNFICAgICAgICAgICAgICAgUkNDX0NDSVBSX0FEQ1NFTCAgIC8qITwgQURDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUlRDX0NMS1NPVVJDRSAgUlRDIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFICAgICAgICAgICBSQ0NfQkRDUl9SVENTRUxfMCAgICAgICAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSSAgICAgICAgICAgUkNDX0JEQ1JfUlRDU0VMXzEgICAgICAgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzIgICAgIFJDQ19CRENSX1JUQ1NFTCAgICAgICAgICAgICAgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAzMiB1c2VkIGFzIFJUQyBjbG9jayAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19SRldLUF9DTEtTT1VSQ0UgIFJGIFdha2V1cCBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9OT05FICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITwgTm8gY2xvY2sgdXNlZCBhcyBSRiBXYWtldXAgY2xvY2sgKi8KKyNkZWZpbmUgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9MU0UgICAgICAgICAgIFJDQ19DU1JfUkZXS1BTRUxfMCAgICAgICAgICAgICAvKiE8IExTRSBvc2NpbGxhdG9yIGNsb2NrIHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTFNJICAgICAgICAgICBSQ0NfQ1NSX1JGV0tQU0VMXzEgICAgICAgICAgICAgLyohPCBMU0kgb3NjaWxsYXRvciBjbG9jayB1c2VkIGFzIFJGIFdha2V1cCBjbG9jayAqLworI2RlZmluZSBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0hTRV9ESVYxMDI0ICAgUkNDX0NTUl9SRldLUFNFTCAgICAgICAgICAgICAgIC8qITwgSFNFIG9zY2lsbGF0b3IgY2xvY2sgZGl2aWRlZCBieSAxMDI0IHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMU09VUkNFICBQTEwgYW5kIFBMTFNBSTEgZW50cnkgY2xvY2sgc291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE5vIGNsb2NrICovCisjZGVmaW5lIExMX1JDQ19QTExTT1VSQ0VfTVNJICAgICAgICAgICAgICAgUkNDX1BMTENGR1JfUExMU1JDXzAgIC8qITwgTVNJIGNsb2NrIHNlbGVjdGVkIGFzIFBMTCBlbnRyeSBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNPVVJDRV9IU0kgICAgICAgICAgICAgICBSQ0NfUExMQ0ZHUl9QTExTUkNfMSAgLyohPCBIU0kgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBMTF9SQ0NfUExMU09VUkNFX0hTRSAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExTUkNfMSB8IFJDQ19QTExDRkdSX1BMTFNSQ18wKSAgLyohPCBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgUExMIGVudHJ5IGNsb2NrIHNvdXJjZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUNfUExMTV9ESVYgIFBMTCBhbmQgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTEwgYW5kIFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGJ5IDEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzIgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTV8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGFuZCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTE1fMSkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBMTCBhbmQgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgYnkgMyAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNCAgICAgICAgICAgICAgICAgICgoUkNDX1BMTENGR1JfUExMTV8xIHwgUkNDX1BMTENGR1JfUExMTV8wKSkgLyohPCBQTEwgYW5kIFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGJ5IDQgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzUgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTV8yKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGFuZCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExNX0RJVl82ICAgICAgICAgICAgICAgICAgKChSQ0NfUExMQ0ZHUl9QTExNXzIgfCBSQ0NfUExMQ0ZHUl9QTExNXzApKSAvKiE8IFBMTCBhbmQgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgYnkgNiAqLworI2RlZmluZSBMTF9SQ0NfUExMTV9ESVZfNyAgICAgICAgICAgICAgICAgICgoUkNDX1BMTENGR1JfUExMTV8yIHwgUkNDX1BMTENGR1JfUExMTV8xKSkgLyohPCBQTEwgYW5kIFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGJ5IDcgKi8KKyNkZWZpbmUgTExfUkNDX1BMTE1fRElWXzggICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMTSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMIGFuZCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExSX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUikKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfMiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExSX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFJfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8xfFJDQ19QTExDRkdSX1BMTFJfMCkgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfNSAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSXzIpICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExSX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFJfMnxSQ0NfUExMQ0ZHUl9QTExSXzApICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMQ0xLIChzeXN0ZW0gY2xvY2spIGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFJfRElWXzcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUl8yfFJDQ19QTExDRkdSX1BMTFJfMSkgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUl9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExSKSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTENMSyAoc3lzdGVtIGNsb2NrKSBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FQ19QTExQX0RJViAgUExMIGRpdmlzaW9uIGZhY3RvciAoUExMUCkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMiAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzQgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfNSAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMHxSQ0NfUExMQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzcgICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfOCAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMikgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA4ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl85ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDkgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEwICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzExICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEyICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzEzICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE0ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTQgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE1ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzMpICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzE2ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zKS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTcgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTggICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMTkgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzF8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjEgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjIgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMiAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjMgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzF8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMyAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjQgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8xfFJDQ19QTExDRkdSX1BMTFBfMnxSQ0NfUExMQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI0ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfM3xSQ0NfUExMQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI1ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNiAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMHxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI2ICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8yNyAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KSAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI3Ki8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzI4ICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzN8UkNDX1BMTENGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOCAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMjkgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOSAqLworI2RlZmluZSBMTF9SQ0NfUExMUF9ESVZfMzAgICAgICAgICAgICAgICAgIChSQ0NfUExMQ0ZHUl9QTExQXzB8UkNDX1BMTENGR1JfUExMUF8yfFJDQ19QTExDRkdSX1BMTFBfM3xSQ0NfUExMQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDMwICovCisjZGVmaW5lIExMX1JDQ19QTExQX0RJVl8zMSAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFBfRElWXzMyICAgICAgICAgICAgICAgICAoUkNDX1BMTENGR1JfUExMUF8wfFJDQ19QTExDRkdSX1BMTFBfMXxSQ0NfUExMQ0ZHUl9QTExQXzJ8UkNDX1BMTENGR1JfUExMUF8zfFJDQ19QTExDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFFfRElWICBQTEwgZGl2aXNpb24gZmFjdG9yIChQTExRKQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl8yICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSAyICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSAzICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl80ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMXxSQ0NfUExMQ0ZHUl9QTExRXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA0ICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl81ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMikgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA1ICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMnxSQ0NfUExMQ0ZHUl9QTExRXzApIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl83ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFFfMnxSQ0NfUExMQ0ZHUl9QTExRXzEpIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA3ICovCisjZGVmaW5lIExMX1JDQ19QTExRX0RJVl84ICAgICAgICAgICAgICAgICAgKFJDQ19QTExDRkdSX1BMTFEpICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRIG91dHB1dCBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFNBSTFRICBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciAoUExMUSkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVFfRElWXzIgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVEgb3V0cHV0IGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFRX0RJVl8zICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSTFRIG91dHB1dCBieSAzICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUV9ESVZfNCAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExRXzEgfCBSQ0NfUExMU0FJMUNGR1JfUExMUV8wKSAgICAgICAvKiE8IFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGZvciBQTExTQUkxUSBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVFfRElWXzUgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVEgb3V0cHV0IGJ5IDUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFRX0RJVl82ICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFFfMiB8IFJDQ19QTExTQUkxQ0ZHUl9QTExRXzApICAgICAgIC8qITwgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSTFRIG91dHB1dCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUV9ESVZfNyAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExRXzIgfCBSQ0NfUExMU0FJMUNGR1JfUExMUV8xKSAgICAgICAvKiE8IFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGZvciBQTExTQUkxUSBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVFfRElWXzggICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUV8yIHwgUkNDX1BMTFNBSTFDRkdSX1BMTFFfMSB8IFJDQ19QTExTQUkxQ0ZHUl9QTExRXzApICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVEgb3V0cHV0IGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFNBSTFQICBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciAoUExMUCkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzIgICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8zICAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAzICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfNCAgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzEpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzUgICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl82ICAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzB8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMikgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfNyAgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8xfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzIpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzggICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMHxSQ0NfUExMU0FJMUNGR1JfUExMUF8xfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzIpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDggKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl85ICAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSA5ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMTAgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzMpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTAgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8xMSAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMykgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxMSAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzEyICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMHxSQ0NfUExMU0FJMUNGR1JfUExMUF8xfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzMpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDEyICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMTMgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzMpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTMgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8xNCAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzB8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMnxSQ0NfUExMU0FJMUNGR1JfUExMUF8zKS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzE1ICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMXxSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzMpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE1ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMTYgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMnxSQ0NfUExMU0FJMUNGR1JfUExMUF8zKS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxNiAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzE3ICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDE3ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMTggICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMTggKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8xOSAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfNCkgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAxOSAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzIwICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMHxSQ0NfUExMU0FJMUNGR1JfUExMUF8xfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIwICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMjEgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzQpICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8yMiAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzB8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMnxSQ0NfUExMU0FJMUNGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyMiAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzIzICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMXxSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDIzICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMjQgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMnxSQ0NfUExMU0FJMUNGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyNCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzI1ICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfM3xSQ0NfUExMU0FJMUNGR1JfUExMUF80KSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI1ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMjYgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzN8UkNDX1BMTFNBSTFDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMjYgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8yNyAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfM3xSQ0NfUExMU0FJMUNGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyNyovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMjggICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzF8UkNDX1BMTFNBSTFDRkdSX1BMTFBfM3xSQ0NfUExMU0FJMUNGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAyOCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzI5ICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMnxSQ0NfUExMU0FJMUNGR1JfUExMUF8zfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzQpLyohPCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAgb3V0cHV0IGJ5IDI5ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUF9ESVZfMzAgICAgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUF8wfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzJ8UkNDX1BMTFNBSTFDRkdSX1BMTFBfM3xSQ0NfUExMU0FJMUNGR1JfUExMUF80KS8qITwgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExQIG91dHB1dCBieSAzMCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVBfRElWXzMxICAgICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFBfMXxSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzN8UkNDX1BMTFNBSTFDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzEgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFQX0RJVl8zMiAgICAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExQXzB8UkNDX1BMTFNBSTFDRkdSX1BMTFBfMXxSQ0NfUExMU0FJMUNGR1JfUExMUF8yfFJDQ19QTExTQUkxQ0ZHUl9QTExQXzN8UkNDX1BMTFNBSTFDRkdSX1BMTFBfNCkvKiE8IE1haW4gUExMIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMUCBvdXRwdXQgYnkgMzIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VDX1BMTFNBSTFSICBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciAoUExMUikKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVJfRElWXzIgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVIgb3V0cHV0IGJ5IDIgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFSX0RJVl8zICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSTFSIG91dHB1dCBieSAzICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUl9ESVZfNCAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExSXzEgfCBSQ0NfUExMU0FJMUNGR1JfUExMUl8wKSAgICAgICAvKiE8IFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGZvciBQTExTQUkxUiBvdXRwdXQgYnkgNCAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVJfRElWXzUgICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUl8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVIgb3V0cHV0IGJ5IDUgKi8KKyNkZWZpbmUgTExfUkNDX1BMTFNBSTFSX0RJVl82ICAgICAgICAgICAgICAoUkNDX1BMTFNBSTFDRkdSX1BMTFJfMiB8IFJDQ19QTExTQUkxQ0ZHUl9QTExSXzApICAgICAgIC8qITwgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSTFSIG91dHB1dCBieSA2ICovCisjZGVmaW5lIExMX1JDQ19QTExTQUkxUl9ESVZfNyAgICAgICAgICAgICAgKFJDQ19QTExTQUkxQ0ZHUl9QTExSXzIgfCBSQ0NfUExMU0FJMUNGR1JfUExMUl8xKSAgICAgICAvKiE8IFBMTFNBSTEgZGl2aXNpb24gZmFjdG9yIGZvciBQTExTQUkxUiBvdXRwdXQgYnkgNyAqLworI2RlZmluZSBMTF9SQ0NfUExMU0FJMVJfRElWXzggICAgICAgICAgICAgIChSQ0NfUExMU0FJMUNGR1JfUExMUl8yIHwgUkNDX1BMTFNBSTFDRkdSX1BMTFJfMSB8IFJDQ19QTExTQUkxQ0ZHUl9QTExSXzApICAgLyohPCBQTExTQUkxIGRpdmlzaW9uIGZhY3RvciBmb3IgUExMU0FJMVIgb3V0cHV0IGJ5IDggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9NYWNyb3MgUkNDIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9SQ0NfV3JpdGVSZWcoX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoUkNDLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gUkNDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1JDQ19SZWFkUmVnKF9fUkVHX18pIFJFQURfUkVHKFJDQy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VNX0NBTENfRlJFUSBDYWxjdWxhdGUgZnJlcXVlbmNpZXMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTFJDTEsgZnJlcXVlbmN5IG9uIHN5c3RlbSBkb21haW4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRSICgpKTsKKyAgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gTVNJL0hTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84CisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1fXywgX19QTExOX18sIF9fUExMUl9fKSAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMTl9fKSAgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX1BMTFJfXykgPj4gUkNDX1BMTENGR1JfUExMUl9Qb3MpICsgMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTFBDTEsgZnJlcXVlbmN5IHVzZWQgb24gU0FJIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLX1NBSV9GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRQICgpKTsKKyAgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gTVNJL0hTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiBAcmV0dmFsIFBMTCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTENMS19TQUlfRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1fXywgX19QTExOX18sIF9fUExMUF9fKSAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMTl9fKSAgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKS8gXAorICAgICAgICAgICAgICAgICAgICgoKF9fUExMUF9fKSA+PiBSQ0NfUExMQ0ZHUl9QTExQX1BvcykgKyAxVSkpCisKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExQQ0xLIGZyZXF1ZW5jeSB1c2VkIG9uIEFEQyBkb21haW4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1JDQ19DQUxDX1BMTENMS19BRENfRlJFUSAoSFNFX1ZBTFVFLEByZWYgTExfUkNDX1BMTF9HZXREaXZpZGVyICgpLAorICAqICAgICAgICAgICAgIEByZWYgTExfUkNDX1BMTF9HZXROICgpLCBAcmVmIExMX1JDQ19QTExfR2V0UCAoKSk7CisgICogQHBhcmFtICBfX0lOUFVURlJFUV9fIFBMTCBJbnB1dCBmcmVxdWVuY3kgKGJhc2VkIG9uIE1TSS9IU0UvSFNJKQorICAqIEBwYXJhbSAgX19QTExNX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBfX1BMTE5fXyBCZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NgorICAqIEBwYXJhbSAgX19QTExQX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzE5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMyCisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfQURDX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFBfXykgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTE5fXykgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX1BMTFBfXykgPj4gUkNDX1BMTENGR1JfUExMUF9Qb3MpICsgMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTFFDTEsgZnJlcXVlbmN5IHVzZWQgb24gNDhNIGRvbWFpbgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfUkNDX0NBTENfUExMQ0xLXzQ4TV9GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0dldE4gKCksIEByZWYgTExfUkNDX1BMTF9HZXRRICgpKTsKKyAgKiBAcGFyYW0gIF9fSU5QVVRGUkVRX18gUExMIElucHV0IGZyZXF1ZW5jeSAoYmFzZWQgb24gTVNJL0hTRS9IU0kpCisgICogQHBhcmFtICBfX1BMTE1fXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIF9fUExMTl9fIEJldHdlZW4gTWluX0RhdGEgPSA4IGFuZCBNYXhfRGF0YSA9IDg2CisgICogQHBhcmFtICBfX1BMTFFfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl84CisgICogQHJldHZhbCBQTEwgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19QTExDTEtfNDhNX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMTl9fLCBfX1BMTFFfXykgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTE5fXykgLyAoKCgoX19QTExNX18pPj4gUkNDX1BMTENGR1JfUExMTV9Qb3MpICsgMVUpKSAvIFwKKyAgICAgICAgICAgICAgICAgICAoKChfX1BMTFFfXykgPj4gUkNDX1BMTENGR1JfUExMUV9Qb3MpICsgMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIFBMTFNBSTFQQ0xLIGZyZXF1ZW5jeSB1c2VkIGZvciBTQUkgZG9tYWluCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExTQUkxX1NBSV9GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMU0FJMV9HZXROICgpLCBAcmVmIExMX1JDQ19QTExTQUkxX0dldFAgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBNU0kvSFNFL0hTSSkKKyAgKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgX19QTExTQUkxTl9fIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIF9fUExMU0FJMVBfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzMyCisgICogQHJldHZhbCBQTExTQUkxIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUExMU0FJMV9TQUlfRlJFUShfX0lOUFVURlJFUV9fLCBfX1BMTE1fXywgX19QTExTQUkxTl9fLCBfX1BMTFNBSTFQX18pIFwKKyAgICAgICAgICAgICAgICAgICAoKF9fSU5QVVRGUkVRX18pICogKF9fUExMU0FJMU5fXykgIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgICgoKF9fUExMU0FJMVBfXykgPj4gUkNDX1BMTFNBSTFDRkdSX1BMTFBfUG9zKSArIDFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExTQUkxUUNMSyBmcmVxdWVuY3kgdXNlZCBvbiA0OE0gZG9tYWluCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExTQUkxXzQ4TV9GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMU0FJMV9HZXROICgpLCBAcmVmIExMX1JDQ19QTExTQUkxX0dldFEgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBNU0kvSFNFL0hTSSkKKyAgKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgX19QTExTQUkxTl9fIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIF9fUExMU0FJMVFfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfOAorICAqIEByZXR2YWwgUExMU0FJMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTFNBSTFfNDhNX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMU0FJMU5fXywgX19QTExTQUkxUV9fKSBcCisgICAgICAgICAgICAgICAgICAgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTFNBSTFOX18pIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgICgoKF9fUExMU0FJMVFfXykgPj4gUkNDX1BMTFNBSTFDRkdSX1BMTFFfUG9zKSArIDFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQTExTQUkxUkNMSyBmcmVxdWVuY3kgdXNlZCBvbiBBREMgZG9tYWluCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9SQ0NfQ0FMQ19QTExTQUkxX0FEQ19GUkVRIChIU0VfVkFMVUUsQHJlZiBMTF9SQ0NfUExMX0dldERpdmlkZXIgKCksCisgICogICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMU0FJMV9HZXROICgpLCBAcmVmIExMX1JDQ19QTExTQUkxX0dldFIgKCkpOworICAqIEBwYXJhbSAgX19JTlBVVEZSRVFfXyBQTEwgSW5wdXQgZnJlcXVlbmN5IChiYXNlZCBvbiBNU0kvSFNFL0hTSSkKKyAgKiBAcGFyYW0gIF9fUExMTV9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgX19QTExTQUkxTl9fIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIF9fUExMU0FJMVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfOAorICAqIEByZXR2YWwgUExMU0FJMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BMTFNBSTFfQURDX0ZSRVEoX19JTlBVVEZSRVFfXywgX19QTExNX18sIF9fUExMU0FJMU5fXywgX19QTExTQUkxUl9fKSBcCisgICAgICAgICAgICAgICAgICAgKChfX0lOUFVURlJFUV9fKSAqIChfX1BMTFNBSTFOX18pIC8gKCgoKF9fUExMTV9fKT4+IFJDQ19QTExDRkdSX1BMTE1fUG9zKSArIDFVKSkgLyBcCisgICAgICAgICAgICAgICAgICAgICgoKF9fUExMU0FJMVJfXykgPj4gUkNDX1BMTFNBSTFDRkdSX1BMTFJfUG9zKSArIDFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBIQ0xLMSBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fU1lTQ0xLRlJFUV9fIFNZU0NMSyBmcmVxdWVuY3kgKGJhc2VkIG9uIE1TSS9IU0UvSFNJL1BMTENMSykKKyAgKiBAcGFyYW0gIF9fQ1BVMVBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICogQHJldHZhbCBIQ0xLMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX0hDTEsxX0ZSRVEoX19TWVNDTEtGUkVRX18sX19DUFUxUFJFU0NBTEVSX18pICgoX19TWVNDTEtGUkVRX18pIC8gQUhCUHJlc2NUYWJsZVsoKF9fQ1BVMVBSRVNDQUxFUl9fKSAmIFJDQ19DRkdSX0hQUkUpID4+ICBSQ0NfQ0ZHUl9IUFJFX1Bvc10pCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgSENMSzIgZnJlcXVlbmN5CisgICogQHBhcmFtICBfX1NZU0NMS0ZSRVFfXyBTWVNDTEsgZnJlcXVlbmN5IChiYXNlZCBvbiBNU0kvSFNFL0hTSS9QTExDTEspCisgICogQHBhcmFtICBfX0NQVTJQUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqIEByZXR2YWwgSENMSzIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19IQ0xLMl9GUkVRKF9fU1lTQ0xLRlJFUV9fLCBfX0NQVTJQUkVTQ0FMRVJfXykgKChfX1NZU0NMS0ZSRVFfXykgLyBBSEJQcmVzY1RhYmxlWygoX19DUFUyUFJFU0NBTEVSX18pICYgUkNDX0VYVENGR1JfQzJIUFJFKSA+PiAgUkNDX0VYVENGR1JfQzJIUFJFX1Bvc10pCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgSENMSzQgZnJlcXVlbmN5CisgICogQHBhcmFtICBfX1NZU0NMS0ZSRVFfXyBTWVNDTEsgZnJlcXVlbmN5IChiYXNlZCBvbiBNU0kvSFNFL0hTSS9QTExDTEspCisgICogQHBhcmFtICBfX0FIQjRQUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqIEByZXR2YWwgSENMSzQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19IQ0xLNF9GUkVRKF9fU1lTQ0xLRlJFUV9fLCBfX0FIQjRQUkVTQ0FMRVJfXykgKChfX1NZU0NMS0ZSRVFfXykgLyBBSEJQcmVzY1RhYmxlWygoKF9fQUhCNFBSRVNDQUxFUl9fKSA+PiA0VSkgJiBSQ0NfRVhUQ0ZHUl9TSERIUFJFKSA+PiAgUkNDX0VYVENGR1JfU0hESFBSRV9Qb3NdKQorCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgUENMSzEgZnJlcXVlbmN5IChBQlAxKQorICAqIEBwYXJhbSAgX19IQ0xLRlJFUV9fIEhDTEsgZnJlcXVlbmN5CisgICogQHBhcmFtICBfX0FQQjFQUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICogQHJldHZhbCBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworI2RlZmluZSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19IQ0xLRlJFUV9fLCBfX0FQQjFQUkVTQ0FMRVJfXykgKChfX0hDTEtGUkVRX18pID4+IChBUEJQcmVzY1RhYmxlWygoKF9fQVBCMVBSRVNDQUxFUl9fKSAmIFJDQ19DRkdSX1BQUkUxX01zaykgPj4gIFJDQ19DRkdSX1BQUkUxX1BvcyldICYgMzFVKSkKKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY2FsY3VsYXRlIHRoZSBQQ0xLMiBmcmVxdWVuY3kgKEFCUDIpCisgICogQHBhcmFtICBfX0hDTEtGUkVRX18gSENMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIF9fQVBCMlBSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKiBAcmV0dmFsIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCisjZGVmaW5lIF9fTExfUkNDX0NBTENfUENMSzJfRlJFUShfX0hDTEtGUkVRX18sIF9fQVBCMlBSRVNDQUxFUl9fKSAoKF9fSENMS0ZSRVFfXykgPj4gKEFQQlByZXNjVGFibGVbKCgoX19BUEIyUFJFU0NBTEVSX18pICYgUkNDX0NGR1JfUFBSRTJfTXNrKSA+PiAgUkNDX0NGR1JfUFBSRTJfUG9zKV0gJiAzMVUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjYWxjdWxhdGUgdGhlIE1TSSBmcmVxdWVuY3kgKGluIEh6KQorICAqIEBub3RlIF9fTVNJUkFOR0VfX2NhbiBiZSByZXRyaWV2ZWQgYnkgQHJlZiBMTF9SQ0NfTVNJX0dldFJhbmdlKCkKKyAgKiBAcGFyYW0gIF9fTVNJUkFOR0VfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzExCisgICogQHJldHZhbCBNU0kgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KKyNkZWZpbmUgX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShfX01TSVJBTkdFX18pIE1TSVJhbmdlVGFibGVbKChfX01TSVJBTkdFX18pICYgUkNDX0NSX01TSVJBTkdFX01zaykgPj4gUkNDX0NSX01TSVJBTkdFX1Bvc10KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUkNDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTRSBIU0UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0Ugc3lzY2xrIGFuZCBwbGwgcHJlc2NhbGVyIGRpdmlzaW9uIGJ5IDIKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VQUkUgICAgICAgIExMX1JDQ19IU0VfRW5hYmxlRGl2MgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVEaXYyKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTRVBSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0Ugc3lzY2xrIGFuZCBwbGwgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFUFJFICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVEaXYyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGVEaXYyKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUFJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSFNFIHN5c2NsayBhbmQgcGxsIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRVBSRSAgICAgICAgTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VQUkUpID09IChSQ0NfQ1JfSFNFUFJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENTU09OICAgICAgICAgTExfUkNDX0hTRV9FbmFibGVDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0VfRW5hYmxlQ1NTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0NTU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIGV4dGVybmFsIG9zY2lsbGF0b3IgKEhTRSBCeXBhc3MpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFQllQICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGVCeXBhc3Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFQllQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTRSBleHRlcm5hbCBvc2NpbGxhdG9yIChIU0UgQnlwYXNzKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRUJZUCAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlQnlwYXNzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VCWVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0UgY3J5c3RhbCBvc2NpbGxhdG9yIChIU0UgT04pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNFT04gICAgICAgICBMTF9SQ0NfSFNFX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNFIGNyeXN0YWwgb3NjaWxsYXRvciAoSFNFIE9OKQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTRU9OICAgICAgICAgTExfUkNDX0hTRV9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNFIG9zY2lsbGF0b3IgUmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0VSRFkgICAgICAgIExMX1JDQ19IU0VfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0VfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNFUkRZKSA9PSAoUkNDX0NSX0hTRVJEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0UgY2xvY2sgY29udHJvbCByZWdpc3RlciBpcyBsb2NrZWQgb3Igbm90CisgICogQHJtdG9sbCBIU0VDUiAgICAgICAgICAgVU5MT0NLRUQgICAgICAgIExMX1JDQ19IU0VfSXNDbG9ja0NvbnRyb2xMb2NrZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNFX0lzQ2xvY2tDb250cm9sTG9ja2VkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+SFNFQ1IsIFJDQ19IU0VDUl9VTkxPQ0tFRCkgIT0gKFJDQ19IU0VDUl9VTkxPQ0tFRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSFNFIGNhcGFjaXRvciB0dW5pbmcKKyAgKiBAcm10b2xsIEhTRUNSICAgICAgICBIU0VUVU5FICAgICAgIExMX1JDQ19IU0VfU2V0Q2FwYWNpdG9yVHVuaW5nCisgICogQHBhcmFtICBWYWx1ZSBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA2MworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9TZXRDYXBhY2l0b3JUdW5pbmcodWludDMyX3QgVmFsdWUpCit7CisgIFdSSVRFX1JFRyhSQ0MtPkhTRUNSLCBIU0VfQ09OVFJPTF9VTkxPQ0tfS0VZKTsKKyAgTU9ESUZZX1JFRyhSQ0MtPkhTRUNSLCBSQ0NfSFNFQ1JfSFNFVFVORSwgVmFsdWUgPDwgUkNDX0hTRUNSX0hTRVRVTkVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSFNFIGNhcGFjaXRvciB0dW5pbmcKKyAgKiBAcm10b2xsIEhTRUNSICAgICAgICBIU0VUVU5FICAgICAgIExMX1JDQ19IU0VfR2V0Q2FwYWNpdG9yVHVuaW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSA2MworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0VfR2V0Q2FwYWNpdG9yVHVuaW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SFNFQ1IsIFJDQ19IU0VDUl9IU0VUVU5FKSA+PiBSQ0NfSFNFQ1JfSFNFVFVORV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBIU0UgY3VycmVudCBjb250cm9sCisgICogQHJtdG9sbCBIU0VDUiAgICAgICAgSFNFR01DICAgICAgIExMX1JDQ19IU0VfU2V0Q3VycmVudENvbnRyb2wKKyAgKiBAcGFyYW0gIEN1cnJlbnRNYXggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF83CisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNFX1NldEN1cnJlbnRDb250cm9sKHVpbnQzMl90IEN1cnJlbnRNYXgpCit7CisgIFdSSVRFX1JFRyhSQ0MtPkhTRUNSLCBIU0VfQ09OVFJPTF9VTkxPQ0tfS0VZKTsKKyAgTU9ESUZZX1JFRyhSQ0MtPkhTRUNSLCBSQ0NfSFNFQ1JfSFNFR01DLCBDdXJyZW50TWF4KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSFNFIGN1cnJlbnQgY29udHJvbAorICAqIEBybXRvbGwgSFNFQ1IgICAgICAgIEhTRUdNQyAgICAgICBMTF9SQ0NfSFNFX0dldEN1cnJlbnRDb250cm9sCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFX0NVUlJFTlRNQVhfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19IU0VfQ1VSUkVOVE1BWF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzcKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNFX0dldEN1cnJlbnRDb250cm9sKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SFNFQ1IsIFJDQ19IU0VDUl9IU0VHTUMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgSFNFIHNlbnNlIGFtcGxpZmllciB0aHJlc2hvbGQKKyAgKiBAcm10b2xsIEhTRUNSICAgICAgICBIU0VTICAgICAgIExMX1JDQ19IU0VfU2V0U2Vuc2VBbXBsaWZpZXIKKyAgKiBAcGFyYW0gIFNlbnNlQW1wbGlmaWVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRUFNUFRIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFQU1QVEhSRVNIT0xEXzNfNAorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTRV9TZXRTZW5zZUFtcGxpZmllcih1aW50MzJfdCBTZW5zZUFtcGxpZmllcikKK3sKKyAgV1JJVEVfUkVHKFJDQy0+SFNFQ1IsIEhTRV9DT05UUk9MX1VOTE9DS19LRVkpOworICBNT0RJRllfUkVHKFJDQy0+SFNFQ1IsIFJDQ19IU0VDUl9IU0VTLCBTZW5zZUFtcGxpZmllcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhTRSBjdXJyZW50IGNvbnRyb2wKKyAgKiBAcm10b2xsIEhTRUNSICAgICAgICBIU0VTICAgICAgIExMX1JDQ19IU0VfR2V0U2Vuc2VBbXBsaWZpZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0hTRUFNUFRIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSFNFQU1QVEhSRVNIT0xEXzNfNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0VfR2V0U2Vuc2VBbXBsaWZpZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5IU0VDUiwgUkNDX0hTRUNSX0hTRVMpKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0hTSSBIU0kKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgZXZlbiBpbiBzdG9wIG1vZGUKKyAgKiBAbm90ZSBIU0kgb3NjaWxsYXRvciBpcyBmb3JjZWQgT04gZXZlbiBpbiBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRW5hYmxlSW5TdG9wTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0hTSV9FbmFibGVJblN0b3BNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSBpbiBzdG9wIG1vZGUKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lLRVJPTiAgICAgIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZUluU3RvcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lLRVJPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJIGluIHN0b3AgbW9kZSBpcyByZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSUtFUk9OICAgICAgICBMTF9SQ0NfSFNJX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSFNJX0lzRW5hYmxlZEluU3RvcE1vZGUodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUtFUk9OKSA9PSAoUkNDX0NSX0hTSUtFUk9OKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0kgb3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSU9OICAgICAgICAgTExfUkNDX0hTSV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSBvc2NpbGxhdG9yCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSFNJT04gICAgICAgICBMTF9SQ0NfSFNJX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0kgY2xvY2sgaXMgcmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBIU0lSRFkgICAgICAgIExMX1JDQ19IU0lfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0lfSXNSZWFkeSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJUkRZKSA9PSAoUkNDX0NSX0hTSVJEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNJIEF1dG9tYXRpYyBmcm9tIHN0b3AgbW9kZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSUFTRlMgICAgICAgTExfUkNDX0hTSV9FbmFibGVBdXRvRnJvbVN0b3AKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfRW5hYmxlQXV0b0Zyb21TdG9wKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX0hTSUFTRlMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNJIEF1dG9tYXRpYyBmcm9tIHN0b3AgbW9kZQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEhTSUFTRlMgICAgICAgTExfUkNDX0hTSV9EaXNhYmxlQXV0b0Zyb21TdG9wCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJX0Rpc2FibGVBdXRvRnJvbVN0b3Aodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9IU0lBU0ZTKTsKK30KKy8qKgorICAqIEBicmllZiAgR2V0IEhTSSBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBub3RlIFdoZW4gSFNJVFJJTSBpcyB3cml0dGVuLCBIU0lDQUwgaXMgdXBkYXRlZCB3aXRoIHRoZSBzdW0gb2YKKyAgKiAgICAgICBIU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgSFNJQ0FMICAgICAgICBMTF9SQ0NfSFNJX0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0hTSV9HZXRDYWxpYnJhdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJQ0FMKSA+PiBSQ0NfSUNTQ1JfSFNJQ0FMX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEhTSSBDYWxpYnJhdGlvbiB0cmltbWluZworICAqIEBub3RlIHVzZXItcHJvZ3JhbW1hYmxlIHRyaW1taW5nIHZhbHVlIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEhTSUNBTAorICAqIEBub3RlIERlZmF1bHQgdmFsdWUgaXMgNjQsIHdoaWNoLCB3aGVuIGFkZGVkIHRvIHRoZSBIU0lDQUwgdmFsdWUsCisgICogICAgICAgc2hvdWxkIHRyaW0gdGhlIEhTSSB0byAxNiBNSHogKy8tIDEgJQorICAqIEBybXRvbGwgSUNTQ1IgICAgICAgIEhTSVRSSU0gICAgICAgTExfUkNDX0hTSV9TZXRDYWxpYlRyaW1taW5nCisgICogQHBhcmFtICBWYWx1ZSBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMjcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0lfU2V0Q2FsaWJUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJVFJJTSwgVmFsdWUgPDwgUkNDX0lDU0NSX0hTSVRSSU1fUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSFNJIENhbGlicmF0aW9uIHRyaW1taW5nCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgSFNJVFJJTSAgICAgICBMTF9SQ0NfSFNJX0dldENhbGliVHJpbW1pbmcKKyAgKiBAcmV0dmFsIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEyNworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0lfR2V0Q2FsaWJUcmltbWluZyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPklDU0NSLCBSQ0NfSUNTQ1JfSFNJVFJJTSkgPj4gUkNDX0lDU0NSX0hTSVRSSU1fUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfSFNJNDggSFNJNDgKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBIU0k0OAorICAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhPTiAgICAgICBMTF9SQ0NfSFNJNDhfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfSFNJNDhfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUlJDUiwgUkNDX0NSUkNSX0hTSTQ4T04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSFNJNDgKKyAgKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4T04gICAgICAgTExfUkNDX0hTSTQ4X0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19IU0k0OF9EaXNhYmxlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSFNJNDggb3NjaWxsYXRvciBSZWFkeQorICAqIEBybXRvbGwgQ1JSQ1IgICAgICAgICAgSFNJNDhSRFkgICAgICBMTF9SQ0NfSFNJNDhfSXNSZWFkeQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0k0OF9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1JSQ1IsIFJDQ19DUlJDUl9IU0k0OFJEWSkgPT0gKFJDQ19DUlJDUl9IU0k0OFJEWSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSFNJNDggQ2FsaWJyYXRpb24gdmFsdWUKKyAgKiBAcm10b2xsIENSUkNSICAgICAgICAgIEhTSTQ4Q0FMICAgICAgTExfUkNDX0hTSTQ4X0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDFGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19IU0k0OF9HZXRDYWxpYnJhdGlvbih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNSUkNSLCBSQ0NfQ1JSQ1JfSFNJNDhDQUwpID4+IFJDQ19DUlJDUl9IU0k0OENBTF9Qb3MpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9MU0UgTFNFCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgIExvdyBTcGVlZCBFeHRlcm5hbCAoTFNFKSBjcnlzdGFsLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRU9OICAgICAgICAgTExfUkNDX0xTRV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgTG93IFNwZWVkIEV4dGVybmFsIChMU0UpIGNyeXN0YWwuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFT04gICAgICAgICBMTF9SQ0NfTFNFX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTG93IFNwZWVkIEV4dGVybmFsIChMU0UpIGNyeXN0YWwgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VPTiAgICAgICAgIExMX1JDQ19MU0VfSXNFbmFibGVkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc0VuYWJsZWQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VPTikgPT0gKFJDQ19CRENSX0xTRU9OKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBleHRlcm5hbCBjbG9jayBzb3VyY2UgKExTRSBieXBhc3MpLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUJZUCAgICAgICAgTExfUkNDX0xTRV9FbmFibGVCeXBhc3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfRW5hYmxlQnlwYXNzKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VCWVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXh0ZXJuYWwgY2xvY2sgc291cmNlIChMU0UgYnlwYXNzKS4KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VCWVAgICAgICAgIExMX1JDQ19MU0VfRGlzYWJsZUJ5cGFzcworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9EaXNhYmxlQnlwYXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUJZUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExTRSBvc2NpbGxhdG9yIGRyaXZlIGNhcGFiaWxpdHkKKyAgKiBAbm90ZSBUaGUgb3NjaWxsYXRvciBpcyBpbiBYdGFsIG1vZGUgd2hlbiBpdCBpcyBub3QgaW4gYnlwYXNzIG1vZGUuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFRFJWICAgICAgICBMTF9SQ0NfTFNFX1NldERyaXZlQ2FwYWJpbGl0eQorICAqIEBwYXJhbSAgTFNFRHJpdmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUxPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9NRURJVU1ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0VfU2V0RHJpdmVDYXBhYmlsaXR5KHVpbnQzMl90IExTRURyaXZlKQoreworICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWLCBMU0VEcml2ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IExTRSBvc2NpbGxhdG9yIGRyaXZlIGNhcGFiaWxpdHkKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0VEUlYgICAgICAgIExMX1JDQ19MU0VfR2V0RHJpdmVDYXBhYmlsaXR5CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MU0VEUklWRV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfTUVESVVNTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTRURSSVZFX01FRElVTUhJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNFRFJJVkVfSElHSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0VfR2V0RHJpdmVDYXBhYmlsaXR5KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFRFJWKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBvbiBMU0UuCisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFQ1NTT04gICAgICBMTF9SQ0NfTFNFX0VuYWJsZUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTRV9FbmFibGVDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTRUNTU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBvbiBMU0UuCisgICogQG5vdGUgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGNhbiBiZSBkaXNhYmxlZCBvbmx5IGFmdGVyIGEgTFNFCisgICogICAgICAgZmFpbHVyZSBkZXRlY3Rpb24uIEluIHRoYXQgY2FzZSBpdCBNVVNUIGJlIGRpc2FibGVkIGJ5IHNvZnR3YXJlLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU09OICAgICAgTExfUkNDX0xTRV9EaXNhYmxlQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNFX0Rpc2FibGVDU1Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSBvc2NpbGxhdG9yIFJlYWR5CisgICogQHJtdG9sbCBCRENSICAgICAgICAgTFNFUkRZICAgICAgICBMTF9SQ0NfTFNFX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNFX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9MU0VSRFkpID09IChSQ0NfQkRDUl9MU0VSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ1NTIG9uIExTRSBmYWlsdXJlIERldGVjdGlvbgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTRUNTU0QgICAgICAgTExfUkNDX0xTRV9Jc0NTU0RldGVjdGVkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0xTRV9Jc0NTU0RldGVjdGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNFQ1NTRCkgPT0gKFJDQ19CRENSX0xTRUNTU0QpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0xTSTEgTFNJMQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSTEgT3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTFPTiAgICAgICAgIExMX1JDQ19MU0kxX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTSTFfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJMU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSTEgT3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTFPTiAgICAgICAgIExMX1JDQ19MU0kxX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0kxX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSTFPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFNJMSBpcyBSZWFkeQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTFSRFkgICAgICAgIExMX1JDQ19MU0kxX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNJMV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSTFSRFkpID09IChSQ0NfQ1NSX0xTSTFSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0xTSTIgTFNJMgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSTIgT3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTJPTiAgICAgICAgIExMX1JDQ19MU0kyX0VuYWJsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTSTJfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFNJMk9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSTIgT3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTJPTiAgICAgICAgIExMX1JDQ19MU0kyX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0kyX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSTJPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFNJMiBpcyBSZWFkeQorICAqIEBybXRvbGwgQ1NSICAgICAgICAgIExTSTJSRFkgICAgICAgIExMX1JDQ19MU0kyX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTFNJMl9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSTJSRFkpID09IChSQ0NfQ1NSX0xTSTJSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IExTSTIgdHJpbW1pbmcgdmFsdWUKKyAgKiBAcm10b2xsIENTUiAgICAgICAgTFNJMlRSSU0gICAgICAgTExfUkNDX0xTSTJfU2V0VHJpbW1pbmcKKyAgKiBAcGFyYW0gIFZhbHVlIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNJMl9TZXRUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNTUiwgUkNDX0NTUl9MU0kyVFJJTSwgVmFsdWUgPDwgUkNDX0NTUl9MU0kyVFJJTV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBMU0kyIHRyaW1taW5nIHZhbHVlCisgICogQHJtdG9sbCBDU1IgICAgICAgIExTSTJUUklNICAgICAgIExMX1JDQ19MU0kyX0dldFRyaW1taW5nCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0kyX0dldFRyaW1taW5nKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0xTSTJUUklNKSA+PiBSQ0NfQ1NSX0xTSTJUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX01TSSBNU0kKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBNU0kgb3NjaWxsYXRvcgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1TSU9OICAgICAgICAgTExfUkNDX01TSV9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19NU0lfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX01TSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE1TSSBvc2NpbGxhdG9yCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTVNJT04gICAgICAgICBMTF9SQ0NfTVNJX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19NU0lfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DUiwgUkNDX0NSX01TSU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBNU0kgb3NjaWxsYXRvciBSZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1TSVJEWSAgICAgICAgTExfUkNDX01TSV9Jc1JlYWR5CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX01TSV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9NU0lSRFkpID09IChSQ0NfQ1JfTVNJUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBNU0kgUExMLW1vZGUgKEhhcmR3YXJlIGF1dG8gY2FsaWJyYXRpb24gd2l0aCBMU0UpCisgICogQG5vdGUgTVNJUExMRU4gbXVzdCBiZSBlbmFibGVkIGFmdGVyIExTRSBpcyBlbmFibGVkIChMU0VPTiBlbmFibGVkKQorICAqICAgICAgIGFuZCByZWFkeSAoTFNFUkRZIHNldCBieSBoYXJkd2FyZSkKKyAgKiBAbm90ZSBoYXJkd2FyZSBwcm90ZWN0aW9uIHRvIGF2b2lkIGVuYWJsaW5nIE1TSVBMTEVOIGlmIExTRSBpcyBub3QKKyAgKiAgICAgICByZWFkeQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1TSVBMTEVOICAgICAgTExfUkNDX01TSV9FbmFibGVQTExNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTVNJX0VuYWJsZVBMTE1vZGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfTVNJUExMRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTVNJLVBMTCBtb2RlCisgICogQG5vdGUgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIExTRSBpcyBkaXNhYmxlZCAoTFNFT04gPSAwKSBvciB3aGVuCisgICogICAgICAgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBvbiBMU0UgZGV0ZWN0cyBhIExTRSBmYWlsdXJlCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTVNJUExMRU4gICAgICBMTF9SQ0NfTVNJX0Rpc2FibGVQTExNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTVNJX0Rpc2FibGVQTExNb2RlKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfTVNJUExMRU4pOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBJbnRlcm5hbCBNdWx0aSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNsb2NrIHJhbmdlIGluIHJ1biBtb2RlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIE1TSVJBTkdFICAgICAgTExfUkNDX01TSV9TZXRSYW5nZQorICAqIEBwYXJhbSAgUmFuZ2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8xMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX01TSV9TZXRSYW5nZSh1aW50MzJfdCBSYW5nZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNSLCBSQ0NfQ1JfTVNJUkFOR0UsIFJhbmdlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIEludGVybmFsIE11bHRpIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2xvY2sgcmFuZ2UgaW4gcnVuIG1vZGUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgTVNJUkFOR0UgICAgICBMTF9SQ0NfTVNJX0dldFJhbmdlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTVNJUkFOR0VfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NU0lSQU5HRV85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01TSVJBTkdFXzExCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX01TSV9HZXRSYW5nZSh2b2lkKQoreworICB1aW50MzJfdCBtc2lSYW5nZSA9IFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9NU0lSQU5HRSk7CisgIGlmKG1zaVJhbmdlID4gTExfUkNDX01TSVJBTkdFXzExKQorICB7CisgICAgbXNpUmFuZ2UgPSBMTF9SQ0NfTVNJUkFOR0VfMTE7CisgIH0KKyAgcmV0dXJuIG1zaVJhbmdlOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IE1TSSBDYWxpYnJhdGlvbiB2YWx1ZQorICAqIEBub3RlIFdoZW4gTVNJVFJJTSBpcyB3cml0dGVuLCBNU0lDQUwgaXMgdXBkYXRlZCB3aXRoIHRoZSBzdW0gb2YKKyAgKiAgICAgICBNU0lUUklNIGFuZCB0aGUgZmFjdG9yeSB0cmltIHZhbHVlCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgTVNJQ0FMICAgICAgICBMTF9SQ0NfTVNJX0dldENhbGlicmF0aW9uCisgICogQHJldHZhbCBCZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyNTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTVNJX0dldENhbGlicmF0aW9uKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9NU0lDQUwpID4+IFJDQ19JQ1NDUl9NU0lDQUxfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTVNJIENhbGlicmF0aW9uIHRyaW1taW5nCisgICogQG5vdGUgdXNlci1wcm9ncmFtbWFibGUgdHJpbW1pbmcgdmFsdWUgdGhhdCBpcyBhZGRlZCB0byB0aGUgTVNJQ0FMCisgICogQHJtdG9sbCBJQ1NDUiAgICAgICAgTVNJVFJJTSAgICAgICBMTF9SQ0NfTVNJX1NldENhbGliVHJpbW1pbmcKKyAgKiBAcGFyYW0gIFZhbHVlIEJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDI1NQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX01TSV9TZXRDYWxpYlRyaW1taW5nKHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKFJDQy0+SUNTQ1IsIFJDQ19JQ1NDUl9NU0lUUklNLCBWYWx1ZSA8PCBSQ0NfSUNTQ1JfTVNJVFJJTV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNU0kgQ2FsaWJyYXRpb24gdHJpbW1pbmcKKyAgKiBAcm10b2xsIElDU0NSICAgICAgICBNU0lUUklNICAgICAgIExMX1JDQ19NU0lfR2V0Q2FsaWJUcmltbWluZworICAqIEByZXR2YWwgQmV0d2VlbiAwIGFuZCAyNTUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfTVNJX0dldENhbGliVHJpbW1pbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5JQ1NDUiwgUkNDX0lDU0NSX01TSVRSSU0pID4+IFJDQ19JQ1NDUl9NU0lUUklNX1Bvcyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0xTQ08gTFNDTworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExvdyBzcGVlZCBjbG9jaworICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09FTiAgICAgICAgTExfUkNDX0xTQ09fRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfTFNDT19FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMb3cgc3BlZWQgY2xvY2sKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPRU4gICAgICAgIExMX1JDQ19MU0NPX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19MU0NPX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTG93IHNwZWVkIGNsb2NrIHNlbGVjdGlvbgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIExTQ09TRUwgICAgICAgTExfUkNDX0xTQ09fU2V0U291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0xTQ09fU2V0U291cmNlKHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09TRUwsIFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IExvdyBzcGVlZCBjbG9jayBzZWxlY3Rpb24KKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBMU0NPU0VMICAgICAgIExMX1JDQ19MU0NPX0dldFNvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFNDT19DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xTQ09fQ0xLU09VUkNFX0xTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19MU0NPX0dldFNvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09TRUwpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfU3lzdGVtIFN5c3RlbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgU1cgICAgICAgICAgICBMTF9SQ0NfU2V0U3lzQ2xrU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9IU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9QTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRTeXNDbGtTb3VyY2UodWludDMyX3QgU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1csIFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgU1dTICAgICAgICAgICBMTF9SQ0NfR2V0U3lzQ2xrU291cmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX0hTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0U3lzQ2xrU291cmNlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfU1dTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSRiBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIEVYVENGR1IgICAgICAgICBSRkNTUyAgICAgICAgICAgTExfUkNDX0dldFJGQ2xvY2tTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JGX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUkZfQ0xLU09VUkNFX0hTRV9ESVYyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFJGQ2xvY2tTb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5FWFRDRkdSLCBSQ0NfRVhUQ0ZHUl9SRkNTUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBSRiBXYWtldXAgQ2xvY2sgU291cmNlCisgICogQHJtdG9sbCBDU1IgICAgICAgICBSRldLUFNFTCAgICAgICAgTExfUkNDX1NldFJGV0tQQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0hTRV9ESVYxMDI0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0UkZXS1BDbG9ja1NvdXJjZSh1aW50MzJfdCBTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DU1IsIFJDQ19DU1JfUkZXS1BTRUwsIFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJGIFdha2V1cCBDbG9jayBTb3VyY2UKKyAgKiBAcm10b2xsIENTUiAgICAgICAgIFJGV0tQU0VMICAgICAgICBMTF9SQ0NfR2V0UkZXS1BDbG9ja1NvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9IU0VfRElWMTAyNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSRldLUENsb2NrU291cmNlKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1JGV0tQU0VMKSk7Cit9CisKKyAgLyoqCisgICAgKiBAYnJpZWYgIENoZWNrIGlmIFJhZGlvIFN5c3RlbSBpcyByZXNldC4KKyAgICAqIEBybXRvbGwgQ1NSICAgICAgICAgIFJGUlNUUyAgICAgICBMTF9SQ0NfSXNSRlVuZGVyUmVzZXQKKyAgICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzUkZVbmRlclJlc2V0KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1JGUlNUUykgPT0gKFJDQ19DU1JfUkZSU1RTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBSEIgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgSFBSRSAgICAgICAgICBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBSEJQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ1BVMiBBSEIgcHJlc2NhbGVyCisgICogQHJtdG9sbCBFWFRDRkdSICAgICAgICAgQzJIUFJFICAgICAgICAgIExMX0MyX1JDQ19TZXRBSEJQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzI1NgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUxMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfUkNDX1NldEFIQlByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5FWFRDRkdSLCBSQ0NfRVhUQ0ZHUl9DMkhQUkUsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFIQjQgcHJlc2NhbGVyCisgICogQHJtdG9sbCBFWFRDRkdSICAgICAgICAgU0hESFBSRSAgICAgICAgICBMTF9SQ0NfU2V0QUhCNFByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QUhCNFByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5FWFRDRkdSLCBSQ0NfRVhUQ0ZHUl9TSERIUFJFLCBQcmVzY2FsZXIgPj4gNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFQQjEgcHJlc2NhbGVyCisgICogQHJtdG9sbCBDRkdSICAgICAgICAgUFBSRTEgICAgICAgICBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcgorICAqIEBwYXJhbSAgUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfMTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRBUEIxUHJlc2NhbGVyKHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUxLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBUEIyIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0QVBCMlByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUhCIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIEhQUkUgICAgICAgICAgTExfUkNDX0dldEFIQlByZXNjYWxlcgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8xMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl81MTIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfSFBSRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDMiBBSEIgcHJlc2NhbGVyCisgICogQHJtdG9sbCBFWFRDRkdSICAgICAgICAgQzJIUFJFICAgICAgICAgIExMX0MyX1JDQ19HZXRBSEJQcmVzY2FsZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfQzJfUkNDX0dldEFIQlByZXNjYWxlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkVYVENGR1IsIFJDQ19FWFRDRkdSX0MySFBSRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBSEI0IHByZXNjYWxlcgorICAqIEBybXRvbGwgRVhUQ0ZHUiAgICAgICAgIFNIREhQUkUgICAgICAgICAgTExfUkNDX0dldEFIQjRQcmVzY2FsZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1lTQ0xLX0RJVl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TWVNDTEtfRElWXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfMjU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NZU0NMS19ESVZfNTEyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFIQjRQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5FWFRDRkdSLCBSQ0NfRVhUQ0ZHUl9TSERIUFJFKSA8PCA0KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQVBCMSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMSAgICAgICAgIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIxX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjFfRElWXzE2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEFQQjFQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBUEIyIHByZXNjYWxlcgorICAqIEBybXRvbGwgQ0ZHUiAgICAgICAgIFBQUkUyICAgICAgICAgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BUEIyX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FQQjJfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQVBCMl9ESVZfMTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENsb2NrIEFmdGVyIFdha2UtVXAgRnJvbSBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTVE9QV1VDSyAgICAgIExMX1JDQ19TZXRDbGtBZnRlcldha2VGcm9tU3RvcAorICAqIEBwYXJhbSAgQ2xvY2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19IU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRDbGtBZnRlcldha2VGcm9tU3RvcCh1aW50MzJfdCBDbG9jaykKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1NUT1BXVUNLLCBDbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENsb2NrIEFmdGVyIFdha2UtVXAgRnJvbSBTdG9wIG1vZGUKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBTVE9QV1VDSyAgICAgIExMX1JDQ19HZXRDbGtBZnRlcldha2VGcm9tU3RvcAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU1RPUF9XQUtFVVBDTE9DS19IU0kKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Q2xrQWZ0ZXJXYWtlRnJvbVN0b3Aodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9TVE9QV1VDSykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9TTVBTIFNNUFMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgU01QU0NSICAgICAgICBTTVBTU0VMICAgICBMTF9SQ0NfU2V0U01QU0Nsb2NrU291cmNlCisgICogQHBhcmFtICBTTVBTU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9NU0kgKCopCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfQ0xLU09VUkNFX0hTRQorICAqIEBub3RlICAgVGhlIHN5c3RlbSBtdXN0IGFsd2F5cyBiZSBjb25maWd1cmVkIHNvIGFzIHRvIGdldCBhIFNNUFMgU3RlcCBEb3duCisgICogICAgICAgICBjb252ZXJ0ZXIgY2xvY2sgZnJlcXVlbmN5IGJldHdlZW4gMiBNSHogYW5kIDggTUh6CisgICogQG5vdGUgICAoKikgVGhlIE1TSSBzaGFsbCBvbmx5IGJlIHNlbGVjdGVkIGFzIFNNUFMgU3RlcCBEb3duIGNvbnZlcnRlcgorICAqICAgICAgICAgIGNsb2NrIHNvdXJjZSB3aGVuIGEgc3VwcG9ydGVkIFNNUFMgU3RlcCBEb3duIGNvbnZlcnRlciBjbG9jaworICAqICAgICAgICAgIE1TSVJBTkdFIGlzIHNldCAoTExfUkNDX01TSVJBTkdFXzggdG8gTExfUkNDX01TSVJBTkdFXzExKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFNNUFNDbG9ja1NvdXJjZSh1aW50MzJfdCBTTVBTU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+U01QU0NSLCBSQ0NfU01QU0NSX1NNUFNTRUwsIFNNUFNTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01QUyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uCisgICogQHJtdG9sbCBTTVBTQ1IgICAgICAgICBTTVBTU0VMICAgICAgICAgICBMTF9SQ0NfR2V0U01QU0Nsb2NrU2VsZWN0aW9uCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19DTEtTT1VSQ0VfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfQ0xLU09VUkNFX0hTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRTTVBTQ2xvY2tTZWxlY3Rpb24odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5TTVBTQ1IsIFJDQ19TTVBTQ1JfU01QU1NFTCkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTTVBTIGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgU01QU0NSICAgICAgICAgU01QU1NXUyAgICAgICAgICAgTExfUkNDX0dldFNNUFNDbG9ja1NvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19DTEtTT1VSQ0VfU1RBVFVTX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0NMS1NPVVJDRV9TVEFUVVNfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19DTEtTT1VSQ0VfU1RBVFVTX05PX0NMT0NLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFNNUFNDbG9ja1NvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlNNUFNDUiwgUkNDX1NNUFNDUl9TTVBTU1dTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNNUFMgcHJlc2NhbGVyCisgICogQHJtdG9sbCBTTVBTQ1IgICAgICAgICBTTVBTRElWICAgICAgICAgIExMX1JDQ19TZXRTTVBTUHJlc2NhbGVyCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19ESVZfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19ESVZfMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldFNNUFNQcmVzY2FsZXIodWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFJDQy0+U01QU0NSLCBSQ0NfU01QU0NSX1NNUFNESVYsIFByZXNjYWxlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNNUFMgcHJlc2NhbGVyCisgICogQHJtdG9sbCBTTVBTQ1IgICAgICAgICBTTVBTRElWICAgICAgICAgIExMX1JDQ19HZXRTTVBTUHJlc2NhbGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0RJVl8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NNUFNfRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU01QU19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TTVBTX0RJVl8zCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldFNNUFNQcmVzY2FsZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5TTVBTQ1IsIFJDQ19TTVBTQ1JfU01QU0RJVikpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX01DTyBNQ08KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBNQ094CisgICogQHJtdG9sbCBDRkdSICAgICAgICAgTUNPU0VMICAgICAgICBMTF9SQ0NfQ29uZmlnTUNPXG4KKyAgKiAgICAgICAgIENGR1IgICAgICAgICBNQ09QUkUgICAgICAgIExMX1JDQ19Db25maWdNQ08KKyAgKiBAcGFyYW0gIE1DT3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9OT0NMT0NLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfSFNJNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9QTExDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMVNPVVJDRV9MU0kxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFTT1VSQ0VfTFNJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xU09VUkNFX0hTRV9CRUZPUkVfU1RBQgorICAqIEBwYXJhbSAgTUNPeFByZXNjYWxlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTUNPMV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19NQ08xX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX01DTzFfRElWXzE2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ29uZmlnTUNPKHVpbnQzMl90IE1DT3hTb3VyY2UsIHVpbnQzMl90IE1DT3hQcmVzY2FsZXIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9NQ09TRUwgfCBSQ0NfQ0ZHUl9NQ09QUkUsIE1DT3hTb3VyY2UgfCBNQ094UHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUGVyaXBoZXJhbF9DbG9ja19Tb3VyY2UgUGVyaXBoZXJhbCBDbG9jayBTb3VyY2UKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgVVNBUlQxU0VMICAgICBMTF9SQ0NfU2V0VVNBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgVVNBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfUENMSzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfVVNBUlQxU0VMLCBVU0FSVHhTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBMUFVBUlQxeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBMUFVBUlQxU0VMICAgIExMX1JDQ19TZXRMUFVBUlRDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgTFBVQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldExQVUFSVENsb2NrU291cmNlKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0xQVUFSVDFTRUwsIExQVUFSVHhTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBJMkN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEkyQ3hTRUwgICAgICAgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBJMkN4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzNfQ0xLU09VUkNFX0hTSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEkyQ0Nsb2NrU291cmNlKHVpbnQzMl90IEkyQ3hTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgKChJMkN4U291cmNlID4+IDQpICYgMHgwMDBGRjAwMFUpLCAoKEkyQ3hTb3VyY2UgPDwgNCkgJiAweDAwMEZGMDAwVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBMUFRJTXggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgTFBUSU14U0VMICAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgTFBUSU14U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldExQVElNQ2xvY2tTb3VyY2UodWludDMyX3QgTFBUSU14U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIChMUFRJTXhTb3VyY2UgJiAweEZGRkYwMDAwVSksIChMUFRJTXhTb3VyY2UgPDwgMTYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgU0FJeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBTQUkxU0VMICAgICAgIExMX1JDQ19TZXRTQUlDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgU0FJeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTExTQUkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUElOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0U0FJQ2xvY2tTb3VyY2UodWludDMyX3QgU0FJeFNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPkNDSVBSLCBSQ0NfQ0NJUFJfU0FJMVNFTCwgU0FJeFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFJORyBjbG9jayBzb3VyY2UKKyAgKiBAbm90ZSBJbiBjYXNlIG9mIENMSzQ4IGNsb2NrIHNlbGVjdGVkLCBpdCBtdXN0IGJlIGNvbmZpZ3VyZWQgZmlyc3QgdGhhbmtzIHRvIExMX1JDQ19TZXRDTEs0OENsb2NrU291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgUk5HU0VMICAgICAgTExfUkNDX1NldFJOR0Nsb2NrU291cmNlCisgICogQHBhcmFtICBSTkd4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0VfQ0xLNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9MU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRSTkdDbG9ja1NvdXJjZSh1aW50MzJfdCBSTkd4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9STkdTRUwsIFJOR3hTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDTEs0OCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBDTEs0OFNFTCAgICAgIExMX1JDQ19TZXRDTEs0OENsb2NrU291cmNlCisgICogQHBhcmFtICBDTEs0OHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX0hTSTQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9QTExTQUkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX01TSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldENMSzQ4Q2xvY2tTb3VyY2UodWludDMyX3QgQ0xLNDh4U291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+Q0NJUFIsIFJDQ19DQ0lQUl9DTEs0OFNFTCwgQ0xLNDh4U291cmNlKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0IgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfU2V0VVNCQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFVTQnhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9IU0k0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTFNBSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9NU0kKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19TZXRVU0JDbG9ja1NvdXJjZSh1aW50MzJfdCBVU0J4U291cmNlKQoreworICBMTF9SQ0NfU2V0Q0xLNDhDbG9ja1NvdXJjZShVU0J4U291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUk5HIGNsb2NrIHNvdXJjZQorICAqIEBub3RlIEFsbG93IHRvIGNvbmZpZ3VyZSB0aGUgb3ZlcmFsbCBSTkcgQ2xvY2sgc291cmNlLCBpZiBDTEs0OCBpcyBzZWxlY3RlZCBhcyBSTkcKKyAgICAgICAgICBDbG9jayBzb3VyY2UsIHRoZSBDTEs0OHhTb3VyY2UgaGFzIHRvIGJlIGNvbmZpZ3VyZWQKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBSTkdTRUwgICAgICBMTF9SQ0NfQ29uZmlnUk5HQ2xvY2tTb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBDTEs0OFNFTCAgICBMTF9SQ0NfQ29uZmlnUk5HQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFJOR3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9DTEs0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19STkdfQ0xLU09VUkNFX0xTRQorICAqIEBwYXJhbSAgQ0xLNDh4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9IU0k0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMU0FJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9NU0kKKworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NvbmZpZ1JOR0Nsb2NrU291cmNlKHVpbnQzMl90IFJOR3hTb3VyY2UsIHVpbnQzMl90IENMSzQ4eFNvdXJjZSkKK3sKKyAgaWYgKFJOR3hTb3VyY2UgPT0gTExfUkNDX1JOR19DTEtTT1VSQ0VfQ0xLNDgpCisgIHsKKyAgICBMTF9SQ0NfU2V0Q0xLNDhDbG9ja1NvdXJjZShDTEs0OHhTb3VyY2UpOworICB9CisgIExMX1JDQ19TZXRSTkdDbG9ja1NvdXJjZShSTkd4U291cmNlKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBBREMgY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQURDU0VMICAgICAgICBMTF9SQ0NfU2V0QURDQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIEFEQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTT1VSQ0VfUExMU0FJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFX1NZU0NMSworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1NldEFEQ0Nsb2NrU291cmNlKHVpbnQzMl90IEFEQ3hTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5DQ0lQUiwgUkNDX0NDSVBSX0FEQ1NFTCwgQURDeFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFVTQVJUeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBVU0FSVDFTRUwgICAgIExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlCisgICogQHBhcmFtICBVU0FSVHggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKHVpbnQzMl90IFVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgVVNBUlR4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IExQVUFSVHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgTFBVQVJUMVNFTCAgICBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVUFSVHggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1BDTEsxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfTFNFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldExQVUFSVENsb2NrU291cmNlKHVpbnQzMl90IExQVUFSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIExQVUFSVHgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSTJDeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBJMkN4U0VMICAgICAgIExMX1JDQ19HZXRJMkNDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgSTJDeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMxX0NMS1NPVVJDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19JMkMzX0NMS1NPVVJDRV9TWVNDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKHVpbnQzMl90IEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKChSRUFEX0JJVChSQ0MtPkNDSVBSLCBJMkN4KSA+PiA0KSB8IChJMkN4IDw8IDQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTFBUSU14IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIExQVElNeFNFTCAgICAgTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIExQVElNeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfUENMSzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9QQ0xLMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlKHVpbnQzMl90IExQVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfQklUKFJDQy0+Q0NJUFIsIExQVElNeCkgPj4gMTYpIHwgTFBUSU14KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU0FJeCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIENDSVBSICAgICAgICBTQUkxU0VMICAgICAgIExMX1JDQ19HZXRTQUlDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgU0FJeCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUExMU0FJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BJTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRTQUlDbG9ja1NvdXJjZSh1aW50MzJfdCBTQUl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkNDSVBSLCBTQUl4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJOR3ggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgUk5HU0VMICAgICAgTExfUkNDX0dldFJOR0Nsb2NrU291cmNlCisgICogQHBhcmFtICBSTkd4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0VfQ0xLNDgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9MU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUk5HX0NMS1NPVVJDRV9MU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Uk5HQ2xvY2tTb3VyY2UodWludDMyX3QgUk5HeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgUk5HeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBDTEs0OHggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfR2V0Q0xLNDhDbG9ja1NvdXJjZQorICAqIEBwYXJhbSAgQ0xLNDh4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9IU0k0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTFNBSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9NU0kKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0Q0xLNDhDbG9ja1NvdXJjZSh1aW50MzJfdCBDTEs0OHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+Q0NJUFIsIENMSzQ4eCkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgR2V0IFVTQnggY2xvY2sgc291cmNlCisgICogQHJtdG9sbCBDQ0lQUiAgICAgICAgQ0xLNDhTRUwgICAgICBMTF9SQ0NfR2V0VVNCQ2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFVTQnggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9IU0k0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTFNBSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9NU0kKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0VVNCQ2xvY2tTb3VyY2UodWludDMyX3QgVVNCeCkKK3sKKyAgcmV0dXJuIExMX1JDQ19HZXRDTEs0OENsb2NrU291cmNlKFVTQngpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBREN4IGNsb2NrIHNvdXJjZQorICAqIEBybXRvbGwgQ0NJUFIgICAgICAgIEFEQ1NFTCAgICAgICAgTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBBREN4IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0FEQ19DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTFNBSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9QTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQURDX0NMS1NPVVJDRV9TWVNDTEsKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfR2V0QURDQ2xvY2tTb3VyY2UodWludDMyX3QgQURDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5DQ0lQUiwgQURDeCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19MTF9FRl9SVEMgUlRDCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDIENsb2NrIFNvdXJjZQorICAqIEBub3RlIE9uY2UgdGhlIFJUQyBjbG9jayBzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQsIGl0IGNhbm5vdCBiZSBjaGFuZ2VkIGFueW1vcmUgdW5sZXNzCisgICogICAgICAgdGhlIEJhY2t1cCBkb21haW4gaXMgcmVzZXQsIG9yIHVubGVzcyBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24gTFNFIChMU0VDU1NEIGlzCisgICogICAgICAgc2V0KS4gVGhlIEJEUlNUIGJpdCBjYW4gYmUgdXNlZCB0byByZXNldCB0aGVtLgorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ1NFTCAgICAgICAgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfSFNFX0RJVjMyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfU2V0UlRDQ2xvY2tTb3VyY2UodWludDMyX3QgU291cmNlKQoreworICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDU0VMLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVEMgQ2xvY2sgU291cmNlCisgICogQHJtdG9sbCBCRENSICAgICAgICAgUlRDU0VMICAgICAgICBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0xTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRV9ESVYzMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19HZXRSVENDbG9ja1NvdXJjZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVEMKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19FbmFibGVSVEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVSVEModm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUQworICAqIEBybXRvbGwgQkRDUiAgICAgICAgIFJUQ0VOICAgICAgICAgTExfUkNDX0Rpc2FibGVSVEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlUlRDKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkJEQ1IsIFJDQ19CRENSX1JUQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSVEMgaGFzIGJlZW4gZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIEJEQ1IgICAgICAgICBSVENFTiAgICAgICAgIExMX1JDQ19Jc0VuYWJsZWRSVEMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkUlRDKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+QkRDUiwgUkNDX0JEQ1JfUlRDRU4pID09IChSQ0NfQkRDUl9SVENFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSB0aGUgQmFja3VwIGRvbWFpbiByZXNldAorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIEJEUlNUICAgICAgICAgTExfUkNDX0ZvcmNlQmFja3VwRG9tYWluUmVzZXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19Gb3JjZUJhY2t1cERvbWFpblJlc2V0KHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVsZWFzZSB0aGUgQmFja3VwIGRvbWFpbiByZXNldAorICAqIEBybXRvbGwgQkRDUiAgICAgICAgIEJEUlNUICAgICAgICAgTExfUkNDX1JlbGVhc2VCYWNrdXBEb21haW5SZXNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1JlbGVhc2VCYWNrdXBEb21haW5SZXNldCh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5CRENSLCBSQ0NfQkRDUl9CRFJTVCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUExMIFBMTAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBMTE9OICAgICAgICAgTExfUkNDX1BMTF9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTE9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTAorICAqIEBub3RlIENhbm5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgUExMIGNsb2NrIGlzIHVzZWQgYXMgdGhlIHN5c3RlbSBjbG9jaworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBMTE9OICAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUExMIFJlYWR5CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUExMUkRZICAgICAgICBMTF9SQ0NfUExMX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0lzUmVhZHkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DUiwgUkNDX0NSX1BMTFJEWSkgPT0gKFJDQ19DUl9QTExSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTCB1c2VkIGZvciBTWVNDTEsgRG9tYWluCisgICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICBQTExTQUkxIGFyZSBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUiBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVNcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZU1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMUiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl84CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVModWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExSKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSB8IFJDQ19QTExDRkdSX1BMTE4gfCBSQ0NfUExMQ0ZHUl9QTExSLAorICAgICAgICAgICAgIFNvdXJjZSB8IFBMTE0gfCAoUExMTiA8PCBSQ0NfUExMQ0ZHUl9QTExOX1BvcykgfCBQTExSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUExMIHVzZWQgZm9yIFNBSSBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqICAgICAgIFBMTFNBSTEgYXJlIGRpc2FibGVkCisgICogQG5vdGUgUExMTi9QTExQIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NBSVxuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TQUlcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE4gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU0FJXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExQICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NBSQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHBhcmFtICBQTExNIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgUExMTiBCZXR3ZWVuIDggYW5kIDg2CisgICogQHBhcmFtICBQTExQIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fU0FJKHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgUExMTSwgdWludDMyX3QgUExMTiwgdWludDMyX3QgUExMUCkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQyB8IFJDQ19QTExDRkdSX1BMTE0gfCBSQ0NfUExMQ0ZHUl9QTExOIHwgUkNDX1BMTENGR1JfUExMUCwKKyAgICAgICAgICAgICBTb3VyY2UgfCBQTExNIHwgKFBMTE4gPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgUExMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTCB1c2VkIGZvciBBREMgZG9tYWluIGNsb2NrCisgICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICBQTExTQUkxIGFyZSBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUCBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9BRENcbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fQURDXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExOICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQ1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMUCAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9BREMKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX0FEQyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFApCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNIHwgUkNDX1BMTENGR1JfUExMTiB8IFJDQ19QTExDRkdSX1BMTFAsCisgICAgICAgICAgICAgU291cmNlIHwgUExMTSB8IChQTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSB8IFBMTFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTEwgdXNlZCBmb3IgNDhNaHogZG9tYWluIGNsb2NrCisgICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICBQTExTQUkxIGFyZSBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUSBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogQG5vdGUgVGhpcyAgY2FuIGJlIHNlbGVjdGVkIGZvciBVU0IsIFJORworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fNDhNXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExNICAgICAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluXzQ4TVxuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl80OE1cbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTFEgICAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fNDhNCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBQTExOIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIFBMTFEgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9Db25maWdEb21haW5fNDhNKHVpbnQzMl90IFNvdXJjZSwgdWludDMyX3QgUExMTSwgdWludDMyX3QgUExMTiwgdWludDMyX3QgUExMUSkKK3sKKyAgTU9ESUZZX1JFRyhSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFNSQyB8IFJDQ19QTExDRkdSX1BMTE0gfCBSQ0NfUExMQ0ZHUl9QTExOIHwgUkNDX1BMTENGR1JfUExMUSwKKyAgICAgICAgICAgICBTb3VyY2UgfCBQTExNIHwgKFBMTE4gPDwgUkNDX1BMTENGR1JfUExMTl9Qb3MpIHwgUExMUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE1haW4gUExMIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgVkNPCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMTiAgICAgICAgICBMTF9SQ0NfUExMX0dldE4KKyAgKiBAcmV0dmFsIEJldHdlZW4gOCBhbmQgODYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldE4odm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExOKSA+PiAgUkNDX1BMTENGR1JfUExMTl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFAKKyAgKiBAbm90ZSAgIHVzZWQgZm9yIFBMTFNBSTFDTEsgKFNBSTEgY2xvY2spCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUCAgICAgICBMTF9SQ0NfUExMX0dldFAKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFBfRElWXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUF9ESVZfOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8yOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExQX0RJVl8zMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0UCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFApKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTWFpbiBQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRCisgICogQG5vdGUgdXNlZCBmb3IgUExMNDhNQ0xLIHNlbGVjdGVkIGZvciBVU0IsIFJORyAoNDggTUh6IGNsb2NrKQorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFEgICAgICAgICAgTExfUkNDX1BMTF9HZXRRCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFFfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExRX0RJVl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTF9HZXRRKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNYWluIFBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFIKKyAgKiBAbm90ZSB1c2VkIGZvciBQTExDTEsgKHN5c3RlbSBjbG9jaykKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSICAgICAgICAgIExMX1JDQ19QTExfR2V0UgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExSX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFJfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMUl9ESVZfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExfR2V0Uih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRGl2aXNpb24gZmFjdG9yIGZvciB0aGUgbWFpbiBQTEwgYW5kIG90aGVyIFBMTAorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTF9HZXREaXZpZGVyCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldERpdmlkZXIodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFNBSSBkb21haW4gY2xvY2sKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NBSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fU0FJKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMIG91dHB1dCBtYXBwZWQgb24gU0FJIGRvbWFpbiBjbG9jaworICAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcworICAqICAgICAgIG5vdCB1c2VkLCAgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExQRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TQUkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TQUkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMIG91dHB1dCBtYXBwZWQgb24gQURDIGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFBFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fQURDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0VuYWJsZURvbWFpbl9BREModm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFBFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiBBREMgZG9tYWluIGNsb2NrCisgICogQG5vdGUgSW4gb3JkZXIgdG8gc2F2ZSBwb3dlciwgd2hlbiB0aGUgUExMQ0xLICBvZiB0aGUgUExMIGlzCisgICogICAgICAgbm90IHVzZWQsICBzaG91bGQgYmUgMAorICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFBFTiAgICAgICAgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX0FEQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9EaXNhYmxlRG9tYWluX0FEQyh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExQRU4pOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFFFTiAgICAgICAgTExfUkNDX1BMTF9FbmFibGVEb21haW5fNDhNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0VuYWJsZURvbWFpbl80OE0odm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTEwgb3V0cHV0IG1hcHBlZCBvbiA0OE1IeiBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuIHRoZSBQTExDTEsgIG9mIHRoZSBQTEwgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgIHNob3VsZCBiZSAwCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMUUVOICAgICAgICBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fNDhNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMX0Rpc2FibGVEb21haW5fNDhNKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPlBMTENGR1IsIFJDQ19QTExDRkdSX1BMTFFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTCBvdXRwdXQgbWFwcGVkIG9uIFNZU0NMSyBkb21haW4KKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfRW5hYmxlRG9tYWluX1NZUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTF9FbmFibGVEb21haW5fU1lTKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMIG91dHB1dCBtYXBwZWQgb24gU1lTQ0xLIGRvbWFpbgorICAqIEBub3RlIENhbm5vdCBiZSBkaXNhYmxlZCBpZiB0aGUgUExMIGNsb2NrIGlzIHVzZWQgYXMgdGhlIHN5c3RlbSBjbG9jaworICAqIEBub3RlIEluIG9yZGVyIHRvIHNhdmUgcG93ZXIsIHdoZW4gdGhlIFBMTENMSyAgb2YgdGhlIFBMTCBpcworICAqICAgICAgIG5vdCB1c2VkLCBNYWluIFBMTCAgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExSRU4gICAgICAgIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TWVMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfRGlzYWJsZURvbWFpbl9TWVModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUkVOKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfUExMU0FJMSBQTExTQUkxCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMU0FJMQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBMTFNBSTFPTiAgICAgTExfUkNDX1BMTFNBSTFfRW5hYmxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMU0FJMV9FbmFibGUodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfUExMU0FJMU9OKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTFNBSTEKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExTQUkxT04gICAgIExMX1JDQ19QTExTQUkxX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0Rpc2FibGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExTQUkxT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFBMTFNBSTEgUmVhZHkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBQTExTQUkxUkRZICAgIExMX1JDQ19QTExTQUkxX0lzUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1IsIFJDQ19DUl9QTExTQUkxUkRZKSA9PSAoUkNDX0NSX1BMTFNBSTFSRFkpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTFNBSTEgdXNlZCBmb3IgNDhNaHogZG9tYWluIGNsb2NrCisgICogQG5vdGUgUExMIFNvdXJjZSBhbmQgUExMTSBEaXZpZGVyIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTEwgaXMgZGlzYWJsZWQKKyAgKiAgICAgICBQTExTQUkxIGFyZSBkaXNhYmxlZAorICAqIEBub3RlIFBMTE4vUExMUSBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMU0FJMSBpcyBkaXNhYmxlZAorICAqIEBub3RlIFRoaXMgIGNhbiBiZSBzZWxlY3RlZCBmb3IgVVNCLCBSTkcKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl80OE1cbgorICAqICAgICAgICAgUExMQ0ZHUiAgICAgIFBMTE0gICAgICAgICAgTExfUkNDX1BMTFNBSTFfQ29uZmlnRG9tYWluXzQ4TVxuCisgICogICAgICAgICBQTExTQUkxQ0ZHUiAgUExMTiAgICAgIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl80OE1cbgorICAqICAgICAgICAgUExMU0FJMUNGR1IgIFBMTFEgICAgICBMTF9SQ0NfUExMU0FJMV9Db25maWdEb21haW5fNDhNCisgICogQHBhcmFtICBTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKiBAcGFyYW0gIFBMTE0gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl84CisgICogQHBhcmFtICBQTExOIEJldHdlZW4gOCBhbmQgODYKKyAgKiBAcGFyYW0gIFBMTFEgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVFfRElWXzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl80OE0odWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExRKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSwgU291cmNlIHwgUExMTSk7CisgIE1PRElGWV9SRUcoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTE4gfCBSQ0NfUExMU0FJMUNGR1JfUExMUSwgKFBMTE4gPDwgUkNDX1BMTFNBSTFDRkdSX1BMTE5fUG9zKSB8IFBMTFEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQTExTQUkxIHVzZWQgZm9yIFNBSSBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBQTEwgU291cmNlIGFuZCBQTExNIERpdmlkZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTCBpcyBkaXNhYmxlZAorICAqICAgICAgIFBMTFNBSTEgYXJlIGRpc2FibGVkCisgICogQG5vdGUgUExMTi9QTExQIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBQTExTQUkxIGlzIGRpc2FibGVkCisgICogQG5vdGUgVGhpcyAgY2FuIGJlIHNlbGVjdGVkIGZvciBTQUkxIG9yIFNBSTIgKCopCisgICogQHJtdG9sbCBQTExDRkdSICAgICAgUExMU1JDICAgICAgICBMTF9SQ0NfUExMU0FJMV9Db25maWdEb21haW5fU0FJXG4KKyAgKiAgICAgICAgIFBMTENGR1IgICAgICBQTExNICAgICAgICAgIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl9TQUlcbgorICAqICAgICAgICAgUExMU0FJMUNGR1IgIFBMTE4gICAgICBMTF9SQ0NfUExMU0FJMV9Db25maWdEb21haW5fU0FJXG4KKyAgKiAgICAgICAgIFBMTFNBSTFDRkdSICBQTExQICAgTExfUkNDX1BMTFNBSTFfQ29uZmlnRG9tYWluX1NBSQorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9NU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNFCisgICogQHBhcmFtICBQTExNIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfOAorICAqIEBwYXJhbSAgUExMTiBCZXR3ZWVuIDggYW5kIDg2CisgICogQHBhcmFtICBQTExQIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMzIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl9TQUkodWludDMyX3QgU291cmNlLCB1aW50MzJfdCBQTExNLCB1aW50MzJfdCBQTExOLCB1aW50MzJfdCBQTExQKQoreworICBNT0RJRllfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMU1JDIHwgUkNDX1BMTENGR1JfUExMTSwgU291cmNlIHwgUExMTSk7CisgIE1PRElGWV9SRUcoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTE4gfCBSQ0NfUExMU0FJMUNGR1JfUExMUCwKKyAgICAgICAgICAgICAoUExMTiA8PCBSQ0NfUExMU0FJMUNGR1JfUExMTl9Qb3MpIHwgUExMUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTFNBSTEgdXNlZCBmb3IgQURDIGRvbWFpbiBjbG9jaworICAqIEBub3RlIFBMTCBTb3VyY2UgYW5kIFBMTE0gRGl2aWRlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gUExMIGlzIGRpc2FibGVkCisgICogICAgICAgUExMU0FJMSBhcmUgZGlzYWJsZWQKKyAgKiBAbm90ZSBQTExOL1BMTFIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFBMTFNBSTEgaXMgZGlzYWJsZWQKKyAgKiBAbm90ZSBUaGlzICBjYW4gYmUgc2VsZWN0ZWQgZm9yIEFEQworICAqIEBybXRvbGwgUExMQ0ZHUiAgICAgIFBMTFNSQyAgICAgICAgTExfUkNDX1BMTFNBSTFfQ29uZmlnRG9tYWluX0FEQ1xuCisgICogICAgICAgICBQTExDRkdSICAgICAgUExMTSAgICAgICAgICBMTF9SQ0NfUExMU0FJMV9Db25maWdEb21haW5fQURDXG4KKyAgKiAgICAgICAgIFBMTFNBSTFDRkdSICBQTExOICAgICAgTExfUkNDX1BMTFNBSTFfQ29uZmlnRG9tYWluX0FEQ1xuCisgICogICAgICAgICBQTExTQUkxQ0ZHUiAgUExMUiAgICAgIExMX1JDQ19QTExTQUkxX0NvbmZpZ0RvbWFpbl9BREMKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfTVNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0kKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX0hTRQorICAqIEBwYXJhbSAgUExMTSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMTV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExNX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTE1fRElWXzgKKyAgKiBAcGFyYW0gIFBMTE4gQmV0d2VlbiA4IGFuZCA4NgorICAqIEBwYXJhbSAgUExMUiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUl9ESVZfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTFNBSTFfQ29uZmlnRG9tYWluX0FEQyh1aW50MzJfdCBTb3VyY2UsIHVpbnQzMl90IFBMTE0sIHVpbnQzMl90IFBMTE4sIHVpbnQzMl90IFBMTFIpCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMgfCBSQ0NfUExMQ0ZHUl9QTExNLCBTb3VyY2UgfCBQTExNKTsKKyAgTU9ESUZZX1JFRyhSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMTiB8IFJDQ19QTExTQUkxQ0ZHUl9QTExSLCAoUExMTiA8PCBSQ0NfUExMU0FJMUNGR1JfUExMTl9Qb3MpIHwgUExMUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBMTCBjbG9jayBzb3VyY2UKKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfU2V0TWFpblNvdXJjZQorICAqIEBwYXJhbSBQTExTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExfU2V0TWFpblNvdXJjZSh1aW50MzJfdCBQTExTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIFBMTFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvc2NpbGxhdG9yIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZS4KKyAgKiBAcm10b2xsIFBMTENGR1IgICAgICBQTExTUkMgICAgICAgIExMX1JDQ19QTExfR2V0TWFpblNvdXJjZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU09VUkNFX01TSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTT1VSQ0VfSFNJCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNPVVJDRV9IU0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2Uodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU0FJMVBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFZDTworICAqIEBybXRvbGwgUExMU0FJMUNGR1IgIFBMTE4gICAgICBMTF9SQ0NfUExMU0FJMV9HZXROCisgICogQHJldHZhbCBCZXR3ZWVuIDggYW5kIDg2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTFNBSTFfR2V0Tih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMTikgPj4gUkNDX1BMTFNBSTFDRkdSX1BMTE5fUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU0FJMVBMTCBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSTFQCisgICogQG5vdGUgdXNlZCBmb3IgUExMU0FJMUNMSyAoU0FJMSBvciBTQUkyICgqKSBjbG9jaykuCisgICogQHJtdG9sbCBQTExTQUkxQ0ZHUiAgUExMUCAgICAgIExMX1JDQ19QTExTQUkxX0dldFAKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl85CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8xOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8yOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfUExMU0FJMVBfRElWXzMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFQX0RJVl8zMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUF9ESVZfMzIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfUExMU0FJMV9HZXRQKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJDQy0+UExMU0FJMUNGR1IsIFJDQ19QTExTQUkxQ0ZHUl9QTExQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNBSTFQTEwgZGl2aXNpb24gZmFjdG9yIGZvciBQTExRCisgICogQG5vdGUgdXNlZCBQTEw0OE0yQ0xLIHNlbGVjdGVkIGZvciBVU0IsIFJORyAoNDggTUh6IGNsb2NrKQorICAqIEBybXRvbGwgUExMU0FJMUNGR1IgIFBMTFEgICAgICBMTF9SQ0NfUExMU0FJMV9HZXRRCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19QTExTQUkxUV9ESVZfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19QTExTQUkxX0dldFEodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTFEpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUExMU0FJMSBkaXZpc2lvbiBmYWN0b3IgZm9yIFBMTFNBSVIKKyAgKiBAbm90ZSB1c2VkIGZvciBQTExBREMxQ0xLIChBREMgY2xvY2spCisgICogQHJtdG9sbCBQTExTQUkxQ0ZHUiAgUExMUiAgICAgIExMX1JDQ19QTExTQUkxX0dldFIKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl81CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl82CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl83CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1BMTFNBSTFSX0RJVl84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX1BMTFNBSTFfR2V0Uih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUikpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFBMTFNBSTEgb3V0cHV0IG1hcHBlZCBvbiBTQUkgZG9tYWluIGNsb2NrCisgICogQHJtdG9sbCBQTExTQUkxQ0ZHUiAgUExMUEVOICAgIExMX1JDQ19QTExTQUkxX0VuYWJsZURvbWFpbl9TQUkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0VuYWJsZURvbWFpbl9TQUkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFBMTFNBSTEgb3V0cHV0IG1hcHBlZCBvbiBTQUkgZG9tYWluIGNsb2NrCisgICogQG5vdGUgSW4gb3JkZXIgdG8gc2F2ZSBwb3dlciwgd2hlbiAgb2YgdGhlIFBMTFNBSTEgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTFNBSTFDRkdSICBQTExQRU4gICAgTExfUkNDX1BMTFNBSTFfRGlzYWJsZURvbWFpbl9TQUkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0Rpc2FibGVEb21haW5fU0FJKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUEVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMU0FJMSBvdXRwdXQgbWFwcGVkIG9uIDQ4TUh6IGRvbWFpbiBjbG9jaworICAqIEBybXRvbGwgUExMU0FJMUNGR1IgIFBMTFFFTiAgICBMTF9SQ0NfUExMU0FJMV9FbmFibGVEb21haW5fNDhNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfUExMU0FJMV9FbmFibGVEb21haW5fNDhNKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTFFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTExTQUkxIG91dHB1dCBtYXBwZWQgb24gNDhNSHogZG9tYWluIGNsb2NrCisgICogQG5vdGUgSW4gb3JkZXIgdG8gc2F2ZSBwb3dlciwgd2hlbiAgb2YgdGhlIFBMTFNBSTEgaXMKKyAgKiAgICAgICBub3QgdXNlZCwgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTFNBSTFDRkdSICBQTExRRU4gICAgTExfUkNDX1BMTFNBSTFfRGlzYWJsZURvbWFpbl80OE0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0Rpc2FibGVEb21haW5fNDhNKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMU0FJMSBvdXRwdXQgbWFwcGVkIG9uIEFEQyBkb21haW4gY2xvY2sKKyAgKiBAcm10b2xsIFBMTFNBSTFDRkdSICBQTExSRU4gICAgTExfUkNDX1BMTFNBSTFfRW5hYmxlRG9tYWluX0FEQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX1BMTFNBSTFfRW5hYmxlRG9tYWluX0FEQyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+UExMU0FJMUNGR1IsIFJDQ19QTExTQUkxQ0ZHUl9QTExSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMU0FJMSBvdXRwdXQgbWFwcGVkIG9uIEFEQyBkb21haW4gY2xvY2sKKyAgKiBAbm90ZSBJbiBvcmRlciB0byBzYXZlIHBvd2VyLCB3aGVuICBvZiB0aGUgUExMU0FJMSBpcworICAqICAgICAgIG5vdCB1c2VkLCBNYWluIFBMTFNBSTEgc2hvdWxkIGJlIDAKKyAgKiBAcm10b2xsIFBMTFNBSTFDRkdSICBQTExSRU4gICAgTExfUkNDX1BMTFNBSTFfRGlzYWJsZURvbWFpbl9BREMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19QTExTQUkxX0Rpc2FibGVEb21haW5fQURDKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPlBMTFNBSTFDRkdSLCBSQ0NfUExMU0FJMUNGR1JfUExMUkVOKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExTSTEgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0kxUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTSTFSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNJMVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNJMVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExTSTIgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0kyUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0xTSTJSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNJMlJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNJMlJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExTRSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIExTRVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19MU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfTFNFUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9MU0VSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBNU0kgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBNU0lSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTVNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX01TSVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTVNJUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgSFNJIHJlYWR5IGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgSFNJUkRZQyAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTSVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0hTSVJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEhTRSByZWFkeSBpbnRlcnJ1cHQgZmxhZworICAqIEBybXRvbGwgQ0lDUiAgICAgICAgIEhTRVJEWUMgICAgICAgTExfUkNDX0NsZWFyRmxhZ19IU0VSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhckZsYWdfSFNFUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9IU0VSRFlDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBQTEwgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBQTExSRFlDICAgICAgIExMX1JDQ19DbGVhckZsYWdfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX1BMTFJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfUExMUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgSFNJNDggcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICAgSFNJNDhSRFlDICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTSTQ4UkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0hTSTQ4UkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9IU0k0OFJEWUMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFBMTFNBSTEgcmVhZHkgaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBQTExTQUkxUkRZQyAgIExMX1JDQ19DbGVhckZsYWdfUExMU0FJMVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19QTExTQUkxUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUNSLCBSQ0NfQ0lDUl9QTExTQUkxUkRZQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2xvY2sgc2VjdXJpdHkgc3lzdGVtIGludGVycnVwdCBmbGFnCisgICogQHJtdG9sbCBDSUNSICAgICAgICAgQ1NTQyAgICAgICAgICBMTF9SQ0NfQ2xlYXJGbGFnX0hTRUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0NsZWFyRmxhZ19IU0VDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJQ1IsIFJDQ19DSUNSX0NTU0MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExTRSBDbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0IGZsYWcKKyAgKiBAcm10b2xsIENJQ1IgICAgICAgICBMU0VDU1NDICAgICAgIExMX1JDQ19DbGVhckZsYWdfTFNFQ1NTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfQ2xlYXJGbGFnX0xTRUNTUyh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lDUiwgUkNDX0NJQ1JfTFNFQ1NTQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFNJMSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNJMVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0kxUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19MU0kxUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNJMVJEWUYpID09IChSQ0NfQ0lGUl9MU0kxUkRZRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBMU0kyIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBMU0kyUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSTJSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTSTJSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9MU0kyUkRZRikgPT0gKFJDQ19DSUZSX0xTSTJSRFlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIExTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFUkRZRikgPT0gKFJDQ19DSUZSX0xTRVJEWUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTVNJIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBNU0lSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfTVNJUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19NU0lSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9NU0lSRFlGKSA9PSAoUkNDX0NJRlJfTVNJUkRZRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0kgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkIG9yIG5vdAorICAqIEBybXRvbGwgQ0lGUiAgICAgICAgIEhTSVJEWUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTSVJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRlIsIFJDQ19DSUZSX0hTSVJEWUYpID09IChSQ0NfQ0lGUl9IU0lSRFlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhTRSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgSFNFUkRZRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfSFNFUkRZRikgPT0gKFJDQ19DSUZSX0hTRVJEWUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUExMIHJlYWR5IGludGVycnVwdCBvY2N1cnJlZCBvciBub3QKKyAgKiBAcm10b2xsIENJRlIgICAgICAgICBQTExSRFlGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfUExMUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19QTExSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9QTExSRFlGKSA9PSAoUkNDX0NJRlJfUExMUkRZRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBIU0k0OCByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgIEhTSTQ4UkRZRiAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19IU0k0OFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNJNDhSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9IU0k0OFJEWUYpID09IChSQ0NfQ0lGUl9IU0k0OFJEWUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUExMU0FJMSByZWFkeSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgUExMU0FJMVJEWUYgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BMTFNBSTFSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BMTFNBSTFSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUZSLCBSQ0NfQ0lGUl9QTExTQUkxUkRZRikgPT0gKFJDQ19DSUZSX1BMTFNBSTFSRFlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgQ1NTRiAgICAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hTRUNTUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFNFQ1NTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfQ1NTRikgPT0gKFJDQ19DSUZSX0NTU0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgTFNFIENsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQgb2NjdXJyZWQgb3Igbm90CisgICogQHJtdG9sbCBDSUZSICAgICAgICAgTFNFQ1NTRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xTRUNTUworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfTFNFQ1NTKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lGUiwgUkNDX0NJRlJfTFNFQ1NTRikgPT0gKFJDQ19DSUZSX0xTRUNTU0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSENMSzEgcHJlc2NhbGVyIGZsYWcgdmFsdWUgaGFzIGJlZW4gYXBwbGllZCBvciBub3QKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBIUFJFRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hQUkUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0hQUkUodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9IUFJFRikgPT0gKFJDQ19DRkdSX0hQUkVGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEhDTEsyIHByZXNjYWxlciBmbGFnIHZhbHVlIGhhcyBiZWVuIGFwcGxpZWQgb3Igbm90CisgICogQHJtdG9sbCBFWFRDRkdSICAgICAgICAgQzJIUFJFRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0MySFBSRQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfQzJIUFJFKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+RVhUQ0ZHUiwgUkNDX0VYVENGR1JfQzJIUFJFRikgPT0gKFJDQ19FWFRDRkdSX0MySFBSRUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgSENMSzQgcHJlc2NhbGVyIGZsYWcgdmFsdWUgaGFzIGJlZW4gYXBwbGllZCBvciBub3QKKyAgKiBAcm10b2xsIEVYVENGR1IgICAgICAgICBTSERIUFJFRiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NIREhQUkUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX1NIREhQUkUodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5FWFRDRkdSLCBSQ0NfRVhUQ0ZHUl9TSERIUFJFRikgPT0gKFJDQ19FWFRDRkdSX1NIREhQUkVGKSkgPyAxVUwgOiAwVUwpOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUExDSzEgcHJlc2NhbGVyIGZsYWcgdmFsdWUgaGFzIGJlZW4gYXBwbGllZCBvciBub3QKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMUYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19QUFJFMQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUFBSRTEodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMUYpID09IChSQ0NfQ0ZHUl9QUFJFMUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUExDSzIgcHJlc2NhbGVyIGZsYWcgdmFsdWUgaGFzIGJlZW4gYXBwbGllZCBvciBub3QKKyAgKiBAcm10b2xsIENGR1IgICAgICAgICBQUFJFMkYgICAgICAgTExfUkNDX0lzQWN0aXZlRmxhZ19QUFJFMgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUFBSRTIodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMkYpID09IChSQ0NfQ0ZHUl9QUFJFMkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgSW5kZXBlbmRlbnQgV2F0Y2hkb2cgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBJV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfSVdER1JTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfSVdER1JTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9JV0RHUlNURikgPT0gKFJDQ19DU1JfSVdER1JTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgTG93IFBvd2VyIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgTFBXUlJTVEYgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xQV1JSU1QKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNBY3RpdmVGbGFnX0xQV1JSU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfTFBXUlJTVEYpID09IChSQ0NfQ1NSX0xQV1JSU1RGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJDQyBmbGFnIE9wdGlvbiBieXRlIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgT0JMUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX09CTFJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfT0JMUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX09CTFJTVEYpID09IChSQ0NfQ1NSX09CTFJTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgUGluIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgUElOUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX1BJTlJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfUElOUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX1BJTlJTVEYpID09IChSQ0NfQ1NSX1BJTlJTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgU29mdHdhcmUgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBTRlRSU1RGICAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfU0ZUUlNUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzQWN0aXZlRmxhZ19TRlRSU1Qodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DU1IsIFJDQ19DU1JfU0ZUUlNURikgPT0gKFJDQ19DU1JfU0ZUUlNURikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSQ0MgZmxhZyBXaW5kb3cgV2F0Y2hkb2cgcmVzZXQgaXMgc2V0IG9yIG5vdC4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBXV0RHUlNURiAgICAgIExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfV1dER1JTVCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9XV0RHUlNURikgPT0gKFJDQ19DU1JfV1dER1JTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgUkNDIGZsYWcgQk9SIHJlc2V0IGlzIHNldCBvciBub3QuCisgICogQHJtdG9sbCBDU1IgICAgICAgICAgQk9SUlNURiAgICAgICBMTF9SQ0NfSXNBY3RpdmVGbGFnX0JPUlJTVAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0FjdGl2ZUZsYWdfQk9SUlNUKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q1NSLCBSQ0NfQ1NSX0JPUlJTVEYpID09IChSQ0NfQ1NSX0JPUlJTVEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFJNVkYgYml0IHRvIGNsZWFyIHRoZSByZXNldCBmbGFncy4KKyAgKiBAcm10b2xsIENTUiAgICAgICAgICBSTVZGICAgICAgICAgIExMX1JDQ19DbGVhclJlc2V0RmxhZ3MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19DbGVhclJlc2V0RmxhZ3Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNTUiwgUkNDX0NTUl9STVZGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSQ0NfTExfRUZfSVRfTWFuYWdlbWVudCBJVCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNJMSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0kxUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTFNJMVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTSTFSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTSTFSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIExTSTIgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJMlJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTSTJSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0kyUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9MU0kyUkRZSUUpOworfQorLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIExTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0xTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0xTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBNU0kgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTVNJUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfTVNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfTVNJUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9NU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19FbmFibGVJVF9IU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9IU0lSRFkodm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSFNFIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIEhTRVJEWUlFICAgICAgTExfUkNDX0VuYWJsZUlUX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0hTRVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBQTEwgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgUExMUkRZSUUgICAgICBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfUExMUkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19FbmFibGVJVF9IU0k0OFJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0VuYWJsZUlUX0hTSTQ4UkRZKHZvaWQpCit7CisgIFNFVF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0k0OFJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMU0FJMSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExTQUkxUkRZSUUgIExMX1JDQ19FbmFibGVJVF9QTExTQUkxUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRW5hYmxlSVRfUExMU0FJMVJEWSh2b2lkKQoreworICBTRVRfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMU0FJMVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTFNFIGNsb2NrIHNlY3VyaXR5IHN5c3RlbSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VDU1NJRSAgICAgIExMX1JDQ19FbmFibGVJVF9MU0VDU1MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19FbmFibGVJVF9MU0VDU1Modm9pZCkKK3sKKyAgU0VUX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRUNTU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSTEgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJMVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0kxUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0xTSTFSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJMVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTSTIgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNJMlJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9MU0kyUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0xTSTJSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJMlJEWUlFKTsKK30KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMU0UgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0VSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTVNJIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIE1TSVJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9NU0lSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfTVNJUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX01TSVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSSByZWFkeSBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX0hTSVJEWSh2b2lkKQoreworICBDTEVBUl9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9IU0lSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBIU0UgcmVhZHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgSFNFUkRZSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0hTRVJEWQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9IU0VSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFJEWUlFICAgICAgTExfUkNDX0Rpc2FibGVJVF9QTExSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfUExMUkRZKHZvaWQpCit7CisgIENMRUFSX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX1BMTFJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEhTSTQ4IHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JDQ19EaXNhYmxlSVRfSFNJNDhSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJNDhSRFlJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBQTExTQUkxIHJlYWR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgIFBMTFNBSTFSRFlJRSAgTExfUkNDX0Rpc2FibGVJVF9QTExTQUkxUkRZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SQ0NfRGlzYWJsZUlUX1BMTFNBSTFSRFkodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMU0FJMVJEWUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExTRSBjbG9jayBzZWN1cml0eSBzeXN0ZW0gaW50ZXJydXB0CisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfRGlzYWJsZUlUX0xTRUNTUworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUkNDX0Rpc2FibGVJVF9MU0VDU1Modm9pZCkKK3sKKyAgQ0xFQVJfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFQ1NTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiBMU0kxIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0kxUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJMVJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9MU0kxUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJMVJEWUlFKSA9PSAoUkNDX0NJRVJfTFNJMVJEWUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiBMU0kyIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0kyUkRZSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNJMlJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9MU0kyUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNJMlJEWUlFKSA9PSAoUkNDX0NJRVJfTFNJMlJEWUlFKSkgPyAxVUwgOiAwVUwpOworfQorLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgTFNFIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBMU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9MU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTFNFUkRZSUUpID09IChSQ0NfQ0lFUl9MU0VSRFlJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgTVNJIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBNU0lSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9NU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfTVNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfTVNJUkRZSUUpID09IChSQ0NfQ0lFUl9NU0lSRFlJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgSFNJIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0lSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0lSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNJUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNJUkRZSUUpID09IChSQ0NfQ0lFUl9IU0lSRFlJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgSFNFIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBIU0VSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0VSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfSFNFUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfSFNFUkRZSUUpID09IChSQ0NfQ0lFUl9IU0VSRFlJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgUExMIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExSRFlJRSAgICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9QTExSRFkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SQ0NfSXNFbmFibGVkSVRfUExMUkRZKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJDQy0+Q0lFUiwgUkNDX0NJRVJfUExMUkRZSUUpID09IChSQ0NfQ0lFUl9QTExSRFlJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVja3MgaWYgSFNJNDggcmVhZHkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ0lFUiAgICAgICAgICBIU0k0OFJEWUlFICAgIExMX1JDQ19Jc0VuYWJsZWRJVF9IU0k0OFJEWQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JDQ19Jc0VuYWJsZWRJVF9IU0k0OFJEWSh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0hTSTQ4UkRZSUUpID09IChSQ0NfQ0lFUl9IU0k0OFJEWUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiBQTExTQUkxIHJlYWR5IGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENJRVIgICAgICAgICBQTExTQUkxUkRZSUUgIExMX1JDQ19Jc0VuYWJsZWRJVF9QTExTQUkxUkRZCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX1BMTFNBSTFSRFkodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUkNDLT5DSUVSLCBSQ0NfQ0lFUl9QTExTQUkxUkRZSUUpID09IChSQ0NfQ0lFUl9QTExTQUkxUkRZSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIExTRUNTUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDSUVSICAgICAgICAgTFNFQ1NTSUUgICAgICBMTF9SQ0NfSXNFbmFibGVkSVRfTFNFQ1NTCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUkNDX0lzRW5hYmxlZElUX0xTRUNTUyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChSQ0MtPkNJRVIsIFJDQ19DSUVSX0xTRUNTU0lFKSA9PSAoUkNDX0NJRVJfTFNFQ1NTSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0luaXQgRGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgKiBAeworICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX0VGX0dldF9GcmVxIEdldCBzeXN0ZW0gYW5kIHBlcmlwaGVyYWxzIGNsb2NrcyBmcmVxdWVuY3kgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3ZvaWQgICAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKExMX1JDQ19DbG9ja3NUeXBlRGVmICpSQ0NfQ2xvY2tzKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRTTVBTQ2xvY2tGcmVxKHZvaWQpOwordWludDMyX3QgICAgTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKHVpbnQzMl90IFVTQVJUeFNvdXJjZSk7Cit1aW50MzJfdCAgICBMTF9SQ0NfR2V0STJDQ2xvY2tGcmVxKHVpbnQzMl90IEkyQ3hTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldExQVUFSVENsb2NrRnJlcSh1aW50MzJfdCBMUFVBUlR4U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRMUFRJTUNsb2NrRnJlcSh1aW50MzJfdCBMUFRJTXhTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldFNBSUNsb2NrRnJlcSh1aW50MzJfdCBTQUl4U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRDTEs0OENsb2NrRnJlcSh1aW50MzJfdCBDTEs0OHhTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldFJOR0Nsb2NrRnJlcSh1aW50MzJfdCBSTkd4U291cmNlKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRVU0JDbG9ja0ZyZXEodWludDMyX3QgVVNCeFNvdXJjZSk7Cit1aW50MzJfdCAgICBMTF9SQ0NfR2V0QURDQ2xvY2tGcmVxKHVpbnQzMl90IEFEQ3hTb3VyY2UpOwordWludDMyX3QgICAgTExfUkNDX0dldFJUQ0Nsb2NrRnJlcSh2b2lkKTsKK3VpbnQzMl90ICAgIExMX1JDQ19HZXRSRldLUENsb2NrRnJlcSh2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9SQ0NfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9ybmcuaCBiL0luYy9zdG0zMndieHhfbGxfcm5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxZTcwZQotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfcm5nLmgKQEAgLTAsMCArMSw0MDEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfcm5nLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFJORyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1JOR19ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9STkdfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFJORykKKworLyoqIEBkZWZncm91cCBSTkdfTEwgUk5HCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VTX0luaXRfU3RydWN0IFJORyBFeHBvcnRlZCBJbml0IHN0cnVjdHVyZXMKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiBMTCBSTkcgSW5pdCBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgICAgICAgICBDbG9ja0Vycm9yRGV0ZWN0aW9uOyAvKiE8IENsb2NrIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB2YWx1ZSBvZiBAcmVmIFJOR19MTF9DRUQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfUk5HX0VuYWJsZUNsa0Vycm9yRGV0ZWN0KCkuICovCit9IExMX1JOR19Jbml0VHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9Db25zdGFudHMgUk5HIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0NFRCBDbG9jayBFcnJvciBEZXRlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9STkdfQ0VEX0VOQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IENsb2NrIGVycm9yIGRldGVjdGlvbiBlbmFibGVkICAqLworI2RlZmluZSBMTF9STkdfQ0VEX0RJU0FCTEUgICAgICAgIFJOR19DUl9DRUQgICAgICAgICAgICAgICAvKiE8IENsb2NrIGVycm9yIGRldGVjdGlvbiBkaXNhYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JOR19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUk5HX1NSX0RSRFkgUk5HX1NSX0RSRFkgICAgLyohPCBSZWdpc3RlciBjb250YWlucyB2YWxpZCByYW5kb20gZGF0YSAqLworI2RlZmluZSBMTF9STkdfU1JfQ0VDUyBSTkdfU1JfQ0VDUyAgICAvKiE8IENsb2NrIGVycm9yIGN1cnJlbnQgc3RhdHVzICovCisjZGVmaW5lIExMX1JOR19TUl9TRUNTIFJOR19TUl9TRUNTICAgIC8qITwgU2VlZCBlcnJvciBjdXJyZW50IHN0YXR1cyAqLworI2RlZmluZSBMTF9STkdfU1JfQ0VJUyBSTkdfU1JfQ0VJUyAgICAvKiE8IENsb2NrIGVycm9yIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgTExfUk5HX1NSX1NFSVMgUk5HX1NSX1NFSVMgICAgLyohPCBTZWVkIGVycm9yIGludGVycnVwdCBzdGF0dXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JOR19SZWFkUmVnIGFuZCAgTExfUk5HX1dyaXRlUmVnIG1hY3JvcworICAqIEB7CisgICovCisjZGVmaW5lIExMX1JOR19DUl9JRSAgIFJOR19DUl9JRSAgICAgIC8qITwgUk5HIEludGVycnVwdCBlbmFibGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9NYWNyb3MgUk5HIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gUk5HIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gUk5HIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9STkdfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBSTkcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBSTkcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfUk5HX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FeHBvcnRlZF9GdW5jdGlvbnMgUk5HIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKiogQGRlZmdyb3VwIFJOR19MTF9FRl9Db25maWd1cmF0aW9uIFJORyBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFJOR0VOICAgICAgICAgTExfUk5HX0VuYWJsZQorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19FbmFibGUoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFNFVF9CSVQoUk5HeC0+Q1IsIFJOR19DUl9STkdFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSTkdFTiAgICAgICAgIExMX1JOR19EaXNhYmxlCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0Rpc2FibGUoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIENMRUFSX0JJVChSTkd4LT5DUiwgUk5HX0NSX1JOR0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUk5HRU4gICAgICAgICBMTF9STkdfSXNFbmFibGVkCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0VuYWJsZWQoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPkNSLCBSTkdfQ1JfUk5HRU4pID09IChSTkdfQ1JfUk5HRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENsb2NrIEVycm9yIERldGVjdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENFRCAgICAgICAgICAgTExfUk5HX0VuYWJsZUNsa0Vycm9yRGV0ZWN0CisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0VuYWJsZUNsa0Vycm9yRGV0ZWN0KFJOR19UeXBlRGVmICpSTkd4KQoreworICBDTEVBUl9CSVQoUk5HeC0+Q1IsIFJOR19DUl9DRUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUk5HIENsb2NrIEVycm9yIERldGVjdGlvbgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIENFRCAgICAgICAgIExMX1JOR19EaXNhYmxlQ2xrRXJyb3JEZXRlY3QKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfRGlzYWJsZUNsa0Vycm9yRGV0ZWN0KFJOR19UeXBlRGVmICpSTkd4KQoreworICBTRVRfQklUKFJOR3gtPkNSLCBSTkdfQ1JfQ0VEKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSTkcgQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBDRUQgICAgICAgICBMTF9STkdfSXNFbmFibGVkQ2xrRXJyb3JEZXRlY3QKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzRW5hYmxlZENsa0Vycm9yRGV0ZWN0KFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSTkd4LT5DUiwgUk5HX0NSX0NFRCkgIT0gKFJOR19DUl9DRUQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBSTkcgRGF0YSByZWFkeSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBEUkRZICAgICAgICAgIExMX1JOR19Jc0FjdGl2ZUZsYWdfRFJEWQorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNBY3RpdmVGbGFnX0RSRFkoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPlNSLCBSTkdfU1JfRFJEWSkgPT0gKFJOR19TUl9EUkRZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBDbG9jayBFcnJvciBDdXJyZW50IFN0YXR1cyBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDRUNTICAgICAgICAgIExMX1JOR19Jc0FjdGl2ZUZsYWdfQ0VDUworICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNBY3RpdmVGbGFnX0NFQ1MoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPlNSLCBSTkdfU1JfQ0VDUykgPT0gKFJOR19TUl9DRUNTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIHRoZSBTZWVkIEVycm9yIEN1cnJlbnQgU3RhdHVzIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFNFQ1MgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUNTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfU0VDUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9TRUNTKSA9PSAoUk5HX1NSX1NFQ1MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIENsb2NrIEVycm9yIEludGVycnVwdCBTdGF0dXMgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0VJUyAgICAgICAgICBMTF9STkdfSXNBY3RpdmVGbGFnX0NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUk5HX0lzQWN0aXZlRmxhZ19DRUlTKFJOR19UeXBlRGVmICpSTkd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSTkd4LT5TUiwgUk5HX1NSX0NFSVMpID09IChSTkdfU1JfQ0VJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiB0aGUgU2VlZCBFcnJvciBJbnRlcnJ1cHQgU3RhdHVzIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFNFSVMgICAgICAgICAgTExfUk5HX0lzQWN0aXZlRmxhZ19TRUlTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19Jc0FjdGl2ZUZsYWdfU0VJUyhSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUk5HeC0+U1IsIFJOR19TUl9TRUlTKSA9PSAoUk5HX1NSX1NFSVMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2xvY2sgRXJyb3IgaW50ZXJydXB0IFN0YXR1cyAoQ0VJUykgRmxhZworICAqIEBybXRvbGwgU1IgICAgICAgICAgIENFSVMgICAgICAgICAgTExfUk5HX0NsZWFyRmxhZ19DRUlTCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0NsZWFyRmxhZ19DRUlTKFJOR19UeXBlRGVmICpSTkd4KQoreworICBXUklURV9SRUcoUk5HeC0+U1IsIH5STkdfU1JfQ0VJUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU2VlZCBFcnJvciBpbnRlcnJ1cHQgU3RhdHVzIChTRUlTKSBGbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgU0VJUyAgICAgICAgICBMTF9STkdfQ2xlYXJGbGFnX1NFSVMKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9STkdfQ2xlYXJGbGFnX1NFSVMoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIFdSSVRFX1JFRyhSTkd4LT5TUiwgflJOR19TUl9TRUlTKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSTkdfTExfRUZfSVRfTWFuYWdlbWVudCBJVCBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgSW50ZXJydXB0CisgICogICAgICAgICAoYXBwbGllcyBmb3IgZWl0aGVyIFNlZWQgZXJyb3IsIENsb2NrIEVycm9yIG9yIERhdGEgcmVhZHkgaW50ZXJydXB0cykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJRSAgICAgICAgICAgIExMX1JOR19FbmFibGVJVAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JOR19FbmFibGVJVChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgU0VUX0JJVChSTkd4LT5DUiwgUk5HX0NSX0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIEludGVycnVwdAorICAqICAgICAgICAgKGFwcGxpZXMgZm9yIGVpdGhlciBTZWVkIGVycm9yLCBDbG9jayBFcnJvciBvciBEYXRhIHJlYWR5IGludGVycnVwdHMpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgSUUgICAgICAgICAgICBMTF9STkdfRGlzYWJsZUlUCisgICogQHBhcmFtICBSTkd4IFJORyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUk5HX0Rpc2FibGVJVChSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgQ0xFQVJfQklUKFJOR3gtPkNSLCBSTkdfQ1JfSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIEludGVycnVwdCBpcyBlbmFibGVkCisgICogICAgICAgICAoYXBwbGllcyBmb3IgZWl0aGVyIFNlZWQgZXJyb3IsIENsb2NrIEVycm9yIG9yIERhdGEgcmVhZHkgaW50ZXJydXB0cykKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJRSAgICAgICAgICAgIExMX1JOR19Jc0VuYWJsZWRJVAorICAqIEBwYXJhbSAgUk5HeCBSTkcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9STkdfSXNFbmFibGVkSVQoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJOR3gtPkNSLCBSTkdfQ1JfSUUpID09IChSTkdfQ1JfSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUk5HX0xMX0VGX0RhdGFfTWFuYWdlbWVudCBEYXRhIE1hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybjMyLWJpdCBSYW5kb20gTnVtYmVyIHZhbHVlCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgUk5EQVRBICAgICAgICBMTF9STkdfUmVhZFJhbmREYXRhMzIKKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBHZW5lcmF0ZWQgMzItYml0IHJhbmRvbSB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JOR19SZWFkUmFuZERhdGEzMihSTkdfVHlwZURlZiAqUk5HeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoUk5HeC0+RFIpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSTkdfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JOR19Jbml0KFJOR19UeXBlRGVmICpSTkd4LCBMTF9STkdfSW5pdFR5cGVEZWYgKlJOR19Jbml0U3RydWN0KTsKK3ZvaWQgTExfUk5HX1N0cnVjdEluaXQoTExfUk5HX0luaXRUeXBlRGVmICpSTkdfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9STkdfRGVJbml0KFJOR19UeXBlRGVmICpSTkd4KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJORyAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TVE0zMldCeHhfTExfUk5HX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfcnRjLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzN2MwODEKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX3J0Yy5oCkBAIC0wLDAgKzEsMzkwMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9ydGMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgUlRDIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyV0J4eF9MTF9SVENfSAorI2RlZmluZSBTVE0zMldCeHhfTExfUlRDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJUQykKKworLyoqIEBkZWZncm91cCBSVENfTEwgUlRDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfUHJpdmF0ZV9Db25zdGFudHMgUlRDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogV3JpdGUgcHJvdGVjdGlvbiBkZWZpbmVzICovCisjZGVmaW5lIFJUQ19XUklURV9QUk9URUNUSU9OX0RJU0FCTEUgICgodWludDhfdCkweEZGVSkKKyNkZWZpbmUgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzEgKCh1aW50OF90KTB4Q0FVKQorI2RlZmluZSBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMiAoKHVpbnQ4X3QpMHg1M1UpCisKKy8qIERlZmluZXMgdXNlZCB0byBjb21iaW5lIGRhdGUgJiB0aW1lICovCisjZGVmaW5lIFJUQ19PRkZTRVRfV0VFS0RBWSAgICAgICAgICAgICh1aW50MzJfdCkyNFUKKyNkZWZpbmUgUlRDX09GRlNFVF9EQVkgICAgICAgICAgICAgICAgKHVpbnQzMl90KTE2VQorI2RlZmluZSBSVENfT0ZGU0VUX01PTlRIICAgICAgICAgICAgICAodWludDMyX3QpOFUKKyNkZWZpbmUgUlRDX09GRlNFVF9IT1VSICAgICAgICAgICAgICAgKHVpbnQzMl90KTE2VQorI2RlZmluZSBSVENfT0ZGU0VUX01JTlVURSAgICAgICAgICAgICAodWludDMyX3QpOFUKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX1ByaXZhdGVfTWFjcm9zIFJUQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VTX0lOSVQgUlRDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSVEMgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IEhvdXJGb3JtYXQ7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBIb3VycyBGb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19IT1VSRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRIb3VyRm9ybWF0KCkuICovCisKKyAgdWludDMyX3QgQXN5bmNoUHJlc2NhbGVyOyAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFzeW5jaHJvbm91cyBQcmVkaXZpZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweDdGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBTeW5jaFByZXNjYWxlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgU3luY2hyb25vdXMgUHJlZGl2aWRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHg3RkZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JUQ19TZXRTeW5jaFByZXNjYWxlcigpLiAqLworfSBMTF9SVENfSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIFRpbWUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRpbWVGb3JtYXQ7IC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQU0vUE0gVGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19USU1FX0ZPUk1BVAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfVElNRV9TZXRGb3JtYXQoKS4gKi8KKworICB1aW50OF90IEhvdXJzOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgSG91cnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxMiBpZiB0aGUgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0gaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAyMyBpZiB0aGUgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQgaXMgc2VsZWN0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldEhvdXIoKS4gKi8KKworICB1aW50OF90IE1pbnV0ZXM7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIFRpbWUgTWludXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDU5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19USU1FX1NldE1pbnV0ZSgpLiAqLworCisgIHVpbnQ4X3QgU2Vjb25kczsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgVGltZSBTZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gNTkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX1RJTUVfU2V0U2Vjb25kKCkuICovCit9IExMX1JUQ19UaW1lVHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBSVEMgRGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCBXZWVrRGF5OyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIFdlZWtEYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSVENfTExfRUNfV0VFS0RBWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfREFURV9TZXRXZWVrRGF5KCkuICovCisKKyAgdWludDhfdCBNb250aDsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIE1vbnRoLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX01PTlRICisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldE1vbnRoKCkuICovCisKKyAgdWludDhfdCBEYXk7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBEYXRlIERheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19EQVRFX1NldERheSgpLiAqLworCisgIHVpbnQ4X3QgWWVhcjsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgRGF0ZSBZZWFyLgorICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gOTkKKworICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0RBVEVfU2V0WWVhcigpLiAqLworfSBMTF9SVENfRGF0ZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgUlRDIEFsYXJtIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICBMTF9SVENfVGltZVR5cGVEZWYgQWxhcm1UaW1lOyAgLyohPCBTcGVjaWZpZXMgdGhlIFJUQyBBbGFybSBUaW1lIG1lbWJlcnMuICovCisKKyAgdWludDMyX3QgQWxhcm1NYXNrOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBSVEMgQWxhcm0gTWFza3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUlRDX0xMX0VDX0FMTUFfTUFTSyBmb3IgQUxBUk0gQSBvciBAcmVmIFJUQ19MTF9FQ19BTE1CX01BU0sgZm9yIEFMQVJNIEIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9SVENfQUxNQV9TZXRNYXNrKCkgZm9yIEFMQVJNIEEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEByZWYgTExfUlRDX0FMTUJfU2V0TWFzaygpIGZvciBBTEFSTSBCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IEFsYXJtRGF0ZVdlZWtEYXlTZWw7ICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIGlzIG9uIGRheSBvciBXZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19BTE1BX1dFRUtEQVlfU0VMRUNUSU9OIGZvciBBTEFSTSBBIG9yIEByZWYgUlRDX0xMX0VDX0FMTUJfV0VFS0RBWV9TRUxFQ1RJT04gZm9yIEFMQVJNIEIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkoKSBvciBAcmVmIExMX1JUQ19BTE1BX0Rpc2FibGVXZWVrZGF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFMQVJNIEEgb3IgQHJlZiBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5KCkgb3IgQHJlZiBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheSgpIGZvciBBTEFSTSBCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgQWxhcm1EYXRlV2Vla0RheTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgUlRDIEFsYXJtIERheS9XZWVrRGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBBbGFybURhdGVXZWVrRGF5U2VsIHNldCB0byBkYXksIHRoaXMgcGFyYW1ldGVyICBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDMxLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0RGF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFMQVJNIEEgb3IgQHJlZiBMTF9SVENfQUxNQl9TZXREYXkoKSBmb3IgQUxBUk0gQi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBBbGFybURhdGVXZWVrRGF5U2VsIHNldCB0byBXZWVrZGF5LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJUQ19MTF9FQ19XRUVLREFZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfUlRDX0FMTUFfU2V0V2Vla0RheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBBTEFSTSBBIG9yIEByZWYgTExfUlRDX0FMTUJfU2V0V2Vla0RheSgpIGZvciBBTEFSTSBCLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gTExfUlRDX0FsYXJtVHlwZURlZjsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBSVEMgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfRk9STUFUIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19GT1JNQVRfQklOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDBVIC8qITwgQmluYXJ5IGRhdGEgZm9ybWF0ICovCisjZGVmaW5lIExMX1JUQ19GT1JNQVRfQkNEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDFVIC8qITwgQkNEIGRhdGEgZm9ybWF0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1BX1dFRUtEQVlfU0VMRUNUSU9OIFJUQyBBbGFybSBBIERhdGUgV2Vla0RheQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBBbGFybSBBIERhdGUgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfV0VFS0RBWSBSVENfQUxSTUFSX1dEU0VMICAgICAgICAvKiE8IEFsYXJtIEEgV2Vla0RheSBpcyBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQl9XRUVLREFZX1NFTEVDVElPTiBSVEMgQWxhcm0gQiBEYXRlIFdlZWtEYXkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQWxhcm0gQiBEYXRlIGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX1dFRUtEQVkgUlRDX0FMUk1CUl9XRFNFTCAgICAgICAgLyohPCBBbGFybSBCIFdlZWtEYXkgaXMgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfR0VUX0ZMQUcgR2V0IEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1JUQ19SZWFkUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0lTUl9JVFNGICAgICAgICAgICAgICAgICAgICBSVENfSVNSX0lUU0YKKyNkZWZpbmUgTExfUlRDX0lTUl9SRUNBTFBGICAgICAgICAgICAgICAgICBSVENfSVNSX1JFQ0FMUEYKKyNkZWZpbmUgTExfUlRDX0lTUl9UQU1QM0YgICAgICAgICAgICAgICAgICBSVENfSVNSX1RBTVAzRgorI2RlZmluZSBMTF9SVENfSVNSX1RBTVAyRiAgICAgICAgICAgICAgICAgIFJUQ19JU1JfVEFNUDJGCisjZGVmaW5lIExMX1JUQ19JU1JfVEFNUDFGICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UQU1QMUYKKyNkZWZpbmUgTExfUlRDX0lTUl9UU09WRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX1RTT1ZGCisjZGVmaW5lIExMX1JUQ19JU1JfVFNGICAgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9UU0YKKyNkZWZpbmUgTExfUlRDX0lTUl9XVVRGICAgICAgICAgICAgICAgICAgICBSVENfSVNSX1dVVEYKKyNkZWZpbmUgTExfUlRDX0lTUl9BTFJCRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX0FMUkJGCisjZGVmaW5lIExMX1JUQ19JU1JfQUxSQUYgICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJBRgorI2RlZmluZSBMTF9SVENfSVNSX0lOSVRGICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfSU5JVEYKKyNkZWZpbmUgTExfUlRDX0lTUl9SU0YgICAgICAgICAgICAgICAgICAgICBSVENfSVNSX1JTRgorI2RlZmluZSBMTF9SVENfSVNSX0lOSVRTICAgICAgICAgICAgICAgICAgIFJUQ19JU1JfSU5JVFMKKyNkZWZpbmUgTExfUlRDX0lTUl9TSFBGICAgICAgICAgICAgICAgICAgICBSVENfSVNSX1NIUEYKKyNkZWZpbmUgTExfUlRDX0lTUl9XVVRXRiAgICAgICAgICAgICAgICAgICBSVENfSVNSX1dVVFdGCisjZGVmaW5lIExMX1JUQ19JU1JfQUxSQldGICAgICAgICAgICAgICAgICAgUlRDX0lTUl9BTFJCV0YKKyNkZWZpbmUgTExfUlRDX0lTUl9BTFJBV0YgICAgICAgICAgICAgICAgICBSVENfSVNSX0FMUkFXRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfUlRDX1JlYWRSZWcgYW5kICBMTF9SVENfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0NSX1RTSUUgICAgICAgICAgICAgICAgICAgICBSVENfQ1JfVFNJRQorI2RlZmluZSBMTF9SVENfQ1JfV1VUSUUgICAgICAgICAgICAgICAgICAgIFJUQ19DUl9XVVRJRQorI2RlZmluZSBMTF9SVENfQ1JfQUxSQklFICAgICAgICAgICAgICAgICAgIFJUQ19DUl9BTFJCSUUKKyNkZWZpbmUgTExfUlRDX0NSX0FMUkFJRSAgICAgICAgICAgICAgICAgICBSVENfQ1JfQUxSQUlFCisjZGVmaW5lIExMX1JUQ19UQU1QQ1JfVEFNUDNJRSAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QM0lFCisjZGVmaW5lIExMX1JUQ19UQU1QQ1JfVEFNUDJJRSAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMklFCisjZGVmaW5lIExMX1JUQ19UQU1QQ1JfVEFNUDFJRSAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMUlFCisjZGVmaW5lIExMX1JUQ19UQU1QQ1JfVEFNUElFICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QSUUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1dFRUtEQVkgIFdFRUsgREFZCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfTU9OREFZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpIC8qITwgTW9uZGF5ICAgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX1RVRVNEQVkgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAvKiE8IFR1ZXNkYXkgICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkgICAgICAgICAgICgodWludDhfdCkweDAzVSkgLyohPCBXZWRuZXNkYXkgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpIC8qITwgVGhydXNkYXkgICovCisjZGVmaW5lIExMX1JUQ19XRUVLREFZX0ZSSURBWSAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAvKiE8IEZyaWRheSAgICAqLworI2RlZmluZSBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWSAgICAgICAgICAgICgodWludDhfdCkweDA2VSkgLyohPCBTYXR1cmRheSAgKi8KKyNkZWZpbmUgTExfUlRDX1dFRUtEQVlfU1VOREFZICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpIC8qITwgU3VuZGF5ICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19NT05USCAgTU9OVEgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfSkFOVUFSWSAgICAgICAgICAgICAgICgodWludDhfdCkweDAxVSkgIC8qITwgSmFudWFyeSAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9GRUJSVUFSWSAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDJVKSAgLyohPCBGZWJydWFyeSAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX01BUkNIICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpICAvKiE8IE1hcmNoICAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfQVBSSUwgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA0VSkgIC8qITwgQXByaWwgICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9NQVkgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDVVKSAgLyohPCBNYXkgICAgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0pVTkUgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpICAvKiE8IEp1bmUgICAgICAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfSlVMWSAgICAgICAgICAgICAgICAgICgodWludDhfdCkweDA3VSkgIC8qITwgSnVseSAgICAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9BVUdVU1QgICAgICAgICAgICAgICAgKCh1aW50OF90KTB4MDhVKSAgLyohPCBBdWd1c3QgICAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX1NFUFRFTUJFUiAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwOVUpICAvKiE8IFNlcHRlbWJlciAqLworI2RlZmluZSBMTF9SVENfTU9OVEhfT0NUT0JFUiAgICAgICAgICAgICAgICgodWludDhfdCkweDEwVSkgIC8qITwgT2N0b2JlciAgICovCisjZGVmaW5lIExMX1JUQ19NT05USF9OT1ZFTUJFUiAgICAgICAgICAgICAgKCh1aW50OF90KTB4MTFVKSAgLyohPCBOb3ZlbWJlciAgKi8KKyNkZWZpbmUgTExfUlRDX01PTlRIX0RFQ0VNQkVSICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgxMlUpICAvKiE8IERlY2VtYmVyICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfSE9VUkZPUk1BVCAgSE9VUiBGT1JNQVQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IDI0IGhvdXIvZGF5IGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfSE9VUkZPUk1BVF9BTVBNICAgICAgICAgICAgIFJUQ19DUl9GTVQgICAgICAgICAgICAvKiE8IEFNL1BNIGhvdXIgZm9ybWF0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTEFSTU9VVCAgQUxBUk0gT1VUUFVUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMQVJNT1VUX0RJU0FCTEUgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE91dHB1dCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfQUxNQSAgICAgICAgICAgICAgIFJUQ19DUl9PU0VMXzAgICAgICAgICAgIC8qITwgQWxhcm0gQSBvdXRwdXQgZW5hYmxlZCAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfQUxNQiAgICAgICAgICAgICAgIFJUQ19DUl9PU0VMXzEgICAgICAgICAgIC8qITwgQWxhcm0gQiBvdXRwdXQgZW5hYmxlZCAqLworI2RlZmluZSBMTF9SVENfQUxBUk1PVVRfV0FLRVVQICAgICAgICAgICAgIFJUQ19DUl9PU0VMICAgICAgICAgICAgIC8qITwgV2FrZXVwIG91dHB1dCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTEFSTV9PVVRQVVRUWVBFICBBTEFSTSBPVVRQVVQgVFlQRQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTEFSTV9PVVRQVVRUWVBFX09QRU5EUkFJTiAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDX0FMQVJNLCB3aGVuIG1hcHBlZCBvbiBQQzEzLCBpcyBvcGVuLWRyYWluIG91dHB1dCAqLworI2RlZmluZSBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9QVVNIUFVMTCAgIFJUQ19PUl9BTEFSTU9VVFRZUEUgLyohPCBSVENfQUxBUk0sIHdoZW4gbWFwcGVkIG9uIFBDMTMsIGlzIHB1c2gtcHVsbCBvdXRwdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX09VVFBVVFBPTEFSSVRZX1BJTiAgT1VUUFVUIFBPTEFSSVRZIFBJTgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fSElHSCAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUGluIGlzIGhpZ2ggd2hlbiBBTFJBRi9BTFJCRi9XVVRGIGlzIGFzc2VydGVkIChkZXBlbmRpbmcgb24gT1NFTCkqLworI2RlZmluZSBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0xPVyAgICAgIFJUQ19DUl9QT0wgICAgICAgICAgICAvKiE8IFBpbiBpcyBsb3cgd2hlbiBBTFJBRi9BTFJCRi9XVVRGIGlzIGFzc2VydGVkIChkZXBlbmRpbmcgb24gT1NFTCkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RJTUVfRk9STUFUIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0ICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfVElNRV9GT1JNQVRfUE0gICAgICAgICAgICAgIFJUQ19UUl9QTSAgICAgICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19TSElGVF9TRUNPTkQgIFNISUZUIFNFQ09ORAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19TSElGVF9TRUNPTkRfREVMQVkgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qIERlbGF5IChzZWNvbmRzKSA9IFNVQkZTIC8gKFBSRURJVl9TICsgMSkgKi8KKyNkZWZpbmUgTExfUlRDX1NISUZUX1NFQ09ORF9BRFZBTkNFICAgICAgICBSVENfU0hJRlRSX0FERDFTICAgICAgLyogQWR2YW5jZSAoc2Vjb25kcykgPSAoMSAtIChTVUJGUyAvIChQUkVESVZfUyArIDEpKSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUFfTUFTSyAgQUxBUk1BIE1BU0sKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgTm8gbWFza3MgYXBwbGllZCBvbiBBbGFybSBBKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfTUFTS19EQVRFV0VFS0RBWSAgICAgICBSVENfQUxSTUFSX01TSzQgICAgICAgICAvKiE8IERhdGUvZGF5IGRvIG5vdCBjYXJlIGluIEFsYXJtIEEgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX0hPVVJTICAgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMyAgICAgICAgIC8qITwgSG91cnMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQSBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1BX01BU0tfTUlOVVRFUyAgICAgICAgICAgUlRDX0FMUk1BUl9NU0syICAgICAgICAgLyohPCBNaW51dGVzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEEgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQV9NQVNLX1NFQ09ORFMgICAgICAgICAgIFJUQ19BTFJNQVJfTVNLMSAgICAgICAgIC8qITwgU2Vjb25kcyBkbyBub3QgY2FyZSBpbiBBbGFybSBBIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfTUFTS19BTEwgICAgICAgICAgICAgICAoUlRDX0FMUk1BUl9NU0s0IHwgUlRDX0FMUk1BUl9NU0szIHwgUlRDX0FMUk1BUl9NU0syIHwgUlRDX0FMUk1BUl9NU0sxKSAvKiE8IE1hc2tzIGFsbCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQUxNQV9USU1FX0ZPUk1BVCAgQUxBUk1BIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU0gICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9QTSAgICAgICAgIFJUQ19BTFJNQVJfUE0gICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19BTE1CX01BU0sgIEFMQVJNQiBNQVNLCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19OT05FICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE5vIG1hc2tzIGFwcGxpZWQgb24gQWxhcm0gQiovCisjZGVmaW5lIExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkgICAgICAgUlRDX0FMUk1CUl9NU0s0ICAgICAgICAgLyohPCBEYXRlL2RheSBkbyBub3QgY2FyZSBpbiBBbGFybSBCIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19IT1VSUyAgICAgICAgICAgICBSVENfQUxSTUJSX01TSzMgICAgICAgICAvKiE8IEhvdXJzIGRvIG5vdCBjYXJlIGluIEFsYXJtIEIgY29tcGFyaXNvbiAqLworI2RlZmluZSBMTF9SVENfQUxNQl9NQVNLX01JTlVURVMgICAgICAgICAgIFJUQ19BTFJNQlJfTVNLMiAgICAgICAgIC8qITwgTWludXRlcyBkbyBub3QgY2FyZSBpbiBBbGFybSBCIGNvbXBhcmlzb24gKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTICAgICAgICAgICBSVENfQUxSTUJSX01TSzEgICAgICAgICAvKiE8IFNlY29uZHMgZG8gbm90IGNhcmUgaW4gQWxhcm0gQiBjb21wYXJpc29uICovCisjZGVmaW5lIExMX1JUQ19BTE1CX01BU0tfQUxMICAgICAgICAgICAgICAgKFJUQ19BTFJNQlJfTVNLNCB8IFJUQ19BTFJNQlJfTVNLMyB8IFJUQ19BTFJNQlJfTVNLMiB8IFJUQ19BTFJNQlJfTVNLMSkgLyohPCBNYXNrcyBhbGwgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0FMTUJfVElNRV9GT1JNQVQgIEFMQVJNQiBUSU1FIEZPUk1BVAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgQU0gb3IgMjQtaG91ciBmb3JtYXQgKi8KKyNkZWZpbmUgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfUE0gICAgICAgICBSVENfQUxSTUJSX1BNICAgICAgICAgLyohPCBQTSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVElNRVNUQU1QX0VER0UgIFRJTUVTVEFNUCBFREdFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORyAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBSVENfVFMgaW5wdXQgcmlzaW5nIGVkZ2UgZ2VuZXJhdGVzIGEgdGltZS1zdGFtcCBldmVudCAqLworI2RlZmluZSBMTF9SVENfVElNRVNUQU1QX0VER0VfRkFMTElORyAgICAgIFJUQ19DUl9UU0VER0UgICAgICAgICAvKiE8IFJUQ19UUyBpbnB1dCBmYWxsaW5nIGVkZ2UgZ2VuZXJhdGVzIGEgdGltZS1zdGFtcCBldmVuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UU19USU1FX0ZPUk1BVCAgVElNRVNUQU1QIFRJTUUgRk9STUFUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX1RTX1RJTUVfRk9STUFUX0FNICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBBTSBvciAyNC1ob3VyIGZvcm1hdCAqLworI2RlZmluZSBMTF9SVENfVFNfVElNRV9GT1JNQVRfUE0gICAgICAgICAgIFJUQ19UU1RSX1BNICAgICAgICAgICAvKiE8IFBNICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVIgIFRBTVBFUgorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSXzEgICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDFFIC8qITwgUlRDX1RBTVAxIGlucHV0IGRldGVjdGlvbiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfMiAgICAgICAgICAgICAgICAgICAgUlRDX1RBTVBDUl9UQU1QMkUgLyohPCBSVENfVEFNUDIgaW5wdXQgZGV0ZWN0aW9uICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl8zICAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAzRSAvKiE8IFJUQ19UQU1QMyBpbnB1dCBkZXRlY3Rpb24gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19UQU1QRVJfTUFTSyAgVEFNUEVSIE1BU0sKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjEgICAgICAgICBSVENfVEFNUENSX1RBTVAxTUYgLyohPCBUYW1wZXIgMSBldmVudCBnZW5lcmF0ZXMgYSB0cmlnZ2VyIGV2ZW50LiBUQU1QMUYgaXMgbWFza2VkIGFuZCBpbnRlcm5hbGx5IGNsZWFyZWQgYnkgaGFyZHdhcmUuVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQgKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX01BU0tfVEFNUEVSMiAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDJNRiAvKiE8IFRhbXBlciAyIGV2ZW50IGdlbmVyYXRlcyBhIHRyaWdnZXIgZXZlbnQuIFRBTVAyRiBpcyBtYXNrZWQgYW5kIGludGVybmFsbHkgY2xlYXJlZCBieSBoYXJkd2FyZS4gVGhlIGJhY2t1cCByZWdpc3RlcnMgYXJlIG5vdCBlcmFzZWQuICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjJfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjMgICAgICAgICBSVENfVEFNUENSX1RBTVAzTUYgLyohPCBUYW1wZXIgMyBldmVudCBnZW5lcmF0ZXMgYSB0cmlnZ2VyIGV2ZW50LiBUQU1QM0YgaXMgbWFza2VkIGFuZCBpbnRlcm5hbGx5IGNsZWFyZWQgYnkgaGFyZHdhcmUuIFRoZSBiYWNrdXAgcmVnaXN0ZXJzIGFyZSBub3QgZXJhc2VkICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX05PRVJBU0UgIFRBTVBFUiBOTyBFUkFTRQorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX05PRVJBU0VfVEFNUEVSMSAgICAgIFJUQ19UQU1QQ1JfVEFNUDFOT0VSQVNFIC8qITwgVGFtcGVyIDEgZXZlbnQgZG9lcyBub3QgZXJhc2UgdGhlIGJhY2t1cCByZWdpc3RlcnMuICovCisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjJfU1VQUE9SVCkKKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjIgICAgICBSVENfVEFNUENSX1RBTVAyTk9FUkFTRSAvKiE8IFRhbXBlciAyIGV2ZW50IGRvZXMgbm90IGVyYXNlIHRoZSBiYWNrdXAgcmVnaXN0ZXJzLiAqLworI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIzICAgICAgUlRDX1RBTVBDUl9UQU1QM05PRVJBU0UgLyohPCBUYW1wZXIgMyBldmVudCBkb2VzIG5vdCBlcmFzZSB0aGUgYmFja3VwIHJlZ2lzdGVycy4gKi8KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBQUkNIKQorLyoqIEBkZWZncm91cCBSVENfTExfRUNfVEFNUEVSX0RVUkFUSU9OICBUQU1QRVIgRFVSQVRJT04KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzFSVENDTEsgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUgc2FtcGxpbmcgZHVyaW5nIDEgUlRDQ0xLIGN5Y2xlICAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzJSVENDTEsgICAgIFJUQ19UQU1QQ1JfVEFNUFBSQ0hfMCAgLyohPCBUYW1wZXIgcGlucyBhcmUgcHJlLWNoYXJnZWQgYmVmb3JlIHNhbXBsaW5nIGR1cmluZyAyIFJUQ0NMSyBjeWNsZXMgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9EVVJBVElPTl80UlRDQ0xLICAgICBSVENfVEFNUENSX1RBTVBQUkNIXzEgIC8qITwgVGFtcGVyIHBpbnMgYXJlIHByZS1jaGFyZ2VkIGJlZm9yZSBzYW1wbGluZyBkdXJpbmcgNCBSVENDTEsgY3ljbGVzICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fOFJUQ0NMSyAgICAgUlRDX1RBTVBDUl9UQU1QUFJDSCAgICAvKiE8IFRhbXBlciBwaW5zIGFyZSBwcmUtY2hhcmdlZCBiZWZvcmUgc2FtcGxpbmcgZHVyaW5nIDggUlRDQ0xLIGN5Y2xlcyAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBQUkNIICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QQ1JfVEFNUEZMVCkKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9GSUxURVIgIFRBTVBFUiBGSUxURVIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX0ZJTFRFUl9ESVNBQkxFICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUYW1wZXIgZmlsdGVyIGlzIGRpc2FibGVkICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSXzJTQU1QTEUgICAgICAgUlRDX1RBTVBDUl9UQU1QRkxUXzAgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDIgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSXzRTQU1QTEUgICAgICAgUlRDX1RBTVBDUl9UQU1QRkxUXzEgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDQgY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUgICAgICAgUlRDX1RBTVBDUl9UQU1QRkxUICAgICAgLyohPCBUYW1wZXIgaXMgYWN0aXZhdGVkIGFmdGVyIDggY29uc2VjdXRpdmUgc2FtcGxlcyBhdCB0aGUgYWN0aXZlIGxldmVsLiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBGTFQgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBDUl9UQU1QRlJFUSkKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9TQU1QTEZSRVFESVYgIFRBTVBFUiBTQU1QTElORyBGUkVRVUVOQ1kgRElWSURFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzMyNzY4ICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAzMjc2OCAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8xNjM4NCAgIFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDE2Mzg0ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzgxOTIgICAgUlRDX1RBTVBDUl9UQU1QRlJFUV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gODE5MiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl80MDk2ICAgIChSVENfVEFNUENSX1RBTVBGUkVRXzEgfCBSVENfVEFNUENSX1RBTVBGUkVRXzApIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDQwOTYgKi8KKyNkZWZpbmUgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMjA0OCAgICBSVENfVEFNUENSX1RBTVBGUkVRXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVhY2ggb2YgdGhlIHRhbXBlciBpbnB1dHMgYXJlIHNhbXBsZWQgd2l0aCBhIGZyZXF1ZW5jeSA9ICBSVENDTEsgLyAyMDQ4ICovCisjZGVmaW5lIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzEwMjQgICAgKFJUQ19UQU1QQ1JfVEFNUEZSRVFfMiB8IFJUQ19UQU1QQ1JfVEFNUEZSRVFfMCkgLyohPCBFYWNoIG9mIHRoZSB0YW1wZXIgaW5wdXRzIGFyZSBzYW1wbGVkIHdpdGggYSBmcmVxdWVuY3kgPSAgUlRDQ0xLIC8gMTAyNCAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl81MTIgICAgIChSVENfVEFNUENSX1RBTVBGUkVRXzIgfCBSVENfVEFNUENSX1RBTVBGUkVRXzEpIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDUxMiAqLworI2RlZmluZSBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yNTYgICAgIFJUQ19UQU1QQ1JfVEFNUEZSRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWFjaCBvZiB0aGUgdGFtcGVyIGlucHV0cyBhcmUgc2FtcGxlZCB3aXRoIGEgZnJlcXVlbmN5ID0gIFJUQ0NMSyAvIDI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBGUkVRICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX1RBTVBFUl9BQ1RJVkVMRVZFTCAgVEFNUEVSIEFDVElWRSBMRVZFTAorICAqIEB7CisgICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAxICAgIFJUQ19UQU1QQ1JfVEFNUDFUUkcgLyohPCBSVENfVEFNUDEgaW5wdXQgZmFsbGluZyBlZGdlIChpZiBUQU1QRkxUID0gMDApIG9yIHN0YXlpbmcgaGlnaCAoaWYgVEFNUEZMVCAhPSAwMCkgdHJpZ2dlcnMgYSB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50Ki8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAyICAgIFJUQ19UQU1QQ1JfVEFNUDJUUkcgLyohPCBSVENfVEFNUDIgaW5wdXQgZmFsbGluZyBlZGdlIChpZiBUQU1QRkxUID0gMDApIG9yIHN0YXlpbmcgaGlnaCAoaWYgVEFNUEZMVCAhPSAwMCkgdHJpZ2dlcnMgYSB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50Ki8KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAzICAgIFJUQ19UQU1QQ1JfVEFNUDNUUkcgLyohPCBSVENfVEFNUDMgaW5wdXQgZmFsbGluZyBlZGdlIChpZiBUQU1QRkxUID0gMDApIG9yIHN0YXlpbmcgaGlnaCAoaWYgVEFNUEZMVCAhPSAwMCkgdHJpZ2dlcnMgYSB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50Ki8KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FQ19XQUtFVVBDTE9DS19ESVYgIFdBS0VVUCBDTE9DSyBESVYKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfRElWXzE2ICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBSVEMvMTYgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl84ICAgICAgICAgICAoUlRDX0NSX1dVQ0tTRUxfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDLzggY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl80ICAgICAgICAgICAoUlRDX0NSX1dVQ0tTRUxfMSkgICAgICAgICAgICAgICAgICAgIC8qITwgUlRDLzQgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8yICAgICAgICAgICAoUlRDX0NSX1dVQ0tTRUxfMSB8IFJUQ19DUl9XVUNLU0VMXzApIC8qITwgUlRDLzIgY2xvY2sgaXMgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfUlRDX1dBS0VVUENMT0NLX0NLU1BSRSAgICAgICAgICAoUlRDX0NSX1dVQ0tTRUxfMikgICAgICAgICAgICAgICAgICAgIC8qITwgY2tfc3ByZSAodXN1YWxseSAxIEh6KSBjbG9jayBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVCAgICAgIChSVENfQ1JfV1VDS1NFTF8yIHwgUlRDX0NSX1dVQ0tTRUxfMSkgLyohPCBja19zcHJlICh1c3VhbGx5IDEgSHopIGNsb2NrIGlzIHNlbGVjdGVkIGFuZCAyZXhwMTYgaXMgYWRkZWQgdG8gdGhlIFdVVCBjb3VudGVyIHZhbHVlKi8KKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFJUQ19CQUNLVVBfU1VQUE9SVCkKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0JLUCAgQkFDS1VQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0JLUF9EUjAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMTF9SVENfQktQX0RSMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIyICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzVQorI2RlZmluZSBMTF9SVENfQktQX0RSNCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVCisjaWYgUlRDX0JLUF9OVU1CRVIgPiA1CisjZGVmaW5lIExMX1JUQ19CS1BfRFI1ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNVUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjYgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2VQorI2RlZmluZSBMTF9SVENfQktQX0RSNyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDdVCisjZGVmaW5lIExMX1JUQ19CS1BfRFI4ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjkgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5VQorI2RlZmluZSBMTF9SVENfQktQX0RSMTAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEFVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQlUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjEyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDVQorI2RlZmluZSBMTF9SVENfQktQX0RSMTMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMERVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRVUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjE1ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGVQorI2VuZGlmIC8qIFJUQ19CS1BfTlVNQkVSID4gNSAqLworCisjaWYgUlRDX0JLUF9OVU1CRVIgPiAxNgorI2RlZmluZSBMTF9SVENfQktQX0RSMTYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVCisjZGVmaW5lIExMX1JUQ19CS1BfRFIxNyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMVUKKyNkZWZpbmUgTExfUlRDX0JLUF9EUjE4ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyVQorI2RlZmluZSBMTF9SVENfQktQX0RSMTkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTNVCisjZW5kaWYgLyogUlRDX0JLUF9OVU1CRVIgPiAxNiAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfQkFDS1VQX1NVUFBPUlQgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQ0FMSUJfT1VUUFVUICBDYWxpYnJhdGlvbiBvdXRwdXQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfT1VUUFVUX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IENhbGlicmF0aW9uIG91dHB1dCBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfT1VUUFVUXzFIWiAgICAgICAgICAgIChSVENfQ1JfQ09FIHwgUlRDX0NSX0NPU0VMKSAvKiE8IENhbGlicmF0aW9uIG91dHB1dCBpcyA1MTIgSHogKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX09VVFBVVF81MTJIWiAgICAgICAgICAoUlRDX0NSX0NPRSkgICAgICAgICAgICAgICAgLyohPCBDYWxpYnJhdGlvbiBvdXRwdXQgaXMgMSBIeiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUNfQ0FMSUJfSU5TRVJUUFVMU0UgIENhbGlicmF0aW9uIHB1bHNlIGluc2VydGlvbiAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfTk9ORSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IE5vIFJUQ0NMSyBwdWxzZXMgYXJlIGFkZGVkICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9JTlNFUlRQVUxTRV9TRVQgICAgICAgUlRDX0NBTFJfQ0FMUCAgICAgICAgIC8qITwgT25lIFJUQ0NMSyBwdWxzZSBpcyBlZmZlY3RpdmVseSBpbnNlcnRlZCBldmVyeSAyZXhwMTEgcHVsc2VzIChmcmVxdWVuY3kgaW5jcmVhc2VkIGJ5IDQ4OC41IHBwbSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VDX0NBTElCX1BFUklPRCAgQ2FsaWJyYXRpb24gcGVyaW9kCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfUlRDX0NBTElCX1BFUklPRF8zMlNFQyAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBVc2UgYSAzMi1zZWNvbmQgY2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIExMX1JUQ19DQUxJQl9QRVJJT0RfMTZTRUMgICAgICAgICAgUlRDX0NBTFJfQ0FMVzE2ICAgICAgIC8qITwgVXNlIGEgMTYtc2Vjb25kIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZCAqLworI2RlZmluZSBMTF9SVENfQ0FMSUJfUEVSSU9EXzhTRUMgICAgICAgICAgIFJUQ19DQUxSX0NBTFc4ICAgICAgICAvKiE8IFVzZSBhIDgtc2Vjb25kIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0V4cG9ydGVkX01hY3JvcyBSVEMgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fV1JJVEVfUkVBRCBDb21tb24gV3JpdGUgYW5kIHJlYWQgcmVnaXN0ZXJzIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBSVEMgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1JUQ19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFJUQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9SVENfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VNX0NvbnZlcnQgQ29udmVydCBoZWxwZXIgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIZWxwZXIgbWFjcm8gdG8gY29udmVydCBhIHZhbHVlIGZyb20gMiBkaWdpdCBkZWNpbWFsIGZvcm1hdCB0byBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1ZBTFVFX18gQnl0ZSB0byBiZSBjb252ZXJ0ZWQKKyAgKiBAcmV0dmFsIENvbnZlcnRlZCBieXRlCisgICovCisjZGVmaW5lIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChfX1ZBTFVFX18pICh1aW50OF90KSgoKChfX1ZBTFVFX18pIC8gMTBVKSA8PCA0VSkgfCAoKF9fVkFMVUVfXykgJSAxMFUpKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byBjb252ZXJ0IGEgdmFsdWUgZnJvbSBCQ0QgZm9ybWF0IHRvIDIgZGlnaXQgZGVjaW1hbCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBCQ0QgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICogQHJldHZhbCBDb252ZXJ0ZWQgYnl0ZQorICAqLworI2RlZmluZSBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oX19WQUxVRV9fKSAodWludDhfdCkoKCgodWludDhfdCkoKF9fVkFMVUVfXykgJiAodWludDhfdCkweEYwVSkgPj4gKHVpbnQ4X3QpMHg0VSkgKiAxMFUgKSArICgoX19WQUxVRV9fKSAmICh1aW50OF90KTB4MEZVKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fRGF0ZSBEYXRlIGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSB3ZWVrZGF5LgorICAqIEBwYXJhbSAgX19SVENfREFURV9fIERhdGUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0IGZ1bmN0aW9uLgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfV0VFS0RBWShfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj4gUlRDX09GRlNFVF9XRUVLREFZKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBZZWFyIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX0RBVEVfXyBWYWx1ZSByZXR1cm5lZCBieSBAcmVmICBMTF9SVENfREFURV9HZXQKKyAgKiBAcmV0dmFsIFllYXIgaW4gQkNEIGZvcm1hdCAoMHgwMCAuIC4gLiAweDk5KQorICAqLworI2RlZmluZSBfX0xMX1JUQ19HRVRfWUVBUihfX1JUQ19EQVRFX18pICgoX19SVENfREFURV9fKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19EQVRFX18gVmFsdWUgcmV0dXJuZWQgYnkgQHJlZiAgTExfUlRDX0RBVEVfR2V0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KQU5VQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0ZFQlJVQVJZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BUkNICisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FQUklMCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX01BWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVVHVVNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX1NFUFRFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9PQ1RPQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX05PVkVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0RFQ0VNQkVSCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9NT05USChfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj5SVENfT0ZGU0VUX01PTlRIKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBwYXJhbSAgX19SVENfREFURV9fIFZhbHVlIHJldHVybmVkIGJ5IEByZWYgIExMX1JUQ19EQVRFX0dldAorICAqIEByZXR2YWwgRGF5IGluIEJDRCBmb3JtYXQgKDB4MDEgLiAuIC4gMHgzMSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX0RBWShfX1JUQ19EQVRFX18pICgoKF9fUlRDX0RBVEVfXykgPj5SVENfT0ZGU0VUX0RBWSkgJiAweDAwMDAwMEZGVSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRU1fVGltZSBUaW1lIGhlbHBlciBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhlbHBlciBtYWNybyB0byByZXRyaWV2ZSBob3VyIGluIEJDRCBmb3JtYXQKKyAgKiBAcGFyYW0gIF9fUlRDX1RJTUVfXyBSVEMgdGltZSByZXR1cm5lZCBieSBAcmVmIExMX1JUQ19USU1FX0dldCBmdW5jdGlvbgorICAqIEByZXR2YWwgSG91cnMgaW4gQkNEIGZvcm1hdCAoMHgwMS4gLiAuMHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMpCisgICovCisjZGVmaW5lIF9fTExfUlRDX0dFVF9IT1VSKF9fUlRDX1RJTUVfXykgKCgoX19SVENfVElNRV9fKSA+PiBSVENfT0ZGU0VUX0hPVVIpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIG1pbnV0ZSBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19USU1FX18gUlRDIHRpbWUgcmV0dXJuZWQgYnkgQHJlZiBMTF9SVENfVElNRV9HZXQgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdCAoMHgwMC4gLiAuMHg1OSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX01JTlVURShfX1JUQ19USU1FX18pICgoKF9fUlRDX1RJTUVfXykgPj4gUlRDX09GRlNFVF9NSU5VVEUpICYgMHgwMDAwMDBGRlUpCisKKy8qKgorICAqIEBicmllZiAgSGVscGVyIG1hY3JvIHRvIHJldHJpZXZlIHNlY29uZCBpbiBCQ0QgZm9ybWF0CisgICogQHBhcmFtICBfX1JUQ19USU1FX18gUlRDIHRpbWUgcmV0dXJuZWQgYnkgQHJlZiBMTF9SVENfVElNRV9HZXQgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIFNlY29uZHMgaW4gIGZvcm1hdCAoMHgwMC4gLiAuMHg1OSkKKyAgKi8KKyNkZWZpbmUgX19MTF9SVENfR0VUX1NFQ09ORChfX1JUQ19USU1FX18pICgoX19SVENfVElNRV9fKSAmIDB4MDAwMDAwRkZVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSVENfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFJUQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBIb3VycyBmb3JtYXQgKDI0IGhvdXIvZGF5IG9yIEFNL1BNIGhvdXIgZm9ybWF0KQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRk1UICAgICAgICAgICBMTF9SVENfU2V0SG91ckZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfSE9VUkZPUk1BVF9BTVBNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0SG91ckZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91ckZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0ZNVCwgSG91ckZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEhvdXJzIGZvcm1hdCAoMjQgaG91ci9kYXkgb3IgQU0vUE0gaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRk1UICAgICAgICAgICBMTF9SVENfR2V0SG91ckZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0hPVVJGT1JNQVRfQU1QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX0ZNVCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgZmxhZyB0byBiZSByb3V0ZWQgdG8gUlRDX0FMQVJNIG91dHB1dAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBPU0VMICAgICAgICAgIExMX1JUQ19TZXRBbGFybU91dEV2ZW50CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQWxhcm1PdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1BCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0FMTUIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfV0FLRVVQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0QWxhcm1PdXRFdmVudChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQWxhcm1PdXRwdXQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9PU0VMLCBBbGFybU91dHB1dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBmbGFnIHRvIGJlIHJvdXRlZCB0byBSVENfQUxBUk0gb3V0cHV0CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgT1NFTCAgICAgICAgICBMTF9SVENfR2V0QWxhcm1PdXRFdmVudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1PVVRfQUxNQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTEFSTU9VVF9BTE1CCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNT1VUX1dBS0VVUAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRBbGFybU91dEV2ZW50KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DUiwgUlRDX0NSX09TRUwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDX0FMQVJNIG91dHB1dCB0eXBlIChBTEFSTSBpbiBwdXNoLXB1bGwgb3Igb3Blbi1kcmFpbiBvdXRwdXQpCisgICogQG5vdGUgICBVc2VkIG9ubHkgd2hlbiBSVENfQUxBUk0gaXMgbWFwcGVkIG9uIFBDMTMKKyAgKiBAcm10b2xsIE9SICAgICAgICBBTEFSTU9VVFRZUEUgIExMX1JUQ19TZXRBbGFybU91dHB1dFR5cGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9PUEVORFJBSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxBUk1fT1VUUFVUVFlQRV9QVVNIUFVMTAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldEFsYXJtT3V0cHV0VHlwZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgT3V0cHV0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPk9SLCBSVENfT1JfQUxBUk1PVVRUWVBFLCBPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfQUxBUk0gb3V0cHV0IHR5cGUgKEFMQVJNIGluIHB1c2gtcHVsbCBvciBvcGVuLWRyYWluIG91dHB1dCkKKyAgKiBAbm90ZSAgIHVzZWQgb25seSB3aGVuIFJUQ19BTEFSTSBpcyBtYXBwZWQgb24gUEMxMworICAqIEBybXRvbGwgT1IgICAgICAgIEFMQVJNT1VUVFlQRSAgTExfUlRDX0dldEFsYXJtT3V0cHV0VHlwZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfT1BFTkRSQUlOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMQVJNX09VVFBVVFRZUEVfUFVTSFBVTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0QWxhcm1PdXRwdXRUeXBlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5PUiwgUlRDX09SX0FMQVJNT1VUVFlQRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbml0aWFsaXphdGlvbiBtb2RlCisgICogQG5vdGUgICBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHVzZWQgdG8gcHJvZ3JhbSB0aW1lIGFuZCBkYXRlIHJlZ2lzdGVyIChSVENfVFIgYW5kIFJUQ19EUikKKyAgKiAgICAgICAgIGFuZCBwcmVzY2FsZXIgcmVnaXN0ZXIgKFJUQ19QUkVSKS4KKyAgKiAgICAgICAgIENvdW50ZXJzIGFyZSBzdG9wcGVkIGFuZCBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBuZXcgdmFsdWUgd2hlbiBJTklUIGlzIHJlc2V0LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIElOSVQgICAgICAgICAgTExfUlRDX0VuYWJsZUluaXRNb2RlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgMHhGRkZGRkZGRlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaW5pdGlhbGl6YXRpb24gbW9kZSAoRnJlZSBydW5uaW5nIG1vZGUpCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVCAgICAgICAgICBMTF9SVENfRGlzYWJsZUluaXRNb2RlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJbml0TW9kZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh1aW50MzJfdCl+UlRDX0lTUl9JTklUKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgT3V0cHV0IHBvbGFyaXR5IChwaW4gaXMgbG93IHdoZW4gQUxSQUYvQUxSQkYvV1VURiBpcyBhc3NlcnRlZCkKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUE9MICAgICAgICAgICBMTF9SVENfU2V0T3V0cHV0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19PVVRQVVRQT0xBUklUWV9QSU5fTE9XCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfU2V0T3V0cHV0UG9sYXJpdHkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkNSLCBSVENfQ1JfUE9MLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IE91dHB1dCBwb2xhcml0eQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFBPTCAgICAgICAgICAgTExfUlRDX0dldE91dHB1dFBvbGFyaXR5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfT1VUUFVUUE9MQVJJVFlfUElOX0xPVworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19HZXRPdXRwdXRQb2xhcml0eShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9QT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQnlwYXNzIHRoZSBzaGFkb3cgcmVnaXN0ZXJzCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJZUFNIQUQgICAgICAgTExfUlRDX0VuYWJsZVNoYWRvd1JlZ0J5cGFzcworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVTaGFkb3dSZWdCeXBhc3MoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CWVBTSEFEKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEJ5cGFzcyB0aGUgc2hhZG93IHJlZ2lzdGVycworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJZUFNIQUQgICAgICAgTExfUlRDX0Rpc2FibGVTaGFkb3dSZWdCeXBhc3MKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVNoYWRvd1JlZ0J5cGFzcyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQllQU0hBRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU2hhZG93IHJlZ2lzdGVycyBieXBhc3MgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQllQU0hBRCAgICAgICBMTF9SVENfSXNTaGFkb3dSZWdCeXBhc3NFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc1NoYWRvd1JlZ0J5cGFzc0VuYWJsZWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQllQU0hBRCkgPT0gKFJUQ19DUl9CWVBTSEFEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSVENfUkVGSU4gcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiAoNTAgb3IgNjAgSHopCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBSRUZDS09OICAgICAgIExMX1JUQ19FbmFibGVSZWZDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVSZWZDbG9jayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1JFRkNLT04pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRDX1JFRklOIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24gKDUwIG9yIDYwIEh6KQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSAgIEl0IGNhbiBiZSB3cml0dGVuIGluIGluaXRpYWxpemF0aW9uIG1vZGUgb25seSAoQHJlZiBMTF9SVENfRW5hYmxlSW5pdE1vZGUgZnVuY3Rpb24pCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgUkVGQ0tPTiAgICAgICBMTF9SVENfRGlzYWJsZVJlZkNsb2NrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVSZWZDbG9jayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfUkVGQ0tPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFzeW5jaHJvbm91cyBwcmVzY2FsZXIgZmFjdG9yCisgICogQHJtdG9sbCBQUkVSICAgICAgICAgUFJFRElWX0EgICAgICBMTF9SVENfU2V0QXN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQXN5bmNoUHJlc2NhbGVyIFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19TZXRBc3luY2hQcmVzY2FsZXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEFzeW5jaFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5QUkVSLCBSVENfUFJFUl9QUkVESVZfQSwgQXN5bmNoUHJlc2NhbGVyIDw8IFJUQ19QUkVSX1BSRURJVl9BX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFN5bmNocm9ub3VzIHByZXNjYWxlciBmYWN0b3IKKyAgKiBAcm10b2xsIFBSRVIgICAgICAgICBQUkVESVZfUyAgICAgIExMX1JUQ19TZXRTeW5jaFByZXNjYWxlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN5bmNoUHJlc2NhbGVyIFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1NldFN5bmNoUHJlc2NhbGVyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTeW5jaFByZXNjYWxlcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5QUkVSLCBSVENfUFJFUl9QUkVESVZfUywgU3luY2hQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBc3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUFJFUiAgICAgICAgIFBSRURJVl9BICAgICAgTExfUlRDX0dldEFzeW5jaFByZXNjYWxlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDB4N0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfR2V0QXN5bmNoUHJlc2NhbGVyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5QUkVSLCBSVENfUFJFUl9QUkVESVZfQSkgPj4gUlRDX1BSRVJfUFJFRElWX0FfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU3luY2hyb25vdXMgcHJlc2NhbGVyIGZhY3RvcgorICAqIEBybXRvbGwgUFJFUiAgICAgICAgIFBSRURJVl9TICAgICAgTExfUlRDX0dldFN5bmNoUHJlc2NhbGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMHg3RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0dldFN5bmNoUHJlc2NhbGVyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5QUkVSLCBSVENfUFJFUl9QUkVESVZfUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycy4KKyAgKiBAcm10b2xsIFdQUiAgICAgICAgICBLRVkgICAgICAgICAgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+V1BSLCBSVENfV1JJVEVfUFJPVEVDVElPTl9ESVNBQkxFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzLgorICAqIEBybXRvbGwgV1BSICAgICAgICAgIEtFWSAgICAgICAgICAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPldQUiwgUlRDX1dSSVRFX1BST1RFQ1RJT05fRU5BQkxFXzEpOworICBXUklURV9SRUcoUlRDeC0+V1BSLCBSVENfV1JJVEVfUFJPVEVDVElPTl9FTkFCTEVfMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJUQ19PVVQgcmVtYXAKKyAgKiBAcm10b2xsIE9SICAgICAgICAgICBPVVRfUk1QICAgICAgIExMX1JUQ19FbmFibGVPdXRSZW1hcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVPdXRSZW1hcChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5PUiwgUlRDX09SX09VVF9STVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlRDX09VVCByZW1hcAorICAqIEBybXRvbGwgT1IgICAgICAgICAgIE9VVF9STVAgICAgICAgTExfUlRDX0Rpc2FibGVPdXRSZW1hcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlT3V0UmVtYXAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5PUiwgUlRDX09SX09VVF9STVApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9UaW1lIFRpbWUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aW1lIGZvcm1hdCAoQU0vMjQtaG91ciBvciBQTSBub3RhdGlvbikKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBybXRvbGwgVFIgICAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0Rm9ybWF0CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZUZvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0Rm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUaW1lRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRSLCBSVENfVFJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lIGZvcm1hdCAoQU0gb3IgUE0gbm90YXRpb24pCisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQHJtdG9sbCBUUiAgICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVElNRV9HZXRGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9BTV9PUl8yNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FX0ZPUk1BVF9QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldEZvcm1hdChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFIsIFJUQ19UUl9QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGhvdXIgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0SG91clxuCisgICogICAgICAgICBUUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgSG91cnMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU2V0SG91cihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgSG91cnMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfSFQgfCBSVENfVFJfSFUpLAorICAgICAgICAgICAgICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfVFJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX1RSX0hVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgUmVhZCBlaXRoZXIgUlRDX1NTUiBvciBSVENfVFIgbG9ja3MgdGhlIHZhbHVlcyBpbiB0aGUgaGlnaGVyLW9yZGVyIGNhbGVuZGFyCisgICogICAgICAgc2hhZG93IHJlZ2lzdGVycyB1bnRpbCBSVENfRFIgaXMgcmVhZCAoTExfUlRDX1JlYWRSZWcoUlRDLCBEUikpLgorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgaG91ciBmcm9tIEJDRCB0bworICAqICAgICAgIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19USU1FX0dldEhvdXJcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5UUiwgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX1RSX0hUKSA+PiBSVENfVFJfSFRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfSFUpID4+IFJUQ19UUl9IVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1pbnV0ZXMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX1NldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9TZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1pbnV0ZXMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+VFIsIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSksCisgICAgICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX1RSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19UUl9NTlVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIFJlYWQgZWl0aGVyIFJUQ19TU1Igb3IgUlRDX1RSIGxvY2tzIHRoZSB2YWx1ZXMgaW4gdGhlIGhpZ2hlci1vcmRlciBjYWxlbmRhcgorICAqICAgICAgIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgUlRDX0RSIGlzIHJlYWQgKExMX1JUQ19SZWFkUmVnKFJUQywgRFIpKS4KKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IG1pbnV0ZSBmcm9tIEJDRAorICAqICAgICAgIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRSICAgICAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19USU1FX0dldE1pbnV0ZVxuCisgICogICAgICAgICBUUiAgICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVElNRV9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVElNRV9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPlRSLCAoUlRDX1RSX01OVCB8IFJUQ19UUl9NTlUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19UUl9NTlQpID4+IFJUQ19UUl9NTlRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfTU5VKSA+PiBSVENfVFJfTU5VX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBJdCBjYW4gYmUgd3JpdHRlbiBpbiBpbml0aWFsaXphdGlvbiBtb2RlIG9ubHkgKEByZWYgTExfUlRDX0VuYWJsZUluaXRNb2RlIGZ1bmN0aW9uKQorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBUUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9TZXRTZWNvbmRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RJTUVfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9TVCB8IFJUQ19UUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX1RSX1NUX1BvcyAtIDRVKSkgfCAoKFNlY29uZHMgJiAweDBGVSkgPDwgUlRDX1RSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gQkNECisgICogICAgICAgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+VFIsIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19UUl9TVCkgPj4gUlRDX1RSX1NUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX1RSX1NVKSA+PiBSVENfVFJfU1VfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgSXQgY2FuIGJlIHdyaXR0ZW4gaW4gaW5pdGlhbGl6YXRpb24gbW9kZSBvbmx5IChAcmVmIExMX1JUQ19FbmFibGVJbml0TW9kZSBmdW5jdGlvbikKKyAgKiBAbm90ZSBUaW1lRm9ybWF0IGFuZCBIb3VycyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGZvcm1hdAorICAqIEBybXRvbGwgVFIgICAgICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnXG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19USU1FX0NvbmZpZ1xuCisgICogICAgICAgICBUUiAgICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVElNRV9Db25maWdcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RJTUVfQ29uZmlnCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRm9ybWF0MTJfMjQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVElNRV9GT1JNQVRfUE0KKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfQ29uZmlnKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBGb3JtYXQxMl8yNCwgdWludDMyX3QgSG91cnMsIHVpbnQzMl90IE1pbnV0ZXMsIHVpbnQzMl90IFNlY29uZHMpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IEZvcm1hdDEyXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX1RSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19UUl9IVV9Qb3MpKSAgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfVFJfTU5UX1BvcyAtIDRVKSkgfCAoKE1pbnV0ZXMgJiAweDBGVSkgPDwgUlRDX1RSX01OVV9Qb3MpKSB8IFwKKyAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19UUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19UUl9TVV9Qb3MpKTsKKyAgTU9ESUZZX1JFRyhSVEN4LT5UUiwgKFJUQ19UUl9QTSB8IFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VIHwgUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBSZWFkIGVpdGhlciBSVENfU1NSIG9yIFJUQ19UUiBsb2NrcyB0aGUgdmFsdWVzIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIKKyAgKiAgICAgICBzaGFkb3cgcmVnaXN0ZXJzIHVudGlsIFJUQ19EUiBpcyByZWFkIChMTF9SVENfUmVhZFJlZyhSVEMsIERSKSkuCisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfSE9VUiwgX19MTF9SVENfR0VUX01JTlVURSBhbmQgX19MTF9SVENfR0VUX1NFQ09ORAorICAqICAgICAgIGFyZSBhdmFpbGFibGUgdG8gZ2V0IGluZGVwZW5kZW50bHkgZWFjaCBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBUUiAgICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19USU1FX0dldFxuCisgICogICAgICAgICBUUiAgICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVElNRV9HZXRcbgorICAqICAgICAgICAgVFIgICAgICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX1RJTUVfR2V0XG4KKyAgKiAgICAgICAgIFRSICAgICAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19USU1FX0dldAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzIChGb3JtYXQ6IDB4MDBISE1NU1MpLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKyAgCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5UUiwgKFJUQ19UUl9IVCB8IFJUQ19UUl9IVSB8IFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VIHwgUlRDX1RSX1NUIHwgUlRDX1RSX1NVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKCgodGVtcCAmIFJUQ19UUl9IVCkgPj4gUlRDX1RSX0hUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX1RSX0hVKSA+PiBSVENfVFJfSFVfUG9zKSkgPDwgUlRDX09GRlNFVF9IT1VSKSB8ICBcCisgICAgICAgICAgICAgICAgICAgICgoKCgodGVtcCAmIFJUQ19UUl9NTlQpID4+IFJUQ19UUl9NTlRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfVFJfTU5VKSA+PiBSVENfVFJfTU5VX1BvcykpIDw8IFJUQ19PRkZTRVRfTUlOVVRFKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHRlbXAgJiBSVENfVFJfU1QpID4+IFJUQ19UUl9TVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19UUl9TVSkgPj4gUlRDX1RSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNZW1vcml6ZSB3aGV0aGVyIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjaGFuZ2UgaGFzIGJlZW4gcGVyZm9ybWVkCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRW5hYmxlRGF5TGlnaHRTdG9yZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0VuYWJsZURheUxpZ2h0U3RvcmUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9CS1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgbWVtb3JpemF0aW9uIHdoZXRoZXIgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNoYW5nZSBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEJLUCAgICAgICAgICAgTExfUlRDX1RJTUVfRGlzYWJsZURheUxpZ2h0U3RvcmUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVElNRV9EaXNhYmxlRGF5TGlnaHRTdG9yZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQktQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSVEMgRGF5IExpZ2h0IFNhdmluZyBzdG9yZWQgb3BlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfVElNRV9Jc0RheUxpZ2h0U3RvcmVFbmFibGVkCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0lzRGF5TGlnaHRTdG9yZUVuYWJsZWQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQktQKSA9PSAoUlRDX0NSX0JLUCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTdWJ0cmFjdCAxIGhvdXIgKHdpbnRlciB0aW1lIGNoYW5nZSkKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgU1VCMUggICAgICAgICBMTF9SVENfVElNRV9EZWNIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfRGVjSG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1NVQjFIKTsKK30KKworLyoqCisgICogQGJyaWVmICBBZGQgMSBob3VyIChzdW1tZXIgdGltZSBjaGFuZ2UpCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFERDFIICAgICAgICAgTExfUlRDX1RJTUVfSW5jSG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19USU1FX0luY0hvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BREQxSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFN1YiBzZWNvbmQgdmFsdWUgaW4gdGhlIHN5bmNocm9ub3VzIHByZXNjYWxlciBjb3VudGVyLgorICAqIEBub3RlICBZb3UgY2FuIHVzZSBib3RoIFN1YlNlY29uZHMgdmFsdWUgYW5kIFNlY29uZEZyYWN0aW9uIChQUkVESVZfUyB0aHJvdWdoCisgICogICAgICAgIExMX1JUQ19HZXRTeW5jaFByZXNjYWxlciBmdW5jdGlvbikgdGVybXMgcmV0dXJuZWQgdG8gY29udmVydCBDYWxlbmRhcgorICAqICAgICAgICBTdWJTZWNvbmRzIHZhbHVlIGluIHNlY29uZCBmcmFjdGlvbiByYXRpbyB3aXRoIHRpbWUgdW5pdCBmb2xsb3dpbmcKKyAgKiAgICAgICAgZ2VuZXJpYyBmb3JtdWxhOgorICAqICAgICAgICAgID09PiBTZWNvbmRzIGZyYWN0aW9uIHJhdGlvICogdGltZV91bml0PSBbKFNlY29uZEZyYWN0aW9uLVN1YlNlY29uZHMpLyhTZWNvbmRGcmFjdGlvbisxKV0gKiB0aW1lX3VuaXQKKyAgKiAgICAgICAgVGhpcyBjb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgb25seSBpZiBubyBzaGlmdCBvcGVyYXRpb24gaXMgcGVuZGluZworICAqICAgICAgICAoaWUuIFNIRlA9MCkgd2hlbiBQUkVESVZfUyA+PSBTUy4KKyAgKiBAcm10b2xsIFNTUiAgICAgICAgICBTUyAgICAgICAgICAgIExMX1JUQ19USU1FX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN1YiBzZWNvbmQgdmFsdWUgKG51bWJlciBiZXR3ZWVuIDAgYW5kIDY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19USU1FX0dldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+U1NSLCBSVENfU1NSX1NTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3luY2hyb25pemUgdG8gYSByZW1vdGUgY2xvY2sgd2l0aCBhIGhpZ2ggZGVncmVlIG9mIHByZWNpc2lvbi4KKyAgKiBAbm90ZSAgIFRoaXMgb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IHN1YnRyYWN0cyBmcm9tIChkZWxheXMpIG9yIGFkdmFuY2UgdGhlIGNsb2NrIG9mIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQuCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgV2hlbiBSRUZDS09OIGlzIHNldCwgZmlybXdhcmUgbXVzdCBub3Qgd3JpdGUgdG8gU2hpZnQgY29udHJvbCByZWdpc3Rlci4KKyAgKiBAcm10b2xsIFNISUZUUiAgICAgICBBREQxUyAgICAgICAgIExMX1JUQ19USU1FX1N5bmNocm9uaXplXG4KKyAgKiAgICAgICAgIFNISUZUUiAgICAgICBTVUJGUyAgICAgICAgIExMX1JUQ19USU1FX1N5bmNocm9uaXplCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2hpZnRTZWNvbmQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfU0hJRlRfU0VDT05EX0RFTEFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1NISUZUX1NFQ09ORF9BRFZBTkNFCisgICogQHBhcmFtICBGcmFjdGlvbiBOdW1iZXIgb2YgU2Vjb25kcyBGcmFjdGlvbnMgKGFueSB2YWx1ZSBmcm9tIDAgdG8gMHg3RkZGKQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RJTUVfU3luY2hyb25pemUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNoaWZ0U2Vjb25kLCB1aW50MzJfdCBGcmFjdGlvbikKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPlNISUZUUiwgU2hpZnRTZWNvbmQgfCBGcmFjdGlvbik7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0RhdGUgRGF0ZQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IFllYXIgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgWWVhciBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgWVQgICAgICAgICAgICBMTF9SVENfREFURV9TZXRZZWFyXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX1NldFllYXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBZZWFyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg5OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0WWVhcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgWWVhcikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSksCisgICAgICAgICAgICAgKCgoWWVhciAmIDB4RjBVKSA8PCAoUlRDX0RSX1lUX1BvcyAtIDRVKSkgfCAoKFllYXIgJiAweDBGVSkgPDwgUlRDX0RSX1lVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgWWVhciBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFllYXIgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0WWVhclxuCisgICogICAgICAgICBEUiAgICAgICAgICAgWVUgICAgICAgICAgICBMTF9SVENfREFURV9HZXRZZWFyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDk5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0WWVhcihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfWVQgfCBSVENfRFJfWVUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9ZVCkgPj4gUlRDX0RSX1lUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX1lVKSA+PiBSVENfRFJfWVVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdlZWsgZGF5CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgV0RVICAgICAgICAgICBMTF9SVENfREFURV9TZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2Vla0RheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfREFURV9TZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXZWVrRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkRSLCBSVENfRFJfV0RVLCBXZWVrRGF5IDw8IFJUQ19EUl9XRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgV2VlayBkYXkKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIFdEVSAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfREFURV9HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5EUiwgUlRDX0RSX1dEVSkgPj4gUlRDX0RSX1dEVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNb250aCBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9TZXRNb250aFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVUgICAgICAgICAgICBMTF9SVENfREFURV9TZXRNb250aAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vbnRoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX1NldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNb250aCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSksCisgICAgICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBNb250aCBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaWYgc2hhZG93IG1vZGUgaXMgZGlzYWJsZWQgKEJZUFNIQUQ9MCksIG5lZWQgdG8gY2hlY2sgaWYgUlNGIGZsYWcgaXMgc2V0CisgICogICAgICAgYmVmb3JlIHJlYWRpbmcgdGhpcyBiaXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1vbnRoIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldE1vbnRoXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldE1vbnRoCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldE1vbnRoKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5EUiwgKFJUQ19EUl9NVCB8IFJUQ19EUl9NVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0RSX01UKSA+PiBSVENfRFJfTVRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfRFJfTVUpID4+IFJUQ19EUl9NVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRGF5IGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IERheSBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFQgICAgICAgICAgICBMTF9SVENfREFURV9TZXREYXlcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0RBVEVfU2V0RGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0RBVEVfU2V0RGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpLAorICAgICAgICAgICAgICgoKERheSAmIDB4RjBVKSA8PCAoUlRDX0RSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfRFJfRFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGlmIHNoYWRvdyBtb2RlIGlzIGRpc2FibGVkIChCWVBTSEFEPTApLCBuZWVkIHRvIGNoZWNrIGlmIFJTRiBmbGFnIGlzIHNldAorICAqICAgICAgIGJlZm9yZSByZWFkaW5nIHRoaXMgYml0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0RGF5XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19EQVRFX0dldERheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+RFIsIChSVENfRFJfRFQgfCBSVENfRFJfRFUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19EUl9EVCkgPj4gUlRDX0RSX0RUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX0RVKSA+PiBSVENfRFJfRFVfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZ1xuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9Db25maWdcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfQ29uZmlnXG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0NvbmZpZworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdlZWtEYXkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqIEBwYXJhbSAgRGF5IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqIEBwYXJhbSAgTW9udGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSkFOVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9GRUJSVUFSWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVJDSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BUFJJTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9NQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9KVUxZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0FVR1VTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9TRVBURU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfT0NUT0JFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9OT1ZFTUJFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9ERUNFTUJFUgorICAqIEBwYXJhbSAgWWVhciBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4OTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EQVRFX0NvbmZpZyhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2Vla0RheSwgdWludDMyX3QgRGF5LCB1aW50MzJfdCBNb250aCwgdWludDMyX3QgWWVhcikKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gKFdlZWtEYXkgPDwgUlRDX0RSX1dEVV9Qb3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICgoKFllYXIgJiAweEYwVSkgPDwgKFJUQ19EUl9ZVF9Qb3MgLSA0VSkpIHwgKChZZWFyICYgMHgwRlUpIDw8IFJUQ19EUl9ZVV9Qb3MpKSAgIHwgXAorICAgICAgICAgKCgoTW9udGggJiAweEYwVSkgPDwgKFJUQ19EUl9NVF9Qb3MgLSA0VSkpIHwgKChNb250aCAmIDB4MEZVKSA8PCBSVENfRFJfTVVfUG9zKSkgfCBcCisgICAgICAgICAoKChEYXkgJiAweEYwVSkgPDwgKFJUQ19EUl9EVF9Qb3MgLSA0VSkpIHwgKChEYXkgJiAweDBGVSkgPDwgUlRDX0RSX0RVX1BvcykpOworCisgIE1PRElGWV9SRUcoUlRDeC0+RFIsIChSVENfRFJfV0RVIHwgUlRDX0RSX01UIHwgUlRDX0RSX01VIHwgUlRDX0RSX0RUIHwgUlRDX0RSX0RVIHwgUlRDX0RSX1lUIHwgUlRDX0RSX1lVKSwgdGVtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGRhdGUgKFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBpZiBzaGFkb3cgbW9kZSBpcyBkaXNhYmxlZCAoQllQU0hBRD0wKSwgbmVlZCB0byBjaGVjayBpZiBSU0YgZmxhZyBpcyBzZXQKKyAgKiAgICAgICBiZWZvcmUgcmVhZGluZyB0aGlzIGJpdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX1dFRUtEQVksIF9fTExfUlRDX0dFVF9ZRUFSLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIERSICAgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgTVQgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIE1VICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldFxuCisgICogICAgICAgICBEUiAgICAgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfREFURV9HZXRcbgorICAqICAgICAgICAgRFIgICAgICAgICAgIFlUICAgICAgICAgICAgTExfUlRDX0RBVEVfR2V0XG4KKyAgKiAgICAgICAgIERSICAgICAgICAgICBZVSAgICAgICAgICAgIExMX1JUQ19EQVRFX0dldAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIFdlZWtEYXksIERheSwgTW9udGggYW5kIFllYXIgKEZvcm1hdDogMHhXV0RETU1ZWSkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0RBVEVfR2V0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworICAKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkRSLCAoUlRDX0RSX1dEVSB8IFJUQ19EUl9NVCB8IFJUQ19EUl9NVSB8IFJUQ19EUl9EVCB8IFJUQ19EUl9EVSB8IFJUQ19EUl9ZVCB8IFJUQ19EUl9ZVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0RSX1dEVSkgPj4gUlRDX0RSX1dEVV9Qb3MpIDw8IFJUQ19PRkZTRVRfV0VFS0RBWSkgfCBcCisgICAgICAgICAgICAgICAgICAgICgoKCgodGVtcCAmIFJUQ19EUl9EVCkgPj4gUlRDX0RSX0RUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX0RVKSA+PiBSVENfRFJfRFVfUG9zKSkgPDwgUlRDX09GRlNFVF9EQVkpIHwgXAorICAgICAgICAgICAgICAgICAgICAoKCgoKHRlbXAgJiBSVENfRFJfTVQpID4+IFJUQ19EUl9NVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19EUl9NVSkgPj4gUlRDX0RSX01VX1BvcykpIDw8IFJUQ19PRkZTRVRfTU9OVEgpIHwgXAorICAgICAgICAgICAgICAgICAgICAoKCgodGVtcCAmIFJUQ19EUl9ZVCkgPj4gUlRDX0RSX1lUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0RSX1lVKSA+PiBSVENfRFJfWVVfUG9zKSkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9BTEFSTUEgQUxBUk1BCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm0gQQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJBRSAgICAgICAgIExMX1JUQ19BTE1BX0VuYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0VuYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkFFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEEKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQUUgICAgICAgICBMTF9SVENfQUxNQV9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfRGlzYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNwZWNpZnkgdGhlIEFsYXJtIEEgbWFza3MuCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzIgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQV9TZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0RBVEVXRUVLREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19IT1VSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTUlOVVRFUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfU0VDT05EUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfQUxMCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9NU0s0IHwgUlRDX0FMUk1BUl9NU0szIHwgUlRDX0FMUk1BUl9NU0syIHwgUlRDX0FMUk1BUl9NU0sxLCBNYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIEFsYXJtIEEgbWFza3MuCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgTVNLNCAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNU0szICAgICAgICAgIExMX1JUQ19BTE1BX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1TSzIgICAgICAgICAgTExfUlRDX0FMTUFfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTVNLMSAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfTUFTS19BTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfTVNLNCB8IFJUQ19BTFJNQVJfTVNLMyB8IFJUQ19BTFJNQVJfTVNLMiB8IFJUQ19BTFJNQVJfTVNLMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybUEgV2VlayBkYXkgc2VsZWN0aW9uIChEVVszOjBdIHJlcHJlc2VudHMgdGhlIHdlZWsgZGF5LiBEVFsxOjBdIGlzIGRvIG5vdCBjYXJlKQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFdEU0VMICAgICAgICAgTExfUlRDX0FMTUFfRW5hYmxlV2Vla2RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1dEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtQSBXZWVrIGRheSBzZWxlY3Rpb24gKERVWzM6MF0gcmVwcmVzZW50cyB0aGUgZGF0ZSApCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgV0RTRUwgICAgICAgICBMTF9SVENfQUxNQV9EaXNhYmxlV2Vla2RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0Rpc2FibGVXZWVrZGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1dEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldERheVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBEYXkgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IERheSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0RUIHwgUlRDX0FMUk1BUl9EVSksCisgICAgICAgICAgICAgKCgoRGF5ICYgMHhGMFUpIDw8IChSVENfQUxSTUFSX0RUX1BvcyAtIDRVKSkgfCAoKERheSAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX0RVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQSBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldERheVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXREYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfRFQgfCBSVENfQUxSTUFSX0RVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUFSX0RUKSA+PiBSVENfQUxSTUFSX0RUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1BUl9EVSkgPj4gUlRDX0FMUk1BUl9EVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBXZWVrZGF5CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2Vla0RheSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX01PTkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RVRVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9XRURORVNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9USFVSU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX0ZSSURBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NBVFVSREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU1VOREFZCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBXZWVrRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BUiwgUlRDX0FMUk1BUl9EVSwgV2Vla0RheSA8PCBSVENfQUxSTUFSX0RVX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgV2Vla2RheQorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIERVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0V2Vla0RheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfRFUpID4+IFJUQ19BTFJNQVJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWxhcm0gQSB0aW1lIGZvcm1hdCAoQU0vMjQtaG91ciBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUaW1lRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9QTQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0VGltZUZvcm1hdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGltZUZvcm1hdCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfUE0sIFRpbWVGb3JtYXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHRpbWUgZm9ybWF0IChBTSBvciBQTSBub3RhdGlvbikKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVGb3JtYXQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUFfVElNRV9GT1JNQVRfUE0KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVIsIFJUQ19BTFJNQVJfUE0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRIb3VyXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRIb3VyKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBIb3VycykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVIsIChSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSksCisgICAgICAgICAgICAgKCgoSG91cnMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfSFRfUG9zIC0gNFUpKSB8ICgoSG91cnMgJiAweDBGVSkgPDwgUlRDX0FMUk1BUl9IVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgSG91cnMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgSG91cnMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0SG91clxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRIb3VyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAxIGFuZCBNYXhfRGF0YT0weDEyIG9yIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgyMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfSFQgfCBSVENfQUxSTUFSX0hVKSk7CisgIHJldHVybiAodWludDMyX3QpKCgoKHRlbXAgJiBSVENfQUxSTUFSX0hUKSA+PiBSVENfQUxSTUFSX0hUX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1BUl9IVSkgPj4gUlRDX0FMUk1BUl9IVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1pbnV0ZXMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0TWludXRlXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1BX1NldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1pbnV0ZXMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9NTlQgfCBSVENfQUxSTUFSX01OVSksCisgICAgICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX01OVV9Qb3MpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEEgTWludXRlcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBNaW51dGVzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1BUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1BX0dldE1pbnV0ZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRNaW51dGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IHRlbXA7CisKKyAgdGVtcCA9IFJFQURfQklUKFJUQ3gtPkFMUk1BUiwgKFJUQ19BTFJNQVJfTU5UIHwgUlRDX0FMUk1BUl9NTlUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQVJfTU5UKSA+PiBSVENfQUxSTUFSX01OVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19BTFJNQVJfTU5VKSA+PiBSVENfQUxSTUFSX01OVV9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQUxBUk0gQSBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfU2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1BX1NldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFNlY29uZHMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQV9TZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNlY29uZHMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9TVCB8IFJUQ19BTFJNQVJfU1UpLAorICAgICAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX1NVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQSBTZWNvbmRzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IFNlY29uZHMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0U2Vjb25kXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+QUxSTUFSLCAoUlRDX0FMUk1BUl9TVCB8IFJUQ19BTFJNQVJfU1UpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQVJfU1QpID4+IFJUQ19BTFJNQVJfU1RfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfQUxSTUFSX1NVKSA+PiBSVENfQUxSTUFSX1NVX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNUICAgICAgICAgICAgTExfUlRDX0FMTUFfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRm9ybWF0MTJfMjQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1BX1RJTUVfRk9STUFUX1BNCisgICogQHBhcmFtICBIb3VycyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICogQHBhcmFtICBNaW51dGVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZvcm1hdDEyXzI0LCB1aW50MzJfdCBIb3VycywgdWludDMyX3QgTWludXRlcywgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gRm9ybWF0MTJfMjQgfCAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX0hVX1BvcykpICAgIHwgXAorICAgICAgICAgKCgoTWludXRlcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1BUl9NTlRfUG9zIC0gNFUpKSB8ICgoTWludXRlcyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX01OVV9Qb3MpKSB8IFwKKyAgICAgICAgICgoKFNlY29uZHMgJiAweEYwVSkgPDwgKFJUQ19BTFJNQVJfU1RfUG9zIC0gNFUpKSB8ICgoU2Vjb25kcyAmIDB4MEZVKSA8PCBSVENfQUxSTUFSX1NVX1BvcykpOworCisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUFSLCBSVENfQUxSTUFSX1BNIHwgUlRDX0FMUk1BUl9IVCB8IFJUQ19BTFJNQVJfSFUgfCBSVENfQUxSTUFSX01OVCB8IFJUQ19BTFJNQVJfTU5VIHwgUlRDX0FMUk1BUl9TVCB8IFJUQ19BTFJNQVJfU1UsIHRlbXApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIFRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfSE9VUiwgX19MTF9SVENfR0VUX01JTlVURSBhbmQgX19MTF9SVENfR0VUX1NFQ09ORAorICAqIGFyZSBhdmFpbGFibGUgdG8gZ2V0IGluZGVwZW5kZW50bHkgZWFjaCBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBBTFJNQVIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQVIgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfQUxNQV9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1BUiAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUFSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUFfR2V0VGltZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1BX0dldFRpbWUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKChMTF9SVENfQUxNQV9HZXRIb3VyKFJUQ3gpIDw8IFJUQ19PRkZTRVRfSE9VUikgfCAoTExfUlRDX0FMTUFfR2V0TWludXRlKFJUQ3gpIDw8IFJUQ19PRkZTRVRfTUlOVVRFKSB8IExMX1JUQ19BTE1BX0dldFNlY29uZChSVEN4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEEgTWFzayB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXRzIHN0YXJ0aW5nIGF0IHRoaXMgYml0CisgICogQG5vdGUgVGhpcyByZWdpc3RlciBjYW4gYmUgd3JpdHRlbiBvbmx5IHdoZW4gQUxSQUUgaXMgcmVzZXQgaW4gUlRDX0NSIHJlZ2lzdGVyLAorICAqICAgICAgIG9yIGluIGluaXRpYWxpemF0aW9uIG1vZGUuCisgICogQHJtdG9sbCBBTFJNQVNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQV9TZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWFzayBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUFfU2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX01BU0tTUywgTWFzayA8PCBSVENfQUxSTUFTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgTWFzayB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXRzIHN0YXJ0aW5nIGF0IHRoaXMgYml0CisgICogQHJtdG9sbCBBTFJNQVNTUiAgICAgTUFTS1NTICAgICAgICBMTF9SVENfQUxNQV9HZXRTdWJTZWNvbmRNYXNrCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQV9HZXRTdWJTZWNvbmRNYXNrKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX01BU0tTUykgPj4gUlRDX0FMUk1BU1NSX01BU0tTU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBBIFN1YiBzZWNvbmRzIHZhbHVlCisgICogQHJtdG9sbCBBTFJNQVNTUiAgICAgU1MgICAgICAgICAgICBMTF9SVENfQUxNQV9TZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBTdWJzZWNvbmQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1BX1NldFN1YlNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU3Vic2Vjb25kKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1BU1NSLCBSVENfQUxSTUFTU1JfU1MsIFN1YnNlY29uZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgU3ViIHNlY29uZHMgdmFsdWUKKyAgKiBAcm10b2xsIEFMUk1BU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1BX0dldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg3RkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUFfR2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5BTFJNQVNTUiwgUlRDX0FMUk1BU1NSX1NTKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0FMQVJNQiBBTEFSTUIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBbGFybSBCCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkJFICAgICAgICAgTExfUlRDX0FMTUJfRW5hYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfRW5hYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQWxhcm0gQgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJCRSAgICAgICAgIExMX1JUQ19BTE1CX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9EaXNhYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJCRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3BlY2lmeSB0aGUgQWxhcm0gQiBtYXNrcy4KKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBNU0s0ICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzMgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMiAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0sxICAgICAgICAgIExMX1JUQ19BTE1CX1NldE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfREFURVdFRUtEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0hPVVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19NSU5VVEVTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19TRUNPTkRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19BTEwKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX01TSzQgfCBSVENfQUxSTUJSX01TSzMgfCBSVENfQUxSTUJSX01TSzIgfCBSVENfQUxSTUJSX01TSzEsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgQWxhcm0gQiBtYXNrcy4KKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBNU0s0ICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1hc2tcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1TSzMgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWFza1xuCisgICogICAgICAgICBBTFJNQlIgICAgICAgTVNLMiAgICAgICAgICBMTF9SVENfQUxNQl9HZXRNYXNrXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNU0sxICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfTUFTS19EQVRFV0VFS0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX01BU0tfSE9VUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX01JTlVURVMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX1NFQ09ORFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9NQVNLX0FMTAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9NU0s0IHwgUlRDX0FMUk1CUl9NU0szIHwgUlRDX0FMUk1CUl9NU0syIHwgUlRDX0FMUk1CUl9NU0sxKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtQiBXZWVrIGRheSBzZWxlY3Rpb24gKERVWzM6MF0gcmVwcmVzZW50cyB0aGUgd2VlayBkYXkuIERUWzE6MF0gaXMgZG8gbm90IGNhcmUpCisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgV0RTRUwgICAgICAgICBMTF9SVENfQUxNQl9FbmFibGVXZWVrZGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfRW5hYmxlV2Vla2RheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfV0RTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQWxhcm1CIFdlZWsgZGF5IHNlbGVjdGlvbiAoRFVbMzowXSByZXByZXNlbnRzIHRoZSBkYXRlICkKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBXRFNFTCAgICAgICAgIExMX1JUQ19BTE1CX0Rpc2FibGVXZWVrZGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfRGlzYWJsZVdlZWtkYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfV0RTRUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRCBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBiaW5hcnkgdG8gQkNEIGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0RGF5XG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERheSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldERheShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRGF5KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfRFQgfCBSVENfQUxSTUJSX0RVKSwKKyAgICAgICAgICAgICAoKChEYXkgJiAweEYwVSkgPDwgKFJUQ19BTFJNQlJfRFRfUG9zIC0gNFUpKSB8ICgoRGF5ICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfRFVfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIERheSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBEYXkgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIERUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0RGF5XG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldERheShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9EVCB8IFJUQ19BTFJNQlJfRFUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQlJfRFQpID4+IFJUQ19BTFJNQlJfRFRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfQUxSTUJSX0RVKSA+PiBSVENfQUxSTUJSX0RVX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIFdlZWtkYXkKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFdlZWtEYXkKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBXZWVrRGF5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfTU9OREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVFVFU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1dFRE5FU0RBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1RIVVJTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfRlJJREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfU0FUVVJEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TVU5EQVkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFdlZWtEYXkpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJSLCBSVENfQUxSTUJSX0RVLCBXZWVrRGF5IDw8IFJUQ19BTFJNQlJfRFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBXZWVrZGF5CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgRFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFdlZWtEYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9EVSkgPj4gUlRDX0FMUk1CUl9EVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIHRpbWUgZm9ybWF0IChBTS8yNC1ob3VyIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVGb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9BTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX1BNCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQUxNQl9TZXRUaW1lRm9ybWF0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUaW1lRm9ybWF0KQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9QTSwgVGltZUZvcm1hdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFMQVJNIEIgdGltZSBmb3JtYXQgKEFNIG9yIFBNIG5vdGF0aW9uKQorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIFBNICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfQU0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQUxNQl9USU1FX0ZPUk1BVF9QTQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CUiwgUlRDX0FMUk1CUl9QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIEhvdXJzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IEhvdXJzIGZyb20gYmluYXJ5IHRvIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBIVCAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldEhvdXJcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIEhVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldEhvdXIoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEhvdXJzKQoreworICBNT0RJRllfUkVHKFJUQ3gtPkFMUk1CUiwgKFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVKSwKKyAgICAgICAgICAgICAoKChIb3VycyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9IVF9Qb3MgLSA0VSkpIHwgKChIb3VycyAmIDB4MEZVKSA8PCBSVENfQUxSTUJSX0hVX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRIb3VyXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBIVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldEhvdXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDEgYW5kIE1heF9EYXRhPTB4MTIgb3IgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDIzCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9IVCB8IFJUQ19BTFJNQlJfSFUpKTsKKyAgcmV0dXJuICh1aW50MzJfdCkoKCgodGVtcCAmIFJUQ19BTFJNQlJfSFQpID4+IFJUQ19BTFJNQlJfSFRfUG9zKSA8PCA0VSkgfCAoKHRlbXAgJiBSVENfQUxSTUJSX0hVKSA+PiBSVENfQUxSTUJSX0hVX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRNaW51dGVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0TWludXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWludXRlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWludXRlcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX01OVCB8IFJUQ19BTFJNQlJfTU5VKSwKKyAgICAgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfTU5VX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQUxBUk0gQiBNaW51dGVzIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm8gX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOIGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IE1pbnV0ZXMgZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIE1OVCAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19BTE1CX0dldE1pbnV0ZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19BTE1CX0dldE1pbnV0ZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdGVtcDsKKworICB0ZW1wID0gUkVBRF9CSVQoUlRDeC0+QUxSTUJSLCAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0FMUk1CUl9NTlQpID4+IFJUQ19BTFJNQlJfTU5UX1BvcykgPDwgNFUpIHwgKCh0ZW1wICYgUlRDX0FMUk1CUl9NTlUpID4+IFJUQ19BTFJNQlJfTU5VX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBTEFSTSBCIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIGJpbmFyeSB0byBCQ0QgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9TZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfU2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgU2Vjb25kcyBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFNlY29uZChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgU2Vjb25kcykKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSksCisgICAgICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBTEFSTSBCIFNlY29uZHMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgU2Vjb25kcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRTZWNvbmRcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0U2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBSRUFEX0JJVChSVEN4LT5BTFJNQlIsIChSVENfQUxSTUJSX1NUIHwgUlRDX0FMUk1CUl9TVSkpOworICByZXR1cm4gKHVpbnQzMl90KSgoKCh0ZW1wICYgUlRDX0FMUk1CUl9TVCkgPj4gUlRDX0FMUk1CUl9TVF9Qb3MpIDw8IDRVKSB8ICgodGVtcCAmIFJUQ19BTFJNQlJfU1UpID4+IFJUQ19BTFJNQlJfU1VfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEIgVGltZSAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGluIEJDRCBmb3JtYXQKKyAgKiBAcm10b2xsIEFMUk1CUiAgICAgICBQTSAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9Db25maWdUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGb3JtYXQxMl8yNCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0FMTUJfVElNRV9GT1JNQVRfUE0KKyAgKiBAcGFyYW0gIEhvdXJzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKiBAcGFyYW0gIE1pbnV0ZXMgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDU5CisgICogQHBhcmFtICBTZWNvbmRzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfQ29uZmlnVGltZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRm9ybWF0MTJfMjQsIHVpbnQzMl90IEhvdXJzLCB1aW50MzJfdCBNaW51dGVzLCB1aW50MzJfdCBTZWNvbmRzKQoreworICByZWdpc3RlciB1aW50MzJfdCB0ZW1wOworCisgIHRlbXAgPSBGb3JtYXQxMl8yNCB8ICgoKEhvdXJzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX0hUX1BvcyAtIDRVKSkgfCAoKEhvdXJzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfSFVfUG9zKSkgICAgfCBcCisgICAgICAgICAoKChNaW51dGVzICYgMHhGMFUpIDw8IChSVENfQUxSTUJSX01OVF9Qb3MgLSA0VSkpIHwgKChNaW51dGVzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfTU5VX1BvcykpIHwgXAorICAgICAgICAgKCgoU2Vjb25kcyAmIDB4RjBVKSA8PCAoUlRDX0FMUk1CUl9TVF9Qb3MgLSA0VSkpIHwgKChTZWNvbmRzICYgMHgwRlUpIDw8IFJUQ19BTFJNQlJfU1VfUG9zKSk7CisKKyAgTU9ESUZZX1JFRyhSVEN4LT5BTFJNQlIsIFJUQ19BTFJNQlJfUE18IFJUQ19BTFJNQlJfSFQgfCBSVENfQUxSTUJSX0hVIHwgUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSB8IFJUQ19BTFJNQlJfU1QgfCBSVENfQUxSTUJSX1NVLCB0ZW1wKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBUaW1lIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNyb3MgX19MTF9SVENfR0VUX0hPVVIsIF9fTExfUlRDX0dFVF9NSU5VVEUgYW5kIF9fTExfUlRDX0dFVF9TRUNPTkQKKyAgKiBhcmUgYXZhaWxhYmxlIHRvIGdldCBpbmRlcGVuZGVudGx5IGVhY2ggcGFyYW1ldGVyLgorICAqIEBybXRvbGwgQUxSTUJSICAgICAgIEhUICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBNTlQgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWVcbgorICAqICAgICAgICAgQUxSTUJSICAgICAgIE1OVSAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0VGltZVxuCisgICogICAgICAgICBBTFJNQlIgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfQUxNQl9HZXRUaW1lXG4KKyAgKiAgICAgICAgIEFMUk1CUiAgICAgICBTVSAgICAgICAgICAgIExMX1JUQ19BTE1CX0dldFRpbWUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBDb21iaW5hdGlvbiBvZiBob3VycywgbWludXRlcyBhbmQgc2Vjb25kcy4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KSgoTExfUlRDX0FMTUJfR2V0SG91cihSVEN4KSA8PCBSVENfT0ZGU0VUX0hPVVIpIHwgKExMX1JUQ19BTE1CX0dldE1pbnV0ZShSVEN4KSA8PCBSVENfT0ZGU0VUX01JTlVURSkgfCBMTF9SVENfQUxNQl9HZXRTZWNvbmQoUlRDeCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBBbGFybSBCIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBub3RlIFRoaXMgcmVnaXN0ZXIgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIEFMUkJFIGlzIHJlc2V0IGluIFJUQ19DUiByZWdpc3RlciwKKyAgKiAgICAgICBvciBpbiBpbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZE1hc2soUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IE1hc2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9NQVNLU1MsIE1hc2sgPDwgUlRDX0FMUk1CU1NSX01BU0tTU19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIE1hc2sgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBzdGFydGluZyBhdCB0aGlzIGJpdAorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIE1BU0tTUyAgICAgICAgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kTWFzayhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9NQVNLU1MpICA+PiBSVENfQUxSTUJTU1JfTUFTS1NTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEFsYXJtIEIgU3ViIHNlY29uZHMgdmFsdWUKKyAgKiBAcm10b2xsIEFMUk1CU1NSICAgICBTUyAgICAgICAgICAgIExMX1JUQ19BTE1CX1NldFN1YlNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN1YnNlY29uZCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4N0ZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0FMTUJfU2V0U3ViU2Vjb25kKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBTdWJzZWNvbmQpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+QUxSTUJTU1IsIFJUQ19BTFJNQlNTUl9TUywgU3Vic2Vjb25kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQWxhcm0gQiBTdWIgc2Vjb25kcyB2YWx1ZQorICAqIEBybXRvbGwgQUxSTUJTU1IgICAgIFNTICAgICAgICAgICAgTExfUlRDX0FMTUJfR2V0U3ViU2Vjb25kCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDdGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQUxNQl9HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkFMUk1CU1NSLCBSVENfQUxSTUJTU1JfU1MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfVGltZXN0YW1wIFRpbWVzdGFtcAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGludGVybmFsIGV2ZW50IHRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJVFNFICAgICAgICAgIExMX1JUQ19UU19FbmFibGVJbnRlcm5hbEV2ZW50CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0VuYWJsZUludGVybmFsRXZlbnQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9JVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGludGVybmFsIGV2ZW50IHRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBJVFNFICAgICAgICAgIExMX1JUQ19UU19EaXNhYmxlSW50ZXJuYWxFdmVudAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19EaXNhYmxlSW50ZXJuYWxFdmVudChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfSVRTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0UgICAgICAgICAgIExMX1JUQ19UU19FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRW5hYmxlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRpbWVzdGFtcAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0UgICAgICAgICAgIExMX1JUQ19UU19EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RTX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFRpbWUtc3RhbXAgZXZlbnQgYWN0aXZlIGVkZ2UKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgVFNFIG11c3QgYmUgcmVzZXQgd2hlbiBUU0VER0UgaXMgY2hhbmdlZCB0byBhdm9pZCB1bndhbnRlZCBUU0Ygc2V0dGluZworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFRTRURHRSAgICAgICAgTExfUlRDX1RTX1NldEFjdGl2ZUVkZ2UKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBFZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfU2V0QWN0aXZlRWRnZShSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgRWRnZSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX1RTRURHRSwgRWRnZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWUtc3RhbXAgZXZlbnQgYWN0aXZlIGVkZ2UKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNFREdFICAgICAgICBMTF9SVENfVFNfR2V0QWN0aXZlRWRnZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RJTUVTVEFNUF9FREdFX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19USU1FU1RBTVBfRURHRV9GQUxMSU5HCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldEFjdGl2ZUVkZ2UoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNFREdFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBBTS9QTSBub3RhdGlvbiAoQU0gb3IgMjQtaG91ciBmb3JtYXQpCisgICogQHJtdG9sbCBUU1RSICAgICAgICAgUE0gICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZUZvcm1hdAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RTX1RJTUVfRk9STUFUX0FNCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RTX1RJTUVfRk9STUFUX1BNCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1RTX0dldFRpbWVGb3JtYXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX1BNKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBIb3VycyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBIb3VycyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUU1RSICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVFNfR2V0SG91clxuCisgICogICAgICAgICBUU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0SG91cgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgxMiBvciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MjMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0SG91cihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoUlRDeC0+VFNUUiwgUlRDX1RTVFJfSFQgfCBSVENfVFNUUl9IVSkgPj4gUlRDX1RTVFJfSFVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIE1pbnV0ZXMgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTWludXRlcyBmcm9tIEJDRCB0byBCaW5hcnkgZm9ybWF0CisgICogQHJtdG9sbCBUU1RSICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVFNfR2V0TWludXRlXG4KKyAgKiAgICAgICAgIFRTVFIgICAgICAgICBNTlUgICAgICAgICAgIExMX1JUQ19UU19HZXRNaW51dGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4NTkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0TWludXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLCBSVENfVFNUUl9NTlQgfCBSVENfVFNUUl9NTlUpID4+IFJUQ19UU1RSX01OVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgU2Vjb25kcyBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvIF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTiBpcyBhdmFpbGFibGUgdG8gY29udmVydCBTZWNvbmRzIGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTVFIgICAgICAgICBTVCAgICAgICAgICAgIExMX1JUQ19UU19HZXRTZWNvbmRcbgorICAqICAgICAgICAgVFNUUiAgICAgICAgIFNVICAgICAgICAgICAgTExfUlRDX1RTX0dldFNlY29uZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHg1OQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTVFIsIFJUQ19UU1RSX1NUIHwgUlRDX1RTVFJfU1UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIHRpbWUgKGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kKSBpbiBCQ0QgZm9ybWF0CisgICogQG5vdGUgaGVscGVyIG1hY3JvcyBfX0xMX1JUQ19HRVRfSE9VUiwgX19MTF9SVENfR0VUX01JTlVURSBhbmQgX19MTF9SVENfR0VUX1NFQ09ORAorICAqIGFyZSBhdmFpbGFibGUgdG8gZ2V0IGluZGVwZW5kZW50bHkgZWFjaCBwYXJhbWV0ZXIuCisgICogQHJtdG9sbCBUU1RSICAgICAgICAgSFQgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgSFUgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgTU5UICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgTU5VICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgU1QgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZVxuCisgICogICAgICAgICBUU1RSICAgICAgICAgU1UgICAgICAgICAgICBMTF9SVENfVFNfR2V0VGltZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbWJpbmF0aW9uIG9mIGhvdXJzLCBtaW51dGVzIGFuZCBzZWNvbmRzLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRUaW1lKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU1RSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVFNUUl9IVCB8IFJUQ19UU1RSX0hVIHwgUlRDX1RTVFJfTU5UIHwgUlRDX1RTVFJfTU5VIHwgUlRDX1RTVFJfU1QgfCBSVENfVFNUUl9TVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgV2VlayBkYXkKKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19UU19HZXRXZWVrRGF5CisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9NT05EQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9UVUVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfV0VETkVTREFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dFRUtEQVlfVEhVUlNEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9GUklEQVkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XRUVLREFZX1NVTkRBWQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRXZWVrRGF5KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU0RSLCBSVENfVFNEUl9XRFUpID4+IFJUQ19UU0RSX1dEVV9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lc3RhbXAgTW9udGggaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgTW9udGggZnJvbSBCQ0QgdG8gQmluYXJ5IGZvcm1hdAorICAqIEBybXRvbGwgVFNEUiAgICAgICAgIE1UICAgICAgICAgICAgTExfUlRDX1RTX0dldE1vbnRoXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19UU19HZXRNb250aAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pBTlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfRkVCUlVBUlkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFSQ0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfQVBSSUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTUFZCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX0pVTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfSlVMWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19NT05USF9BVUdVU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfU0VQVEVNQkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX01PTlRIX09DVE9CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfTk9WRU1CRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfTU9OVEhfREVDRU1CRVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVFNfR2V0TW9udGgoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX01UIHwgUlRDX1RTRFJfTVUpID4+IFJUQ19UU0RSX01VX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRpbWVzdGFtcCBEYXkgaW4gQkNEIGZvcm1hdAorICAqIEBub3RlIGhlbHBlciBtYWNybyBfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4gaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgRGF5IGZyb20gQkNEIHRvIEJpbmFyeSBmb3JtYXQKKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXlcbgorICAqICAgICAgICAgVFNEUiAgICAgICAgIERVICAgICAgICAgICAgTExfUlRDX1RTX0dldERheQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMSBhbmQgTWF4X0RhdGE9MHgzMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXREYXkoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTRFIsIFJUQ19UU0RSX0RUIHwgUlRDX1RTRFJfRFUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZXN0YW1wIGRhdGUgKFdlZWtEYXksIERheSBhbmQgTW9udGgpIGluIEJDRCBmb3JtYXQKKyAgKiBAbm90ZSBoZWxwZXIgbWFjcm9zIF9fTExfUlRDX0dFVF9XRUVLREFZLCBfX0xMX1JUQ19HRVRfTU9OVEgsCisgICogYW5kIF9fTExfUlRDX0dFVF9EQVkgYXJlIGF2YWlsYWJsZSB0byBnZXQgaW5kZXBlbmRlbnRseSBlYWNoIHBhcmFtZXRlci4KKyAgKiBAcm10b2xsIFRTRFIgICAgICAgICBXRFUgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBNVSAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBEVCAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlXG4KKyAgKiAgICAgICAgIFRTRFIgICAgICAgICBEVSAgICAgICAgICAgIExMX1JUQ19UU19HZXREYXRlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgV2Vla2RheSwgRGF5IGFuZCBNb250aAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXREYXRlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UU0RSLCBSVENfVFNEUl9XRFUgfCBSVENfVFNEUl9NVCB8IFJUQ19UU0RSX01VIHwgUlRDX1RTRFJfRFQgfCBSVENfVFNEUl9EVSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aW1lLXN0YW1wIHN1YiBzZWNvbmQgdmFsdWUKKyAgKiBAcm10b2xsIFRTU1NSICAgICAgICBTUyAgICAgICAgICAgIExMX1JUQ19UU19HZXRTdWJTZWNvbmQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UU19HZXRTdWJTZWNvbmQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPlRTU1NSLCBSVENfVFNTU1JfU1MpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBDUl9UQU1QVFMpCisvKioKKyAgKiBAYnJpZWYgIEFjdGl2YXRlIHRpbWVzdGFtcCBvbiB0YW1wZXIgZGV0ZWN0aW9uIGV2ZW50CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUFRTICAgICAgICBMTF9SVENfVFNfRW5hYmxlT25UYW1wZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVFNfRW5hYmxlT25UYW1wZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVBUUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aW1lc3RhbXAgb24gdGFtcGVyIGRldGVjdGlvbiBldmVudAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBUUyAgICAgICAgTExfUlRDX1RTX0Rpc2FibGVPblRhbXBlcgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UU19EaXNhYmxlT25UYW1wZXIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFRTKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBUUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9UYW1wZXIgVGFtcGVyCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRDX1RBTVB4IGlucHV0IGRldGVjdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxRSAgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAyRSAgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzRSAgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGUKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8xIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMiAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzMgCisgICogICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUYW1wZXIpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBUYW1wZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJUQ19UQU1QeCBpbnB1dCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMUUgICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZVxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJFICAgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzRSAgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfMSAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSXzIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl8zIAorICAqICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGUoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVGFtcGVyIG1hc2sgZmxhZworICAqIEBub3RlIEFzc29jaWF0ZWQgVGFtcGVyIElUIG11c3Qgbm90IGVuYWJsZWQgd2hlbiB0YW1wZXIgbWFzayBpcyBzZXQuCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFNRiAgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZU1hc2tcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAyTUYgICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVNYXNrXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QM01GICAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFzaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1hc2sgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjEgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9NQVNLX1RBTVBFUjMgCisgICogICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlTWFzayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgTWFzaykKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIE1hc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGFtcGVyIG1hc2sgZmxhZworICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxTUYgICAgICAgTExfUlRDX1RBTVBFUl9EaXNhYmxlTWFza1xuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJNRiAgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVNYXNrXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QM01GICAgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZU1hc2sKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIxIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIyIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTUFTS19UQU1QRVIzIAorICAqICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0Rpc2FibGVNYXNrKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBNYXNrKQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBNYXNrKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYmFja3VwIHJlZ2lzdGVyIGVyYXNlIGFmdGVyIFRhbXBlciBldmVudCBkZXRlY3Rpb24KKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMU5PRVJBU0UgIExMX1JUQ19UQU1QRVJfRW5hYmxlRXJhc2VCS1BcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAyTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9FbmFibGVFcmFzZUJLUFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNOT0VSQVNFICBMTF9SVENfVEFNUEVSX0VuYWJsZUVyYXNlQktQCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGFtcGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIxIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIyIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfTk9FUkFTRV9UQU1QRVIzIAorICAqICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfVEFNUEVSX0VuYWJsZUVyYXNlQktQKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUYW1wZXIpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFRhbXBlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBiYWNrdXAgcmVnaXN0ZXIgZXJhc2UgYWZ0ZXIgVGFtcGVyIGV2ZW50IGRldGVjdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1BcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAyTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1BcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzTk9FUkFTRSAgTExfUlRDX1RBTVBFUl9EaXNhYmxlRXJhc2VCS1AKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBUYW1wZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjEgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9OT0VSQVNFX1RBTVBFUjMgCisgICogICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZUVyYXNlQktQKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBUYW1wZXIpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBUYW1wZXIpOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBQVURJUykKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSVENfVEFNUHggcHVsbC11cCBkaXNhYmxlIChEaXNhYmxlIHByZWNoYXJnZSBvZiBSVENfVEFNUHggcGlucykKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QUFVESVMgICAgIExMX1JUQ19UQU1QRVJfRGlzYWJsZVB1bGxVcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRGlzYWJsZVB1bGxVcChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFBVRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRDX1RBTVB4IHB1bGwtdXAgZGlzYWJsZSAoIFByZWNoYXJnZSBSVENfVEFNUHggcGlucyBiZWZvcmUgc2FtcGxpbmcpCisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUFBVRElTICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZVB1bGxVcAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfRW5hYmxlUHVsbFVwKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVBQVURJUyk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBDUl9UQU1QUFVESVMgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBDUl9UQU1QUFJDSCkKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQ19UQU1QeCBwcmVjaGFyZ2UgZHVyYXRpb24KKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QUFJDSCAgICAgIExMX1JUQ19UQU1QRVJfU2V0UHJlY2hhcmdlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRHVyYXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzFSVENDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzJSVENDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzRSVENDTEsKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0RVUkFUSU9OXzhSVENDTEsKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfU2V0UHJlY2hhcmdlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBEdXJhdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFBSQ0gsIER1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVB4IHByZWNoYXJnZSBkdXJhdGlvbgorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBQUkNIICAgICAgTExfUlRDX1RBTVBFUl9HZXRQcmVjaGFyZ2UKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMVJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fMlJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fNFJUQ0NMSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRFVSQVRJT05fOFJUQ0NMSworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UQU1QRVJfR2V0UHJlY2hhcmdlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUFBSQ0gpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBQUkNIICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QQ1JfVEFNUEZMVCkKKy8qKgorICAqIEBicmllZiAgU2V0IFJUQ19UQU1QeCBmaWx0ZXIgY291bnQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QRkxUICAgICAgIExMX1JUQ19UQU1QRVJfU2V0RmlsdGVyQ291bnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBGaWx0ZXJDb3VudCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl8yU0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19UQU1QRVJfU2V0RmlsdGVyQ291bnQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZpbHRlckNvdW50KQoreworICBNT0RJRllfUkVHKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QRkxULCBGaWx0ZXJDb3VudCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQ19UQU1QeCBmaWx0ZXIgY291bnQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QRkxUICAgICAgIExMX1JUQ19UQU1QRVJfR2V0RmlsdGVyQ291bnQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSX0RJU0FCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0ZJTFRFUl8yU0FNUExFCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9GSUxURVJfNFNBTVBMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfRklMVEVSXzhTQU1QTEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfVEFNUEVSX0dldEZpbHRlckNvdW50KFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUEZMVCkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QQ1JfVEFNUEZMVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUENSX1RBTVBGUkVRKQorLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyIHNhbXBsaW5nIGZyZXF1ZW5jeQorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBGUkVRICAgICAgTExfUlRDX1RBTVBFUl9TZXRTYW1wbGluZ0ZyZXEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBTYW1wbGluZ0ZyZXEgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8zMjc2OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzE2Mzg0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzQwOTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTAyNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzI1NgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9TZXRTYW1wbGluZ0ZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFNhbXBsaW5nRnJlcSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUEZSRVEsIFNhbXBsaW5nRnJlcSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFRhbXBlciBzYW1wbGluZyBmcmVxdWVuY3kKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QRlJFUSAgICAgIExMX1JUQ19UQU1QRVJfR2V0U2FtcGxpbmdGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8zMjc2OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzE2Mzg0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfODE5MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzQwOTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX1NBTVBMRlJFUURJVl8yMDQ4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9TQU1QTEZSRVFESVZfMTAyNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfU0FNUExGUkVRRElWXzI1NgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19UQU1QRVJfR2V0U2FtcGxpbmdGcmVxKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUEZSRVEpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUENSX1RBTVBGUkVRICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFjdGl2ZSBsZXZlbCBmb3IgVGFtcGVyIGlucHV0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFUUkcgICAgICBMTF9SVENfVEFNUEVSX0VuYWJsZUFjdGl2ZUxldmVsXG4KKyAgKiAgICAgICAgIFRBTVBDUiAgICAgICBUQU1QMlRSRyAgICAgIExMX1JUQ19UQU1QRVJfRW5hYmxlQWN0aXZlTGV2ZWxcbgorICAqICAgICAgICAgVEFNUENSICAgICAgIFRBTVAzVFJHICAgICAgTExfUlRDX1RBTVBFUl9FbmFibGVBY3RpdmVMZXZlbAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAxIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMyAKKyAgKiAgICAgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9FbmFibGVBY3RpdmVMZXZlbChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgVGFtcGVyKQoreworICBTRVRfQklUKFJUQ3gtPlRBTVBDUiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFjdGl2ZSBsZXZlbCBmb3IgVGFtcGVyIGlucHV0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDFUUkcgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDJUUkcgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbFxuCisgICogICAgICAgICBUQU1QQ1IgICAgICAgVEFNUDNUUkcgICAgICBMTF9SVENfVEFNUEVSX0Rpc2FibGVBY3RpdmVMZXZlbAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRhbXBlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfVEFNUEVSX0FDVElWRUxFVkVMX1RBTVAxIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19UQU1QRVJfQUNUSVZFTEVWRUxfVEFNUDIgCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1RBTVBFUl9BQ1RJVkVMRVZFTF9UQU1QMyAKKyAgKiAgICAgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1RBTVBFUl9EaXNhYmxlQWN0aXZlTGV2ZWwoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgVGFtcGVyKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUZfV2FrZXVwIFdha2V1cAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2V1cCB0aW1lcgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXVVRFICAgICAgICAgIExMX1JUQ19XQUtFVVBfRW5hYmxlCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9FbmFibGUoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2V1cCB0aW1lcgorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBXVVRFICAgICAgICAgIExMX1JUQ19XQUtFVVBfRGlzYWJsZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19XQUtFVVBfRGlzYWJsZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VURSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgV2FrZXVwIHRpbWVyIGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VURSAgICAgICAgICBMTF9SVENfV0FLRVVQX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfV0FLRVVQX0lzRW5hYmxlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRFKSA9PSAoUlRDX0NSX1dVVEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IFdha2V1cCBjbG9jaworICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJUQ19DUiBXVVRFIGJpdCA9IDAgYW5kIFJUQ19JU1IgV1VUV0YgYml0ID0gMQorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVQ0tTRUwgICAgICAgTExfUlRDX1dBS0VVUF9TZXRDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFdha2V1cENsb2NrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX1dBS0VVUF9TZXRDbG9jayhSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgV2FrZXVwQ2xvY2spCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q1IsIFJUQ19DUl9XVUNLU0VMLCBXYWtldXBDbG9jayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCBjbG9jaworICAqIEBybXRvbGwgQ1IgICAgICAgICAgIFdVQ0tTRUwgICAgICAgTExfUlRDX1dBS0VVUF9HZXRDbG9jaworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX1dBS0VVUENMT0NLX0RJVl8xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19ESVZfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19XQUtFVVBDTE9DS19DS1NQUkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfV0FLRVVQQ0xPQ0tfQ0tTUFJFX1dVVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19XQUtFVVBfR2V0Q2xvY2soUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VDS1NFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBXYWtldXAgYXV0by1yZWxvYWQgdmFsdWUKKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFdVVFdGIGlzIHNldCB0byAxIGluIFJUQ19JU1IKKyAgKiBAcm10b2xsIFdVVFIgICAgICAgICBXVVQgICAgICAgICAgIExMX1JUQ19XQUtFVVBfU2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfV0FLRVVQX1NldEF1dG9SZWxvYWQoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFZhbHVlKQoreworICBNT0RJRllfUkVHKFJUQ3gtPldVVFIsIFJUQ19XVVRSX1dVVCwgVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtldXAgYXV0by1yZWxvYWQgdmFsdWUKKyAgKiBAcm10b2xsIFdVVFIgICAgICAgICBXVVQgICAgICAgICAgIExMX1JUQ19XQUtFVVBfR2V0QXV0b1JlbG9hZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX1dBS0VVUF9HZXRBdXRvUmVsb2FkKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5XVVRSLCBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfV0FLRVVQX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX0JBQ0tVUF9TVVBQT1JUKQorLyoqIEBkZWZncm91cCBSVENfTExfRUZfQmFja3VwX1JlZ2lzdGVycyBCYWNrdXBfUmVnaXN0ZXJzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZXMgYSBkYXRhIGluIGEgc3BlY2lmaWVkIFJUQyBCYWNrdXAgZGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIEJLUHhSICAgICAgICBCS1AgICAgICAgICAgIExMX1JUQ19CQUtfU2V0UmVnaXN0ZXIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBCYWNrdXBSZWdpc3RlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI5CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjExCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjE5CisgICogQHBhcmFtICBEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0JBS19TZXRSZWdpc3RlcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpCit7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QqIHRtcDsKKyAgCisgIHRtcCA9ICYoUlRDeC0+QktQMFIpICsgQmFja3VwUmVnaXN0ZXI7CisgIAorICAqdG1wID0gRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIuCisgICogQHJtdG9sbCBCS1B4UiAgICAgICAgQktQICAgICAgICAgICBMTF9SVENfQkFLX0dldFJlZ2lzdGVyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgQmFja3VwUmVnaXN0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0JLUF9EUjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQktQX0RSOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19CS1BfRFIxOQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0JBS19HZXRSZWdpc3RlcihSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIpCit7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnRtcDsKKworICB0bXAgPSAmKFJUQ3gtPkJLUDBSKSArIEJhY2t1cFJlZ2lzdGVyOworCisgIC8qIFJlYWQgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLworICByZXR1cm4gKnRtcDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBSVENfQkFDS1VQX1NVUFBPUlQgKi8KKworLyoqIEBkZWZncm91cCBSVENfTExfRUZfQ2FsaWJyYXRpb24gQ2FsaWJyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBDYWxpYnJhdGlvbiBvdXRwdXQgZnJlcXVlbmN5ICgxIEh6IG9yIDUxMiBIeikKKyAgKiBAbm90ZSBCaXRzIGFyZSB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ09FICAgICAgICAgICBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXFcbgorICAqICAgICAgICAgQ1IgICAgICAgICAgIENPU0VMICAgICAgICAgTExfUlRDX0NBTF9TZXRPdXRwdXRGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgRnJlcXVlbmN5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX09VVFBVVF8xSFoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzUxMkhaCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldE91dHB1dEZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IEZyZXF1ZW5jeSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DUiwgUlRDX0NSX0NPRSB8IFJUQ19DUl9DT1NFTCwgRnJlcXVlbmN5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ2FsaWJyYXRpb24gb3V0cHV0IGZyZXF1ZW5jeSAoMSBIeiBvciA1MTIgSHopCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQ09FICAgICAgICAgICBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXFcbgorICAqICAgICAgICAgQ1IgICAgICAgICAgIENPU0VMICAgICAgICAgTExfUlRDX0NBTF9HZXRPdXRwdXRGcmVxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfT1VUUFVUXzFIWgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9PVVRQVVRfNTEySFoKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0dldE91dHB1dEZyZXEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQ09FIHwgUlRDX0NSX0NPU0VMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5zZXJ0IG9yIG5vdCBPbmUgUlRDQ0xLIHB1bHNlIGV2ZXJ5IDJleHAxMSBwdWxzZXMgKGZyZXF1ZW5jeSBpbmNyZWFzZWQgYnkgNDg4LjUgcHBtKQorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAbm90ZSBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJFQ0FMUEYgaXMgc2V0IHRvIDAgaW4gUlRDX0lTUgorICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTFAgICAgICAgICAgTExfUlRDX0NBTF9TZXRQdWxzZQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFB1bHNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX0lOU0VSVFBVTFNFX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfSU5TRVJUUFVMU0VfU0VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ0FMX1NldFB1bHNlKFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxQLCBQdWxzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgb25lIFJUQ0NMSyBoYXMgYmVlbiBpbnNlcnRlZCBvciBub3QgZXZlcnkgMmV4cDExIHB1bHNlcyAoZnJlcXVlbmN5IGluY3JlYXNlZCBieSA0ODguNSBwcG0pCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMUCAgICAgICAgICBMTF9SVENfQ0FMX0lzUHVsc2VJbnNlcnRlZAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0lzUHVsc2VJbnNlcnRlZChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMUCkgPT0gKFJUQ19DQUxSX0NBTFApKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQG5vdGUgICBCaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIFJFQ0FMUEYgaXMgc2V0IHRvIDAgaW4gUlRDX0lTUgorICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTFc4ICAgICAgICAgTExfUlRDX0NBTF9TZXRQZXJpb2RcbgorICAqICAgICAgICAgQ0FMUiAgICAgICAgIENBTFcxNiAgICAgICAgTExfUlRDX0NBTF9TZXRQZXJpb2QKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBQZXJpb2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzMyU0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF8xNlNFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfOFNFQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NBTF9TZXRQZXJpb2QoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgTU9ESUZZX1JFRyhSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxXOCB8IFJUQ19DQUxSX0NBTFcxNiwgUGVyaW9kKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGNhbGlicmF0aW9uIGN5Y2xlIHBlcmlvZAorICAqIEBybXRvbGwgQ0FMUiAgICAgICAgIENBTFc4ICAgICAgICAgTExfUlRDX0NBTF9HZXRQZXJpb2RcbgorICAqICAgICAgICAgQ0FMUiAgICAgICAgIENBTFcxNiAgICAgICAgTExfUlRDX0NBTF9HZXRQZXJpb2QKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19DQUxJQl9QRVJJT0RfMzJTRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfQ0FMSUJfUEVSSU9EXzE2U0VDCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0NBTElCX1BFUklPRF84U0VDCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0NBTF9HZXRQZXJpb2QoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFJUQ3gtPkNBTFIsIFJUQ19DQUxSX0NBTFc4IHwgUlRDX0NBTFJfQ0FMVzE2KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IENhbGlicmF0aW9uIG1pbnVzCisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBub3RlICAgQml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBSRUNBTFBGIGlzIHNldCB0byAwIGluIFJUQ19JU1IKKyAgKiBAcm10b2xsIENBTFIgICAgICAgICBDQUxNICAgICAgICAgIExMX1JUQ19DQUxfU2V0TWludXMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBDYWxpYk1pbnVzIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgxRkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DQUxfU2V0TWludXMoUlRDX1R5cGVEZWYgKlJUQ3gsIHVpbnQzMl90IENhbGliTWludXMpCit7CisgIE1PRElGWV9SRUcoUlRDeC0+Q0FMUiwgUlRDX0NBTFJfQ0FMTSwgQ2FsaWJNaW51cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENhbGlicmF0aW9uIG1pbnVzCisgICogQHJtdG9sbCBDQUxSICAgICAgICAgQ0FMTSAgICAgICAgICBMTF9SVENfQ0FMX0dldE1pbnVzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0gMHgxRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfQ0FMX0dldE1pbnVzKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChSVEN4LT5DQUxSLCBSVENfQ0FMUl9DQUxNKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0ZMQUdfTWFuYWdlbWVudCBGTEFHX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbnRlcm5hbCBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJVFNGICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfSVRTRikgPT0gKFJUQ19JU1JfSVRTRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUmVjYWxpYnJhdGlvbiBwZW5kaW5nIEZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSRUNBTFBGICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfUkVDQUxQCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUkVDQUxQKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfUkVDQUxQRikgPT0gKFJUQ19JU1JfUkVDQUxQRikpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQ19UQU1QMyBkZXRlY3Rpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRBTVAzRiAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAzKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVEFNUDNGKSA9PSAoUlRDX0lTUl9UQU1QM0YpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBHZXQgUlRDX1RBTVAyIGRldGVjdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEFNUDJGICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RBTVAyCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9UQU1QMkYpID09IChSVENfSVNSX1RBTVAyRikpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBSVENfVEFNUDEgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMUYgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVEFNUDEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UQU1QMShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1RBTVAxRikgPT0gKFJUQ19JU1JfVEFNUDFGKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBHZXQgVGltZS1zdGFtcCBvdmVyZmxvdyBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFNPVkYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1RTT1YKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UU09WKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfVFNPVkYpID09IChSVENfSVNSX1RTT1ZGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU0YgICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19UUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1RTRikgPT0gKFJUQ19JU1JfVFNGKSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEdldCBXYWtldXAgdGltZXIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVEYgICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9XVVRGKSA9PSAoUlRDX0lTUl9XVVRGKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJCRiAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0FMUkIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPklTUiwgUlRDX0lTUl9BTFJCRikgPT0gKFJUQ19JU1JfQUxSQkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFsYXJtIEEgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkFGICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0FMUkFGKSA9PSAoUlRDX0lTUl9BTFJBRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBJbnRlcm5hbCBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBJVFNGICAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfSVRTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19JVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX0lUU0YgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUlRDX1RBTVAzIGRldGVjdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEFNUDNGICAgICAgICBMTF9SVENfQ2xlYXJGbGFnX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVEFNUDNGIHwgUlRDX0lTUl9JTklUKSAmIDB4MDAwMEZGRkZVKSB8IChSVEN4LT5JU1IgJiBSVENfSVNSX0lOSVQpKSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisjaWYgZGVmaW5lZChSVENfVEFNUEVSMl9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBSVENfVEFNUDIgZGV0ZWN0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQU1QMkYgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UQU1QMkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJUQ19UQU1QMSBkZXRlY3Rpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRBTVAxRiAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX1RBTVAxRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIG92ZXJmbG93IGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU09WRiAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFNPVgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfVFNPVihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfVFNPVkYgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUaW1lLXN0YW1wIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUU0YgICAgICAgICAgIExMX1JUQ19DbGVhckZsYWdfVFMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1RTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9UU0YgfCBSVENfSVNSX0lOSVQpICYgMHgwMDAwRkZGRlUpIHwgKFJUQ3gtPklTUiAmIFJUQ19JU1JfSU5JVCkpKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1dBS0VVUF9TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtldXAgdGltZXIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFdVVEYgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19XVVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfQ2xlYXJGbGFnX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgV1JJVEVfUkVHKFJUQ3gtPklTUiwgKH4oKFJUQ19JU1JfV1VURiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEIgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkJGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJCCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJCKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJCRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIEFsYXJtIEEgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMUkFGICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0NsZWFyRmxhZ19BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBXUklURV9SRUcoUlRDeC0+SVNSLCAofigoUlRDX0lTUl9BTFJBRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbml0aWFsaXphdGlvbiBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSU5JVEYgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVQKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfSU5JVEYpID09IChSVENfSVNSX0lOSVRGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZWdpc3RlcnMgc3luY2hyb25pemF0aW9uIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSU0YgICAgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1JTRikgPT0gKFJUQ19JU1JfUlNGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJTRiAgICAgICAgICAgTExfUlRDX0NsZWFyRmxhZ19SUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19DbGVhckZsYWdfUlMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFdSSVRFX1JFRyhSVEN4LT5JU1IsICh+KChSVENfSVNSX1JTRiB8IFJUQ19JU1JfSU5JVCkgJiAweDAwMDBGRkZGVSkgfCAoUlRDeC0+SVNSICYgUlRDX0lTUl9JTklUKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBJbml0aWFsaXphdGlvbiBzdGF0dXMgZmxhZworICAqIEBybXRvbGwgSVNSICAgICAgICAgIElOSVRTICAgICAgICAgTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX0lOSVRTKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfSU5JVFMpID09IChSVENfSVNSX0lOSVRTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBTaGlmdCBvcGVyYXRpb24gcGVuZGluZyBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgU0hQRiAgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNBY3RpdmVGbGFnX1NIUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX1NIUEYpID09IChSVENfSVNSX1NIUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgR2V0IFdha2V1cCB0aW1lciB3cml0ZSBmbGFnCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VUV0YgICAgICAgICBMTF9SVENfSXNBY3RpdmVGbGFnX1dVVFcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19XVVRXKFJUQ19UeXBlRGVmICpSVEN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChSVEN4LT5JU1IsIFJUQ19JU1JfV1VUV0YpID09IChSVENfSVNSX1dVVFdGKSkgPyAxVUwgOiAwVUwpOworfQorI2VuZGlmIC8qIFJUQ19XQUtFVVBfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBCIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJCV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQlcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJCVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0FMUkJXRikgPT0gKFJUQ19JU1JfQUxSQldGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBBbGFybSBBIHdyaXRlIGZsYWcKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBBTFJBV0YgICAgICAgIExMX1JUQ19Jc0FjdGl2ZUZsYWdfQUxSQVcKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzQWN0aXZlRmxhZ19BTFJBVyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+SVNSLCBSVENfSVNSX0FMUkFXRikgPT0gKFJUQ19JU1JfQUxSQVdGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFJUQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUaW1lLXN0YW1wIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0lFICAgICAgICAgIExMX1JUQ19FbmFibGVJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9UUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1RTSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGltZS1zdGFtcCBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVFNJRSAgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RTCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9UUyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSk7Cit9CisKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFdha2V1cCB0aW1lciBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfRW5hYmxlSVRfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1dVVChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX1dVVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2V1cCB0aW1lciBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1dVVAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfV1VUKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9XVVRJRSk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFsYXJtIEIgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkJJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX0FMUkIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5DUiwgUlRDX0NSX0FMUkJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbGFybSBCIGludGVycnVwdAorICAqIEBub3RlICAgQml0IGlzIHdyaXRlLXByb3RlY3RlZC4gQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KKyAgKiBAcm10b2xsIENSICAgICAgICAgICBBTFJCSUUgICAgICAgIExMX1JUQ19EaXNhYmxlSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWxhcm0gQSBpbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIEJpdCBpcyB3cml0ZS1wcm90ZWN0ZWQuIEByZWYgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQUlFICAgICAgICBMTF9SVENfRW5hYmxlSVRfQUxSQQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFsYXJtIEEgaW50ZXJydXB0CisgICogQG5vdGUgICBCaXQgaXMgd3JpdGUtcHJvdGVjdGVkLiBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlLgorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0Rpc2FibGVJVF9BTFJBCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9BTFJBKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJBSUUpOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgVGFtcGVyIDMgaW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDNJRSAgICAgICBMTF9SVENfRW5hYmxlSVRfVEFNUDMKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUDMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIFNFVF9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVAzSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVGFtcGVyIDMgaW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUDNJRSAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0Rpc2FibGVJVF9UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgQ0xFQVJfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QM0lFKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUYW1wZXIgMiBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMklFICAgICAgIExMX1JUQ19FbmFibGVJVF9UQU1QMgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19FbmFibGVJVF9UQU1QMihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUDJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUYW1wZXIgMiBpbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMklFICAgICAgIExMX1JUQ19EaXNhYmxlSVRfVEFNUDIKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAyKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBDTEVBUl9CSVQoUlRDeC0+VEFNUENSLCBSVENfVEFNUENSX1RBTVAySUUpOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIyX1NVUFBPUlQgKi8KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRhbXBlciAxIGludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxSUUgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAxCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfUlRDX0VuYWJsZUlUX1RBTVAxKFJUQ19UeXBlRGVmICpSVEN4KQoreworICBTRVRfQklUKFJUQ3gtPlRBTVBDUiwgUlRDX1RBTVBDUl9UQU1QMUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRhbXBlciAxIGludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAxSUUgICAgICAgTExfUlRDX0Rpc2FibGVJVF9UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1JUQ19EaXNhYmxlSVRfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUDFJRSk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhbGwgVGFtcGVyIEludGVycnVwdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVBJRSAgICAgICAgTExfUlRDX0VuYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRW5hYmxlSVRfVEFNUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgU0VUX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFsbCBUYW1wZXIgSW50ZXJydXB0CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUElFICAgICAgICBMTF9SVENfRGlzYWJsZUlUX1RBTVAKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9SVENfRGlzYWJsZUlUX1RBTVAoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIENMRUFSX0JJVChSVEN4LT5UQU1QQ1IsIFJUQ19UQU1QQ1JfVEFNUElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiAgVGltZS1zdGFtcCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUU0lFICAgICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UUworICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVFMoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfVFNJRSkgPT0gKFJUQ19DUl9UU0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBXYWtldXAgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV1VUSUUgICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfV1VUCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9XVVQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfV1VUSUUpID09IChSVENfQ1JfV1VUSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIEFsYXJtIEIgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBDUiAgICAgICAgICAgQUxSQklFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfQUxSQgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfQUxSQihSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+Q1IsIFJUQ19DUl9BTFJCSUUpID09IChSVENfQ1JfQUxSQklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBBbGFybSBBIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEFMUkFJRSAgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX0FMUkEKKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfUlRDX0lzRW5hYmxlZElUX0FMUkEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPkNSLCBSVENfQ1JfQUxSQUlFKSA9PSAoUlRDX0NSX0FMUkFJRSkpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgIFRhbXBlciAzIGludGVycnVwdCBpcyBlbmFibGVkIG9yIG5vdAorICAqIEBybXRvbGwgVEFNUENSICAgICAgIFRBTVAzSUUgICAgICAgTExfUlRDX0lzRW5hYmxlZElUX1RBTVAzCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMyhSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VEFNUENSLAorICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUDNJRSkgPT0gKFJUQ19UQU1QQ1JfVEFNUDNJRSkpID8gMVVMIDogMFVMKTsKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIyX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBUYW1wZXIgMiBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMklFICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVEFNUDIoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPlRBTVBDUiwKKyAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAySUUpID09IChSVENfVEFNUENSX1RBTVAySUUpKSA/IDFVTCA6IDBVTCk7CisKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMl9TVVBQT1JUICovCisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmICBUYW1wZXIgMSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QKKyAgKiBAcm10b2xsIFRBTVBDUiAgICAgICBUQU1QMUlFICAgICAgIExMX1JUQ19Jc0VuYWJsZWRJVF9UQU1QMQorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVEFNUDEoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFJUQ3gtPlRBTVBDUiwKKyAgICAgICAgICAgICAgICAgICBSVENfVEFNUENSX1RBTVAxSUUpID09IChSVENfVEFNUENSX1RBTVAxSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIGFsbCB0aGUgVEFNUEVSIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb3Igbm90CisgICogQHJtdG9sbCBUQU1QQ1IgICAgICAgVEFNUElFICAgICAgICBMTF9SVENfSXNFbmFibGVkSVRfVEFNUAorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9SVENfSXNFbmFibGVkSVRfVEFNUChSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoUlRDeC0+VEFNUENSLAorICAgICAgICAgICAgICAgICAgIFJUQ19UQU1QQ1JfVEFNUElFKSA9PSAoUlRDX1RBTVBDUl9UQU1QSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgUlRDX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1JUQ19EZUluaXQoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX0luaXQoUlRDX1R5cGVEZWYgKlJUQ3gsIExMX1JUQ19Jbml0VHlwZURlZiAqUlRDX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfUlRDX1N0cnVjdEluaXQoTExfUlRDX0luaXRUeXBlRGVmICpSVENfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfVElNRV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfVGltZVR5cGVEZWYgKlJUQ19UaW1lU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19USU1FX1N0cnVjdEluaXQoTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfREFURV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19EQVRFX1N0cnVjdEluaXQoTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9SVENfQUxNQV9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUJfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1BX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1JUQ19BTE1CX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KTsKK0Vycm9yU3RhdHVzIExMX1JUQ19FeGl0SW5pdE1vZGUoUlRDX1R5cGVEZWYgKlJUQ3gpOworRXJyb3JTdGF0dXMgTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ19UeXBlRGVmICpSVEN4KTsKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUlRDKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX1JUQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJ3Ynh4X2xsX3NwaS5oIGIvSW5jL3N0bTMyd2J4eF9sbF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDIyY2UzCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9sbF9zcGkuaApAQCAtMCwwICsxLDE0MjAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfc3BpLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFNQSSBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1NQSV9ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9TUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMIFNQSQorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VTX0lOSVQgU1BJIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTUEkgSW5pdCBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFRyYW5zZmVyRGlyZWN0aW9uOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwgZGF0YSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19UUkFOU0ZFUl9NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uKCkuKi8KKworICB1aW50MzJfdCBNb2RlOyAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNQSSBtb2RlIChNYXN0ZXIvU2xhdmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19NT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldE1vZGUoKS4qLworCisgIHVpbnQzMl90IERhdGFXaWR0aDsgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU1BJIGRhdGEgd2lkdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU1BJX0xMX0VDX0RBVEFXSURUSC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgc2VyaWFsIGNsb2NrIHN0ZWFkeSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgQ2xvY2tQaGFzZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBhY3RpdmUgZWRnZSBmb3IgdGhlIGJpdCBjYXB0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19QSEFTRS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRDbG9ja1BoYXNlKCkuKi8KKworICB1aW50MzJfdCBOU1M7ICAgICAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgTlNTIHNpZ25hbCBpcyBtYW5hZ2VkIGJ5IGhhcmR3YXJlIChOU1MgcGluKSBvciBieSBzb2Z0d2FyZSB1c2luZyB0aGUgU1NJIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfTlNTX01PREUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0TlNTTW9kZSgpLiovCisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBCYXVkUmF0ZSBwcmVzY2FsZXIgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgU0NLIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19CQVVEUkFURVBSRVNDQUxFUi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIGNvbW11bmljYXRpb24gY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIgY2xvY2suIFRoZSBzbGF2ZSBjbG9jayBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQml0T3JkZXI7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgZGF0YSB0cmFuc2ZlcnMgc3RhcnQgZnJvbSBNU0Igb3IgTFNCIGJpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTUElfTExfRUNfQklUX09SREVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfU1BJX1NldFRyYW5zZmVyQml0T3JkZXIoKS4qLworCisgIHVpbnQzMl90IENSQ0NhbGN1bGF0aW9uOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiB0aGUgQ1JDIGNhbGN1bGF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFNQSV9MTF9FQ19DUkNfQ0FMQ1VMQVRJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfU1BJX0VuYWJsZUNSQygpIGFuZCBAcmVmIExMX1NQSV9EaXNhYmxlQ1JDKCkuKi8KKworICB1aW50MzJfdCBDUkNQb2x5OyAgICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIHBvbHlub21pYWwgdXNlZCBmb3IgdGhlIENSQyBjYWxjdWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbCgpLiovCisKK30gTExfU1BJX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFNQSSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfU1JfUlhORSAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9SWE5FICAgICAgICAgICAgICAgLyohPCBSeCBidWZmZXIgbm90IGVtcHR5IGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfVFhFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9UWEUgICAgICAgICAgICAgICAgLyohPCBUeCBidWZmZXIgZW1wdHkgZmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQlNZICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9CU1kgICAgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfQ1JDRVJSICAgICAgICAgICAgICAgICAgIFNQSV9TUl9DUkNFUlIgICAgICAgICAgICAgLyohPCBDUkMgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfTU9ERiAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9NT0RGICAgICAgICAgICAgICAgLyohPCBNb2RlIGZhdWx0IGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9PVlIgICAgICAgICAgICAgICAgLyohPCBPdmVycnVuIGZsYWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfU1JfRlJFICAgICAgICAgICAgICAgICAgICAgIFNQSV9TUl9GUkUgICAgICAgICAgICAgICAgLyohPCBUSSBtb2RlIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfU1BJX1JlYWRSZWcgYW5kICBMTF9TUElfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0NSMl9SWE5FSUUgICAgICAgICAgICAgICAgICBTUElfQ1IyX1JYTkVJRSAgICAgICAgICAgIC8qITwgUnggYnVmZmVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1NQSV9DUjJfVFhFSUUgICAgICAgICAgICAgICAgICAgU1BJX0NSMl9UWEVJRSAgICAgICAgICAgICAvKiE8IFR4IGJ1ZmZlciBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICAgICAqLworI2RlZmluZSBMTF9TUElfQ1IyX0VSUklFICAgICAgICAgICAgICAgICAgIFNQSV9DUjJfRVJSSUUgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX01PREUgT3BlcmF0aW9uIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTU9ERV9NQVNURVIgICAgICAgICAgICAgICAgIChTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSkgICAgLyohPCBNYXN0ZXIgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgTExfU1BJX01PREVfU0xBVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgY29uZmlndXJhdGlvbiAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QUk9UT0NPTCBTZXJpYWwgUHJvdG9jb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfUFJPVE9DT0xfTU9UT1JPTEEgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBNb3Rvcm9sYSBtb2RlLiBVc2VkIGFzIGRlZmF1bHQgdmFsdWUgKi8KKyNkZWZpbmUgTExfU1BJX1BST1RPQ09MX1RJICAgICAgICAgICAgICAgICAoU1BJX0NSMl9GUkYpICAgICAgICAgICAgIC8qITwgVEkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19QSEFTRSBDbG9jayBQaGFzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9QSEFTRV8xRURHRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IEZpcnN0IGNsb2NrIHRyYW5zaXRpb24gaXMgdGhlIGZpcnN0IGRhdGEgY2FwdHVyZSBlZGdlICAqLworI2RlZmluZSBMTF9TUElfUEhBU0VfMkVER0UgICAgICAgICAgICAgICAgIChTUElfQ1IxX0NQSEEpICAgICAgICAgICAgLyohPCBTZWNvbmQgY2xvY2sgdHJhbnNpdGlvbiBpcyB0aGUgZmlyc3QgZGF0YSBjYXB0dXJlIGVkZ2UgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX1BPTEFSSVRZIENsb2NrIFBvbGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMCB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgTExfU1BJX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAoU1BJX0NSMV9DUE9MKSAgICAgICAgICAgIC8qITwgQ2xvY2sgdG8gMSB3aGVuIGlkbGUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0JBVURSQVRFUFJFU0NBTEVSIEJhdWQgUmF0ZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMiAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzIgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNCAgICAgIChTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzQgICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWOCAgICAgIChTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzggICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYgICAgIChTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzE2ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMzIgICAgIChTUElfQ1IxX0JSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzMyICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNjQgICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzApICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzY0ICAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEpICAgICAgICAgICAgICAgICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzEyOCAqLworI2RlZmluZSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjU2ICAgIChTUElfQ1IxX0JSXzIgfCBTUElfQ1IxX0JSXzEgfCBTUElfQ1IxX0JSXzApICAgLyohPCBCYXVkUmF0ZSBjb250cm9sIGVxdWFsIHRvIGZQQ0xLLzI1NiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQklUX09SREVSIFRyYW5zbWlzc2lvbiBCaXQgT3JkZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfTFNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIChTUElfQ1IxX0xTQkZJUlNUKSAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIExTQiBmaXJzdCAqLworI2RlZmluZSBMTF9TUElfTVNCX0ZJUlNUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBEYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfVFJBTlNGRVJfTU9ERSBUcmFuc2ZlciBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0ZVTExfRFVQTEVYICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGdWxsLUR1cGxleCBtb2RlLiBSeCBhbmQgVHggdHJhbnNmZXIgb24gMiBsaW5lcyAqLworI2RlZmluZSBMTF9TUElfU0lNUExFWF9SWCAgICAgICAgICAgICAgICAgIChTUElfQ1IxX1JYT05MWSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFNpbXBsZXggUnggbW9kZS4gIFJ4IHRyYW5zZmVyIG9ubHkgb24gMSBsaW5lICAgICovCisjZGVmaW5lIExMX1NQSV9IQUxGX0RVUExFWF9SWCAgICAgICAgICAgICAgKFNQSV9DUjFfQklESU1PREUpICAgICAgICAgICAgICAgICAgIC8qITwgSGFsZi1EdXBsZXggUnggbW9kZS4gUnggdHJhbnNmZXIgb24gMSBsaW5lICAgICAgKi8KKyNkZWZpbmUgTExfU1BJX0hBTEZfRFVQTEVYX1RYICAgICAgICAgICAgICAoU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSAgLyohPCBIYWxmLUR1cGxleCBUeCBtb2RlLiBUeCB0cmFuc2ZlciBvbiAxIGxpbmUgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfTlNTX01PREUgU2xhdmUgU2VsZWN0IFBpbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX05TU19TT0ZUICAgICAgICAgICAgICAgICAgICAoU1BJX0NSMV9TU00pICAgICAgICAgICAgICAgICAgICAgLyohPCBOU1MgbWFuYWdlZCBpbnRlcm5hbGx5LiBOU1MgcGluIG5vdCB1c2VkIGFuZCBmcmVlICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TUElfTlNTX0hBUkRfSU5QVVQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE5TUyBwaW4gdXNlZCBpbiBJbnB1dC4gT25seSB1c2VkIGluIE1hc3RlciBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NQSV9OU1NfSEFSRF9PVVRQVVQgICAgICAgICAgICAgKCgodWludDMyX3QpU1BJX0NSMl9TU09FIDw8IDE2VSkpIC8qITwgTlNTIHBpbiB1c2VkIGluIE91dHB1dC4gT25seSB1c2VkIGluIFNsYXZlIG1vZGUgYXMgY2hpcCBzZWxlY3QgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0RBVEFXSURUSCBEYXRhd2lkdGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzRCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzAgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDQgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzVCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDUgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzZCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDYgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzdCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDcgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzhCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDggYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzlCSVQgICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogIDkgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEwQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTAgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzExQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTEgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEyQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTIgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzEzQklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTMgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE0QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzApICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTQgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE1QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEpICAgICAgICAgICAgICAgIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTUgYml0cyAqLworI2RlZmluZSBMTF9TUElfREFUQVdJRFRIXzE2QklUICAgICAgICAgICAgIChTUElfQ1IyX0RTXzMgfCBTUElfQ1IyX0RTXzIgfCBTUElfQ1IyX0RTXzEgfCBTUElfQ1IyX0RTXzApIC8qITwgRGF0YSBsZW5ndGggZm9yIFNQSSB0cmFuc2ZlcjogMTYgYml0cyAqLworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfQ1JDX0NBTENVTEFUSU9OIENSQyBDYWxjdWxhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8IENSQyBjYWxjdWxhdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFICAgICAgIChTUElfQ1IxX0NSQ0VOKSAgICAgICAgICAgLyohPCBDUkMgY2FsY3VsYXRpb24gZW5hYmxlZCAgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VDX0NSQ19MRU5HVEggQ1JDIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1NQSV9DUkNfOEJJVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAvKiE8ICA4LWJpdCBDUkMgbGVuZ3RoICovCisjZGVmaW5lIExMX1NQSV9DUkNfMTZCSVQgICAgICAgICAgICAgICAgICAgKFNQSV9DUjFfQ1JDTCkgICAgICAgICAgICAvKiE8IDE2LWJpdCBDUkMgbGVuZ3RoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FQ19SWF9GSUZPX1RIIFJYIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRiAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgIC8qITwgUlhORSBldmVudCBpcyBnZW5lcmF0ZWQgaWYgRklGTyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1ZWwgdG8gMS8yICgxNi1iaXQpICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVIgICAgICAgICAgKFNQSV9DUjJfRlJYVEgpICAgICAgICAgICAvKiE8IFJYTkUgZXZlbnQgaXMgZ2VuZXJhdGVkIGlmIEZJRk8gbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWVsIHRvIDEvNCAoOC1iaXQpICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfUlhfRklGTyBSWCBGSUZPIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fRU1QVFkgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHJlY2VwdGlvbiBlbXB0eSAqLworI2RlZmluZSBMTF9TUElfUlhfRklGT19RVUFSVEVSX0ZVTEwgICAgICAgIChTUElfU1JfRlJMVkxfMCkgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gcmVjZXB0aW9uIDEvNCAgICovCisjZGVmaW5lIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTCAgICAgICAgICAgKFNQSV9TUl9GUkxWTF8xKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyByZWNlcHRpb24gMS8yICAgKi8KKyNkZWZpbmUgTExfU1BJX1JYX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAoU1BJX1NSX0ZSTFZMXzEgfCBTUElfU1JfRlJMVkxfMCkgLyohPCBGSUZPIHJlY2VwdGlvbiBmdWxsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfVFhfRklGTyBUWCBGSUZPIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRU1QVFkgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBlbXB0eSAqLworI2RlZmluZSBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwgICAgICAgIChTUElfU1JfRlRMVkxfMCkgICAgICAgICAgICAgICAgICAvKiE8IEZJRk8gdHJhbnNtaXNzaW9uIDEvNCAgICovCisjZGVmaW5lIExMX1NQSV9UWF9GSUZPX0hBTEZfRlVMTCAgICAgICAgICAgKFNQSV9TUl9GVExWTF8xKSAgICAgICAgICAgICAgICAgIC8qITwgRklGTyB0cmFuc21pc3Npb24gMS8yICAgKi8KKyNkZWZpbmUgTExfU1BJX1RYX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAoU1BJX1NSX0ZUTFZMXzEgfCBTUElfU1JfRlRMVkxfMCkgLyohPCBGSUZPIHRyYW5zbWlzc2lvbiBmdWxsICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUNfRE1BX1BBUklUWSBETUEgUGFyaXR5CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1BJX0RNQV9QQVJJVFlfRVZFTiAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgU2VsZWN0IERNQSBwYXJpdHkgRXZlbiAqLworI2RlZmluZSBMTF9TUElfRE1BX1BBUklUWV9PREQgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgLyohPCBTZWxlY3QgRE1BIHBhcml0eSBPZGQgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FeHBvcnRlZF9NYWNyb3MgU1BJIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VNX1dSSVRFX1JFQUQgQ29tbW9uIFdyaXRlIGFuZCByZWFkIHJlZ2lzdGVycyBNYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgdmFsdWUgaW4gU1BJIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9TUElfV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18sIChfX1ZBTFVFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgYSB2YWx1ZSBpbiBTUEkgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfU1BJX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRyhfX0lOU1RBTkNFX18tPl9fUkVHX18pCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0VuYWJsZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTUEkgcGVyaXBoZXJhbAorICAqIEBub3RlICAgV2hlbiBkaXNhYmxpbmcgdGhlIFNQSSwgZm9sbG93IHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluIHRoZSBSZWZlcmVuY2UgTWFudWFsLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNQRSAgICAgICAgICAgTExfU1BJX0Rpc2FibGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9TUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNQSSBwZXJpcGhlcmFsIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTUEUgICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSkgPT0gKFNQSV9DUjFfU1BFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTUEkgb3BlcmF0aW9uIG1vZGUgdG8gTWFzdGVyIG9yIFNsYXZlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTVNUUiAgICAgICAgICBMTF9TUElfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU1NJICAgICAgICAgICBMTF9TUElfU2V0TW9kZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIE1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9NQVNURVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTU9ERV9TTEFWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE1vZGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX01TVFIgfCBTUElfQ1IxX1NTSSwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNQSSBvcGVyYXRpb24gbW9kZSAoTWFzdGVyIG9yIFNsYXZlKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1TVFIgICAgICAgICAgTExfU1BJX0dldE1vZGVcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFNTSSAgICAgICAgICAgTExfU1BJX0dldE1vZGUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX01BU1RFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NT0RFX1NMQVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE1vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9NU1RSIHwgU1BJX0NSMV9TU0kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9TZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFN0YW5kYXJkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0U3RhbmRhcmQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFN0YW5kYXJkKQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMiwgU1BJX0NSMl9GUkYsIFN0YW5kYXJkKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2VyaWFsIHByb3RvY29sIHVzZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBGUkYgICAgICAgICAgIExMX1NQSV9HZXRTdGFuZGFyZAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX01PVE9ST0xBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BST1RPQ09MX1RJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFN0YW5kYXJkKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRlJGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNsb2NrIHBoYXNlCisgICogQG5vdGUgICBUaGlzIGJpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuCisgICogICAgICAgICBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUEhBICAgICAgICAgIExMX1NQSV9TZXRDbG9ja1BoYXNlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENsb2NrUGhhc2UoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IENsb2NrUGhhc2UpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQSEEsIENsb2NrUGhhc2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjbG9jayBwaGFzZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENQSEEgICAgICAgICAgTExfU1BJX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9QSEFTRV8yRURHRQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDbG9ja1BoYXNlKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjbG9jayBwb2xhcml0eQorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLgorICAqICAgICAgICAgVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ1BPTCAgICAgICAgICBMTF9TUElfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRDbG9ja1BvbGFyaXR5KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDbG9ja1BvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFNQSXgtPkNSMSwgU1BJX0NSMV9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2xvY2sgcG9sYXJpdHkKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUE9MICAgICAgICAgIExMX1NQSV9HZXRDbG9ja1BvbGFyaXR5CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q2xvY2tQb2xhcml0eShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NQT0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYmF1ZCByYXRlIHByZXNjYWxlcgorICAqIEBub3RlICAgVGhlc2UgYml0cyBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2hlbiBjb21tdW5pY2F0aW9uIGlzIG9uZ29pbmcuIFNQSSBCYXVkUmF0ZSA9IGZQQ0xLL1ByZXNjYWxlci4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRCYXVkUmF0ZVByZXNjYWxlcihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQmF1ZFJhdGUpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0JSLCBCYXVkUmF0ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJhdWQgcmF0ZSBwcmVzY2FsZXIKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBCUiAgICAgICAgICAgIExMX1NQSV9HZXRCYXVkUmF0ZVByZXNjYWxlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVYyNTYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0QmF1ZFJhdGVQcmVzY2FsZXIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9CUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0cmFuc2ZlciBiaXQgb3JkZXIKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJpdE9yZGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckJpdE9yZGVyKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfTFNCRklSU1QsIEJpdE9yZGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdHJhbnNmZXIgYml0IG9yZGVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTFNCRklSU1QgICAgICBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0xTQl9GSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9NU0JfRklSU1QKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0VHJhbnNmZXJCaXRPcmRlcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0xTQkZJUlNUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiBtb2RlCisgICogQG5vdGUgICBGb3IgSGFsZi1EdXBsZXggbW9kZSwgUnggRGlyZWN0aW9uIGlzIHNldCBieSBkZWZhdWx0LgorICAqICAgICAgICAgSW4gbWFzdGVyIG1vZGUsIHRoZSBNT1NJIHBpbiBpcyB1c2VkIGFuZCBpbiBzbGF2ZSBtb2RlLCB0aGUgTUlTTyBwaW4gaXMgdXNlZCBmb3IgSGFsZi1EdXBsZXguCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhPTkxZICAgICAgICBMTF9TUElfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIEJJRElNT0RFICAgICAgTExfU1BJX1NldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJT0UgICAgICAgIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0ZVTExfRFVQTEVYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1NJTVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfUlgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfSEFMRl9EVVBMRVhfVFgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRUcmFuc2ZlckRpcmVjdGlvbihTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb24pCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX1JYT05MWSB8IFNQSV9DUjFfQklESU1PREUgfCBTUElfQ1IxX0JJRElPRSwgVHJhbnNmZXJEaXJlY3Rpb24pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0cmFuc2ZlciBkaXJlY3Rpb24gbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYT05MWSAgICAgICAgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBCSURJTU9ERSAgICAgIExMX1NQSV9HZXRUcmFuc2ZlckRpcmVjdGlvblxuCisgICogICAgICAgICBDUjEgICAgICAgICAgQklESU9FICAgICAgICBMTF9TUElfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9GVUxMX0RVUExFWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9TSU1QTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1JYCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0hBTEZfRFVQTEVYX1RYCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFRyYW5zZmVyRGlyZWN0aW9uKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfUlhPTkxZIHwgU1BJX0NSMV9CSURJTU9ERSB8IFNQSV9DUjFfQklESU9FKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGZyYW1lIGRhdGEgd2lkdGgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBEUyAgICAgICAgICAgIExMX1NQSV9TZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RGF0YVdpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBEYXRhV2lkdGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTLCBEYXRhV2lkdGgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBmcmFtZSBkYXRhIHdpZHRoCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRFMgICAgICAgICAgICBMTF9TUElfR2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzZCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzhCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzlCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEwQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xMUJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTJCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzEzQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0RBVEFXSURUSF8xNEJJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9EQVRBV0lEVEhfMTVCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfREFUQVdJRFRIXzE2QklUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERhdGFXaWR0aChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0RTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfU2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfSEFMRgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1RIX1FVQVJURVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfRlJYVEgsIFRocmVzaG9sZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRocmVzaG9sZCBvZiBSWEZJRk8gdGhhdCB0cmlnZ2VycyBhbiBSWE5FIGV2ZW50CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRlJYVEggICAgICAgICBMTF9TUElfR2V0UnhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19USF9IQUxGCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1JYX0ZJRk9fVEhfUVVBUlRFUgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRSeEZJRk9UaHJlc2hvbGQoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9GUlhUSCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9DUkNfTWFuYWdlbWVudCBDUkMgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0VuYWJsZUNSQworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENSQworICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0VOICAgICAgICAgTExfU1BJX0Rpc2FibGVDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUNSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMSwgU1BJX0NSMV9DUkNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgQ1JDIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBiZSB3cml0dGVuIG9ubHkgd2hlbiBTUEkgaXMgZGlzYWJsZWQgKFNQRSA9IDApIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNFTiAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzRW5hYmxlZENSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0VOKSA9PSAoU1BJX0NSMV9DUkNFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDIExlbmd0aAorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIGJlIHdyaXR0ZW4gb25seSB3aGVuIFNQSSBpcyBkaXNhYmxlZCAoU1BFID0gMCkgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ0wgICAgICAgICAgTExfU1BJX1NldENSQ1dpZHRoCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ1JDTGVuZ3RoIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ18xNkJJVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldENSQ1dpZHRoKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBDUkNMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wsIENSQ0xlbmd0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENSQyBMZW5ndGgKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDUkNMICAgICAgICAgIExMX1NQSV9HZXRDUkNXaWR0aAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ184QklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX0NSQ18xNkJJVAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRDUkNXaWR0aChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX0NSQ0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQ1JDTmV4dCB0byB0cmFuc2ZlciBDUkMgb24gdGhlIGxpbmUKKyAgKiBAbm90ZSAgIFRoaXMgYml0IGhhcyB0byBiZSB3cml0dGVuIGFzIHNvb24gYXMgdGhlIGxhc3QgZGF0YSBpcyB3cml0dGVuIGluIHRoZSBTUEl4X0RSIHJlZ2lzdGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENSQ05FWFQgICAgICAgTExfU1BJX1NldENSQ05leHQKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q1JDTmV4dChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbgorICAqIEBybXRvbGwgQ1JDUFIgICAgICAgIENSQ1BPTFkgICAgICAgTExfU1BJX1NldENSQ1BvbHlub21pYWwKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBDUkNQb2x5IFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0Q1JDUG9seW5vbWlhbChTUElfVHlwZURlZiAqU1BJeCwgdWludDMyX3QgQ1JDUG9seSkKK3sKKyAgV1JJVEVfUkVHKFNQSXgtPkNSQ1BSLCAodWludDE2X3QpQ1JDUG9seSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBvbHlub21pYWwgZm9yIENSQyBjYWxjdWxhdGlvbgorICAqIEBybXRvbGwgQ1JDUFIgICAgICAgIENSQ1BPTFkgICAgICAgTExfU1BJX0dldENSQ1BvbHlub21pYWwKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0Q1JDUG9seW5vbWlhbChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+Q1JDUFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUnggQ1JDCisgICogQHJtdG9sbCBSWENSQ1IgICAgICAgUlhDUkMgICAgICAgICBMTF9TUElfR2V0UnhDUkMKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMCBhbmQgTWF4X0RhdGEgPSAweEZGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhDUkMoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFNQSXgtPlJYQ1JDUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBUeCBDUkMKKyAgKiBAcm10b2xsIFRYQ1JDUiAgICAgICBUWENSQyAgICAgICAgIExMX1NQSV9HZXRUeENSQworICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGlzIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9HZXRUeENSQyhTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoU1BJeC0+VFhDUkNSKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX05TU19NYW5hZ2VtZW50IFNsYXZlIFNlbGVjdCBQaW4gTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IE5TUyBtb2RlCisgICogQG5vdGUgICBMTF9TUElfTlNTX1NPRlQgTW9kZSBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9TZXROU1NNb2RlXG4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTU09FICAgICAgICAgIExMX1NQSV9TZXROU1NNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgTlNTIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19TT0ZUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX0lOUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX05TU19IQVJEX09VVFBVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1NldE5TU01vZGUoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IE5TUykKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjEsIFNQSV9DUjFfU1NNLCAgTlNTKTsKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfU1NPRSwgKCh1aW50MzJfdCkoTlNTID4+IDE2VSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgTlNTIG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTU00gICAgICAgICAgIExMX1NQSV9HZXROU1NNb2RlXG4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTU09FICAgICAgICAgIExMX1NQSV9HZXROU1NNb2RlCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX1NPRlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX0hBUkRfSU5QVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfTlNTX0hBUkRfT1VUUFVUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldE5TU01vZGUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IFNzbSAgPSAoUkVBRF9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NTTSkpOworICByZWdpc3RlciB1aW50MzJfdCBTc29lID0gKFJFQURfQklUKFNQSXgtPkNSMiwgIFNQSV9DUjJfU1NPRSkgPDwgMTZVKTsKKyAgcmV0dXJuIChTc20gfCBTc29lKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlTlNTUHVsc2VNZ3QoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX05TU1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTlNTIHB1bHNlIG1hbmFnZW1lbnQKKyAgKiBAbm90ZSAgIFRoaXMgYml0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aGVuIGNvbW11bmljYXRpb24gaXMgb25nb2luZy4gVGhpcyBiaXQgaXMgbm90IHVzZWQgaW4gU1BJIFRJIG1vZGUuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTlNTUCAgICAgICAgICBMTF9TUElfRGlzYWJsZU5TU1B1bHNlTWd0CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVOU1NQdWxzZU1ndChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBOU1MgcHVsc2UgaXMgZW5hYmxlZAorICAqIEBub3RlICAgVGhpcyBiaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdoZW4gY29tbXVuaWNhdGlvbiBpcyBvbmdvaW5nLiBUaGlzIGJpdCBpcyBub3QgdXNlZCBpbiBTUEkgVEkgbW9kZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOU1NQICAgICAgICAgIExMX1NQSV9Jc0VuYWJsZWROU1NQdWxzZQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkTlNTUHVsc2UoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9OU1NQKSA9PSAoU1BJX0NSMl9OU1NQKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRyBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBSeCBidWZmZXIgaXMgbm90IGVtcHR5CisgICogQHJtdG9sbCBTUiAgICAgICAgICAgUlhORSAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX1JYTkUKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0lzQWN0aXZlRmxhZ19SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1JYTkUpID09IChTUElfU1JfUlhORSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUeCBidWZmZXIgaXMgZW1wdHkKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBUWEUgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX1RYRSkgPT0gKFNQSV9TUl9UWEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENSQyBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ1JDRVJSICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0NSQ0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0NSQ0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9DUkNFUlIpID09IChTUElfU1JfQ1JDRVJSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBtb2RlIGZhdWx0IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX01PREYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfTU9ERikgPT0gKFNQSV9TUl9NT0RGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBvdmVycnVuIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBPVlIgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX09WUikgPT0gKFNQSV9TUl9PVlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGJ1c3kgZmxhZworICAqIEBub3RlICAgVGhlIEJTWSBmbGFnIGlzIGNsZWFyZWQgdW5kZXIgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgICogLVdoZW4gdGhlIFNQSSBpcyBjb3JyZWN0bHkgZGlzYWJsZWQKKyAgKiAtV2hlbiBhIGZhdWx0IGlzIGRldGVjdGVkIGluIE1hc3RlciBtb2RlIChNT0RGIGJpdCBzZXQgdG8gMSkKKyAgKiAtSW4gTWFzdGVyIG1vZGUsIHdoZW4gaXQgZmluaXNoZXMgYSBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgbm8gbmV3IGRhdGEgaXMgcmVhZHkgdG8gYmUKKyAgKiBzZW50CisgICogLUluIFNsYXZlIG1vZGUsIHdoZW4gdGhlIEJTWSBmbGFnIGlzIHNldCB0byAnMCcgZm9yIGF0IGxlYXN0IG9uZSBTUEkgY2xvY2sgY3ljbGUgYmV0d2VlbgorICAqIGVhY2ggZGF0YSB0cmFuc2Zlci4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCU1kgICAgICAgICAgIExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0FjdGl2ZUZsYWdfQlNZKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0JTWSkgPT0gKFNQSV9TUl9CU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgRlJFICAgICAgICAgICBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNBY3RpdmVGbGFnX0ZSRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1BJeC0+U1IsIFNQSV9TUl9GUkUpID09IChTUElfU1JfRlJFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBGSUZPIHJlY2VwdGlvbiBMZXZlbAorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEZSTFZMICAgICAgICAgTExfU1BJX0dldFJ4RklGT0xldmVsCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfUlhfRklGT19FTVBUWQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX1FVQVJURVJfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0hBTEZfRlVMTAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9SWF9GSUZPX0ZVTEwKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0UnhGSUZPTGV2ZWwoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNQSXgtPlNSLCBTUElfU1JfRlJMVkwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgRklGTyBUcmFuc21pc3Npb24gTGV2ZWwKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGVExWTCAgICAgICAgIExMX1NQSV9HZXRUeEZJRk9MZXZlbAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1BJX1RYX0ZJRk9fRU1QVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19RVUFSVEVSX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19IQUxGX0ZVTEwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfVFhfRklGT19GVUxMCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldFR4RklGT0xldmVsKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5TUiwgU1BJX1NSX0ZUTFZMKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ1JDIGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDUkNFUlIgICAgICAgIExMX1NQSV9DbGVhckZsYWdfQ1JDRVJSCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19DUkNFUlIoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIENMRUFSX0JJVChTUEl4LT5TUiwgU1BJX1NSX0NSQ0VSUik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgbW9kZSBmYXVsdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHdyaXRlIGFjY2VzcyB0byB0aGUgU1BJeF9DUjEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBNT0RGICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfTU9ERgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfTU9ERihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWdfc3I7CisgIHRtcHJlZ19zciA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnX3NyOworICBDTEVBUl9CSVQoU1BJeC0+Q1IxLCBTUElfQ1IxX1NQRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgb3ZlcnJ1biBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X0RSCisgICogICAgICAgICByZWdpc3RlciBmb2xsb3dlZCBieSBhIHJlYWQgYWNjZXNzIHRvIHRoZSBTUEl4X1NSIHJlZ2lzdGVyCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgT1ZSICAgICAgICAgICBMTF9TUElfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9DbGVhckZsYWdfT1ZSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBfX0lPIHVpbnQzMl90IHRtcHJlZzsKKyAgdG1wcmVnID0gU1BJeC0+RFI7CisgICh2b2lkKSB0bXByZWc7CisgIHRtcHJlZyA9IFNQSXgtPlNSOworICAodm9pZCkgdG1wcmVnOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIGZyYW1lIGZvcm1hdCBlcnJvciBmbGFnCisgICogQG5vdGUgICBDbGVhcmluZyB0aGlzIGZsYWcgaXMgZG9uZSBieSByZWFkaW5nIFNQSXhfU1IgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBGUkUgICAgICAgICAgIExMX1NQSV9DbGVhckZsYWdfRlJFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0NsZWFyRmxhZ19GUkUoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIF9fSU8gdWludDMyX3QgdG1wcmVnOworICB0bXByZWcgPSBTUEl4LT5TUjsKKyAgKHZvaWQpIHRtcHJlZzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfTExfRUZfSVRfTWFuYWdlbWVudCBJbnRlcnJ1cHQgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGVycm9yIGludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBiaXQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW50ZXJydXB0IHdoZW4gYW4gZXJyb3IgY29uZGl0aW9uIG9jY3VycyAoQ1JDRVJSLCBPVlIsIE1PREYgaW4gU1BJIG1vZGUsIEZSRSBhdCBUSSBtb2RlKS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBFUlJJRSAgICAgICAgIExMX1NQSV9FbmFibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhORUlFICAgICAgICBMTF9TUElfRW5hYmxlSVRfUlhORQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWE5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRW5hYmxlSVRfVFhFCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0VuYWJsZUlUX1RYRShTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgU0VUX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXJyb3IgaW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGJpdCBjb250cm9scyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBpbnRlcnJ1cHQgd2hlbiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzIChDUkNFUlIsIE9WUiwgTU9ERiBpbiBTUEkgbW9kZSwgRlJFIGF0IFRJIG1vZGUpLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9FUlIKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZUlUX0VSUihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSeCBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYTkVJRSAgICAgICAgTExfU1BJX0Rpc2FibGVJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX0Rpc2FibGVJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYTkVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVFhFSUUgICAgICAgICBMTF9TUElfRGlzYWJsZUlUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1RYRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBlcnJvciBpbnRlcnJ1cHQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEVSUklFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX0VSUgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfRVJSKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfRVJSSUUpID09IChTUElfQ1IyX0VSUklFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSWE5FSUUgICAgICAgIExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRJVF9SWE5FKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfUlhORUlFKSA9PSAoU1BJX0NSMl9SWE5FSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgVHggYnVmZmVyIGVtcHR5IGludGVycnVwdAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRUlFICAgICAgICAgTExfU1BJX0lzRW5hYmxlZElUX1RYRQorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkSVRfVFhFKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhFSUUpID09IChTUElfQ1IyX1RYRUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9ETUFfTWFuYWdlbWVudCBETUEgTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBSeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfU1BJX0VuYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9FbmFibGVETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIFNFVF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIFJ4CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfRGlzYWJsZURNQVJlcV9SWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9EaXNhYmxlRE1BUmVxX1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBDTEVBUl9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBSeCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhETUFFTiAgICAgICBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9Jc0VuYWJsZWRETUFSZXFfUlgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSA9PSAoU1BJX0NSMl9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgVHgKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWERNQUVOICAgICAgIExMX1NQSV9FbmFibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRW5hYmxlRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICBTRVRfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBUeAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0Rpc2FibGVETUFSZXFfVFgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfRGlzYWJsZURNQVJlcV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgQ0xFQVJfQklUKFNQSXgtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgVHggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYRE1BRU4gICAgICAgTExfU1BJX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfSXNFbmFibGVkRE1BUmVxX1RYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKChSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfVFhETUFFTikgPT0gKFNQSV9DUjJfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgcGFyaXR5IG9mICBMYXN0IERNQSByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9TZXRETUFQYXJpdHlfUlgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHBhcmFtICBQYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVOCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TUElfU2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MzJfdCBQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoU1BJeC0+Q1IyLCBTUElfQ1IyX0xETUFSWCwgKFBhcml0eSA8PCBTUElfQ1IyX0xETUFSWF9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgcGFyaXR5IGNvbmZpZ3VyYXRpb24gZm9yICBMYXN0IERNQSByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMRE1BUlggICAgICAgIExMX1NQSV9HZXRETUFQYXJpdHlfUlgKKyAgKiBAcGFyYW0gIFNQSXggU1BJIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TUElfR2V0RE1BUGFyaXR5X1JYKFNQSV9UeXBlRGVmICpTUEl4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVJYKSA+PiBTUElfQ1IyX0xETUFSWF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBwYXJpdHkgb2YgIExhc3QgRE1BIHRyYW5zbWlzc2lvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExETUFUWCAgICAgICAgTExfU1BJX1NldERNQVBhcml0eV9UWAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX09ERAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NQSV9ETUFfUEFSSVRZX0VWRU4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9TZXRETUFQYXJpdHlfVFgoU1BJX1R5cGVEZWYgKlNQSXgsIHVpbnQzMl90IFBhcml0eSkKK3sKKyAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsIFNQSV9DUjJfTERNQVRYLCAoUGFyaXR5IDw8IFNQSV9DUjJfTERNQVRYX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBwYXJpdHkgY29uZmlndXJhdGlvbiBmb3IgTGFzdCBETUEgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTERNQVRYICAgICAgICBMTF9TUElfR2V0RE1BUGFyaXR5X1RYCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9PREQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TUElfRE1BX1BBUklUWV9FVkVOCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1BJX0dldERNQVBhcml0eV9UWChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoU1BJeC0+Q1IyLCBTUElfQ1IyX0xETUFUWCkgPj4gU1BJX0NSMl9MRE1BVFhfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGRhdGEgcmVnaXN0ZXIgYWRkcmVzcyB1c2VkIGZvciBETUEgdHJhbnNmZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NQSV9ETUFfR2V0UmVnQWRkcihTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkgJiAoU1BJeC0+RFIpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9MTF9FRl9EQVRBX01hbmFnZW1lbnQgREFUQSBNYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIDgtQml0cyBpbiB0aGUgZGF0YSByZWdpc3RlcgorICAqIEBybXRvbGwgRFIgICAgICAgICAgIERSICAgICAgICAgICAgTExfU1BJX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJ4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1NQSV9SZWNlaXZlRGF0YTgoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9SRUcoU1BJeC0+RFIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9SZWNlaXZlRGF0YTE2CisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgUnhEYXRhIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDE2X3QgTExfU1BJX1JlY2VpdmVEYXRhMTYoU1BJX1R5cGVEZWYgKlNQSXgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfUkVHKFNQSXgtPkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgOC1CaXRzIGluIHRoZSBkYXRhIHJlZ2lzdGVyCisgICogQHJtdG9sbCBEUiAgICAgICAgICAgRFIgICAgICAgICAgICBMTF9TUElfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NQSV9UcmFuc21pdERhdGE4KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50OF90IFR4RGF0YSkKK3sKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgX19JTyB1aW50OF90ICpzcGlkciA9ICgoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgKigoX19JTyB1aW50OF90ICopJlNQSXgtPkRSKSA9IFR4RGF0YTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIDE2LUJpdHMgaW4gdGhlIGRhdGEgcmVnaXN0ZXIKKyAgKiBAcm10b2xsIERSICAgICAgICAgICBEUiAgICAgICAgICAgIExMX1NQSV9UcmFuc21pdERhdGExNgorICAqIEBwYXJhbSAgU1BJeCBTUEkgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFR4RGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1BJX1RyYW5zbWl0RGF0YTE2KFNQSV9UeXBlRGVmICpTUEl4LCB1aW50MTZfdCBUeERhdGEpCit7CisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisgIF9fSU8gdWludDE2X3QgKnNwaWRyID0gKChfX0lPIHVpbnQxNl90ICopJlNQSXgtPkRSKTsKKyAgKnNwaWRyID0gVHhEYXRhOworI2Vsc2UKKyAgU1BJeC0+RFIgPSBUeERhdGE7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX0VGX0luaXQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1NQSV9EZUluaXQoU1BJX1R5cGVEZWYgKlNQSXgpOworRXJyb3JTdGF0dXMgTExfU1BJX0luaXQoU1BJX1R5cGVEZWYgKlNQSXgsIExMX1NQSV9Jbml0VHlwZURlZiAqU1BJX0luaXRTdHJ1Y3QpOwordm9pZCAgICAgICAgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCk7CisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9TUElfSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyd2J4eF9sbF9zeXN0ZW0uaCBiL0luYy9zdG0zMndieHhfbGxfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyODQ5NgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfc3lzdGVtLmgKQEAgLTAsMCArMSwyMjA2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3N5c3RlbS5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBTWVNURU0gTEwgbW9kdWxlLgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgTEwgU1lTVEVNIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHVzZXI6CisgICAgICAoKykgU29tZSBvZiB0aGUgRkxBU0ggZmVhdHVyZXMgbmVlZCB0byBiZSBoYW5kbGVkIGluIHRoZSBTWVNURU0gZmlsZS4KKyAgICAgICgrKSBBY2Nlc3MgdG8gREJHQ01VIHJlZ2lzdGVycworICAgICAgKCspIEFjY2VzcyB0byBTWVNDRkcgcmVnaXN0ZXJzCisgICAgICAoKykgQWNjZXNzIHRvIFZSRUZCVUYgcmVnaXN0ZXJzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfU1lTVEVNX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX1NZU1RFTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRkxBU0gpIHx8IGRlZmluZWQgKFNZU0NGRykgfHwgZGVmaW5lZCAoREJHTUNVKSB8fCBkZWZpbmVkIChWUkVGQlVGKQorCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTCBTWVNURU0KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFNZU1RFTSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFNZU1RFTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19SRU1BUCBTWVNDRkcgUkVNQVAKKyogQHsKKyovCisjZGVmaW5lIExMX1NZU0NGR19SRU1BUF9GTEFTSCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1haW4gRmxhc2ggbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1JFTUFQX1NZU1RFTUZMQVNIICAgICAgICAgICAgIFNZU0NGR19NRU1STVBfTUVNX01PREVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU3lzdGVtIEZsYXNoIG1lbW9yeSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAqLworI2RlZmluZSBMTF9TWVNDRkdfUkVNQVBfU1JBTSAgICAgICAgICAgICAgICAgICAgKFNZU0NGR19NRU1STVBfTUVNX01PREVfMSB8IFNZU0NGR19NRU1STVBfTUVNX01PREVfMCkgLyohPCBTUkFNMSBtYXBwZWQgYXQgMHgwMDAwMDAwMCAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19SRU1BUF9RVUFEU1BJICAgICAgICAgICAgICAgICAoU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8yIHwgU1lTQ0ZHX01FTVJNUF9NRU1fTU9ERV8xKSAvKiE8IFFVQURTUEkgbWVtb3J5IG1hcHBlZCBhdCAweDAwMDAwMDAwICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0kyQ19GQVNUTU9ERVBMVVMgU1lTQ0ZHIEkyQyBGQVNUTU9ERVBMVVMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjZfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNiAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjdfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCNyAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjggICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjhfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOCAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkgICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQ19QQjlfRk1QIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIFBCOSAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzFfRk1QICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzEgcGlucyAqLworI2RlZmluZSBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMzICAgICAgICAgU1lTQ0ZHX0NGR1IxX0kyQzNfRk1QICAgIC8qITwgRW5hYmxlIEZhc3QgTW9kZSBQbHVzIG9uIEkyQzMgcGlucyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfRVhUSV9QT1JUIFNZU0NGRyBFWFRJIFBPUlQKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQSAgICAgICAgICAgICAgICAgICAgMFUgLyohPCBFWFRJIFBPUlQgQSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQiAgICAgICAgICAgICAgICAgICAgMVUgLyohPCBFWFRJIFBPUlQgQiAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUQyAgICAgICAgICAgICAgICAgICAgMlUgLyohPCBFWFRJIFBPUlQgQyAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURCAgICAgICAgICAgICAgICAgICAgM1UgLyohPCBFWFRJIFBPUlQgRCAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JURSAgICAgICAgICAgICAgICAgICAgNFUgLyohPCBFWFRJIFBPUlQgRSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9QT1JUSCAgICAgICAgICAgICAgICAgICAgN1UgLyohPCBFWFRJIFBPUlQgSCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfRVhUSV9MSU5FIFNZU0NGRyBFWFRJIExJTkUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMCAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgMFUpIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgMFUpIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMiAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgMFUpIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMFUpIC8qITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlswXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNCAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgMVUpIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgMVUpIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNiAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgMVUpIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FNyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMVUpIC8qITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlsxXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOCAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgMlUpIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FOSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgMlUpIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgMlUpIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTEgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgMlUpIC8qITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlsyXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTIgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMDBGVSA8PCAxNlUpIHwgM1UpIC8qITwgRVhUSV9QT1NJVElPTl8wICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTMgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwMEYwVSA8PCAxNlUpIHwgM1UpIC8qITwgRVhUSV9QT1NJVElPTl80ICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTQgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHgwRjAwVSA8PCAxNlUpIHwgM1UpIC8qITwgRVhUSV9QT1NJVElPTl84ICB8IEVYVElDUlszXSAqLworI2RlZmluZSBMTF9TWVNDRkdfRVhUSV9MSU5FMTUgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoMHhGMDAwVSA8PCAxNlUpIHwgM1UpIC8qITwgRVhUSV9QT1NJVElPTl8xMiB8IEVYVElDUlszXSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVElNQlJFQUsgU1lTQ0ZHIFRJTUVSIEJSRUFLCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX0VDQyAgICAgICAgICAgICAgICAgIFNZU0NGR19DRkdSMl9FQ0NMICAgICAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIEVDQyBlcnJvciBzaWduYWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvMTYvMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19QVkQgICAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfUFZETCAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBQVkQgY29ubmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggVElNMS8xNi8xNyBCcmVhayBJbnB1dCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbHNvIHRoZSBQVkRFIGFuZCBQTFMgYml0cyBvZiB0aGUgUG93ZXIgQ29udHJvbCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1RJTUJSRUFLX1NSQU0yX1BBUklUWSAgICAgICAgIFNZU0NGR19DRkdSMl9TUEwgICAgICAgIC8qITwgRW5hYmxlcyBhbmQgbG9ja3MgdGhlIFNSQU0yX1BBUklUWSBlcnJvciBzaWduYWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJyZWFrIElucHV0IG9mIFRJTTEvMTYvMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19USU1CUkVBS19MT0NLVVAgICAgICAgICAgICAgICBTWVNDRkdfQ0ZHUjJfQ0xMICAgICAgICAvKiE8IEVuYWJsZXMgYW5kIGxvY2tzIHRoZSBMT0NLVVAgb3V0cHV0IG9mIENvcnRleE00IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCcmVhayBJbnB1dCBvZiBUSU0xLzE2LzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfU1JBTTJXUlAgU1lTQ0ZHIFNSQU0yIFdSSVRFIFBST1RFQ1RJT04KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTAgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UwICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAwICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTEgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTMgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UzICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U0ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA0ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTUgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U1ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA1ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTYgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U2ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA2ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTcgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U3ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA3ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTggICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U4ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA4ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTkgICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0U5ICAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSA5ICAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTEwICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxMCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTExICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxMSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTEyICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxMiAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMiAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTEzICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxMyAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxMyAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE0ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxNCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE1ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxNSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE2ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxNiAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNiAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE3ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxNyAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxNyAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE4ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxOCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxOCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE5ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UxOSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAxOSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIwICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyMCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIxICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyMSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIyICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyMiAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMiAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIzICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyMyAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyMyAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI0ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyNCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI1ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyNSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI2ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyNiAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNiAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI3ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyNyAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyNyAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI4ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyOCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyOCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI5ICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UyOSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAyOSAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTMwICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UzMCAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzMCAqLworI2RlZmluZSBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTMxICAgICAgICAgICAgICAgU1lTQ0ZHX1NXUFIxX1BBR0UzMSAgICAgIC8qITwgU1JBTTJBIFdyaXRlIHByb3RlY3Rpb24gcGFnZSAzMSAqLworCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzIgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTMyICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMyICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzMgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTMzICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDMzICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzQgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM0ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM0ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzUgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM1ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM1ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzYgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM2ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM2ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzcgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM3ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM3ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzggICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM4ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM4ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzkgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTM5ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDM5ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDAgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQwICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQwICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDEgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQxICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQxICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDIgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQyICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQyICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDMgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQzICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQzICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDQgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ0ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ0ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDUgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ1ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ1ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDYgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ2ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ2ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDcgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ3ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ3ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDggICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ4ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ4ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDkgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTQ5ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDQ5ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTAgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTUwICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUwICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTEgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTUxICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUxICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTIgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTUyICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUyICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTMgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTUzICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDUzICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTQgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU0ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU0ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTUgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU1ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU1ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTYgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU2ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU2ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTcgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU3ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU3ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTggICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU4ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU4ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTkgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTU5ICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDU5ICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjAgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTYwICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYwICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjEgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTYxICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYxICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjIgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTYyICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYyICovCisjZGVmaW5lIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjMgICAgICAgICAgICAgICBTWVNDRkdfU1dQUjJfUEFHRTYzICAgICAgLyohPCBTUkFNMkIgV3JpdGUgcHJvdGVjdGlvbiBwYWdlIDYzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19JTSBTWVNDRkcgQ1BVMSBJTlRFUlJVUFQgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19HUlAxX1RJTTEgICAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMV9USU0xSU0gICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gVGltZXIgMSB0byBDUFUxICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9TWVNDRkdfR1JQMV9USU0xNiAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0lNUjFfVElNMTZJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIFRpbWVyIDE2IHRvIENQVTEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDFfVElNMTcgICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIxX1RJTTE3SU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBUaW1lciAxNyB0byBDUFUxICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDFfRVhUSTUgICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIxX0VYVEk1SU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSA1IHRvIENQVTEgICovCisjZGVmaW5lIExMX1NZU0NGR19HUlAxX0VYVEk2ICAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMV9FWFRJNklNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgNiB0byBDUFUxICAqLworI2RlZmluZSBMTF9TWVNDRkdfR1JQMV9FWFRJNyAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0lNUjFfRVhUSTdJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDcgdG8gQ1BVMSAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDFfRVhUSTggICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIxX0VYVEk4SU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSA4IHRvIENQVTEgICovCisjZGVmaW5lIExMX1NZU0NGR19HUlAxX0VYVEk5ICAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMV9FWFRJOUlNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgOSB0byBDUFUxICAqLworI2RlZmluZSBMTF9TWVNDRkdfR1JQMV9FWFRJMTAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0lNUjFfRVhUSTEwSU0gICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDEwIHRvIENQVTEgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDFfRVhUSTExICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIxX0VYVEkxMUlNICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAxMSB0byBDUFUxICovCisjZGVmaW5lIExMX1NZU0NGR19HUlAxX0VYVEkxMiAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMV9FWFRJMTJJTSAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMTIgdG8gQ1BVMSAqLworI2RlZmluZSBMTF9TWVNDRkdfR1JQMV9FWFRJMTMgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0lNUjFfRVhUSTEzSU0gICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDEzIHRvIENQVTEgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDFfRVhUSTE0ICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIxX0VYVEkxNElNICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAxNCB0byBDUFUxICovCisjZGVmaW5lIExMX1NZU0NGR19HUlAxX0VYVEkxNSAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMV9FWFRJMTVJTSAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMTUgdG8gQ1BVMSAqLworCisjZGVmaW5lIExMX1NZU0NGR19HUlAyX1BWTTEgICAgICAgICAgICAgICAgICAgICBTWVNDRkdfSU1SMl9QVk0xSU0gICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDEgdG8gQ1BVMSAqLworI2RlZmluZSBMTF9TWVNDRkdfR1JQMl9QVk0zICAgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0lNUjJfUFZNM0lNICAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAzIHRvIENQVTEgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX0dSUDJfUFZEICAgICAgICAgICAgICAgICAgICAgIFNZU0NGR19JTVIyX1BWRElNICAgICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBQb3dlciBWb2x0YWdlIERldGVjdG9yIHRvIENQVTEgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19DMl9JTSBTWVNDRkcgQ1BVMiBJTlRFUlJVUFQgTUFTSworICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX1JUQ1NUQU1QX1JUQ1RBTVBfTFNFQ1NTICBTWVNDRkdfQzJJTVIxX1JUQ1NUQU1QVEFNUExTRUNTU0lNIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gUlRDIFRpbWVTdGFtcCwgUlRDIFRhbXBlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gdG8gQ1BVMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfUlRDV0tVUCAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfUlRDV0tVUElNICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIFJUQyBXYWtldXAgdG8gQ1BVMiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX1JUQ0FMQVJNICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX1JUQ0FMQVJNSU0gLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBSVEMgQWxhcm1zIHRvIENQVTIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9SQ0MgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9SQ0NJTSAgICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gUkNDIHRvIENQVTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRkxBU0ggICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRkxBU0hJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEZMQVNIIHRvIENQVTIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX1BLQSAgICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX1BLQUlNICAgICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBQdWJsaWMgS2V5IEFjY2VsZXJhdG9yIHRvIENQVTIgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9STkcgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9STkdJTSAgICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgdG8gQ1BVMiAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfQUVTMSAgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfQUVTMUlNICAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgMSB0byBDUFUyICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0NPTVAgICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0NPTVBJTSAgICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBDb21wYXJhdG9yIHRvIENQVTIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9BREMgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9BRENJTSAgICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gQW5hbG9nIERpZ2l0YWwgQ29udmVydGVyIHRvIENQVTIgICAgICAgKi8KKworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMCAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJMElNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMCB0byBDUFUyICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRVhUSTFJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDEgdG8gQ1BVMiAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0VYVEkyICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0VYVEkySU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAyIHRvIENQVTIgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMyAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJM0lNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMyB0byBDUFUyICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTQgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRVhUSTRJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDQgdG8gQ1BVMiAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0VYVEk1ICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0VYVEk1SU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSA1IHRvIENQVTIgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJNiAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJNklNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgNiB0byBDUFUyICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTcgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRVhUSTdJTSAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDcgdG8gQ1BVMiAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0VYVEk4ICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0VYVEk4SU0gICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSA4IHRvIENQVTIgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJOSAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJOUlNICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgOSB0byBDUFUyICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEwICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRVhUSTEwSU0gICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDEwIHRvIENQVTIgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxMSAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0VYVEkxMUlNICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAxMSB0byBDUFUyICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTIgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJMTJJTSAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMTIgdG8gQ1BVMiAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEzICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjFfRVhUSTEzSU0gICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIEV4dGVybmFsIEludGVycnVwdCBMaW5lIDEzIHRvIENQVTIgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxNCAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIxX0VYVEkxNElNICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBFeHRlcm5hbCBJbnRlcnJ1cHQgTGluZSAxNCB0byBDUFUyICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTUgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMV9FWFRJMTVJTSAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRXh0ZXJuYWwgSW50ZXJydXB0IExpbmUgMTUgdG8gQ1BVMiAgICAgKi8KKworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0gxICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUExQ0gxSU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMSBDaGFubmVsIDEgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNIMiAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfRE1BMUNIMklNICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIERNQTEgQ2hhbm5lbCAyIHRvIENQVTIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDMgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX0RNQTFDSDNJTSAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBETUExIENoYW5uZWwgMyB0byBDUFUyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g0ICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUExQ0g0SU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMSBDaGFubmVsIDQgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNINSAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfRE1BMUNINUlNICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIERNQTEgQ2hhbm5lbCA1IHRvIENQVTIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDYgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX0RNQTFDSDZJTSAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBETUExIENoYW5uZWwgNiB0byBDUFUyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g3ICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUExQ0g3SU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMSBDaGFubmVsIDcgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0gxICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUEyQ0gxSU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMiBDaGFubmVsIDEgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNIMiAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfRE1BMkNIMklNICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIERNQTIgQ2hhbm5lbCAyIHRvIENQVTIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDMgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX0RNQTJDSDNJTSAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBETUEyIENoYW5uZWwgMyB0byBDUFUyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g0ICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUEyQ0g0SU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMiBDaGFubmVsIDQgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNINSAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfRE1BMkNINUlNICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIERNQTIgQ2hhbm5lbCA1IHRvIENQVTIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDYgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX0RNQTJDSDZJTSAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBETUEyIENoYW5uZWwgNiB0byBDUFUyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g3ICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUEyQ0g3SU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BMiBDaGFubmVsIDcgdG8gQ1BVMiAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9ETUFNVVgxICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9ETUFNVVgxSU0gIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gRE1BTVVYMSB0byBDUFUyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfUFZNMSAgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfUFZNMUlNICAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAxIHRvIENQVTIgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX1BWTTMgICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX1BWTTNJTSAgICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMyB0byBDUFUyICAgICAqLworI2RlZmluZSBMTF9DMl9TWVNDRkdfR1JQMl9QVkQgICAgICAgICAgICAgICAgICAgU1lTQ0ZHX0MySU1SMl9QVkRJTSAgICAgIC8qITwgRW5hYmxpbmcgb2YgaW50ZXJydXB0IGZyb20gUG93ZXIgVm9sdGFnZSBEZXRlY3RvciB0byBDUFUyICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfU1lTQ0ZHX0dSUDJfVFNDICAgICAgICAgICAgICAgICAgIFNZU0NGR19DMklNUjJfVFNDSU0gICAgICAvKiE8IEVuYWJsaW5nIG9mIGludGVycnVwdCBmcm9tIFRvdWNoIFNlbnNpbmcgQ29udHJvbGxlciB0byBDUFUyICAgICAgICovCisjZGVmaW5lIExMX0MyX1NZU0NGR19HUlAyX0xDRCAgICAgICAgICAgICAgICAgICBTWVNDRkdfQzJJTVIyX0xDRElNICAgICAgLyohPCBFbmFibGluZyBvZiBpbnRlcnJ1cHQgZnJvbSBMaXF1aWQgQ3J5c3RhbCBEaXNwbGF5IHRvIENQVTIgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfU0VDVVJFX0lQX0FDQ0VTUyBTWVNDRkcgU0VDVVJFIElQIEFDQ0VTUworICAqIEB7CisgICovCisjZGVmaW5lIExMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzEgICAgICAgICAgICBTWVNDRkdfU0lQQ1JfU0FFUzEgICAgICAgLyohPCBFbmFibGluZyB0aGUgc2VjdXJpdHkgYWNjZXNzIG9mIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgMSBLRVlbNzowXSAqLworI2RlZmluZSBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMyICAgICAgICAgICAgU1lTQ0ZHX1NJUENSX1NBRVMyICAgICAgIC8qITwgRW5hYmxpbmcgdGhlIHNlY3VyaXR5IGFjY2VzcyBvZiBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIDIgICAgICAgICAgKi8KKyNkZWZpbmUgTExfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfUEtBICAgICAgICAgICAgIFNZU0NGR19TSVBDUl9TUEtBICAgICAgICAvKiE8IEVuYWJsaW5nIHRoZSBzZWN1cml0eSBhY2Nlc3Mgb2YgUHVibGljIEtleSBBY2NlbGVyYXRvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1JORyAgICAgICAgICAgICBTWVNDRkdfU0lQQ1JfU1JORyAgICAgICAgLyohPCBFbmFibGluZyB0aGUgc2VjdXJpdHkgYWNjZXNzIG9mIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfQVBCMV9HUlAxX1NUT1BfSVAgREJHTUNVIENQVTEgQVBCMSBHUlAxIFNUT1AgSVAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUCAgICAgIERCR01DVV9BUEIxRlpSMV9EQkdfVElNMl9TVE9QICAgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0yIGlzIHN0b3BwZWQgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AgICAgICAgREJHTUNVX0FQQjFGWlIxX0RCR19SVENfU1RPUCAgICAvKiE8IFRoZSBjbG9jayBvZiB0aGUgUlRDIGNvdW50ZXIgaXMgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1AgICAgICBEQkdNQ1VfQVBCMUZaUjFfREJHX1dXREdfU1RPUCAgIC8qITwgVGhlIHdpbmRvdyB3YXRjaGRvZyBjb3VudGVyIGNsb2NrIGlzIHN0b3BwZWQgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQgICAgICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUCAgICAgIERCR01DVV9BUEIxRlpSMV9EQkdfSVdER19TVE9QICAgLyohPCBUaGUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBjbG9jayBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QICAgICAgREJHTUNVX0FQQjFGWlIxX0RCR19JMkMxX1NUT1AgICAvKiE8IFRoZSBJMkMxIFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AgICAgICBEQkdNQ1VfQVBCMUZaUjFfREJHX0kyQzNfU1RPUCAgIC8qITwgVGhlIEkyQzMgU01CdXMgdGltZW91dCBpcyBmcm96ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QICAgIERCR01DVV9BUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBMUFRJTTEgaXMgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19DMl9BUEIxX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQ1BVMiBBUEIxIEdSUDEgU1RPUCBJUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QICAgREJHTUNVX0MyQVBCMUZaUjFfREJHX1RJTTJfU1RPUCAgIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMiBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QICAgIERCR01DVV9DMkFQQjFGWlIxX0RCR19SVENfU1RPUCAgICAvKiE8IFRoZSBjbG9jayBvZiB0aGUgUlRDIGNvdW50ZXIgaXMgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AgICBEQkdNQ1VfQzJBUEIxRlpSMV9EQkdfSVdER19TVE9QICAgLyohPCBUaGUgaW5kZXBlbmRlbnQgd2F0Y2hkb2cgY291bnRlciBjbG9jayBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICovCisjZGVmaW5lIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QICAgREJHTUNVX0MyQVBCMUZaUjFfREJHX0kyQzFfU1RPUCAgIC8qITwgVGhlIEkyQzEgU01CdXMgdGltZW91dCBpcyBmcm96ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0kyQzNfU1RPUCAgIERCR01DVV9DMkFQQjFGWlIxX0RCR19JMkMzX1NUT1AgICAvKiE8IFRoZSBJMkMzIFNNQnVzIHRpbWVvdXQgaXMgZnJvemVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUCBEQkdNQ1VfQzJBUEIxRlpSMV9EQkdfTFBUSU0xX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBMUFRJTTEgaXMgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIxX0dSUDJfU1RPUF9JUCBEQkdNQ1UgQ1BVMSBBUEIxIEdSUDIgU1RPUCBJUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIxX0dSUDJfTFBUSU0yX1NUT1AgICAgREJHTUNVX0FQQjFGWlIyX0RCR19MUFRJTTJfU1RPUCAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIExQVElNMiBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VDX0MyX0FQQjFfR1JQMl9TVE9QX0lQIERCR01DVSBDUFUyIEFQQjEgR1JQMiBTVE9QIElQCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9MUFRJTTJfU1RPUCBEQkdNQ1VfQzJBUEIxRlpSMl9EQkdfTFBUSU0yX1NUT1AgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBMUFRJTTIgaXMgc3RvcHBlZCB3aGVuIHRoZSBjb3JlIGlzIGhhbHRlZCAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19BUEIyX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQ1BVMSBBUEIyIEdSUDEgU1RPUCBJUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QICAgICAgREJHTUNVX0FQQjJGWlJfREJHX1RJTTFfU1RPUCAgIC8qITwgVGhlIGNvdW50ZXIgY2xvY2sgb2YgVElNMSBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9EQkdNQ1VfQVBCMl9HUlAxX1RJTTE2X1NUT1AgICAgIERCR01DVV9BUEIyRlpSX0RCR19USU0xNl9TVE9QICAvKiE8IFRoZSBjb3VudGVyIGNsb2NrIG9mIFRJTTE2IGlzIHN0b3BwZWQgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QICAgICBEQkdNQ1VfQVBCMkZaUl9EQkdfVElNMTdfU1RPUCAgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xNyBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FQ19DMl9BUEIyX0dSUDFfU1RPUF9JUCBEQkdNQ1UgQ1BVMiBBUEIyIEdSUDEgU1RPUCBJUAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QICAgREJHTUNVX0MyQVBCMkZaUl9EQkdfVElNMV9TVE9QICAgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xIGlzIHN0b3BwZWQgd2hlbiB0aGUgY29yZSBpcyBoYWx0ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUCAgREJHTUNVX0MyQVBCMkZaUl9EQkdfVElNMTZfU1RPUCAgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xNiBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUCAgREJHTUNVX0MyQVBCMkZaUl9EQkdfVElNMTdfU1RPUCAgLyohPCBUaGUgY291bnRlciBjbG9jayBvZiBUSU0xNyBpcyBzdG9wcGVkIHdoZW4gdGhlIGNvcmUgaXMgaGFsdGVkICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChWUkVGQlVGKQorLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfVk9MVEFHRSBWUkVGQlVGIFZPTFRBR0UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlIDAgKFZSRUZfT1VUMSkgKi8KKyNkZWZpbmUgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMSAgICAgICAgICBWUkVGQlVGX0NTUl9WUlMgLyohPCBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZSAxIChWUkVGX09VVDIpICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFZSRUZCVUYgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUNfTEFURU5DWSBGTEFTSCBMQVRFTkNZCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8wICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8wV1MgICAvKiE8IEZMQVNIIFplcm8gd2FpdCBzdGF0ZSAgICovCisjZGVmaW5lIExMX0ZMQVNIX0xBVEVOQ1lfMSAgICAgICAgICAgICAgICAgRkxBU0hfQUNSX0xBVEVOQ1lfMVdTICAgLyohPCBGTEFTSCBPbmUgd2FpdCBzdGF0ZSAgICAqLworI2RlZmluZSBMTF9GTEFTSF9MQVRFTkNZXzIgICAgICAgICAgICAgICAgIEZMQVNIX0FDUl9MQVRFTkNZXzJXUyAgIC8qITwgRkxBU0ggVHdvIHdhaXQgc3RhdGVzICAgKi8KKyNkZWZpbmUgTExfRkxBU0hfTEFURU5DWV8zICAgICAgICAgICAgICAgICBGTEFTSF9BQ1JfTEFURU5DWV8zV1MgICAvKiE8IEZMQVNIIFRocmVlIHdhaXQgc3RhdGVzICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgU1lTVEVNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX1NZU0NGRyBTWVNDRkcKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBtZW1vcnkgbWFwcGluZyBhdCBhZGRyZXNzIDB4MDAwMDAwMDAKKyAgKiBAcm10b2xsIFNZU0NGR19NRU1STVAgTUVNX01PREUgICAgICBMTF9TWVNDRkdfU2V0UmVtYXBNZW1vcnkKKyAgKiBAcGFyYW0gIE1lbW9yeSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TWVNURU1GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9TUkFNCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1JFTUFQX1FVQURTUEkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19TZXRSZW1hcE1lbW9yeSh1aW50MzJfdCBNZW1vcnkpCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5NRU1STVAsIFNZU0NGR19NRU1STVBfTUVNX01PREUsIE1lbW9yeSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IG1lbW9yeSBtYXBwaW5nIGF0IGFkZHJlc3MgMHgwMDAwMDAwMAorICAqIEBybXRvbGwgU1lTQ0ZHX01FTVJNUCBNRU1fTU9ERSAgICAgIExMX1NZU0NGR19HZXRSZW1hcE1lbW9yeQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1lTVEVNRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfUkVNQVBfU1JBTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19SRU1BUF9RVUFEU1BJCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldFJlbWFwTWVtb3J5KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+TUVNUk1QLCBTWVNDRkdfTUVNUk1QX01FTV9NT0RFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3Rlci4KKyAgKiBAbm90ZSAgIFdoZW4gdm9sdGFnZSBib29zdGVyIGlzIGVuYWJsZWQsIEkvTyBhbmFsb2cgc3dpdGNoZXMgYXJlIHN1cHBsaWVkCisgICogICAgICAgICBieSBhIGRlZGljYXRlZCB2b2x0YWdlIGJvb3N0ZXIsIGZyb20gVkREIHBvd2VyIGRvbWFpbi4gVGhpcyBpcworICAqICAgICAgICAgdGhlIHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCBsb3cgVkREQSB2b2x0YWdlIG9wZXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgaXMgcmVsZXZhbnQgZm9yIHBlcmlwaGVyYWxzCisgICogICAgICAgICB1c2luZyBJL08gaW4gYW5hbG9nIGlucHV0OiBBREMgYW5kIENPTVAuCisgICogICAgICAgICBIb3dldmVyLCBDT01QIGlucHV0cyBoYXZlIGEgaGlnaCBpbXBlZGFuY2UgYW5kCisgICogICAgICAgICB2b2x0YWdlIGJvb3N0ZXIgZG8gbm90IGltcGFjdCBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5LgorICAqICAgICAgICAgVGhlcmVmb3JlLCB0aGUgdm9sdGFnZSBib29zdGVyIGlzIG1haW5seSBpbnRlbmRlZCBmb3IKKyAgKiAgICAgICAgIHVzYWdlIHdpdGggQURDLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEJPT1NURU4gICAgICAgTExfU1lTQ0ZHX0VuYWJsZUFuYWxvZ0Jvb3N0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVBbmFsb2dCb29zdGVyKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyLgorICAqIEBub3RlICAgV2hlbiB2b2x0YWdlIGJvb3N0ZXIgaXMgZW5hYmxlZCwgSS9PIGFuYWxvZyBzd2l0Y2hlcyBhcmUgc3VwcGxpZWQKKyAgKiAgICAgICAgIGJ5IGEgZGVkaWNhdGVkIHZvbHRhZ2UgYm9vc3RlciwgZnJvbSBWREQgcG93ZXIgZG9tYWluLiBUaGlzIGlzCisgICogICAgICAgICB0aGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiB3aXRoIGxvdyBWRERBIHZvbHRhZ2Ugb3BlcmF0aW9uLgorICAqIEBub3RlICAgVGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlciBpcyByZWxldmFudCBmb3IgcGVyaXBoZXJhbHMKKyAgKiAgICAgICAgIHVzaW5nIEkvTyBpbiBhbmFsb2cgaW5wdXQ6IEFEQyBhbmQgQ09NUC4KKyAgKiAgICAgICAgIEhvd2V2ZXIsIENPTVAgaW5wdXRzIGhhdmUgYSBoaWdoIGltcGVkYW5jZSBhbmQKKyAgKiAgICAgICAgIHZvbHRhZ2UgYm9vc3RlciBkbyBub3QgaW1wYWN0IHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCisgICogICAgICAgICBUaGVyZWZvcmUsIHRoZSB2b2x0YWdlIGJvb3N0ZXIgaXMgbWFpbmx5IGludGVuZGVkIGZvcgorICAqICAgICAgICAgdXNhZ2Ugd2l0aCBBREMuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgQk9PU1RFTiAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUFuYWxvZ0Jvb3N0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nQm9vc3Rlcih2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0JPT1NURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQW5hbG9nIEdQSU8gc3dpdGNoIHRvIGNvbnRyb2wgdm9sdGFnZSBzZWxlY3Rpb24KKyAgKiAgICAgICAgIHdoZW4gdGhlIHN1cHBseSB2b2x0YWdlIGlzIHN1cHBsaWVkIGJ5IFZEREEKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSAgIEFOQVNXVkREICAgTExfU1lTQ0ZHX0VuYWJsZUFuYWxvZ0dwaW9Td2l0Y2gKKyAgKiBAbm90ZSAgIEFjdGl2YXRpbmcgdGhlIGdwaW8gc3dpdGNoIGVuYWJsZSBJT3MgYW5hbG9nIHN3aXRjaGVzIHN1cHBsaWVkIGJ5IFZEREEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVBbmFsb2dHcGlvU3dpdGNoKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0FOQVNXVkREKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBBbmFsb2cgR1BJTyBzd2l0Y2ggdG8gY29udHJvbCB2b2x0YWdlIHNlbGVjdGlvbgorICAqICAgICAgICAgd2hlbiB0aGUgc3VwcGx5IHZvbHRhZ2UgaXMgc3VwcGxpZWQgYnkgVkREQQorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxICAgQU5BU1dWREQgICBMTF9TWVNDRkdfRGlzYWJsZUFuYWxvZ0dwaW9Td2l0Y2gKKyAgKiBAbm90ZSAgIEFjdGl2YXRpbmcgdGhlIGdwaW8gc3dpdGNoIGVuYWJsZSBJT3MgYW5hbG9nIHN3aXRjaGVzIHN1cHBsaWVkIGJ5IFZEREEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nR3Bpb1N3aXRjaCh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0FOQVNXVkREKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgSTJDX1BCeF9GTVAgICBMTF9TWVNDRkdfRW5hYmxlRmFzdE1vZGVQbHVzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBJMkN4X0ZNUCAgICAgIExMX1NZU0NGR19FbmFibGVGYXN0TW9kZVBsdXMKKyAgKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUZhc3RNb2RlUGx1cyh1aW50MzJfdCBDb25maWdGYXN0TW9kZVBsdXMpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBJMkMgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5LgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEkyQ19QQnhfRk1QICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIEkyQ3hfRk1QICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXMKKyAgKiBAcGFyYW0gIENvbmZpZ0Zhc3RNb2RlUGx1cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19QQjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfSTJDX0ZBU1RNT0RFUExVU19JMkMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0kyQ19GQVNUTU9ERVBMVVNfSTJDMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbnZhbGlkIG9wZXJhdGlvbiBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMCAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSU9DCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0lPQyh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzEgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX0RaQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9EWkModm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IFVuZGVyZmxvdyBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMiAgICAgIExMX1NZU0NGR19FbmFibGVJVF9GUFVfVUZDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX1VGQyh2b2lkKQoreworICBTRVRfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgT3ZlcmZsb3cgSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzMgICAgICBMTF9TWVNDRkdfRW5hYmxlSVRfRlBVX09GQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9PRkModm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV80ICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JREMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSURDKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBJbmV4YWN0IEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV81ICAgICAgTExfU1lTQ0ZHX0VuYWJsZUlUX0ZQVV9JWEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVJVF9GUFVfSVhDKHZvaWQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgSW52YWxpZCBvcGVyYXRpb24gSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzAgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JT0MKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0lPQyh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzEgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9EWkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0RaQyh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8xKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZsb2F0aW5nIFBvaW50IFVuaXQgVW5kZXJmbG93IEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8yICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfVUZDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9VRkModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IE92ZXJmbG93IEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8zICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfT0ZDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9PRkModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV80ICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVJVF9GUFVfSURDCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JREModm9pZCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbG9hdGluZyBQb2ludCBVbml0IEluZXhhY3QgSW50ZXJydXB0CisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzUgICAgICBMTF9TWVNDRkdfRGlzYWJsZUlUX0ZQVV9JWEMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlSVRfRlBVX0lYQyh2b2lkKQoreworICBDTEVBUl9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV81KTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IEludmFsaWQgb3BlcmF0aW9uIEludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfMCAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfSU9DCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JT0Modm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSA9PSAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV8wKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgRGl2aWRlLWJ5LXplcm8gSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8xICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9EWkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0RaQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpID09IChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzEpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBVbmRlcmZsb3cgSW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IxIEZQVV9JRV8yICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9VRkMKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX1VGQyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPkNGR1IxLCBTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpID09IChTWVNDRkdfQ0ZHUjFfRlBVX0lFXzIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRmxvYXRpbmcgUG9pbnQgVW5pdCBPdmVyZmxvdyBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzMgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX09GQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfT0ZDKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfMykgPT0gKFNZU0NGR19DRkdSMV9GUFVfSUVfMykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBGbG9hdGluZyBQb2ludCBVbml0IElucHV0IGRlbm9ybWFsIEludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMSBGUFVfSUVfNCAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfSURDCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0lzRW5hYmxlZElUX0ZQVV9JREModm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMSwgU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KSA9PSAoU1lTQ0ZHX0NGR1IxX0ZQVV9JRV80KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEZsb2F0aW5nIFBvaW50IFVuaXQgSW5leGFjdCBJbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjEgRlBVX0lFXzUgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkSVRfRlBVX0lYQworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRJVF9GUFVfSVhDKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjEsIFNZU0NGR19DRkdSMV9GUFVfSUVfNSkgPT0gKFNZU0NGR19DRkdSMV9GUFVfSUVfNSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgc291cmNlIGlucHV0IGZvciB0aGUgRVhUSSBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBTWVNDRkdfRVhUSUNSMSBFWFRJeCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IyIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjMgRVhUSXggICAgICAgICBMTF9TWVNDRkdfU2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSNCBFWFRJeCAgICAgICAgIExMX1NZU0NGR19TZXRFWFRJU291cmNlCisgICogQHBhcmFtICBQb3J0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRDCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRICisgICoKKyAgKiBAcGFyYW0gIExpbmUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUxNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX1NldEVYVElTb3VyY2UodWludDMyX3QgUG9ydCwgdWludDMyX3QgTGluZSkKK3sKKyAgTU9ESUZZX1JFRyhTWVNDRkctPkVYVElDUltMaW5lICYgMHgwM1VdLCAoTGluZSA+PiAxNlUpLCAoUG9ydCA8PCAoKFBPU0lUSU9OX1ZBTCgoTGluZSA+PiAxNlUpKSkgJiAweDAwMDAwMDBGVUwpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjb25maWd1cmVkIGRlZmluZWQgZm9yIHNwZWNpZmljIEVYVEkgTGluZQorICAqIEBybXRvbGwgU1lTQ0ZHX0VYVElDUjEgRVhUSXggICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZVxuCisgICogICAgICAgICBTWVNDRkdfRVhUSUNSMiBFWFRJeCAgICAgICAgIExMX1NZU0NGR19HZXRFWFRJU291cmNlXG4KKyAgKiAgICAgICAgIFNZU0NGR19FWFRJQ1IzIEVYVEl4ICAgICAgICAgTExfU1lTQ0ZHX0dldEVYVElTb3VyY2VcbgorICAqICAgICAgICAgU1lTQ0ZHX0VYVElDUjQgRVhUSXggICAgICAgICBMTF9TWVNDRkdfR2V0RVhUSVNvdXJjZQorICAqIEBwYXJhbSAgTGluZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkUzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9MSU5FOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX0xJTkU5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfTElORTE1CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19FWFRJX1BPUlRECisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0VYVElfUE9SVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfRVhUSV9QT1JUSAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HZXRFWFRJU291cmNlKHVpbnQzMl90IExpbmUpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+RVhUSUNSW0xpbmUgJiAweDAzVV0sIChMaW5lID4+IDE2VSkpID4+IChQT1NJVElPTl9WQUwoTGluZSA+PiAxNlUpICYgMHgwMDAwMDAwRlVMKSApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTUkFNMiBFcmFzZSAoc3RhcnRzIGEgaGFyZHdhcmUgU1JBTTIgZXJhc2Ugb3BlcmF0aW9uLiBUaGlzIGJpdCBpcworICAqIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBTUkFNMiBlcmFzZSBvcGVyYXRpb24uKQorICAqIEBub3RlIFRoaXMgYml0IGlzIHdyaXRlLXByb3RlY3RlZDogc2V0dGluZyB0aGlzIGJpdCBpcyBwb3NzaWJsZSBvbmx5IGFmdGVyIHRoZQorICAqICAgICAgIGNvcnJlY3Qga2V5IHNlcXVlbmNlIGlzIHdyaXR0ZW4gaW4gdGhlIFNZU0NGR19TS1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBTWVNDRkdfU0NTUiAgU1JBTTJFUiAgICAgICBMTF9TWVNDRkdfRW5hYmxlU1JBTTJFcmFzZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZVNSQU0yRXJhc2Uodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX1NSQU0yRVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNSQU0yIGVyYXNlIG9wZXJhdGlvbiBpcyBvbiBnb2luZworICAqIEBybXRvbGwgU1lTQ0ZHX1NDU1IgIFNSQU0yQlNZICAgICAgTExfU1lTQ0ZHX0lzU1JBTTJFcmFzZU9uZ29pbmcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNTUkFNMkVyYXNlT25nb2luZyh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX1NSQU0yQlNZKSA9PSAoU1lTQ0ZHX1NDU1JfU1JBTTJCU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDUFUyIFNSQU0gZmV0Y2ggKGV4ZWN1dGlvbikgKFRoaXMgYml0IGNhbiBiZSBzZXQgYnkgRmlybXdhcmUKKyAgKiAgICAgICAgIGFuZCB3aWxsIG9ubHkgYmUgcmVzZXQgYnkgYSBIYXJkd2FyZSByZXNldCwgaW5jbHVkaW5nIGEgcmVzZXQgYWZ0ZXIgU3RhbmRieS4pCisgICogQG5vdGUgRmlybXdhcmUgd3JpdGluZyAwIGhhcyBubyBlZmZlY3QuCisgICogQHJtdG9sbCBTWVNDRkdfU0NTUiAgQzJSRkQgICAgICAgICBMTF9TWVNDRkdfRGlzYWJsZVNSQU1GZXRjaAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0Rpc2FibGVTUkFNRmV0Y2godm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPlNDU1IsIFNZU0NGR19TQ1NSX0MyUkZEKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDUFUyIFNSQU0gZmV0Y2ggaXMgZW5hYmxlZAorICAqIEBybXRvbGwgU1lTQ0ZHX1NDU1IgIEMyUkZEICAgICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZFNSQU1GZXRjaAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0VuYWJsZWRTUkFNRmV0Y2godm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5TQ1NSLCBTWVNDRkdfU0NTUl9DMlJGRCkgIT0gKFNZU0NGR19TQ1NSX0MyUkZEKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb25uZWN0aW9ucyB0byBUSU0xLzE2LzE3IEJyZWFrIGlucHV0cworICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIENMTCAgICAgICAgICAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBTUEwgICAgICAgICAgIExMX1NZU0NGR19TZXRUSU1CcmVha0lucHV0c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgUFZETCAgICAgICAgICBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIEVDQ0wgICAgICAgICAgTExfU1lTQ0ZHX1NldFRJTUJyZWFrSW5wdXRzCisgICogQHBhcmFtICBCcmVhayBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfRUNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1BWRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19TUkFNMl9QQVJJVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfU2V0VElNQnJlYWtJbnB1dHModWludDMyX3QgQnJlYWspCit7CisgIE1PRElGWV9SRUcoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX0NMTCB8IFNZU0NGR19DRkdSMl9TUEwgfCBTWVNDRkdfQ0ZHUjJfUFZETCB8IFNZU0NGR19DRkdSMl9FQ0NMLCBCcmVhayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbm5lY3Rpb25zIHRvIFRJTTEvMTYvMTcgQnJlYWsgaW5wdXRzCisgICogQHJtdG9sbCBTWVNDRkdfQ0ZHUjIgQ0xMICAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHNcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IyIFNQTCAgICAgICAgICAgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMiBQVkRMICAgICAgICAgIExMX1NZU0NGR19HZXRUSU1CcmVha0lucHV0c1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjIgRUNDTCAgICAgICAgICBMTF9TWVNDRkdfR2V0VElNQnJlYWtJbnB1dHMKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfRUNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1RJTUJSRUFLX1BWRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19USU1CUkVBS19TUkFNMl9QQVJJVFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfVElNQlJFQUtfTE9DS1VQCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfU1lTQ0ZHX0dldFRJTUJyZWFrSW5wdXRzKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFNZU0NGRy0+Q0ZHUjIsIFNZU0NGR19DRkdSMl9DTEwgfCBTWVNDRkdfQ0ZHUjJfU1BMIHwgU1lTQ0ZHX0NGR1IyX1BWREwgfCBTWVNDRkdfQ0ZHUjJfRUNDTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNSQU0yIHBhcml0eSBlcnJvciBkZXRlY3RlZAorICAqIEBybXRvbGwgU1lTQ0ZHX0NGR1IyIFNQRiAgICAgICAgICAgTExfU1lTQ0ZHX0lzQWN0aXZlRmxhZ19TUAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19Jc0FjdGl2ZUZsYWdfU1Aodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DRkdSMiwgU1lTQ0ZHX0NGR1IyX1NQRikgPT0gKFNZU0NGR19DRkdSMl9TUEYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU1JBTTIgcGFyaXR5IGVycm9yIGZsYWcKKyAgKiBAcm10b2xsIFNZU0NGR19DRkdSMiBTUEYgICAgICAgICAgIExMX1NZU0NGR19DbGVhckZsYWdfU1AKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19DbGVhckZsYWdfU1Aodm9pZCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPkNGR1IyLCBTWVNDRkdfQ0ZHUjJfU1BGKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1JBTTIgcGFnZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBQYWdlcyBpbiByYW5nZSAwIHRvIDMxCisgICogQG5vdGUgV3JpdGUgcHJvdGVjdGlvbiBpcyBjbGVhcmVkIG9ubHkgYnkgYSBzeXN0ZW0gcmVzZXQKKyAgKiBAcm10b2xsIFNZU0NGR19TV1BSMSBQeFdQICAgICAgICAgIExMX1NZU0NGR19FbmFibGVTUkFNMlBhZ2VXUlBfMF8zMQorICAqIEBwYXJhbSAgU1JBTTJXUlAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTE4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UxOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTIxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTI3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMjkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTMwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzMQorICAqIEByZXR2YWwgTm9uZQorICAqLworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9TWVNDRkdfRW5hYmxlU1JBTTJQYWdlV1JQICAgIExMX1NZU0NGR19FbmFibGVTUkFNMlBhZ2VXUlBfMF8zMQorX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZVNSQU0yUGFnZVdSUF8wXzMxKHVpbnQzMl90IFNSQU0yV1JQKQoreworICBTRVRfQklUKFNZU0NGRy0+U1dQUjEsIFNSQU0yV1JQKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1JBTTIgcGFnZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBQYWdlcyBpbiByYW5nZSAzMiB0byA2MworICAqIEBub3RlIFdyaXRlIHByb3RlY3Rpb24gaXMgY2xlYXJlZCBvbmx5IGJ5IGEgc3lzdGVtIHJlc2V0CisgICogQHJtdG9sbCBTWVNDRkdfU1dQUjIgUHhXUCAgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlU1JBTTJQYWdlV1JQXzMyXzYzCisgICogQHBhcmFtICBTUkFNMldSUCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTM1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFMzcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTM4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0UzOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQxCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0MgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQ0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0NQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTQ3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U0OAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNDkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1MQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTUzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTU2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U1NworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTU5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2MAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TUkFNMldSUF9QQUdFNjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU1JBTTJXUlBfUEFHRTYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NSQU0yV1JQX1BBR0U2MworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0VuYWJsZVNSQU0yUGFnZVdSUF8zMl82Myh1aW50MzJfdCBTUkFNMldSUCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPlNXUFIyLCBTUkFNMldSUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU1JBTTIgcGFnZSB3cml0ZSBwcm90ZWN0aW9uIGxvY2sgcHJpb3IgdG8gZXJhc2UKKyAgKiBAcm10b2xsIFNZU0NGR19TS1IgICBLRVkgICAgICAgICAgIExMX1NZU0NGR19Mb2NrU1JBTTJXUlAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19Mb2NrU1JBTTJXUlAodm9pZCkKK3sKKyAgLyogV3JpdGluZyBhIHdyb25nIGtleSByZWFjdGl2YXRlcyB0aGUgd3JpdGUgcHJvdGVjdGlvbiAqLworICBXUklURV9SRUcoU1lTQ0ZHLT5TS1IsIDB4MDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTUkFNMiBwYWdlIHdyaXRlIHByb3RlY3Rpb24gdW5sb2NrIHByaW9yIHRvIGVyYXNlCisgICogQHJtdG9sbCBTWVNDRkdfU0tSICAgS0VZICAgICAgICAgICBMTF9TWVNDRkdfVW5sb2NrU1JBTTJXUlAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19VbmxvY2tTUkFNMldSUCh2b2lkKQoreworICAvKiB1bmxvY2sgdGhlIHdyaXRlIHByb3RlY3Rpb24gb2YgdGhlIFNSQU0yRVIgYml0ICovCisgIFdSSVRFX1JFRyhTWVNDRkctPlNLUiwgMHhDQVUpOworICBXUklURV9SRUcoU1lTQ0ZHLT5TS1IsIDB4NTNVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ1BVMSBJbnRlcnJ1cHQgTWFzaworICAqIEBybXRvbGwgU1lTQ0ZHX0lNUjEgIFRJTTFJTSAgICAgIExMX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19JTVIxICBUSU0xNklNICAgICBMTF9TWVNDRkdfR1JQMV9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfSU1SMSAgVElNMTdJTSAgICAgTExfU1lTQ0ZHX0dSUDFfRW5hYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0lNUjEgIEVYVEl4SU0gICAgIExMX1NZU0NGR19HUlAxX0VuYWJsZUlUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfVElNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX1RJTTE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfVElNMTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEk5CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9TWVNDRkdfR1JQMV9FbmFibGVJVCh1aW50MzJfdCBJbnRlcnJ1cHQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPklNUjEsIEludGVycnVwdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENQVTEgSW50ZXJydXB0IE1hc2sKKyAgKiBAcm10b2xsIFNZU0NGR19JTVIxICBQVk0xSU0gICAgICBMTF9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfSU1SMSAgUFZNM0lNICAgICAgTExfU1lTQ0ZHX0dSUDJfRW5hYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0lNUjEgIFBWRElNICAgICAgIExMX1NZU0NGR19HUlAyX0VuYWJsZUlUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDJfUFZNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAyX1BWTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMl9QVkQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19HUlAyX0VuYWJsZUlUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+SU1SMiwgSW50ZXJydXB0KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENQVTEgSW50ZXJydXB0IE1hc2sKKyAgKiBAcm10b2xsIFNZU0NGR19JTVIxICBUSU0xSU0gICAgICBMTF9TWVNDRkdfR1JQMV9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0lNUjEgIFRJTTE2SU0gICAgIExMX1NZU0NGR19HUlAxX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfSU1SMSAgVElNMTdJTSAgICAgTExfU1lTQ0ZHX0dSUDFfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19JTVIxICBFWFRJeElNICAgICBMTF9TWVNDRkdfR1JQMV9EaXNhYmxlSVQKKyAgKiBAcGFyYW0gIEludGVycnVwdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9USU0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfVElNMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9USU0xNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEk1CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEk4CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19HUlAxX0Rpc2FibGVJVCh1aW50MzJfdCBJbnRlcnJ1cHQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5JTVIxLCBJbnRlcnJ1cHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1BVMSBJbnRlcnJ1cHQgTWFzaworICAqIEBybXRvbGwgU1lTQ0ZHX0lNUjIgIFBWTTFJTSAgICAgIExMX1NZU0NGR19HUlAyX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfSU1SMiAgUFZNM0lNICAgICAgTExfU1lTQ0ZHX0dSUDJfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19JTVIyICBQVkRJTSAgICAgICBMTF9TWVNDRkdfR1JQMl9EaXNhYmxlSVQKKyAgKiBAcGFyYW0gIEludGVycnVwdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMl9QVk0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDJfUFZNMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAyX1BWRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfU1lTQ0ZHX0dSUDJfRGlzYWJsZUlUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgU0VUX0JJVChTWVNDRkctPklNUjIsIEludGVycnVwdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgQ1BVMSBJbnRlcnJ1cHQgTWFzayBpcyBlbmFibGVkCisgICogQHJtdG9sbCBTWVNDRkdfSU1SMSAgVElNMUlNICAgICAgTExfU1lTQ0ZHX0dSUDFfSXNFbmFibGVkSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0lNUjEgIFRJTTE2SU0gICAgIExMX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19JTVIxICBUSU0xN0lNICAgICBMTF9TWVNDRkdfR1JQMV9Jc0VuYWJsZWRJVFxuCisgICogICAgICAgICBTWVNDRkdfSU1SMSAgRVhUSXhJTSAgICAgTExfU1lTQ0ZHX0dSUDFfSXNFbmFibGVkSVQKKyAgKiBAcGFyYW0gIEludGVycnVwdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX1RJTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9USU0xNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX1RJTTE3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEk3CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDFfRVhUSTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMV9FWFRJOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAxX0VYVEkxNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5JTVIxLCBJbnRlcnJ1cHQpICE9IChJbnRlcnJ1cHQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgQ1BVMSBJbnRlcnJ1cHQgTWFzayBpcyBlbmFibGVkCisgICogQHJtdG9sbCBTWVNDRkdfSU1SMiAgUFZNMUlNICAgICAgTExfU1lTQ0ZHX0dSUDJfSXNFbmFibGVkSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0lNUjIgIFBWTTNJTSAgICAgIExMX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19JTVIyICBQVkRJTSAgICAgICBMTF9TWVNDRkdfR1JQMl9Jc0VuYWJsZWRJVAorICAqIEBwYXJhbSAgSW50ZXJydXB0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX0dSUDJfUFZNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19HUlAyX1BWTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfR1JQMl9QVkQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfR1JQMl9Jc0VuYWJsZWRJVCh1aW50MzJfdCBJbnRlcnJ1cHQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+SU1SMiwgSW50ZXJydXB0KSAhPSAoSW50ZXJydXB0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDUFUyIEludGVycnVwdCBNYXNrCisgICogQHJtdG9sbCBTWVNDRkdfQzJJTVIxICBSVENTVEFNUFRBTVBMU0VDU1NJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJUQ1dLVVBJTSAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJUQ0FMQVJNSU0gIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJDQ0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEZMQVNISU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFBLQUlNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJOR0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEFFUzFJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIENPTVBJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEFEQ0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEVYVEl4SU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUlRDU1RBTVBfUlRDVEFNUF9MU0VDU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9SVENXS1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUlRDQUxBUk0KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9SQ0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9GTEFTSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1JORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0FFUzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9DT01QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfQURDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk4CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgQ0xFQVJfQklUKFNZU0NGRy0+QzJJTVIxLCBJbnRlcnJ1cHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDUFUyIEludGVycnVwdCBNYXNrCisgICogQHJtdG9sbCBTWVNDRkdfQzJJTVIyICBETUExQ0h4SU0gICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBETUEyQ0h4SU0gICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBQVk0xSU0gICAgICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBQVk0zSU0gICAgICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBQVkRJTSAgICAgICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBUU0NJTSAgICAgICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBMQ0RJTSAgICAgICBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVAorICAqIEBwYXJhbSAgSW50ZXJydXB0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNINgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BTVVYMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX1BWTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9QVk0zCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfUFZECisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfVFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfTENECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9TWVNDRkdfR1JQMl9FbmFibGVJVCh1aW50MzJfdCBJbnRlcnJ1cHQpCit7CisgIENMRUFSX0JJVChTWVNDRkctPkMySU1SMiwgSW50ZXJydXB0KTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENQVTIgSW50ZXJydXB0IE1hc2sKKyAgKiBAcm10b2xsIFNZU0NGR19DMklNUjEgIFJUQ1NUQU1QVEFNUExTRUNTU0lNICAgICAgTExfQzJfU1lTQ0ZHX0dSUDFfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJUQ1dLVVBJTSAgIExMX0MyX1NZU0NGR19HUlAxX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIxICBSVENBTEFSTUlNICBMTF9DMl9TWVNDRkdfR1JQMV9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0MySU1SMSAgUkNDSU0gICAgICAgTExfQzJfU1lTQ0ZHX0dSUDFfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEZMQVNISU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIxICBQS0FJTSAgICAgICBMTF9DMl9TWVNDRkdfR1JQMV9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0MySU1SMSAgUk5HSU0gICAgICAgTExfQzJfU1lTQ0ZHX0dSUDFfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEFFUzFJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIxICBDT01QSU0gICAgICBMTF9DMl9TWVNDRkdfR1JQMV9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0MySU1SMSAgQURDSU0gICAgICAgTExfQzJfU1lTQ0ZHX0dSUDFfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEVYVEl4SU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0Rpc2FibGVJVAorICAqIEBwYXJhbSAgSW50ZXJydXB0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1JUQ1NUQU1QX1JUQ1RBTVBfTFNFQ1NTCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUlRDV0tVUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1JUQ0FMQVJNCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUkNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRkxBU0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9STkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9BRVMxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfQ09NUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0FEQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk5CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTExCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTEzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTE0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTE1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9TWVNDRkdfR1JQMV9EaXNhYmxlSVQodWludDMyX3QgSW50ZXJydXB0KQoreworICBTRVRfQklUKFNZU0NGRy0+QzJJTVIxLCBJbnRlcnJ1cHQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1BVMiBJbnRlcnJ1cHQgTWFzaworICAqIEBybXRvbGwgU1lTQ0ZHX0MySU1SMiAgRE1BMUNIeElNICAgTExfQzJfU1lTQ0ZHX0dSUDJfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIERNQTJDSHhJTSAgIExMX0MyX1NZU0NGR19HUlAyX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBQVk0xSU0gICAgICBMTF9DMl9TWVNDRkdfR1JQMl9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0MySU1SMiAgUFZNM0lNICAgICAgTExfQzJfU1lTQ0ZHX0dSUDJfRGlzYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIFBWRElNICAgICAgIExMX0MyX1NZU0NGR19HUlAyX0Rpc2FibGVJVFxuCisgICogICAgICAgICBTWVNDRkdfQzJJTVIyICBUU0NJTSAgICAgICBMTF9DMl9TWVNDRkdfR1JQMl9EaXNhYmxlSVRcbgorICAqICAgICAgICAgU1lTQ0ZHX0MySU1SMiAgTENESU0gICAgICAgTExfQzJfU1lTQ0ZHX0dSUDJfRGlzYWJsZUlUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNINworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNINgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUFNVVgxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfUFZNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX1BWTTMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9QVkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9UU0MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9MQ0QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0MyX1NZU0NGR19HUlAyX0Rpc2FibGVJVCh1aW50MzJfdCBJbnRlcnJ1cHQpCit7CisgIFNFVF9CSVQoU1lTQ0ZHLT5DMklNUjIsIEludGVycnVwdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgQ1BVMiBJbnRlcnJ1cHQgTWFzayBpcyBlbmFibGVkCisgICogQHJtdG9sbCBTWVNDRkdfQzJJTVIxICBSVENTVEFNUFRBTVBMU0VDU1NJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0VuYWJsZUlUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJUQ1dLVVBJTSAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJUQ0FMQVJNSU0gIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJDQ0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEZMQVNISU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFBLQUlNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIFJOR0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEFFUzFJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIENPTVBJTSAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEFEQ0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjEgIEVYVEl4SU0gICAgIExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9SVENTVEFNUF9SVENUQU1QX0xTRUNTUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1JUQ1dLVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9SVENBTEFSTQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX1JDQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0ZMQVNICisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUEtBCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfUk5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0NPTVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9BREMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEk3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDFfRVhUSTgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMV9FWFRJOQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAxX0VYVEkxNQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX1NZU0NGR19HUlAxX0lzRW5hYmxlZElUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DMklNUjEsIEludGVycnVwdCkgIT0gKEludGVycnVwdCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBDUFUyIEludGVycnVwdCBNYXNrIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIFNZU0NGR19DMklNUjIgIERNQTFDSHhJTSAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIERNQTJDSHhJTSAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIFBWTTFJTSAgICAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIFBWTTNJTSAgICAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIFBWRElNICAgICAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIFRTQ0lNICAgICAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUXG4KKyAgKiAgICAgICAgIFNZU0NGR19DMklNUjIgIExDRElNICAgICAgIExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUCisgICogQHBhcmFtICBJbnRlcnJ1cHQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMUNINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTFDSDYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUExQ0g3CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQTJDSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9ETUEyQ0g2CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfRE1BMkNINworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0RNQU1VWDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9TWVNDRkdfR1JQMl9QVk0xCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfU1lTQ0ZHX0dSUDJfUFZNMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX1BWRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX1RTQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX1NZU0NGR19HUlAyX0xDRAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0MyX1NZU0NGR19HUlAyX0lzRW5hYmxlZElUKHVpbnQzMl90IEludGVycnVwdCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoU1lTQ0ZHLT5DMklNUjIsIEludGVycnVwdCkgIT0gKEludGVycnVwdCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGFjY2VzcyBmb3Igc2VjdXJpdHkgSVAKKyAgKiBAcm10b2xsIFNZU0NGR19TSVBDUiBTQUVTMSAgICAgICAgIExMX1NZU0NGR19FbmFibGVTZWN1cml0eUFjY2Vzc1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgU0FFUzIgICAgICAgICBMTF9TWVNDRkdfRW5hYmxlU2VjdXJpdHlBY2Nlc3NcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIFNQS0EgICAgICAgICAgTExfU1lTQ0ZHX0VuYWJsZVNlY3VyaXR5QWNjZXNzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBTUk5HICAgICAgICAgIExMX1NZU0NGR19FbmFibGVTZWN1cml0eUFjY2VzcworICAqIEBwYXJhbSAgU2VjdXJpdHlBY2Nlc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19FbmFibGVTZWN1cml0eUFjY2Vzcyh1aW50MzJfdCBTZWN1cml0eUFjY2VzcykKK3sKKyAgU0VUX0JJVChTWVNDRkctPlNJUENSLCBTZWN1cml0eUFjY2Vzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgYWNjZXNzIGZvciBzZWN1cml0eSBJUAorICAqIEBybXRvbGwgU1lTQ0ZHX1NJUENSIFNBRVMxICAgICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVTZWN1cml0eUFjY2Vzc1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgU0FFUzIgICAgICAgICBMTF9TWVNDRkdfRGlzYWJsZVNlY3VyaXR5QWNjZXNzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBTUEtBICAgICAgICAgIExMX1NZU0NGR19EaXNhYmxlU2VjdXJpdHlBY2Nlc3NcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIFNSTkcgICAgICAgICAgTExfU1lTQ0ZHX0Rpc2FibGVTZWN1cml0eUFjY2VzcworICAqIEBwYXJhbSAgU2VjdXJpdHlBY2Nlc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1NZU0NGR19EaXNhYmxlU2VjdXJpdHlBY2Nlc3ModWludDMyX3QgU2VjdXJpdHlBY2Nlc3MpCit7CisgIENMRUFSX0JJVChTWVNDRkctPlNJUENSLCBTZWN1cml0eUFjY2Vzcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgYWNjZXNzIGZvciBzZWN1cml0eSBJUCBpcyBlbmFibGVkCisgICogQHJtdG9sbCBTWVNDRkdfU0lQQ1IgU0FFUzEgICAgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkU2VjdXJpdHlBY2Nlc3NcbgorICAqICAgICAgICAgU1lTQ0ZHX0NGR1IxIFNBRVMyICAgICAgICAgTExfU1lTQ0ZHX0lzRW5hYmxlZFNlY3VyaXR5QWNjZXNzXG4KKyAgKiAgICAgICAgIFNZU0NGR19DRkdSMSBTUEtBICAgICAgICAgIExMX1NZU0NGR19Jc0VuYWJsZWRTZWN1cml0eUFjY2Vzc1xuCisgICogICAgICAgICBTWVNDRkdfQ0ZHUjEgU1JORyAgICAgICAgICBMTF9TWVNDRkdfSXNFbmFibGVkU2VjdXJpdHlBY2Nlc3MKKyAgKiBAcGFyYW0gIFNlY3VyaXR5QWNjZXNzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9TWVNDRkdfSXNFbmFibGVkU2VjdXJpdHlBY2Nlc3ModWludDMyX3QgU2VjdXJpdHlBY2Nlc3MpCit7CisgIHJldHVybiAoKFJFQURfQklUKFNZU0NGRy0+U0lQQ1IsIFNlY3VyaXR5QWNjZXNzKSA9PSAoU2VjdXJpdHlBY2Nlc3MpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1lTVEVNX0xMX0VGX0RCR01DVSBEQkdNQ1UKKyAgKiBAbm90ZSAgREJHTUNVIGlzIG9ubHkgYWNjZXNzaWJsZSBieSBDb3J0ZXggTTQKKyAgKiAgICAgICAgVG8gYWNjZXNzIG9uIERCR01DVSwgQ29ydGV4IE0wKyBuZWVkIHRvIHJlcXVlc3QgdG8gdGhlIENvcnRleCBNNAorICAqICAgICAgICB0aGUgYWN0aW9uLgorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBkZXZpY2UgaWRlbnRpZmllcgorICAqIEBub3RlICAgRm9yIFNUTTMyV0J4eHh4IGRldmljZXMsIHRoZSBkZXZpY2UgSUQgaXMgMHg0OTUKKyAgKiBAcm10b2xsIERCR01DVV9JRENPREUgREVWX0lEICAgICAgICBMTF9EQkdNQ1VfR2V0RGV2aWNlSUQKKyAgKiBAcmV0dmFsIFZhbHVlcyBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkZGIChleDogZGV2aWNlIElEIGlzIDB4NDk1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9HZXREZXZpY2VJRCh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChEQkdNQ1UtPklEQ09ERSwgREJHTUNVX0lEQ09ERV9ERVZfSUQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyCisgICogQG5vdGUgICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgcmV2aXNpb24gb2YgdGhlIGRldmljZS4KKyAgKiBAcm10b2xsIERCR01DVV9JRENPREUgUkVWX0lEICAgICAgICBMTF9EQkdNQ1VfR2V0UmV2aXNpb25JRAorICAqIEByZXR2YWwgVmFsdWVzIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREJHTUNVX0dldFJldmlzaW9uSUQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoREJHTUNVLT5JRENPREUsIERCR01DVV9JRENPREVfUkVWX0lEKSA+PiBEQkdNQ1VfSURDT0RFX1JFVl9JRF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NMRUVQICAgICBMTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TTEVFUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NMRUVQICAgICBMTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTbGVlcE1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU0xFRVApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RPUCAgICAgIExMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0VuYWJsZURCR1N0b3BNb2RlKHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAqIEBybXRvbGwgREJHTUNVX0NSICAgIERCR19TVE9QICAgICAgTExfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX0RCR19TVE9QKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgICAgREJHX1NUQU5EQlkgICBMTF9EQkdNQ1VfRW5hYmxlREJHU3RhbmRieU1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSh2b2lkKQoreworICBTRVRfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUKKyAgKiBAcm10b2xsIERCR01DVV9DUiAgICBEQkdfU1RBTkRCWSAgIExMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9EQkdfU1RBTkRCWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBjbG9jayBmb3IgVHJhY2UgcG9ydAorICAqIEBybXRvbGwgREJHTUNVX0NSIFRSQUNFX0NMS0VOICAgICAgICAgTExfREJHTUNVX0VuYWJsZVRyYWNlQ2xvY2tcbgorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0VuYWJsZVRyYWNlQ2xvY2sodm9pZCkKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkNSLCBEQkdNQ1VfQ1JfVFJBQ0VfSU9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgY2xvY2sgZm9yIFRyYWNlIHBvcnQKKyAgKiBAcm10b2xsIERCR01DVV9DUiBUUkFDRV9DTEtFTiAgICAgICAgIExMX0RCR01DVV9EaXNhYmxlVHJhY2VDbG9ja1xuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfRGlzYWJsZVRyYWNlQ2xvY2sodm9pZCkKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9UUkFDRV9JT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiB0aGUgY2xvY2sgZm9yIFRyYWNlIHBvcnQgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgREJHTUNVX0NSIFRSQUNFX0NMS0VOICAgICAgICAgTExfREJHTUNVX0lzRW5hYmxlZFRyYWNlQ2xvY2tcbgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0RCR01DVV9Jc0VuYWJsZWRUcmFjZUNsb2NrKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKERCR01DVS0+Q1IsIERCR01DVV9DUl9UUkFDRV9JT0VOKSA9PSAoREJHTUNVX0NSX1RSQUNFX0lPRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBleHRlcm5hbCB0cmlnZ2VyIG91cHV0CisgICogQG5vdGUgICBXaGVuIGVuYWJsZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpcyBvdXRwdXQgKHN0YXRlIG9mIGJpdCAxKSwKKyAgKiAgICAgICAgIFRSR0lPIHBpbiBpcyBjb25uZWN0ZWQgdG8gVFJHT1VULgorICAqIEBybXRvbGwgREJHTUNVX0NSIFRSR09FTiAgICAgICAgIExMX0RCR01DVV9FbmFibGVUcmlnZ2VyT3V0cHV0XG4KKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9FbmFibGVUcmlnZ2VyT3V0cHV0KHZvaWQpCit7CisgIFNFVF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX1RSR09FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBvdXB1dAorICAqIEBub3RlICAgV2hlbiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaXMgaW5wdXQgKHN0YXRlIG9mIGJpdCAwKSwKKyAgKiAgICAgICAgIFRSR0lPIHBpbiBpcyBjb25uZWN0ZWQgdG8gVFJHSU4uCisgICogQHJtdG9sbCBEQkdNQ1VfQ1IgVFJHT0VOICAgICAgICAgTExfREJHTUNVX0Rpc2FibGVUcmlnZ2VyT3V0cHV0XG4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9EaXNhYmxlVHJpZ2dlck91dHB1dCh2b2lkKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX1RSR09FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgdGhlIGV4dGVybmFsIHRyaWdnZXIgaXMgb3V0cHV0IG9yIGlucHV0IGRpcmVjdGlvbgorICAqIEBub3RlICAgV2hlbiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpcyBvdXRwdXQgKHN0YXRlIG9mIGJpdCAxKSwKKyAgKiAgICAgICAgIFRSR0lPIHBpbiBpcyBjb25uZWN0ZWQgdG8gVFJHT1VULgorICAqICAgICAgICAgV2hlbiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpcyBpbnB1dCAoc3RhdGUgb2YgYml0IDApLAorICAqICAgICAgICAgVFJHSU8gcGluIGlzIGNvbm5lY3RlZCB0byBUUkdJTi4KKyAgKiBAcm10b2xsIERCR01DVV9DUiBUUkdPRU4gICAgICAgICBMTF9EQkdNQ1VfRW5hYmxlVHJpZ2dlck91dHB1dFxuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfREJHTUNVX0lzRW5hYmxlZFRyaWdnZXJPdXRwdXQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoREJHTUNVLT5DUiwgREJHTUNVX0NSX1RSR09FTikgPT0gKERCR01DVV9DUl9UUkdPRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnJlZXplIENQVTEgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHTUNVX0FQQjFGWlIxIERCR194eHh4X1NUT1AgIExMX0RCR01DVV9BUEIxX0dSUDFfRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfVElNMl9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9SVENfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfV1dER19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfREJHTUNVX0FQQjFfR1JQMV9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBGcmVlemUgQ1BVMiBBUEIxIHBlcmlwaGVyYWxzIChncm91cDEgcGVyaXBoZXJhbHMpCisgICogQHJtdG9sbCBEQkdNQ1VfQzJBUEIxRlpSMSBEQkdfeHh4eF9TVE9QICBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1RJTTJfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfUlRDX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKERCR01DVS0+QzJBUEIxRlpSMSwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnJlZXplIENQVTEgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHTUNVX0FQQjFGWlIyIERCR194eHh4X1NUT1AgIExMX0RCR01DVV9BUEIxX0dSUDJfRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDJfTFBUSU0yX1NUT1AKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDJfRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIFNFVF9CSVQoREJHTUNVLT5BUEIxRlpSMiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnJlZXplIENQVTIgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHTUNVX0MyQVBCMUZaUjIgREJHX3h4eHhfU1RPUCAgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9GcmVlemVQZXJpcGgKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9MUFRJTTJfU1RPUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkMyQVBCMUZaUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuZnJlZXplIENQVTEgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAxIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHTUNVX0FQQjFGWlIxIERCR194eHh4X1NUT1AgIExMX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGgKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9XV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0lXREdfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDFfSTJDMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjFfR1JQMV9JMkMzX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9EQkdNQ1VfQVBCMV9HUlAxX0xQVElNMV9TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMV9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjFGWlIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbmZyZWV6ZSBDUFUyIEFQQjEgcGVyaXBoZXJhbHMgKGdyb3VwMSBwZXJpcGhlcmFscykKKyAgKiBAcm10b2xsIERCR01DVV9DMkFQQjFGWlIxIERCR194eHh4X1NUT1AgIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfVW5GcmVlemVQZXJpcGgKKyAgKiBAcGFyYW0gIFBlcmlwaHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9USU0yX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX1JUQ19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9JV0RHX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAxX0kyQzFfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIxX0dSUDFfSTJDM19TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9MUFRJTTFfU1RPUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfREJHTUNVX0FQQjFfR1JQMV9VbkZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBDTEVBUl9CSVQoREJHTUNVLT5DMkFQQjFGWlIxLCBQZXJpcGhzKTsKK30KKworLyoqCisgICogQGJyaWVmICBVbmZyZWV6ZSBDUFUxIEFQQjEgcGVyaXBoZXJhbHMgKGdyb3VwMiBwZXJpcGhlcmFscykKKyAgKiBAcm10b2xsIERCR01DVV9BUEIxRlpSMiBEQkdfeHh4eF9TVE9QICBMTF9EQkdNQ1VfQVBCMV9HUlAyX1VuRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIxX0dSUDJfTFBUSU0yX1NUT1AKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0RCR01DVV9BUEIxX0dSUDJfVW5GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgQ0xFQVJfQklUKERCR01DVS0+QVBCMUZaUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuZnJlZXplIENQVTIgQVBCMSBwZXJpcGhlcmFscyAoZ3JvdXAyIHBlcmlwaGVyYWxzKQorICAqIEBybXRvbGwgREJHTUNVX0MyQVBCMUZaUjIgREJHX3h4eHhfU1RPUCAgTExfQzJfREJHTUNVX0FQQjFfR1JQMl9VbkZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAyX0xQVElNMl9TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9EQkdNQ1VfQVBCMV9HUlAyX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkMyQVBCMUZaUjIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZyZWV6ZSBDUFUxIEFQQjIgcGVyaXBoZXJhbHMKKyAgKiBAcm10b2xsIERCR01DVV9BUEIyRlpSIERCR19USU14X1NUT1AgIExMX0RCR01DVV9BUEIyX0dSUDFfRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaCh1aW50MzJfdCBQZXJpcGhzKQoreworICBTRVRfQklUKERCR01DVS0+QVBCMkZaUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRnJlZXplIENQVTIgQVBCMiBwZXJpcGhlcmFscworICAqIEBybXRvbGwgREJHTUNVX0MyQVBCMkZaUiBEQkdfVElNeF9TVE9QICBMTF9DMl9EQkdNQ1VfQVBCMl9HUlAxX0ZyZWV6ZVBlcmlwaAorICAqIEBwYXJhbSAgUGVyaXBocyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9DMl9EQkdNQ1VfQVBCMl9HUlAxX1RJTTFfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTZfU1RPUAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMTdfU1RPUAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfQzJfREJHTUNVX0FQQjJfR1JQMV9GcmVlemVQZXJpcGgodWludDMyX3QgUGVyaXBocykKK3sKKyAgU0VUX0JJVChEQkdNQ1UtPkMyQVBCMkZaUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5mcmVlemUgQ1BVMSBBUEIyIHBlcmlwaGVyYWxzCisgICogQHJtdG9sbCBEQkdNQ1VfQVBCMkZaUiBEQkdfVElNeF9TVE9QICBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkFQQjJGWlIsIFBlcmlwaHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuZnJlZXplIENQVTIgQVBCMiBwZXJpcGhlcmFscworICAqIEBybXRvbGwgREJHTUNVX0MyQVBCMkZaUiBEQkdfVElNeF9TVE9QICBMTF9DMl9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoCisgICogQHBhcmFtICBQZXJpcGhzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0MyX0RCR01DVV9BUEIyX0dSUDFfVElNMV9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjJfR1JQMV9USU0xNl9TVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfQzJfREJHTUNVX0FQQjJfR1JQMV9USU0xN19TVE9QCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9DMl9EQkdNQ1VfQVBCMl9HUlAxX1VuRnJlZXplUGVyaXBoKHVpbnQzMl90IFBlcmlwaHMpCit7CisgIENMRUFSX0JJVChEQkdNQ1UtPkMyQVBCMkZaUiwgUGVyaXBocyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFZSRUZCVUYpCisvKiogQGRlZmdyb3VwIFNZU1RFTV9MTF9FRl9WUkVGQlVGIFZSRUZCVUYKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIEVOVlIgICAgICAgICAgTExfVlJFRkJVRl9FbmFibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRW5hYmxlKHZvaWQpCit7CisgIFNFVF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlCisgICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgRU5WUiAgICAgICAgICBMTF9WUkVGQlVGX0Rpc2FibGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRGlzYWJsZSh2b2lkKQoreworICBDTEVBUl9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9FTlZSKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgaGlnaCBpbXBlZGFuY2UgKFZSRUYrcGluIGlzIGhpZ2ggaW1wZWRhbmNlKQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIEhJWiAgICAgICAgICAgTExfVlJFRkJVRl9FbmFibGVISVoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1ZSRUZCVUZfRW5hYmxlSElaKHZvaWQpCit7CisgIFNFVF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9ISVopOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgaGlnaCBpbXBlZGFuY2UgKFZSRUYrcGluIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIHRoZSB2b2x0YWdlIHJlZmVyZW5jZSBidWZmZXIgb3V0cHV0KQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIEhJWiAgICAgICAgICAgTExfVlJFRkJVRl9EaXNhYmxlSElaCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX0Rpc2FibGVISVoodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfSElaKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFZvbHRhZ2UgcmVmZXJlbmNlIHNjYWxlCisgICogQHJtdG9sbCBWUkVGQlVGX0NTUiAgVlJTICAgICAgICAgICBMTF9WUkVGQlVGX1NldFZvbHRhZ2VTY2FsaW5nCisgICogQHBhcmFtICBTY2FsZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9WUkVGQlVGX1NldFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFNjYWxlKQoreworICBNT0RJRllfUkVHKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfVlJTLCBTY2FsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBzY2FsZQorICAqIEBybXRvbGwgVlJFRkJVRl9DU1IgIFZSUyAgICAgICAgICAgTExfVlJFRkJVRl9HZXRWb2x0YWdlU2NhbGluZworICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9WUkVGQlVGX1ZPTFRBR0VfU0NBTEUwCisgICogICAgICAgICBAYXJnIEByZWYgTExfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1ZSRUZCVUZfR2V0Vm9sdGFnZVNjYWxpbmcodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVlJFRkJVRi0+Q1NSLCBWUkVGQlVGX0NTUl9WUlMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXIgaXMgcmVhZHkKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ1NSICBWUlIgICAgICAgICAgIExMX1ZSRUZCVUZfSXNWUkVGUmVhZHkKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9WUkVGQlVGX0lzVlJFRlJlYWR5KHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKFZSRUZCVUYtPkNTUiwgVlJFRkJVRl9DU1JfVlJSKSA9PSAoVlJFRkJVRl9DU1JfVlJSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgdHJpbW1pbmcgY29kZSBmb3IgVlJFRkJVRiBjYWxpYnJhdGlvbgorICAqIEBybXRvbGwgVlJFRkJVRl9DQ1IgIFRSSU0gICAgICAgICAgTExfVlJFRkJVRl9HZXRUcmltbWluZworICAqIEByZXR2YWwgQmV0d2VlbiAwIGFuZCAweDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVlJFRkJVRl9HZXRUcmltbWluZyh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChWUkVGQlVGLT5DQ1IsIFZSRUZCVUZfQ0NSX1RSSU0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaW1taW5nIGNvZGUgZm9yIFZSRUZCVUYgY2FsaWJyYXRpb24gKFR1bmUgdGhlIGludGVybmFsIHJlZmVyZW5jZSBidWZmZXIgdm9sdGFnZSkKKyAgKiBAcm10b2xsIFZSRUZCVUZfQ0NSICBUUklNICAgICAgICAgIExMX1ZSRUZCVUZfU2V0VHJpbW1pbmcKKyAgKiBAcGFyYW0gIFZhbHVlIEJldHdlZW4gMCBhbmQgMHgzRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVlJFRkJVRl9TZXRUcmltbWluZyh1aW50MzJfdCBWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFZSRUZCVUYtPkNDUiwgVmFsdWUpOworfQorCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFZSRUZCVUYgKi8KKworLyoqIEBkZWZncm91cCBTWVNURU1fTExfRUZfRkxBU0ggRkxBU0gKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBGTEFTSCBMYXRlbmN5CisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgTEFURU5DWSAgICAgICBMTF9GTEFTSF9TZXRMYXRlbmN5CisgICogQHBhcmFtICBMYXRlbmN5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8wCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfRkxBU0hfTEFURU5DWV8zCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9TZXRMYXRlbmN5KHVpbnQzMl90IExhdGVuY3kpCit7CisgIE1PRElGWV9SRUcoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0xBVEVOQ1ksIExhdGVuY3kpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBGTEFTSCBMYXRlbmN5CisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgTEFURU5DWSAgICAgICBMTF9GTEFTSF9HZXRMYXRlbmN5CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZMQVNIX0xBVEVOQ1lfMworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0dldExhdGVuY3kodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0xBVEVOQ1kpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUHJlZmV0Y2gKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0VuYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVQcmVmZXRjaCh2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUHJlZmV0Y2gKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQUkZURU4gICAgICAgIExMX0ZMQVNIX0Rpc2FibGVQcmVmZXRjaAorICAqIEBybXRvbGwgRkxBU0hfQzJBQ1IgIFBSRlRFTiAgICAgICAgTExfRkxBU0hfRGlzYWJsZVByZWZldGNoCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlUHJlZmV0Y2godm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QUkZURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFByZWZldGNoIGJ1ZmZlciBpcyBlbmFibGVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUFJGVEVOICAgICAgICBMTF9GTEFTSF9Jc1ByZWZldGNoRW5hYmxlZAorICAqIEBybXRvbGwgRkxBU0hfQzJBQ1IgIEMyUFJGVEVOICAgICAgTExfRkxBU0hfSXNQcmVmZXRjaEVuYWJsZWQKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTEFTSF9Jc1ByZWZldGNoRW5hYmxlZCh2b2lkKQoreworICByZXR1cm4gKChSRUFEX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUFJGVEVOKSA9PSAoRkxBU0hfQUNSX1BSRlRFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSW5zdHJ1Y3Rpb24gY2FjaGUKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBJQ0VOICAgICAgICAgIExMX0ZMQVNIX0VuYWJsZUluc3RDYWNoZQorICAqIEBybXRvbGwgRkxBU0hfQzJBQ1IgIElDRU4gICAgICAgICAgTExfRkxBU0hfRW5hYmxlSW5zdENhY2hlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGUodm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJbnN0cnVjdGlvbiBjYWNoZQorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIElDRU4gICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZQorICAqIEBybXRvbGwgRkxBU0hfQzJBQ1IgIElDRU4gICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZSh2b2lkKQoreworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEYXRhIGNhY2hlCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRENFTiAgICAgICAgICBMTF9GTEFTSF9FbmFibGVEYXRhQ2FjaGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0VuYWJsZURhdGFDYWNoZSh2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERhdGEgY2FjaGUKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBEQ0VOICAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0Rpc2FibGVEYXRhQ2FjaGUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgSW5zdHJ1Y3Rpb24gY2FjaGUgcmVzZXQKKyAgKiBAbm90ZSAgYml0IGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgaXMgZGlzYWJsZWQKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBJQ1JTVCAgICAgICAgIExMX0ZMQVNIX0VuYWJsZUluc3RDYWNoZVJlc2V0CisgICogQHJtdG9sbCBGTEFTSF9DMkFDUiAgSUNSU1QgICAgICAgICBMTF9GTEFTSF9FbmFibGVJbnN0Q2FjaGVSZXNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlSW5zdENhY2hlUmVzZXQodm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfSUNSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSW5zdHJ1Y3Rpb24gY2FjaGUgcmVzZXQKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBJQ1JTVCAgICAgICAgIExMX0ZMQVNIX0Rpc2FibGVJbnN0Q2FjaGVSZXNldAorICAqIEBybXRvbGwgRkxBU0hfQzJBQ1IgIElDUlNUICAgICAgICAgTExfRkxBU0hfRGlzYWJsZUluc3RDYWNoZVJlc2V0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlSW5zdENhY2hlUmVzZXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9JQ1JTVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERhdGEgY2FjaGUgcmVzZXQKKyAgKiBAbm90ZSBiaXQgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIHRoZSBkYXRhIGNhY2hlIGlzIGRpc2FibGVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRENSU1QgICAgICAgICBMTF9GTEFTSF9FbmFibGVEYXRhQ2FjaGVSZXNldAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfRW5hYmxlRGF0YUNhY2hlUmVzZXQodm9pZCkKK3sKKyAgU0VUX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRENSU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRGF0YSBjYWNoZSByZXNldAorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIERDUlNUICAgICAgICAgTExfRkxBU0hfRGlzYWJsZURhdGFDYWNoZVJlc2V0CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTEFTSF9EaXNhYmxlRGF0YUNhY2hlUmVzZXQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9EQ1JTVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBuZXcgcHJvZ3JhbSBvciBlcmFzZSBvcGVyYXRpb24gcmVxdWVzdAorICAqIEBub3RlICAgQW55IG5ldyBGbGFzaCBwcm9ncmFtIGFuZCBlcmFzZSBvcGVyYXRpb24gb24gYm90aCBDUFUgc2lkZSB3aWxsIGJlIHN1c3BlbmRlZAorICAqICAgICAgICAgdW50aWwgdGhpcyBiaXQgYW5kIHRoZSBzYW1lIGJpdCBpbiBGbGFzaCBDUFUyIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyIChGTEFTSF9DMkFDUikgYXJlCisgICogICAgICAgICBjbGVhcmVkLiBUaGUgUEVTRCBiaXQgaW4gYm90aCB0aGUgRmxhc2ggc3RhdHVzIHJlZ2lzdGVyIChGTEFTSF9TUikgYW5kIEZsYXNoCisgICogICAgICAgICBDUFUyIHN0YXR1cyByZWdpc3RlciAoRkxBU0hfQzJTUikgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgd2hlbiBhdCBsZWFzdCBvbmUgUEVTCisgICogICAgICAgICBiaXQgaW4gRkxBU0hfQUNSIG9yIEZMQVNIX0MyQUNSIGlzIHNldC4KKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBQRVMgICAgICAgICBMTF9GTEFTSF9TdXNwZW5kT3BlcmF0aW9uCisgICogQHJtdG9sbCBGTEFTSF9DMkFDUiAgUEVTICAgICAgICAgTExfRkxBU0hfU3VzcGVuZE9wZXJhdGlvbgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfU3VzcGVuZE9wZXJhdGlvbih2b2lkKQoreworICBTRVRfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QRVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFsbG93IG5ldyBwcm9ncmFtIG9yIGVyYXNlIG9wZXJhdGlvbiByZXF1ZXN0CisgICogQG5vdGUgICBBbnkgbmV3IEZsYXNoIHByb2dyYW0gYW5kIGVyYXNlIG9wZXJhdGlvbiBvbiBib3RoIENQVSBzaWRlIHdpbGwgYmUgYWxsb3dlZAorICAqICAgICAgICAgdW50aWwgb25lIG9mIHRoaXMgYml0IG9yIHRoZSBzYW1lIGJpdCBpbiBGbGFzaCBDUFUyIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyIChGTEFTSF9DMkFDUikgaXMKKyAgKiAgICAgICAgIHNldC4gVGhlIFBFU0QgYml0IGluIGJvdGggdGhlIEZsYXNoIHN0YXR1cyByZWdpc3RlciAoRkxBU0hfU1IpIGFuZCBGbGFzaAorICAqICAgICAgICAgQ1BVMiBzdGF0dXMgcmVnaXN0ZXIgKEZMQVNIX0MyU1IpIHJlZ2lzdGVyIHdpbGwgYmUgY2xlYXIgd2hlbiBib3RoIFBFUworICAqICAgICAgICAgYml0IGluIEZMQVNIX0FDUiBvciBGTEFTSF9DMkFDUiBpcyBjbGVhcmVkLgorICAqIEBybXRvbGwgRkxBU0hfQUNSICAgIFBFUyAgICAgIExMX0ZMQVNIX0FsbG93T3BlcmF0aW9uCisgICogQHJtdG9sbCBGTEFTSF9DMkFDUiAgUEVTICAgICAgTExfRkxBU0hfQWxsb3dPcGVyYXRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZMQVNIX0FsbG93T3BlcmF0aW9uKHZvaWQpCit7CisgIENMRUFSX0JJVChGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfUEVTKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBuZXcgcHJvZ3JhbSBvciBlcmFzZSBvcGVyYXRpb24gcmVxdWVzdCBmcm9tIENQVTIgaXMgc3VzcGVuZGVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgUEVTICAgICAgICAgTExfRkxBU0hfSXNPcGVyYXRpb25TdXNwZW5kZWQKKyAgKiBAcm10b2xsIEZMQVNIX0MyQUNSICBQRVMgICAgICAgICBMTF9GTEFTSF9Jc09wZXJhdGlvblN1c3BlbmRlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzT3BlcmF0aW9uU3VzcGVuZGVkKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9QRVMpID09IChGTEFTSF9BQ1JfUEVTKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIG5ldyBwcm9ncmFtIG9yIGVyYXNlIG9wZXJhdGlvbiByZXF1ZXN0IGZyb20gQ1BVMSBvciBDUFUyIGlzIHN1c3BlbmRlZAorICAqIEBybXRvbGwgRkxBU0hfU1IgICAgICBQRVNEICAgICAgICAgTExfRkxBU0hfSXNBY3RpdmVGbGFnX09wZXJhdGlvblN1c3BlbmRlZAorICAqIEBybXRvbGwgRkxBU0hfQzJTUiAgICBQRVNEICAgICAgICAgTExfRkxBU0hfSXNBY3RpdmVGbGFnX09wZXJhdGlvblN1c3BlbmRlZAorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzQWN0aXZlRmxhZ19PcGVyYXRpb25TdXNwZW5kZWQodm9pZCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRkxBU0gtPlNSLCBGTEFTSF9TUl9QRVNEKSA9PSAoRkxBU0hfU1JfUEVTRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgRU1QVFkgZmxhZyBpbmZvcm1hdGlvbiBhcyBGbGFzaCBVc2VyIGFyZWEgZW1wdHkKKyAgKiBAcm10b2xsIEZMQVNIX0FDUiAgICBFTVBUWSAgICAgIExMX0ZMQVNIX1NldEVtcHR5RmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfU2V0RW1wdHlGbGFnKHZvaWQpCit7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0VNUFRZKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBFTVBUWSBmbGFnIGluZm9ybWF0aW9uIGFzIEZsYXNoIFVzZXIgYXJlYSBwcm9ncmFtbWVkCisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRU1QVFkgICAgICBMTF9GTEFTSF9DbGVhckVtcHR5RmxhZworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRkxBU0hfQ2xlYXJFbXB0eUZsYWcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9FTVBUWSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIEVNUFRZIGZsYWcgaXMgc2V0IG9yIHJlc2V0CisgICogQHJtdG9sbCBGTEFTSF9BQ1IgICAgRU1QVFkgICAgICBMTF9GTEFTSF9Jc0VtcHR5RmxhZworICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0lzRW1wdHlGbGFnKHZvaWQpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9FTVBUWSkgPT0gRkxBU0hfQUNSX0VNUFRZKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IElQQ0MgYnVmZmVyIGJhc2UgYWRkcmVzcworICAqIEBybXRvbGwgRkxBU0hfSVBDQ0JSICAgIElQQ0NEQkEgICAgICAgTExfRkxBU0hfR2V0SVBDQ0J1ZmZlckFkZHIKKyAgKiBAcmV0dmFsIElQQ0MgZGF0YSBidWZmZXIgYmFzZSBhZGRyZXNzIG9mZnNldAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0dldElQQ0NCdWZmZXJBZGRyKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZMQVNILT5JUENDQlIsIEZMQVNIX0lQQ0NCUl9JUENDREJBKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IENQVTIgYm9vdCByZXNldCB2ZWN0b3IKKyAgKiBAcm10b2xsIEZMQVNIX1NSUlZSICAgIFNCUlYgICAgICAgTExfRkxBU0hfR2V0QzJCb290UmVzZXRWZWN0CisgICogQHJldHZhbCBDUFUyIGJvb3QgcmVzZXQgdmVjdG9yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0QzJCb290UmVzZXRWZWN0KHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZMQVNILT5TUlJWUiwgRkxBU0hfU1JSVlJfU0JSVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVW5pcXVlIERldmljZSBOdW1iZXIKKyAgKiBAbm90ZSAgIFRoZSA2NC1iaXQgVUlENjQgbWF5IGJlIHVzZWQgYnkgRmlybXdhcmUgdG8gZGVyaXZlIEJMRSA0OC1iaXQgRGV2aWNlIEFkZHJlc3MgRVVJLTQ4IG9yCisgICogICAgICAgICA4MDIuMTUuNCA2NC1iaXQgRGV2aWNlIEFkZHJlc3MgRVVJLTY0LgorICAqIEByZXR2YWwgVmFsdWVzIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0VUROKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopVUlENjRfQkFTRSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERldmljZSBJRAorICAqIEBub3RlICAgVGhlIDY0LWJpdCBVSUQ2NCBtYXkgYmUgdXNlZCBieSBGaXJtd2FyZSB0byBkZXJpdmUgQkxFIDQ4LWJpdCBEZXZpY2UgQWRkcmVzcyBFVUktNDggb3IKKyAgKiAgICAgICAgIDgwMi4xNS40IDY0LWJpdCBEZXZpY2UgQWRkcmVzcyBFVUktNjQuCisgICogICAgICAgICBGb3IgU1RNMzJXQnh4eHggZGV2aWNlcywgdGhlIGRldmljZSBJRCBpcyAweDA1CisgICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGIChleDogRGV2aWNlIElEIGlzIDB4MDUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRkxBU0hfR2V0RGV2aWNlSUQodm9pZCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoKFJFQURfUkVHKCooKHVpbnQzMl90ICopVUlENjRfQkFTRSArIDFVKSkpICYgMHgwMDAwMDBGRlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU1QgQ29tcGFueSBJRAorICAqIEBub3RlICAgVGhlIDY0LWJpdCBVSUQ2NCBtYXkgYmUgdXNlZCBieSBGaXJtd2FyZSB0byBkZXJpdmUgQkxFIDQ4LWJpdCBEZXZpY2UgQWRkcmVzcyBFVUktNDggb3IKKyAgKiAgICAgICAgIDgwMi4xNS40IDY0LWJpdCBEZXZpY2UgQWRkcmVzcyBFVUktNjQuCisgICogICAgICAgICBGb3IgU1RNMzJXQnh4eHggZGV2aWNlcywgdGhlIFNUIENvbXBhZ255IElEIGlzIDB4MDA4MEUxCisgICogQHJldHZhbCBWYWx1ZXMgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGRkZGRiAoZXg6IFNUIENvbXBhZ255IElEIGlzIDB4MDA4MEUxKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZMQVNIX0dldFNUQ29tcGFueUlEKHZvaWQpCit7CisgIHJldHVybiAodWludDMyX3QpKCgoUkVBRF9SRUcoKigodWludDMyX3QgKilVSUQ2NF9CQVNFICsgMVUpKSkgPj4gOFUgKSAmIDB4MDBGRkZGRkZVKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChGTEFTSCkgfHwgZGVmaW5lZCAoU1lTQ0ZHKSB8fCBkZWZpbmVkIChEQkdNQ1UpIHx8IGRlZmluZWQgKFZSRUZCVUYpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfU1lTVEVNX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfdGltLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX3RpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX3RpbS5oCkBAIC0wLDAgKzEsNDc4OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF90aW0uaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgVElNIExMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX1NUTTMyV0J4eF9MTF9USU1fSAorI2RlZmluZSBfX1NUTTMyV0J4eF9MTF9USU1fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFRJTTEpIHx8IGRlZmluZWQgKFRJTTIpIHx8IGRlZmluZWQgKFRJTTE2KSB8fCBkZWZpbmVkIChUSU03KQorCisvKiogQGRlZmdyb3VwIFRJTV9MTCBUSU0KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX1ByaXZhdGVfVmFyaWFibGVzIFRJTSBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCitzdGF0aWMgY29uc3QgdWludDhfdCBPRkZTRVRfVEFCX0NDTVJ4W10gPQoreworICAweDAwVSwgICAvKiAwOiBUSU14X0NIMSAgKi8KKyAgMHgwMFUsICAgLyogMTogVElNeF9DSDFOICovCisgIDB4MDBVLCAgIC8qIDI6IFRJTXhfQ0gyICAqLworICAweDAwVSwgICAvKiAzOiBUSU14X0NIMk4gKi8KKyAgMHgwNFUsICAgLyogNDogVElNeF9DSDMgICovCisgIDB4MDRVLCAgIC8qIDU6IFRJTXhfQ0gzTiAqLworICAweDA0VSwgICAvKiA2OiBUSU14X0NINCAgKi8KKyAgMHgzQ1UsICAgLyogNzogVElNeF9DSDUgICovCisgIDB4M0NVICAgIC8qIDg6IFRJTXhfQ0g2ICAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX09DeHhbXSA9Cit7CisgIDBVLCAgICAgICAgICAgIC8qIDA6IE9DMU0sIE9DMUZFLCBPQzFQRSAqLworICAwVSwgICAgICAgICAgICAvKiAxOiAtIE5BICovCisgIDhVLCAgICAgICAgICAgIC8qIDI6IE9DMk0sIE9DMkZFLCBPQzJQRSAqLworICAwVSwgICAgICAgICAgICAvKiAzOiAtIE5BICovCisgIDBVLCAgICAgICAgICAgIC8qIDQ6IE9DM00sIE9DM0ZFLCBPQzNQRSAqLworICAwVSwgICAgICAgICAgICAvKiA1OiAtIE5BICovCisgIDhVLCAgICAgICAgICAgIC8qIDY6IE9DNE0sIE9DNEZFLCBPQzRQRSAqLworICAwVSwgICAgICAgICAgICAvKiA3OiBPQzVNLCBPQzVGRSwgT0M1UEUgKi8KKyAgOFUgICAgICAgICAgICAgLyogODogT0M2TSwgT0M2RkUsIE9DNlBFICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfSUN4eFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogQ0MxUywgSUMxUFNDLCBJQzFGICovCisgIDBVLCAgICAgICAgICAgIC8qIDE6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogMjogQ0MyUywgSUMyUFNDLCBJQzJGICovCisgIDBVLCAgICAgICAgICAgIC8qIDM6IC0gTkEgKi8KKyAgMFUsICAgICAgICAgICAgLyogNDogQ0MzUywgSUMzUFNDLCBJQzNGICovCisgIDBVLCAgICAgICAgICAgIC8qIDU6IC0gTkEgKi8KKyAgOFUsICAgICAgICAgICAgLyogNjogQ0M0UywgSUM0UFNDLCBJQzRGICovCisgIDBVLCAgICAgICAgICAgIC8qIDc6IC0gTkEgKi8KKyAgMFUgICAgICAgICAgICAgLyogODogLSBOQSAqLworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgU0hJRlRfVEFCX0NDeFBbXSA9Cit7CisgIDBVLCAgICAgICAgICAgIC8qIDA6IENDMVAgKi8KKyAgMlUsICAgICAgICAgICAgLyogMTogQ0MxTlAgKi8KKyAgNFUsICAgICAgICAgICAgLyogMjogQ0MyUCAqLworICA2VSwgICAgICAgICAgICAvKiAzOiBDQzJOUCAqLworICA4VSwgICAgICAgICAgICAvKiA0OiBDQzNQICovCisgIDEwVSwgICAgICAgICAgIC8qIDU6IENDM05QICovCisgIDEyVSwgICAgICAgICAgIC8qIDY6IENDNFAgKi8KKyAgMTZVLCAgICAgICAgICAgLyogNzogQ0M1UCAqLworICAyMFUgICAgICAgICAgICAvKiA4OiBDQzZQICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBTSElGVF9UQUJfT0lTeFtdID0KK3sKKyAgMFUsICAgICAgICAgICAgLyogMDogT0lTMSAqLworICAxVSwgICAgICAgICAgICAvKiAxOiBPSVMxTiAqLworICAyVSwgICAgICAgICAgICAvKiAyOiBPSVMyICovCisgIDNVLCAgICAgICAgICAgIC8qIDM6IE9JUzJOICovCisgIDRVLCAgICAgICAgICAgIC8qIDQ6IE9JUzMgKi8KKyAgNVUsICAgICAgICAgICAgLyogNTogT0lTM04gKi8KKyAgNlUsICAgICAgICAgICAgLyogNjogT0lTNCAqLworICA4VSwgICAgICAgICAgICAvKiA3OiBPSVM1ICovCisgIDEwVSAgICAgICAgICAgIC8qIDg6IE9JUzYgKi8KK307CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9Db25zdGFudHMgVElNIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRGVmaW5lcyB1c2VkIGZvciB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSByZWdpc3RlciBhbmQgcGVyZm9ybSBvZmZzZXRzICovCisjZGVmaW5lIFRJTV9QT1NJVElPTl9CUktfU09VUkNFICAgICAgICAgICAgKFBPU0lUSU9OX1ZBTChTb3VyY2UpICYgMHgxRlVMKQorCisvKiBHZW5lcmljIGJpdCBkZWZpbml0aW9ucyBmb3IgVElNeF9BRjEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVElNeF9BRjFfQktJTkUgICAgIFRJTTFfQUYxX0JLSU5FICAgICAvKiE8IEJSSyBCS0lOIGlucHV0IGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMV9CS0NPTVAxRSAgVElNMV9BRjFfQktDTVAxRSAgIC8qITwgQlJLIENPTVAxIGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMV9CS0NPTVAyRSAgVElNMV9BRjFfQktDTVAyRSAgIC8qITwgQlJLIENPTVAyIGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMV9CS0lOUCAgICAgVElNMV9BRjFfQktJTlAgICAgIC8qITwgQlJLIEJLSU4gaW5wdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNeF9BRjFfQktDT01QMVAgIFRJTTFfQUYxX0JLQ01QMVAgICAvKiE8IEJSSyBDT01QMSBpbnB1dCBwb2xhcml0eSAqLworI2RlZmluZSBUSU14X0FGMV9CS0NPTVAyUCAgVElNMV9BRjFfQktDTVAyUCAgIC8qITwgQlJLIENPTVAyIGlucHV0IHBvbGFyaXR5ICovCisjZGVmaW5lIFRJTXhfQUYxX0VUUlNFTCAgICBUSU0xX0FGMV9FVFJTRUwgICAgLyohPCBUSU14IEVUUiBzb3VyY2Ugc2VsZWN0aW9uICovCisKKy8qIEdlbmVyaWMgYml0IGRlZmluaXRpb25zIGZvciBUSU14X0FGMiByZWdpc3RlciAqLworI2RlZmluZSBUSU14X0FGMl9CSzJJTkUgICAgVElNMV9BRjJfQksySU5FICAgICAgLyohPCBCUksyIEJLSU4yIGlucHV0IGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMl9CSzJDT01QMUUgVElNMV9BRjJfQksyQ01QMUUgICAgLyohPCBCUksyIENPTVAxIGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMl9CSzJDT01QMkUgVElNMV9BRjJfQksyQ01QMkUgICAgLyohPCBCUksyIENPTVAyIGVuYWJsZSAqLworI2RlZmluZSBUSU14X0FGMl9CSzJJTlAgICAgVElNMV9BRjJfQksySU5QICAgICAgLyohPCBCUksyIEJLSU4yIGlucHV0IHBvbGFyaXR5ICovCisjZGVmaW5lIFRJTXhfQUYyX0JLMkNPTVAxUCBUSU0xX0FGMl9CSzJDTVAxUCAgICAvKiE8IEJSSzIgQ09NUDEgaW5wdXQgcG9sYXJpdHkgKi8KKyNkZWZpbmUgVElNeF9BRjJfQksyQ09NUDJQIFRJTTFfQUYyX0JLMkNNUDJQICAgIC8qITwgQlJLMiBDT01QMiBpbnB1dCBwb2xhcml0eSAqLworCisvKiBSZW1hcCBtYXNrIGRlZmluaXRpb25zICovCisjZGVmaW5lIFRJTXhfT1JfUk1QX1NISUZUIDE2VQorI2RlZmluZSBUSU14X09SX1JNUF9NQVNLICAweDAwMDBGRkZGVQorI2RlZmluZSBUSU0xX09SX1JNUF9NQVNLICAoKFRJTTFfT1JfRVRSX0FEQzFfUk1QIHwgVElNMV9PUl9USTFfUk1QKSA8PCBUSU14X09SX1JNUF9TSElGVCkKKyNkZWZpbmUgVElNMl9PUl9STVBfTUFTSyAgKChUSU0yX09SX1RJNF9STVAgfCBUSU0yX09SX0VUUl9STVAgfCBUSU0yX09SX0lUUjFfUk1QKSA8PCBUSU14X09SX1JNUF9TSElGVCkKKyNkZWZpbmUgVElNMTZfT1JfUk1QX01BU0sgKFRJTTE2X09SX1RJMV9STVAgPDwgVElNeF9PUl9STVBfU0hJRlQpCisjZGVmaW5lIFRJTTE3X09SX1JNUF9NQVNLIChUSU0xN19PUl9USTFfUk1QIDw8IFRJTXhfT1JfUk1QX1NISUZUKQorCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBUREdbeDowXSBvZiB0aGUgRFRHIGJpdHMgb2YgdGhlIFRJTXhfQkRUUiByZWdpc3RlciAqLworI2RlZmluZSBEVF9ERUxBWV8xICgodWludDhfdCkweDdGKQorI2RlZmluZSBEVF9ERUxBWV8yICgodWludDhfdCkweDNGKQorI2RlZmluZSBEVF9ERUxBWV8zICgodWludDhfdCkweDFGKQorI2RlZmluZSBEVF9ERUxBWV80ICgodWludDhfdCkweDFGKQorCisvKiBNYXNrIHVzZWQgdG8gc2V0IHRoZSBEVEdbNzo1XSBiaXRzIG9mIHRoZSBEVEcgYml0cyBvZiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyICovCisjZGVmaW5lIERUX1JBTkdFXzEgKCh1aW50OF90KTB4MDApCisjZGVmaW5lIERUX1JBTkdFXzIgKCh1aW50OF90KTB4ODApCisjZGVmaW5lIERUX1JBTkdFXzMgKCh1aW50OF90KTB4QzApCisjZGVmaW5lIERUX1JBTkdFXzQgKCh1aW50OF90KTB4RTApCisKKy8qKiBMZWdhY3kgZGVmaW5pdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorQGNvbmQgMAorICAqLworLyoqCitAZW5kY29uZAorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9NYWNyb3MgVElNIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAYnJpZWYgIENvbnZlcnQgY2hhbm5lbCBpZCBpbnRvIGNoYW5uZWwgaW5kZXguCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoIF9fQ0hBTk5FTF9fKSBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDEpID8gMFUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMU4pID8gMVUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMikgPyAyVSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyTikgPyAzVSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gzKSA/IDRVIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDNOKSA/IDVVIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDQpID8gNlUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINSkgPyA3VSA6IDhVKQorCisvKiogQGJyaWVmICBDYWxjdWxhdGUgdGhlIGRlYWR0aW1lIHNhbXBsaW5nIHBlcmlvZChpbiBwcykuCisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopLgorICAqIEBwYXJhbSAgX19DS0RfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNAorICAqIEByZXR2YWwgbm9uZQorICAqLworI2RlZmluZSBUSU1fQ0FMQ19EVFMoX19USU1DTEtfXywgX19DS0RfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgPyAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLyhfX1RJTUNMS19fKSkgICAgICAgICA6IFwKKyAgICgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgPyAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLygoX19USU1DTEtfXykgPj4gMVUpKSA6IFwKKyAgICgodWludDY0X3QpMTAwMDAwMDAwMDAwMFUvKChfX1RJTUNMS19fKSA+PiAyVSkpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRVNfSU5JVCBUSU0gRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQxNl90IFByZXNjYWxlcjsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIHZhbHVlIHVzZWQgdG8gZGl2aWRlIHRoZSBUSU0gY2xvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAwMCBhbmQgTWF4X0RhdGE9MHhGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQ291bnRlck1vZGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NPVU5URVJNT0RFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldENvdW50ZXJNb2RlKCkuKi8KKworICB1aW50MzJfdCBBdXRvcmVsb2FkOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGF1dG8gcmVsb2FkIHZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0by1SZWxvYWQgUmVnaXN0ZXIgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGE9MHgwMDAwIGFuZCBNYXhfRGF0YT0weEZGRkYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgdGltZXIgaW5zdGFuY2VzIG1heSBzdXBwb3J0IDMyIGJpdHMgY291bnRlcnMuIEluIHRoYXQgY2FzZSB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkZGRkZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldEF1dG9SZWxvYWQoKS4qLworCisgIHVpbnQzMl90IENsb2NrRGl2aXNpb247ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY2xvY2sgZGl2aXNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0NMT0NLRElWSVNJT04uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbigpLiovCisKKyAgdWludDhfdCBSZXBldGl0aW9uQ291bnRlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuIEVhY2ggdGltZSB0aGUgUkNSIGRvd25jb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgemVybywgYW4gdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUkNSIHZhbHVlIChOKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyBpbiBQV00gbW9kZSB0aGF0IChOKzEpIGNvcnJlc3BvbmRzIHRvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGhhbGYgUFdNIHBlcmlvZCBpbiBjZW50ZXItYWxpZ25lZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweEZGLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKCkuKi8KK30gTExfVElNX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBPdXRwdXQgQ29tcGFyZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgT0NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX09DX1NldE1vZGUoKS4qLworCisgIHVpbnQzMl90IE9DU3RhdGU7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NTVEFURS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9DQ19FbmFibGVDaGFubmVsKCkgb3IgQHJlZiBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwoKS4qLworCisgIHVpbnQzMl90IE9DTlN0YXRlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gY29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1NUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVElNX0NDX0VuYWJsZUNoYW5uZWwoKSBvciBAcmVmIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbCgpLiovCisKKyAgdWludDMyX3QgQ29tcGFyZVZhbHVlOyAgLyohPCBTcGVjaWZpZXMgdGhlIENvbXBhcmUgdmFsdWUgdG8gYmUgbG9hZGVkIGludG8gdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwMDAgYW5kIE1heF9EYXRhPTB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIExMX1RJTV9PQ19TZXRDb21wYXJlQ0h4ICh4PTEuLjYpLiovCisKKyAgdWludDMyX3QgT0NQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLworCisgIHVpbnQzMl90IE9DTlBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBwb2xhcml0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PQ1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0UG9sYXJpdHkoKS4qLworCisKKyAgdWludDMyX3QgT0NJZGxlU3RhdGU7ICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBwaW4gc3RhdGUgZHVyaW5nIElkbGUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT0NJRExFU1RBVEUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUoKS4qLworCisgIHVpbnQzMl90IE9DTklkbGVTdGF0ZTsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgcGluIHN0YXRlIGR1cmluZyBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX09DSURMRVNUQVRFLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0SWRsZVN0YXRlKCkuKi8KK30gTExfVElNX09DX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBJbnB1dCBDYXB0dXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24uCisgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgSUNQb2xhcml0eTsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIHRoZSBpbnB1dCBzaWduYWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUNBY3RpdmVJbnB1dDsgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0FDVElWRUlOUFVULgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLworCisgIHVpbnQzMl90IElDUHJlc2NhbGVyOyAgIC8qITwgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgSUNGaWx0ZXI7ICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0IGNhcHR1cmUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCit9IExMX1RJTV9JQ19Jbml0VHlwZURlZjsKKworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBFbmNvZGVyIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgRW5jb2Rlck1vZGU7ICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZW5jb2RlciByZXNvbHV0aW9uICh4MiBvciB4NCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19FTkNPREVSTU9ERS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0RW5jb2Rlck1vZGUoKS4qLworCisgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBlZGdlIG9mIFRJMSBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQb2xhcml0eSgpLiovCisKKyAgdWludDMyX3QgSUMxQWN0aXZlSW5wdXQ7ICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQUNUSVZFSU5QVVQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KCkuKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNQU0MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgSUMxRmlsdGVyOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVEkxIGlucHV0IGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDX0ZJTFRFUi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0RmlsdGVyKCkuKi8KKworICB1aW50MzJfdCBJQzJQb2xhcml0eTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkyIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQzJBY3RpdmVJbnB1dDsgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19BQ1RJVkVJTlBVVC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXQoKS4qLworCisgIHVpbnQzMl90IElDMlByZXNjYWxlcjsgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMiBpbnB1dCBwcmVzY2FsZXIgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ1BTQy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fSUNfU2V0UHJlc2NhbGVyKCkuKi8KKworICB1aW50MzJfdCBJQzJGaWx0ZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTIgaW5wdXQgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfRklMVEVSLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRGaWx0ZXIoKS4qLworCit9IExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBIYWxsIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgdWludDMyX3QgSUMxUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgVEkxIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfSUNfUE9MQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldFBvbGFyaXR5KCkuKi8KKworICB1aW50MzJfdCBJQzFQcmVzY2FsZXI7ICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSTEgaW5wdXQgcHJlc2NhbGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc2NhbGVyIG11c3QgYmUgc2V0IHRvIGdldCBhIG1heGltdW0gY291bnRlciBwZXJpb2QgbG9uZ2VyIHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGludGVydmFsIGJldHdlZW4gMiBjb25zZWN1dGl2ZSBjaGFuZ2VzIG9uIHRoZSBIYWxsIGlucHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0lDUFNDLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoKS4qLworCisgIHVpbnQzMl90IElDMUZpbHRlcjsgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFRJMSBpbnB1dCBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19JQ19GSUxURVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0lDX1NldEZpbHRlcigpLiovCisKKyAgdWludDMyX3QgQ29tbXV0YXRpb25EZWxheTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBwb3NpdGl2ZSBwdWxzZSAoVFJHTyBldmVudCkgaXMgZ2VuZXJhdGVkIHdpdGggYSBwcm9ncmFtbWFibGUgZGVsYXkgZXZlcnkgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjaGFuZ2Ugb2NjdXJzIG9uIHRoZSBIYWxsIGlucHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMHgwMDAwIGFuZCBNYXhfRGF0YSA9IDB4RkZGRi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMigpLiovCit9IExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIEJEVFIgKEJyZWFrIGFuZCBEZWFkIFRpbWUpIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBPU1NSU3RhdGU7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIE9mZi1TdGF0ZSBzZWxlY3Rpb24gdXNlZCBpbiBSdW4gbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfT1NTUgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldE9mZlN0YXRlcygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2Fubm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAyIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgT1NTSVN0YXRlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBPZmYtU3RhdGUgdXNlZCBpbiBJZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19PU1NJCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fU2V0T2ZmU3RhdGVzKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW5ub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDIgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBMb2NrTGV2ZWw7ICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIExPQ0sgbGV2ZWwgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfTE9DS0xFVkVMCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhlIExPQ0sgYml0cyBjYW4gYmUgd3JpdHRlbiBvbmx5IG9uY2UgYWZ0ZXIgdGhlIHJlc2V0LiBPbmNlIHRoZSBUSU14X0JEVFIgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gd3JpdHRlbiwgdGhlaXIgY29udGVudCBpcyBmcm96ZW4gdW50aWwgdGhlIG5leHQgcmVzZXQuKi8KKworICB1aW50OF90IERlYWRUaW1lOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRlbGF5IHRpbWUgYmV0d2VlbiB0aGUgc3dpdGNoaW5nLW9mZiBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGluZy1vbiBvZiB0aGUgb3V0cHV0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4RkYuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fT0NfU2V0RGVhZFRpbWUoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEsIDIgb3IgMyBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQxNl90IEJyZWFrU3RhdGU7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBUSU0gQnJlYWsgaW5wdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9FbmFibGVCUksoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWtQb2xhcml0eTsgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsgSW5wdXQgcGluIHBvbGFyaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9MTF9FQ19CUkVBS19QT0xBUklUWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0NvbmZpZ0JSSygpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgVGhpcyBiaXQtZmllbGQgY2FuIG5vdCBiZSBtb2RpZmllZCBhcyBsb25nIGFzIExPQ0sgbGV2ZWwgMSBoYXMgYmVlbiBwcm9ncmFtbWVkLiAqLworCisgIHVpbnQzMl90IEJyZWFrRmlsdGVyOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrIEZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUtfRklMVEVSCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9USU1fQ29uZmlnQlJLKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWsyU3RhdGU7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFRJTSBCcmVhazIgaW5wdXQgaXMgZW5hYmxlZCBvciBub3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLMl9FTkFCTEUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbnMgQHJlZiBMTF9USU1fRW5hYmxlQlJLMigpIG9yIEByZWYgTExfVElNX0Rpc2FibGVCUksyKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCisKKyAgdWludDMyX3QgQnJlYWsyUG9sYXJpdHk7ICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgVElNIEJyZWFrMiBJbnB1dCBwaW4gcG9sYXJpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0xMX0VDX0JSRUFLMl9QT0xBUklUWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0NvbmZpZ0JSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBCcmVhazJGaWx0ZXI7ICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUSU0gQnJlYWsyIEZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQlJFQUsyX0ZJTFRFUgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX0NvbmZpZ0JSSzIoKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBub3RlIFRoaXMgYml0LWZpZWxkIGNhbiBub3QgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyBMT0NLIGxldmVsIDEgaGFzIGJlZW4gcHJvZ3JhbW1lZC4gKi8KKworICB1aW50MzJfdCBBdXRvbWF0aWNPdXRwdXQ7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVElNIEF1dG9tYXRpYyBPdXRwdXQgZmVhdHVyZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTExfRUNfQVVUT01BVElDT1VUUFVUX0VOQUJMRQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1RJTV9FbmFibGVBdXRvbWF0aWNPdXRwdXQoKSBvciBAcmVmIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0KCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIGJpdC1maWVsZCBjYW4gbm90IGJlIG1vZGlmaWVkIGFzIGxvbmcgYXMgTE9DSyBsZXZlbCAxIGhhcyBiZWVuIHByb2dyYW1tZWQuICovCit9IExMX1RJTV9CRFRSX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFRJTSBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVElNX1JlYWRSZWcgZnVuY3Rpb24uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1NSX1VJRiAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX1VJRiAgICAgICAgICAgLyohPCBVcGRhdGUgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMUlGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMUlGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MySUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MySUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzNJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzNJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDNElGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNElGICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0M1SUYgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0M1SUYgICAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSA1IGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzZJRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzZJRiAgICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDYgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NPTUlGICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NPTUlGICAgICAgICAgLyohPCBDT00gaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX1RJRiAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX1RJRiAgICAgICAgICAgLyohPCBUcmlnZ2VyIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9CSUYgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9CSUYgICAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0IySUYgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0IySUYgICAgICAgICAgLyohPCBTZWNvbmQgYnJlYWsgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDMU9GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDMU9GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgMSBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9DQzJPRiAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9DQzJPRiAgICAgICAgIC8qITwgQ2FwdHVyZS9Db21wYXJlIDIgb3ZlcmNhcHR1cmUgZmxhZyAqLworI2RlZmluZSBMTF9USU1fU1JfQ0MzT0YgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU1JfQ0MzT0YgICAgICAgICAvKiE8IENhcHR1cmUvQ29tcGFyZSAzIG92ZXJjYXB0dXJlIGZsYWcgKi8KKyNkZWZpbmUgTExfVElNX1NSX0NDNE9GICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NSX0NDNE9GICAgICAgICAgLyohPCBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyY2FwdHVyZSBmbGFnICovCisjZGVmaW5lIExMX1RJTV9TUl9TQklGICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TUl9TQklGICAgICAgICAgIC8qITwgU3lzdGVtIEJyZWFrIGludGVycnVwdCBmbGFnICAqLworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUtfRU5BQkxFIEJyZWFrIEVuYWJsZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBCcmVhayBmdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRU5BQkxFICAgICAgICAgICAgIFRJTV9CRFRSX0JLRSAgICAgICAgICAgIC8qITwgQnJlYWsgZnVuY3Rpb24gZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQlJFQUsyX0VOQUJMRSBCcmVhazIgRW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9ESVNBQkxFICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgQnJlYWsyIGZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRU5BQkxFICAgICAgICAgICAgIFRJTV9CRFRSX0JLMkUgICAgICAgICAgICAvKiE8IEJyZWFrMiBmdW5jdGlvbiBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19BVVRPTUFUSUNPVVRQVVRfRU5BQkxFIEF1dG9tYXRpYyBvdXRwdXQgZW5hYmxlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0FVVE9NQVRJQ09VVFBVVF9ESVNBQkxFICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBNT0UgY2FuIGJlIHNldCBvbmx5IGJ5IHNvZnR3YXJlICovCisjZGVmaW5lIExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRU5BQkxFICAgICAgICAgIFRJTV9CRFRSX0FPRSAgICAgICAgICAgIC8qITwgTU9FIGNhbiBiZSBzZXQgYnkgc29mdHdhcmUgb3IgYXV0b21hdGljYWxseSBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1RJTV9SZWFkUmVnIGFuZCAgTExfVElNX1dyaXRlUmVnIGZ1bmN0aW9ucy4KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRElFUl9VSUUgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9VSUUgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDMUlFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDMUlFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDEgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DQzJJRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DQzJJRSAgICAgICAvKiE8IENhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVElNX0RJRVJfQ0MzSUUgICAgICAgICAgICAgICAgICAgICAgVElNX0RJRVJfQ0MzSUUgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgMyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0NDNElFICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0NDNElFICAgICAgIC8qITwgQ2FwdHVyZS9jb21wYXJlIDQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9USU1fRElFUl9DT01JRSAgICAgICAgICAgICAgICAgICAgICBUSU1fRElFUl9DT01JRSAgICAgICAvKiE8IENPTSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX1RJRSAgICAgICAgIC8qITwgVHJpZ2dlciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1RJTV9ESUVSX0JJRSAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ESUVSX0JJRSAgICAgICAgIC8qITwgQnJlYWsgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVVBEQVRFU09VUkNFIFVwZGF0ZSBTb3VyY2UKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENvdW50ZXIgb3ZlcmZsb3cvdW5kZXJmbG93LCBTZXR0aW5nIHRoZSBVRyBiaXQgb3IgVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyIGdlbmVyYXRlcyBhbiB1cGRhdGUgcmVxdWVzdCAqLworI2RlZmluZSBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIgICAgICAgICAgICBUSU1fQ1IxX1VSUyAgICAgICAgICAvKiE8IE9ubHkgY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cgZ2VuZXJhdGVzIGFuIHVwZGF0ZSByZXF1ZXN0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PTkVQVUxTRU1PREUgT25lIFB1bHNlIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT05FUFVMU0VNT0RFX1NJTkdMRSAgICAgICAgICAgICBUSU1fQ1IxX09QTSAgICAgICAgICAvKiE8IENvdW50ZXIgaXMgbm90IHN0b3BwZWQgYXQgdXBkYXRlIGV2ZW50ICovCisjZGVmaW5lIExMX1RJTV9PTkVQVUxTRU1PREVfUkVQRVRJVElWRSAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITwgQ291bnRlciBzdG9wcyBjb3VudGluZyBhdCB0aGUgbmV4dCB1cGRhdGUgZXZlbnQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJNT0RFIENvdW50ZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9VUCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgIC8qITxDb3VudGVyIHVzZWQgYXMgdXBjb3VudGVyICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOICAgICAgICAgICAgICAgIFRJTV9DUjFfRElSICAgICAgICAgIC8qITwgQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAgICAgICAgICAgIFRJTV9DUjFfQ01TXzAgICAgICAgIC8qITwgVGhlIGNvdW50ZXIgY291bnRzIHVwIGFuZCBkb3duIGFsdGVybmF0aXZlbHkuIE91dHB1dCBjb21wYXJlIGludGVycnVwdCBmbGFncyBvZiBvdXRwdXQgY2hhbm5lbHMgIGFyZSBzZXQgb25seSB3aGVuIHRoZSBjb3VudGVyIGlzIGNvdW50aW5nIGRvd24uICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTiAgICAgICAgIFRJTV9DUjFfQ01TXzEgICAgICAgIC8qITxUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgKi8KKyNkZWZpbmUgTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOICAgICAgVElNX0NSMV9DTVMgICAgICAgICAgLyohPCBUaGUgY291bnRlciBjb3VudHMgdXAgYW5kIGRvd24gYWx0ZXJuYXRpdmVseS4gT3V0cHV0IGNvbXBhcmUgaW50ZXJydXB0IGZsYWdzIG9mIG91dHB1dCBjaGFubmVscyAgYXJlIHNldCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgaXMgY291bnRpbmcgdXAgb3IgZG93bi4gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NMT0NLRElWSVNJT04gQ2xvY2sgRGl2aXNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IHREVFM9dENLX0lOVCAqLworI2RlZmluZSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyICAgICAgICAgICAgICBUSU1fQ1IxX0NLRF8wICAgICAgICAvKiE8IHREVFM9Mip0Q0tfSU5UICovCisjZGVmaW5lIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQgICAgICAgICAgICAgIFRJTV9DUjFfQ0tEXzEgICAgICAgIC8qITwgdERUUz00KnRDS19JTlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NPVU5URVJESVJFQ1RJT04gQ291bnRlciBEaXJlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ09VTlRFUkRJUkVDVElPTl9VUCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFRpbWVyIGNvdW50ZXIgY291bnRzIHVwICovCisjZGVmaW5lIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX0RPV04gICAgICAgICAgIFRJTV9DUjFfRElSICAgICAgICAgIC8qITwgVGltZXIgY291bnRlciBjb3VudHMgZG93biAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0NVUERBVEVTT1VSQ0UgQ2FwdHVyZSBDb21wYXJlICBVcGRhdGUgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfT05MWSAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9ubHkgKi8KKyNkZWZpbmUgTExfVElNX0NDVVBEQVRFU09VUkNFX0NPTUdfQU5EX1RSR0kgICAgVElNX0NSMl9DQ1VTICAgICAgICAgLyohPCBDYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIGFyZSB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIENPTUcgYml0IG9yIHdoZW4gYSByaXNpbmcgZWRnZSBvY2N1cnMgb24gdHJpZ2dlciBpbnB1dCAoVFJHSSkgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NDRE1BUkVRVUVTVCBDYXB0dXJlIENvbXBhcmUgRE1BIFJlcXVlc3QKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX0NDICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdCBzZW50IHdoZW4gQ0N4IGV2ZW50IG9jY3VycyAqLworI2RlZmluZSBMTF9USU1fQ0NETUFSRVFVRVNUX1VQREFURSAgICAgICAgICAgICBUSU1fQ1IyX0NDRFMgICAgICAgICAvKiE8IENDeCBETUEgcmVxdWVzdHMgc2VudCB3aGVuIHVwZGF0ZSBldmVudCBvY2N1cnMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0xPQ0tMRVZFTCBMb2NrIExldmVsCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF9PRkYgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCBMT0NLIE9GRiAtIE5vIGJpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8xICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18wICAgICAgLyohPCBMT0NLIExldmVsIDEgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8yICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DS18xICAgICAgLyohPCBMT0NLIExldmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0xPQ0tMRVZFTF8zICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfTE9DSyAgICAgICAgLyohPCBMT0NLIExldmVsIDMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0NIQU5ORUwgQ2hhbm5lbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIMSAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDMUUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDFOICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFORSAgICAvKiE8IFRpbWVyIGNvbXBsZW1lbnRhcnkgb3V0cHV0IGNoYW5uZWwgMSAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDIgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzJFICAgICAvKiE8IFRpbWVyIGlucHV0L291dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gyTiAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MyTkUgICAgLyohPCBUaW1lciBjb21wbGVtZW50YXJ5IG91dHB1dCBjaGFubmVsIDIgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0gzICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MzRSAgICAgLyohPCBUaW1lciBpbnB1dC9vdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NIM04gICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDM05FICAgIC8qITwgVGltZXIgY29tcGxlbWVudGFyeSBvdXRwdXQgY2hhbm5lbCAzICovCisjZGVmaW5lIExMX1RJTV9DSEFOTkVMX0NINCAgICAgICAgICAgICAgICAgICAgIFRJTV9DQ0VSX0NDNEUgICAgIC8qITwgVGltZXIgaW5wdXQvb3V0cHV0IGNoYW5uZWwgNCAqLworI2RlZmluZSBMTF9USU1fQ0hBTk5FTF9DSDUgICAgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzVFICAgICAvKiE8IFRpbWVyIG91dHB1dCBjaGFubmVsIDUgKi8KKyNkZWZpbmUgTExfVElNX0NIQU5ORUxfQ0g2ICAgICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0M2RSAgICAgLyohPCBUaW1lciBvdXRwdXQgY2hhbm5lbCA2ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ1NUQVRFIE91dHB1dCBDb25maWd1cmF0aW9uIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBPQ3ggaXMgbm90IGFjdGl2ZSAqLworI2RlZmluZSBMTF9USU1fT0NTVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICBUSU1fQ0NFUl9DQzFFICAgICAgICAgICAvKiE8IE9DeCBzaWduYWwgaXMgb3V0cHV0IG9uIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwaW4gKi8KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DTU9ERSBPdXRwdXQgQ29uZmlndXJhdGlvbiBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9GUk9aRU4gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIG91dHB1dCBjb21wYXJlIHJlZ2lzdGVyIFRJTXhfQ0NSeSBhbmQgdGhlIGNvdW50ZXIgVElNeF9DTlQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3V0cHV0IGNoYW5uZWwgbGV2ZWwgKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgaGlnaCBvbiBjb21wYXJlIG1hdGNoKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9JTkFDVElWRSAgICAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPE9DeVJFRiBpcyBmb3JjZWQgbG93IG9uIGNvbXBhcmUgbWF0Y2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1RPR0dMRSAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMSB8IFRJTV9DQ01SMV9PQzFNXzApICAgICAgICAgICAgICAgICAgICAvKiE8T0N5UkVGIHRvZ2dsZXMgb24gY29tcGFyZSBtYXRjaCovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFICAgICAgICAgIFRJTV9DQ01SMV9PQzFNXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGxvdyovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8yIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITxPQ3lSRUYgaXMgZm9yY2VkIGhpZ2gqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX1BXTTEgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMiB8IFRJTV9DQ01SMV9PQzFNXzEpICAgICAgICAgICAgICAgICAgICAvKiE8SW4gdXBjb3VudGluZywgY2hhbm5lbCB5IGlzIGFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPFRJTXhfQ0NSeSBlbHNlIGluYWN0aXZlLiAgSW4gZG93bmNvdW50aW5nLCBjaGFubmVsIHkgaXMgaW5hY3RpdmUgYXMgbG9uZyBhcyBUSU14X0NOVD5USU14X0NDUnkgZWxzZSBhY3RpdmUuKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9QV00yICAgICAgICAgICAgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzIgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMCkgLyohPEluIHVwY291bnRpbmcsIGNoYW5uZWwgeSBpcyBpbmFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPFRJTXhfQ0NSeSBlbHNlIGFjdGl2ZS4gIEluIGRvd25jb3VudGluZywgY2hhbm5lbCB5IGlzIGFjdGl2ZSBhcyBsb25nIGFzIFRJTXhfQ05UPlRJTXhfQ0NSeSBlbHNlIGluYWN0aXZlKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMSAgICAgICAgICAgICAgVElNX0NDTVIxX09DMU1fMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPFJldHJpZ2VycmFibGUgT1BNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIgICAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCkgICAgICAgICAgICAgICAgICAgIC8qITxSZXRyaWdlcnJhYmxlIE9QTSBtb2RlIDIqLworI2RlZmluZSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEgICAgICAgICAgICAoVElNX0NDTVIxX09DMU1fMyB8IFRJTV9DQ01SMV9PQzFNXzIpICAgICAgICAgICAgICAgICAgICAvKiE8Q29tYmluZWQgUFdNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMiAgICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU1fMCB8IFRJTV9DQ01SMV9PQzFNXzIpIC8qITxDb21iaW5lZCBQV00gbW9kZSAyKi8KKyNkZWZpbmUgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEgICAgICAgICAgKFRJTV9DQ01SMV9PQzFNXzMgfCBUSU1fQ0NNUjFfT0MxTV8xIHwgVElNX0NDTVIxX09DMU1fMikgLyohPEFzeW1tZXRyaWMgUFdNIG1vZGUgMSovCisjZGVmaW5lIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yICAgICAgICAgIChUSU1fQ0NNUjFfT0MxTV8zIHwgVElNX0NDTVIxX09DMU0pICAgICAgICAgICAgICAgICAgICAgIC8qITxBc3ltbWV0cmljIFBXTSBtb2RlIDIqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfT0NQT0xBUklUWSBPdXRwdXQgQ29uZmlndXJhdGlvbiBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8IE9DeGFjdGl2ZSBoaWdoKi8KKyNkZWZpbmUgTExfVElNX09DUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgICAgVElNX0NDRVJfQ0MxUCAgICAgICAgICAgICAgIC8qITwgT0N4YWN0aXZlIGxvdyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PQ0lETEVTVEFURSBPdXRwdXQgQ29uZmlndXJhdGlvbiBJZGxlIFN0YXRlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DSURMRVNUQVRFX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPE9DeD0wIChhZnRlciBhIGRlYWQtdGltZSBpZiBPQyBpcyBpbXBsZW1lbnRlZCkgd2hlbiBNT0U9MCovCisjZGVmaW5lIExMX1RJTV9PQ0lETEVTVEFURV9ISUdIICAgICAgICAgICAgICAgIFRJTV9DUjJfT0lTMSAgICAgICAgICAgIC8qITxPQ3g9MSAoYWZ0ZXIgYSBkZWFkLXRpbWUgaWYgT0MgaXMgaW1wbGVtZW50ZWQpIHdoZW4gTU9FPTAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfR1JPVVBDSDUgR1JPVVBDSDUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBObyBlZmZlY3Qgb2YgT0M1UkVGIG9uIE9DMVJFRkMsIE9DMlJFRkMgYW5kIE9DM1JFRkMgKi8KKyNkZWZpbmUgTExfVElNX0dST1VQQ0g1X09DMVJFRkMgICAgICAgICAgICAgICAgVElNX0NDUjVfR0M1QzEgICAgICAgIC8qITwgT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGICovCisjZGVmaW5lIExMX1RJTV9HUk9VUENINV9PQzJSRUZDICAgICAgICAgICAgICAgIFRJTV9DQ1I1X0dDNUMyICAgICAgICAvKiE8IE9DMlJFRkMgaXMgdGhlIGxvZ2ljYWwgQU5EIG9mIE9DMlJFRkMgYW5kIE9DNVJFRiAqLworI2RlZmluZSBMTF9USU1fR1JPVVBDSDVfT0MzUkVGQyAgICAgICAgICAgICAgICBUSU1fQ0NSNV9HQzVDMyAgICAgICAgLyohPCBPQzNSRUZDIGlzIHRoZSBsb2dpY2FsIEFORCBvZiBPQzNSRUZDIGFuZCBPQzVSRUYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0FDVElWRUlOUFVUIEFjdGl2ZSBJbnB1dCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkgICAgICAgICAgICAoVElNX0NDTVIxX0NDMVNfMCA8PCAxNlUpIC8qITwgSUN4IGlzIG1hcHBlZCBvbiBUSXggKi8KKyNkZWZpbmUgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkgICAgICAgICAgKFRJTV9DQ01SMV9DQzFTXzEgPDwgMTZVKSAvKiE8IElDeCBpcyBtYXBwZWQgb24gVEl5ICovCisjZGVmaW5lIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMgICAgICAgICAgICAgICAgIChUSU1fQ0NNUjFfQ0MxUyA8PCAxNlUpICAgLyohPCBJQ3ggaXMgbWFwcGVkIG9uIFRSQyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNQU0MgSW5wdXQgQ29uZmlndXJhdGlvbiBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgLyohPCBObyBwcmVzY2FsZXIsIGNhcHR1cmUgaXMgZG9uZSBlYWNoIHRpbWUgYW4gZWRnZSBpcyBkZXRlY3RlZCBvbiB0aGUgY2FwdHVyZSBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWMiAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQ18wIDw8IDE2VSkgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSAyIGV2ZW50cyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWNCAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQ18xIDw8IDE2VSkgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cyAqLworI2RlZmluZSBMTF9USU1fSUNQU0NfRElWOCAgICAgICAgICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMVBTQyA8PCAxNlUpICAgICAgLyohPCBDYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfSUNfRklMVEVSIElucHV0IENvbmZpZ3VyYXRpb24gRmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTm8gZmlsdGVyLCBzYW1wbGluZyBpcyBkb25lIGF0IGZEVFMgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzAgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040ICAgICAgICAgICAgICAoVElNX0NDTVIxX0lDMUZfMSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAgICAgKFRJTV9DQ01SMV9JQzFGXzIgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjggICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzIgfCBUSU1fQ0NNUjFfSUMxRl8xKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYgICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRl8zIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044ICAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8wKSA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMTYsIE49NSAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8xIHwgVElNX0NDTVIxX0lDMUZfMCkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044ICAgICAgICAgICAgICgoVElNX0NDTVIxX0lDMUZfMyB8IFRJTV9DQ01SMV9JQzFGXzIpIDw8IDE2VSkgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUgICAgICAgICAgICAgKChUSU1fQ0NNUjFfSUMxRl8zIHwgVElNX0NDTVIxX0lDMUZfMiB8IFRJTV9DQ01SMV9JQzFGXzApIDw8IDE2VSkgIC8qITwgZlNBTVBMSU5HPWZEVFMvMzIsIE49NSAqLworI2RlZmluZSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgICAgICAoKFRJTV9DQ01SMV9JQzFGXzMgfCBUSU1fQ0NNUjFfSUMxRl8yIHwgVElNX0NDTVIxX0lDMUZfMSkgPDwgMTZVKSAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044ICAgICAgICAgICAgIChUSU1fQ0NNUjFfSUMxRiA8PCAxNlUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0lDX1BPTEFSSVRZIElucHV0IENvbmZpZ3VyYXRpb24gUG9sYXJpdHkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjaXJjdWl0IGlzIHNlbnNpdGl2ZSB0byBUSXhGUDEgcmlzaW5nIGVkZ2UsIFRJeEZQMSBpcyBub3QgaW52ZXJ0ZWQgKi8KKyNkZWZpbmUgTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICAgICAgVElNX0NDRVJfQ0MxUCAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY2lyY3VpdCBpcyBzZW5zaXRpdmUgdG8gVEl4RlAxIGZhbGxpbmcgZWRnZSwgVEl4RlAxIGlzIGludmVydGVkICovCisjZGVmaW5lIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSAgICAgICAgICAgIChUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MxTlApIC8qITwgVGhlIGNpcmN1aXQgaXMgc2Vuc2l0aXZlIHRvIGJvdGggVEl4RlAxIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlcywgVEl4RlAxIGlzIG5vdCBpbnZlcnRlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfQ0xPQ0tTT1VSQ0UgQ2xvY2sgU291cmNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSB0aW1lciBpcyBjbG9ja2VkIGJ5IHRoZSBpbnRlcm5hbCBjbG9jayBwcm92aWRlZCBmcm9tIHRoZSBSQ0MgKi8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMSAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEgfCBUSU1fU01DUl9TTVNfMCkgICAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiBhIHNlbGVjdGVkIGlucHV0Ki8KKyNkZWZpbmUgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMiAgICAgICAgICAgVElNX1NNQ1JfRUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgY291bnRzIGF0IGVhY2ggcmlzaW5nIG9yIGZhbGxpbmcgZWRnZSBvbiB0aGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBFVFIgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VOQ09ERVJNT0RFIEVuY29kZXIgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAxLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTFGUDEgZWRnZSBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIgICAgICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAyLCB4MiBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBUSTJGUDIgZWRnZSBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsICovCisjZGVmaW5lIExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9TTVNfMSB8IFRJTV9TTUNSX1NNU18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBRdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAzLCB4NCBtb2RlIC0gQ291bnRlciBjb3VudHMgdXAvZG93biBvbiBib3RoIFRJMUZQMSBhbmQgVEkyRlAyIGVkZ2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgdGhlIG90aGVyIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUkdPIFRyaWdnZXIgT3V0cHV0CisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVRyBiaXQgZnJvbSB0aGUgVElNeF9FR1IgcmVnaXN0ZXIgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19FTkFCTEUgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgRW5hYmxlIHNpZ25hbCAoQ05UX0VOKSBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9UUkdPX1VQREFURSAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVXBkYXRlIGV2ZW50IGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgKi8KKyNkZWZpbmUgTExfVElNX1RSR09fQ0MxSUYgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAgICAgICAgICAgICAgICAgLyohPCBDQzEgY2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzFSRUYgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DMVJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzJSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzApICAgICAgICAgICAgICAgICAvKiE8IE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzNSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEpICAgICAgICAgICAgICAgICAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworI2RlZmluZSBMTF9USU1fVFJHT19PQzRSRUYgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVNfMiB8IFRJTV9DUjJfTU1TXzEgfCBUSU1fQ1IyX01NU18wKSAvKiE8IE9DNFJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVFJHTzIgVHJpZ2dlciBPdXRwdXQgMgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9SRVNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVRyBiaXQgZnJvbSB0aGUgVElNeF9FR1IgcmVnaXN0ZXIgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIEVuYWJsZSBzaWduYWwgKENOVF9FTikgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9VUERBVEUgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVcGRhdGUgZXZlbnQgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9DQzFGICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDQzEgY2FwdHVyZSBvciBhIGNvbXBhcmUgbWF0Y2ggaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzEgICAgICAgICAgICAgICAgICAgICAgIFRJTV9DUjJfTU1TMl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzFSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0MyICAgICAgICAgICAgICAgICAgICAgICAoVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0MyUkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DMyAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TMl8yIHwgVElNX0NSMl9NTVMyXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DM1JFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzQgICAgICAgICAgICAgICAgICAgICAgIChUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgc2lnbmFsIGlzIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M1ICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ1IyX01NUzJfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgT0M1UkVGIHNpZ25hbCBpcyB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNiAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DNlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisjZGVmaW5lIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HRkFMTElORyAgICAgICAgIChUSU1fQ1IyX01NUzJfMyB8IFRJTV9DUjJfTU1TMl8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBPQzRSRUYgcmlzaW5nIG9yIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M2X1JJU0lOR0ZBTExJTkcgICAgICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMSB8IFRJTV9DUjJfTU1TMl8wKSAgICAgICAgICAgICAgICAgIC8qITwgT0M2UkVGIHJpc2luZyBvciBmYWxsaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORyAgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE9DNFJFRiBvciBPQzZSRUYgcmlzaW5nIGVkZ2VzIGFyZSB1c2VkIGFzIHRyaWdnZXIgb3V0cHV0IDIgKi8KKyNkZWZpbmUgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X0ZBTExJTkcgICAgKFRJTV9DUjJfTU1TMl8zIHwgVElNX0NSMl9NTVMyXzIgfCBUSU1fQ1IyX01NUzJfMCkgICAgICAgICAgICAgICAgICAvKiE8IE9DNFJFRiByaXNpbmcgb3IgT0M2UkVGIGZhbGxpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfUklTSU5HICAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8VElNX0NSMl9NTVMyXzEpICAgICAgICAgICAgICAgICAgIC8qITwgT0M1UkVGIG9yIE9DNlJFRiByaXNpbmcgZWRnZXMgYXJlIHVzZWQgYXMgdHJpZ2dlciBvdXRwdXQgMiAqLworI2RlZmluZSBMTF9USU1fVFJHTzJfT0M1X1JJU0lOR19PQzZfRkFMTElORyAgICAoVElNX0NSMl9NTVMyXzMgfCBUSU1fQ1IyX01NUzJfMiB8IFRJTV9DUjJfTU1TMl8xIHwgVElNX0NSMl9NTVMyXzApIC8qITwgT0M1UkVGIHJpc2luZyBvciBPQzZSRUYgZmFsbGluZyBlZGdlcyBhcmUgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19TTEFWRU1PREUgU2xhdmUgTW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfRElTQUJMRUQgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU2xhdmUgbW9kZSBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX1JFU0VUICAgICAgICAgICAgICAgICBUSU1fU01DUl9TTVNfMiAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJlc2V0IE1vZGUgLSBSaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBpbnB1dCAoVFJHSSkgcmVpbml0aWFsaXplcyB0aGUgY291bnRlciAqLworI2RlZmluZSBMTF9USU1fU0xBVkVNT0RFX0dBVEVEICAgICAgICAgICAgICAgICAoVElNX1NNQ1JfU01TXzIgfCBUSU1fU01DUl9TTVNfMCkgICAvKiE8IEdhdGVkIE1vZGUgLSBUaGUgY291bnRlciBjbG9jayBpcyBlbmFibGVkIHdoZW4gdGhlIHRyaWdnZXIgaW5wdXQgKFRSR0kpIGlzIGhpZ2ggKi8KKyNkZWZpbmUgTExfVElNX1NMQVZFTU9ERV9UUklHR0VSICAgICAgICAgICAgICAgKFRJTV9TTUNSX1NNU18yIHwgVElNX1NNQ1JfU01TXzEpICAgLyohPCBUcmlnZ2VyIE1vZGUgLSBUaGUgY291bnRlciBzdGFydHMgYXQgYSByaXNpbmcgZWRnZSBvZiB0aGUgdHJpZ2dlciBUUkdJICovCisjZGVmaW5lIExMX1RJTV9TTEFWRU1PREVfQ09NQklORURfUkVTRVRUUklHR0VSIFRJTV9TTUNSX1NNU18zICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ29tYmluZWQgcmVzZXQgKyB0cmlnZ2VyIG1vZGUgLSBSaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciBpbnB1dCAoVFJHSSkgIHJlaW5pdGlhbGl6ZXMgdGhlIGNvdW50ZXIsIGdlbmVyYXRlcyBhbiB1cGRhdGUgb2YgdGhlIHJlZ2lzdGVycyBhbmQgc3RhcnRzIHRoZSBjb3VudGVyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19UUyBUcmlnZ2VyIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMCAoSVRSMCkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIxICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMSAoSVRSMSkgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIyICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMiAoSVRSMikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19JVFIzICAgICAgICAgICAgICAgICAgICAgICAgIChUSU1fU01DUl9UU18wIHwgVElNX1NNQ1JfVFNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEludGVybmFsIFRyaWdnZXIgMyAoSVRSMykgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9UU19USTFGX0VEICAgICAgICAgICAgICAgICAgICAgIFRJTV9TTUNSX1RTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJMSBFZGdlIERldGVjdG9yIChUSTFGX0VEKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMUZQMSAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgVGltZXIgSW5wdXQgMSAoVEkxRlAxKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX1RJMkZQMiAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgVGltZXIgSW5wdXQgMiAoVEkxMlAyKSBpcyB1c2VkIGFzIHRyaWdnZXIgaW5wdXQgKi8KKyNkZWZpbmUgTExfVElNX1RTX0VUUkYgICAgICAgICAgICAgICAgICAgICAgICAgKFRJTV9TTUNSX1RTXzIgfCBUSU1fU01DUl9UU18xIHwgVElNX1NNQ1JfVFNfMCkgICAgICAgICAgICAgICAgIC8qITwgRmlsdGVyZWQgZXh0ZXJuYWwgVHJpZ2dlciAoRVRSRikgaXMgdXNlZCBhcyB0cmlnZ2VyIGlucHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUE9MQVJJVFkgRXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJfUE9MQVJJVFlfTk9OSU5WRVJURUQgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRVRSIGlzIG5vbi1pbnZlcnRlZCwgYWN0aXZlIGF0IGhpZ2ggbGV2ZWwgb3IgcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QT0xBUklUWV9JTlZFUlRFRCAgICAgICAgICAgVElNX1NNQ1JfRVRQICAgICAgICAgICAgLyohPCBFVFIgaXMgaW52ZXJ0ZWQsIGFjdGl2ZSBhdCBsb3cgbGV2ZWwgb3IgZmFsbGluZyBlZGdlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19FVFJfUFJFU0NBTEVSIEV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBFVFIgcHJlc2NhbGVyIE9GRiAqLworI2RlZmluZSBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICBUSU1fU01DUl9FVFBTXzAgICAgICAgICAvKiE8IEVUUiBmcmVxdWVuY3kgaXMgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgIFRJTV9TTUNSX0VUUFNfMSAgICAgICAgIC8qITwgRVRSIGZyZXF1ZW5jeSBpcyBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWOCAgICAgICAgICAgICAgVElNX1NNQ1JfRVRQUyAgICAgICAgICAgLyohPCBFVFIgZnJlcXVlbmN5IGlzIGRpdmlkZWQgYnkgOCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRVRSX0ZJTFRFUiBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBObyBmaWx0ZXIsIHNhbXBsaW5nIGlzIGRvbmUgYXQgZkRUUyAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49MiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9ONCAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49NCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZDS19JTlQsIE49OCAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAgICBUSU1fU01DUl9FVEZfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX044ICAgICAgICAgICAgIChUSU1fU01DUl9FVEZfMiB8IFRJTV9TTUNSX0VURl8wKSAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjRfTjYgICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8yIHwgVElNX1NNQ1JfRVRGXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49NiAqLworI2RlZmluZSBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgICAoVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSB8IFRJTV9TTUNSX0VURl8wKSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9FVFJfRklMVEVSX0ZESVY4X042ICAgICAgICAgICAgIFRJTV9TTUNSX0VURl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjggICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzApICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X041ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzEpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X042ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzEgfCBUSU1fU01DUl9FVEZfMCkgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjE2X044ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIpICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX041ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMCkgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX042ICAgICAgICAgICAgKFRJTV9TTUNSX0VURl8zIHwgVElNX1NNQ1JfRVRGXzIgfCBUSU1fU01DUl9FVEZfMSkgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0VUUl9GSUxURVJfRkRJVjMyX044ICAgICAgICAgICAgVElNX1NNQ1JfRVRGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0VUUlNPVVJDRSBFeHRlcm5hbCBUcmlnZ2VyIFNvdXJjZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9FVFJTT1VSQ0VfR1BJTyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9FVFJTT1VSQ0VfQ09NUDEgICAgICAgICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fRVRSU09VUkNFX0NPTVAyICAgICAgICAgICAgICAgICBUSU0xX0FGMV9FVFJTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9BREMxX0FXRDEgICAgICAgICAgICAgKFRJTTFfQUYxX0VUUlNFTF8xIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBBREMxIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX1RJTV9FVFJTT1VSQ0VfQURDMV9BV0QyICAgICAgICAgICAgIFRJTTFfQUYxX0VUUlNFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFVFIgaW5wdXQgaXMgY29ubmVjdGVkIHRvIEFEQzEgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX0VUUlNPVVJDRV9BREMxX0FXRDMgICAgICAgICAgICAgKFRJTTFfQUYxX0VUUlNFTF8yIHwgVElNMV9BRjFfRVRSU0VMXzApIC8qITwgRVRSIGlucHV0IGlzIGNvbm5lY3RlZCB0byBBREMxIGFuYWxvZyB3YXRjaGRvZyAzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19QT0xBUklUWSBicmVhayBwb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19QT0xBUklUWV9MT1cgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgLyohPCBCcmVhayBpbnB1dCBCUksgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfSElHSCAgICAgICAgICAgICBUSU1fQkRUUl9CS1AgICAgICAgICAgICAgIC8qITwgQnJlYWsgaW5wdXQgQlJLIGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CUkVBS19GSUxURVIgYnJlYWsgZmlsdGVyCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAvKiE8IE5vIGZpbHRlciwgQlJLIGFjdHMgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OMiAgICAgICAgICAgMHgwMDAxMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTIgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9ONCAgICAgICAgICAgMHgwMDAyMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTQgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9OOCAgICAgICAgICAgMHgwMDAzMDAwMFUgICAvKiE8IGZTQU1QTElORz1mQ0tfSU5ULCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9ONiAgICAgICAgICAgMHgwMDA0MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX044ICAgICAgICAgICAweDAwMDUwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvMiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjYgICAgICAgICAgIDB4MDAwNjAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWNF9OOCAgICAgICAgICAgMHgwMDA3MDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzQsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X042ICAgICAgICAgICAweDAwMDgwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjggICAgICAgICAgIDB4MDAwOTAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy84LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjUgICAgICAgICAgMHgwMDBBMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjYgICAgICAgICAgMHgwMDBCMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjggICAgICAgICAgMHgwMDBDMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzE2LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjUgICAgICAgICAgMHgwMDBEMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTUgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjYgICAgICAgICAgMHgwMDBFMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjggICAgICAgICAgMHgwMDBGMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzMyLCBOPTggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9QT0xBUklUWSBCUkVBSzIgUE9MQVJJVFkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGxvdyAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICBUSU1fQkRUUl9CSzJQICAgICAgICAgICAvKiE8IEJyZWFrIGlucHV0IEJSSzIgaXMgYWN0aXZlIGhpZ2ggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLMl9GSUxURVIgQlJFQUsyIEZJTFRFUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgLyohPCBObyBmaWx0ZXIsIEJSSyBhY3RzIGFzeW5jaHJvbm91c2x5ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yICAgICAgICAgIDB4MDAxMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj0yICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX040ICAgICAgICAgIDB4MDAyMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj00ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX044ICAgICAgICAgIDB4MDAzMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkNLX0lOVCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042ICAgICAgICAgIDB4MDA0MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8yLCBOPTYgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjggICAgICAgICAgMHgwMDUwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzIsIE49OCAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONiAgICAgICAgICAweDAwNjAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvNCwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044ICAgICAgICAgIDB4MDA3MDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy80LCBOPTggKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYgICAgICAgICAgMHgwMDgwMDAwMFUgICAvKiE8IGZTQU1QTElORz1mRFRTLzgsIE49NiAqLworI2RlZmluZSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOCAgICAgICAgICAweDAwOTAwMDAwVSAgIC8qITwgZlNBTVBMSU5HPWZEVFMvOCwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONSAgICAgICAgIDB4MDBBMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONiAgICAgICAgIDB4MDBCMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOCAgICAgICAgIDB4MDBDMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8xNiwgTj04ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONSAgICAgICAgIDB4MDBEMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj01ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONiAgICAgICAgIDB4MDBFMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj02ICovCisjZGVmaW5lIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOCAgICAgICAgIDB4MDBGMDAwMDBVICAgLyohPCBmU0FNUExJTkc9ZkRUUy8zMiwgTj04ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19PU1NJIE9TU0kKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fT1NTSV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFdoZW4gaW5hY3RpdmUsIE9DeC9PQ3hOIG91dHB1dHMgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1RJTV9PU1NJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFRJTV9CRFRSX09TU0kgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT3hDL09DeE4gb3V0cHV0cyBhcmUgZmlyc3QgZm9yY2VkIHdpdGggdGhlaXIgaW5hY3RpdmUgbGV2ZWwgdGhlbiBmb3JjZWQgdG8gdGhlaXIgaWRsZSBsZXZlbCBhZnRlciB0aGUgZGVhZHRpbWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09TU1IgT1NTUgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9PU1NSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgV2hlbiBpbmFjdGl2ZSwgT0N4L09DeE4gb3V0cHV0cyBhcmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVElNX09TU1JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgVElNX0JEVFJfT1NTUiAgICAgICAgICAgLyohPCBXaGVuIGluYWN0aXZlLCBPQy9PQ04gb3V0cHV0cyBhcmUgZW5hYmxlZCB3aXRoIHRoZWlyIGluYWN0aXZlIGxldmVsIGFzIHNvb24gYXMgQ0N4RT0xIG9yIENDeE5FPTEgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JSRUFLX0lOUFVUIEJSRUFLIElOUFVUCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4gICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgVElNeF9CS0lOIGlucHV0ICovCisjZGVmaW5lIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMiAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IFRJTXhfQktJTjIgaW5wdXQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX0JLSU5fU09VUkNFIEJLSU4gU09VUkNFCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0JLSU5fU09VUkNFX0JLSU4gICAgICAgICAgICAgICAgVElNMV9BRjFfQktJTkUgICAgICAvKiE8IEJLSU4gaW5wdXQgZnJvbSBBRiBjb250cm9sbGVyICovCisjaWYgZGVmaW5lZChDT01QMSkgJiYgZGVmaW5lZChDT01QMikKKyNkZWZpbmUgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDEgICAgICAgICAgICAgVElNMV9BRjFfQktDTVAxRSAgICAvKiE8IGludGVybmFsIHNpZ25hbDogQ09NUDEgb3V0cHV0ICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAyICAgICAgICAgICAgIFRJTTFfQUYxX0JLQ01QMkUgICAgLyohPCBpbnRlcm5hbCBzaWduYWw6IENPTVAyIG91dHB1dCAqLworI2VuZGlmIC8qIENPTVAxICYmIENPTVAyICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19CS0lOX1BPTEFSSVRZIEJLSU4gUE9MQVJJVFkKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fQktJTl9QT0xBUklUWV9MT1cgICAgICAgICAgICAgICBUSU0xX0FGMV9CS0lOUCAgICAgICAgICAgLyohPCBCUksgQktJTiBpbnB1dCBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIExMX1RJTV9CS0lOX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IEJSSyBCS0lOIGlucHV0IGlzIGFjdGl2ZSBoaWdoICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19ETUFCVVJTVF9CQVNFQUREUiBETUEgQnVyc3QgQmFzZSBBZGRyZXNzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NSMSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ1IxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NSMiAgICAgICAgICAgVElNX0RDUl9EQkFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ1IyIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NNQ1IgICAgICAgICAgVElNX0RDUl9EQkFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfU01DUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9ESUVSICAgICAgICAgIChUSU1fRENSX0RCQV8xIHwgIFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0RJRVIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfU1IgICAgICAgICAgICBUSU1fRENSX0RCQV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9TUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9FR1IgICAgICAgICAgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0VHUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMSAgICAgICAgIChUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIxIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIyICAgICAgICAgKFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NNUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NFUiAgICAgICAgICBUSU1fRENSX0RCQV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9DQ0VSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NOVCAgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ05UIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1BTQyAgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfUFNDIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FSUiAgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQVJSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1JDUiAgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfUkNSIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjEgICAgICAgICAgKFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSMSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IyICAgICAgICAgIChUSU1fRENSX0RCQV8zIHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEpICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDUjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMyAgICAgICAgICAoVElNX0RDUl9EQkFfMyB8IFRJTV9EQ1JfREJBXzIgfCBUSU1fRENSX0RCQV8xIHwgVElNX0RDUl9EQkFfMCkgIC8qITwgVElNeF9DQ1IzIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjQgICAgICAgICAgVElNX0RDUl9EQkFfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSNCByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9CRFRSICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0JEVFIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfT1IgICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9PUiByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ01SMyAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzApICAgICAgICAgICAgICAgICAgLyohPCBUSU14X0NDTVIzIHJlZ2lzdGVyIGlzIHRoZSBETUEgYmFzZSBhZGRyZXNzIGZvciBETUEgYnVyc3QgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjUgICAgICAgICAgKFRJTV9EQ1JfREJBXzQgfCBUSU1fRENSX0RCQV8yIHwgVElNX0RDUl9EQkFfMSkgICAgICAgICAgICAgICAgICAvKiE8IFRJTXhfQ0NSNSByZWdpc3RlciBpcyB0aGUgRE1BIGJhc2UgYWRkcmVzcyBmb3IgRE1BIGJ1cnN0ICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I2ICAgICAgICAgIChUSU1fRENSX0RCQV80IHwgVElNX0RDUl9EQkFfMiB8IFRJTV9EQ1JfREJBXzEgfCBUSU1fRENSX0RCQV8wKSAgLyohPCBUSU14X0NDUjYgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYxICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9BRjEgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQUYyICAgICAgICAgICAoVElNX0RDUl9EQkFfNCB8IFRJTV9EQ1JfREJBXzMgfCBUSU1fRENSX0RCQV8wKSAgICAgICAgICAgICAgICAgIC8qITwgVElNeF9BRjIgcmVnaXN0ZXIgaXMgdGhlIERNQSBiYXNlIGFkZHJlc3MgZm9yIERNQSBidXJzdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfRE1BQlVSU1RfTEVOR1RIIERNQSBCdXJzdCBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzFUUkFOU0ZFUiAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXIgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzJUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDIgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAzIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfNFRSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8xIHwgIFRJTV9EQ1JfREJMXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzVUUkFOU0ZFUlMgICAgICBUSU1fRENSX0RCTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDUgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTICAgICAgKFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA2IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfN1RSQU5TRkVSUyAgICAgIChUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzhUUkFOU0ZFUlMgICAgICAoVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTICAgICAgVElNX0RDUl9EQkxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byA5IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTBUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTAgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMVRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxMSByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDEyIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTNUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTMgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNFRSQU5TRkVSUyAgICAgKFRJTV9EQ1JfREJMXzMgfCBUSU1fRENSX0RCTF8yIHwgVElNX0RDUl9EQkxfMCkgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNCByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfMyB8IFRJTV9EQ1JfREJMXzIgfCBUSU1fRENSX0RCTF8xKSAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE1IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTZUUkFOU0ZFUlMgICAgIChUSU1fRENSX0RCTF8zIHwgVElNX0RDUl9EQkxfMiB8IFRJTV9EQ1JfREJMXzEgfCBUSU1fRENSX0RCTF8wKSAvKiE8IFRyYW5zZmVyIGlzIGRvbmUgdG8gMTYgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIERNQSBidXJzdCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xN1RSQU5TRkVSUyAgICAgVElNX0RDUl9EQkxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgaXMgZG9uZSB0byAxNyByZWdpc3RlcnMgc3RhcnRpbmcgZnJvbSB0aGUgRE1BIGJ1cnN0IGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTICAgICAoVElNX0RDUl9EQkxfNCB8ICBUSU1fRENSX0RCTF8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2ZlciBpcyBkb25lIHRvIDE4IHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHRoZSBETUEgYnVyc3QgYmFzZSBhZGRyZXNzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0xX0VUUl9BREMxX1JNUCAgVElNMSBFeHRlcm5hbCBUcmlnZ2VyIEFEQzEgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMV9STVBfTkMgICAgVElNMV9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIG5vdCBjb25uZWN0ZWQgdG8gQURDMSBhbmFsb2cgd2F0Y2hkb2cgeCAqLworI2RlZmluZSBMTF9USU1fVElNMV9FVFJfQURDMV9STVBfQVdEMSAoVElNMV9PUl9FVFJfQURDMV9STVBfMCB8IFRJTTFfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIGFuYWxvZyB3YXRjaGRvZyAxICovCisjZGVmaW5lIExMX1RJTV9USU0xX0VUUl9BREMxX1JNUF9BV0QyIChUSU0xX09SX0VUUl9BREMxX1JNUF8xIHwgVElNMV9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMV9FVFIgaXMgY29ubmVjdGVkIHRvIEFEQzEgYW5hbG9nIHdhdGNoZG9nIDIgKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX0FXRDMgKFRJTTFfT1JfRVRSX0FEQzFfUk1QIHwgVElNMV9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xX0VUUiBpcyBjb25uZWN0ZWQgdG8gQURDMSBhbmFsb2cgd2F0Y2hkb2cgMyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMV9USTFfUk1QICBUSU0xIEV4dGVybmFsIElucHV0IENoMSBSZW1hcAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1RJTV9USU0xX1RJMV9STVBfR1BJTyAgVElNMV9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMSBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTFfVEkxX1JNUF9DT01QMSAoVElNMV9PUl9USTFfUk1QIHwgVElNMV9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xIGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FQ19USU0yX0lUUjFfUk1QICBUSU0yIEludGVybmFsIFRyaWdnZXIxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfSVRSMV9STVBfTk9ORSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE8IE5vIGludGVybmFsIHRyaWdnZXIgb24gVElNMl9JVFIxICovCisjZGVmaW5lIExMX1RJTV9USU0yX0lUUjFfUk1QX1VTQl9TT0YgICAgICAgKFRJTTJfT1JfSVRSMV9STVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhPCBUSU0yX0lUUjEgaXMgY29ubmVjdGVkIHRvIFVTQiBTT0YgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfRVRSX1JNUCAgVElNMiBFeHRlcm5hbCBUcmlnZ2VyIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfRVRSX1JNUF9HUElPICBUSU0yX09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yX0VUUiBpcyBjb25uZWN0ZWQgdG8gR1BJTyAqLworI2RlZmluZSBMTF9USU1fVElNMl9FVFJfUk1QX0xTRSAgKFRJTTJfT1JfRVRSX1JNUCB8IFRJTTJfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMl9FVFIgaXMgY29ubmVjdGVkIHRvIExTRSAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX1RJTTJfVEk0X1JNUCAgVElNMiBFeHRlcm5hbCBJbnB1dCBDaDQgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0dQSU8gICAgICAgIFRJTTJfT1JfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIgaW5wdXQgY2FwdHVyZSA0IGlzIGNvbm5lY3RlZCB0byBHUElPICovCisjZGVmaW5lIExMX1RJTV9USU0yX1RJNF9STVBfQ09NUDEgICAgICAgKFRJTTJfT1JfVEk0X1JNUF8wIHwgVElNMl9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMiBpbnB1dCBjYXB0dXJlIDQgaXMgY29ubmVjdGVkIHRvIENPTVAxX09VVCAqLworI2RlZmluZSBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAyICAgICAgIChUSU0yX09SX1RJNF9STVBfMSB8IFRJTTJfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTIgaW5wdXQgY2FwdHVyZSA0IGlzIGNvbm5lY3RlZCB0byBDT01QMl9PVVQgKi8KKyNkZWZpbmUgTExfVElNX1RJTTJfVEk0X1JNUF9DT01QMV9DT01QMiAoVElNMl9PUl9USTRfUk1QIHwgVElNMl9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0yIGlucHV0IGNhcHR1cmUgNCBpcyBjb25uZWN0ZWQgdG8gbG9naWNhbCBPUiBiZXR3ZWVuIENPTVAxX09VVCBhbmQgQ09NUDJfT1VUICovCisvKioKKyAgKiBAfQorICAqLworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMTZfVEkxX1JNUCAgVElNMTYgRXh0ZXJuYWwgSW5wdXQgQ2gxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfR1BJTyBUSU0xNl9PUl9STVBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNiBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTE2X1RJMV9STVBfTFNJICAoVElNMTZfT1JfVEkxX1JNUF8wIHwgVElNMTZfT1JfUk1QX01BU0spICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNiBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIExTSSAqLworI2RlZmluZSBMTF9USU1fVElNMTZfVEkxX1JNUF9MU0UgIChUSU0xNl9PUl9USTFfUk1QXzEgfCBUSU0xNl9PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE2IGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gTFNFICovCisjZGVmaW5lIExMX1RJTV9USU0xNl9USTFfUk1QX1JUQyAgKFRJTTE2X09SX1RJMV9STVBfMSB8IFRJTTE2X09SX1RJMV9STVBfMCB8IFRJTTE2X09SX1JNUF9NQVNLKSAgICAgIC8qITwgVElNMTYgaW5wdXQgY2FwdHVyZSAxIGlzIGNvbm5lY3RlZCB0byBSVEMgd2FrZXVwIGludGVycnVwdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUNfVElNMTdfVEkxX1JNUCAgVElNMTcgVGltZXIgSW5wdXQgQ2gxIFJlbWFwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfR1BJTyAgIFRJTTE3X09SX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNyBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIEdQSU8gKi8KKyNkZWZpbmUgTExfVElNX1RJTTE3X1RJMV9STVBfTVNJICAgIChUSU0xN19PUl9USTFfUk1QXzAgfCBUSU0xN19PUl9STVBfTUFTSykgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUSU0xNyBpbnB1dCBjYXB0dXJlIDEgaXMgY29ubmVjdGVkIHRvIE1TSSAqLworI2RlZmluZSBMTF9USU1fVElNMTdfVEkxX1JNUF9IU0VfMzIgKFRJTTE3X09SX1RJMV9STVBfMSB8IFRJTTE3X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRJTTE3IGlucHV0IGNhcHR1cmUgMSBpcyBjb25uZWN0ZWQgdG8gSFNFLzMyICovCisjZGVmaW5lIExMX1RJTV9USU0xN19USTFfUk1QX01DTyAgICAoVElNMTdfT1JfVEkxX1JNUCB8IFRJTTE3X09SX1JNUF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVElNMTcgaW5wdXQgY2FwdHVyZSAxIGlzIGNvbm5lY3RlZCB0byBNQ08gKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VDX09DUkVGX0NMUl9JTlQgT0NSRUYgY2xlYXIgaW5wdXQgc2VsZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVElNX09DUkVGX0NMUl9JTlRfT0NSRUZfQ0xSICAgICAweDAwMDAwMDAwVSAgICAgICAgIC8qITwgT0NSRUZfQ0xSX0lOVCBpcyBjb25uZWN0ZWQgdG8gdGhlIE9DUkVGX0NMUiBpbnB1dCAqLworI2RlZmluZSBMTF9USU1fT0NSRUZfQ0xSX0lOVF9FVFIgICAgVElNX1NNQ1JfT0NDUyAgICAgICAvKiE8IE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIEVUUkYgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBMZWdhY3kgZGVmaW5pdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQorQGNvbmQgMAorICAqLworI2RlZmluZSBMTF9USU1fQktJTl9TT1VSQ0VfREZCSyAgTExfVElNX0JLSU5fU09VUkNFX0RGMUJLCisvKioKK0BlbmRjb25kCisgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfRXhwb3J0ZWRfTWFjcm9zIFRJTSBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBUSU0gcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVElNIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBWYWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSByZWdpc3RlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBMTF9USU1fV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFRJTSByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBUSU0gSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKKyAgKi8KKyNkZWZpbmUgTExfVElNX1JlYWRSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fKSBSRUFEX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VNX0V4cG9ydGVkX01hY3JvcyBFeHBvcnRlZF9NYWNyb3MKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyByZXRyaWV2aW5nIHRoZSBVSUZDUFkgZmxhZyBmcm9tIHRoZSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZIChAcmVmIExMX1RJTV9HZXRDb3VudGVyICgpKTsKKyAgKiBAbm90ZSAgUmVsZXZhbnQgb25seSBpZiBVSUYgZmxhZyByZW1hcHBpbmcgaGFzIGJlZW4gZW5hYmxlZCAgKFVJRiBzdGF0dXMgYml0IGlzIGNvcGllZAorICAqICAgICAgICB0byBUSU14X0NOVCByZWdpc3RlciBiaXQgMzEpCisgICogQHBhcmFtICBfX0NOVF9fIENvdW50ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIFVJRiBzdGF0dXMgYml0CisgICovCisjZGVmaW5lIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZKF9fQ05UX18pICBcCisgIChSRUFEX0JJVCgoX19DTlRfXyksIFRJTV9DTlRfVUlGQ1BZKSA+PiBUSU1fQ05UX1VJRkNQWV9Qb3MpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIERUR1swOjddIGluIHRoZSBUSU14X0JEVFIgcmVnaXN0ZXIgdG8gYWNoaWV2ZSB0aGUgcmVxdWVzdGVkIGRlYWQgdGltZSBkdXJhdGlvbi4KKyAgKiBAbm90ZSBleDogQHJlZiBfX0xMX1RJTV9DQUxDX0RFQURUSU1FICg4MDAwMDAwMCwgQHJlZiBMTF9USU1fR2V0Q2xvY2tEaXZpc2lvbiAoKSwgMTIwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fQ0tEX18gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjQKKyAgKiBAcGFyYW0gIF9fRFRfXyBkZWFkdGltZSBkdXJhdGlvbiAoaW4gbnMpCisgICogQHJldHZhbCBEVEdbMDo3XQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX0RFQURUSU1FKF9fVElNQ0xLX18sIF9fQ0tEX18sIF9fRFRfXykgIFwKKyAgKCAoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKSA8ICgoRFRfREVMQVlfMSsxVSkgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgICAgPyAodWludDhfdCkoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpIC8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgICYgRFRfREVMQVlfMSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKCg2NFUgKyAoRFRfREVMQVlfMisxVSkpICogMlUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgID8gKHVpbnQ4X3QpKERUX1JBTkdFXzIgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gMVUpIC0gKHVpbnQ4X3QpIDY0KSAmIERUX0RFTEFZXzIpKSA6XAorICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKCgzMlUgKyAoRFRfREVMQVlfMysxVSkpICogOFUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgID8gKHVpbnQ4X3QpKERUX1JBTkdFXzMgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gM1UpIC0gKHVpbnQ4X3QpIDMyKSAmIERUX0RFTEFZXzMpKSA6XAorICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKCgzMlUgKyAoRFRfREVMQVlfNCsxVSkpICogMTZVICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpID8gKHVpbnQ4X3QpKERUX1JBTkdFXzQgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gNFUpIC0gKHVpbnQ4X3QpIDMyKSAmIERUX0RFTEFZXzQpKSA6XAorICAgIDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgcHJlc2NhbGVyIHZhbHVlIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5LgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFNDICg4MDAwMDAwMCwgMTAwMDAwMCk7CisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBfX0NOVENMS19fIGNvdW50ZXIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcmV0dmFsIFByZXNjYWxlciB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfUFNDKF9fVElNQ0xLX18sIF9fQ05UQ0xLX18pICAgXAorICAoKChfX1RJTUNMS19fKSA+PSAoX19DTlRDTEtfXykpID8gKHVpbnQzMl90KSgoKF9fVElNQ0xLX18pLyhfX0NOVENMS19fKSkgLSAxVSkgOiAwVSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gY2FsY3VsYXRpbmcgdGhlIGF1dG8tcmVsb2FkIHZhbHVlIHRvIGFjaGlldmUgdGhlIHJlcXVpcmVkIG91dHB1dCBzaWduYWwgZnJlcXVlbmN5LgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfQVJSICgxMDAwMDAwLCBAcmVmIExMX1RJTV9HZXRQcmVzY2FsZXIgKCksIDEwMDAwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0ZSRVFfXyBvdXRwdXQgc2lnbmFsIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHJldHZhbCAgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworI2RlZmluZSBfX0xMX1RJTV9DQUxDX0FSUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgXAorICAoKCgoX19USU1DTEtfXykvKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgPyAoKChfX1RJTUNMS19fKS8oKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSA6IDBVKQorCisvKioKKyAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSByZXF1aXJlZCB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkuCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fQ0FMQ19ERUxBWSAoMTAwMDAwMCwgQHJlZiBMTF9USU1fR2V0UHJlc2NhbGVyICgpLCAxMCk7CisgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICogQHBhcmFtICBfX1BTQ19fIHByZXNjYWxlcgorICAqIEBwYXJhbSAgX19ERUxBWV9fIHRpbWVyIG91dHB1dCBjb21wYXJlIGFjdGl2ZS9pbmFjdGl2ZSBkZWxheSAoaW4gdXMpCisgICogQHJldHZhbCBDb21wYXJlIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KKyNkZWZpbmUgX19MTF9USU1fQ0FMQ19ERUxBWShfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0RFTEFZX18pICBcCisgICgodWludDMyX3QpKCgodWludDY0X3QpKF9fVElNQ0xLX18pICogKHVpbnQ2NF90KShfX0RFTEFZX18pKSBcCisgICAgICAgICAgICAgIC8gKCh1aW50NjRfdCkxMDAwMDAwVSAqICh1aW50NjRfdCkoKF9fUFNDX18pICsgMVUpKSkpCisKKy8qKgorICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCBwdWxzZSBkdXJhdGlvbiAod2hlbiB0aGUgdGltZXIgb3BlcmF0ZXMgaW4gb25lIHB1bHNlIG1vZGUpLgorICAqIEBub3RlIGV4OiBAcmVmIF9fTExfVElNX0NBTENfUFVMU0UgKDEwMDAwMDAsIEByZWYgTExfVElNX0dldFByZXNjYWxlciAoKSwgMTAsIDIwKTsKKyAgKiBAcGFyYW0gIF9fVElNQ0xLX18gdGltZXIgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIF9fUFNDX18gcHJlc2NhbGVyCisgICogQHBhcmFtICBfX0RFTEFZX18gdGltZXIgb3V0cHV0IGNvbXBhcmUgYWN0aXZlL2luYWN0aXZlIGRlbGF5IChpbiB1cykKKyAgKiBAcGFyYW0gIF9fUFVMU0VfXyBwdWxzZSBkdXJhdGlvbiAoaW4gdXMpCisgICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCisjZGVmaW5lIF9fTExfVElNX0NBTENfUFVMU0UoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBfX1BVTFNFX18pICBcCisgICgodWludDMyX3QpKF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX1BVTFNFX18pKSBcCisgICAgICAgICAgICAgICsgX19MTF9USU1fQ0FMQ19ERUxBWSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fREVMQVlfXykpKSkKKworLyoqCisgICogQGJyaWVmICBIRUxQRVIgbWFjcm8gcmV0cmlldmluZyB0aGUgcmF0aW8gb2YgdGhlIGlucHV0IGNhcHR1cmUgcHJlc2NhbGVyCisgICogQG5vdGUgZXg6IEByZWYgX19MTF9USU1fR0VUX0lDUFNDX1JBVElPIChAcmVmIExMX1RJTV9JQ19HZXRQcmVzY2FsZXIgKCkpOworICAqIEBwYXJhbSAgX19JQ1BTQ19fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKiBAcmV0dmFsIElucHV0IGNhcHR1cmUgcHJlc2NhbGVyIHJhdGlvICgxLCAyLCA0IG9yIDgpCisgICovCisjZGVmaW5lIF9fTExfVElNX0dFVF9JQ1BTQ19SQVRJTyhfX0lDUFNDX18pICBcCisgICgodWludDMyX3QpKDB4MDFVIDw8ICgoKF9fSUNQU0NfXykgPj4gMTZVKSA+PiBUSU1fQ0NNUjFfSUMxUFNDX1BvcykpKQorCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfVGltZV9CYXNlIFRpbWUgQmFzZSBjb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRpbWVyIGNvdW50ZXIuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0VOICAgICAgICAgICBMTF9USU1fRW5hYmxlQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aW1lciBjb3VudGVyLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0Rpc2FibGVDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGltZXIgY291bnRlciBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENFTiAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZENvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkQ291bnRlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX0NFTikgPT0gKFRJTV9DUjFfQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRElTICAgICAgICAgIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZVVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX1VESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdXBkYXRlIGV2ZW50IGdlbmVyYXRpb24uCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVURJUyAgICAgICAgICBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB1cGRhdGUgZXZlbnQgZ2VuZXJhdGlvbiBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVESVMgICAgICAgICAgTExfVElNX0lzRW5hYmxlZFVwZGF0ZUV2ZW50CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBJbnZlcnRlZCBzdGF0ZSBvZiBiaXQgKDAgb3IgMSkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZFVwZGF0ZUV2ZW50KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVURJUykgPT0gKHVpbnQzMl90KVJFU0VUKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHVwZGF0ZSBldmVudCBzb3VyY2UKKyAgKiBAbm90ZSBVcGRhdGUgZXZlbnQgc291cmNlIHNldCB0byBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVI6IGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cworICAqICAgICAgIGdlbmVyYXRlIGFuIHVwZGF0ZSBpbnRlcnJ1cHQgb3IgRE1BIHJlcXVlc3QgaWYgZW5hYmxlZDoKKyAgKiAgICAgICAgLSBDb3VudGVyIG92ZXJmbG93L3VuZGVyZmxvdworICAqICAgICAgICAtIFNldHRpbmcgdGhlIFVHIGJpdAorICAqICAgICAgICAtIFVwZGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlcgorICAqIEBub3RlIFVwZGF0ZSBldmVudCBzb3VyY2Ugc2V0IHRvIExMX1RJTV9VUERBVEVTT1VSQ0VfQ09VTlRFUjogb25seSBjb3VudGVyCisgICogICAgICAgb3ZlcmZsb3cvdW5kZXJmbG93IGdlbmVyYXRlcyBhbiB1cGRhdGUgaW50ZXJydXB0IG9yIERNQSByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVVJTICAgICAgICAgICBMTF9USU1fU2V0VXBkYXRlU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBVcGRhdGVTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRVcGRhdGVTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFVwZGF0ZVNvdXJjZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfVVJTLCBVcGRhdGVTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgZXZlbnQgdXBkYXRlIHNvdXJjZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVSUyAgICAgICAgICAgTExfVElNX0dldFVwZGF0ZVNvdXJjZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX1JFR1VMQVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVVBEQVRFU09VUkNFX0NPVU5URVIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0VXBkYXRlU291cmNlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfVVJTKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IG9uZSBwdWxzZSBtb2RlIChvbmUgc2hvdCB2LnMuIHJlcGV0aXRpdmUpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE9QTSAgICAgICAgICAgTExfVElNX1NldE9uZVB1bHNlTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT25lUHVsc2VNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9TSU5HTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT05FUFVMU0VNT0RFX1JFUEVUSVRJVkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRPbmVQdWxzZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IE9uZVB1bHNlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjEsIFRJTV9DUjFfT1BNLCBPbmVQdWxzZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBhY3R1YWwgb25lIHB1bHNlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1BNICAgICAgICAgICBMTF9USU1fR2V0T25lUHVsc2VNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PTkVQVUxTRU1PREVfU0lOR0xFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09ORVBVTFNFTU9ERV9SRVBFVElUSVZFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldE9uZVB1bHNlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IxLCBUSU1fQ1IxX09QTSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgY291bnRlciBjb3VudGluZyBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8KKyAgKiAgICAgICBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgY291bnRlciBtb2RlIHNlbGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZAorICAqICAgICAgIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQG5vdGUgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24KKyAgKiAgICAgICBkdWUgdG8gRElSIGJpdCByZWFkb25seSBpbiBjZW50ZXIgYWxpZ25lZCBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX1NldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ291bnRlck1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDb3VudGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ291bnRlck1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IxLCAoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyksIENvdW50ZXJNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgYWN0dWFsIGNvdW50ZXIgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DT1VOVEVSX01PREVfU0VMRUNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvCisgICogICAgICAgY2hlY2sgd2hldGhlciBvciBub3QgdGhlIGNvdW50ZXIgbW9kZSBzZWxlY3Rpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQKKyAgKiAgICAgICBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERJUiAgICAgICAgICAgTExfVElNX0dldENvdW50ZXJNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBDTVMgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyTW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfRE9XTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fR2V0Q291bnRlck1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvLXJlbG9hZCAoQVJSKSBwcmVsb2FkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFSUEUgICAgICAgICAgTExfVElNX0VuYWJsZUFSUlByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG8tcmVsb2FkIChBUlIpIHByZWxvYWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUFSUlByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQVJSUHJlbG9hZChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9BUlBFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBhdXRvLXJlbG9hZCAoQVJSKSBwcmVsb2FkIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQVJQRSAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQVJSUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSkgPT0gKFRJTV9DUjFfQVJQRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrICBhbmQgdGhlIHNhbXBsaW5nIGNsb2NrIHVzZWQgYnkgdGhlIGRlYWQtdGltZSBnZW5lcmF0b3JzICh3aGVuIHN1cHBvcnRlZCkgYW5kIHRoZSBkaWdpdGFsIGZpbHRlcnMuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgY2xvY2sgZGl2aXNpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRpbWVyCisgICogICAgICAgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0tEICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tEaXZpc2lvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENsb2NrRGl2aXNpb24pCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IxLCBUSU1fQ1IxX0NLRCwgQ2xvY2tEaXZpc2lvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhY3R1YWwgZGl2aXNpb24gcmF0aW8gYmV0d2VlbiB0aGUgdGltZXIgY2xvY2sgIGFuZCB0aGUgc2FtcGxpbmcgY2xvY2sgdXNlZCBieSB0aGUgZGVhZC10aW1lIGdlbmVyYXRvcnMgKHdoZW4gc3VwcG9ydGVkKSBhbmQgdGhlIGRpZ2l0YWwgZmlsdGVycy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS19ESVZJU0lPTl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBjbG9jayBkaXZpc2lvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGltZXIKKyAgKiAgICAgICBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDS0QgICAgICAgICAgIExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLRElWSVNJT05fRElWNAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRDbG9ja0RpdmlzaW9uKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQ0tEKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb3VudGVyIENvdW50ZXIgdmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGIG9yIDB4RkZGRkZGRkYpCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0Q291bnRlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ291bnRlcikKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNOVCwgQ291bnRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRiBvciAweEZGRkZGRkZGKQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRDb3VudGVyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DTlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgZGlyZWN0aW9uIG9mIHRoZSBjb3VudGVyCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRElSICAgICAgICAgICBMTF9USU1fR2V0RGlyZWN0aW9uCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DT1VOVEVSRElSRUNUSU9OX1VQCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NPVU5URVJESVJFQ1RJT05fRE9XTgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXREaXJlY3Rpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9ESVIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAbm90ZSBUaGUgY291bnRlciBjbG9jayBmcmVxdWVuY3kgQ0tfQ05UIGlzIGVxdWFsIHRvIGZDS19QU0MgLyAoUFNDWzE1OjBdICsgMSkuCisgICogQG5vdGUgVGhlIHByZXNjYWxlciBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgZmx5IGFzIHRoaXMgY29udHJvbCByZWdpc3RlciBpcyBidWZmZXJlZC4gVGhlIG5ldworICAqICAgICAgIHByZXNjYWxlciByYXRpbyBpcyB0YWtlbiBpbnRvIGFjY291bnQgYXQgdGhlIG5leHQgdXBkYXRlIGV2ZW50LgorICAqIEBub3RlIEhlbHBlciBtYWNybyBAcmVmIF9fTExfVElNX0NBTENfUFNDIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgUHJlc2NhbGVyIHBhcmFtZXRlcgorICAqIEBybXRvbGwgUFNDICAgICAgICAgIFBTQyAgICAgICAgICAgTExfVElNX1NldFByZXNjYWxlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFByZXNjYWxlcikKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlBTQywgUHJlc2NhbGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcm10b2xsIFBTQyAgICAgICAgICBQU0MgICAgICAgICAgIExMX1RJTV9HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsICBQcmVzY2FsZXIgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9HZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPlBTQykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgYXV0by1yZWxvYWQgdmFsdWUuCisgICogQG5vdGUgVGhlIGNvdW50ZXIgaXMgYmxvY2tlZCB3aGlsZSB0aGUgYXV0by1yZWxvYWQgdmFsdWUgaXMgbnVsbC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19BUlIgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBBdXRvUmVsb2FkIHBhcmFtZXRlcgorICAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfVElNX1NldEF1dG9SZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEF1dG9SZWxvYWQgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEF1dG9SZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEF1dG9SZWxvYWQpCit7CisgIFdSSVRFX1JFRyhUSU14LT5BUlIsIEF1dG9SZWxvYWQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgYXV0by1yZWxvYWQgdmFsdWUuCisgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9USU1fR2V0QXV0b1JlbG9hZAorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIEF1dG8tcmVsb2FkIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldEF1dG9SZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkFSUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLgorICAqIEBub3RlIEZvciBhZHZhbmNlZCB0aW1lciBpbnN0YW5jZXMgUmVwZXRpdGlvbkNvdW50ZXIgY2FuIGJlIHVwIHRvIDY1NTM1LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSByZXBldGl0aW9uIGNvdW50ZXIuCisgICogQHJtdG9sbCBSQ1IgICAgICAgICAgUkVQICAgICAgICAgICBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJlcGV0aXRpb25Db3VudGVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFJlcGV0aXRpb25Db3VudGVyKQoreworICBXUklURV9SRUcoVElNeC0+UkNSLCBSZXBldGl0aW9uQ291bnRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIHJlcGV0aXRpb24gY291bnRlci4KKyAgKiBAcm10b2xsIFJDUiAgICAgICAgICBSRVAgICAgICAgICAgIExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0dldFJlcGV0aXRpb25Db3VudGVyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5SQ1IpKTsKK30KKworLyoqCisgICogQGJyaWVmICBGb3JjZSBhIGNvbnRpbnVvdXMgY29weSBvZiB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpIGludG8gdGhlIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXIgKGJpdCAzMSkuCisgICogQG5vdGUgVGhpcyBhbGxvd3MgYm90aCB0aGUgY291bnRlciB2YWx1ZSBhbmQgYSBwb3RlbnRpYWwgcm9sbC1vdmVyIGNvbmRpdGlvbiBzaWduYWxsZWQgYnkgdGhlIFVJRkNQWSBmbGFnIHRvIGJlIHJlYWQgaW4gYW4gYXRvbWljIHdheS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVSUZSRU1BUCAgICAgIExMX1RJTV9FbmFibGVVSUZSZW1hcAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZVVJRlJlbWFwKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VSUZSRU1BUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgcmVtYXBwaW5nLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVJRlJFTUFQICAgICAgTExfVElNX0Rpc2FibGVVSUZSZW1hcAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVVSUZSZW1hcChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNSMSwgVElNX0NSMV9VSUZSRU1BUCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0NhcHR1cmVfQ29tcGFyZSBDYXB0dXJlIENvbXBhcmUgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSAgdGhlIGNhcHR1cmUvY29tcGFyZSBjb250cm9sIGJpdHMgKENDeEUsIENDeE5FIGFuZCBPQ3hNKSBwcmVsb2FkLgorICAqIEBub3RlIENDeEUsIENDeE5FIGFuZCBPQ3hNIGJpdHMgYXJlIHByZWxvYWRlZCwgYWZ0ZXIgaGF2aW5nIGJlZW4gd3JpdHRlbiwKKyAgKiAgICAgICB0aGV5IGFyZSB1cGRhdGVkIG9ubHkgd2hlbiBhIGNvbW11dGF0aW9uIGV2ZW50IChDT00pIG9jY3Vycy4KKyAgKiBAbm90ZSBPbmx5IG9uIGNoYW5uZWxzIHRoYXQgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NQQyAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0VuYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDUEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkgcHJlbG9hZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIGNvbW11dGF0aW9uIGV2ZW50LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENDUEMgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRGlzYWJsZVByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfQ0NQQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB1cGRhdGVkIHNvdXJjZSBvZiB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwgQ0N4TkUgYW5kIE9DeE0pLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NVUyAgICAgICAgICBMTF9USU1fQ0NfU2V0VXBkYXRlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDQ1VwZGF0ZVNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ1VQREFURVNPVVJDRV9DT01HX09OTFkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NVUERBVEVTT1VSQ0VfQ09NR19BTkRfVFJHSQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX1NldFVwZGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ0NVcGRhdGVTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDVVMsIENDVXBkYXRlU291cmNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHRyaWdnZXIgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSBETUEgcmVxdWVzdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ0RTICAgICAgICAgIExMX1RJTV9DQ19TZXRETUFSZXFUcmlnZ2VyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBETUFSZXFUcmlnZ2VyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9DQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DQ0RNQVJFUVVFU1RfVVBEQVRFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfU2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRE1BUmVxVHJpZ2dlcikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfQ0NEUywgRE1BUmVxVHJpZ2dlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGFjdHVhbCB0cmlnZ2VyIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgRE1BIHJlcXVlc3QuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NEUyAgICAgICAgICBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0NETUFSRVFVRVNUX0NDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NDRE1BUkVRVUVTVF9VUERBVEUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fQ0NfR2V0RE1BUmVxVHJpZ2dlcihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX0NDRFMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxvY2sgbGV2ZWwgdG8gZnJlZXplIHRoZQorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBvZiBzZXZlcmFsIGNhcHR1cmUvY29tcGFyZSBwYXJhbWV0ZXJzLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgdGhlIGxvY2sgbWVjaGFuaXNtIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIExPQ0sgICAgICAgICAgTExfVElNX0NDX1NldExvY2tMZXZlbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgTG9ja0xldmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0xPQ0tMRVZFTF9PRkYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fTE9DS0xFVkVMXzMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DQ19TZXRMb2NrTGV2ZWwoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IExvY2tMZXZlbCkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9MT0NLLCBMb2NrTGV2ZWwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgY2hhbm5lbHMuCisgICogQHJtdG9sbCBDQ0VSICAgICAgICAgQ0MxRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzRSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2RSAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbHMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ0NfRW5hYmxlQ2hhbm5lbChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbHMpCit7CisgIFNFVF9CSVQoVElNeC0+Q0NFUiwgQ2hhbm5lbHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIGNoYW5uZWxzLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMUUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFORSAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyRSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5FICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTkUgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNEUgICAgICAgICAgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzVFICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlQ2hhbm5lbFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2RSAgICAgICAgICBMTF9USU1fQ0NfRGlzYWJsZUNoYW5uZWwKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWxzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NDX0Rpc2FibGVDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVscykKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkNDRVIsIENoYW5uZWxzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGNoYW5uZWwocykgaXMoYXJlKSBlbmFibGVkLgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMUUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMU5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMkUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM0UgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05FICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNEUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNUUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWxcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNkUgICAgICAgICAgTExfVElNX0NDX0lzRW5hYmxlZENoYW5uZWwKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWxzIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9DQ19Jc0VuYWJsZWRDaGFubmVsKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVscykKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q0NFUiwgQ2hhbm5lbHMpID09IChDaGFubmVscykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfT3V0cHV0X0NoYW5uZWwgT3V0cHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhbiBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgQ0MzUyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIENDNVMgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgQ0M2UyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNVAgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M2UCAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVMxICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzIgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0XG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBPSVM0ICAgICAgICAgIExMX1RJTV9PQ19Db25maWdPdXRwdXRcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIE9JUzUgICAgICAgICAgTExfVElNX09DX0NvbmZpZ091dHB1dFxuCisgICogICAgICAgICBDUjIgICAgICAgICAgT0lTNiAgICAgICAgICBMTF9USU1fT0NfQ29uZmlnT3V0cHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DUE9MQVJJVFlfSElHSCBvciBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9MT1cgb3IgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0NvbmZpZ091dHB1dChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ29uZmlndXJhdGlvbikKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCAoVElNX0NDTVIxX0NDMVMgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwKKyAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAmIFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q1IyLCAoVElNX0NSMl9PSVMxIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSksCisgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiBUSU1fQ1IyX09JUzEpIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVmaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgb3V0cHV0IHJlZmVyZW5jZSBzaWduYWwgT0N4UkVGIGZyb20gd2hpY2gKKyAgKiAgICAgICAgIE9DeCBhbmQgT0N4TiAod2hlbiByZWxldmFudCkgYXJlIGRlcml2ZWQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzTSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZVxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2TSAgICAgICAgICBMTF9USU1fT0NfU2V0TW9kZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBwYXJhbSAgTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRlJPWkVOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9UT0dHTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUFdNMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9BU1NZTUVUUklDX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IE1vZGUpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIE1PRElGWV9SRUcoKnBSZWcsICgoVElNX0NDTVIxX09DMU0gIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSksICBNb2RlIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBvdXRwdXQgY29tcGFyZSBtb2RlIG9mIGFuIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMU0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMk0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM00gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNE0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNU0gICAgICAgICAgTExfVElNX09DX0dldE1vZGVcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNk0gICAgICAgICAgTExfVElNX09DX0dldE1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GUk9aRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FDVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfSU5BQ1RJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX1RPR0dMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9GT1JDRURfQUNUSVZFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9QV00yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldE1vZGUoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX09DMU0gIHwgVElNX0NDTVIxX0NDMVMpIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpID4+IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNlAgICAgICAgICAgTExfVElNX09DX1NldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9MT1cKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRQb2xhcml0eShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgUG9sYXJpdHkpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSwgIFBvbGFyaXR5IDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBwb2xhcml0eSBvZiBhbiBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9PQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M1UCAgICAgICAgICBMTF9USU1fT0NfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNlAgICAgICAgICAgTExfVElNX09DX0dldFBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMk4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDNOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1BPTEFSSVRZX0hJR0gKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NQT0xBUklUWV9MT1cKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0UG9sYXJpdHkoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJldHVybiAoUkVBRF9CSVQoVElNeC0+Q0NFUiwgKFRJTV9DQ0VSX0NDMVAgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIElETEUgc3RhdGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwKKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25pZmljYW50IG9ubHkgZm9yIHRoZSB0aW1lciBpbnN0YW5jZXMKKyAgKiAgICAgICBzdXBwb3J0aW5nIHRoZSBicmVhayBmZWF0dXJlLiBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KQorICAqICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMKKyAgKiAgICAgICBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzJOICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzMgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMzTiAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNCAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzUgICAgICAgICAgTExfVElNX09DX1NldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM2ICAgICAgICAgIExMX1RJTV9PQ19TZXRJZGxlU3RhdGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDFOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIM04KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcGFyYW0gIElkbGVTdGF0ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ0lETEVTVEFURV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldElkbGVTdGF0ZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgSWRsZVN0YXRlKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBNT0RJRllfUkVHKFRJTXgtPkNSMiwgKFRJTV9DUjJfT0lTMSA8PCBTSElGVF9UQUJfT0lTeFtpQ2hhbm5lbF0pLCAgSWRsZVN0YXRlIDw8IFNISUZUX1RBQl9PSVN4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBJRExFIHN0YXRlIG9mIGFuIG91dHB1dCBjaGFubmVsCisgICogQHJtdG9sbCBDUjIgICAgICAgICBPSVMxICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMk4gICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzIgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVMyTiAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTMyAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzNOICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZVxuCisgICogICAgICAgICBDUjIgICAgICAgICBPSVM0ICAgICAgICAgIExMX1RJTV9PQ19HZXRJZGxlU3RhdGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgT0lTNSAgICAgICAgICBMTF9USU1fT0NfR2V0SWRsZVN0YXRlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgIE9JUzYgICAgICAgICAgTExfVElNX09DX0dldElkbGVTdGF0ZQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDJOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT0NJRExFU1RBVEVfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09DSURMRVNUQVRFX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0SWRsZVN0YXRlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkNSMiwgKFRJTV9DUjJfT0lTMSA8PCBTSElGVF9UQUJfT0lTeFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfT0lTeFtpQ2hhbm5lbF0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYXN0IG1vZGUgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAbm90ZSBBY3RzIG9ubHkgaWYgdGhlIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBQV00xIG9yIFBXTTIgbW9kZS4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyRkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0ZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRGRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1RkUgICAgICAgICAgTExfVElNX09DX0VuYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVGYXN0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfRW5hYmxlRmFzdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgU0VUX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFGRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKKworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZmFzdCBtb2RlIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxRkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0ZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0RkUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUZhc3RcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkZFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlRmFzdAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVGYXN0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxRkUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7CisKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBmYXN0IG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzRkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3RcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNEZFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRGYXN0XG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVGRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkRmFzdFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2RkUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZEZhc3QKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfSXNFbmFibGVkRmFzdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYml0ZmllbGQgPSBUSU1fQ0NNUjFfT0MxRkUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdOworICByZXR1cm4gKChSRUFEX0JJVCgqcFJlZywgYml0ZmllbGQpID09IGJpdGZpZWxkKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbXBhcmUgcmVnaXN0ZXIgKFRJTXhfQ0NSeCkgcHJlbG9hZCBmb3IgdGhlIG91dHB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMVBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0MzUEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNFBFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M2UEUgICAgICAgICAgTExfVElNX09DX0VuYWJsZVByZWxvYWQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19FbmFibGVQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGZvciB0aGUgb3V0cHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxUEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0UEUgICAgICAgICAgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVQRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZVByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlUHJlbG9hZAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0Rpc2FibGVQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBDTEVBUl9CSVQoKnBSZWcsIChUSU1fQ0NNUjFfT0MxUEUgPDwgU0hJRlRfVEFCX09DeHhbaUNoYW5uZWxdKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J4KSBwcmVsb2FkIGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyUEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM1BFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzRQRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkUHJlbG9hZFxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1UEUgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWRcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNlBFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRQcmVsb2FkCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g1CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g2CisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0lzRW5hYmxlZFByZWxvYWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJpdGZpZWxkID0gVElNX0NDTVIxX09DMVBFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuIEl0IGRvZXMgbm90IHdvcmsgaW4gRm9yY2VkIG1vZGUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgT0M0Q0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzVDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19FbmFibGVDbGVhcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX0VuYWJsZUNsZWFyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBTRVRfQklUKCpwUmVnLCAoVElNX0NDTVIxX09DMUNFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIE9DMkNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DM0NFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNUNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjMgICAgICAgIE9DNkNFICAgICAgICAgIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19EaXNhYmxlQ2xlYXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIENMRUFSX0JJVCgqcFJlZywgKFRJTV9DQ01SMV9PQzFDRSA8PCBTSElGVF9UQUJfT0N4eFtpQ2hhbm5lbF0pKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50IGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLiBJdCBkb2VzIG5vdCB3b3JrIGluIEZvcmNlZCBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBPQzNDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIE9DNENFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCisgICogICAgICAgICBDQ01SMyAgICAgICAgT0M1Q0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KKyAgKiAgICAgICAgIENDTVIzICAgICAgICBPQzZDRSAgICAgICAgICBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDYKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfSXNFbmFibGVkQ2xlYXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJpdGZpZWxkID0gVElNX0NDTVIxX09DMUNFIDw8IFNISUZUX1RBQl9PQ3h4W2lDaGFubmVsXTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsIGJpdGZpZWxkKSA9PSBiaXRmaWVsZCkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZGVhZC10aW1lIGRlbGF5IChkZWxheSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSByaXNpbmcgZWRnZSBvZiB0aGUgT0N4UkVGIHNpZ25hbCBhbmQgdGhlIHJpc2luZyBlZGdlIG9mIHRoZSBPY3ggYW5kIE9DeE4gc2lnbmFscykuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBkZWFkLXRpbWUgaW5zZXJ0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQG5vdGUgSGVscGVyIG1hY3JvIEByZWYgX19MTF9USU1fQ0FMQ19ERUFEVElNRSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIERlYWRUaW1lIHBhcmFtZXRlcgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIERURyAgICAgICAgICAgTExfVElNX09DX1NldERlYWRUaW1lCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBEZWFkVGltZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldERlYWRUaW1lKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBEZWFkVGltZSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5CRFRSLCBUSU1fQkRUUl9EVEcsIERlYWRUaW1lKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMSAoVElNeF9DQ1IxKS4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDEoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjEsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDIgKFRJTXhfQ0NSMikuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1IyLCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAzIChUSU14X0NDUjMpLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDb21wYXJlVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX09DX1NldENvbXBhcmVDSDMoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENvbXBhcmVWYWx1ZSkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPkNDUjMsIENvbXBhcmVWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDQgKFRJTXhfQ0NSNCkuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIFdSSVRFX1JFRyhUSU14LT5DQ1I0LCBDb21wYXJlVmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA1IChUSU14X0NDUjUpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDUgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I1ICAgICAgICAgQ0NSNSAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ29tcGFyZVZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDb21wYXJlVmFsdWUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NSNSwgVElNX0NDUjVfQ0NSNSwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNiAoVElNeF9DQ1I2KS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzZfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA2IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDYKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvbXBhcmVWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fT0NfU2V0Q29tcGFyZUNINihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ29tcGFyZVZhbHVlKQoreworICBXUklURV9SRUcoVElNeC0+Q0NSNiwgQ29tcGFyZVZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1IxKSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCAxLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAxIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMSAgICAgICAgIENDUjEgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjIpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDIuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNIMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0gyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IyKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSMykgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgMy4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0gzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I0KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA0LgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA0IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSNCAgICAgICAgIENDUjQgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENvbXBhcmVWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fT0NfR2V0Q29tcGFyZUNINChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjUpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDUuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDb21wYXJlVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX09DX0dldENvbXBhcmVDSDUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFRJTXgtPkNDUjUsIFRJTV9DQ1I1X0NDUjUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY29tcGFyZSB2YWx1ZSAoVElNeF9DQ1I2KSBzZXQgZm9yICBvdXRwdXQgY2hhbm5lbCA2LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIG91dHB1dCBjaGFubmVsIDYgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I2ICAgICAgICAgQ0NSNiAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ29tcGFyZVZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9PQ19HZXRDb21wYXJlQ0g2KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1I2KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IG9uIHdoaWNoIHJlZmVyZW5jZSBzaWduYWwgdGhlIE9DNVJFRiBpcyBjb21iaW5lZCB0by4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIGNvbWJpbmVkIDMtcGhhc2UgUFdNIG1vZGUuCisgICogQHJtdG9sbCBDQ1I1ICAgICAgICAgR0M1QzMgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHNcbgorICAqICAgICAgICAgQ0NSNSAgICAgICAgIEdDNUMyICAgICAgICAgIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzXG4KKyAgKiAgICAgICAgIENDUjUgICAgICAgICBHQzVDMSAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVscworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgR3JvdXBDSDUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fR1JPVVBDSDVfT0MxUkVGQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9HUk9VUENINV9PQzJSRUZDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0dST1VQQ0g1X09DM1JFRkMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDSDVDb21iaW5lZENoYW5uZWxzKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBHcm91cENINSkKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DQ1I1LCAoVElNX0NDUjVfR0M1QzMgfCBUSU1fQ0NSNV9HQzVDMiB8IFRJTV9DQ1I1X0dDNUMxKSwgR3JvdXBDSDUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9JbnB1dF9DaGFubmVsIElucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBpbnB1dCBjaGFubmVsLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIENDMVMgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMxUFNDICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIENDMlMgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyUFNDICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDM1MgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDNFMgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0UFNDICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJQICAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnXG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNOUCAgICAgICAgIExMX1RJTV9JQ19Db25maWdcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX0NvbmZpZ1xuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fSUNfQ29uZmlnCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJIG9yIEByZWYgTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkgb3IgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfVFJDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEgb3IgLi4uIG9yIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxIG9yIC4uLiBvciBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORyBvciBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HIG9yIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBDb25maWd1cmF0aW9uKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFGIHwgVElNX0NDTVIxX0lDMVBTQyB8IFRJTV9DQ01SMV9DQzFTKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgICgoQ29uZmlndXJhdGlvbiA+PiAxNlUpICYgKFRJTV9DQ01SMV9JQzFGIHwgVElNX0NDTVIxX0lDMVBTQyB8IFRJTV9DQ01SMV9DQzFTKSkgIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7CisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwgKChUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMVApIDw8IFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSksCisgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb24gJiAoVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzFQKSkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGFjdGl2ZSBpbnB1dC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fSUNfU2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDM1MgICAgICAgICAgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9JQ19TZXRBY3RpdmVJbnB1dAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgSUNBY3RpdmVJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9JTkRJUkVDVFRJCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0FDVElWRUlOUFVUX1RSQworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldEFjdGl2ZUlucHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBJQ0FjdGl2ZUlucHV0KQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9DQzFTKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pLCAoSUNBY3RpdmVJbnB1dCA+PiAxNlUpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IGFjdGl2ZSBpbnB1dC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBDQzFTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dFxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgQ0MyUyAgICAgICAgICBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXRcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIENDM1MgICAgICAgICAgTExfVElNX0lDX0dldEFjdGl2ZUlucHV0XG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBDQzRTICAgICAgICAgIExMX1RJTV9JQ19HZXRBY3RpdmVJbnB1dAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0QWN0aXZlSW5wdXQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCAoKFRJTV9DQ01SMV9DQzFTKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pIDw8IDE2VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBwcmVzY2FsZXIgb2YgaW5wdXQgY2hhbm5lbC4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMlBTQyAgICAgICAgTExfVElNX0lDX1NldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzUFNDICAgICAgICBMTF9USU1fSUNfU2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRQU0MgICAgICAgIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcGFyYW0gIElDUHJlc2NhbGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19TZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IElDUHJlc2NhbGVyKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5DQ01SMSkgKyBPRkZTRVRfVEFCX0NDTVJ4W2lDaGFubmVsXSkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFQU0MpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSksIChJQ1ByZXNjYWxlciA+PiAxNlUpIDw8IFNISUZUX1RBQl9JQ3h4W2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjdXJyZW50IHByZXNjYWxlciB2YWx1ZSBhY3Rpbmcgb24gYW4gIGlucHV0IGNoYW5uZWwuCisgICogQHJtdG9sbCBDQ01SMSAgICAgICAgSUMxUFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyXG4KKyAgKiAgICAgICAgIENDTVIxICAgICAgICBJQzJQU0MgICAgICAgIExMX1RJTV9JQ19HZXRQcmVzY2FsZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDM1BTQyAgICAgICAgTExfVElNX0lDX0dldFByZXNjYWxlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUM0UFNDICAgICAgICBMTF9USU1fSUNfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDUFNDX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNQU0NfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ1BTQ19ESVY4CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgY29uc3QgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoKnBSZWcsICgoVElNX0NDTVIxX0lDMVBTQykgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSkgPj4gU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSA8PCAxNlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgaW5wdXQgZmlsdGVyIGR1cmF0aW9uLgorICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIElDMUYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMSAgICAgICAgSUMyRiAgICAgICAgICBMTF9USU1fSUNfU2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzNGICAgICAgICAgIExMX1RJTV9JQ19TZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjIgICAgICAgIElDNEYgICAgICAgICAgTExfVElNX0lDX1NldEZpbHRlcgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgSUNGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fSUNfU2V0RmlsdGVyKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBJQ0ZpbHRlcikKK3sKKyAgcmVnaXN0ZXIgdWludDhfdCBpQ2hhbm5lbCA9IFRJTV9HRVRfQ0hBTk5FTF9JTkRFWChDaGFubmVsKTsKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+Q0NNUjEpICsgT0ZGU0VUX1RBQl9DQ01SeFtpQ2hhbm5lbF0pKTsKKyAgTU9ESUZZX1JFRygqcFJlZywgKChUSU1fQ0NNUjFfSUMxRikgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKSwgKElDRmlsdGVyID4+IDE2VSkgPDwgU0hJRlRfVEFCX0lDeHhbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGlucHV0IGZpbHRlciBkdXJhdGlvbi4KKyAgKiBAcm10b2xsIENDTVIxICAgICAgICBJQzFGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXJcbgorICAqICAgICAgICAgQ0NNUjEgICAgICAgIElDMkYgICAgICAgICAgTExfVElNX0lDX0dldEZpbHRlclxuCisgICogICAgICAgICBDQ01SMiAgICAgICAgSUMzRiAgICAgICAgICBMTF9USU1fSUNfR2V0RmlsdGVyXG4KKyAgKiAgICAgICAgIENDTVIyICAgICAgICBJQzRGICAgICAgICAgIExMX1RJTV9JQ19HZXRGaWx0ZXIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRGaWx0ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHJlZ2lzdGVyIHVpbnQ4X3QgaUNoYW5uZWwgPSBUSU1fR0VUX0NIQU5ORUxfSU5ERVgoQ2hhbm5lbCk7CisgIHJlZ2lzdGVyIGNvbnN0IF9fSU8gdWludDMyX3QgKnBSZWcgPSAoX19JTyB1aW50MzJfdCAqKSgodWludDMyX3QpKCh1aW50MzJfdCkoJlRJTXgtPkNDTVIxKSArIE9GRlNFVF9UQUJfQ0NNUnhbaUNoYW5uZWxdKSk7CisgIHJldHVybiAoKFJFQURfQklUKCpwUmVnLCAoKFRJTV9DQ01SMV9JQzFGKSA8PCBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pKSA+PiBTSElGVF9UQUJfSUN4eFtpQ2hhbm5lbF0pIDw8IDE2VSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBpbnB1dCBjaGFubmVsIHBvbGFyaXR5LgorICAqIEBybXRvbGwgQ0NFUiAgICAgICAgIENDMVAgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzFOUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MyUCAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMk5QICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzNQICAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzTlAgICAgICAgICBMTF9USU1fSUNfU2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDNFAgICAgICAgICAgTExfVElNX0lDX1NldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzROUCAgICAgICAgIExMX1RJTV9JQ19TZXRQb2xhcml0eQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqIEBwYXJhbSAgSUNQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0lDX1NldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBJQ1BvbGFyaXR5KQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICBNT0RJRllfUkVHKFRJTXgtPkNDRVIsICgoVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzFQKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pLAorICAgICAgICAgICAgIElDUG9sYXJpdHkgPDwgU0hJRlRfVEFCX0NDeFBbaUNoYW5uZWxdKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgaW5wdXQgY2hhbm5lbCBwb2xhcml0eS4KKyAgKiBAcm10b2xsIENDRVIgICAgICAgICBDQzFQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MxTlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDMlAgICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzJOUCAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0MzUCAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHlcbgorICAqICAgICAgICAgQ0NFUiAgICAgICAgIENDM05QICAgICAgICAgTExfVElNX0lDX0dldFBvbGFyaXR5XG4KKyAgKiAgICAgICAgIENDRVIgICAgICAgICBDQzRQICAgICAgICAgIExMX1RJTV9JQ19HZXRQb2xhcml0eVxuCisgICogICAgICAgICBDQ0VSICAgICAgICAgQ0M0TlAgICAgICAgICBMTF9USU1fSUNfR2V0UG9sYXJpdHkKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQ0hBTk5FTF9DSDQKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldFBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsKQoreworICByZWdpc3RlciB1aW50OF90IGlDaGFubmVsID0gVElNX0dFVF9DSEFOTkVMX0lOREVYKENoYW5uZWwpOworICByZXR1cm4gKFJFQURfQklUKFRJTXgtPkNDRVIsICgoVElNX0NDRVJfQ0MxTlAgfCBUSU1fQ0NFUl9DQzFQKSA8PCBTSElGVF9UQUJfQ0N4UFtpQ2hhbm5lbF0pKSA+PgorICAgICAgICAgIFNISUZUX1RBQl9DQ3hQW2lDaGFubmVsXSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29ubmVjdCB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgIHRvIHRoZSBUSTEgaW5wdXQgKFhPUiBjb21iaW5hdGlvbikuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfRW5hYmxlWE9SQ29tYmluYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19FbmFibGVYT1JDb21iaW5hdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfVEkxUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzY29ubmVjdCB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgIGZyb20gdGhlIFRJMSBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIFhPUiBpbnB1dC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19EaXNhYmxlWE9SQ29tYmluYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9JQ19EaXNhYmxlWE9SQ29tYmluYXRpb24oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5DUjIsIFRJTV9DUjJfVEkxUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRJTXhfQ0gxLCBDSDIgYW5kIENIMyBwaW5zIGFyZSBjb25uZWN0ZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGFuIFhPUiBpbnB1dC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUSTFTICAgICAgICAgIExMX1RJTV9JQ19Jc0VuYWJsZWRYT1JDb21iaW5hdGlvbgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19Jc0VuYWJsZWRYT1JDb21iaW5hdGlvbihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+Q1IyLCBUSU1fQ1IyX1RJMVMpID09IChUSU1fQ1IyX1RJMVMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDEuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1IxICAgICAgICAgQ0NSMSAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSMSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAyLgorICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgaW5wdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgorICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIENhcHR1cmVkVmFsdWUgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lDX0dldENhcHR1cmVDSDIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKFRJTXgtPkNDUjIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMy4KKyAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGlucHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBDYXB0dXJlZFZhbHVlIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRyhUSU14LT5DQ1IzKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDQuCisgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBpbnB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCisgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgQ2FwdHVyZWRWYWx1ZSAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoVElNeC0+Q0NSNCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9DbG9ja19TZWxlY3Rpb24gQ291bnRlciBjbG9jayBzZWxlY3Rpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLgorICAqIEBub3RlIFdoZW4gZXh0ZXJuYWwgY2xvY2sgbW9kZSAyIGlzIGVuYWJsZWQgdGhlIGNvdW50ZXIgaXMgY2xvY2tlZCBieSBhbnkgYWN0aXZlIGVkZ2Ugb24gdGhlIEVUUkYgc2lnbmFsLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9FbmFibGVFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRXh0ZXJuYWxDbG9jayhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9FQ0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgZXh0ZXJuYWwgY2xvY2sgbW9kZSAyLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlRXh0ZXJuYWxDbG9jaworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVFeHRlcm5hbENsb2NrKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfRUNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGV4dGVybmFsIGNsb2NrIG1vZGUgMiBpcyBlbmFibGVkLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFQ0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRFeHRlcm5hbENsb2NrCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEV4dGVybmFsQ2xvY2soVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX0VDRSkgPT0gKFRJTV9TTUNSX0VDRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGNsb2NrIHNvdXJjZSBvZiB0aGUgY291bnRlciBjbG9jay4KKyAgKiBAbm90ZSB3aGVuIHNlbGVjdGVkIGNsb2NrIHNvdXJjZSBpcyBleHRlcm5hbCBjbG9jayBtb2RlIDEsIHRoZSB0aW1lciBpbnB1dAorICAqICAgICAgIHRoZSBleHRlcm5hbCBjbG9jayBpcyBhcHBsaWVkIGlzIHNlbGVjdGVkIGJ5IGNhbGxpbmcgdGhlIEByZWYgTExfVElNX1NldFRyaWdnZXJJbnB1dCgpCisgICogICAgICAgZnVuY3Rpb24uIFRoaXMgdGltZXIgaW5wdXQgbXVzdCBiZSBjb25maWd1cmVkIGJ5IGNhbGxpbmcKKyAgKiAgICAgICB0aGUgQHJlZiBMTF9USU1fSUNfQ29uZmlnKCkgZnVuY3Rpb24uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUxLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMi4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRDbG9ja1NvdXJjZVxuCisgICogICAgICAgICBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIENsb2NrU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLU09VUkNFX0lOVEVSTkFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NMT0NLU09VUkNFX0VYVF9NT0RFMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DTE9DS1NPVVJDRV9FWFRfTU9ERTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRDbG9ja1NvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2xvY2tTb3VyY2UpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfRUNFLCBDbG9ja1NvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSBtb2RlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgZW5jb2RlciBtb2RlLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgIFNNUyAgICAgICAgICAgTExfVElNX1NldEVuY29kZXJNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFbmNvZGVyTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRFbmNvZGVyTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRW5jb2Rlck1vZGUpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfU01TLCBFbmNvZGVyTW9kZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX1RpbWVyX1N5bmNocm9uaXphdGlvbiBUaW1lciBzeW5jaHJvbmlzYXRpb24gY29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgdHJpZ2dlciBvdXRwdXQgKFRSR08pIHVzZWQgZm9yIHRpbWVyIHN5bmNocm9uaXphdGlvbiAuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fTUFTVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIG1hc3RlciB0aW1lci4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNTVMgICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBUaW1lclN5bmNocm9uaXphdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPX1JFU0VUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fVVBEQVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR09fQ0MxSUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzFSRUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzJSRUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzNSRUYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHT19PQzRSRUYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUaW1lclN5bmNocm9uaXphdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfTU1TLCBUaW1lclN5bmNocm9uaXphdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAyIChUUkdPMikgdXNlZCBmb3IgQURDIHN5bmNocm9uaXphdGlvbiAuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fVFJHTzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvciBBREMgc3luY2hyb25pemF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1NUzIgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJPdXRwdXQyCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBBRENTeW5jaHJvbml6YXRpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX1VQREFURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9DQzFGCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0MzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFJHTzJfT0M2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdGQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNl9SSVNJTkdGQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNF9SSVNJTkdfT0M2X1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzRfUklTSU5HX09DNl9GQUxMSU5HCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RSR08yX09DNV9SSVNJTkdfT0M2X1JJU0lORworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UUkdPMl9PQzVfUklTSU5HX09DNl9GQUxMSU5HCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VHJpZ2dlck91dHB1dDIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEFEQ1N5bmNocm9uaXphdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfTU1TMiwgQURDU3luY2hyb25pemF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBtb2RlIG9mIGEgc2xhdmUgdGltZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCisgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0U2xhdmVNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBTbGF2ZU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0RJU0FCTEVECisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1NMQVZFTU9ERV9SRVNFVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9TTEFWRU1PREVfR0FURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX1RSSUdHRVIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldFNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgU2xhdmVNb2RlKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX1NNUywgU2xhdmVNb2RlKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNlbGVjdHMgdGhlIHRyaWdnZXIgaW5wdXQgdG8gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgY291bnRlci4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBUUyAgICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRyaWdnZXJJbnB1dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIwCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX0lUUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfSVRSMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19JVFIzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMUZfRUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVFNfVEkxRlAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX1RTX1RJMkZQMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9UU19FVFJGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0VHJpZ2dlcklucHV0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUcmlnZ2VySW5wdXQpCit7CisgIE1PRElGWV9SRUcoVElNeC0+U01DUiwgVElNX1NNQ1JfVFMsIFRyaWdnZXJJbnB1dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9FbmFibGVNYXN0ZXJTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+U01DUiwgVElNX1NNQ1JfTVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9EaXNhYmxlTWFzdGVyU2xhdmVNb2RlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZU1hc3RlclNsYXZlTW9kZShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX01TTSk7Cit9CisKKy8qKgorICAqIEBicmllZiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgTWFzdGVyL1NsYXZlIG1vZGUgaXMgZW5hYmxlZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRNYXN0ZXJTbGF2ZU1vZGUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkTWFzdGVyU2xhdmVNb2RlKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TTUNSLCBUSU1fU01DUl9NU00pID09IChUSU1fU01DUl9NU00pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBleHRlcm5hbCB0cmlnZ2VyIChFVFIpIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0VUUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dC4KKyAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBFVFAgICAgICAgICAgIExMX1RJTV9Db25maWdFVFJcbgorICAqICAgICAgICAgU01DUiAgICAgICAgIEVUUFMgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUlxuCisgICogICAgICAgICBTTUNSICAgICAgICAgRVRGICAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFVFJQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUE9MQVJJVFlfTk9OSU5WRVJURUQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BPTEFSSVRZX0lOVkVSVEVECisgICogQHBhcmFtICBFVFJQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX1BSRVNDQUxFUl9ESVY4CisgICogQHBhcmFtICBFVFJGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUl9GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJfRklMVEVSX0ZESVYzMl9OOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0VUUihUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRVRSUG9sYXJpdHksIHVpbnQzMl90IEVUUlByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRVRSRmlsdGVyKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX0VUUCB8IFRJTV9TTUNSX0VUUFMgfCBUSU1fU01DUl9FVEYsIEVUUlBvbGFyaXR5IHwgRVRSUHJlc2NhbGVyIHwgRVRSRmlsdGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIGV4dGVybmFsIHRyaWdnZXIgKEVUUikgaW5wdXQgc291cmNlLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0VUUlNFTF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgICogICAgICAgbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgRVRSIHNvdXJjZSBzZWxlY3Rpb24uCisgICogQHJtdG9sbCBBRjEgICAgICAgICAgRVRSU0VMICAgICAgICBMTF9USU1fU2V0RVRSU291cmNlCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBFVFJTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0dQSU8KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0NPTVAxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9DT01QMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9FVFJTT1VSQ0VfQURDMV9BV0QxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0VUUlNPVVJDRV9BREMxX0FXRDIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRVRSU09VUkNFX0FEQzFfQVdEMworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldEVUUlNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgRVRSU291cmNlKQoreworCisgIE1PRElGWV9SRUcoVElNeC0+QUYxLCBUSU14X0FGMV9FVFJTRUwsIEVUUlNvdXJjZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0JyZWFrX0Z1bmN0aW9uIEJyZWFrIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGJyZWFrIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0VuYWJsZUJSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUJSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9CS0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJyZWFrIGZ1bmN0aW9uLgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVCUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQlJLKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQktFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSS1xuCisgICogICAgICAgICBCRFRSICAgICAgICAgQktGICAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVha1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdICisgICogQHBhcmFtICBCcmVha0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMV9ONAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWOF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMTZfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrRmlsdGVyKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLUCB8IFRJTV9CRFRSX0JLRiwgQnJlYWtQb2xhcml0eSB8IEJyZWFrRmlsdGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIGJyZWFrIDIgZnVuY3Rpb24uCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0LgorICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLMkUgICAgICAgICAgTExfVElNX0VuYWJsZUJSSzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0JLMkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGJyZWFrICAyIGZ1bmN0aW9uLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJFICAgICAgICAgIExMX1RJTV9EaXNhYmxlQlJLMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVCUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBicmVhayAyIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJQICAgICAgICAgIExMX1RJTV9Db25maWdCUksyXG4KKyAgKiAgICAgICAgIEJEVFIgICAgICAgICBCSzJGICAgICAgICAgIExMX1RJTV9Db25maWdCUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVhazJQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdICisgICogQHBhcmFtICBCcmVhazJGaWx0ZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0JSSzIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrMlBvbGFyaXR5LCB1aW50MzJfdCBCcmVhazJGaWx0ZXIpCit7CisgIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfQksyUCB8IFRJTV9CRFRSX0JLMkYsIEJyZWFrMlBvbGFyaXR5IHwgQnJlYWsyRmlsdGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIG91dHB1dHMgb2ZmIHN0YXRlIChlbmFibGVkIHYucy4gZGlzYWJsZWQpIGluIElkbGUgYW5kIFJ1biBtb2Rlcy4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBPU1NJICAgICAgICAgIExMX1RJTV9TZXRPZmZTdGF0ZXNcbgorICAqICAgICAgICAgQkRUUiAgICAgICAgIE9TU1IgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlcworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgT2ZmU3RhdGVJZGxlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU0lfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PU1NJX0VOQUJMRQorICAqIEBwYXJhbSAgT2ZmU3RhdGVSdW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fT1NTUl9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX09TU1JfRU5BQkxFCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0T2ZmU3RhdGVzKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBPZmZTdGF0ZUlkbGUsIHVpbnQzMl90IE9mZlN0YXRlUnVuKQoreworICBNT0RJRllfUkVHKFRJTXgtPkJEVFIsIFRJTV9CRFRSX09TU0kgfCBUSU1fQkRUUl9PU1NSLCBPZmZTdGF0ZUlkbGUgfCBPZmZTdGF0ZVJ1bik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGF1dG9tYXRpYyBvdXRwdXQgKE1PRSBjYW4gYmUgc2V0IGJ5IHNvZnR3YXJlIG9yIGF1dG9tYXRpY2FsbHkgd2hlbiBhIGJyZWFrIGlucHV0IGlzIGFjdGl2ZSkuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQU9FICAgICAgICAgICBMTF9USU1fRW5hYmxlQXV0b21hdGljT3V0cHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQXV0b21hdGljT3V0cHV0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0FPRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBhdXRvbWF0aWMgb3V0cHV0IChNT0UgY2FuIGJlIHNldCBvbmx5IGJ5IHNvZnR3YXJlKS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBBT0UgICAgICAgICAgIExMX1RJTV9EaXNhYmxlQXV0b21hdGljT3V0cHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUF1dG9tYXRpY091dHB1dChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX0FPRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBhdXRvbWF0aWMgb3V0cHV0IGlzIGVuYWJsZWQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgQU9FICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEF1dG9tYXRpY091dHB1dChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+QkRUUiwgVElNX0JEVFJfQU9FKSA9PSAoVElNX0JEVFJfQU9FKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgb3V0cHV0cyAoc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgICogQG5vdGUgVGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyIGFsbG93cyB0byBlbmFibGUgL2Rpc2FibGUgdGhlIG91dHB1dHMgYnkKKyAgKiAgICAgICBzb2Z0d2FyZSBhbmQgaXMgcmVzZXQgaW4gY2FzZSBvZiBicmVhayBvciBicmVhazIgZXZlbnQKKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9FbmFibGVBbGxPdXRwdXRzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5CRFRSLCBUSU1fQkRUUl9NT0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIG91dHB1dHMgKHJlc2V0IHRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlcikuCisgICogQG5vdGUgVGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyIGFsbG93cyB0byBlbmFibGUgL2Rpc2FibGUgdGhlIG91dHB1dHMgYnkKKyAgKiAgICAgICBzb2Z0d2FyZSBhbmQgaXMgcmVzZXQgaW4gY2FzZSBvZiBicmVhayBvciBicmVhazIgZXZlbnQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQHJtdG9sbCBCRFRSICAgICAgICAgTU9FICAgICAgICAgICBMTF9USU1fRGlzYWJsZUFsbE91dHB1dHMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlQWxsT3V0cHV0cyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgb3V0cHV0cyBhcmUgZW5hYmxlZC4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBicmVhayBpbnB1dC4KKyAgKiBAcm10b2xsIEJEVFIgICAgICAgICBNT0UgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRBbGxPdXRwdXRzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZEFsbE91dHB1dHMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkJEVFIsIFRJTV9CRFRSX01PRSkgPT0gKFRJTV9CRFRSX01PRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIHNpZ25hbHMgY29ubmVjdGVkIHRvIHRoZSBkZXNpZ25hdGVkIHRpbWVyIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4KKyAgKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDFFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0NNUDJFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCS0NNUDFFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCS0NNUDJFICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJyZWFrSW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWtJbnB1dCwgdWludDMyX3QgU291cmNlKQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5BRjEpICsgQnJlYWtJbnB1dCkpOworICBTRVRfQklUKCpwUmVnLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNpZ25hbHMgY29ubmVjdGVkIHRvIHRoZSBkZXNpZ25hdGVkIHRpbWVyIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4KKyAgKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAxRSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCS0lORSAgICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuCisgICogICAgICAgICBBRjIgICAgICAgICAgQktDTVAxRSAgICAgICBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2VcbgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLQ01QMkUgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEJyZWFrSW5wdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CUkVBS19JTlBVVF9CS0lOMgorICAqIEBwYXJhbSAgU291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0NPTVAyCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUJyZWFrSW5wdXRTb3VyY2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrSW5wdXQsIHVpbnQzMl90IFNvdXJjZSkKK3sKKyAgcmVnaXN0ZXIgX19JTyB1aW50MzJfdCAqcFJlZyA9IChfX0lPIHVpbnQzMl90ICopKCh1aW50MzJfdCkoKHVpbnQzMl90KSgmVElNeC0+QUYxKSArIEJyZWFrSW5wdXQpKTsKKyAgQ0xFQVJfQklUKCpwUmVnLCBTb3VyY2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgcG9sYXJpdHkgb2YgdGhlIGJyZWFrIHNpZ25hbCBmb3IgdGhlIHRpbWVyIGJyZWFrIGlucHV0LgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBhbGxvd3MgZm9yIGJyZWFrIGlucHV0IHNlbGVjdGlvbi4KKyAgKiBAcm10b2xsIEFGMSAgICAgICAgICBCS0lOUCAgICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICAqICAgICAgICAgQUYxICAgICAgICAgIEJLQ01QMVAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgICogICAgICAgICBBRjEgICAgICAgICAgQktDTVAyUCAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5XG4KKyAgKiAgICAgICAgIEFGMiAgICAgICAgICBCSzJJTlAgICAgICAgIExMX1RJTV9TZXRCcmVha0lucHV0U291cmNlUG9sYXJpdHlcbgorICAqICAgICAgICAgQUYyICAgICAgICAgIEJLMkNNUDFQICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCisgICogICAgICAgICBBRjIgICAgICAgICAgQksyQ01QMlAgICAgICBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBCcmVha0lucHV0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0lOUFVUX0JLSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQlJFQUtfSU5QVVRfQktJTjIKKyAgKiBAcGFyYW0gIFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9CS0lOX1NPVVJDRV9CS0lOCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JLSU5fU09VUkNFX0JLQ09NUDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9TT1VSQ0VfQktDT01QMgorICAqIEBwYXJhbSAgUG9sYXJpdHkgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9QT0xBUklUWV9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fQktJTl9QT0xBUklUWV9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0QnJlYWtJbnB1dFNvdXJjZVBvbGFyaXR5KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBCcmVha0lucHV0LCB1aW50MzJfdCBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBvbGFyaXR5KQoreworICByZWdpc3RlciBfX0lPIHVpbnQzMl90ICpwUmVnID0gKF9fSU8gdWludDMyX3QgKikoKHVpbnQzMl90KSgodWludDMyX3QpKCZUSU14LT5BRjEpICsgQnJlYWtJbnB1dCkpOworICBNT0RJRllfUkVHKCpwUmVnLCAoVElNeF9BRjFfQktJTlAgPDwgVElNX1BPU0lUSU9OX0JSS19TT1VSQ0UpLCAoUG9sYXJpdHkgPDwgVElNX1BPU0lUSU9OX0JSS19TT1VSQ0UpKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX0RNQV9CdXJzdF9Nb2RlIERNQSBidXJzdCBtb2RlIGNvbmZpZ3VyYXRpb24KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aW1lciBETUEgYnVyc3QgZmVhdHVyZS4KKyAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgICogICAgICAgbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIERNQSBidXJzdCBtb2RlLgorICAqIEBybXRvbGwgRENSICAgICAgICAgIERCTCAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0XG4KKyAgKiAgICAgICAgIERDUiAgICAgICAgICBEQkEgICAgICAgICAgIExMX1RJTV9Db25maWdETUFCdXJzdAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEBwYXJhbSAgRE1BQnVyc3RCYXNlQWRkcmVzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX1NNQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfRElFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9TUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9FR1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NNUjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NFUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DTlQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfUFNDCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FSUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9SQ1IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1IyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDUjMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9CRFRSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX09SCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0NDTVIzIAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9CQVNFQUREUl9DQ1I1ICAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfQkFTRUFERFJfQ0NSNiAgCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FGMSAgCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0JBU0VBRERSX0FGMiAgCisgICogQHBhcmFtICBETUFCdXJzdExlbmd0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMVRSQU5TRkVSCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8yVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8zVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF80VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF81VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF82VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF83VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF84VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF85VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xMFRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTFUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzEyVFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xM1RSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTRUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE1VFJBTlNGRVJTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0RNQUJVUlNUX0xFTkdUSF8xNlRSQU5TRkVSUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9ETUFCVVJTVF9MRU5HVEhfMTdUUkFOU0ZFUlMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fRE1BQlVSU1RfTEVOR1RIXzE4VFJBTlNGRVJTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ29uZmlnRE1BQnVyc3QoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IERNQUJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IERNQUJ1cnN0TGVuZ3RoKQoreworICBNT0RJRllfUkVHKFRJTXgtPkRDUiwgKFRJTV9EQ1JfREJMIHwgVElNX0RDUl9EQkEpLCAoRE1BQnVyc3RCYXNlQWRkcmVzcyB8IERNQUJ1cnN0TGVuZ3RoKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0xMX0VGX1RpbWVyX0lucHV0c19SZW1hcHBpbmcgVGltZXIgaW5wdXQgcmVtYXBwaW5nCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgUmVtYXAgVElNIGlucHV0cyAoaW5wdXQgY2hhbm5lbCwgaW50ZXJuYWwvZXh0ZXJuYWwgdHJpZ2dlcnMpLgorICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1JFTUFQX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgYSBzb21lIHRpbWVyIGlucHV0cyBjYW4gYmUgcmVtYXBwZWQuCisgICogQHJtdG9sbCBUSU0xX09SICAgIEVUUl9BREMxX1JNUCAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xX09SICAgIFRJMV9STVAgICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX09SICAgIElUUjFfUk1QICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX09SICAgIFRJNF9STVAgICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0yX09SICAgIFRJMV9STVAgICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xNl9PUiAgIFRJMV9STVAgICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogICAgICAgICBUSU0xN19PUiAgIFRJMV9STVAgICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHBhcmFtICBSZW1hcCBSZW1hcCBwYXJhbSBkZXBlbmRzIG9uIHRoZSBUSU14LiBEZXNjcmlwdGlvbiBhdmFpbGFibGUgb25seQorICAqICAgICAgICAgaW4gQ0hNIHZlcnNpb24gb2YgdGhlIFVzZXIgTWFudWFsIChub3QgaW4gLnBkZikuCisgICogICAgICAgICBPdGhlcndpc2Ugc2VlIFJlZmVyZW5jZSBNYW51YWwgZGVzY3JpcHRpb24gb2YgT1IgcmVnaXN0ZXJzLgorICAqCisgICogICAgICAgICBCZWxvdyBkZXNjcmlwdGlvbiBzdW1tYXJpemVzICJUaW1lciBJbnN0YW5jZSIgYW5kICJSZW1hcCIgcGFyYW0gY29tYmluYXRpb25zOgorICAqCisgICogICAgICAgICBUSU0xOiBhbnkgY29tYmluYXRpb24gb2YgVEkxX1JNUCwgQURDM19STVAsIEFEQzFfUk1QIHdoZXJlCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBBREMxX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX05DCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTFfRVRSX0FEQzFfUk1QX0FXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9FVFJfQURDMV9STVBfQVdEMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xX0VUUl9BREMxX1JNUF9BV0QzCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBUSTFfUk1QIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9USTFfUk1QX0dQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMV9USTFfUk1QX0NPTVAxCisgICoKKyAgKiAgICAgICAgIFRJTTI6IGFueSBjb21iaW5hdGlvbiBvZiBJVFIxX1JNUCwgRVRSMV9STVAsIFRJNF9STVAgd2hlcmUKKyAgKgorICAqICAgICAgICAgICAgSVRSMV9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX0lUUjFfUk1QX05PTkUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9JVFIxX1JNUF9VU0JfU09GCisgICoKKyAgKiAgICAgICAgICAgIC4gLiBFVFIxX1JNUCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfRVRSX1JNUF9MU0UKKyAgKgorICAqICAgICAgICAgICAgLiAuIFRJNF9STVAgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJNF9STVBfR1BJTworICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0yX1RJNF9STVBfQ09NUDEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMl9USTRfUk1QX0NPTVAyCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTJfVEk0X1JNUF9DT01QMV9DT01QMgorICAqCisgICogICAgICAgICBUSU0xNjogb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTZfVEkxX1JNUF9HUElPCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTFNJCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfTFNFCisgICogICAgICAgICAgICBAYXJnIEByZWYgTExfVElNX1RJTTE2X1RJMV9STVBfUlRDCisgICoKKyAgKiAgICAgICAgIFRJTTE3OiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9USU0xN19USTFfUk1QX0dQSU8KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9NU0kKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9IU0VfMzIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBMTF9USU1fVElNMTdfVEkxX1JNUF9NQ08KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9TZXRSZW1hcChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgUmVtYXApCit7CisgIE1PRElGWV9SRUcoVElNeC0+T1IsIChSZW1hcCA+PiBUSU14X09SX1JNUF9TSElGVCksIChSZW1hcCAmIFRJTXhfT1JfUk1QX01BU0spKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfT0NSRUZfQ2xlYXIgT0NSRUZfQ2xlYXJfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgT0NSRUYgY2xlYXIgaW5wdXQgc291cmNlCisgICogQG5vdGUgVGhlIE9DeFJFRiBzaWduYWwgb2YgYSBnaXZlbiBjaGFubmVsIGNhbiBiZSBjbGVhcmVkIHdoZW4gYSBoaWdoIGxldmVsIGlzIGFwcGxpZWQgb24gdGhlIE9DUkVGX0NMUl9JTlBVVAorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLgorICAqIEBybXRvbGwgU01DUiAgICAgICAgICBPQ0NTICAgICAgICAgICAgICAgIExMX1RJTV9TZXRPQ1JlZkNsZWFySW5wdXRTb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX09DUkVGX0NMUgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9PQ1JFRl9DTFJfSU5UX0VUUgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX1NldE9DUmVmQ2xlYXJJbnB1dFNvdXJjZShUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgT0NSZWZDbGVhcklucHV0U291cmNlKQoreworICBNT0RJRllfUkVHKFRJTXgtPlNNQ1IsIFRJTV9TTUNSX09DQ1MsIE9DUmVmQ2xlYXJJbnB1dFNvdXJjZSk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBRy1NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBVSUYgICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9VSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIHVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBpcyBzZXQgKHVwZGF0ZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVUlGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX1VJRikgPT0gKFRJTV9TUl9VSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCBmbGFnIChDQzFGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzFJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzFJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGZsYWcgKENDMUYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMUlGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzFJRikgPT0gKFRJTV9TUl9DQzFJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0IGZsYWcgKENDMkYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMklGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDMklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgZmxhZyAoQ0MyRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MySUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDMklGKSA9PSAoVElNX1NSX0NDMklGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgZmxhZyAoQ0MzRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MzSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBmbGFnIChDQzNGKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzNJRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MzSUYpID09IChUSU1fU1JfQ0MzSUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCBmbGFnIChDQzRGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRJRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzRJRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGZsYWcgKENDNEYpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNElGICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzRJRikgPT0gKFRJTV9TUl9DQzRJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDUgaW50ZXJydXB0IGZsYWcgKENDNUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNUlGICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0M1KFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDNUlGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgNSBpbnRlcnJ1cHQgZmxhZyAoQ0M1RikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgNSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M1SUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M1KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDNUlGKSA9PSAoVElNX1NSX0NDNUlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgNiBpbnRlcnJ1cHQgZmxhZyAoQ0M2RikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0M2SUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDNgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzYoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0M2SUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBmbGFnIChDQzZGKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSA2IGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzZJRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0M2CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzYoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0M2SUYpID09IChUSU1fU1JfQ0M2SUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIGNvbW11dGF0aW9uIGludGVycnVwdCBmbGFnIChDT01JRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ09NSUYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIGNvbW11dGF0aW9uIGludGVycnVwdCBmbGFnIChDT01JRikgaXMgc2V0IChjb21tdXRhdGlvbiBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ09NSUYgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NPTUlGKSA9PSAoVElNX1NSX0NPTUlGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSB0cmlnZ2VyIGludGVycnVwdCBmbGFnIChUSUYpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIFRJRiAgICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfVElGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB0cmlnZ2VyIGludGVycnVwdCBmbGFnIChUSUYpIGlzIHNldCAodHJpZ2dlciBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgVElGICAgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX1RSSUcoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfVElGKSA9PSAoVElNX1NSX1RJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgYnJlYWsgaW50ZXJydXB0IGZsYWcgKEJJRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQklGICAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBicmVhayBpbnRlcnJ1cHQgZmxhZyAoQklGKSBpcyBzZXQgKGJyZWFrIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBCSUYgICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQklGKSA9PSAoVElNX1NSX0JJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgYnJlYWsgMiBpbnRlcnJ1cHQgZmxhZyAoQjJJRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQjJJRiAgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0JSSzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQlJLMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9CMklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBicmVhayAyIGludGVycnVwdCBmbGFnIChCMklGKSBpcyBzZXQgKGJyZWFrIDIgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEIySUYgICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19CUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19CUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0IySUYpID09IChUSU1fU1JfQjJJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDEgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzFPRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MxT0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMU9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzFPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MxT0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAxIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MxT0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDMU9GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzFPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDMU9WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzFPRikgPT0gKFRJTV9TUl9DQzFPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgQ2FwdHVyZS9Db21wYXJlIDIgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzJPRikuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MyT0YgICAgICAgICBMTF9USU1fQ2xlYXJGbGFnX0NDMk9WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NsZWFyRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFdSSVRFX1JFRyhUSU14LT5TUiwgfihUSU1fU1JfQ0MyT0YpKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB3aGV0aGVyIENhcHR1cmUvQ29tcGFyZSAyIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MyT0YpIGlzIHNldCAoQ2FwdHVyZS9Db21wYXJlIDIgb3Zlci1jYXB0dXJlIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzJPRiAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MyT1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19DQzJPVlIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfQ0MyT0YpID09IChUSU1fU1JfQ0MyT0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgdGhlIENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgZmxhZyAoQ0MzT0YpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDM09GICAgICAgICAgTExfVElNX0NsZWFyRmxhZ19DQzNPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9DbGVhckZsYWdfQ0MzT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICBXUklURV9SRUcoVElNeC0+U1IsIH4oVElNX1NSX0NDM09GKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBDYXB0dXJlL0NvbXBhcmUgMyBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDM09GKSBpcyBzZXQgKENhcHR1cmUvQ29tcGFyZSAzIG92ZXItY2FwdHVyZSBpbnRlcnJ1cHQgaXMgcGVuZGluZykuCisgICogQHJtdG9sbCBTUiAgICAgICAgICAgQ0MzT0YgICAgICAgICBMTF9USU1fSXNBY3RpdmVGbGFnX0NDM09WUgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0FjdGl2ZUZsYWdfQ0MzT1ZSKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5TUiwgVElNX1NSX0NDM09GKSA9PSAoVElNX1NSX0NDM09GKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBDYXB0dXJlL0NvbXBhcmUgNCBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGZsYWcgKENDNE9GKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBDQzRPRiAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfQ0M0T1ZSCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX0NDNE9WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9DQzRPRikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHdoZXRoZXIgQ2FwdHVyZS9Db21wYXJlIDQgb3Zlci1jYXB0dXJlIGludGVycnVwdCBmbGFnIChDQzRPRikgaXMgc2V0IChDYXB0dXJlL0NvbXBhcmUgNCBvdmVyLWNhcHR1cmUgaW50ZXJydXB0IGlzIHBlbmRpbmcpLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIENDNE9GICAgICAgICAgTExfVElNX0lzQWN0aXZlRmxhZ19DQzRPVlIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVGbGFnX0NDNE9WUihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+U1IsIFRJTV9TUl9DQzRPRikgPT0gKFRJTV9TUl9DQzRPRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgc3lzdGVtIGJyZWFrIGludGVycnVwdCBmbGFnIChTQklGKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBTQklGICAgICAgICAgIExMX1RJTV9DbGVhckZsYWdfU1lTQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fQ2xlYXJGbGFnX1NZU0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgV1JJVEVfUkVHKFRJTXgtPlNSLCB+KFRJTV9TUl9TQklGKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBzeXN0ZW0gYnJlYWsgaW50ZXJydXB0IGZsYWcgKFNCSUYpIGlzIHNldCAoc3lzdGVtIGJyZWFrIGludGVycnVwdCBpcyBwZW5kaW5nKS4KKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBTQklGICAgICAgICAgIExMX1RJTV9Jc0FjdGl2ZUZsYWdfU1lTQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzQWN0aXZlRmxhZ19TWVNCUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPlNSLCBUSU1fU1JfU0JJRikgPT0gKFRJTV9TUl9TQklGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9JVF9NYW5hZ2VtZW50IElULU1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdXBkYXRlIGludGVycnVwdCAoVUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHVwZGF0ZSBpbnRlcnJ1cHQgKFVJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX1VQREFURQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9VSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1cGRhdGUgaW50ZXJydXB0IChVSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVUlFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVUlFKSA9PSAoVElNX0RJRVJfVUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgKENDMUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFJRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDEgIGludGVycnVwdCAoQ0MxSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzEKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMSBpbnRlcnJ1cHQgKENDMUlFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMUlFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMUlFKSA9PSAoVElNX0RJRVJfQ0MxSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMklFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiAgaW50ZXJydXB0IChDQzJJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX0NDMgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVJVF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIGludGVycnVwdCAoQ0MySUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MySUUgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZElUX0NDMihUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MySUUpID09IChUSU1fRElFUl9DQzJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IChDQzNJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzSUUgICAgICAgICBMTF9USU1fRW5hYmxlSVRfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAzICBpbnRlcnJ1cHQgKENDM0lFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNJRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDMgaW50ZXJydXB0IChDQzNJRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzNJRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ0MzKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzNJRSkgPT0gKFRJTV9ESUVSX0NDM0lFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgKENDNElFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRJRSAgICAgICAgIExMX1RJTV9FbmFibGVJVF9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDQgIGludGVycnVwdCAoQ0M0SUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0Rpc2FibGVJVF9DQzQKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0SUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgNCBpbnRlcnJ1cHQgKENDNElFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDNElFICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDNElFKSA9PSAoVElNX0RJRVJfQ0M0SUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNvbW11dGF0aW9uIGludGVycnVwdCAoQ09NSUUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTUlFICAgICAgICAgTExfVElNX0VuYWJsZUlUX0NPTQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZUlUX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjb21tdXRhdGlvbiBpbnRlcnJ1cHQgKENPTUlFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gaW50ZXJydXB0IChDT01JRSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDT01JRSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRJVF9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkSVRfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DT01JRSkgPT0gKFRJTV9ESUVSX0NPTUlFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0cmlnZ2VyIGludGVycnVwdCAoVElFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBUSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRJRSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUlUX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlSVRfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1RJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyaWdnZXIgaW50ZXJydXB0IChUSUUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVElFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkSVRfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9USUUpID09IChUSU1fRElFUl9USUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGJyZWFrIGludGVycnVwdCAoQklFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9FbmFibGVJVF9CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVJVF9CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGJyZWFrIGludGVycnVwdCAoQklFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBCSUUgICAgICAgICAgIExMX1RJTV9EaXNhYmxlSVRfQlJLCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZUlUX0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJyZWFrIGludGVycnVwdCAoQklFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIEJJRSAgICAgICAgICAgTExfVElNX0lzRW5hYmxlZElUX0JSSworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRJVF9CUksoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0JJRSkgPT0gKFRJTV9ESUVSX0JJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fTExfRUZfRE1BX01hbmFnZW1lbnQgRE1BLU1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgdXBkYXRlIERNQSByZXF1ZXN0IChVREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIFVERSAgICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfVVBEQVRFKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgRE1BIHJlcXVlc3QgKFVERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVURFICAgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBETUEgcmVxdWVzdCAgKFVERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBVREUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVVBEQVRFCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9VUERBVEUoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX1VERSkgPT0gKFRJTV9ESUVSX1VERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDEgRE1BIHJlcXVlc3QgKENDMURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgMSAgRE1BIHJlcXVlc3QgKENDMURFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzFERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MxREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgMSBETUEgcmVxdWVzdCAoQ0MxREUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MxREUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMQorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MxKFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzFERSkgPT0gKFRJTV9ESUVSX0NDMURFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjYXB0dXJlL2NvbXBhcmUgMiBETUEgcmVxdWVzdCAoQ0MyREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DQzIKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ0MyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNhcHR1cmUvY29tcGFyZSAyICBETUEgcmVxdWVzdCAoQ0MyREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDMkRFICAgICAgICAgTExfVElNX0Rpc2FibGVETUFSZXFfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIENMRUFSX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzJERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhcHR1cmUvY29tcGFyZSAyIERNQSByZXF1ZXN0IChDQzJERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzJERSAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDMkRFKSA9PSAoVElNX0RJRVJfQ0MyREUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGNhcHR1cmUvY29tcGFyZSAzIERNQSByZXF1ZXN0IChDQzNERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX0NDMworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0VuYWJsZURNQVJlcV9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgY2FwdHVyZS9jb21wYXJlIDMgIERNQSByZXF1ZXN0IChDQzNERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0MzREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NDM0RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FwdHVyZS9jb21wYXJlIDMgRE1BIHJlcXVlc3QgKENDM0RFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENDM0RFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DQzMKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDMyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0MzREUpID09IChUSU1fRElFUl9DQzNERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgY2FwdHVyZS9jb21wYXJlIDQgRE1BIHJlcXVlc3QgKENDNERFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRERSAgICAgICAgIExMX1RJTV9FbmFibGVETUFSZXFfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRW5hYmxlRE1BUmVxX0NDNChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRERSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBjYXB0dXJlL2NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKENDNERFKS4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBDQzRERSAgICAgICAgIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVETUFSZXFfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ0M0REUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYXB0dXJlL2NvbXBhcmUgNCBETUEgcmVxdWVzdCAoQ0M0REUpIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ0M0REUgICAgICAgICBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NDNAorICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfQ0M0KFRJTV9UeXBlRGVmICpUSU14KQoreworICByZXR1cm4gKChSRUFEX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9DQzRERSkgPT0gKFRJTV9ESUVSX0NDNERFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBjb21tdXRhdGlvbiBETUEgcmVxdWVzdCAoQ09NREUpLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTURFICAgICAgICAgTExfVElNX0VuYWJsZURNQVJlcV9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfQ09NKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGNvbW11dGF0aW9uIERNQSByZXF1ZXN0IChDT01ERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgQ09NREUgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9EaXNhYmxlRE1BUmVxX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgQ0xFQVJfQklUKFRJTXgtPkRJRVIsIFRJTV9ESUVSX0NPTURFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKENPTURFKSBpcyBlbmFibGVkLgorICAqIEBybXRvbGwgRElFUiAgICAgICAgIENPTURFICAgICAgICAgTExfVElNX0lzRW5hYmxlZERNQVJlcV9DT00KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNFbmFibGVkRE1BUmVxX0NPTShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfQ09NREUpID09IChUSU1fRElFUl9DT01ERSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fRW5hYmxlRE1BUmVxX1RSSUcKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9FbmFibGVETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5ESUVSLCBUSU1fRElFUl9UREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkuCisgICogQHJtdG9sbCBESUVSICAgICAgICAgVERFICAgICAgICAgICBMTF9USU1fRGlzYWJsZURNQVJlcV9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fRGlzYWJsZURNQVJlcV9UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBDTEVBUl9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJpZ2dlciBpbnRlcnJ1cHQgKFRERSkgaXMgZW5hYmxlZC4KKyAgKiBAcm10b2xsIERJRVIgICAgICAgICBUREUgICAgICAgICAgIExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVFJJRworICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1RJTV9Jc0VuYWJsZWRETUFSZXFfVFJJRyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVElNeC0+RElFUiwgVElNX0RJRVJfVERFKSA9PSAoVElNX0RJRVJfVERFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9FVkVOVF9NYW5hZ2VtZW50IEVWRU5ULU1hbmFnZW1lbnQKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZSBhbiB1cGRhdGUgZXZlbnQuCisgICogQHJtdG9sbCBFR1IgICAgICAgICAgVUcgICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9HZW5lcmF0ZUV2ZW50X1VQREFURShUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfVUcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIENhcHR1cmUvQ29tcGFyZSAxIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIENDMUcgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MxCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzEoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDMUcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIENhcHR1cmUvQ29tcGFyZSAyIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIENDMkcgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzIoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDMkcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIENhcHR1cmUvQ29tcGFyZSAzIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIENDM0cgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0MzCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzMoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDM0cpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIENhcHR1cmUvQ29tcGFyZSA0IGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIENDNEcgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ0M0CisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DQzQoVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NDNEcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGNvbW11dGF0aW9uIGV2ZW50LgorICAqIEBybXRvbGwgRUdSICAgICAgICAgIENPTUcgICAgICAgICAgTExfVElNX0dlbmVyYXRlRXZlbnRfQ09NCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9DT00oVElNX1R5cGVEZWYgKlRJTXgpCit7CisgIFNFVF9CSVQoVElNeC0+RUdSLCBUSU1fRUdSX0NPTUcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIHRyaWdnZXIgZXZlbnQuCisgICogQHJtdG9sbCBFR1IgICAgICAgICAgVEcgICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9UUklHCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9UUklHKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9URyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYnJlYWsgZXZlbnQuCisgICogQHJtdG9sbCBFR1IgICAgICAgICAgQkcgICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksKKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9HZW5lcmF0ZUV2ZW50X0JSSyhUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgU0VUX0JJVChUSU14LT5FR1IsIFRJTV9FR1JfQkcpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGJyZWFrIDIgZXZlbnQuCisgICogQHJtdG9sbCBFR1IgICAgICAgICAgQjJHICAgICAgICAgICBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksyCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fR2VuZXJhdGVFdmVudF9CUksyKFRJTV9UeXBlRGVmICpUSU14KQoreworICBTRVRfQklUKFRJTXgtPkVHUiwgVElNX0VHUl9CMkcpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX1RJTV9EZUluaXQoVElNX1R5cGVEZWYgKlRJTXgpOwordm9pZCBMTF9USU1fU3RydWN0SW5pdChMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSW5pdFR5cGVEZWYgKlRJTV9Jbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX09DX1N0cnVjdEluaXQoTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fT0NfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9JQ19TdHJ1Y3RJbml0KExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fSUNfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNfSW5pdFN0cnVjdCk7Cit2b2lkIExMX1RJTV9FTkNPREVSX1N0cnVjdEluaXQoTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgKlRJTV9FbmNvZGVySW5pdFN0cnVjdCk7CitFcnJvclN0YXR1cyBMTF9USU1fRU5DT0RFUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KTsKK3ZvaWQgTExfVElNX0hBTExTRU5TT1JfU3RydWN0SW5pdChMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1RJTV9IQUxMU0VOU09SX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpOwordm9pZCBMTF9USU1fQkRUUl9TdHJ1Y3RJbml0KExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVElNX0JEVFJfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0JEVFJfSW5pdFR5cGVEZWYgKlRJTV9CRFRSSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVElNMSB8fCBUSU0yIHx8IFRJTTE2IHx8IFRJTTE3ICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NUTTMyV0J4eF9MTF9USU1fSCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfdXNhcnQuaCBiL0luYy9zdG0zMndieHhfbGxfdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZkNWQwCi0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9sbF91c2FydC5oCkBAIC0wLDAgKzEsNDM3NyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF91c2FydC5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0FSVCBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMldCeHhfTExfVVNBUlRfSAorI2RlZmluZSBTVE0zMldCeHhfTExfVVNBUlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4LmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkKKworLyoqIEBkZWZncm91cCBVU0FSVF9MTCBVU0FSVAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX1ZhcmlhYmxlcyBVU0FSVCBQcml2YXRlIFZhcmlhYmxlcworICAqIEB7CisgICovCisvKiBBcnJheSB1c2VkIHRvIGdldCB0aGUgVVNBUlQgcHJlc2NhbGVyIGRpdmlzaW9uIGRlY2ltYWwgdmFsdWVzIHZlcnN1cyBAcmVmIFVTQVJUX0xMX0VDX1BSRVNDQUxFUiB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBVU0FSVF9QUkVTQ0FMRVJfVEFCW10gPQoreworICAodWludDE2X3QpMSwKKyAgKHVpbnQxNl90KTIsCisgICh1aW50MTZfdCk0LAorICAodWludDE2X3QpNiwKKyAgKHVpbnQxNl90KTgsCisgICh1aW50MTZfdCkxMCwKKyAgKHVpbnQxNl90KTEyLAorICAodWludDE2X3QpMTYsCisgICh1aW50MTZfdCkzMiwKKyAgKHVpbnQxNl90KTY0LAorICAodWludDE2X3QpMTI4LAorICAodWludDE2X3QpMjU2Cit9OworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMgVVNBUlQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9NYWNyb3MgVVNBUlQgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKlVTRV9GVUxMX0xMX0RSSVZFUiovCisKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VTX0lOSVQgVVNBUlQgRXhwb3J0ZWQgSW5pdCBzdHJ1Y3R1cmVzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIExMIFVTQVJUIEluaXQgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFByZXNjYWxlclZhbHVlOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBQcmVzY2FsZXIgdG8gY29tcHV0ZSB0aGUgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QUkVTQ0FMRVIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFByZXNjYWxlcigpLiovCisKKyAgdWludDMyX3QgQmF1ZFJhdGU7ICAgICAgICAgICAgICAgICAgLyohPCBUaGlzIGZpZWxkIGRlZmluZXMgZXhwZWN0ZWQgVXNhcnQgY29tbXVuaWNhdGlvbiBiYXVkIHJhdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldEJhdWRSYXRlKCkuKi8KKworICB1aW50MzJfdCBEYXRhV2lkdGg7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBpbiBhIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfREFUQVdJRFRILgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXREYXRhV2lkdGgoKS4qLworCisgIHVpbnQzMl90IFN0b3BCaXRzOyAgICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzIHRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfU1RPUEJJVFMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkuKi8KKworICB1aW50MzJfdCBQYXJpdHk7ICAgICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgcGFyaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19QQVJJVFkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpLiovCisKKyAgdWludDMyX3QgVHJhbnNmZXJEaXJlY3Rpb247ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgUmVjZWl2ZSBhbmQvb3IgVHJhbnNtaXQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfRElSRUNUSU9OLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRUcmFuc2ZlckRpcmVjdGlvbigpLiovCisKKyAgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbDsgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIG1vZGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0hXQ09OVFJPTC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVVNBUlRfU2V0SFdGbG93Q3RybCgpLiovCisKKyAgdWludDMyX3QgT3ZlclNhbXBsaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciBVU0FSVCBvdmVyc2FtcGxpbmcgbW9kZSBpcyAxNiBvciA4LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfT1ZFUlNBTVBMSU5HLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24gQHJlZiBMTF9VU0FSVF9TZXRPdmVyU2FtcGxpbmcoKS4qLworCit9IExMX1VTQVJUX0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgTEwgVVNBUlQgQ2xvY2sgSW5pdCBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgQ2xvY2tPdXRwdXQ7ICAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX0NMT0NLLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIG9yIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUG9sYXJpdHk7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzdGVhZHkgc3RhdGUgb2YgdGhlIHNlcmlhbCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVTQVJUX0xMX0VDX1BPTEFSSVRZLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlQgSFcgY29uZmlndXJhdGlvbiBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX1VTQVJUX1NldENsb2NrUG9sYXJpdHkoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0byBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAqLworCisgIHVpbnQzMl90IENsb2NrUGhhc2U7ICAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayB0cmFuc2l0aW9uIG9uIHdoaWNoIHRoZSBiaXQgY2FwdHVyZSBpcyBtYWRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVVNBUlRfTExfRUNfUEhBU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24uICovCisKKyAgdWludDMyX3QgTGFzdEJpdENsb2NrUHVsc2U7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2xvY2sgcHVsc2UgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCB0cmFuc21pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYml0IChNU0IpIGhhcyB0byBiZSBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVCBIVyBjb25maWd1cmF0aW9uIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb25zIEByZWYgTExfVVNBUlRfU2V0TGFzdENsa1B1bHNlT3V0cHV0KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4gKi8KKworfSBMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmOworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9Db25zdGFudHMgVVNBUlQgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1dyaXRlUmVnIGZ1bmN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9ORUNGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkVDRiAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yIGRldGVjdGVkIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9UWEZFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVFhGRUNGICAgICAgICAgICAgICAvKiE8IFRYIEZJRk8gRW1wdHkgQ2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQ0YgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENCR1RDRiAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQkdUQ0YgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGVkIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSUNSX0xCRENGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgICAgIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAvKiE8IENUUyBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9SVE9DRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfRU9CQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgICAgICAgICAgICAgLyohPCBFbmQgb2YgYmxvY2sgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfVURSQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1VEUkNGICAgICAgICAgICAgICAgLyohPCBTUEkgU2xhdmUgVW5kZXJydW4gQ2xlYXIgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0NNQ0YgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfVVNBUlRfUmVhZFJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9QRSAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUEUgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9GRSAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRkUgICAgICAgICAgICAgICAgICAvKiE8IEZyYW1pbmcgZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfTkUgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX05FICAgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9PUkUgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfT1JFICAgICAgICAgICAgICAgICAvKiE8IE92ZXJydW4gZXJyb3IgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfSURMRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0lETEUgICAgICAgICAgICAgICAgLyohPCBJZGxlIGxpbmUgZGV0ZWN0ZWQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfUlhORV9SWEZORSAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1JYTkVfUlhGTkUgICAgICAgICAgLyohPCBSZWFkIGRhdGEgcmVnaXN0ZXIgb3IgUlggRklGTyBub3QgZW1wdHkgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVEMgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RDICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhFX1RYRk5GICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRV9UWEZORiAgICAgICAgICAgLyohPCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IG9yIFRYIEZJRk8gTm90IEZ1bGwgZmxhZyovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9MQkRGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTEJERiAgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQ1RTSUYgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUU0lGICAgICAgICAgICAgICAgLyohPCBDVFMgaW50ZXJydXB0IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0NUUyAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFMgICAgICAgICAgICAgICAgIC8qITwgQ1RTIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JUT0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SVE9GICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgdGltZW91dCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9FT0JGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfRU9CRiAgICAgICAgICAgICAgICAvKiE8IEVuZCBvZiBibG9jayBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9VRFIgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVURSICAgICAgICAgICAgICAgICAvKiE8IFNQSSBTbGF2ZSB1bmRlcnJ1biBlcnJvciBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9BQlJFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQUJSRSAgICAgICAgICAgICAgICAvKiE8IEF1dG8gYmF1ZCByYXRlIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0FCUkYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJGICAgICAgICAgICAgICAgIC8qITwgQXV0byBiYXVkIHJhdGUgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0JVU1kgICAgICAgICAgICAgICAgLyohPCBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DTUYgICAgICAgICAgICAgICAgIC8qITwgQ2hhcmFjdGVyIG1hdGNoIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9TQktGICAgICAgICAgICAgICAgIC8qITwgU2VuZCBicmVhayBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SV1UgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUldVICAgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHdha2V1cCBmcm9tIE11dGUgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9XVUYgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfV1VGICAgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1RYRkUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9UWEZFICAgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SWEZGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhGRiAgICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVENCR1QgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfVVNBUlRfSVNSX1JYRlQgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SWEZUICAgICAgICAgICAgICAgIC8qITwgUlggRklGTyB0aHJlc2hvbGQgZmxhZyAqLworI2RlZmluZSBMTF9VU0FSVF9JU1JfVFhGVCAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RYRlQgICAgICAgICAgICAgICAgLyohPCBUWCBGSUZPIHRocmVzaG9sZCBmbGFnICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1VTQVJUX1JlYWRSZWcgYW5kICBMTF9VU0FSVF9Xcml0ZVJlZyBmdW5jdGlvbnMKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfSURMRUlFICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0lETEVJRSAgICAgICAgICAgICAgLyohPCBJRExFIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFICAgICAgICAgICAgIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSAgICAgIC8qITwgUmVhZCBkYXRhIHJlZ2lzdGVyIGFuZCBSWEZJRk8gbm90IGVtcHR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RDSUUgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UQ0lFICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFICAgICAgIC8qITwgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBhbmQgVFggRklGTyBub3QgZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9QRUlFICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUEVJRSAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfQ01JRSAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0NNSUUgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjFfUlRPSUUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JUT0lFICAgICAgICAgICAgICAgLyohPCBSZWNlaXZlciB0aW1lb3V0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX0VPQklFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9FT0JJRSAgICAgICAgICAgICAgIC8qITwgRW5kIG9mIEJsb2NrIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IxX1RYRkVJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9UWEZFSUUgICAgICAgICAgICAgIC8qITwgVFggRklGTyBlbXB0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMV9SWEZGSUUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUlhGRklFICAgICAgICAgICAgICAvKiE8IFJYIEZJRk8gZnVsbCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSMl9MQkRJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJESUUgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfV1VGSUUgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIExMX1VTQVJUX0NSM19UWEZUSUUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVElFICAgICAgICAgICAgICAvKiE8IFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1RDQkdUSUUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19UQ0JHVElFICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1JYRlRJRSAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SWEZUSUUgICAgICAgICAgICAgIC8qITwgUlggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0IGVuYWJsZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19GSUZPVEhSRVNIT0xEIEZJRk8gVGhyZXNob2xkCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzggICAgICAgICAgICAgIDB4MDAwMDAwMDBVIC8qITwgRklGTyByZWFjaGVzIDEvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgRklGTyByZWFjaGVzIDEvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgRklGTyByZWFjaGVzIDEvMiBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQgICAgICAgICAgICAgIDB4MDAwMDAwMDNVIC8qITwgRklGTyByZWFjaGVzIDMvNCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzggICAgICAgICAgICAgIDB4MDAwMDAwMDRVIC8qITwgRklGTyByZWFjaGVzIDcvOCBvZiBpdHMgZGVwdGggKi8KKyNkZWZpbmUgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzggICAgICAgICAgICAgIDB4MDAwMDAwMDVVIC8qITwgRklGTyBiZWNvbWVzIGVtcHR5IGZvciBUWCBhbmQgZnVsbCBmb3IgUlggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfRElSRUNUSU9OIENvbW11bmljYXRpb24gRGlyZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX05PTkUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgYXJlIGRpc2FibGVkICovCisjZGVmaW5lIExMX1VTQVJUX0RJUkVDVElPTl9SWCAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUkUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQgYW5kIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfRElSRUNUSU9OX1RYICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9URSAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc21pdHRlciBpcyBlbmFibGVkIGFuZCBSZWNlaXZlciBpcyBkaXNhYmxlZCAqLworI2RlZmluZSBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlggICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9URSB8VVNBUlRfQ1IxX1JFKSAgICAgICAvKiE8IFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlciBhcmUgZW5hYmxlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QQVJJVFkgUGFyaXR5IENvbnRyb2wKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QQVJJVFlfTk9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEFSSVRZX0VWRU4gICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9QQ0UgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFBhcml0eSBjb250cm9sIGVuYWJsZWQgYW5kIEV2ZW4gUGFyaXR5IGlzIHNlbGVjdGVkICovCisjZGVmaW5lIExMX1VTQVJUX1BBUklUWV9PREQgICAgICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUykgICAgICAgLyohPCBQYXJpdHkgY29udHJvbCBlbmFibGVkIGFuZCBPZGQgUGFyaXR5IGlzIHNlbGVjdGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUCBXYWtldXAKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9XQUtFVVBfSURMRUxJTkUgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgIFVTQVJUIHdha2UgdXAgZnJvbSBNdXRlIG1vZGUgb24gSWRsZSBMaW5lICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9BRERSRVNTTUFSSyAgICAgICAgICAgICBVU0FSVF9DUjFfV0FLRSAgICAgICAgLyohPCAgVVNBUlQgd2FrZSB1cCBmcm9tIE11dGUgbW9kZSBvbiBBZGRyZXNzIE1hcmsgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREFUQVdJRFRIIERhdGF3aWR0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF83QiAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTEgICAgICAgICAgICAvKiE8IDcgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgNyBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF84QiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IDggYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOCBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisjZGVmaW5lIExMX1VTQVJUX0RBVEFXSURUSF85QiAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfTTAgICAgICAgICAgICAvKiE8IDkgYml0cyB3b3JkIGxlbmd0aCA6IFN0YXJ0IGJpdCwgOSBkYXRhIGJpdHMsIG4gc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX09WRVJTQU1QTElORyBPdmVyc2FtcGxpbmcKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSAxNiAqLworI2RlZmluZSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX09WRVI4ICAgICAgICAvKiE8IE92ZXJzYW1wbGluZyBieSA4ICovCisvKioKKyAgKiBAfQorICAqLworCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0NMT0NLIENsb2NrIFNpZ25hbAorICAqIEB7CisgICovCisKKyNkZWZpbmUgTExfVVNBUlRfQ0xPQ0tfRElTQUJMRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgLyohPCBDbG9jayBzaWduYWwgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIExMX1VTQVJUX0NMT0NLX0VOQUJMRSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gICAgICAgIC8qITwgQ2xvY2sgc2lnbmFsIHByb3ZpZGVkICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19MQVNUQ0xLUFVMU0UgTGFzdCBDbG9jayBQdWxzZQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBUaGUgY2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgbm90IG91dHB1dCB0byB0aGUgU0NMSyBwaW4gKi8KKyNkZWZpbmUgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVCAgICAgICAgICAgIFVTQVJUX0NSMl9MQkNMICAgICAgICAvKiE8IFRoZSBjbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBpcyBvdXRwdXQgdG8gdGhlIFNDTEsgcGluICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1BIQVNFIENsb2NrIFBoYXNlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUEhBU0VfMUVER0UgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRoZSBmaXJzdCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSAqLworI2RlZmluZSBMTF9VU0FSVF9QSEFTRV8yRURHRSAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgICAgICAgIC8qITwgVGhlIHNlY29uZCBjbG9jayB0cmFuc2l0aW9uIGlzIHRoZSBmaXJzdCBkYXRhIGNhcHR1cmUgZWRnZSAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19QT0xBUklUWSBDbG9jayBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBTdGVhZHkgbG93IHZhbHVlIG9uIFNDTEsgcGluIG91dHNpZGUgdHJhbnNtaXNzaW9uIHdpbmRvdyovCisjZGVmaW5lIExMX1VTQVJUX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfQ1BPTCAgICAgICAgLyohPCBTdGVhZHkgaGlnaCB2YWx1ZSBvbiBTQ0xLIHBpbiBvdXRzaWRlIHRyYW5zbWlzc2lvbiB3aW5kb3cgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUFJFU0NBTEVSIENsb2NrIFNvdXJjZSBQcmVzY2FsZXIKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBub3QgZGV2aWRlZCAgICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyICAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMiAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQgICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSA0ICAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNiAgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8xIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDYgICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgOCAgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMiB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAxMCAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8yIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDEyICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNiAgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzIgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMTYgKi8KKyNkZWZpbmUgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyICAgICAgICAgICAgICAgIChVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSW5wdXQgY2xvY2sgZGV2aWRlZCBieSAzMiAqLworI2RlZmluZSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgICAgICAgKFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8zIHwgVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBJbnB1dCBjbG9jayBkZXZpZGVkIGJ5IDY0ICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjggICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMTI4ICovCisjZGVmaW5lIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYgICAgICAgICAgICAgICAoVVNBUlRfUFJFU0NfUFJFU0NBTEVSXzMgfCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVJfMSB8IFVTQVJUX1BSRVNDX1BSRVNDQUxFUl8wKSAvKiE8IElucHV0IGNsb2NrIGRldmlkZWQgYnkgMjU2ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1NUT1BCSVRTIFN0b3AgQml0cworICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1NUT1BCSVRTXzBfNSAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfU1RPUF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAwLjUgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMV81ICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1RPUF8wIHwgVVNBUlRfQ1IyX1NUT1BfMSkgICAgICAvKiE8IDEuNSBzdG9wIGJpdHMgKi8KKyNkZWZpbmUgTExfVVNBUlRfU1RPUEJJVFNfMiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9TVE9QXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IDIgc3RvcCBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1RYUlggVFggUlggUGlucyBTd2FwCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TVEFOREFSRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAvKiE8IFRYL1JYIHBpbnMgYXJlIHVzZWQgYXMgZGVmaW5lZCBpbiBzdGFuZGFyZCBwaW5vdXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfVFhSWF9TV0FQUEVEICAgICAgICAgICAgICAgICAgIChVU0FSVF9DUjJfU1dBUCkgICAgICAvKiE8IFRYIGFuZCBSWCBwaW5zIGZ1bmN0aW9ucyBhcmUgc3dhcHBlZC4gICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfUlhQSU5fTEVWRUwgUlggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgUlggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1JYSU5WKSAgICAgLyohPCBSWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfVFhQSU5fTEVWRUwgVFggUGluIEFjdGl2ZSBMZXZlbCBJbnZlcnNpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VU0FSVF9UWFBJTl9MRVZFTF9TVEFOREFSRCAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgIC8qITwgVFggcGluIHNpZ25hbCB3b3JrcyB1c2luZyB0aGUgc3RhbmRhcmQgbG9naWMgbGV2ZWxzICovCisjZGVmaW5lIExMX1VTQVJUX1RYUElOX0xFVkVMX0lOVkVSVEVEICAgICAgICAgICAoVVNBUlRfQ1IyX1RYSU5WKSAgICAgLyohPCBUWCBwaW4gc2lnbmFsIHZhbHVlcyBhcmUgaW52ZXJ0ZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfQklOQVJZX0xPR0lDIEJpbmFyeSBEYXRhIEludmVyc2lvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBMb2dpY2FsIGRhdGEgZnJvbSB0aGUgZGF0YSByZWdpc3RlciBhcmUgc2VuZC9yZWNlaXZlZCBpbiBwb3NpdGl2ZS9kaXJlY3QgbG9naWMuICgxPUgsIDA9TCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklOQVJZX0xPR0lDX05FR0FUSVZFICAgICAgICAgIFVTQVJUX0NSMl9EQVRBSU5WICAgICAvKiE8IExvZ2ljYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHJlZ2lzdGVyIGFyZSBzZW5kL3JlY2VpdmVkIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMuICgxPUwsIDA9SCkuIFRoZSBwYXJpdHkgYml0IGlzIGFsc28gaW52ZXJ0ZWQuICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0JJVE9SREVSIEJpdCBPcmRlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggZGF0YSBiaXQgMCBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QgICAgICAgICAgICAgIFVTQVJUX0NSMl9NU0JGSVJTVCAgICAvKiE8IGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCB0aGUgTVNCIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19BVVRPQkFVRF9ERVRFQ1RfT04gQXV0b2JhdWQgRGV0ZWN0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNZWFzdXJlbWVudCBvZiB0aGUgc3RhcnQgYml0IGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFIFVTQVJUX0NSMl9BQlJNT0RFXzAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGYWxsaW5nIGVkZ2UgdG8gZmFsbGluZyBlZGdlIG1lYXN1cmVtZW50LiBSZWNlaXZlZCBmcmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBzaW5nbGUgYml0ID0gMSAtPiBGcmFtZSA9IFN0YXJ0MTB4eHh4eHggKi8KKyNkZWZpbmUgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FICAgIFVTQVJUX0NSMl9BQlJNT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCAweDdGIGZyYW1lIGRldGVjdGlvbiAqLworI2RlZmluZSBMTF9VU0FSVF9BVVRPQkFVRF9ERVRFQ1RfT05fNTVfRlJBTUUgICAgKFVTQVJUX0NSMl9BQlJNT0RFXzEgfCBVU0FSVF9DUjJfQUJSTU9ERV8wKSAvKiE8IDB4NTUgZnJhbWUgZGV0ZWN0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0FERFJFU1NfREVURUNUIEFkZHJlc3MgTGVuZ3RoIERldGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCA0LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IgICAgICAgICAgICAgIFVTQVJUX0NSMl9BRERNNyAgICAgICAvKiE8IDctYml0IGFkZHJlc3MgZGV0ZWN0aW9uIChpbiA4LWJpdCBkYXRhIG1vZGUpIG1ldGhvZCBzZWxlY3RlZCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FQ19IV0NPTlRST0wgSGFyZHdhcmUgQ29udHJvbAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBDVFMgYW5kIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUUyAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19SVFNFICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFJUUyBvdXRwdXQgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHJlcXVlc3RlZCB3aGVuIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworI2RlZmluZSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0NUU0UgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQ1RTIG1vZGUgZW5hYmxlZCwgZGF0YSBpcyBvbmx5IHRyYW5zbWl0dGVkIHdoZW4gdGhlIG5DVFMgaW5wdXQgaXMgYXNzZXJ0ZWQgKHRpZWQgdG8gMCkgKi8KKyNkZWZpbmUgTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMgICAgICAgICAgICAgIChVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFKSAgICAvKiE8IENUUyBhbmQgUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUF9PTiBXYWtldXAgQWN0aXZhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBSWE5FICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0lSREFfUE9XRVIgSXJEQSBQb3dlcgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBJckRBIG5vcm1hbCBwb3dlciBtb2RlICovCisjZGVmaW5lIExMX1VTQVJUX0lSREFfUE9XRVJfTE9XICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfSVJMUCAgICAgICAgLyohPCBJckRBIGxvdyBwb3dlciBtb2RlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0xJTkJSRUFLX0RFVEVDVCBMSU4gQnJlYWsgRGV0ZWN0aW9uIExlbmd0aAorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMEIgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uIG1ldGhvZCBzZWxlY3RlZCAqLworI2RlZmluZSBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTFCICAgICAgICAgICAgVVNBUlRfQ1IyX0xCREwgICAgICAgIC8qITwgMTEtYml0IGJyZWFrIGRldGVjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfREVfUE9MQVJJVFkgRHJpdmVyIEVuYWJsZSBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RFX1BPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgLyohPCBERSBzaWduYWwgaXMgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XICAgICAgICAgICAgICAgIFVTQVJUX0NSM19ERVAgICAgICAgICAvKiE8IERFIHNpZ25hbCBpcyBhY3RpdmUgbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX0RNQV9SRUdfREFUQSBETUEgUmVnaXN0ZXIgRGF0YQorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIExMX1VTQVJUX0RNQV9SRUdfREFUQV9SRUNFSVZFICAgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAvKiE8IEdldCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IgcmVjZXB0aW9uICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9NYWNyb3MgVVNBUlQgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIFVTQVJUIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIExMX1VTQVJUX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gVVNBUlQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSByZWFkCisgICogQHJldHZhbCBSZWdpc3RlciB2YWx1ZQorICAqLworI2RlZmluZSBMTF9VU0FSVF9SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FTV9FeHBvcnRlZF9NYWNyb3NfSGVscGVyIEV4cG9ydGVkX01hY3Jvc19IZWxwZXIKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gOCBiaXRzIHNhbXBsaW5nIG1vZGUgKDMyIGJpdHMgdmFsdWUgb2YgVVNBUlRESVYgaXMgcmV0dXJuZWQpCisgICogQHBhcmFtICBfX1BFUklQSENMS19fIFBlcmlwaGVyYWwgQ2xvY2sgZnJlcXVlbmN5IHVzZWQgZm9yIFVTQVJUIGluc3RhbmNlCisgICogQHBhcmFtICBfX1BSRVNDQUxFUl9fIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2CisgICogQHBhcmFtICBfX0JBVURSQVRFX18gQmF1ZCByYXRlIHZhbHVlIHRvIGFjaGlldmUKKyAgKiBAcmV0dmFsIFVTQVJURElWIHZhbHVlIHRvIGJlIHVzZWQgZm9yIEJSUiByZWdpc3RlciBmaWxsaW5nIGluIE92ZXJTYW1wbGluZ184IGNhc2UKKyAgKi8KKyNkZWZpbmUgX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KF9fUEVSSVBIQ0xLX18sIF9fUFJFU0NBTEVSX18sIF9fQkFVRFJBVEVfXykgKCgoKChfX1BFUklQSENMS19fKS8odWludDMyX3QpKFVTQVJUX1BSRVNDQUxFUl9UQUJbKF9fUFJFU0NBTEVSX18pXSkpKjJVKSArICgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKQorCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCisgICogICAgICAgICBleHBlY3RlZCBCYXVkIFJhdGUgaW4gMTYgYml0cyBzYW1wbGluZyBtb2RlICgzMiBiaXRzIHZhbHVlIG9mIFVTQVJURElWIGlzIHJldHVybmVkKQorICAqIEBwYXJhbSAgX19QRVJJUEhDTEtfXyBQZXJpcGhlcmFsIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBpbnN0YW5jZQorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCisgICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfMTYgY2FzZQorICAqLworI2RlZmluZSBfX0xMX1VTQVJUX0RJVl9TQU1QTElORzE2KF9fUEVSSVBIQ0xLX18sIF9fUFJFU0NBTEVSX18sIF9fQkFVRFJBVEVfXykgKCgoKF9fUEVSSVBIQ0xLX18pLyh1aW50MzJfdCkoVVNBUlRfUFJFU0NBTEVSX1RBQlsoX19QUkVTQ0FMRVJfXyldKSkgKyAoKF9fQkFVRFJBVEVfXykvMlUpKS8oX19CQVVEUkFURV9fKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgVVNBUlQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBFbmFibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIERpc2FibGUgKGFsbCBVU0FSVCBwcmVzY2FsZXJzIGFuZCBvdXRwdXRzIGFyZSBkaXNhYmxlZCkKKyAgKiBAbm90ZSAgIFdoZW4gVVNBUlQgaXMgZGlzYWJsZWQsIFVTQVJUIHByZXNjYWxlcnMgYW5kIG91dHB1dHMgYXJlIHN0b3BwZWQgaW1tZWRpYXRlbHksCisgICogICAgICAgICBhbmQgY3VycmVudCBvcGVyYXRpb25zIGFyZSBkaXNjYXJkZWQuIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBVU0FSVCBpcyBrZXB0LCBidXQgYWxsIHRoZSBzdGF0dXMKKyAgKiAgICAgICAgIGZsYWdzLCBpbiB0aGUgVVNBUlR4X0lTUiBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRSAgICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRSkgPT0gKFVTQVJUX0NSMV9VRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRklGTyBNb2RlIEVuYWJsZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9VU0FSVF9FbmFibGVGSUZPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUZJRk8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBGSUZPIE1vZGUgRGlzYWJsZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRklGT0VOICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRklGTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRklGTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0ZJRk9FTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRklGTyBNb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEZJRk9FTiAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRklGTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRklGTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRklGT0VOKSA9PSAoVVNBUlRfQ1IxX0ZJRk9FTikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIEZJRk8gVGhyZXNob2xkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX1NldFRYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBUaHJlc2hvbGQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV80CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfN184CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsIFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfVFhGVENGR19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBUWCBGSUZPIFRocmVzaG9sZCBDb25maWd1cmF0aW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX0dldFRYRklGT1RocmVzaG9sZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRYRklGT1RocmVzaG9sZChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggRklGTyBUaHJlc2hvbGQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfVVNBUlRfU2V0UlhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0UlhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywgVGhyZXNob2xkIDw8IFVTQVJUX0NSM19SWEZUQ0ZHX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFJYIEZJRk8gVGhyZXNob2xkIENvbmZpZ3VyYXRpb24KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRDRkcgICAgICAgTExfVVNBUlRfR2V0UlhGSUZPVGhyZXNob2xkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UlhGSUZPVGhyZXNob2xkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHKSA+PiBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWCBhbmQgUlggRklGT3MgVGhyZXNob2xkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUQ0ZHICAgICAgIExMX1VTQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBSWEZUQ0ZHICAgICAgIExMX1VTQVJUX0NvbmZpZ0ZJRk9zVGhyZXNob2xkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRYVGhyZXNob2xkIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV8yCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfOF84CisgICogQHBhcmFtICBSWFRocmVzaG9sZCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfMV84CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0ZJRk9USFJFU0hPTERfM180CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfRklGT1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9GSUZPVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnRklGT3NUaHJlc2hvbGQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUWFRocmVzaG9sZCwgdWludDMyX3QgUlhUaHJlc2hvbGQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUQ0ZHIHwgVVNBUlRfQ1IzX1JYRlRDRkcsIChUWFRocmVzaG9sZCA8PCBVU0FSVF9DUjNfVFhGVENGR19Qb3MpIHwgKFJYVGhyZXNob2xkIDw8IFVTQVJUX0NSM19SWEZUQ0ZHX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGVuYWJsZWQgaW4gU1RPUCBNb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGVuYWJsZWQsIFVTQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCBtb2RlLCBwcm92aWRlZCB0aGF0CisgICogICAgICAgICBVU0FSVCBjbG9jayBzZWxlY3Rpb24gaXMgSFNJIG9yIExTRSBpbiBSQ0MuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBkaXNhYmxlZCBpbiBTVE9QIE1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWJsZWQsIFVTQVJUIGlzIG5vdCBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFVTQVJUIGlzIGVuYWJsZWQgaW4gU1RPUCBNb2RlIChhYmxlIHRvIHdha2UgdXAgTUNVIGZyb20gU3RvcCBtb2RlIG9yIG5vdCkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSW5TdG9wTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSkgPT0gKFVTQVJUX0NSMV9VRVNNKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlciBFbmFibGUgKFJlY2VpdmVyIGlzIGVuYWJsZWQgYW5kIGJlZ2lucyBzZWFyY2hpbmcgZm9yIGEgc3RhcnQgYml0KQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUkUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVyIERpc2FibGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSRSAgICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25SeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlRGlyZWN0aW9uUngoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRW5hYmxlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVEUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9URSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXR0ZXIgRGlzYWJsZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZURpcmVjdGlvblR4CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVEaXJlY3Rpb25UeChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZXMKKyAgKiAgICAgICAgIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VHJhbnNmZXJEaXJlY3Rpb24oVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUcmFuc2ZlckRpcmVjdGlvbikKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1RFLCBUcmFuc2ZlckRpcmVjdGlvbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVzIG9mIFRyYW5zbWl0dGVyIGFuZCBSZWNlaXZlcgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb25cbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFRFICAgICAgICAgICAgTExfVVNBUlRfR2V0VHJhbnNmZXJEaXJlY3Rpb24KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ESVJFQ1RJT05fTk9ORQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9SWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFRyYW5zZmVyRGlyZWN0aW9uKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9URSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQYXJpdHkgKGVuYWJsZWQvZGlzYWJsZWQgYW5kIHBhcml0eSBtb2RlIGlmIGVuYWJsZWQpLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIGhhcmR3YXJlIHBhcml0eSBjb250cm9sIChnZW5lcmF0aW9uIGFuZCBkZXRlY3Rpb24pIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogICAgICAgICBXaGVuIHRoZSBwYXJpdHkgY29udHJvbCBpcyBlbmFibGVkIChPZGQgb3IgRXZlbiksIGNvbXB1dGVkIHBhcml0eSBiaXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIE1TQiBwb3NpdGlvbgorICAqICAgICAgICAgKDl0aCBvciA4dGggYml0IGRlcGVuZGluZyBvbiBkYXRhIHdpZHRoKSBhbmQgcGFyaXR5IGlzIGNoZWNrZWQgb24gdGhlIHJlY2VpdmVkIGRhdGEuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUFMgICAgICAgICAgICBMTF9VU0FSVF9TZXRQYXJpdHlcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIFBDRSAgICAgICAgICAgTExfVVNBUlRfU2V0UGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRQYXJpdHkoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UsIFBhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBhcml0eSBjb25maWd1cmF0aW9uIChlbmFibGVkL2Rpc2FibGVkIGFuZCBwYXJpdHkgbW9kZSBpZiBlbmFibGVkKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfR2V0UGFyaXR5XG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0dldFBhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9QQ0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgV2FrZSBVcCBtZXRob2QgZnJvbSBNdXRlIG1vZGUuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgV0FLRSAgICAgICAgICBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRXYWtlVXBNZXRob2QoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBNZXRob2QpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFLCBNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSZWNlaXZlciBXYWtlIFVwIG1ldGhvZCBmcm9tIE11dGUgbW9kZQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFdBS0UgICAgICAgICAgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0lETEVMSU5FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX0FERFJFU1NNQVJLCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0V2FrZVVwTWV0aG9kKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9XQUtFKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFdvcmQgbGVuZ3RoIChpLmUuIG5iIG9mIGRhdGEgYml0cywgZXhjbHVkaW5nIHN0YXJ0IGFuZCBzdG9wIGJpdHMpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9TZXREYXRhV2lkdGhcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfU2V0RGF0YVdpZHRoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFXaWR0aCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF83QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF84QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RBVEFXSURUSF85QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0RGF0YVdpZHRoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YVdpZHRoKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfTSwgRGF0YVdpZHRoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gV29yZCBsZW5ndGggKGkuZS4gbmIgb2YgZGF0YSBiaXRzLCBleGNsdWRpbmcgc3RhcnQgYW5kIHN0b3AgYml0cykKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBNMCAgICAgICAgICAgIExMX1VTQVJUX0dldERhdGFXaWR0aFxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTTEgICAgICAgICAgICBMTF9VU0FSVF9HZXREYXRhV2lkdGgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXREYXRhV2lkdGgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX00pKTsKK30KKworLyoqCisgICogQGJyaWVmICBBbGxvdyBzd2l0Y2ggYmV0d2VlbiBNdXRlIE1vZGUgYW5kIEFjdGl2ZSBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9NTUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByZXZlbnQgTXV0ZSBNb2RlIHVzZS4gU2V0IFJlY2VpdmVyIGluIGFjdGl2ZSBtb2RlIHBlcm1hbmVudGx5LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE1NRSAgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZU11dGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgc3dpdGNoIGJldHdlZW4gTXV0ZSBNb2RlIGFuZCBBY3RpdmUgbW9kZSBpcyBhbGxvd2VkCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTU1FICAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkTXV0ZU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX01NRSkgPT0gKFVTQVJUX0NSMV9NTUUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBPdmVyc2FtcGxpbmcgdG8gOC1iaXQgb3IgMTYtYml0IG1vZGUKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBPVkVSOCAgICAgICAgIExMX1VTQVJUX1NldE92ZXJTYW1wbGluZworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBPdmVyU2FtcGxpbmcgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0T3ZlclNhbXBsaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgT3ZlclNhbXBsaW5nKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfT1ZFUjgsIE92ZXJTYW1wbGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIE92ZXJzYW1wbGluZyBtb2RlCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgT1ZFUjggICAgICAgICBMTF9VU0FSVF9HZXRPdmVyU2FtcGxpbmcKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldE92ZXJTYW1wbGluZyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfT1ZFUjgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgaWYgQ2xvY2sgcHVsc2Ugb2YgdGhlIGxhc3QgZGF0YSBiaXQgaXMgb3V0cHV0IHRvIHRoZSBTQ0xLIHBpbiBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkNMICAgICAgICAgIExMX1VTQVJUX1NldExhc3RDbGtQdWxzZU91dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBMYXN0Qml0Q2xvY2tQdWxzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBMYXN0Qml0Q2xvY2tQdWxzZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCQ0wsIExhc3RCaXRDbG9ja1B1bHNlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBDbG9jayBwdWxzZSBvZiB0aGUgbGFzdCBkYXRhIGJpdCBvdXRwdXQgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgKExhc3QgYml0IENsb2NrIHB1bHNlIG91dHB1dCB0byB0aGUgU0NMSyBwaW4gb3Igbm90KQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfR2V0TGFzdENsa1B1bHNlT3V0cHV0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xBU1RDTEtQVUxTRV9PVVRQVVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRMYXN0Q2xrUHVsc2VPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCQ0wpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIHBoYXNlIG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX1NldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2xvY2tQaGFzZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzFFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldENsb2NrUGhhc2UoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBDbG9ja1BoYXNlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSwgQ2xvY2tQaGFzZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHBoYXNlIG9mIHRoZSBjbG9jayBvdXRwdXQgb24gdGhlIFNDTEsgcGluIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDUEhBICAgICAgICAgIExMX1VTQVJUX0dldENsb2NrUGhhc2UKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Q2xvY2tQaGFzZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ1BIQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgcG9sYXJpdHkgb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBDbG9ja1BvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUE9MQVJJVFlfSElHSAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0Q2xvY2tQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IENsb2NrUG9sYXJpdHkpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUE9MLCBDbG9ja1BvbGFyaXR5KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gcG9sYXJpdHkgb2YgdGhlIGNsb2NrIG91dHB1dCBvbiB0aGUgU0NMSyBwaW4gaW4gc3luY2hyb25vdXMgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfR2V0Q2xvY2tQb2xhcml0eQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRDbG9ja1BvbGFyaXR5KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUE9MKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENsb2NrIHNpZ25hbCBmb3JtYXQgKFBoYXNlIFBvbGFyaXR5IGFuZCBjaG9pY2UgYWJvdXQgb3V0cHV0IG9mIGxhc3QgYml0IGNsb2NrIHB1bHNlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbG9jayBQaGFzZSBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0Q2xvY2tQaGFzZSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsb2NrIFBvbGFyaXR5IGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRDbG9ja1BvbGFyaXR5KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gT3V0cHV0IG9mIExhc3QgYml0IENsb2NrIHB1bHNlIGNvbmZpZ3VyYXRpb24gdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRMYXN0Q2xrUHVsc2VPdXRwdXQoKSBmdW5jdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENQSEEgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENQT0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2tcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIExCQ0wgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2xvY2sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGhhc2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QSEFTRV8xRURHRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BIQVNFXzJFREdFCisgICogQHBhcmFtICBQb2xhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0xPVworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BPTEFSSVRZX0hJR0gKKyAgKiBAcGFyYW0gIExCQ1BPdXRwdXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfTk9fT1VUUFVUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQ2xvY2soVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQaGFzZSwgdWludDMyX3QgUG9sYXJpdHksIHVpbnQzMl90IExCQ1BPdXRwdXQpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwgUGhhc2UgfCBQb2xhcml0eSB8IExCQ1BPdXRwdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBDbG9jayBzb3VyY2UgcHJlc2NhbGVyIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IgYW5kIG92ZXJzYW1wbGluZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBQUkVTQyAgICAgICAgUFJFU0NBTEVSICAgICBMTF9VU0FSVF9TZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUHJlc2NhbGVyVmFsdWUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEwCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjMyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYyNTYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwgKHVpbnQxNl90KVByZXNjYWxlclZhbHVlKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSB0aGUgQ2xvY2sgc291cmNlIHByZXNjYWxlciBmb3IgYmF1ZHJhdGUgZ2VuZXJhdG9yIGFuZCBvdmVyc2FtcGxpbmcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgUFJFU0MgICAgICAgIFBSRVNDQUxFUiAgICAgTExfVVNBUlRfR2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYzMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMjU2CisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENsb2NrIG91dHB1dCBvbiBTQ0xLIHBpbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENsb2NrIG91dHB1dCBvbiBTQ0xLIHBpbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTeW5jaHJvbm91cyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9DTEtFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgQ2xvY2sgb3V0cHV0IG9uIFNDTEsgcGluIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNDTEtPdXRwdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNDTEtPdXRwdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKSA9PSAoVVNBUlRfQ1IyX0NMS0VOKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RvcCBiaXRzCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFN0b3BCaXRzKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0cworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfR2V0U3RvcEJpdHNMZW5ndGgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18wXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMV81CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfU1RPUEJJVFNfMgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFN0b3BCaXRzTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9TVE9QKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIENoYXJhY3RlciBmcmFtZSBmb3JtYXQgKERhdGF3aWR0aCwgUGFyaXR5IGNvbnRyb2wsIFN0b3AgQml0cykKKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gRGF0YSBXaWR0aCBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0RGF0YVdpZHRoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gUGFyaXR5IENvbnRyb2wgYW5kIG1vZGUgY29uZmlndXJhdGlvbiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFBhcml0eSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFN0b3AgYml0cyBjb25maWd1cmF0aW9uIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBTICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBQQ0UgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlclxuCisgICogICAgICAgICBDUjEgICAgICAgICAgTTAgICAgICAgICAgICBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXJcbgorICAqICAgICAgICAgQ1IxICAgICAgICAgIE0xICAgICAgICAgICAgTExfVVNBUlRfQ29uZmlnQ2hhcmFjdGVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0NoYXJhY3RlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEYXRhV2lkdGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfN0IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOEIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9EQVRBV0lEVEhfOUIKKyAgKiBAcGFyYW0gIFBhcml0eSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BBUklUWV9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEFSSVRZX0VWRU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QQVJJVFlfT0RECisgICogQHBhcmFtICBTdG9wQml0cyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzBfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1NUT1BCSVRTXzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18xXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9TVE9QQklUU18yCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdDaGFyYWN0ZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBEYXRhV2lkdGgsIHVpbnQzMl90IFBhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdG9wQml0cykKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9NLCBQYXJpdHkgfCBEYXRhV2lkdGgpOworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1RPUCwgU3RvcEJpdHMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUWC9SWCBwaW5zIHN3YXBwaW5nIHNldHRpbmcuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1dBUCAgICAgICAgICBMTF9VU0FSVF9TZXRUWFJYU3dhcAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBTd2FwQ29uZmlnIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUlhfU1dBUFBFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBTd2FwQ29uZmlnKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU1dBUCwgU3dhcENvbmZpZyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgVFgvUlggcGlucyBzd2FwcGluZyBjb25maWd1cmF0aW9uLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNXQVAgICAgICAgICAgTExfVVNBUlRfR2V0VFhSWFN3YXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFJYX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhSWF9TV0FQUEVECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VFhSWFN3YXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NXQVApKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYworICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJYSU5WICAgICAgICAgTExfVVNBUlRfU2V0UlhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBQaW5JbnZNZXRob2QgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9TVEFOREFSRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1JYUElOX0xFVkVMX0lOVkVSVEVECisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGluSW52TWV0aG9kKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfUlhJTlYsIFBpbkludk1ldGhvZCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgUlggcGluIGFjdGl2ZSBsZXZlbCBsb2dpYyBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlhJTlYgICAgICAgICBMTF9VU0FSVF9HZXRSWFBpbkxldmVsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUlhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9SWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFJYUGluTGV2ZWwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBUWElOViAgICAgICAgIExMX1VTQVJUX1NldFRYUGluTGV2ZWwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUGluSW52TWV0aG9kIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfU1RBTkRBUkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9UWFBJTl9MRVZFTF9JTlZFUlRFRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0VFhQaW5MZXZlbChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBpbkludk1ldGhvZCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1RYSU5WLCBQaW5JbnZNZXRob2QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIFRYIHBpbiBhY3RpdmUgbGV2ZWwgbG9naWMgY29uZmlndXJhdGlvbgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRYSU5WICAgICAgICAgTExfVVNBUlRfR2V0VFhQaW5MZXZlbAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1RYUElOX0xFVkVMX1NUQU5EQVJECisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfVFhQSU5fTEVWRUxfSU5WRVJURUQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRUWFBpbkxldmVsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9UWElOVikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBCaW5hcnkgZGF0YSBsb2dpYy4KKyAgKiBAbm90ZSAgIEFsbG93IHRvIGRlZmluZSBob3cgTG9naWNhbCBkYXRhIGZyb20gdGhlIGRhdGEgcmVnaXN0ZXIgYXJlIHNlbmQvcmVjZWl2ZWQgOgorICAqICAgICAgICAgZWl0aGVyIGluIHBvc2l0aXZlL2RpcmVjdCBsb2dpYyAoMT1ILCAwPUwpIG9yIGluIG5lZ2F0aXZlL2ludmVyc2UgbG9naWMgKDE9TCwgMD1IKQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERBVEFJTlYgICAgICAgTExfVVNBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERhdGFMb2dpYyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19QT1NJVElWRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJTkFSWV9MT0dJQ19ORUdBVElWRQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmluYXJ5RGF0YUxvZ2ljKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgRGF0YUxvZ2ljKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfREFUQUlOViwgRGF0YUxvZ2ljKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBCaW5hcnkgZGF0YSBjb25maWd1cmF0aW9uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgREFUQUlOViAgICAgICBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfUE9TSVRJVkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSU5BUllfTE9HSUNfTkVHQVRJVkUKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCaW5hcnlEYXRhTG9naWMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdHJhbnNmZXIgYml0IG9yZGVyIChlaXRoZXIgTGVzcyBvciBNb3N0IFNpZ25pZmljYW50IEJpdCBGaXJzdCkKKyAgKiBAbm90ZSAgIE1TQiBGaXJzdCBtZWFucyBkYXRhIGlzIHRyYW5zbWl0dGVkL3JlY2VpdmVkIHdpdGggdGhlIE1TQiBmaXJzdCwgZm9sbG93aW5nIHRoZSBzdGFydCBiaXQuCisgICogICAgICAgICBMU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIGRhdGEgYml0IDAgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE1TQkZJUlNUICAgICAgTExfVVNBUlRfU2V0VHJhbnNmZXJCaXRPcmRlcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBCaXRPcmRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX0xTQkZJUlNUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQklUT1JERVJfTVNCRklSU1QKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFRyYW5zZmVyQml0T3JkZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBCaXRPcmRlcikKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX01TQkZJUlNULCBCaXRPcmRlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRyYW5zZmVyIGJpdCBvcmRlciAoZWl0aGVyIExlc3Mgb3IgTW9zdCBTaWduaWZpY2FudCBCaXQgRmlyc3QpCisgICogQG5vdGUgICBNU0IgRmlyc3QgbWVhbnMgZGF0YSBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCB3aXRoIHRoZSBNU0IgZmlyc3QsIGZvbGxvd2luZyB0aGUgc3RhcnQgYml0LgorICAqICAgICAgICAgTFNCIEZpcnN0IG1lYW5zIGRhdGEgaXMgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQgd2l0aCBkYXRhIGJpdCAwIGZpcnN0LCBmb2xsb3dpbmcgdGhlIHN0YXJ0IGJpdC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBNU0JGSVJTVCAgICAgIExMX1VTQVJUX0dldFRyYW5zZmVyQml0T3JkZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9CSVRPUkRFUl9MU0JGSVJTVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0JJVE9SREVSX01TQkZJUlNUCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0VHJhbnNmZXJCaXRPcmRlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQXV0byBCYXVkLVJhdGUgRGV0ZWN0aW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVBdXRvQmF1ZFJhdGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUF1dG9CYXVkUmF0ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlQXV0b0JhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIEF1dG8gQmF1ZC1SYXRlIERldGVjdGlvbiBtZWNoYW5pc20gaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUkVOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkQXV0b0JhdWQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEF1dG9CYXVkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9BQlJFTikgPT0gKFVTQVJUX0NSMl9BQlJFTikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IEF1dG8gQmF1ZC1SYXRlIG1vZGUgYml0cworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFCUk1PREUgICAgICAgTExfVVNBUlRfU2V0QXV0b0JhdWRSYXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBBdXRvQmF1ZFJhdGVNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRBdXRvQmF1ZFJhdGVNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQXV0b0JhdWRSYXRlTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIEF1dG9CYXVkUmF0ZU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBBdXRvIEJhdWQtUmF0ZSBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUJSTU9ERSAgICAgICBMTF9VU0FSVF9HZXRBdXRvQmF1ZFJhdGVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OX0ZBTExJTkdFREdFCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzdGX0ZSQU1FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQVVUT0JBVURfREVURUNUX09OXzU1X0ZSQU1FCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0QXV0b0JhdWRSYXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUJSTU9ERSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSZWNlaXZlciBUaW1lb3V0CisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUlRPRU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlUnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJlY2VpdmVyIFRpbWVvdXQKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBSVE9FTiAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVJ4VGltZW91dChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBSZWNlaXZlciBUaW1lb3V0IGZlYXR1cmUgaXMgZW5hYmxlZAorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJUT0VOICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkUnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKSA9PSAoVVNBUlRfQ1IyX1JUT0VOKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4KKyAgKiBAbm90ZSAgIFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqIEBub3RlICAgNGJpdHMgYWRkcmVzcyBub2RlIGlzIHVzZWQgd2hlbiA0LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNy4KKyAgKiAgICAgICAgIChiNy1iNCBzaG91bGQgYmUgc2V0IHRvIDApCisgICogICAgICAgICA4Yml0cyBhZGRyZXNzIG5vZGUgaXMgdXNlZCB3aGVuIDctYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LgorICAqICAgICAgICAgKFRoaXMgaXMgdXNlZCBpbiBtdWx0aXByb2Nlc3NvciBjb21tdW5pY2F0aW9uIGR1cmluZyBNdXRlIG1vZGUgb3IgU3RvcCBtb2RlLAorICAqICAgICAgICAgZm9yIHdha2UgdXAgd2l0aCA3LWJpdCBhZGRyZXNzIG1hcmsgZGV0ZWN0aW9uLgorICAqICAgICAgICAgVGhlIE1TQiBvZiB0aGUgY2hhcmFjdGVyIHNlbnQgYnkgdGhlIHRyYW5zbWl0dGVyIHNob3VsZCBiZSBlcXVhbCB0byAxLgorICAqICAgICAgICAgSXQgbWF5IGFsc28gYmUgdXNlZCBmb3IgY2hhcmFjdGVyIGRldGVjdGlvbiBkdXJpbmcgbm9ybWFsIHJlY2VwdGlvbiwKKyAgKiAgICAgICAgIE11dGUgbW9kZSBpbmFjdGl2ZSAoZm9yIGV4YW1wbGUsIGVuZCBvZiBibG9jayBkZXRlY3Rpb24gaW4gTW9kQnVzIHByb3RvY29sKS4KKyAgKiAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHdob2xlIHJlY2VpdmVkIGNoYXJhY3RlciAoOC1iaXQpIGlzIGNvbXBhcmVkIHRvIHRoZSBBRERbNzowXQorICAqICAgICAgICAgdmFsdWUgYW5kIENNRiBmbGFnIGlzIHNldCBvbiBtYXRjaCkKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQgICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ05vZGVBZGRyZXNzXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBBRERNNyAgICAgICAgIExMX1VTQVJUX0NvbmZpZ05vZGVBZGRyZXNzCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFkZHJlc3NMZW4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9BRERSRVNTX0RFVEVDVF80QgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzdCCisgICogQHBhcmFtICBOb2RlQWRkcmVzcyA0IG9yIDcgYml0IEFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdOb2RlQWRkcmVzcyhVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEFkZHJlc3NMZW4sIHVpbnQzMl90IE5vZGVBZGRyZXNzKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQUREIHwgVVNBUlRfQ1IyX0FERE03LAorICAgICAgICAgICAgICh1aW50MzJfdCkoQWRkcmVzc0xlbiB8IChOb2RlQWRkcmVzcyA8PCBVU0FSVF9DUjJfQUREX1BvcykpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gOCBiaXQgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZSBhcyBzZXQgaW4gQUREIGZpZWxkIG9mIENSMi4KKyAgKiBAbm90ZSAgIElmIDQtYml0IEFkZHJlc3MgRGV0ZWN0aW9uIGlzIHNlbGVjdGVkIGluIEFERE03LAorICAqICAgICAgICAgb25seSA0Yml0cyAoYjMtYjApIG9mIHJldHVybmVkIHZhbHVlIGFyZSByZWxldmFudCAoYjMxLWI0IGFyZSBub3QgcmVsZXZhbnQpCisgICogICAgICAgICBJZiA3LWJpdCBBZGRyZXNzIERldGVjdGlvbiBpcyBzZWxlY3RlZCBpbiBBRERNNywKKyAgKiAgICAgICAgIG9ubHkgOGJpdHMgKGI3LWIwKSBvZiByZXR1cm5lZCB2YWx1ZSBhcmUgcmVsZXZhbnQgKGIzMS1iOCBhcmUgbm90IHJlbGV2YW50KQorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEFERCAgICAgICAgICAgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3MKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0yNTUpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0Tm9kZUFkZHJlc3MoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0FERCkgPj4gVVNBUlRfQ1IyX0FERF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBMZW5ndGggb2YgTm9kZSBBZGRyZXNzIHVzZWQgaW4gQWRkcmVzcyBEZXRlY3Rpb24gbW9kZSAoNy1iaXQgb3IgNC1iaXQpCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQURETTcgICAgICAgICBMTF9VU0FSVF9HZXROb2RlQWRkcmVzc0xlbgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0FERFJFU1NfREVURUNUXzRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfQUREUkVTU19ERVRFQ1RfN0IKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXROb2RlQWRkcmVzc0xlbihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQURETTcpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlRTIEhXIEZsb3cgQ29udHJvbAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZVJUU0hXRmxvd0N0cmwKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SVFNFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJUUyBIVyBGbG93IENvbnRyb2wKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgUlRTRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlUlRTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlUlRTSFdGbG93Q3RybChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBDVFMgSFcgRmxvdyBDb250cm9sCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfVVNBUlRfRW5hYmxlQ1RTSFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ1RTIEhXIEZsb3cgQ29udHJvbAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNFICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVDVFNIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEhXIEZsb3cgQ29udHJvbCBtb2RlIChib3RoIENUUyBhbmQgUlRTKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX1NldEhXRmxvd0N0cmxcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBIYXJkd2FyZUZsb3dDb250cm9sIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX05PTkUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX0NUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9SVFNfQ1RTCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRIV0Zsb3dDdHJsKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgSGFyZHdhcmVGbG93Q29udHJvbCkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSwgSGFyZHdhcmVGbG93Q29udHJvbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEhXIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uIChib3RoIENUUyBhbmQgUlRTKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSVFNFICAgICAgICAgIExMX1VTQVJUX0dldEhXRmxvd0N0cmxcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIENUU0UgICAgICAgICAgTExfVVNBUlRfR2V0SFdGbG93Q3RybAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9OT05FCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSFdDT05UUk9MX1JUUworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0hXQ09OVFJPTF9DVFMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9IV0NPTlRST0xfUlRTX0NUUworICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEhXRmxvd0N0cmwoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JUU0UgfCBVU0FSVF9DUjNfQ1RTRSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9ORUJJVCAgICAgICAgTExfVVNBUlRfRW5hYmxlT25lQml0U2FtcAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVPbmVCaXRTYW1wKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBPbmUgYml0IHNhbXBsaW5nIG1ldGhvZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9ORUJJVCAgICAgICAgTExfVVNBUlRfRGlzYWJsZU9uZUJpdFNhbXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZU9uZUJpdFNhbXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PTkVCSVQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIE9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPTkVCSVQgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZE9uZUJpdFNhbXAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZE9uZUJpdFNhbXAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09ORUJJVCkgPT0gKFVTQVJUX0NSM19PTkVCSVQpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBPdmVycnVuIGRldGVjdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIE9WUkRJUyAgICAgICAgTExfVVNBUlRfRW5hYmxlT3ZlcnJ1bkRldGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVPdmVycnVuRGV0ZWN0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIE92ZXJydW4gZGV0ZWN0aW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgT1ZSRElTICAgICAgICBMTF9VU0FSVF9EaXNhYmxlT3ZlcnJ1bkRldGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlT3ZlcnJ1bkRldGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19PVlJESVMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIE92ZXJydW4gZGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBPVlJESVMgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZE92ZXJydW5EZXRlY3QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZE92ZXJydW5EZXRlY3QoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX09WUkRJUykgIT0gVVNBUlRfQ1IzX09WUkRJUykgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfU2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVHlwZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX1VTQVJUX0dldFdLVVBUeXBlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fUlhORQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgVVNBUlQgQlJSIHJlZ2lzdGVyIGZvciBhY2hpZXZpbmcgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlLgorICAqIEBub3RlICAgQ29tcHV0ZSBhbmQgc2V0IFVTQVJURElWIHZhbHVlIGluIEJSUiBSZWdpc3RlciAoZnVsbCBCUlIgY29udGVudCkKKyAgKiAgICAgICAgIGFjY29yZGluZyB0byB1c2VkIFBlcmlwaGVyYWwgQ2xvY2ssIE92ZXJzYW1wbGluZyBtb2RlLCBhbmQgZXhwZWN0ZWQgQmF1ZCBSYXRlIHZhbHVlcworICAqIEBub3RlICAgUGVyaXBoZXJhbCBjbG9jayBhbmQgQmF1ZCByYXRlIHZhbHVlcyBwcm92aWRlZCBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB2YWxpZAorICAqICAgICAgICAgKEJhdWQgcmF0ZSB2YWx1ZSAhPSAwKQorICAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX1NldEJhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcGFyYW0gIEJhdWRSYXRlIEJhdWQgUmF0ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0QmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBQZXJpcGhDbGssIHVpbnQzMl90IFByZXNjYWxlclZhbHVlLCB1aW50MzJfdCBPdmVyU2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCYXVkUmF0ZSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgdXNhcnRkaXY7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGJycnRlbXA7CisKKyAgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShfX0xMX1VTQVJUX0RJVl9TQU1QTElORzgoUGVyaXBoQ2xrLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUsIEJhdWRSYXRlKSk7CisgICAgYnJydGVtcCA9IHVzYXJ0ZGl2ICYgMHhGRkYwVTsKKyAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICBVU0FSVHgtPkJSUiA9IGJycnRlbXA7CisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBUlR4LT5CUlIgPSAodWludDE2X3QpKF9fTExfVVNBUlRfRElWX1NBTVBMSU5HMTYoUGVyaXBoQ2xrLCAodWludDE2X3QpUHJlc2NhbGVyVmFsdWUsIEJhdWRSYXRlKSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBCYXVkIFJhdGUgdmFsdWUsIGFjY29yZGluZyB0byBVU0FSVERJViBwcmVzZW50IGluIEJSUiByZWdpc3RlcgorICAqICAgICAgICAgKGZ1bGwgQlJSIGNvbnRlbnQpLCBhbmQgdG8gdXNlZCBQZXJpcGhlcmFsIENsb2NrIGFuZCBPdmVyc2FtcGxpbmcgbW9kZSB2YWx1ZXMKKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2Ygbm9uLWluaXRpYWxpemVkIG9yIGludmFsaWQgdmFsdWUgc3RvcmVkIGluIEJSUiByZWdpc3RlciwgdmFsdWUgMCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBub3RlICAgSW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgYnkgMTYgYW5kIDgsIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE2ZC4KKyAgKiBAcm10b2xsIEJSUiAgICAgICAgICBCUlIgICAgICAgICAgIExMX1VTQVJUX0dldEJhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBlcmlwaENsayBQZXJpcGhlcmFsIENsb2NrCisgICogQHBhcmFtICBQcmVzY2FsZXJWYWx1ZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1BSRVNDQUxFUl9ESVY2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjgKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTAKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNjQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTI4CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NgorICAqIEBwYXJhbSAgT3ZlclNhbXBsaW5nIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgKKyAgKiBAcmV0dmFsIEJhdWQgUmF0ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSwgdWludDMyX3QgT3ZlclNhbXBsaW5nKQoreworICByZWdpc3RlciB1aW50MzJfdCB1c2FydGRpdjsKKyAgcmVnaXN0ZXIgdWludDMyX3QgYnJycmVzdWx0ID0gMHgwVTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgcGVyaXBoY2xrcHJlc2MgPSAodWludDMyX3QpKFBlcmlwaENsayAvICh1aW50MzJfdCkoVVNBUlRfUFJFU0NBTEVSX1RBQlsodWludDE2X3QpUHJlc2NhbGVyVmFsdWVdKSk7CisKKyAgdXNhcnRkaXYgPSBVU0FSVHgtPkJSUjsKKworICBpZih1c2FydGRpdiA9PSAwVSkKKyAgeworICAgIC8qIERvIG5vdCBwZXJmb3JtIGEgZGl2aXNpb24gYnkgMCAqLworICB9CisgIGVsc2UgaWYgKE92ZXJTYW1wbGluZyA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KSgodXNhcnRkaXYgJiAweEZGRjBVKSB8ICgodXNhcnRkaXYgJiAweDAwMDdVKSA8PCAxVSkpIDsKKyAgICBpZih1c2FydGRpdiAhPSAwVSkKKyAgICB7CisgICAgICBicnJyZXN1bHQgPSAocGVyaXBoY2xrcHJlc2MgKiAyVSkgLyB1c2FydGRpdjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKCh1c2FydGRpdiAmIDB4RkZGRlUpICE9IDBVKQorICAgIHsKKyAgICAgIGJycnJlc3VsdCA9IHBlcmlwaGNsa3ByZXNjIC8gdXNhcnRkaXY7CisgICAgfQorICB9CisgIHJldHVybiAoYnJycmVzdWx0KTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUmVjZWl2ZXIgVGltZSBPdXQgVmFsdWUgKGV4cHJlc3NlZCBpbiBuYiBvZiBiaXRzIGR1cmF0aW9uKQorICAqIEBybXRvbGwgUlRPUiAgICAgICAgIFJUTyAgICAgICAgICAgTExfVVNBUlRfU2V0UnhUaW1lb3V0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDAwRkZGRkZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRSeFRpbWVvdXQoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lb3V0KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBSZWNlaXZlciBUaW1lIE91dCBWYWx1ZSAoZXhwcmVzc2VkIGluIG5iIG9mIGJpdHMgZHVyYXRpb24pCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgUlRPICAgICAgICAgICBMTF9VU0FSVF9HZXRSeFRpbWVvdXQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDAwRkZGRkZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0UnhUaW1lb3V0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX1JUTykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9TZXRCbG9ja0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBCbG9ja0xlbmd0aCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJsb2NrTGVuZ3RoKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgQmxvY2tMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sIEJsb2NrTGVuZ3RoIDw8IFVTQVJUX1JUT1JfQkxFTl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBCbG9jayBMZW5ndGggdmFsdWUgaW4gcmVjZXB0aW9uCisgICogQHJtdG9sbCBSVE9SICAgICAgICAgQkxFTiAgICAgICAgICBMTF9VU0FSVF9HZXRCbG9ja0xlbmd0aAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRCbG9ja0xlbmd0aChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+UlRPUiwgVVNBUlRfUlRPUl9CTEVOKSA+PiBVU0FSVF9SVE9SX0JMRU5fUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0lSREEgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBJcmRhIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJckRBIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJcmRhCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlyZGEoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBJckRBIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSXJkYQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIElyREEgbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSRU4gICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSXJkYQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSXJkYShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSVJFTikgPT0gKFVTQVJUX0NSM19JUkVOKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSXJEQSBQb3dlciBNb2RlIChOb3JtYWwgb3IgTG93IFBvd2VyKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBJUkxQICAgICAgICAgIExMX1VTQVJUX1NldElyZGFQb3dlck1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgUG93ZXJNb2RlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfSVJEQV9QT1dFUl9OT1JNQUwKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9JUkRBX1BPV0VSX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SXJkYVBvd2VyTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBvd2VyTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSTFAsIFBvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgSXJEQSBQb3dlciBNb2RlIGNvbmZpZ3VyYXRpb24gKE5vcm1hbCBvciBMb3cgUG93ZXIpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0lSREFfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSXJEQSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIElSTFAgICAgICAgICAgTExfVVNBUlRfR2V0SXJkYVBvd2VyTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0lSREFfUE9XRVJfTk9STUFMCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfUEhBU0VfMkVER0UKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRJcmRhUG93ZXJNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19JUkxQKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlCisgICogICAgICAgICB0byBhY2hpZXZlIHRoZSBJcmRhIExvdyBQb3dlciBmcmVxdWVuY3kgKDggYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9TZXRJcmRhUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0SXJkYVByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIElyZGEgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sgc291cmNlCisgICogICAgICAgICB0byBhY2hpZXZlIHRoZSBJcmRhIExvdyBQb3dlciBmcmVxdWVuY3kgKDggYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfSVJEQV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBJckRBIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRJcmRhUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIElyZGEgcHJlc2NhbGVyIHZhbHVlIChWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYpCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0SXJkYVByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX1NtYXJ0Y2FyZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIFNtYXJ0Y2FyZCBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU21hcnRjYXJkIE5BQ0sgdHJhbnNtaXNzaW9uCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBOQUNLICAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZE5BQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlU21hcnRjYXJkTkFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19OQUNLKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNtYXJ0Y2FyZCBOQUNLIHRyYW5zbWlzc2lvbgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgTkFDSyAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkTkFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkTkFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIFNtYXJ0Y2FyZCBOQUNLIHRyYW5zbWlzc2lvbiBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBOQUNLICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZE5BQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZE5BQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX05BQ0spID09IChVU0FSVF9DUjNfTkFDSykpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNtYXJ0Y2FyZCBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBTbWFydGNhcmQgbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNtYXJ0Y2FyZAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU21hcnRjYXJkKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0VOKSA9PSAoVVNBUlRfQ1IzX1NDRU4pKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoU0NBUkNOVFsyOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0LWZpZWxkIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgaW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUsIGluIFNtYXJ0Y2FyZCBtb2RlLgorICAqICAgICAgICAgSW4gdHJhbnNtaXNzaW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiByZXRyaWVzLCBiZWZvcmUKKyAgKiAgICAgICAgIGdlbmVyYXRpbmcgYSB0cmFuc21pc3Npb24gZXJyb3IgKEZFIGJpdCBzZXQpLgorICAqICAgICAgICAgSW4gcmVjZXB0aW9uIG1vZGUsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9yIGVycm9uZW91cyByZWNlcHRpb24gdHJpYWxzLCBiZWZvcmUgZ2VuZXJhdGluZyBhCisgICogICAgICAgICByZWNlcHRpb24gZXJyb3IgKFJYTkUgYW5kIFBFIGJpdHMgc2V0KQorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFNDQVJDTlQgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkQXV0b1JldHJ5Q291bnQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgQXV0b1JldHJ5Q291bnQgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03CisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IEF1dG9SZXRyeUNvdW50KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NBUkNOVCwgQXV0b1JldHJ5Q291bnQgPDwgVVNBUlRfQ1IzX1NDQVJDTlRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gU21hcnRjYXJkIEF1dG8tUmV0cnkgQ291bnQgdmFsdWUgKFNDQVJDTlRbMjowXSBiaXRzKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgU0NBUkNOVCAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRBdXRvUmV0cnlDb3VudAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTbWFydGNhcmQgQXV0by1SZXRyeSBDb3VudCB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT03KQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFNtYXJ0Y2FyZEF1dG9SZXRyeUNvdW50KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19TQ0FSQ05UKSA+PiBVU0FSVF9DUjNfU0NBUkNOVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBTbWFydGNhcmQgcHJlc2NhbGVyIHZhbHVlLCB1c2VkIGZvciBkaXZpZGluZyB0aGUgVVNBUlQgY2xvY2sKKyAgKiAgICAgICAgIHNvdXJjZSB0byBwcm92aWRlIHRoZSBTTUFSVENBUkQgQ2xvY2sgKDUgYml0cyB2YWx1ZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgR1RQUiAgICAgICAgIFBTQyAgICAgICAgICAgTExfVVNBUlRfU2V0U21hcnRjYXJkUHJlc2NhbGVyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFNtYXJ0Y2FyZFByZXNjYWxlcihVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFByZXNjYWxlclZhbHVlKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsICh1aW50MTZfdClQcmVzY2FsZXJWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFNtYXJ0Y2FyZCBwcmVzY2FsZXIgdmFsdWUsIHVzZWQgZm9yIGRpdmlkaW5nIHRoZSBVU0FSVCBjbG9jaworICAqICAgICAgICAgc291cmNlIHRvIHByb3ZpZGUgdGhlIFNNQVJUQ0FSRCBDbG9jayAoNSBiaXRzIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgUFNDICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIHByZXNjYWxlciB2YWx1ZSAoVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMSkKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRQcmVzY2FsZXIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfUFNDKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFNtYXJ0Y2FyZCBHdWFyZCB0aW1lIHZhbHVlLCBleHByZXNzZWQgaW4gbmIgb2YgYmF1ZCBjbG9ja3MgcGVyaW9kcworICAqICAgICAgICAgKEdUWzc6MF0gYml0cyA6IEd1YXJkIHRpbWUgdmFsdWUpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1NNQVJUQ0FSRF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTbWFydGNhcmQgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIEdUUFIgICAgICAgICBHVCAgICAgICAgICAgIExMX1VTQVJUX1NldFNtYXJ0Y2FyZEd1YXJkVGltZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBHdWFyZFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBHdWFyZFRpbWUpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5HVFBSLCBVU0FSVF9HVFBSX0dULCBHdWFyZFRpbWUgPDwgVVNBUlRfR1RQUl9HVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTbWFydGNhcmQgR3VhcmQgdGltZSB2YWx1ZSwgZXhwcmVzc2VkIGluIG5iIG9mIGJhdWQgY2xvY2tzIHBlcmlvZHMKKyAgKiAgICAgICAgIChHVFs3OjBdIGJpdHMgOiBHdWFyZCB0aW1lIHZhbHVlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBHVFBSICAgICAgICAgR1QgICAgICAgICAgICBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU21hcnRjYXJkIEd1YXJkIHRpbWUgdmFsdWUgKFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHhGRikKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRTbWFydGNhcmRHdWFyZFRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkdUUFIsIFVTQVJUX0dUUFJfR1QpID4+IFVTQVJUX0dUUFJfR1RfUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0hhbGZEdXBsZXggQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hBTEZEVVBMRVhfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFsZi1EdXBsZXggbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0VuYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTaW5nbGUgV2lyZSBIYWxmLUR1cGxleCBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19IRFNFTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgU2luZ2xlIFdpcmUgSGFsZi1EdXBsZXggbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYWxmLUR1cGxleCBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEhEU0VMICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSGFsZkR1cGxleChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpID09IChVU0FSVF9DUjNfSERTRUwpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fU1BJX1NMQVZFIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIHJlbGF0ZWQgdG8gU1BJIFNsYXZlIGZlYXR1cmUKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1BJIFN5bmNocm9ub3VzIFNsYXZlIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTTFZFTiAgICAgICAgIExMX1VTQVJUX0VuYWJsZVNQSVNsYXZlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZVNQSVNsYXZlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFNQSSBTeW5jaHJvbm91cyBTbGF2ZSBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlU1BJU2xhdmUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfU0xWRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmICBTUEkgU3luY2hyb25vdXMgU2xhdmUgbW9kZSBpcyBlbmFibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU0xWRU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkU1BJU2xhdmUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKSA9PSAoVVNBUlRfQ1IyX1NMVkVOKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1BJIFNsYXZlIFNlbGVjdGlvbiB1c2luZyBOU1MgaW5wdXQgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBTUEkgU2xhdmUgU2VsZWN0aW9uIGRlcGVuZHMgb24gTlNTIGlucHV0IHBpbgorICAqICAgICAgICAgKFRoZSBzbGF2ZSBpcyBzZWxlY3RlZCB3aGVuIE5TUyBpcyBsb3cgYW5kIGRlc2VsZWN0ZWQgd2hlbiBOU1MgaXMgaGlnaCkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgRElTX05TUyAgICAgICBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZVNlbGVjdAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0RJU19OU1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU1BJIFNsYXZlIFNlbGVjdGlvbiB1c2luZyBOU1MgaW5wdXQgcGluCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBTUEkgU2xhdmUgd2lsbCBiZSBhbHdheXMgc2VsZWN0ZWQgYW5kIE5TUyBpbnB1dCBwaW4gd2lsbCBiZSBpZ25vcmVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIERJU19OU1MgICAgICAgTExfVVNBUlRfRGlzYWJsZVNQSVNsYXZlU2VsZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9ESVNfTlNTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiAgU1BJIFNsYXZlIFNlbGVjdGlvbiBkZXBlbmRzIG9uIE5TUyBpbnB1dCBwaW4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU1BJIFNsYXZlIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBESVNfTlNTICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZFNQSVNsYXZlU2VsZWN0CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRTUElTbGF2ZVNlbGVjdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfRElTX05TUykgIT0gKFVTQVJUX0NSMl9ESVNfTlNTKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9Db25maWd1cmF0aW9uX0xJTiBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyByZWxhdGVkIHRvIExJTiBmZWF0dXJlCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgTElOIEJyZWFrIERldGVjdGlvbiBMZW5ndGgKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJETCAgICAgICAgICBMTF9VU0FSVF9TZXRMSU5CcmtEZXRlY3Rpb25MZW4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTElOQkRMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9MSU5CUkVBS19ERVRFQ1RfMTBCCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzExQgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0TElOQnJrRGV0ZWN0aW9uTGVuKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgTElOQkRMZW5ndGgpCit7CisgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRMLCBMSU5CRExlbmd0aCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExCREwgICAgICAgICAgTExfVVNBUlRfR2V0TElOQnJrRGV0ZWN0aW9uTGVuCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfTElOQlJFQUtfREVURUNUXzEwQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0xJTkJSRUFLX0RFVEVDVF8xMUIKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRMSU5CcmtEZXRlY3Rpb25MZW4oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCREwpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTElOIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9FbmFibGVMSU4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlTElOKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIExJTiBtb2RlCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfTElOX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIExJTiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIExJTkVOICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUxJTgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlTElOKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIExJTiBtb2RlIGlzIGVuYWJsZWQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRMSU4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZExJTihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfTElORU4pID09IChVU0FSVF9DUjJfTElORU4pKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0NvbmZpZ3VyYXRpb25fREUgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgcmVsYXRlZCB0byBEcml2ZXIgRW5hYmxlIGZlYXR1cmUKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKSwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBERURUICAgICAgICAgIExMX1VTQVJUX1NldERFRGVhc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRpbWUgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0zMQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVEZWFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCwgVGltZSA8PCBVU0FSVF9DUjFfREVEVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERURUIChEcml2ZXIgRW5hYmxlIERlLUFzc2VydGlvbiBUaW1lKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFRFQgICAgICAgICAgTExfVVNBUlRfR2V0REVEZWFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVGltZSB2YWx1ZSBleHByZXNzZWQgb24gNSBiaXRzIChbNDowXSBiaXRzKSA6IFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MzEKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9HZXRERURlYXNzZXJ0aW9uVGltZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVEVCkgPj4gVVNBUlRfQ1IxX0RFRFRfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgREVBVCAoRHJpdmVyIEVuYWJsZSBBc3NlcnRpb24gVGltZSksIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgREVBVCAgICAgICAgICBMTF9VU0FSVF9TZXRERUFzc2VydGlvblRpbWUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVGltZSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9TZXRERUFzc2VydGlvblRpbWUoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBUaW1lKQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfREVBVCwgVGltZSA8PCBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBERUFUIChEcml2ZXIgRW5hYmxlIEFzc2VydGlvbiBUaW1lKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIERFQVQgICAgICAgICAgTExfVVNBUlRfR2V0REVBc3NlcnRpb25UaW1lCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFRpbWUgdmFsdWUgZXhwcmVzc2VkIG9uIDUgYml0cyAoWzQ6MF0gYml0cykgOiBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTMxCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVBc3NlcnRpb25UaW1lKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9ERUFUKSA+PiBVU0FSVF9DUjFfREVBVF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBEcml2ZXIgRW5hYmxlIChERSkgTW9kZQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfRW5hYmxlREVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERU0pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERU0gICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVERU1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURFTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgRHJpdmVyIEVuYWJsZSAoREUpIE1vZGUgaXMgZW5hYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRHJpdmVyIEVuYWJsZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERFTSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkREVNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRERU1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RFTSkgPT0gKFVTQVJUX0NSM19ERU0pKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbGVjdCBEcml2ZXIgRW5hYmxlIFBvbGFyaXR5CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRFJJVkVSX0VOQUJMRV9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBEcml2ZXIgRW5hYmxlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgREVQICAgICAgICAgICBMTF9VU0FSVF9TZXRERVNpZ25hbFBvbGFyaXR5CisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFBvbGFyaXR5IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfSElHSAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX0RFX1BPTEFSSVRZX0xPVworICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfU2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQzMl90IFBvbGFyaXR5KQoreworICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQLCBQb2xhcml0eSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIERyaXZlciBFbmFibGUgUG9sYXJpdHkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9EUklWRVJfRU5BQkxFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIERyaXZlciBFbmFibGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBERVAgICAgICAgICAgIExMX1VTQVJUX0dldERFU2lnbmFsUG9sYXJpdHkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgUmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ERV9QT0xBUklUWV9ISUdICisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfREVfUE9MQVJJVFlfTE9XCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfR2V0REVTaWduYWxQb2xhcml0eShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfREVQKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfQWR2YW5jZWRDb25maWd1cmF0aW9uIEFkdmFuY2VkIENvbmZpZ3VyYXRpb25zIHNlcnZpY2VzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBBc3luY2hyb25vdXMgTW9kZSAoVUFSVCkKKyAgKiBAbm90ZSAgIEluIFVBUlQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIENMS0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIFNDRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSVJFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIEFzeW5jaHJvbm91cyBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0FzeW5jTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdBc3luY01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnQXN5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gQXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIFN5bmNocm9ub3VzIE1vZGUKKyAgKiBAbm90ZSAgIEluIFN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB0aGUgVVNBUlQgaW4gU3luY2hyb25vdXMgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVVNBUlRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU3luY2hyb25vdXMgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTbWFydGNhcmQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9FbmFibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiBAbm90ZSAgIE90aGVyIHJlbWFpbmluZyBjb25maWd1cmF0aW9ucyBpdGVtcyByZWxhdGVkIHRvIFN5bmNocm9ub3VzIE1vZGUKKyAgKiAgICAgICAgIChhcyBCYXVkIFJhdGUsIFdvcmQgbGVuZ3RoLCBQYXJpdHksIENsb2NrIFBvbGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ1N5bmNNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4pKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gU3luY2hyb25vdXMgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IyLCBVU0FSVF9DUjJfQ0xLRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIExJTiBNb2RlCisgICogQG5vdGUgICBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAqICAgICAgICAgICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0IHRoZSBVQVJUL1VTQVJUIGluIExJTiBtb2RlLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNDTEtPdXRwdXQoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBTVE9QIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX1NldFN0b3BCaXRzTGVuZ3RoKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gU2V0IExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZUxJTigpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBMSU4gTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIExJTiBCcmVhayBEZXRlY3Rpb24gTGVuZ3RoLCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFNUT1AgICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTElOTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdMSU5Nb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0xJTk1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICAvKiBJbiBMSU4gbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIFNUT1AgYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOLCBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ1IyX1NUT1ApKTsKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBTZXQgdGhlIFVBUlQvVVNBUlQgaW4gTElOIG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBIYWxmIER1cGxleCBNb2RlCisgICogQG5vdGUgICBJbiBIYWxmIER1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgICogICAgICAgICAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gQ0xLRU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdGhlIFVBUlQvVVNBUlQgaW4gSGFsZiBEdXBsZXggbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IQUxGRFVQTEVYX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhbGYtRHVwbGV4IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBIYWxmIER1cGxleCBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUGFyaXR5LCAuLi4pIHNob3VsZCBiZSBzZXQgdXNpbmcKKyAgKiAgICAgICAgIGRlZGljYXRlZCBmdW5jdGlvbnMKKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMSU5FTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBIRFNFTCAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NvbmZpZ0hhbGZEdXBsZXhNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgLyogSW4gSGFsZiBEdXBsZXggbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKyAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIEhhbGYgRHVwbGV4IG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgVVNBUlQgZm9yIGVuYWJsaW5nIHVzZSBpbiBTbWFydGNhcmQgTW9kZQorICAqIEBub3RlICAgSW4gU21hcnRjYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBJUkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIEhEU0VMIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGNvbmZpZ3VyZXMgU3RvcCBiaXRzIHRvIDEuNSBiaXRzIGFuZAorICAqICAgICAgICAgc2V0cyB0aGUgVVNBUlQgaW4gU21hcnRjYXJkIG1vZGUgKFNDRU4gYml0KS4KKyAgKiAgICAgICAgIENsb2NrIE91dHB1dCBpcyBhbHNvIGVuYWJsZWQgKENMS0VOKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBub3RlICAgQ2FsbCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZm9sbG93aW5nIGZ1bmN0aW9uIGNhbGwgc2VxdWVuY2UgOgorICAqICAgICAgICAgLSBDbGVhciBMSU5FTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlTElOKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSVJFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSXJkYSgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIEhEU0VMIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVIYWxmRHVwbGV4KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ29uZmlndXJlIFNUT1AgaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBTZXQgQ0xLRU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRW5hYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBTQ0VOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBTbWFydGNhcmQgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV29yZCBsZW5ndGgsIFBhcml0eSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVE9QICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGVcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIENMS0VOICAgICAgICAgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdTbWFydGNhcmRNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBTQ0VOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ1NtYXJ0Y2FyZE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnU21hcnRjYXJkTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIFNtYXJ0Y2FyZCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTikpOworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworICAvKiBDb25maWd1cmUgU3RvcCBiaXRzIHRvIDEuNSBiaXRzICovCisgIC8qIFN5bmNocm9ub3VzIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9TVE9QXzAgfCBVU0FSVF9DUjJfU1RPUF8xIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBTbWFydGNhcmQgbW9kZSAqLworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfU0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBiYXNpYyBjb25maWd1cmF0aW9uIG9mIFVTQVJUIGZvciBlbmFibGluZyB1c2UgaW4gSXJkYSBNb2RlCisgICogQG5vdGUgICBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gU0NFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBIRFNFTCBiaXQgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBVQVJUL1VTQVJUIGluIElSREEgbW9kZSAoSVJFTiBiaXQpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19JUkRBX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIElyREEgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIENhbGwgb2YgdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIC0gQ2xlYXIgTElORU4gaW4gQ1IyIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUxJTigpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIENMS0VOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVTQ0xLT3V0cHV0KCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgU0NFTiBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU21hcnRjYXJkKCkgZnVuY3Rpb24KKyAgKiAgICAgICAgIC0gQ2xlYXIgSERTRUwgaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUhhbGZEdXBsZXgoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDb25maWd1cmUgU1RPUCBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9TZXRTdG9wQml0c0xlbmd0aCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIFNldCBJUkVOIGluIENSMyB1c2luZyBAcmVmIExMX1VTQVJUX0VuYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqIEBub3RlICAgT3RoZXIgcmVtYWluaW5nIGNvbmZpZ3VyYXRpb25zIGl0ZW1zIHJlbGF0ZWQgdG8gSXJkYSBNb2RlCisgICogICAgICAgICAoYXMgQmF1ZCBSYXRlLCBXb3JkIGxlbmd0aCwgUG93ZXIgbW9kZSwgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQ0xLRU4gICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgU0NFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSVJFTiAgICAgICAgICBMTF9VU0FSVF9Db25maWdJcmRhTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9Db25maWdJcmRhTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOLCBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCisgIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9TVE9QKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0lSRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmZvcm0gYmFzaWMgY29uZmlndXJhdGlvbiBvZiBVU0FSVCBmb3IgZW5hYmxpbmcgdXNlIGluIE11bHRpIHByb2Nlc3NvciBNb2RlCisgICogICAgICAgICAoc2V2ZXJhbCBVU0FSVHMgY29ubmVjdGVkIGluIGEgbmV0d29yaywgb25lIG9mIHRoZSBVU0FSVHMgY2FuIGJlIHRoZSBtYXN0ZXIsCisgICogICAgICAgICBpdHMgVFggb3V0cHV0IGNvbm5lY3RlZCB0byB0aGUgUlggaW5wdXRzIG9mIHRoZSBvdGhlciBzbGF2ZXMgVVNBUlRzKS4KKyAgKiBAbm90ZSAgIEluIE11bHRpUHJvY2Vzc29yIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgKiAgICAgICAgICAgLSBMSU5FTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgKiAgICAgICAgICAgLSBTQ0VOIGJpdCBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLAorICAqICAgICAgICAgICAtIElSRU4gYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIsCisgICogICAgICAgICAgIC0gSERTRUwgYml0IGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICogQG5vdGUgICBDYWxsIG9mIHRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBmb2xsb3dpbmcgZnVuY3Rpb24gY2FsbCBzZXF1ZW5jZSA6CisgICogICAgICAgICAtIENsZWFyIExJTkVOIGluIENSMiB1c2luZyBAcmVmIExMX1VTQVJUX0Rpc2FibGVMSU4oKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBDTEtFTiBpbiBDUjIgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIFNDRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZVNtYXJ0Y2FyZCgpIGZ1bmN0aW9uCisgICogICAgICAgICAtIENsZWFyIElSRU4gaW4gQ1IzIHVzaW5nIEByZWYgTExfVVNBUlRfRGlzYWJsZUlyZGEoKSBmdW5jdGlvbgorICAqICAgICAgICAgLSBDbGVhciBIRFNFTCBpbiBDUjMgdXNpbmcgQHJlZiBMTF9VU0FSVF9EaXNhYmxlSGFsZkR1cGxleCgpIGZ1bmN0aW9uCisgICogQG5vdGUgICBPdGhlciByZW1haW5pbmcgY29uZmlndXJhdGlvbnMgaXRlbXMgcmVsYXRlZCB0byBNdWx0aSBwcm9jZXNzb3IgTW9kZQorICAqICAgICAgICAgKGFzIEJhdWQgUmF0ZSwgV2FrZSBVcCBNZXRob2QsIE5vZGUgYWRkcmVzcywgLi4uKSBzaG91bGQgYmUgc2V0IHVzaW5nCisgICogICAgICAgICBkZWRpY2F0ZWQgZnVuY3Rpb25zCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTElORU4gICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBDTEtFTiAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGVcbgorICAqICAgICAgICAgQ1IzICAgICAgICAgIFNDRU4gICAgICAgICAgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZVxuCisgICogICAgICAgICBDUjMgICAgICAgICAgSERTRUwgICAgICAgICBMTF9VU0FSVF9Db25maWdNdWx0aVByb2Nlc3NNb2RlXG4KKyAgKiAgICAgICAgIENSMyAgICAgICAgICBJUkVOICAgICAgICAgIExMX1VTQVJUX0NvbmZpZ011bHRpUHJvY2Vzc01vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ29uZmlnTXVsdGlQcm9jZXNzTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIC8qIEluIE11bHRpIFByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBJUkVOLCBTQ0VOIGFuZCBIRFNFTCBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9GTEFHX01hbmFnZW1lbnQgRkxBR19NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFBFICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1BFKSA9PSAoVVNBUlRfSVNSX1BFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRnJhbWluZyBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBGRSAgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19GRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0ZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9GRSkgPT0gKFVTQVJUX0lTUl9GRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIE5vaXNlIGVycm9yIGRldGVjdGVkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE5FICAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX05FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX05FKSA9PSAoVVNBUlRfSVNSX05FKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgT3ZlclJ1biBFcnJvciBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBPUkUgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19PUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX09SRSkgPT0gKFVTQVJUX0lTUl9PUkUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBJRExFIGxpbmUgZGV0ZWN0ZWQgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgSURMRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0lETEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0lETEUpID09IChVU0FSVF9JU1JfSURMRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkUgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlYWQgRGF0YSBSZWdpc3RlciBvciBVU0FSVCBSWCBGSUZPIE5vdCBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJYTkVfUlhGTkUgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSA9PSAoVVNBUlRfSVNSX1JYTkVfUlhGTkUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVEMgICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVEMpID09IChVU0FSVF9JU1JfVEMpKSA/IDFVIDogMFUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEUgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEVfVFhGTkYKKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBvciBVU0FSVCBUWCBGSUZPIE5vdCBGdWxsIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhFX1RYRk5GICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpID09IChVU0FSVF9JU1JfVFhFX1RYRk5GKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgTEJERiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJECisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9MQkRGKSA9PSAoVVNBUlRfSVNSX0xCREYpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgaW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBDVFNJRiAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19uQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTSUYpID09IChVU0FSVF9JU1JfQ1RTSUYpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBDVFMgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEhhcmR3YXJlIEZsb3cgY29udHJvbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENUUyAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQ1RTKSA9PSAoVVNBUlRfSVNSX0NUUykpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmVyIFRpbWUgT3V0IEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJUT0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlRPRikgPT0gKFVTQVJUX0lTUl9SVE9GKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgRW5kIE9mIEJsb2NrIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgRU9CRiAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9FT0JGKSA9PSAoVVNBUlRfSVNSX0VPQkYpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTUEkgU2xhdmUgVW5kZXJydW4gZXJyb3IgZmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVURSICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVURSCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVURSKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9VRFIpID09IChVU0FSVF9JU1JfVURSKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQXV0by1CYXVkIFJhdGUgRXJyb3IgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUJSRSAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQUJSRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0FCUkUpID09IChVU0FSVF9JU1JfQUJSRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEF1dG8tQmF1ZCBSYXRlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEF1dG8gQmF1ZCBSYXRlIGRldGVjdGlvbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFCUkYgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0FCUihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQUJSRikgPT0gKFVTQVJUX0lTUl9BQlJGKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQnVzeSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBCVVNZICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19CVVNZCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQlVTWShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfQlVTWSkgPT0gKFVTQVJUX0lTUl9CVVNZKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ2hhcmFjdGVyIE1hdGNoIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIENNRiAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX0NNRikgPT0gKFVTQVJUX0lTUl9DTUYpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBTZW5kIEJyZWFrIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFNCS0YgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1NCSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfU0JLRikgPT0gKFVTQVJUX0lTUl9TQktGKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZSBXYWtlIFVwIGZyb20gbXV0ZSBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJXVSAgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JXVQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JXVShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUldVKSA9PSAoVVNBUlRfSVNSX1JXVSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBXVUYgICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfV1VGKSA9PSAoVVNBUlRfSVNSX1dVRikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRyYW5zbWl0IEVuYWJsZSBBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBURUFDSyAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19URUFDSworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmUgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFJFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0soVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JFQUNLKSA9PSAoVVNBUlRfSVNSX1JFQUNLKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBFbXB0eSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRkUgICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UWEZFKSA9PSAoVVNBUlRfSVNSX1RYRkUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBSWCBGSUZPIEZ1bGwgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBSWEZGICAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SWEZGCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUlhGRikgPT0gKFVTQVJUX0lTUl9SWEZGKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBGbGFnIGlzIHNldCBvciBub3QKKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUQ0JHVCAgICAgICAgIExMX1VTQVJUX0lzQWN0aXZlRmxhZ19UQ0JHVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9UQ0JHVCkgPT0gKFVTQVJUX0lTUl9UQ0JHVCkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVFhGVCAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfVFhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1RYRlQpID09IChVU0FSVF9JU1JfVFhGVCkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJYIEZJRk8gVGhyZXNob2xkIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhGVCAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUlhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1JYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1JYRlQpID09IChVU0FSVF9JU1JfUlhGVCkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgUGFyaXR5IEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9QRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBGcmFtaW5nIEVycm9yIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBGRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19GRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9GRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBOb2lzZSBFcnJvciBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgTkVDRiAgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX05FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19ORShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX05FQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE92ZXJSdW4gRXJyb3IgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIE9SRUNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX09SRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfT1JFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfT1JFQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIElETEUgbGluZSBkZXRlY3RlZCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgSURMRUNGICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfSURMRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0lETEVDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgVFggRklGTyBFbXB0eSBGbGFnCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUWEZFQ0YgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19UWEZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVFhGRUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRDQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNtYXJ0Y2FyZCBUcmFuc21pc3Npb24gQ29tcGxldGUgQmVmb3JlIEd1YXJkIFRpbWUgRmxhZworICAqIEBybXRvbGwgSUNSICAgICAgICAgIFRDQkdUQ0YgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1RDQkdUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX1RDQkdUQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIExJTiBCcmVhayBEZXRlY3Rpb24gRmxhZworICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBMQkRDRiAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0xCRENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBDVFMgSW50ZXJydXB0IEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQ1RTQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfbkNUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfbkNUUyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFdSSVRFX1JFRyhVU0FSVHgtPklDUiwgVVNBUlRfSUNSX0NUU0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBSZWNlaXZlciBUaW1lIE91dCBGbGFnCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgUlRPQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19SVE8oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9SVE9DRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgRW5kIE9mIEJsb2NrIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEVPQkNGICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX0VPQgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfRU9CQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNQSSBTbGF2ZSBVbmRlcnJ1biBGbGFnCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNQSSBTbGF2ZSBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgVURSQ0YgICAgICAgICBMTF9VU0FSVF9DbGVhckZsYWdfVURSCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0NsZWFyRmxhZ19VRFIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9VRFJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQ2hhcmFjdGVyIE1hdGNoIEZsYWcKKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBDTUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19DTQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9DbGVhckZsYWdfQ00oVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9DTUNGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFdVQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9XVUNGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJRExFIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIElETEVJRSAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfSURMRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0lETEVJRSk7Cit9CisKKy8qIExlZ2FjeSBkZWZpbmUgKi8KKyNkZWZpbmUgTExfVVNBUlRfRW5hYmxlSVRfUlhORSAgTExfVVNBUlRfRW5hYmxlSVRfUlhORV9SWEZORQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBOb3QgRW1wdHkgYW5kIFJYIEZJRk8gTm90IEVtcHR5IEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgIFJYTkVJRV9SWEZORUlFICBMTF9VU0FSVF9FbmFibGVJVF9SWE5FX1JYRk5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUcmFuc21pc3Npb24gQ29tcGxldGUgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVENJRSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UQworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9VU0FSVF9FbmFibGVJVF9UWEUgIExMX1VTQVJUX0VuYWJsZUlUX1RYRV9UWEZORgorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWCBFbXB0eSBhbmQgVFggRklGTyBOb3QgRnVsbCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgVFhFSUVfVFhGTkZJRSAgTExfVVNBUlRfRW5hYmxlSVRfVFhFX1RYRk5GCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUEUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0NNKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSZWNlaXZlciBUaW1lb3V0IEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJUT0lFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfUlRPCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0VPQihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9FT0JJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFRYIEZJRk8gRW1wdHkgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWEZFSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RYRkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhGRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBSWCBGSUZPIEZ1bGwgSW50ZXJydXB0CisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhGRklFICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9SWEZGCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX1JYRkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhGRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTElOIEJyZWFrIERldGVjdGlvbiBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9MSU5fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgTElOIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTEJESUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCRElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXJyb3IgSW50ZXJydXB0CisgICogQG5vdGUgICBXaGVuIHNldCwgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBCaXQgaXMgZW5hYmxpbmcgaW50ZXJydXB0IGdlbmVyYXRpb24gaW4gY2FzZSBvZiBhIGZyYW1pbmcKKyAgKiAgICAgICAgIGVycm9yLCBvdmVycnVuIGVycm9yIG9yIG5vaXNlIGZsYWcgKEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3RlcikuCisgICogICAgICAgICAgIDA6IEludGVycnVwdCBpcyBpbmhpYml0ZWQKKyAgKiAgICAgICAgICAgMTogQW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuIEZFPTEgb3IgT1JFPTEgb3IgTkY9MSBpbiB0aGUgVVNBUlR4X0lTUiByZWdpc3Rlci4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBFSUUgICAgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX0VSUk9SCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0VJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIENUUyBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9DVFMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0NUU0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVFggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBUWEZUSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1RYRlQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9FbmFibGVJVF9UQ0JHVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9UQ0JHVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUlggRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0VuYWJsZUlUX1JYRlQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRW5hYmxlSVRfUlhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSURMRSBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBJRExFSUUgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfSURMRUlFKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9VU0FSVF9EaXNhYmxlSVRfUlhORSAgTExfVVNBUlRfRGlzYWJsZUlUX1JYTkVfUlhGTkUKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFJYIE5vdCBFbXB0eSBhbmQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9SWE5FX1JYRk5FKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RDCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9UQyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0Rpc2FibGVJVF9UWEUgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRYIEVtcHR5IGFuZCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX1VTQVJUX0Rpc2FibGVJVF9UWEVfVFhGTkYKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRV9UWEZORihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUGFyaXR5IEVycm9yIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1BFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9QRShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQ2hhcmFjdGVyIE1hdGNoIEludGVycnVwdAorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENNSUUgICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0NNSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9SVE8KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JUTyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JUT0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX0VPQgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfRU9CKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfRU9CSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRYRkVJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1RYRkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RYRkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUlggRklGTyBGdWxsIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUlhGRklFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGRgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfUlhGRihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYRkZJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9MQkQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0xCRChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgVVNBUlRfQ1IyX0xCRElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEVycm9yIEludGVycnVwdAorICAqIEBub3RlICAgV2hlbiBzZXQsIEVycm9yIEludGVycnVwdCBFbmFibGUgQml0IGlzIGVuYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgYSBmcmFtaW5nCisgICogICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvciBvciBub2lzZSBmbGFnIChGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIpLgorICAqICAgICAgICAgICAwOiBJbnRlcnJ1cHQgaXMgaW5oaWJpdGVkCisgICogICAgICAgICAgIDE6IEFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbiBGRT0xIG9yIE9SRT0xIG9yIE5GPTEgaW4gdGhlIFVTQVJUeF9JU1IgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRUlFICAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIENUUyBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9IV0ZMT1dfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgSGFyZHdhcmUgRmxvdyBjb250cm9sIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgQ1RTSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfQ1RTCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9DVFMoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgV1VGSUUgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFRYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGVAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9EaXNhYmxlSVRfVFhGVChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTbWFydGNhcmQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEJlZm9yZSBHdWFyZCBUaW1lIEludGVycnVwdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19TTUFSVENBUkRfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU21hcnRjYXJkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVENCR1RJRSAgICAgICBMTF9VU0FSVF9EaXNhYmxlSVRfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVENCR1RJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFJYRlRJRSAgICAgICAgTExfVVNBUlRfRGlzYWJsZUlUX1JYRlQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUlUX1JYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBJRExFIEludGVycnVwdCAgc291cmNlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgSURMRUlFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9JRExFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9JRExFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9JRExFSUUpID09IChVU0FSVF9DUjFfSURMRUlFKSkgPyAxVSA6IDBVKTsKK30KKworLyogTGVnYWN5IGRlZmluZSAqLworI2RlZmluZSBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9SWE5FX1JYRk5FCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFJYIE5vdCBFbXB0eSBhbmQgVVNBUlQgUlggRklGTyBOb3QgRW1wdHkgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgUlhORUlFX1JYRk5FSUUgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1JYTkVfUlhGTkUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSA9PSAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFRDSUUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVEMKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSA9PSAoVVNBUlRfQ1IxX1RDSUUpKSA/IDFVIDogMFUpOworfQorCisvKiBMZWdhY3kgZGVmaW5lICovCisjZGVmaW5lIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRSAgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GCisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFRYIEVtcHR5IGFuZCBVU0FSVCBUWCBGSUZPIE5vdCBGdWxsIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgIFRYRUlFX1RYRk5GSUUgIExMX1VTQVJUX0lzRW5hYmxlZElUX1RYRV9UWEZORgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfVFhFX1RYRk5GKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKSA9PSAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEVJRSAgICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9QRQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUEUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpID09IChVU0FSVF9DUjFfUEVJRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIENoYXJhY3RlciBNYXRjaCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBDTUlFICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NNCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9DTShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfQ01JRSkgPT0gKFVTQVJUX0NSMV9DTUlFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSVE9JRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JUTworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfUlRPKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9SVE9JRSkgPT0gKFVTQVJUX0NSMV9SVE9JRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEVuZCBPZiBCbG9jayBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVPQklFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfRU9CCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9FT0IoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX0VPQklFKSA9PSAoVVNBUlRfQ1IxX0VPQklFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVFggRklGTyBFbXB0eSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhGRUlFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZFCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZFKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9UWEZFSUUpID09IChVU0FSVF9DUjFfVFhGRUlFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUlggRklGTyBGdWxsIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWEZGSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRkYKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRkYoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1JYRkZJRSkgPT0gKFVTQVJUX0NSMV9SWEZGSUUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBMSU4gQnJlYWsgRGV0ZWN0aW9uIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0xJTl9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBMSU4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBMQkRJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0xCRAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfTEJEKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjIsIFVTQVJUX0NSMl9MQkRJRSkgPT0gKFVTQVJUX0NSMl9MQkRJRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEVJRSAgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfRVJST1IKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX0VSUk9SKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19FSUUpID09IChVU0FSVF9DUjNfRUlFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgQ1RTIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0hXRkxPV19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBIYXJkd2FyZSBGbG93IGNvbnRyb2wgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBDVFNJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX0NUUworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfQ1RTKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSkgPT0gKFVTQVJUX0NSM19DVFNJRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFVTQVJUIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1dLVVAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKSA9PSAoVVNBUlRfQ1IzX1dVRklFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBVU0FSVCBUWCBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgRklGTyBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVFhGVElFICAgICAgICBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRJVF9UWEZUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpID09IChVU0FSVF9DUjNfVFhGVElFKSkgPyAxVSA6IDBVKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgU21hcnRjYXJkIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBCZWZvcmUgR3VhcmQgVGltZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfU01BUlRDQVJEX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNtYXJ0Y2FyZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFRDQkdUSUUgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfVENCR1QKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1RDQkdUKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKSA9PSAoVVNBUlRfQ1IzX1RDQkdUSUUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFVTQVJUIFJYIEZJRk8gVGhyZXNob2xkIEludGVycnVwdCBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBSWEZUSUUgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRlQKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZElUX1JYRlQoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSkgPT0gKFVTQVJUX0NSM19SWEZUSUUpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VGX0RNQV9NYW5hZ2VtZW50IERNQV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIE1vZGUgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBNb2RlIGZvciByZWNlcHRpb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFSICAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZURNQVJlcV9SWChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSBNb2RlIGlzIGVuYWJsZWQgZm9yIHJlY2VwdGlvbgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIERNQVIgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1JYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRETUFSZXFfUlgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0RNQVIpID09IChVU0FSVF9DUjNfRE1BUikpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSBNb2RlIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0VuYWJsZURNQVJlcV9UWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgTW9kZSBmb3IgdHJhbnNtaXNzaW9uCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRE1BVCAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVETUFSZXFfVFgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBETUEgTW9kZSBpcyBlbmFibGVkIGZvciB0cmFuc21pc3Npb24KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBETUFUICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZERNQVJlcV9UWAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkRE1BUmVxX1RYKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ETUFUKSA9PSAoVVNBUlRfQ1IzX0RNQVQpKSA/IDFVIDogMFUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvcgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfVVNBUlRfRW5hYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZURNQURlYWN0T25SeEVycihVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIERNQSBEaXNhYmxpbmcgb24gUmVjZXB0aW9uIEVycm9yCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgRERSRSAgICAgICAgICBMTF9VU0FSVF9EaXNhYmxlRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19ERFJFKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBETUEgRGlzYWJsaW5nIG9uIFJlY2VwdGlvbiBFcnJvciBpcyBkaXNhYmxlZAorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIEREUkUgICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkRE1BRGVhY3RPblJ4RXJyCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9VU0FSVF9Jc0VuYWJsZWRETUFEZWFjdE9uUnhFcnIoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX0REUkUpID09IChVU0FSVF9DUjNfRERSRSkpID8gMVUgOiAwVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBkYXRhIHJlZ2lzdGVyIGFkZHJlc3MgdXNlZCBmb3IgRE1BIHRyYW5zZmVyCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkclxuCisgICogQHJtdG9sbCBURFIgICAgICAgICAgVERSICAgICAgICAgICBMTF9VU0FSVF9ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBEaXJlY3Rpb24gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfUkVDRUlWRQorICAqIEByZXR2YWwgQWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfRE1BX0dldFJlZ0FkZHIoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50MzJfdCBEaXJlY3Rpb24pCit7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGRhdGFfcmVnX2FkZHI7CisKKyAgaWYgKERpcmVjdGlvbiA9PSBMTF9VU0FSVF9ETUFfUkVHX0RBVEFfVFJBTlNNSVQpCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBURFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChVU0FSVHgtPlREUik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogcmV0dXJuIGFkZHJlc3Mgb2YgUkRSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoVVNBUlR4LT5SRFIpOworICB9CisKKyAgcmV0dXJuIGRhdGFfcmVnX2FkZHI7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfRGF0YV9NYW5hZ2VtZW50IERhdGFfTWFuYWdlbWVudAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBSZWNlaXZlciBEYXRhIHJlZ2lzdGVyIChSZWNlaXZlIERhdGEgdmFsdWUsIDggYml0cykKKyAgKiBAcm10b2xsIFJEUiAgICAgICAgICBSRFIgICAgICAgICAgIExMX1VTQVJUX1JlY2VpdmVEYXRhOAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50OF90IExMX1VTQVJUX1JlY2VpdmVEYXRhOChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpICYgMHhGRlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgUmVjZWl2ZXIgRGF0YSByZWdpc3RlciAoUmVjZWl2ZSBEYXRhIHZhbHVlLCA5IGJpdHMpCisgICogQHJtdG9sbCBSRFIgICAgICAgICAgUkRSICAgICAgICAgICBMTF9VU0FSVF9SZWNlaXZlRGF0YTkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQxNl90IExMX1VTQVJUX1JlY2VpdmVEYXRhOShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAodWludDE2X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgaW4gVHJhbnNtaXR0ZXIgRGF0YSBSZWdpc3RlciAoVHJhbnNtaXQgRGF0YSB2YWx1ZSwgOCBiaXRzKQorICAqIEBybXRvbGwgVERSICAgICAgICAgIFREUiAgICAgICAgICAgTExfVVNBUlRfVHJhbnNtaXREYXRhOAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1RyYW5zbWl0RGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4LCB1aW50OF90IFZhbHVlKQoreworICBVU0FSVHgtPlREUiA9IFZhbHVlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0dGVyIERhdGEgUmVnaXN0ZXIgKFRyYW5zbWl0IERhdGEgdmFsdWUsIDkgYml0cykKKyAgKiBAcm10b2xsIFREUiAgICAgICAgICBURFIgICAgICAgICAgIExMX1VTQVJUX1RyYW5zbWl0RGF0YTkKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDFGRgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfVHJhbnNtaXREYXRhOShVU0FSVF9UeXBlRGVmICpVU0FSVHgsIHVpbnQxNl90IFZhbHVlKQoreworICBVU0FSVHgtPlREUiA9IFZhbHVlICYgMHgxRkZVTDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9MTF9FRl9FeGVjdXRpb24gRXhlY3V0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IGFuIEF1dG9tYXRpYyBCYXVkIFJhdGUgbWVhc3VyZW1lbnQgb24gbmV4dCByZWNlaXZlZCBkYXRhIGZyYW1lCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VTQVJUX0FVVE9CQVVEUkFURV9ERVRFQ1RJT05fSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgQXV0byBCYXVkIFJhdGUgZGV0ZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgQUJSUlEgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0QXV0b0JhdWRSYXRlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RBdXRvQmF1ZFJhdGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+UlFSLCBVU0FSVF9SUVJfQUJSUlEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgQnJlYWsgc2VuZGluZworICAqIEBybXRvbGwgUlFSICAgICAgICAgIFNCS1JRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdEJyZWFrU2VuZGluZworICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0QnJlYWtTZW5kaW5nKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPlJRUiwgVVNBUlRfUlFSX1NCS1JRKTsKK30KKworLyoqCisgICogQGJyaWVmICBQdXQgVVNBUlQgaW4gbXV0ZSBtb2RlIGFuZCBzZXQgdGhlIFJXVSBmbGFnCisgICogQHJtdG9sbCBSUVIgICAgICAgICAgTU1SUSAgICAgICAgICBMTF9VU0FSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9SZXF1ZXN0RW50ZXJNdXRlTW9kZShVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9NTVJRKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXF1ZXN0IGEgUmVjZWl2ZSBEYXRhIGFuZCBGSUZPIGZsdXNoCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfRklGT19JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBGSUZPIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFsbG93cyB0byBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhIHdpdGhvdXQgcmVhZGluZyB0aGVtLCBhbmQgYXZvaWQgYW4gb3ZlcnJ1bgorICAqICAgICAgICAgY29uZGl0aW9uLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFJYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFJ4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RSeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9SWEZSUSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVxdWVzdCBhIFRyYW5zbWl0IGRhdGEgYW5kIEZJRk8gZmx1c2gKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9GSUZPX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIEZJRk8gbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgUlFSICAgICAgICAgIFRYRlJRICAgICAgICAgTExfVVNBUlRfUmVxdWVzdFR4RGF0YUZsdXNoCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1JlcXVlc3RUeERhdGFGbHVzaChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIFNFVF9CSVQoVVNBUlR4LT5SUVIsIFVTQVJUX1JRUl9UWEZSUSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX1N0cnVjdEluaXQoTExfVVNBUlRfSW5pdFR5cGVEZWYgKlVTQVJUX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KTsKK3ZvaWQgICAgICAgIExMX1VTQVJUX0Nsb2NrU3RydWN0SW5pdChMTF9VU0FSVF9DbG9ja0luaXRUeXBlRGVmICpVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpOworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX1VTQVJUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfdXNiLmggYi9JbmMvc3RtMzJ3Ynh4X2xsX3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjc0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9JbmMvc3RtMzJ3Ynh4X2xsX3VzYi5oCkBAIC0wLDAgKzEsMjI5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3VzYi5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1VTQl9ICisjZGVmaW5lIFNUTTMyV0J4eF9MTF9VU0JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbF9kZWYuaCIKKworI2lmIGRlZmluZWQgKFVTQikKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0JfTEwKKyAgKiBAeworICAqLworCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFVTQiBNb2RlIGRlZmluaXRpb24KKyAgKi8KKworCisKK3R5cGVkZWYgZW51bQoreworICBVU0JfREVWSUNFX01PREUgID0gMAorfSBVU0JfTW9kZVR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgVVNCIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBkZXZfZW5kcG9pbnRzOyAgICAgICAgICAgLyohPCBEZXZpY2UgRW5kcG9pbnRzIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgZGVwZW5kcyBvbiB0aGUgdXNlZCBVU0IgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMSBhbmQgTWF4X0RhdGEgPSAxNSAqLworCisgIHVpbnQzMl90IHNwZWVkOyAgICAgICAgICAgICAgICAgICAvKiE8IFVTQiBDb3JlIHNwZWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX0NvcmVfU3BlZWQgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgZXAwX21wczsgICAgICAgICAgICAgICAgIC8qITwgU2V0IHRoZSBFbmRwb2ludCAwIE1heCBQYWNrZXQgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IHBoeV9pdGZhY2U7ICAgICAgICAgICAgICAvKiE8IFNlbGVjdCB0aGUgdXNlZCBQSFkgaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX0NvcmVfUEhZICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgU29mX2VuYWJsZTsgICAgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIGRpc2FibGUgdGhlIG91dHB1dCBvZiB0aGUgU09GIHNpZ25hbC4gICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQzMl90IGxvd19wb3dlcl9lbmFibGU7ICAgICAgICAvKiE8IEVuYWJsZSBvciBkaXNhYmxlIExvdyBQb3dlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB1aW50MzJfdCBscG1fZW5hYmxlOyAgICAgICAgICAgICAgLyohPCBFbmFibGUgb3IgZGlzYWJsZSBCYXR0ZXJ5IGNoYXJnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgYmF0dGVyeV9jaGFyZ2luZ19lbmFibGU7IC8qITwgRW5hYmxlIG9yIGRpc2FibGUgQmF0dGVyeSBjaGFyZ2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBVU0JfQ2ZnVHlwZURlZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDhfdCAgIG51bTsgICAgICAgICAgICAgLyohPCBFbmRwb2ludCBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDE1ICAgICovCisKKyAgdWludDhfdCAgIGlzX2luOyAgICAgICAgICAgLyohPCBFbmRwb2ludCBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEgICAgICovCisKKyAgdWludDhfdCAgIGlzX3N0YWxsOyAgICAgICAgLyohPCBFbmRwb2ludCBzdGFsbCBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDEgICAgICovCisKKyAgdWludDhfdCAgIHR5cGU7ICAgICAgICAgICAgLyohPCBFbmRwb2ludCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIFVTQl9FUF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHVpbnQ4X3QgICBkYXRhX3BpZF9zdGFydDsgIC8qITwgSW5pdGlhbCBkYXRhIFBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDAgYW5kIE1heF9EYXRhID0gMSAgICAgKi8KKworICB1aW50MTZfdCAgcG1hYWRyZXNzOyAgICAgICAvKiE8IFBNQSBBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQxNl90ICBwbWFhZGRyMDsgICAgICAgIC8qITwgUE1BIEFkZHJlc3MwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQxNl90ICBwbWFhZGRyMTsgICAgICAgIC8qITwgUE1BIEFkZHJlc3MxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIE1pbl9hZGRyID0gMCBhbmQgTWF4X2FkZHIgPSAxSyAgICAqLworCisgIHVpbnQ4X3QgICBkb3VibGVidWZmZXI7ICAgIC8qITwgRG91YmxlIGJ1ZmZlciBlbmFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgMCBvciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDE2X3QgIHR4X2ZpZm9fbnVtOyAgICAgLyohPCBUaGlzIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgVVNCIHBlcmlwaGVyYWxzICAgICovCisKKyAgdWludDMyX3QgIG1heHBhY2tldDsgICAgICAgLyohPCBFbmRwb2ludCBNYXggcGFja2V0IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAwIGFuZCBNYXhfRGF0YSA9IDY0S0IgICovCisKKyAgdWludDhfdCAgICp4ZmVyX2J1ZmY7ICAgICAgLyohPCBQb2ludGVyIHRvIHRyYW5zZmVyIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgIHhmZXJfbGVuOyAgICAgICAgLyohPCBDdXJyZW50IHRyYW5zZmVyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdWludDMyX3QgIHhmZXJfY291bnQ7ICAgICAgLyohPCBQYXJ0aWFsIHRyYW5zZmVyIGxlbmd0aCBpbiBjYXNlIG9mIG11bHRpIHBhY2tldCB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICovCisKK30gVVNCX0VQVHlwZURlZjsKKworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9Db25zdGFudHMgUENEIEV4cG9ydGVkIENvbnN0YW50cworICAqIEB7CisgICovCisKKworLyoqIEBkZWZncm91cCBVU0JfTExfRVAwX01QUyBVU0IgTG93IExheWVyIEVQMCBNUFMKKyAgKiBAeworICAqLworI2RlZmluZSBERVAwQ1RMX01QU182NCAgICAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBERVAwQ1RMX01QU18zMiAgICAgICAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBERVAwQ1RMX01QU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBERVAwQ1RMX01QU184ICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0JfTExfRVBfVHlwZSBVU0IgTG93IExheWVyIEVQIFR5cGUKKyAgKiBAeworICAqLworI2RlZmluZSBFUF9UWVBFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAwVQorI2RlZmluZSBFUF9UWVBFX0lTT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAxVQorI2RlZmluZSBFUF9UWVBFX0JVTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAyVQorI2RlZmluZSBFUF9UWVBFX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorI2RlZmluZSBFUF9UWVBFX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzVQorLyoqCisgICogQH0KKyAgKi8KKworI2RlZmluZSBCVEFCTEVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMFUKKyNkZWZpbmUgUE1BX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVUKKworI2RlZmluZSBFUF9BRERSX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdVCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBVU0JfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVTQiBMb3cgTGF5ZXIgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQ29yZUluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZyk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2SW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FbmFibGVHbG9iYWxJbnQoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0Rpc2FibGVHbG9iYWxJbnQoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1NldEN1cnJlbnRNb2RlKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfTW9kZVR5cGVEZWYgbW9kZSk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfU2V0RGV2U3BlZWQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3Qgc3BlZWQpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0ZsdXNoUnhGaWZvKFVTQl9UeXBlRGVmICpVU0J4KTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9GbHVzaFR4RmlmbyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDMyX3QgbnVtKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBTdGFydFhmZXIoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9Xcml0ZVBhY2tldChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqc3JjLCB1aW50OF90IGNoX2VwX251bSwgdWludDE2X3QgbGVuKTsKK3ZvaWQgICAgICAgICAgICAgKlVTQl9SZWFkUGFja2V0KFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90ICpkZXN0LCB1aW50MTZfdCBsZW4pOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQU2V0U3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUENsZWFyU3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXREZXZBZGRyZXNzKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGFkZHJlc3MpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkNvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1N0b3BEZXZpY2UoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQMF9PdXRTdGFydChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCAqcHNldHVwKTsKK3VpbnQzMl90ICAgICAgICAgIFVTQl9SZWFkSW50ZXJydXB0cyhVU0JfVHlwZURlZiAqVVNCeCk7Cit1aW50MzJfdCAgICAgICAgICBVU0JfUmVhZERldkFsbE91dEVwSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4KTsKK3VpbnQzMl90ICAgICAgICAgIFVTQl9SZWFkRGV2T3V0RVBJbnRlcnJ1cHQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgZXBudW0pOwordWludDMyX3QgICAgICAgICAgVVNCX1JlYWREZXZBbGxJbkVwSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4KTsKK3VpbnQzMl90ICAgICAgICAgIFVTQl9SZWFkRGV2SW5FUEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBlcG51bSk7Cit2b2lkICAgICAgICAgICAgICBVU0JfQ2xlYXJJbnRlcnJ1cHRzKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50MzJfdCBpbnRlcnJ1cHQpOworCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpOworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpOwordm9pZCBVU0JfV3JpdGVQTUEoVVNCX1R5cGVEZWYgICpVU0J4LCB1aW50OF90ICpwYlVzckJ1ZiwgdWludDE2X3Qgd1BNQUJ1ZkFkZHIsIHVpbnQxNl90IHdOQnl0ZXMpOwordm9pZCBVU0JfUmVhZFBNQShVU0JfVHlwZURlZiAgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLCB1aW50MTZfdCB3UE1BQnVmQWRkciwgdWludDE2X3Qgd05CeXRlcyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogZGVmaW5lZCAoVVNCKSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBTVE0zMldCeHhfTExfVVNCX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfdXRpbHMuaCBiL0luYy9zdG0zMndieHhfbGxfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNjYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyd2J4eF9sbF91dGlscy5oCkBAIC0wLDAgKzEsMzE4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3V0aWxzLmgKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhlYWRlciBmaWxlIG9mIFVUSUxTIExMIG1vZHVsZS4KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIExMIFVUSUxTIGRyaXZlciBjb250YWlucyBhIHNldCBvZiBnZW5lcmljIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHVzZXI6CisgICAgICAoKykgRGV2aWNlIGVsZWN0cm9uaWMgc2lnbmF0dXJlCisgICAgICAoKykgVGltaW5nIGZ1bmN0aW9ucworICAgICAgKCspIFBMTCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1VUSUxTX0gKKyNkZWZpbmUgU1RNMzJXQnh4X0xMX1VUSUxTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTEwgVVRJTFMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9Db25zdGFudHMgVVRJTFMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiBNYXggZGVsYXkgY2FuIGJlIHVzZWQgaW4gTExfbURlbGF5ICovCisjZGVmaW5lIExMX01BWF9ERUxBWSAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZVCisKKy8qKgorICogQGJyaWVmIFVuaXF1ZSBkZXZpY2UgSUQgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgVUlEX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgVUlEX0JBU0UKKworLyoqCisgKiBAYnJpZWYgRmxhc2ggc2l6ZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIEZMQVNIU0laRV9CQVNFX0FERFJFU1MgICAgICAgIEZMQVNIU0laRV9CQVNFCisKKy8qKgorICogQGJyaWVmIFBhY2thZ2UgZGF0YSByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyAqLworI2RlZmluZSBQQUNLQUdFX0JBU0VfQUREUkVTUyAgICAgICAgICBQQUNLQUdFX0JBU0UKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MgVVRJTFMgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0VTX0lOSVQgVVRJTFMgRXhwb3J0ZWQgc3RydWN0dXJlcworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFVUSUxTIFBMTCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgUExMTTsgICAvKiE8IERpdmlzaW9uIGZhY3RvciBmb3IgUExMIFZDTyBpbnB1dCBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTE1fRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworCisgIHVpbnQzMl90IFBMTE47ICAgLyohPCBNdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIFBMTCBWQ08gb3V0cHV0IGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gOCBhbmQgTWF4X0RhdGEgPSA4NgorCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfUExMX0NvbmZpZ0RvbWFpbl9TWVMoKS4gKi8KKworICB1aW50MzJfdCBQTExSOyAgIC8qITwgRGl2aXNpb24gZm9yIHRoZSBtYWluIHN5c3RlbSBjbG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1BMTFJfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUygpLiAqLworfSBMTF9VVElMU19QTExJbml0VHlwZURlZjsKKworLyoqCisgICogQGJyaWVmICBVVElMUyBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c2VzIGNsb2NrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IENQVTFDTEtEaXZpZGVyOyAgICAgICAgIC8qITwgVGhlIENQVTEgY2xvY2sgKEhDTEsxKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3lzdGVtIGNsb2NrIChTWVNDTEspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX1NZU0NMS19ESVYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyKCkuICovCisKKyAgdWludDMyX3QgQ1BVMkNMS0RpdmlkZXI7ICAgICAgICAgLyohPCBUaGUgQ1BVMiBjbG9jayAoSENMSzIpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBzeXN0ZW0gY2xvY2sgKFNZU0NMSykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBSQ0NfTExfRUNfU1lTQ0xLX0RJVgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIHVzaW5nIHVuaXRhcnkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX0MyX1JDQ19TZXRBSEJQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBBSEI0Q0xLRGl2aWRlcjsgICAgICAgICAvKiE8IFRoZSBBSEJTIGNsb2NrIChIQ0xLNCkgZGl2aWRlci4gVGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIHN5c3RlbSBjbG9jayAoU1lTQ0xLKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19TWVNDTEtfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEByZWYgTExfUkNDX1NldEFIQjRQcmVzY2FsZXIoKS4gKi8KKworICB1aW50MzJfdCBBUEIxQ0xLRGl2aWRlcjsgICAgICAgIC8qITwgVGhlIEFQQjEgY2xvY2sgKFBDTEsxKSBkaXZpZGVyLiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQUhCIGNsb2NrIChIQ0xLMSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFJDQ19MTF9FQ19BUEIxX0RJVgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJlZiBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcigpLiAqLworCisgIHVpbnQzMl90IEFQQjJDTEtEaXZpZGVyOyAgICAgICAgLyohPCBUaGUgQVBCMiBjbG9jayAoUENMSzIpIGRpdmlkZXIuIFRoaXMgY2xvY2sgaXMgZGVyaXZlZCBmcm9tIHRoZSBBSEIgY2xvY2sgKEhDTEsxKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUkNDX0xMX0VDX0FQQjJfRElWCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVmIExMX1JDQ19TZXRBUEIyUHJlc2NhbGVyKCkuICovCisKK30gTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWY7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVUSUxTX0xMX0V4cG9ydGVkX0NvbnN0YW50cyBVVElMUyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVUSUxTX0VDX0hTRV9CWVBBU1MgSFNFIEJ5cGFzcyBhY3RpdmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfVVRJTFNfSFNFQllQQVNTX09GRiAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgLyohPCBIU0UgQnlwYXNzIGlzIG5vdCBlbmFibGVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX0hTRUJZUEFTU19PTiAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgIC8qITwgSFNFIEJ5cGFzcyBpcyBlbmFibGVkICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVVElMU19FQ19QQUNLQUdFVFlQRSBQQUNLQUdFIFRZUEUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9DU1AxMDAgICAgICAgICAweDAwMDAwMDExVSAvKiE8IENTUDEwMCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfQ1NQMTAwX0MgICAgICAgMHgwMDAwMDAxMlUgLyohPCBDU1AxMDAgcGFja2FnZSB0eXBlIHcvIGNhcGZyZWUgTERPICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjY4ICAgICAgICAgIDB4MDAwMDAwMTNVIC8qITwgUUZONjggcGFja2FnZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9VVElMU19QQUNLQUdFVFlQRV9RRk42OF9DICAgICAgICAweDAwMDAwMDE0VSAvKiE8IFFGTjY4IHBhY2thZ2UgdHlwZSB3LyBjYXBmcmVlIExETyAgICAgICAgKi8KKyNkZWZpbmUgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZONDggICAgICAgICAgMHgwMDAwMDAwQVUgLyohPCBRRk40OCBwYWNrYWdlIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjQ4X0MgICAgICAgIDB4MDAwMDAwMTVVIC8qITwgUUZONDggcGFja2FnZSB0eXBlIHcvIGNhcGZyZWUgTERPICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFVUSUxTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUZfREVWSUNFX0VMRUNUUk9OSUNfU0lHTkFUVVJFIERFVklDRSBFTEVDVFJPTklDIFNJR05BVFVSRQorICAqIEB7CisgICovCisgIC8qKgorICAgICogQGJyaWVmICBHZXQgV29yZDAgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICAgKiBAcmV0dmFsIFVJRFszMTowXTogWCBhbmQgWSBjb29yZGluYXRlcyBvbiB0aGUgd2FmZXIgZXhwcmVzc2VkIGluIEJDRCBmb3JtYXQKKyAgICAqLworICBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0VUlEX1dvcmQwKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFX0FERFJFU1MpKSk7CisgIH0KKworICAvKioKKyAgICAqIEBicmllZiAgR2V0IFdvcmQxIG9mIHRoZSB1bmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKFVJRCBiYXNlZCBvbiA5NiBiaXRzKQorICAgICogQHJldHZhbCBVSURbNjM6MzJdOiBXYWZlciBudW1iZXIgKFVJRFszOTozMl0pICYgTE9UX05VTVsyMzowXSAoVUlEWzYzOjQwXSkKKyAgICAqLworICBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0VUlEX1dvcmQxKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRV9BRERSRVNTICsgNFUpKSkpOworICB9CisKKyAgLyoqCisgICAgKiBAYnJpZWYgIEdldCBXb3JkMiBvZiB0aGUgdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIChVSUQgYmFzZWQgb24gOTYgYml0cykKKyAgICAqIEByZXR2YWwgVUlEWzk1OjY0XTogTG90IG51bWJlciAoQVNDSUkgZW5jb2RlZCkgLSBMT1RfTlVNWzU1OjI0XQorICAgICovCisgIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRVSURfV29yZDIodm9pZCkKKyAgeworICAgIHJldHVybiAodWludDMyX3QpKFJFQURfUkVHKCooKHVpbnQzMl90ICopKFVJRF9CQVNFX0FERFJFU1MgKyA4VSkpKSk7CisgIH0KKworICAvKioKKyAgICAqIEBicmllZiAgR2V0IEZsYXNoIG1lbW9yeSBzaXplCisgICAgKiBAbm90ZSAgIFRoaXMgYml0ZmllbGQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UgRmxhc2ggbWVtb3J5IGV4cHJlc3NlZCBpbgorICAgICogICAgICAgICBLYnl0ZXMuIEFzIGFuIGV4YW1wbGUsIDB4MDQwIGNvcnJlc3BvbmRzIHRvIDY0IEtieXRlcy4KKyAgICAqIEByZXR2YWwgRkxBU0hfU0laRVsxNTowXTogRmxhc2ggbWVtb3J5IHNpemUKKyAgICAqLworICBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfR2V0Rmxhc2hTaXplKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KShSRUFEX1JFRygqKCh1aW50MzJfdCAqKUZMQVNIU0laRV9CQVNFX0FERFJFU1MpKSAmIDB4MDAwMEZGRkZVTCk7CisgIH0KKworICAvKioKKyAgICAqIEBicmllZiAgR2V0IFBhY2thZ2UgdHlwZQorICAgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfQ1NQMTAwCisgICAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9DU1AxMDBfQworICAgICogICAgICAgICBAYXJnIEByZWYgTExfVVRJTFNfUEFDS0FHRVRZUEVfUUZONjgKKyAgICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjY4X0MKKyAgICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX1BBQ0tBR0VUWVBFX1FGTjQ4CisgICAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VVElMU19QQUNLQUdFVFlQRV9RRk40OF9DCisgICAgKgorICAgICovCisgIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9HZXRQYWNrYWdlVHlwZSh2b2lkKQorICB7CisgICAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9SRUcoKigodWludDMyX3QgKilQQUNLQUdFX0JBU0VfQUREUkVTUykpICYgMHgxRlUpOworICB9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfTExfRUZfREVMQVkgREVMQVkKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIG9mIHRoZSB0aW1lIGJhc2UuCisgICogQHBhcmFtICBIQ0xLRnJlcXVlbmN5IEhDTEsgZnJlcXVlbmN5IGluIEh6IChjYW4gYmUgY2FsY3VsYXRlZCB0aGFua3MgdG8gUkNDIGhlbHBlciBtYWNybyBvciBmdW5jdGlvbiBAcmVmIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxIChIQ0xLMV9GcmVxdWVuY3kgZmllbGQpKQorICAqIEBub3RlICAgV2hlbiBhIFJUT1MgaXMgdXNlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIFN5c1RpY2sKKyAgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBmb3IgYSBkZWxheSB1c2UgcmF0aGVyIG9zRGVsYXkgUlRPUyBzZXJ2aWNlLgorICAqIEBwYXJhbSAgVGlja3MgTnVtYmVyIG9mIHRpY2tzCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9Jbml0VGljayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5LCB1aW50MzJfdCBUaWNrcykKK3sKKyAgLyogQ29uZmlndXJlIHRoZSBTeXNUaWNrIHRvIGhhdmUgaW50ZXJydXB0IGluIDFtcyB0aW1lIGJhc2UgKi8KKyAgU3lzVGljay0+TE9BRCAgPSAodWludDMyX3QpKChIQ0xLRnJlcXVlbmN5IC8gVGlja3MpIC0gMVVMKTsgIC8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8KKyAgU3lzVGljay0+VkFMICAgPSAwVUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovCisgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfAorICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIFN5c3RpY2sgVGltZXIgKi8KK30KKwordm9pZCAgICAgICAgTExfSW5pdDFtc1RpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSk7CisKK3ZvaWQgICAgICAgIExMX21EZWxheSh1aW50MzJfdCBEZWxheSk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVRJTFNfRUZfU1lTVEVNIFNZU1RFTQorICAqIEB7CisgICovCisKK3ZvaWQgICAgICAgIExMX1NldFN5c3RlbUNvcmVDbG9jayh1aW50MzJfdCBIQ0xLRnJlcXVlbmN5KTsKK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19NU0koTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0koTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX1BMTF9Db25maWdTeXN0ZW1DbG9ja19IU0UodWludDMyX3QgSFNFQnlwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJXQnh4X0xMX1VUSUxTX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMndieHhfbGxfd3dkZy5oIGIvSW5jL3N0bTMyd2J4eF9sbF93d2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2Yzc0YgotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMndieHhfbGxfd3dkZy5oCkBAIC0wLDAgKzEsMzMxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3d3ZGcuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgV1dERyBMTCBtb2R1bGUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgU1RNMzJXQnh4X0xMX1dXREdfSAorI2RlZmluZSBTVE0zMldCeHhfTExfV1dER19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoV1dERykKKworLyoqIEBkZWZncm91cCBXV0RHX0xMIFdXREcKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIFdXREcgRXhwb3J0ZWQgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VDX0lUIElUIERlZmluZXMKKyAgKiBAYnJpZWYgICAgSVQgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX1dXREdfUmVhZFJlZyBhbmQgIExMX1dXREdfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfV1dER19DRlJfRVdJICAgICAgICAgICAgICAgICAgICAgV1dER19DRlJfRVdJCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUNfUFJFU0NBTEVSICBQUkVTQ0FMRVIKKyogQHsKKyovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzEgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8xICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzIgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8yICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS80ICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzggICAgICAgICAgICAgICAgIChXV0RHX0NGUl9XREdUQl8wIHwgV1dER19DRlJfV0RHVEJfMSkgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS84ICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzE2ICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8xNiAqLworI2RlZmluZSBMTF9XV0RHX1BSRVNDQUxFUl8zMiAgICAgICAgICAgICAgICAoV1dER19DRlJfV0RHVEJfMiB8IFdXREdfQ0ZSX1dER1RCXzApICAgICAgICAgICAgICAgICAgICAgLyohPCBXV0RHIGNvdW50ZXIgY2xvY2sgPSAoUENMSzEvNDA5NikvMzIgKi8KKyNkZWZpbmUgTExfV1dER19QUkVTQ0FMRVJfNjQgICAgICAgICAgICAgICAgKFdXREdfQ0ZSX1dER1RCXzIgfCBXV0RHX0NGUl9XREdUQl8xKSAgICAgICAgICAgICAgICAgICAgIC8qITwgV1dERyBjb3VudGVyIGNsb2NrID0gKFBDTEsxLzQwOTYpLzY0ICovCisjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzEyOCAgICAgICAgICAgICAgIChXV0RHX0NGUl9XREdUQl8yIHwgV1dER19DRlJfV0RHVEJfMSB8IFdXREdfQ0ZSX1dER1RCXzApICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8xMjggKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfTWFjcm9zIFdXREcgRXhwb3J0ZWQgTWFjcm9zCisgICogQHsKKyAgKi8KKy8qKiBAZGVmZ3JvdXAgV1dER19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgbWFjcm9zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB2YWx1ZSBpbiBXV0RHIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfV1dER19Xcml0ZVJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18sIF9fVkFMVUVfXykgV1JJVEVfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXywgKF9fVkFMVUVfXykpCisKKy8qKgorICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIFdXREcgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX1dXREdfUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFdXREdfTExfRXhwb3J0ZWRfRnVuY3Rpb25zIFdXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VGX0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbgorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBXaW5kb3cgV2F0Y2hkb2cuIFRoZSB3YXRjaGRvZyBpcyBhbHdheXMgZGlzYWJsZWQgYWZ0ZXIgYSByZXNldC4KKyAgKiBAbm90ZSAgIEl0IGlzIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgV0RHQSBiaXQgaW4gdGhlIFdXREdfQ1IgcmVnaXN0ZXIsCisgICogICAgICAgICB0aGVuIGl0IGNhbm5vdCBiZSBkaXNhYmxlZCBhZ2FpbiBleGNlcHQgYnkgYSByZXNldC4KKyAgKiAgICAgICAgIFRoaXMgYml0IGlzIHNldCBieSBzb2Z0d2FyZSBhbmQgb25seSBjbGVhcmVkIGJ5IGhhcmR3YXJlIGFmdGVyIGEgcmVzZXQuCisgICogICAgICAgICBXaGVuIFdER0EgPSAxLCB0aGUgd2F0Y2hkb2cgY2FuIGdlbmVyYXRlIGEgcmVzZXQuCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV0RHQSAgICAgICAgICBMTF9XV0RHX0VuYWJsZQorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19FbmFibGUoV1dER19UeXBlRGVmICpXV0RHeCkKK3sKKyAgU0VUX0JJVChXV0RHeC0+Q1IsIFdXREdfQ1JfV0RHQSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2tzIGlmIFdpbmRvdyBXYXRjaGRvZyBpcyBlbmFibGVkCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgV0RHQSAgICAgICAgICBMTF9XV0RHX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfSXNFbmFibGVkKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFdXREd4LT5DUiwgV1dER19DUl9XREdBKSA9PSAoV1dER19DUl9XREdBKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgV2F0Y2hkb2cgY291bnRlciB2YWx1ZSB0byBwcm92aWRlZCB2YWx1ZSAoNy1iaXRzIFRbNjowXSkKKyAgKiBAbm90ZSAgIFdoZW4gd3JpdGluZyB0byB0aGUgV1dER19DUiByZWdpc3RlciwgYWx3YXlzIHdyaXRlIDEgaW4gdGhlIE1TQiBiNiB0byBhdm9pZCBnZW5lcmF0aW5nIGFuIGltbWVkaWF0ZSByZXNldAorICAqICAgICAgICAgVGhpcyBjb3VudGVyIGlzIGRlY3JlbWVudGVkIGV2ZXJ5ICg0MDk2IHggMmV4cFdER1RCKSBQQ0xLIGN5Y2xlcworICAqICAgICAgICAgQSByZXNldCBpcyBwcm9kdWNlZCB3aGVuIGl0IHJvbGxzIG92ZXIgZnJvbSAweDQwIHRvIDB4M0YgKGJpdCBUNiBiZWNvbWVzIGNsZWFyZWQpCisgICogICAgICAgICBTZXR0aW5nIHRoZSBjb3VudGVyIGxvd2VyIHRoZW4gMHg0MCBjYXVzZXMgYW4gaW1tZWRpYXRlIHJlc2V0IChpZiBXV0RHIGVuYWJsZWQpCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgVCAgICAgICAgICAgICBMTF9XV0RHX1NldENvdW50ZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENvdW50ZXIgMC4uMHg3RiAoNyBiaXQgY291bnRlciB2YWx1ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfU2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBDb3VudGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DUiwgV1dER19DUl9ULCBDb3VudGVyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gY3VycmVudCBXYXRjaGRvZyBDb3VudGVyIFZhbHVlICg3IGJpdHMgY291bnRlciB2YWx1ZSkKKyAgKiBAcm10b2xsIENSICAgICAgICAgICBUICAgICAgICAgICAgIExMX1dXREdfR2V0Q291bnRlcgorICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEByZXR2YWwgNyBiaXQgV2F0Y2hkb2cgQ291bnRlciB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0Q291bnRlcihXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKFJFQURfQklUKFdXREd4LT5DUiwgV1dER19DUl9UKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSB0aW1lIGJhc2Ugb2YgdGhlIHByZXNjYWxlciAoV0RHVEIpLgorICAqIEBub3RlICAgUHJlc2NhbGVyIGlzIHVzZWQgdG8gYXBwbHkgcmF0aW8gb24gUENMSyBjbG9jaywgc28gdGhhdCBXYXRjaGRvZyBjb3VudGVyCisgICogICAgICAgICBpcyBkZWNyZW1lbnRlZCBldmVyeSAoNDA5NiB4IDJleHBXREdUQikgUENMSyBjeWNsZXMKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBXREdUQiAgICAgICAgIExMX1dXREdfU2V0UHJlc2NhbGVyCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHBhcmFtICBQcmVzY2FsZXIgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl84CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMTYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8zMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzY0CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMTI4CisqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfV1dER19TZXRQcmVzY2FsZXIoV1dER19UeXBlRGVmICpXV0RHeCwgdWludDMyX3QgUHJlc2NhbGVyKQoreworICBNT0RJRllfUkVHKFdXREd4LT5DRlIsIFdXREdfQ0ZSX1dER1RCLCBQcmVzY2FsZXIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIFByZXNjYWxlciBWYWx1ZQorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFdER1RCICAgICAgICAgTExfV1dER19HZXRQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl80CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfOAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzE2CisgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfMzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl82NAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzEyOAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0UHJlc2NhbGVyKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfV0RHVEIpKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFdhdGNoZG9nIFdpbmRvdyB2YWx1ZSB0byBiZSBjb21wYXJlZCB0byB0aGUgZG93bmNvdW50ZXIgKDctYml0cyBXWzY6MF0pLgorICAqIEBub3RlICAgVGhpcyB3aW5kb3cgdmFsdWUgZGVmaW5lcyB3aGVuIHdyaXRlIGluIHRoZSBXV0RHX0NSIHJlZ2lzdGVyCisgICogICAgICAgICB0byBwcm9ncmFtIFdhdGNoZG9nIGNvdW50ZXIgaXMgYWxsb3dlZC4KKyAgKiAgICAgICAgIFdhdGNoZG9nIGNvdW50ZXIgdmFsdWUgdXBkYXRlIG11c3Qgb2NjdXIgb25seSB3aGVuIHRoZSBjb3VudGVyIHZhbHVlCisgICogICAgICAgICBpcyBsb3dlciB0aGFuIHRoZSBXYXRjaGRvZyB3aW5kb3cgcmVnaXN0ZXIgdmFsdWUuCisgICogICAgICAgICBPdGhlcndpc2UsIGEgTUNVIHJlc2V0IGlzIGdlbmVyYXRlZCBpZiB0aGUgNy1iaXQgV2F0Y2hkb2cgY291bnRlciB2YWx1ZQorICAqICAgICAgICAgKGluIHRoZSBjb250cm9sIHJlZ2lzdGVyKSBpcyByZWZyZXNoZWQgYmVmb3JlIHRoZSBkb3duY291bnRlciBoYXMgcmVhY2hlZAorICAqICAgICAgICAgdGhlIHdhdGNoZG9nIHdpbmRvdyByZWdpc3RlciB2YWx1ZS4KKyAgKiAgICAgICAgIFBoeXNpY2FsbHkgaXMgcG9zc2libGUgdG8gc2V0IHRoZSBXaW5kb3cgbG93ZXIgdGhlbiAweDQwIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQuCisgICogICAgICAgICBUbyBnZW5lcmF0ZSBhbiBpbW1lZGlhdGUgcmVzZXQsIGl0IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgQ291bnRlciBsb3dlciB0aGFuIDB4NDAuCisgICogQHJtdG9sbCBDRlIgICAgICAgICAgVyAgICAgICAgICAgICBMTF9XV0RHX1NldFdpbmRvdworICAqIEBwYXJhbSAgV1dER3ggV1dERyBJbnN0YW5jZQorICAqIEBwYXJhbSAgV2luZG93IDB4MDAuLjB4N0YgKDcgYml0IFdpbmRvdyB2YWx1ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1dXREdfU2V0V2luZG93KFdXREdfVHlwZURlZiAqV1dER3gsIHVpbnQzMl90IFdpbmRvdykKK3sKKyAgTU9ESUZZX1JFRyhXV0RHeC0+Q0ZSLCBXV0RHX0NGUl9XLCBXaW5kb3cpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBjdXJyZW50IFdhdGNoZG9nIFdpbmRvdyBWYWx1ZSAoNyBiaXRzIHZhbHVlKQorICAqIEBybXRvbGwgQ0ZSICAgICAgICAgIFcgICAgICAgICAgICAgTExfV1dER19HZXRXaW5kb3cKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIDcgYml0IFdhdGNoZG9nIFdpbmRvdyB2YWx1ZQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1dXREdfR2V0V2luZG93KFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoUkVBRF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfVykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFdXREdfTExfRUZfRkxBR19NYW5hZ2VtZW50IEZMQUdfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlcyBpZiB0aGUgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IEZsYWcgaXMgc2V0IG9yIG5vdC4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGlzIHNldCBieSBoYXJkd2FyZSB3aGVuIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSB2YWx1ZSAweDQwLgorICAqICAgICAgICAgSXQgbXVzdCBiZSBjbGVhcmVkIGJ5IHNvZnR3YXJlIGJ5IHdyaXRpbmcgMC4KKyAgKiAgICAgICAgIEEgd3JpdGUgb2YgMSBoYXMgbm8gZWZmZWN0LiBUaGlzIGJpdCBpcyBhbHNvIHNldCBpZiB0aGUgaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLgorICAqIEBybXRvbGwgU1IgICAgICAgICAgIEVXSUYgICAgICAgICAgTExfV1dER19Jc0FjdGl2ZUZsYWdfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0lzQWN0aXZlRmxhZ19FV0tVUChXV0RHX1R5cGVEZWYgKldXREd4KQoreworICByZXR1cm4gKChSRUFEX0JJVChXV0RHeC0+U1IsIFdXREdfU1JfRVdJRikgPT0gKFdXREdfU1JfRVdJRikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgRmxhZyAoRVdJRikKKyAgKiBAcm10b2xsIFNSICAgICAgICAgICBFV0lGICAgICAgICAgIExMX1dXREdfQ2xlYXJGbGFnX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0NsZWFyRmxhZ19FV0tVUChXV0RHX1R5cGVEZWYgKldXREd4KQoreworICBXUklURV9SRUcoV1dER3gtPlNSLCB+V1dER19TUl9FV0lGKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0xMX0VGX0lUX01hbmFnZW1lbnQgSVRfTWFuYWdlbWVudAorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFdoZW4gc2V0LCBhbiBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyIHRoZSBjb3VudGVyIHJlYWNoZXMgdmFsdWUgMHg0MC4KKyAgKiAgICAgICAgIFRoaXMgaW50ZXJydXB0IGlzIG9ubHkgY2xlYXJlZCBieSBoYXJkd2FyZSBhZnRlciBhIHJlc2V0CisgICogQHJtdG9sbCBDRlIgICAgICAgICAgRVdJICAgICAgICAgICBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQCisgICogQHBhcmFtICBXV0RHeCBXV0RHIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX0VuYWJsZUlUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIFNFVF9CSVQoV1dER3gtPkNGUiwgV1dER19DRlJfRVdJKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGlzIGVuYWJsZWQKKyAgKiBAcm10b2xsIENGUiAgICAgICAgICBFV0kgICAgICAgICAgIExMX1dXREdfSXNFbmFibGVkSVRfRVdLVVAKKyAgKiBAcGFyYW0gIFdXREd4IFdXREcgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9XV0RHX0lzRW5hYmxlZElUX0VXS1VQKFdXREdfVHlwZURlZiAqV1dER3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKFdXREd4LT5DRlIsIFdXREdfQ0ZSX0VXSSkgPT0gKFdXREdfQ0ZSX0VXSSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFdXREcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFNUTTMyV0J4eF9MTF9XV0RHX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0xpY2Vuc2UubWQgYi9MaWNlbnNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOGUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWNlbnNlLm1kCkBAIC0wLDAgKzEsMyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzCisKK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QgMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCAyZThiMTA4Li5kN2I3MjY0IDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xLDIgKzEsNDUgQEAKLSMgc3RtMzJ3Ynh4X2hhbF9kcml2ZXIKLVByb3ZpZGVzIHRoZSBTVE0zMkN1YmUgTUNVIENvbXBvbmVudCAiaGFsX2RyaXZlciIgb2YgdGhlIFNUTTMyV0Igc2VyaWVzLgorIyBTVE0zMkN1YmVXQiBIQUwgRHJpdmVyIE1DVSBDb21wb25lbnQKKworIyMgT3ZlcnZpZXcKKworKipTVE0zMkN1YmUqKiBpcyBhbiBTVE1pY3JvZWxlY3Ryb25pY3Mgb3JpZ2luYWwgaW5pdGlhdGl2ZSB0byBlYXNlIHRoZSBkZXZlbG9wZXJzIGxpZmUgYnkgcmVkdWNpbmcgZWZmb3J0cywgdGltZSBhbmQgY29zdC4KKworKipTVE0zMkN1YmUqKiBjb3ZlcnMgdGhlIG92ZXJhbGwgU1RNMzIgcHJvZHVjdHMgcG9ydGZvbGlvLiBJdCBpbmNsdWRlcyBhIGNvbXByZWhlbnNpdmUgZW1iZWRkZWQgc29mdHdhcmUgcGxhdGZvcm0sIGRlbGl2ZXJlZCBmb3IgZWFjaCBTVE0zMiBzZXJpZXMuCisgICAqIFRoZSBDTVNJUyBtb2R1bGVzIChjb3JlIGFuZCBkZXZpY2UpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFSTSh0bSkgY29yZSBpbXBsZW1lbnRlZCBpbiB0aGlzIFNUTTMyIHByb2R1Y3QKKyAgICogVGhlIFNUTTMyIEhBTC1MTCBkcml2ZXJzIDogYW4gYWJzdHJhY3Rpb24gZHJpdmVycyBsYXllciwgdGhlIEFQSSBlbnN1cmluZyBtYXhpbWl6ZWQgcG9ydGFiaWxpdHkgYWNyb3NzIHRoZSBTVE0zMiBwb3J0Zm9saW8KKyAgICogVGhlIEJTUCBEcml2ZXJzIG9mIGVhY2ggZXZhbHVhdGlvbiBvciBkZW1vbnN0cmF0aW9uIGJvYXJkIHByb3ZpZGVkIGJ5IHRoaXMgU1RNMzIgc2VyaWVzCisgICAqIEEgY29uc2lzdGVudCBzZXQgb2YgbWlkZGxld2FyZXMgY29tcG9uZW50cyBzdWNoIGFzIFJUT1MsIFVTQiwgRmF0RlMsIEdyYXBoaWNzLCBTVE0zMl9Ub3VjaFNlbnNpbmdfTGlicmFyeSAuLi4KKyAgICogQSBmdWxsIHNldCBvZiBzb2Z0d2FyZSBwcm9qZWN0cyAoYmFzaWMgZXhhbXBsZXMsIGFwcGxpY2F0aW9ucyBvciBkZW1vbnN0cmF0aW9ucykgZm9yIGVhY2ggYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKKworVHdvIG1vZGVscyBvZiBwdWJsaWNhdGlvbiBhcmUgcHJvcG9zZWQgZm9yIHRoZSBTVE0zMkN1YmUgZW1iZWRkZWQgc29mdHdhcmU6CisgICAqIFRoZSBtb25vbGl0aGljICoqTUNVIFBhY2thZ2UqKiA6IGFsbCBTVE0zMkN1YmUgc29mdHdhcmUgbW9kdWxlcyBvZiBvbmUgU1RNMzIgc2VyaWVzIGFyZSBwcmVzZW50IChEcml2ZXJzLCBNaWRkbGV3YXJlcywgUHJvamVjdHMsIFV0aWxpdGllcykgaW4gdGhlIHJlcG8gKHVzdWFsIG5hbWUgKipTVE0zMkN1YmV4eCoqLCB4eCBjb3JyZXNwb25kaW5nIHRvIHRoZSBTVE0zMiBzZXJpZXMpCisgICAqIFRoZSAqKk1DVSBjb21wb25lbnQqKiA6IHByb2dyZXNzaXZlbHkgZnJvbSBOb3ZlbWJlciAyMDE5LCBlYWNoIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGUgYmVpbmcgcGFydCBvZiB0aGUgU1RNMzJDdWJlIE1DVSBQYWNrYWdlLCB3aWxsIGJlIGRlbGl2ZXJlZCBhcyBhbiBpbmRpdmlkdWFsIHJlcG8sIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCBhbmQgZ2V0IG9ubHkgdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGZ1bmN0aW9ucy4KKworIyMgRGVzY3JpcHRpb24KKworVGhpcyAqKnN0bTMyd2J4eF9oYWxfZHJpdmVyKiogTUNVIGNvbXBvbmVudCByZXBvIGlzIG9uZSBlbGVtZW50IG9mIHRoZSBTVE0zMkN1YmVXQiBNQ1UgZW1iZWRkZWQgc29mdHdhcmUgcGFja2FnZSwgcHJvdmlkaW5nIHRoZSAqKkhBTC1MTCBEcml2ZXJzKiogcGFydC4KKworIyMgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVE1pY3JvZWxlY3Ryb25pY3MgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KKworIyMgQ29tcGF0aWJpbGl0eSBpbmZvcm1hdGlvbgorCitJbiB0aGlzIHRhYmxlLCB5b3UgY2FuIGZpbmQgdGhlIHN1Y2Nlc3NpdmUgdmVyc2lvbnMgb2YgdGhpcyBIQUwtTEwgRHJpdmVyIGNvbXBvbmVudCwgaW4gbGluZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb25zIG9mIHRoZSBmdWxsIE1DVSBwYWNrYWdlOgorCitJdCBpcyAqKmNydWNpYWwqKiB0aGF0IHlvdSB1c2UgYSBjb25zaXN0ZW50IHNldCBvZiB2ZXJzaW9ucyBmb3IgdGhlIENNU0lTIENvcmUgLSBDTVNJUyBEZXZpY2UgLSBIQUwsIGFzIG1lbnRpb25lZCBpbiB0aGlzIHRhYmxlLgorCitIQUwgRHJpdmVyIFdCIHwgQ01TSVMgRGV2aWNlIFdCIHwgQ01TSVMgQ29yZSB8IFdhcyBkZWxpdmVyZWQgaW4gdGhlIGZ1bGwgTUNVIHBhY2thZ2UKKy0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGFnIHYxLjEuMCB8IFRhZyB2MS4xLjAgfCBUYWcgdjQuNV9jbTQgfCBUYWcgdjEuMS4wIChhbmQgZm9sbG93aW5nLCBpZiBhbnksIHRpbGwgbmV4dCBuZXcgdGFnKQorCitUaGUgZnVsbCAqKlNUTTMyQ3ViZVdCKiogTUNVIHBhY2thZ2UgaXMgYXZhaWxhYmxlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vU1RNaWNyb2VsZWN0cm9uaWNzL1NUTTMyQ3ViZVdCKS4KKworIyMgVHJvdWJsZXNob290aW5nCisKK0lmIHlvdSBoYXZlIGFueSBpc3N1ZSB3aXRoIHRoZSAqKlNvZnR3YXJlIGNvbnRlbnQqKiBvZiB0aGlzIHJlcG8sIHlvdSBjYW4gW2ZpbGUgYW4gaXNzdWUgb24gR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vU1RNaWNyb2VsZWN0cm9uaWNzL3N0bTMyd2J4eF9oYWxfZHJpdmVyL2lzc3Vlcy9uZXcpLgorCitGb3IgYW55IG90aGVyIHF1ZXN0aW9uIHJlbGF0ZWQgdG8gdGhlIHByb2R1Y3QsIHRoZSB0b29scywgdGhlIGVudmlyb25tZW50LCB5b3UgY2FuIHN1Ym1pdCBhIHRvcGljIG9uIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKS4KZGlmZiAtLWdpdCBhL1JlbGVhc2VfTm90ZXMuaHRtbCBiL1JlbGVhc2VfTm90ZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTllMGYwCi0tLSAvZGV2L251bGwKKysrIGIvUmVsZWFzZV9Ob3Rlcy5odG1sCkBAIC0wLDAgKzEsMTI3IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4KKyAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJwYW5kb2MiIC8+CisgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPXllcyIgLz4KKyAgPHRpdGxlPlJlbGVhc2UgTm90ZXMgZm9yIFNUTTMyV0J4eCBIQUwgRHJpdmVyczwvdGl0bGU+CisgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBjb2Rle3doaXRlLXNwYWNlOiBwcmUtd3JhcDt9CisgICAgICBzcGFuLnNtYWxsY2Fwc3tmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7fQorICAgICAgc3Bhbi51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fQorICAgICAgZGl2LmNvbHVtbntkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdpZHRoOiA1MCU7fQorICA8L3N0eWxlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Il9odG1yZXNjL21pbmktc3QuY3NzIiAvPgorICA8IS0tW2lmIGx0IElFIDldPgorICAgIDxzY3JpcHQgc3JjPSIvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9odG1sNXNoaXYvMy43LjMvaHRtbDVzaGl2LXByaW50c2hpdi5taW4uanMiPjwvc2NyaXB0PgorICA8IVtlbmRpZl0tLT4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBjbGFzcz0icm93Ij4KKzxkaXYgY2xhc3M9ImNvbC1zbS0xMiBjb2wtbGctNCI+Cis8ZGl2IGNsYXNzPSJjYXJkIGZsdWlkIj4KKzxkaXYgY2xhc3M9InNlY3Rpb25lIGRhcmsiPgorPGNlbnRlcj4KKzxoMSBpZD0icmVsZWFzZS1ub3Rlcy1mb3Itc3RtMzJ3Ynh4LWhhbC1kcml2ZXJzIj48c21hbGw+UmVsZWFzZSBOb3RlcyBmb3I8L3NtYWxsPiBTVE0zMldCeHggSEFMIERyaXZlcnM8L2gxPgorPHA+Q29weXJpZ2h0IMKpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzPGJyIC8+Cis8L3A+Cis8YSBocmVmPSJodHRwczovL3d3dy5zdC5jb20iIGNsYXNzPSJsb2dvIj48aW1nIHNyYz0iX2h0bXJlc2Mvc3RfbG9nby5wbmciIGFsdD0iU1QgbG9nbyIgLz48L2E+Cis8L2NlbnRlcj4KKzwvZGl2PgorPC9kaXY+Cis8aDEgaWQ9ImxpY2Vuc2UiPkxpY2Vuc2U8L2gxPgorPHA+VGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHRoZSDigJxMaWNlbnNl4oCdOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBjb21wb25lbnQgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OjwvcD4KKzxwPjxhIGhyZWY9Imh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlIj5odHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZTwvYT48L3A+Cis8aDEgaWQ9InB1cnBvc2UiPlB1cnBvc2U8L2gxPgorPHA+VGhlIFNUTTMyQ3ViZSBIQUwgYW5kIExMLCBhbiBTVE0zMiBhYnN0cmFjdGlvbiBsYXllciBlbWJlZGRlZCBzb2Z0d2FyZSwgZW5zdXJlIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgU1RNMzIgcG9ydGZvbGlvLjwvcD4KKzxwPlRoZSBQb3J0YWJsZSBBUElzIGxheWVyIHByb3ZpZGVzIGEgZ2VuZXJpYywgbXVsdGkgaW5zdGFuY2VkIGFuZCBzaW1wbGUgc2V0IG9mIEFQSXMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXBwZXIgbGF5ZXIgKGFwcGxpY2F0aW9uLCBsaWJyYXJpZXMgYW5kIHN0YWNrcykuIEl0IGlzIGNvbXBvc2VkIG9mIG5hdGl2ZSBhbmQgZXh0ZW5kZWQgQVBJcyBzZXQuIEl0IGlzIGRpcmVjdGx5IGJ1aWx0IGFyb3VuZCBhIGdlbmVyaWMgYXJjaGl0ZWN0dXJlIGFuZCBhbGxvd3MgdGhlIGJ1aWxkLXVwb24gbGF5ZXJzLCBsaWtlIHRoZSBtaWRkbGV3YXJlIGxheWVyLCB0byBpbXBsZW1lbnQgaXRzIGZ1bmN0aW9ucyB3aXRob3V0IGtub3dpbmcgaW4tZGVwdGggdGhlIHVzZWQgU1RNMzIgZGV2aWNlLiBUaGlzIGltcHJvdmVzIHRoZSBsaWJyYXJ5IGNvZGUgcmV1c2FiaWxpdHkgYW5kIGd1YXJhbnRlZXMgYW4gZWFzeSBwb3J0YWJpbGl0eSBvbiBvdGhlciBkZXZpY2VzIGFuZCBTVE0zMiBmYW1pbGllcy48L3A+Cis8cD5UaGUgTG93IExheWVyIChMTCkgZHJpdmVycyBhcmUgcGFydCBvZiB0aGUgU1RNMzJDdWJlIGZpcm13YXJlIEhBTCB0aGF0IHByb3ZpZGUgYmFzaWMgc2V0IG9mIG9wdGltaXplZCBhbmQgb25lIHNob3Qgc2VydmljZXMuIFRoZSBMb3cgbGF5ZXIgZHJpdmVycywgY29udHJhcnkgdG8gdGhlIEhBTCBvbmVzIGFyZSBub3QgRnVsbHkgUG9ydGFibGUgYWNyb3NzIHRoZSBTVE0zMiBmYW1pbGllczsgdGhlIGF2YWlsYWJpbGl0eSBvZiBzb21lIGZ1bmN0aW9ucyBkZXBlbmQgb24gdGhlIHBoeXNpY2FsIGF2YWlsYWJpbGl0eSBvZiB0aGUgcmVsYXRpdmUgZmVhdHVyZXMgb24gdGhlIHByb2R1Y3QuIFRoZSBMb3cgTGF5ZXIgKExMKSBkcml2ZXJzIGFyZSBkZXNpZ25lZCB0byBvZmZlciB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOjwvcD4KKzx1bD4KKzxsaT5OZXcgc2V0IG9mIGlubGluZSBmdW5jdGlvbiBmb3IgZGlyZWN0IGFuZCBhdG9taWMgcmVnaXN0ZXIgYWNjZXNzPC9saT4KKzxsaT5PbmUtc2hvdCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIEhBTCBkcml2ZXJzIG9yIGZyb20gYXBwbGljYXRpb24gbGV2ZWwuPC9saT4KKzxsaT5GdWxseSBJbmRlcGVuZGFudCBmcm9tIEhBTCBhbmQgY2FuIGJlIHVzZWQgaW4gc3RhbmRhbG9uZSB1c2FnZSAod2l0aG91dCBIQUwgZHJpdmVycyk8L2xpPgorPGxpPkZ1bGwgZmVhdHVyZXMgY292ZXJhZ2Ugb2YgdGhlIGFsbCB0aGUgc3VwcG9ydGVkIHBlcmlwaGVyYWxzLjwvbGk+Cis8L3VsPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb2wtc20tMTIgY29sLWxnLTgiPgorPGgxIGlkPSJ1cGRhdGUtaGlzdG9yeSI+VXBkYXRlIEhpc3Rvcnk8L2gxPgorPGRpdiBjbGFzcz0iY29sbGFwc2UiPgorPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY29sbGFwc2Utc2VjdGlvbjIiIGNoZWNrZWQgYXJpYS1oaWRkZW49InRydWUiPiA8bGFiZWwgZm9yPSJjb2xsYXBzZS1zZWN0aW9uMiIgYXJpYS1oaWRkZW49InRydWUiPlYxLjEuMCAvIDA1LUFwcmlsLTIwMTk8L2xhYmVsPgorPGRpdj4KKzxoMiBpZD0ibWFpbi1jaGFuZ2VzIj5NYWluIENoYW5nZXM8L2gyPgorPGgzIGlkPSJtYWludGVuYW5jZS1yZWxlYXNlIj5NYWludGVuYW5jZSByZWxlYXNlPC9oMz4KKzxwPk1haW50ZW5hbmNlIHJlbGVhc2Ugb2YgSEFMIGFuZCBMb3cgbGF5ZXJzIGRyaXZlcnMgc3VwcG9ydGluZyBTVE0zMldCNTV4eCBkZXZpY2VzLjwvcD4KKzx0YWJsZT4KKzxjYXB0aW9uPkZpeGVkIGJ1Z3MgbGlzdDwvY2FwdGlvbj4KKzx0aGVhZD4KKzx0ciBjbGFzcz0iaGVhZGVyIj4KKzx0aD5QZXJpcGhlcmFsPC90aD4KKzx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPkhlYWRsaW5lPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyIGNsYXNzPSJvZGQiPgorPHRkPkNPTVA8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+T25seSBjb3NtZXRpYyBjaGFuZ2VzPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImV2ZW4iPgorPHRkPkNSWVA8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+T25seSBjaGFuZ2VzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkPkVYVEk8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+T25seSBjaGFuZ2VzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZD5GTEFTSDwvdGQ+Cis8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7Ij5JbXByb3ZlIGNvZGUgZWZmaWNpZW5jeTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJvZGQiPgorPHRkPkdQSU88L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+SW1wcm92ZSBIQUxfR1BJT19Ub2dnbGVQaW4gZWZmaWNpZW5jeTwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZD5JV0RHPC90ZD4KKzx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiPk9ubHkgY2hhbmdlcyByZWxhdGVkIHRvIGRvY3VtZW50YXRpb248L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZD5SQ0M8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+T25seSBjaGFuZ2VzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZD5SVEM8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+TExfUlRDX0JBS19HZXRSZWdpc3RlciBnZW5lcmF0ZXMgd2FybmluZyBvbiBHQ0MgNi4zLjEgMjAxNzA2MjA8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0ib2RkIj4KKzx0ZD5USU08L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+T25seSBjaGFuZ2VzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbjwvdGQ+Cis8L3RyPgorPHRyIGNsYXNzPSJldmVuIj4KKzx0ZD5UU0M8L3RkPgorPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyI+Q29ycmVjdCBfX0hBTF9UU0NfR0VUX0dST1VQX1NUQVRVUyB3aGljaCB3YXMgY2hlY2tpbmcgb25seSBUU0NfR1JPVVAxX0lEWDwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8aDIgaWQ9ImJhY2t3YXJkLWNvbXBhdGliaWxpdHkiPkJhY2t3YXJkIENvbXBhdGliaWxpdHk8L2gyPgorPHA+VGhpcyByZWxlYXNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbnMuPC9wPgorPGgyIGlkPSJkZXBlbmRlbmNpZXMiPkRlcGVuZGVuY2llczwvaDI+Cis8cD5UaGlzIHNvZnR3YXJlIHJlbGVhc2UgaXMgY29tcGF0aWJsZSB3aXRoOjwvcD4KKzxwPlNUTTMyQ3ViZU1YIFY1LjIuMDwvcD4KKzwvZGl2PgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb2xsYXBzZSI+Cis8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjb2xsYXBzZS1zZWN0aW9uMSIgIGFyaWEtaGlkZGVuPSJ0cnVlIj4gPGxhYmVsIGZvcj0iY29sbGFwc2Utc2VjdGlvbjEiIGFyaWEtaGlkZGVuPSJ0cnVlIj5WMS4wLjAgLyAwNi1GZWJydWFyeS0yMDE5PC9sYWJlbD4KKzxkaXY+Cis8aDIgaWQ9Im1haW4tY2hhbmdlcy0xIj5NYWluIENoYW5nZXM8L2gyPgorPGgzIGlkPSJmaXJzdC1yZWxlYXNlIj5GaXJzdCByZWxlYXNlPC9oMz4KKzxwPkZpcnN0IG9mZmljaWFsIHJlbGVhc2Ugb2YgSEFMIChIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllcikgYW5kIExMIChMb3cgbGF5ZXJzKSBkcml2ZXJzIHRvIHN1cHBvcnQgU1RNMzJXQjU1eHguPC9wPgorPC9kaXY+Cis8L2Rpdj4KKzwvZGl2PgorPC9kaXY+Cis8Zm9vdGVyIGNsYXNzPSJzdGlja3kiPgorPHA+Rm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gU1RNMzJXQnh4LCB2aXNpdDogWzxhIGhyZWY9Imh0dHA6Ly93d3cuc3QuY29tL3N0bTMyd2IiPnd3dy5zdC5jb20vc3RtMzJ3YjwvYT5dPC9wPgorPGVtPlRoaXMgcmVsZWFzZSBub3RlIHVzZXMgdXAgdG8gZGF0ZSB3ZWIgc3RhbmRhcmRzIGFuZCwgZm9yIHRoaXMgcmVhc29uLCBzaG91bGQgbm90IGJlIG9wZW5lZCB3aXRoIEludGVybmV0IEV4cGxvcmVyIGJ1dCBwcmVmZXJhYmx5IHdpdGggcG9wdWxhciBicm93c2VycyBzdWNoIGFzIEdvb2dsZSBDaHJvbWUsIE1vemlsbGEgRmlyZWZveCwgT3BlcmEgb3IgTWljcm9zb2Z0IEVkZ2UuPC9lbT4KKzwvZm9vdGVyPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWwuYyBiL1NyYy9zdG0zMndieHhfaGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3YTk1OQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsLmMKQEAgLTAsMCArMSw4MTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgaXMgdGhlIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwgaW5pdGlhbGl6YXRpb24KKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgY29tbW9uIEhBTCBkcml2ZXIgY29udGFpbnMgYSBzZXQgb2YgZ2VuZXJpYyBhbmQgY29tbW9uIEFQSXMgdGhhdCBjYW4gYmUKKyAgICB1c2VkIGJ5IHRoZSBQUFAgcGVyaXBoZXJhbCBkcml2ZXJzIGFuZCB0aGUgdXNlciB0byBzdGFydCB1c2luZyB0aGUgSEFMLgorICAgIFsuLl0KKyAgICBUaGUgSEFMIGNvbnRhaW5zIHR3byBBUElzJyBjYXRlZ29yaWVzOgorICAgICAgICAgKCspIENvbW1vbiBIQUwgQVBJcworICAgICAgICAgKCspIFNlcnZpY2VzIEhBTCBBUElzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTAorICAqIEBicmllZiBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1ByaXZhdGVfQ29uc3RhbnRzIEhBTCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKioKKyAqIEBicmllZiBTVE0zMldCeHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlcgorICAgKi8KKyNkZWZpbmUgX19TVE0zMldCeHhfSEFMX1ZFUlNJT05fTUFJTiAgICgweDAxVSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLworI2RlZmluZSBfX1NUTTMyV0J4eF9IQUxfVkVSU0lPTl9TVUIxICAgKDB4MDFVKSAvKiE8IFsyMzoxNl0gc3ViMSB2ZXJzaW9uICovCisjZGVmaW5lIF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OX1NVQjIgICAoMHgwMFUpIC8qITwgWzE1OjhdICBzdWIyIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMldCeHhfSEFMX1ZFUlNJT05fUkMgICAgICgweDAwVSkgLyohPCBbNzowXSAgcmVsZWFzZSBjYW5kaWRhdGUgKi8KKyNkZWZpbmUgX19TVE0zMldCeHhfSEFMX1ZFUlNJT04gICAgICAgICAoKF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OX01BSU4gPDwgMjRVKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OX1NVQjEgPDwgMTZVKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OX1NVQjIgPDwgOFUgKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OX1JDKSkKKworI2RlZmluZSBWUkVGQlVGX1RJTUVPVVRfVkFMVUUgICAgIDEwVSAgIC8qIDEwIG1zICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSEFMX0V4cG9ydGVkX1ZhcmlhYmxlcyBIQUwgRXhwb3J0ZWQgVmFyaWFibGVzCisgICogQHsKKyAgKi8KK19fSU8gdWludDMyX3QgdXdUaWNrOwordWludDMyX3QgdXdUaWNrUHJpbyA9ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUyk7IC8qIEludmFsaWQgUFJJTyAqLwordWludDMyX3QgdXdUaWNrRnJlcSA9IEhBTF9USUNLX0ZSRVFfREVGQVVMVDsgIC8qIDFLSHogKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBIQUwgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBIQUwgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgRmxhc2ggaW50ZXJmYWNlIHRoZSBOVklDIGFsbG9jYXRpb24gYW5kIGluaXRpYWwgdGltZSBiYXNlCisgICAgICAgICAgY2xvY2sgY29uZmlndXJhdGlvbi4KKyAgICAgICgrKSBEZS1pbml0aWFsaXplIGNvbW1vbiBwYXJ0IG9mIHRoZSBIQUwuCisgICAgICAoKykgQ29uZmlndXJlIHRoZSB0aW1lIGJhc2Ugc291cmNlIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkCisgICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICgrKykgU3lzVGljayB0aW1lciBpcyB1c2VkIGJ5IGRlZmF1bHQgYXMgc291cmNlIG9mIHRpbWUgYmFzZSwgYnV0IHVzZXIKKyAgICAgICAgICAgICBjYW4gZXZlbnR1YWxseSBpbXBsZW1lbnQgaGlzIHByb3BlciB0aW1lIGJhc2Ugc291cmNlIChhIGdlbmVyYWwgcHVycG9zZQorICAgICAgICAgICAgIHRpbWVyIGZvciBleGFtcGxlIG9yIG90aGVyIHRpbWUgc291cmNlKSwga2VlcGluZyBpbiBtaW5kIHRoYXQgVGltZSBiYXNlCisgICAgICAgICAgICAgZHVyYXRpb24gc2hvdWxkIGJlIGtlcHQgMW1zIHNpbmNlIFBQUF9USU1FT1VUX1ZBTFVFcyBhcmUgZGVmaW5lZCBhbmQKKyAgICAgICAgICAgICBoYW5kbGVkIGluIG1pbGxpc2Vjb25kcyBiYXNpcy4KKyAgICAgICAgKCsrKSBUaW1lIGJhc2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoSEFMX0luaXRUaWNrICgpKSBpcyBjYWxsZWQgYXV0b21hdGljYWxseQorICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gYWZ0ZXIgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZQorICAgICAgICAgICAgIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgorICAgICAgICAoKyspIFNvdXJjZSBvZiB0aW1lIGJhc2UgaXMgY29uZmlndXJlZCAgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyCisgICAgICAgICAgICAgdGltZSBpbnRlcnZhbHMuIENhcmUgbXVzdCBiZSB0YWtlbiBpZiBIQUxfRGVsYXkoKSBpcyBjYWxsZWQgZnJvbSBhCisgICAgICAgICAgICAgcGVyaXBoZXJhbCBJU1IgcHJvY2VzcywgdGhlIFRpY2sgaW50ZXJydXB0IGxpbmUgbXVzdCBoYXZlIGhpZ2hlciBwcmlvcml0eQorICAgICAgICAgICAgKG51bWVyaWNhbGx5IGxvd2VyKSB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICAgICAgICAgIElTUiBwcm9jZXNzIHdpbGwgYmUgYmxvY2tlZC4KKyAgICAgICAoKyspIGZ1bmN0aW9ucyBhZmZlY3RpbmcgdGltZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBkZWNsYXJlZCBhcyBfX3dlYWsKKyAgICAgICAgICAgICB0byBtYWtlICBvdmVycmlkZSBwb3NzaWJsZSAgaW4gY2FzZSBvZiBvdGhlciAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIEhBTCBMaWJyYXJ5OyBpdCBtdXN0IGJlIHRoZSBmaXJzdAorICAqICAgICAgICAgaW5zdHJ1Y3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG1haW4gcHJvZ3JhbSAoYmVmb3JlIHRvIGNhbGwgYW55IG90aGVyCisgICogICAgICAgICBIQUwgZnVuY3Rpb24pLCBpdCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nOgorICAqICAgICAgICAgICBDb25maWd1cmUgdGhlIEZsYXNoIHByZWZldGNoLCBpbnN0cnVjdGlvbiBhbmQgRGF0YSBjYWNoZXMuCisgICogICAgICAgICAgIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgdG8gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGVhY2ggMSBtaWxsaXNlY29uZCwKKyAgKiAgICAgICAgICAgd2hpY2ggaXMgY2xvY2tlZCBieSB0aGUgTVNJIChhdCB0aGlzIHN0YWdlLCB0aGUgY2xvY2sgaXMgbm90IHlldAorICAqICAgICAgICAgICBjb25maWd1cmVkIGFuZCB0aHVzIHRoZSBzeXN0ZW0gaXMgcnVubmluZyBmcm9tIHRoZSBpbnRlcm5hbCBNU0kgYXQgNCBNSHopLgorICAqICAgICAgICAgICBTZXQgTlZJQyBHcm91cCBQcmlvcml0eSB0byA0LgorICAqICAgICAgICAgICBDYWxscyB0aGUgSEFMX01zcEluaXQoKSBjYWxsYmFjayBmdW5jdGlvbiBkZWZpbmVkIGluIHVzZXIgZmlsZQorICAqICAgICAgICAgICAic3RtMzJ3Ynh4X2hhbF9tc3AuYyIgdG8gZG8gdGhlIGdsb2JhbCBsb3cgbGV2ZWwgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24KKyAgKgorICAqIEBub3RlICAgU3lzVGljayBpcyB1c2VkIGFzIHRpbWUgYmFzZSBmb3IgdGhlIEhBTF9EZWxheSgpIGZ1bmN0aW9uLCB0aGUgYXBwbGljYXRpb24KKyAgKiAgICAgICAgIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIFN5c1RpY2sgdGltZSBiYXNlIGlzIGFsd2F5cyBzZXQgdG8gMSBtaWxsaXNlY29uZAorICAqICAgICAgICAgdG8gaGF2ZSBjb3JyZWN0IEhBTCBvcGVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdCh2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOworICAvKiBDb25maWd1cmUgRmxhc2ggcHJlZmV0Y2gsIEluc3RydWN0aW9uIGNhY2hlLCBEYXRhIGNhY2hlICovCisgIC8qIERlZmF1bHQgY29uZmlndXJhdGlvbiBhdCByZXNldCBpczogICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBQcmVmZXRjaCBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEluc3RydWN0aW9uIGNhY2hlIGVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gRGF0YSBjYWNoZSBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiAoSU5TVFJVQ1RJT05fQ0FDSEVfRU5BQkxFID09IDBVKQorICAgX19IQUxfRkxBU0hfSU5TVFJVQ1RJT05fQ0FDSEVfRElTQUJMRSgpOworI2VuZGlmIC8qIElOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSAqLworCisjaWYgKERBVEFfQ0FDSEVfRU5BQkxFID09IDBVKQorICAgX19IQUxfRkxBU0hfREFUQV9DQUNIRV9ESVNBQkxFKCk7CisjZW5kaWYgLyogREFUQV9DQUNIRV9FTkFCTEUgKi8KKworI2lmIChQUkVGRVRDSF9FTkFCTEUgIT0gMFUpCisgIF9fSEFMX0ZMQVNIX1BSRUZFVENIX0JVRkZFUl9FTkFCTEUoKTsKKyNlbmRpZiAvKiBQUkVGRVRDSF9FTkFCTEUgKi8KKworICAvKiBTZXQgSW50ZXJydXB0IEdyb3VwIFByaW9yaXR5ICovCisgIEhBTF9OVklDX1NldFByaW9yaXR5R3JvdXBpbmcoTlZJQ19QUklPUklUWUdST1VQXzQpOworICAKKyAgLyogVXNlIFN5c1RpY2sgYXMgdGltZSBiYXNlIHNvdXJjZSBhbmQgY29uZmlndXJlIDFtcyB0aWNrIChkZWZhdWx0IGNsb2NrIGFmdGVyIFJlc2V0IGlzIE1TSSkgKi8KKyAgaWYgKEhBTF9Jbml0VGljayhUSUNLX0lOVF9QUklPUklUWSkgIT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9Nc3BJbml0KCk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBkZS1Jbml0aWFsaXplcyBjb21tb24gcGFydCBvZiB0aGUgSEFMIGFuZCBzdG9wcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgb3B0aW9uYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRGVJbml0KHZvaWQpCit7CisgIC8qIFJlc2V0IG9mIGFsbCBwZXJpcGhlcmFscyAqLworICBfX0hBTF9SQ0NfQVBCMV9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQVBCMV9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FQQjJfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX0FQQjJfUkVMRUFTRV9SRVNFVCgpOworCisgIF9fSEFMX1JDQ19BUEIzX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BUEIzX1JFTEVBU0VfUkVTRVQoKTsKKyAgCisgIF9fSEFMX1JDQ19BSEIxX0ZPUkNFX1JFU0VUKCk7CisgIF9fSEFMX1JDQ19BSEIxX1JFTEVBU0VfUkVTRVQoKTsKKworICBfX0hBTF9SQ0NfQUhCMl9GT1JDRV9SRVNFVCgpOworICBfX0hBTF9SQ0NfQUhCMl9SRUxFQVNFX1JFU0VUKCk7CisKKyAgX19IQUxfUkNDX0FIQjNfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX0FIQjNfUkVMRUFTRV9SRVNFVCgpOworCisgIC8qIERlLUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfTXNwRGVJbml0KCk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9Nc3BJbml0KHZvaWQpCit7ICAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIE1TUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCkKK3sgICAgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzb3VyY2Ugb2YgdGhlIHRpbWUgYmFzZToKKyAgKiAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkCisgICogICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgorICAqICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyByZWNvbmZpZ3VyZWQgIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4KKyAgKiAgICAgICBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4KKyAgKiAgICAgICBDYXJlIG11c3QgYmUgdGFrZW4gaWYgSEFMX0RlbGF5KCkgaXMgY2FsbGVkIGZyb20gYSBwZXJpcGhlcmFsIElTUiBwcm9jZXNzLAorICAqICAgICAgIFRoZSBTeXNUaWNrIGludGVycnVwdCBtdXN0IGhhdmUgaGlnaGVyIHByaW9yaXR5IChudW1lcmljYWxseSBsb3dlcikKKyAgKiAgICAgICB0aGFuIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdC4gT3RoZXJ3aXNlIHRoZSBjYWxsZXIgSVNSIHByb2Nlc3Mgd2lsbCBiZSBibG9ja2VkLgorICAqICAgICAgIFRoZSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgIHRvIGJlIG92ZXJ3cml0dGVuICBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgaW1wbGVtZW50YXRpb24gIGluIHVzZXIgZmlsZS4KKyAgKiBAcGFyYW0gVGlja1ByaW9yaXR5IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmICBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHV3VGlja0ZyZXEgIT0gMFUpCisgIHsKKyAgICAvKkNvbmZpZ3VyZSB0aGUgU3lzVGljayB0byBoYXZlIGludGVycnVwdCBpbiAxbXMgdGltZSBiYXNpcyovCisgICAgaWYgKEhBTF9TWVNUSUNLX0NvbmZpZyhIQUxfUkNDX0dldEhDTEtGcmVxKCkvICgxMDAwVSAvdXdUaWNrRnJlcSkpID09IDBVKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgKi8KKyAgICAgIGlmIChUaWNrUHJpb3JpdHkgPCAoMVVMIDw8IF9fTlZJQ19QUklPX0JJVFMpKQorICAgICAgeworICAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgICB1d1RpY2tQcmlvID0gVGlja1ByaW9yaXR5OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgICAgSEFMIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFByb3ZpZGUgYSB0aWNrIHZhbHVlIGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgUHJvdmlkZSBhIGJsb2NraW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kCisgICAgICAoKykgU3VzcGVuZCB0aGUgdGltZSBiYXNlIHNvdXJjZSBpbnRlcnJ1cHQKKyAgICAgICgrKSBSZXN1bWUgdGhlIHRpbWUgYmFzZSBzb3VyY2UgaW50ZXJydXB0CisgICAgICAoKykgR2V0IHRoZSBIQUwgQVBJIGRyaXZlciB2ZXJzaW9uCisgICAgICAoKykgR2V0IHRoZSBkZXZpY2UgcmV2aXNpb24gaWRlbnRpZmllcgorICAgICAgKCspIEdldCB0aGUgZGV2aWNlIGlkZW50aWZpZXIKKyAgICAgICgrKSBHZXQgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllcgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5jcmVtZW50ICBhIGdsb2JhbCB2YXJpYWJsZSAidXdUaWNrIgorICAqICAgICAgICB1c2VkIGFzIGFwcGxpY2F0aW9uIHRpbWUgYmFzZS4KKyAgKiBAbm90ZSBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB2YXJpYWJsZSBpcyBpbmNyZW1lbnRlZCBlYWNoIDFtcworICAqICAgICAgIGluIFN5c1RpY2sgSVNSLgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JbmNUaWNrKHZvaWQpCit7CisgIHV3VGljayArPSAodWludDMyX3QpdXdUaWNrRnJlcTsKK30KKworLyoqCisgICogQGJyaWVmIFByb3ZpZGVzIGEgdGljayB2YWx1ZSBpbiBtaWxsaXNlY29uZC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKyAgKiBAcmV0dmFsIHRpY2sgdmFsdWUKKyAgKi8KK19fd2VhayB1aW50MzJfdCBIQUxfR2V0VGljayh2b2lkKQoreworICByZXR1cm4gdXdUaWNrOworfQorCisvKioKKyAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdGljayBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIHRpY2sgcHJpb3JpdHkKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRUaWNrUHJpbyh2b2lkKQoreworICByZXR1cm4gdXdUaWNrUHJpbzsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBuZXcgdGljayBGcmVxLgorICAqIEByZXR2YWwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU2V0VGlja0ZyZXEodWludDMyX3QgRnJlcSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzICA9IEhBTF9PSzsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJQ0tGUkVRKEZyZXEpKTsKKworICBpZiAodXdUaWNrRnJlcSAhPSBGcmVxKQorICB7CisgICAgdXdUaWNrRnJlcSA9IEZyZXE7CisKKyAgICAvKiBBcHBseSB0aGUgbmV3IHRpY2sgRnJlcSAgKi8KKyAgICBzdGF0dXMgPSBIQUxfSW5pdFRpY2sodXdUaWNrUHJpbyk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRpY2sgZnJlcXVlbmN5LgorICAqIEByZXR2YWwgdGljayBwZXJpb2QgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRUaWNrRnJlcSh2b2lkKQoreworICByZXR1cm4gdXdUaWNrRnJlcTsKK30KKworLyoqCisgICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgbWluaW11bSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiYXNlZCAKKyAgKiAgICAgICAgb24gdmFyaWFibGUgaW5jcmVtZW50ZWQuIAorICAqIEBub3RlIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4KKyAgKiAgICAgICBJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscyB3aGVyZSB1d1RpY2sKKyAgKiAgICAgICBpcyBpbmNyZW1lbnRlZC4KKyAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIF9fd2VhayB0byBiZSBvdmVyd3JpdHRlbiBpbiBjYXNlIG9mIG90aGVyCisgICogICAgICAgaW1wbGVtZW50YXRpb25zIGluIHVzZXIgZmlsZS4KKyAgKiBAcGFyYW0gRGVsYXkgIHNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBsZW5ndGgsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyAgX193ZWFrIHZvaWQgSEFMX0RlbGF5KHVpbnQzMl90IERlbGF5KQorICB7CisgICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB1aW50MzJfdCB3YWl0ID0gRGVsYXk7CisgIAorICAgIC8qIEFkZCBhIGZyZXEgdG8gZ3VhcmFudGVlIG1pbmltdW0gd2FpdCAqLworICAgIGlmICh3YWl0IDwgSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICB3YWl0ICs9ICh1aW50MzJfdCkodXdUaWNrRnJlcSk7CisgICAgfQorICAKKyAgICB3aGlsZSAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpIDwgd2FpdCkKKyAgICB7CisgICAgfQorICB9CisKKworLyoqCisgICogQGJyaWVmIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgSW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLCBTeXNUaWNrIHRpbWVyIGlzIHRoZSBzb3VyY2Ugb2YgdGltZSBiYXNlLiBJdCBpcworICAqICAgICAgIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBhdCByZWd1bGFyIHRpbWUgaW50ZXJ2YWxzLiBPbmNlIEhBTF9TdXNwZW5kVGljaygpCisgICogICAgICAgaXMgY2FsbGVkLCB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc28gVGljayBpbmNyZW1lbnQKKyAgKiAgICAgICBpcyBzdXNwZW5kZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKK3sKKyAgLyogRGlzYWJsZSBTeXNUaWNrIEludGVycnVwdCAqLworICBDTEVBUl9CSVQoU3lzVGljay0+Q1RSTCxTeXNUaWNrX0NUUkxfVElDS0lOVF9Nc2spOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlIEluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICwgU3lzVGljayB0aW1lciBpcyB0aGUgc291cmNlIG9mIHRpbWUgYmFzZS4gSXQgaXMKKyAgKiAgICAgICB1c2VkIHRvIGdlbmVyYXRlIGludGVycnVwdHMgYXQgcmVndWxhciB0aW1lIGludGVydmFscy4gT25jZSBIQUxfUmVzdW1lVGljaygpCisgICogICAgICAgaXMgY2FsbGVkLCB0aGUgU3lzVGljayBpbnRlcnJ1cHQgd2lsbCBiZSBlbmFibGVkIGFuZCBzbyBUaWNrIGluY3JlbWVudAorICAqICAgICAgIGlzIHJlc3VtZWQuCisgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBfX3dlYWsgdG8gYmUgb3ZlcndyaXR0ZW4gaW4gY2FzZSBvZiBvdGhlcgorICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBpbiB1c2VyIGZpbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQoreworICAvKiBFbmFibGUgU3lzVGljayBJbnRlcnJ1cHQgKi8KKyAgU0VUX0JJVChTeXNUaWNrLT5DVFJMLFN5c1RpY2tfQ1RSTF9USUNLSU5UX01zayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJucyB0aGUgSEFMIHJldmlzaW9uCisgICogQHJldHZhbCB2ZXJzaW9uIDogMHhYWVpSICg4Yml0cyBmb3IgZWFjaCBkZWNpbWFsLCBSIGZvciBSQykKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRIYWxWZXJzaW9uKHZvaWQpCit7CisgcmV0dXJuIF9fU1RNMzJXQnh4X0hBTF9WRVJTSU9OOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSByZXZpc2lvbiBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIHJldmlzaW9uIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRSRVZJRCh2b2lkKQoreworICAgcmV0dXJuKExMX0RCR01DVV9HZXRSZXZpc2lvbklEKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGRldmljZSBpZGVudGlmaWVyLgorICAqIEByZXR2YWwgRGV2aWNlIGlkZW50aWZpZXIKKyAgKi8KK3VpbnQzMl90IEhBTF9HZXRERVZJRCh2b2lkKQoreworICAgcmV0dXJuKExMX0RCR01DVV9HZXREZXZpY2VJRCgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcwKHZvaWQpCit7CisgIHJldHVybihSRUFEX1JFRygqKCh1aW50MzJfdCAqKVVJRF9CQVNFKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgc2Vjb25kIHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcxKHZvaWQpCit7CisgIHJldHVybihSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRSArIDRVKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIHRoaXJkIHdvcmQgb2YgdGhlIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllciAoVUlEIGJhc2VkIG9uIDk2IGJpdHMpCisgICogQHJldHZhbCBEZXZpY2UgaWRlbnRpZmllcgorICAqLwordWludDMyX3QgSEFMX0dldFVJRHcyKHZvaWQpCit7CisgIHJldHVybihSRUFEX1JFRygqKCh1aW50MzJfdCAqKShVSURfQkFTRSArIDhVKSkpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEhBTF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiAgQGJyaWVmICAgIEhBTCBEZWJ1ZyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSEFMIERlYnVnIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIERlYnVnIG1vZHVsZSBkdXJpbmcgU1RPUCBtb2RlCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgRGVidWcgbW9kdWxlIGR1cmluZyBTVEFOREJZIG1vZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU0xFRVAgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1NsZWVwTW9kZSh2b2lkKQoreworICBMTF9EQkdNQ1VfRW5hYmxlREJHU2xlZXBNb2RlKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTTEVFUCBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZSh2b2lkKQoreworICBMTF9EQkdNQ1VfRGlzYWJsZURCR1NsZWVwTW9kZSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRGVidWcgTW9kdWxlIGR1cmluZyBTVE9QIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0RCR01DVV9FbmFibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBMTF9EQkdNQ1VfRW5hYmxlREJHU3RvcE1vZGUoKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUT1AgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0Rpc2FibGVEQkdTdG9wTW9kZSh2b2lkKQoreworICBMTF9EQkdNQ1VfRGlzYWJsZURCR1N0b3BNb2RlKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBEZWJ1ZyBNb2R1bGUgZHVyaW5nIFNUQU5EQlkgbW9kZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfREJHTUNVX0VuYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIExMX0RCR01DVV9FbmFibGVEQkdTdGFuZGJ5TW9kZSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERlYnVnIE1vZHVsZSBkdXJpbmcgU1RBTkRCWSBtb2RlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9EQkdNQ1VfRGlzYWJsZURCR1N0YW5kYnlNb2RlKHZvaWQpCit7CisgIExMX0RCR01DVV9EaXNhYmxlREJHU3RhbmRieU1vZGUoKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIQUxfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBIQUwgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEhBTCBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIEhBTCBzeXN0ZW0gY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhIGhhcmR3YXJlIFNSQU0yIGVyYXNlIG9wZXJhdGlvbgorICAgICAgKCspIERpc2FibGUgQ1BVMiBTUkFNIGZldGNoIChleGVjdXRpb24pCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBWb2x0YWdlIHJlZmVyZW5jZSBidWZmZXIKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgVm9sdGFnZSByZWZlcmVuY2UgYnVmZmVyCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHZvbHRhZ2UgYm9vc3RlcgorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBhY2Nlc3MgZm9yIHNlY3VyaXR5IElQIChBRVMxLCBBRVMyLCBQS0EsIFJORykKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCBhIGhhcmR3YXJlIFNSQU0yIGVyYXNlIG9wZXJhdGlvbi4KKyAgKiBAbm90ZSAgIEFzIGxvbmcgYXMgU1JBTTIgaXMgbm90IGVyYXNlZCB0aGUgU1JBTTJFUiBiaXQgd2lsbCBiZSBzZXQuCisgICogICAgICAgICBUaGlzIGJpdCBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IGF0IHRoZSBlbmQgb2YgdGhlIFNSQU0yIGVyYXNlIG9wZXJhdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19TUkFNMkVyYXNlKHZvaWQpCit7CisgIC8qIHVubG9jayB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgU1JBTTJFUiBiaXQgKi8KKyAgX19IQUxfU1lTQ0ZHX1NSQU0yX1dSUF9VTkxPQ0soKTsKKyAgLyogU3RhcnRzIGEgaGFyZHdhcmUgU1JBTTIgZXJhc2Ugb3BlcmF0aW9uKi8KKyAgX19IQUxfU1lTQ0ZHX1NSQU0yX0VSQVNFKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDUFUyIFNSQU0gZmV0Y2ggKGV4ZWN1dGlvbikgKFRoaXMgYml0IGNhbiBiZSBzZXQgYnkgRmlybXdhcmUKKyAgKiAgICAgICAgIGFuZCB3aWxsIG9ubHkgYmUgcmVzZXQgYnkgYSBIYXJkd2FyZSByZXNldCwgaW5jbHVkaW5nIGEgcmVzZXQgYWZ0ZXIgU3RhbmRieS4pCisgICogQG5vdGUgRmlybXdhcmUgd3JpdGluZyAwIGhhcyBubyBlZmZlY3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVNSQU1GZXRjaCh2b2lkKQoreworICBMTF9TWVNDRkdfRGlzYWJsZVNSQU1GZXRjaCgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIENQVTIgU1JBTSBmZXRjaCBpcyBlbmFibGVkCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCit1aW50MzJfdCBIQUxfU1lTQ0ZHX0lzRW5hYmxlZFNSQU1GZXRjaCh2b2lkKQoreworICByZXR1cm4gKExMX1NZU0NGR19Jc0VuYWJsZWRTUkFNRmV0Y2goKSk7Cit9CisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciB2b2x0YWdlIHNjYWxlLgorICAqIEBwYXJhbSBWb2x0YWdlU2NhbGluZyAgc3BlY2lmaWVzIHRoZSBvdXRwdXQgdm9sdGFnZSB0byBhY2hpZXZlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBTWVNDRkdfVlJFRkJVRl9WT0xUQUdFX1NDQUxFMCA6IFZSRUZfT1VUMSBhcm91bmQgMi4wNDggVi4gCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlcXVpcmVzIFZEREEgZXF1YWwgdG8gb3IgaGlnaGVyIHRoYW4gMi40IFYuCisgICogICAgICAgICAgICBAYXJnIEByZWYgU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRTEgOiBWUkVGX09VVDEgYXJvdW5kIDIuNSBWLiAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcmVxdWlyZXMgVkREQSBlcXVhbCB0byBvciBoaWdoZXIgdGhhbiAyLjggVi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX1ZvbHRhZ2VTY2FsaW5nQ29uZmlnKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1ZSRUZCVUZfVk9MVEFHRV9TQ0FMRShWb2x0YWdlU2NhbGluZykpOworICAKKyAgTExfVlJFRkJVRl9TZXRWb2x0YWdlU2NhbGluZyhWb2x0YWdlU2NhbGluZyk7Cit9CisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIGludGVybmFsIHZvbHRhZ2UgcmVmZXJlbmNlIGJ1ZmZlciBoaWdoIGltcGVkYW5jZSBtb2RlLgorICAqIEBwYXJhbSBNb2RlICBzcGVjaWZpZXMgdGhlIGhpZ2ggaW1wZWRhbmNlIG1vZGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0RJU0FCTEUgOiBWUkVGKyBwaW4gaXMgaW50ZXJuYWxseSBjb25uZWN0IHRvIFZSRUZJTlQgb3V0cHV0LgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNZU0NGR19WUkVGQlVGX0hJR0hfSU1QRURBTkNFX0VOQUJMRSA6IFZSRUYrIHBpbiBpcyBoaWdoIGltcGVkYW5jZS4KKyAgKiBAcmV0dmFsIEhBTF9PSy9IQUxfVElNRU9VVAorICAqLwordm9pZCBIQUxfU1lTQ0ZHX1ZSRUZCVUZfSGlnaEltcGVkYW5jZUNvbmZpZyh1aW50MzJfdCBNb2RlKQoreworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9ISUdIX0lNUEVEQU5DRShNb2RlKSk7CisKKyAgTU9ESUZZX1JFRyhWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX0hJWiwgTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiBUdW5lIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLgorICAqIEBwYXJhbSBUcmltbWluZ1ZhbHVlIHNwZWNpZmllcyB0cmltbWluZyBjb2RlIGZvciBWUkVGQlVGIGNhbGlicmF0aW9uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4M0YKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19WUkVGQlVGX1RyaW1taW5nQ29uZmlnKHVpbnQzMl90IFRyaW1taW5nVmFsdWUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TWVNDRkdfVlJFRkJVRl9UUklNTUlORyhUcmltbWluZ1ZhbHVlKSk7CisgIAorICBMTF9WUkVGQlVGX1NldFRyaW1taW5nKFRyaW1taW5nVmFsdWUpOworCit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJbnRlcm5hbCBWb2x0YWdlIFJlZmVyZW5jZSBidWZmZXIgKFZSRUZCVUYpLgorICAqIEByZXR2YWwgSEFMX09LL0hBTF9USU1FT1VUCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1lTQ0ZHX0VuYWJsZVZSRUZCVUYodm9pZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICAKKyAgTExfVlJFRkJVRl9FbmFibGUoKTsKKyAgCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IGZvciBWUlIgYml0ICAqLworICB3aGlsZShSRUFEX0JJVChWUkVGQlVGLT5DU1IsIFZSRUZCVUZfQ1NSX1ZSUikgPT0gMFUpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBWUkVGQlVGX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgSW50ZXJuYWwgVm9sdGFnZSBSZWZlcmVuY2UgYnVmZmVyIChWUkVGQlVGKS4KKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVWUkVGQlVGKHZvaWQpCit7CisgIExMX1ZSRUZCVUZfRGlzYWJsZSgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgSS9PIGFuYWxvZyBzd2l0Y2ggdm9sdGFnZSBib29zdGVyCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVJT0Jvb3N0ZXIodm9pZCkKK3sKKyAgTExfU1lTQ0ZHX0VuYWJsZUFuYWxvZ0Jvb3N0ZXIoKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIKKyAgKgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTQ0ZHX0Rpc2FibGVJT0Jvb3N0ZXIodm9pZCkKK3sKKyAgTExfU1lTQ0ZHX0Rpc2FibGVBbmFsb2dCb29zdGVyKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBJL08gYW5hbG9nIHN3aXRjaCBzdXBwbGllZCBieSBWREQKKyAgKiBAbm90ZSAgIFRvIGJlIHVzZWQgd2hlbiBJL08gYW5hbG9nIHN3aXRjaCB2b2x0YWdlIGJvb3N0ZXIgaXMgbm90IGVuYWJsZWQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVJT1ZkZCh2b2lkKQoreworICBMTF9TWVNDRkdfRW5hYmxlQW5hbG9nR3Bpb1N3aXRjaCgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEkvTyBhbmFsb2cgc3dpdGNoIHN1cHBsaWVkIGJ5IFZERAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZUlPVmRkKHZvaWQpCit7CisgIExMX1NZU0NGR19EaXNhYmxlQW5hbG9nR3Bpb1N3aXRjaCgpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYWNjZXNzIGZvciBzZWN1cml0eSBJUAorICAqIEBub3RlICAgV2hlbiB0aGUgc3lzdGVtIGlzIHNlY3VyZSAoRVNFID0gMSksIHRoaXMgcmVnaXN0ZXIgcHJvdmlkZXMgd3JpdGUgYWNjZXNzIHNlY3VyaXR5IGFuZCBjYW4KKyAgKiAgICAgICAgIG9ubHkgYmUgd3JpdHRlbiBieSB0aGUgQ1BVMi4gQSB3cml0ZSBhY2Nlc3MgZnJvbSB0aGUgQ1BVMSB3aWxsIGJlIGlnbm9yZWQgYW5kIGEgYnVzIGVycm9yCisgICogICAgICAgICBpcyBnZW5lcmF0ZWQuCisgICogQHBhcmFtICBTZWN1cml0eUFjY2VzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMyCisgICogICAgICAgICBAYXJnIEByZWYgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NZU0NGR19FbmFibGVTZWN1cml0eUFjY2Vzcyh1aW50MzJfdCBTZWN1cml0eUFjY2VzcykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NZU0NGR19TRUNVUklUWV9BQ0NFU1MoU2VjdXJpdHlBY2Nlc3MpKTsKKworICBMTF9TWVNDRkdfRW5hYmxlU2VjdXJpdHlBY2Nlc3MoU2VjdXJpdHlBY2Nlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIGFjY2VzcyBmb3Igc2VjdXJpdHkgSVAKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIHN5c3RlbSBpcyBzZWN1cmUgKEVTRSA9IDEpLCB0aGlzIHJlZ2lzdGVyIHByb3ZpZGVzIHdyaXRlIGFjY2VzcyBzZWN1cml0eSBhbmQgY2FuCisgICogICAgICAgICBvbmx5IGJlIHdyaXR0ZW4gYnkgdGhlIENQVTIuIEEgd3JpdGUgYWNjZXNzIGZyb20gdGhlIENQVTEgd2lsbCBiZSBpZ25vcmVkIGFuZCBhIGJ1cyBlcnJvcgorICAqICAgICAgICAgaXMgZ2VuZXJhdGVkLgorICAqIEBwYXJhbSAgU2VjdXJpdHlBY2Nlc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX0FFUzEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMgorICAqICAgICAgICAgQGFyZyBAcmVmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19QS0EKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfUk5HCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TWVNDRkdfRGlzYWJsZVNlY3VyaXR5QWNjZXNzKHVpbnQzMl90IFNlY3VyaXR5QWNjZXNzKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTQ0ZHX1NFQ1VSSVRZX0FDQ0VTUyhTZWN1cml0eUFjY2VzcykpOworCisgIExMX1NZU0NGR19EaXNhYmxlU2VjdXJpdHlBY2Nlc3MoU2VjdXJpdHlBY2Nlc3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIGlmIGFjY2VzcyBmb3Igc2VjdXJpdHkgSVAgaXMgZW5hYmxlZAorICAqIEBwYXJhbSAgU2VjdXJpdHlBY2Nlc3MgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1lTQ0ZHX1NFQ1VSRV9BQ0NFU1NfQUVTMQorICAqICAgICAgICAgQGFyZyBAcmVmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19BRVMyCisgICogICAgICAgICBAYXJnIEByZWYgSEFMX1NZU0NGR19TRUNVUkVfQUNDRVNTX1BLQQorICAqICAgICAgICAgQGFyZyBAcmVmIEhBTF9TWVNDRkdfU0VDVVJFX0FDQ0VTU19STkcKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK3VpbnQzMl90IEhBTF9TWVNDRkdfSXNFbmFibGVkU2VjdXJpdHlBY2Nlc3ModWludDMyX3QgU2VjdXJpdHlBY2Nlc3MpCit7CisgIHJldHVybiAoTExfU1lTQ0ZHX0lzRW5hYmxlZFNlY3VyaXR5QWNjZXNzKFNlY3VyaXR5QWNjZXNzKSk7Cit9CisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfYWRjLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9hZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDZmMWNmCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfYWRjLmMKQEAgLTAsMCArMSwzMjQ3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9hZGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRvciAoQURDKQorICAqICAgICAgICAgIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICAgICsrIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIG9mIEFEQworICAqICAgICAgICAgICArIE9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBTdGFydCwgc3RvcCwgZ2V0IHJlc3VsdCBvZiBjb252ZXJzaW9ucyBvZiByZWd1bGFyCisgICogICAgICAgICAgICAgICAgZ3JvdXAsIHVzaW5nIDMgcG9zc2libGUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbiBvciBETUEuCisgICogICAgICAgICAgICsgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBDaGFubmVscyBjb25maWd1cmF0aW9uIG9uIHJlZ3VsYXIgZ3JvdXAKKyAgKiAgICAgICAgICAgICArKyBBbmFsb2cgV2F0Y2hkb2cgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFN0YXRlIGZ1bmN0aW9ucworICAqICAgICAgICAgICAgICsrIEFEQyBzdGF0ZSBtYWNoaW5lIG1hbmFnZW1lbnQKKyAgKiAgICAgICAgICAgICArKyBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50CisgICogICAgICAgICAgT3RoZXIgZnVuY3Rpb25zIChleHRlbmRlZCBmdW5jdGlvbnMpIGFyZSBhdmFpbGFibGUgaW4gZmlsZSAKKyAgKiAgICAgICAgICAic3RtMzJ3Ynh4X2hhbF9hZGNfZXguYyIuCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQURDIHBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgKCspIDEyLWJpdCwgMTAtYml0LCA4LWJpdCBvciA2LWJpdCBjb25maWd1cmFibGUgcmVzb2x1dGlvbi4KKworICAoKykgSW50ZXJydXB0IGdlbmVyYXRpb24gYXQgdGhlIGVuZCBvZiByZWd1bGFyIGNvbnZlcnNpb24gYW5kIGluIGNhc2Ugb2YgCisgICAgICBhbmFsb2cgd2F0Y2hkb2cgb3Igb3ZlcnJ1biBldmVudHMuCisgIAorICAoKykgU2luZ2xlIGFuZCBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZXMuCisgIAorICAoKykgU2NhbiBtb2RlIGZvciBjb252ZXJzaW9uIG9mIHNldmVyYWwgY2hhbm5lbHMgc2VxdWVudGlhbGx5LgorICAKKyAgKCspIERhdGEgYWxpZ25tZW50IHdpdGggaW4tYnVpbHQgZGF0YSBjb2hlcmVuY3kuCisgIAorICAoKykgUHJvZ3JhbW1hYmxlIHNhbXBsaW5nIHRpbWUgKGNoYW5uZWwgd2lzZSkKKyAgCisgICgrKSBFeHRlcm5hbCB0cmlnZ2VyICh0aW1lciBvciBFWFRJKSB3aXRoIGNvbmZpZ3VyYWJsZSBwb2xhcml0eQorICAKKyAgKCspIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIHRyYW5zZmVyIG9mIGNvbnZlcnNpb25zIGRhdGEgb2YgcmVndWxhciBncm91cC4KKyAgCisgICgrKSBBREMgY2hhbm5lbHMgc2VsZWN0YWJsZSBzaW5nbGUvZGlmZmVyZW50aWFsIGlucHV0LgorICAKKyAgKCspIEFEQyBvZmZzZXQgc2hhcmVkIG9uIDQgb2Zmc2V0IGluc3RhbmNlcy4KKyAgKCspIEFEQyBjYWxpYnJhdGlvbgorICAKKyAgKCspIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAuCisgIAorICAoKykgQURDIHN1cHBseSByZXF1aXJlbWVudHM6IDEuNjIgViB0byAzLjYgVi4KKyAgCisgICgrKSBBREMgaW5wdXQgcmFuZ2U6IGZyb20gVnJlZi0gKGNvbm5lY3RlZCB0byBWc3NhKSB0byBWcmVmKyAoY29ubmVjdGVkIHRvIAorICAgICAgVmRkYSBvciB0byBhbiBleHRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSkuCisKKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgKioqIENvbmZpZ3VyYXRpb24gb2YgdG9wIGxldmVsIHBhcmFtZXRlcnMgcmVsYXRlZCB0byBBREMgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgRW5hYmxlIHRoZSBBREMgaW50ZXJmYWNlCisgICAgICAgICgrKykgQXMgcHJlcmVxdWlzaXRlLCBBREMgY2xvY2sgbXVzdCBiZSBjb25maWd1cmVkIGF0IFJDQyB0b3AgbGV2ZWwuCisKKyAgICAgICAgKCsrKSBUd28gY2xvY2sgc2V0dGluZ3MgYXJlIG1hbmRhdG9yeTogCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb3JlIGNsb2NrLCBhbHNvIHBvc3NpYmx5IGNvbnZlcnNpb24gY2xvY2spLgorCisgICAgICAgICAgICAgKCsrKykgQURDIGNsb2NrIChjb252ZXJzaW9ucyBjbG9jaykuCisgICAgICAgICAgICAgICAgICAgVHdvIHBvc3NpYmxlIGNsb2NrIHNvdXJjZXM6IHN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIyIGNsb2NrCisgICAgICAgICAgICAgICAgICAgb3IgYXN5bmNocm9ub3VzIGNsb2NrIGRlcml2ZWQgZnJvbSBzeXN0ZW0gY2xvY2ssIFBMTFNBSTEgKG91dHB1dCBkaXZpZGVyIFIpIG9yIHRoZSBQTEwgc3lzdGVtIChvdXRwdXQgZGl2aWRlciBQKSAKKyAgICAgICAgICAgICAgICAgICBydW5uaW5nIHVwIHRvIDY0TUh6LgorCisgICAgICAgICAgICAgKCsrKykgRXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwSW5pdCgpIChyZWNvbW1lbmRlZCBjb2RlIGxvY2F0aW9uKSBvciB3aXRoCisgICAgICAgICAgICAgICAgICAgb3RoZXIgZGV2aWNlIGNsb2NrIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAgICgrKyspIF9fSEFMX1JDQ19BRENfQ0xLX0VOQUJMRSgpOyAgICAgICAgICAgICAgICAgIChtYW5kYXRvcnkpCisKKyAgICAgICAgICAgICAgIFJDQ19BRENDTEtTT1VSQ0VfUExMIGVuYWJsZTogICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25hbDogaWYgYXN5bmNocm9ub3VzIGNsb2NrIHNlbGVjdGVkKQorICAgICAgICAgICAgICAgKCsrKykgUkNDX1BlcmlwaENsa0luaXRUeXBlRGVmICAgUkNDX1BlcmlwaENsa0luaXQ7CisgICAgICAgICAgICAgICAoKysrKSBQZXJpcGhDbGtJbml0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19BREM7CisgICAgICAgICAgICAgICAoKysrKSBQZXJpcGhDbGtJbml0LkFkY0Nsb2NrU2VsZWN0aW9uICAgID0gUkNDX0FEQ0NMS1NPVVJDRV9QTEw7CisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0KTsKKworICAgICAgICAoKyspIEFEQyBjbG9jayBzb3VyY2UgYW5kIGNsb2NrIHByZXNjYWxlciBhcmUgY29uZmlndXJlZCBhdCBBREMgbGV2ZWwgd2l0aAorICAgICAgICAgICAgIHBhcmFtZXRlciAiQ2xvY2tQcmVzY2FsZXIiIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfSW5pdCgpLgorCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIEFEQyBHUElPcworICAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpCisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGVzZSBBREMgcGlucyBpbiBhbmFsb2cgbW9kZQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfR1BJT19Jbml0KCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgTlZJQyBmb3IgQURDCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShBREN4X0lSUW4pCisgICAgICAgICAoKyspIEluc2VydCB0aGUgQURDIGludGVycnVwdGlvbiBoYW5kbGVyIGZ1bmN0aW9uIEhBTF9BRENfSVJRSGFuZGxlcigpIAorICAgICAgICAgICAgICBpbnRvIHRoZSBmdW5jdGlvbiBvZiBjb3JyZXNwb25kaW5nIEFEQyBpbnRlcnJ1cHRpb24gdmVjdG9yIAorICAgICAgICAgICAgICBBREN4X0lSUUhhbmRsZXIoKS4KKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIERNQToKKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBETUEgKERNQSBjaGFubmVsLCBtb2RlIG5vcm1hbCBvciBjaXJjdWxhciwgLi4uKQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgQ29uZmlndXJlIHRoZSBOVklDIGZvciBETUEKKyAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfRW5hYmxlSVJRKERNQXhfQ2hhbm5lbHhfSVJRbikKKyAgICAgICAgICgrKykgSW5zZXJ0IHRoZSBBREMgaW50ZXJydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gSEFMX0FEQ19JUlFIYW5kbGVyKCkgCisgICAgICAgICAgICAgIGludG8gdGhlIGZ1bmN0aW9uIG9mIGNvcnJlc3BvbmRpbmcgRE1BIGludGVycnVwdGlvbiB2ZWN0b3IgCisgICAgICAgICAgICAgIERNQXhfQ2hhbm5lbHhfSVJRSGFuZGxlcigpLgorCisgICAgICoqKiBDb25maWd1cmF0aW9uIG9mIEFEQywgZ3JvdXAgcmVndWxhciwgY2hhbm5lbHMgcGFyYW1ldGVycyAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBBREMgcGFyYW1ldGVycyAocmVzb2x1dGlvbiwgZGF0YSBhbGlnbm1lbnQsIC4uLikKKyAgICAgICAgYW5kIHJlZ3VsYXIgZ3JvdXAgcGFyYW1ldGVycyAoY29udmVyc2lvbiB0cmlnZ2VyLCBzZXF1ZW5jZXIsIC4uLikKKyAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19Jbml0KCkuCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBjaGFubmVscyBmb3IgcmVndWxhciBncm91cCBwYXJhbWV0ZXJzIChjaGFubmVsIG51bWJlciwgCisgICAgICAgIGNoYW5uZWwgcmFuayBpbnRvIHNlcXVlbmNlciwgLi4uLCBpbnRvIHJlZ3VsYXIgZ3JvdXApCisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfQ29uZmlnQ2hhbm5lbCgpLgorCisgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSB0aGUgYW5hbG9nIHdhdGNoZG9nIHBhcmFtZXRlcnMgKGNoYW5uZWxzCisgICAgICAgIG1vbml0b3JlZCwgdGhyZXNob2xkcywgLi4uKQorICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZygpLgorCisgICAgICoqKiBFeGVjdXRpb24gb2YgQURDIGNvbnZlcnNpb25zICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorCisgICAgKCMpIE9wdGlvbmFsbHksIHBlcmZvcm0gYW4gYXV0b21hdGljIEFEQyBjYWxpYnJhdGlvbiB0byBpbXByb3ZlIHRoZQorICAgICAgICBjb252ZXJzaW9uIGFjY3VyYWN5CisgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpLgorCisgICAgKCMpIEFEQyBkcml2ZXIgY2FuIGJlIHVzZWQgYW1vbmcgdGhyZWUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbiwKKyAgICAgICAgdHJhbnNmZXIgYnkgRE1BLgorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgcG9sbGluZzoKKyAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydCgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1BvbGxGb3JDb252ZXJzaW9uKCkKKyAgICAgICAgICAoKysrKSBSZXRyaWV2ZSBjb252ZXJzaW9uIHJlc3VsdHMgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3AoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gYnkgaW50ZXJydXB0aW9uOiAKKyAgICAgICAgICAoKysrKSBBY3RpdmF0ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHN0YXJ0IGNvbnZlcnNpb25zCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19TdGFydF9JVCgpCisgICAgICAgICAgKCsrKykgV2FpdCBmb3IgQURDIGNvbnZlcnNpb24gY29tcGxldGlvbiBieSBjYWxsIG9mIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhpcyBmdW5jdGlvbiBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbSkKKyAgICAgICAgICAoKysrKSBSZXRyaWV2ZSBjb252ZXJzaW9uIHJlc3VsdHMgCisgICAgICAgICAgICAgICAgdXNpbmcgZnVuY3Rpb24gSEFMX0FEQ19HZXRWYWx1ZSgpCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfSVQoKQorCisgICAgICAgICgrKykgQURDIGNvbnZlcnNpb24gd2l0aCB0cmFuc2ZlciBieSBETUE6CisgICAgICAgICAgKCsrKykgQWN0aXZhdGUgdGhlIEFEQyBwZXJpcGhlcmFsIGFuZCBzdGFydCBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfU3RhcnRfRE1BKCkKKyAgICAgICAgICAoKysrKSBXYWl0IGZvciBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIGJ5IGNhbGwgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSBvciBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgICAgICAgICAodGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtKQorICAgICAgICAgICgrKyspIENvbnZlcnNpb24gcmVzdWx0cyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2ZlcnJlZCBieSBETUEgaW50bworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGFkZHJlc3MuCisgICAgICAgICAgKCsrKykgU3RvcCBjb252ZXJzaW9uIGFuZCBkaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAKKyAgICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfQURDX1N0b3BfRE1BKCkKKworICAgICBbLi5dCisKKyAgICAoQCkgQ2FsbGJhY2sgZnVuY3Rpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdXNlciBwcm9ncmFtOgorICAgICAgKCtAKSBIQUxfQURDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCtAKSBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjaygpIChjYWxsYmFjayBvZiBhbmFsb2cgd2F0Y2hkb2cpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpCisgICAgICAoK0ApIEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2sKKworICAgICAqKiogRGVpbml0aWFsaXphdGlvbiBvZiBBREMgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisKKyAgICAoIykgRGlzYWJsZSB0aGUgQURDIGludGVyZmFjZQorICAgICAgKCsrKSBBREMgY2xvY2sgY2FuIGJlIGhhcmQgcmVzZXQgYW5kIGRpc2FibGVkIGF0IFJDQyB0b3AgbGV2ZWwuCisgICAgICAgICgrKykgSGFyZCByZXNldCBvZiBBREMgcGVyaXBoZXJhbHMKKyAgICAgICAgICAgICB1c2luZyBtYWNybyBfX0FEQ3hfRk9SQ0VfUkVTRVQoKSwgX19BREN4X1JFTEVBU0VfUkVTRVQoKS4KKyAgICAgICAgKCsrKSBBREMgY2xvY2sgZGlzYWJsZQorICAgICAgICAgICAgIHVzaW5nIHRoZSBlcXVpdmFsZW50IG1hY3JvL2Z1bmN0aW9ucyBhcyBjb25maWd1cmF0aW9uIHN0ZXAuCisgICAgICAgICAgICAgKCsrKykgRXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICBJbnRvIEhBTF9BRENfTXNwRGVJbml0KCkgKHJlY29tbWVuZGVkIGNvZGUgbG9jYXRpb24pIG9yIHdpdGgKKyAgICAgICAgICAgICAgICAgICBvdGhlciBkZXZpY2UgY2xvY2sgcGFyYW1ldGVycyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAgKCsrKykgUkNDX09zY0luaXRTdHJ1Y3R1cmUuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJMTQ7CisgICAgICAgICAgICAgICAoKysrKSBSQ0NfT3NjSW5pdFN0cnVjdHVyZS5IU0kxNFN0YXRlID0gUkNDX0hTSTE0X09GRjsgKGlmIG5vdCB1c2VkIGZvciBzeXN0ZW0gY2xvY2spCisgICAgICAgICAgICAgICAoKysrKSBIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3R1cmUpOworCisgICAgKCMpIEFEQyBwaW5zIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MKKyAgICAgICAgICAgICAgdXNpbmcgbWFjcm8gX19IQUxfUkNDX0dQSU94X0NMS19ESVNBQkxFKCkKKworICAgICgjKSBPcHRpb25hbGx5LCBpbiBjYXNlIG9mIHVzYWdlIG9mIEFEQyB3aXRoIGludGVycnVwdGlvbnM6CisgICAgICAgICAoKyspIERpc2FibGUgdGhlIE5WSUMgZm9yIEFEQworICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoQURDeF9JUlFuKQorCisgICAgKCMpIE9wdGlvbmFsbHksIGluIGNhc2Ugb2YgdXNhZ2Ugb2YgRE1BOgorICAgICAgICAgKCsrKSBEZWluaXRpYWxpemUgdGhlIERNQQorICAgICAgICAgICAgICB1c2luZyBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKS4KKyAgICAgICAgICgrKykgRGlzYWJsZSB0aGUgTlZJQyBmb3IgRE1BCisgICAgICAgICAgICAgIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUShETUF4X0NoYW5uZWx4X0lSUW4pCisKKyAgICBbLi5dCisgICAgCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTLCB3aGVuIHNldCB0byAxLAorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9BRENfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sKKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgIDogQURDIGVycm9yIGNhbGxiYWNrCisgICAgICAgKCspIEluamVjdGVkQ29udkNwbHRDYWxsYmFjayAgICAgICA6IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgKCspIEluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrICA6IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrCisgICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sKKyAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaworICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgOiBBREMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogQURDIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIEByZWYgSEFMX0FEQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgICAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICgrKSBDb252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgOiBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sKKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgIDogQURDIGVycm9yIGNhbGxiYWNrCisgICAgICAgKCspIEluamVjdGVkQ29udkNwbHRDYWxsYmFjayAgICAgICA6IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgKCspIEluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrICA6IEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrCisgICAgICAgKCspIExldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgICAgICA6IEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjaworICAgICAgICgrKSBMZXZlbE91dE9mV2luZG93M0NhbGxiYWNrICAgICAgOiBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sKKyAgICAgICAoKykgRW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgIDogQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjaworICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgOiBBREMgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogQURDIE1zcCBEZUluaXQgY2FsbGJhY2sKKyAgICAgWy4uXQorCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBAcmVmIEhBTF9BRENfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlcyBAcmVmIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9BRENfRXJyb3JDYWxsYmFjaygpLgorICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9BRENfSW5pdCgpLyBAcmVmIEhBTF9BRENfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgWy4uXQorCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0FEQ19Jbml0KCkvIEByZWYgSEFMX0FEQ19EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICAgWy4uXQorCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfQURDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICBpbiBAcmVmIEhBTF9BRENfU1RBVEVfUkVBRFkgb3IgQHJlZiBIQUxfQURDX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgIFsuLl0KKworICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX0FEQ19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQURDX0RlSW5pdCgpCisgICAgIG9yIEByZWYgSEFMX0FEQ19Jbml0KCkgZnVuY3Rpb24uCisgICAgIFsuLl0KKworICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKyAgCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDIEFEQworICAqIEBicmllZiBBREMgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9Db25zdGFudHMgQURDIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworI2RlZmluZSBBRENfQ0ZHUl9GSUVMRFNfMSAgKChBRENfQ0ZHUl9SRVMgICAgfCBBRENfQ0ZHUl9BTElHTiAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0NPTlQgICB8IEFEQ19DRkdSX09WUk1PRCAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRElTQ0VOIHwgQURDX0NGR1JfRElTQ05VTSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRFTiAgfCBBRENfQ0ZHUl9FWFRTRUwpKSAgIC8qITwgQURDX0NGR1IgZmllbGRzIG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbm8gcmVndWxhciBjb252ZXJzaW9uIGlzIG9uLWdvaW5nICovCisgIAorLyogVGltZW91dCB2YWx1ZXMgZm9yIEFEQyBvcGVyYXRpb25zIChlbmFibGUgc2V0dGxpbmcgdGltZSwgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgZGlzYWJsZSBzZXR0bGluZyB0aW1lLCAuLi4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFZhbHVlcyBkZWZpbmVkIHRvIGJlIGhpZ2hlciB0aGFuIHdvcnN0IGNhc2VzOiBsb3cgY2xvY2sgZnJlcXVlbmN5LCAgICAgICAqLworLyogICBtYXhpbXVtIHByZXNjYWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURDX0VOQUJMRV9USU1FT1VUICAgICAgICAgICAgICAoMlVMKSAgICAvKiE8IEFEQyBlbmFibGUgdGltZS1vdXQgdmFsdWUgICovCisjZGVmaW5lIEFEQ19ESVNBQkxFX1RJTUVPVVQgICAgICAgICAgICAgKDJVTCkgICAgLyohPCBBREMgZGlzYWJsZSB0aW1lLW91dCB2YWx1ZSAqLworICAKKy8qIFRpbWVvdXQgdG8gd2FpdCBmb3IgY3VycmVudCBjb252ZXJzaW9uIG9uIGdvaW5nIHRvIGJlIGNvbXBsZXRlZC4gICAgICAgICAgICovCisvKiBUaW1lb3V0IGZpeGVkIHRvIGxvbmdlc3QgQURDIGNvbnZlcnNpb24gcG9zc2libGUsIGZvciAxIGNoYW5uZWw6ICAgICAgICAgICAqLworLyogICAtIG1heGltdW0gc2FtcGxpbmcgdGltZSAoNjQwLjUgYWRjX2NsaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBBREMgcmVzb2x1dGlvbiAoVHNhciAxMiBiaXRzPSAxMi41IGFkY19jbGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0gU3lzdGVtIGNsb2NrIC8gQURDIGNsb2NrIDw9IDQwOTYgKGh5cG90aGVzaXMgb2YgbWF4aW11bSBjbG9jayByYXRpbykgICAqLworLyogICAtIEFEQyBvdmVyc2FtcGxpbmcgcmF0aW8gMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ2FsY3VsYXRpb246IDY1MyAqIDQwOTYgKiAyNTYgQ1BVIGNsb2NrIGN5Y2xlcyBtYXggICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiBjeWNsZXMgb2YgQ1BVIGNsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ09OVkVSU0lPTl9USU1FX01BWF9DUFVfQ1lDTEVTICg2NTNVTCAqIDQwOTZVTCAqIDI1NlVMKSAgLyohPCBBREMgY29udmVyc2lvbiBjb21wbGV0aW9uIHRpbWUtb3V0IHZhbHVlICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENfRXhwb3J0ZWRfRnVuY3Rpb25zIEFEQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgQURDIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBBREMuIAorICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIEFEQy4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgYW5kIHJlZ3VsYXIgZ3JvdXAgYWNjb3JkaW5nIHRvICAKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHN0cnVjdHVyZSAiQURDX0luaXRUeXBlRGVmIi4KKyAgKiBAbm90ZSAgIEFzIHByZXJlcXVpc2l0ZSwgQURDIGNsb2NrIG11c3QgYmUgY29uZmlndXJlZCBhdCBSQ0MgdG9wIGxldmVsCisgICogICAgICAgICAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgUkNDIGNvbmZpZ3VyYXRpb24gZm9yIEFEQworICAqICAgICAgICAgaW4gaGVhZGVyIG9mIHRoaXMgZmlsZSkuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQURDIE1TUCAoSEFMX0FEQ19Nc3BJbml0KCkpIG9ubHkgd2hlbgorICAqICAgICAgICAgY29taW5nIGZyb20gQURDIHN0YXRlIHJlc2V0LiBGb2xsb3dpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4KKyAgKiAgICAgICAgIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgc29tZSBwYXJhbWV0ZXJzIG9mIEFEQ19Jbml0VHlwZURlZiAgCisgICogICAgICAgICBzdHJ1Y3R1cmUgb24gdGhlIGZseSwgd2l0aG91dCBtb2RpZnlpbmcgTVNQIGNvbmZpZ3VyYXRpb24uIElmIEFEQyAgCisgICogICAgICAgICBNU1AgaGFzIHRvIGJlIG1vZGlmaWVkIGFnYWluLCBIQUxfQURDX0RlSW5pdCgpIG11c3QgYmUgY2FsbGVkCisgICogICAgICAgICBiZWZvcmUgSEFMX0FEQ19Jbml0KCkuCisgICogICAgICAgICBUaGUgc2V0dGluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZS4KKyAgKiAgICAgICAgIEZvciBwYXJhbWV0ZXJzIGNvbnN0cmFpbnRzLCBzZWUgY29tbWVudHMgb2Ygc3RydWN0dXJlIAorICAqICAgICAgICAgIkFEQ19Jbml0VHlwZURlZiIuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIEFEQyB3aXRoaW4gMiBzY29wZXM6IHNjb3BlIG9mIGVudGlyZSAKKyAgKiAgICAgICAgIEFEQyBhbmQgc2NvcGUgb2YgcmVndWxhciBncm91cC4gRm9yIHBhcmFtZXRlcnMgZGV0YWlscywgc2VlIGNvbW1lbnRzIAorICAqICAgICAgICAgb2Ygc3RydWN0dXJlICJBRENfSW5pdFR5cGVEZWYiLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcENGR1I7CisgIHVpbnQzMl90IHRtcF9hZGNfcmVnX2lzX2NvbnZlcnNpb25fb25fZ29pbmc7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhcjsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOworICAKKyAgLyogQ2hlY2sgQURDIGhhbmRsZSAqLworICBpZihoYWRjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NMT0NLUFJFU0NBTEVSKGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRVNPTFVUSU9OKGhhZGMtPkluaXQuUmVzb2x1dGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0RBVEFfQUxJR04oaGFkYy0+SW5pdC5EYXRhQWxpZ24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQ0FOX01PREUoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FWFRUUklHX0VER0UoaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252RWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUcoaGFkYywgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252KSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRE1BQ29udGludW91c1JlcXVlc3RzKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRU9DX1NFTEVDVElPTihoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09WRVJSVU4oaGFkYy0+SW5pdC5PdmVycnVuKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUpKTsKKyAgCisgIGlmKGhhZGMtPkluaXQuU2NhbkNvbnZNb2RlICE9IEFEQ19TQ0FOX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JFR1VMQVJfTkJfQ09OVihoYWRjLT5Jbml0Lk5ick9mQ29udmVyc2lvbikpOworICAgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlKSk7CisgICAgCisgICAgaWYoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9ESVNDT05UX05VTUJFUihoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIERJU0NFTiBhbmQgQ09OVCBiaXRzIGNhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSAqLworICBhc3NlcnRfcGFyYW0oISgoaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSAmJiAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKSkpOworICAKKyAgLyogQWN0aW9ucyBwZXJmb3JtZWQgb25seSBpZiBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQ6ICAgICAgICAgICAgICAgICovCisgIC8qIC0gSW5pdGlhbGl6YXRpb24gb2YgQURDIE1TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihoYWRjLT5TdGF0ZSA9PSBIQUxfQURDX1NUQVRFX1JFU0VUKQorICB7CisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIEFEQyBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgICAgICAgICAgICAgID0gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayAgICAgICAgICA9IEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrICAgICAgPSBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgID0gSEFMX0FEQ19FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgICAgICA9IEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgPSBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgICAgID0gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgY2FsbGJhY2sgKi8KKyAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrICAgICA9IEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrOyAgICAgIC8qIExlZ2FjeSB3ZWFrIGNhbGxiYWNrICovCisgICAgaGFkYy0+RW5kT2ZTYW1wbGluZ0NhbGxiYWNrICAgICAgICAgPSBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgIAorICAgIGlmIChoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorICAgIAorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0FEQ19Nc3BJbml0KGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgICAgQURDX0NMRUFSX0VSUk9SQ09ERShoYWRjKTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIExvY2sgKi8KKyAgICBoYWRjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworICB9CisgIAorICAvKiAtIEV4aXQgZnJvbSBkZWVwLXBvd2VyLWRvd24gbW9kZSBhbmQgQURDIHZvbHRhZ2UgcmVndWxhdG9yIGVuYWJsZSAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRGVlcFBvd2VyRG93bkVuYWJsZWQoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkKKyAgeworICAgIC8qIERpc2FibGUgQURDIGRlZXAgcG93ZXIgZG93biBtb2RlICovIAorICAgIExMX0FEQ19EaXNhYmxlRGVlcFBvd2VyRG93bihoYWRjLT5JbnN0YW5jZSk7CisgICAgCisgICAgLyogU3lzdGVtIHdhcyBpbiBkZWVwIHBvd2VyIGRvd24gbW9kZSwgY2FsaWJyYXRpb24gbXVzdAorICAgICBiZSByZWxhdW5jaGVkIG9yIGEgcHJldmlvdXNseSBzYXZlZCBjYWxpYnJhdGlvbiBmYWN0b3IgCisgICAgIHJlLWFwcGxpZWQgb25jZSB0aGUgQURDIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGVuYWJsZWQgKi8gICAgCisgIH0KKyAgCisgIGlmKExMX0FEQ19Jc0ludGVybmFsUmVndWxhdG9yRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogRW5hYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciAqLworICAgIExMX0FEQ19FbmFibGVJbnRlcm5hbFJlZ3VsYXRvcihoYWRjLT5JbnN0YW5jZSk7CisgICAgCisgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSAyIHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5ICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBleGNlZWQgMzIgYml0cyByZWdpc3RlciBjYXBhY2l0eSBhbmQgaGFuZGxlIGxvdyBmcmVxdWVuY3kuICovCisgICAgd2FpdF9sb29wX2luZGV4ID0gKChMTF9BRENfREVMQVlfSU5URVJOQUxfUkVHVUxfU1RBQl9VUyAvIDEwVUwpICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpKTsKKyAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKQorICAgIHsKKyAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgIH0KKyAgfQorICAKKyAgLyogVmVyaWZpY2F0aW9uIHRoYXQgQURDIHZvbHRhZ2UgcmVndWxhdG9yIGlzIGNvcnJlY3RseSBlbmFibGVkLCB3aGV0aGVyICAgICovCisgIC8qIG9yIG5vdCBBREMgaXMgY29taW5nIGZyb20gc3RhdGUgcmVzZXQgKGlmIGFueSBwb3RlbnRpYWwgcHJvYmxlbSBvZiAgICAgICAqLworICAvKiBjbG9ja2luZywgdm9sdGFnZSByZWd1bGF0b3Igd291bGQgbm90IGJlIGVuYWJsZWQpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzSW50ZXJuYWxSZWd1bGF0b3JFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAKKyAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIHBhcmFtZXRlcnMgaWYgcHJldmlvdXMgcHJlbGltaW5hcnkgYWN0aW9ucyBhcmUgICAgICAqLyAKKyAgLyogY29ycmVjdGx5IGNvbXBsZXRlZCBhbmQgaWYgdGhlcmUgaXMgbm8gY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyICAgICovCisgIC8qIGdyb3VwIChBREMgbWF5IGFscmVhZHkgYmUgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGlmIEhBTF9BRENfSW5pdCgpIGlzICAgICAqLworICAvKiBjYWxsZWQgdG8gdXBkYXRlIGEgcGFyYW1ldGVyIG9uIHRoZSBmbHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdG1wX2FkY19yZWdfaXNfY29udmVyc2lvbl9vbl9nb2luZyA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIAorICBpZiggICAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKQorICAgICAmJiAodG1wX2FkY19yZWdfaXNfY29udmVyc2lvbl9vbl9nb2luZyA9PSAwVUwpCisgICAgKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIGNvbW1vbiBBREMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBvbmx5IHdoZW4gQURDIGlzIGRpc2FibGVkOiAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjbG9jayBjb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgICB7CisgICAgICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgY29uZmlndXJhdGlvbiBvZiBBREMgY29tbW9uIHJlZ2lzdGVyIENDUjogICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAtIEFEQyBjbG9jayBtb2RlIGFuZCBBQ0MgcHJlc2NhbGVyIChDS01PREUgYW5kIFBSRVNDIGJpdHMpYXJlIHNldCAgKi8KKyAgICAgICAgLyogICAgIGFjY29yZGluZyB0byBhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIuIEl0IHNlbGVjdHMgdGhlIGNsb2NrICAgICAgKi8KKyAgICAgICAgLyogICAgc291cmNlIGFuZCBzZXRzIHRoZSBjbG9jayBkaXZpc2lvbiBmYWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogU29tZSBwYXJhbWV0ZXJzIG9mIHRoaXMgcmVnaXN0ZXIgYXJlIG5vdCByZXNldCwgc2luY2UgdGhleSBhcmUgc2V0ICAgKi8KKyAgICAgICAgLyogYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtdXN0IGJlIGtlcHQgaW4gY2FzZSBvZiB1c2FnZSBvZiB0aGlzICAgICAgICAgKi8KKyAgICAgICAgLyogZnVuY3Rpb24gb24gdGhlIGZseSAodXBkYXRlIG9mIGEgcGFyYW1ldGVyIG9mIEFEQ19Jbml0VHlwZURlZiAgICAgICAgKi8KKyAgICAgICAgLyogd2l0aG91dCBuZWVkaW5nIHRvIHJlY29uZmlndXJlIGFsbCBvdGhlciBBREMgZ3JvdXBzL2NoYW5uZWxzICAgICAgICAgKi8KKyAgICAgICAgLyogcGFyYW1ldGVycyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAtIHdoZW4gbXVsdGltb2RlIGZlYXR1cmUgaXMgYXZhaWxhYmxlLCBtdWx0aW1vZGUtcmVsYXRlZCAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgIHBhcmFtZXRlcnM6IE1ETUEsIERNQUNGRywgREVMQVksIERVQUwgKHNldCBieSBBUEkgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgIEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAtIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzOiBWYmF0LCB0ZW1wZXJhdHVyZSBzZW5zb3IsIFZyZWYgICAgICAgKi8KKyAgICAgICAgLyogICAgIChzZXQgaW50byBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgIEhBTF9BRENFeF9JbmplY3RlZENvbmZpZ0NoYW5uZWwoKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTExfQURDX1NldENvbW1vbkNsb2NrKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIGhhZGMtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LlJlc29sdXRpb24gICAgICAgICAgICAqLworICAgIC8qICAtIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdC5EYXRhQWxpZ24gICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBleHRlcm5hbCB0cmlnZ2VyIHRvIHN0YXJ0IGNvbnZlcnNpb24gICAgIEluaXQuRXh0ZXJuYWxUcmlnQ29udiAgICAgICovCisgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAgICAgICAgICAgICAgICBJbml0LkV4dGVybmFsVHJpZ0NvbnZFZGdlICAqLworICAgIC8qICAtIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICAgICAgICAgICAgICAgSW5pdC5Db250aW51b3VzQ29udk1vZGUgICAgKi8KKyAgICAvKiAgLSBvdmVycnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQuT3ZlcnJ1biAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZGlzY29udGludW91cyBtb2RlICAgICAgICAgICAgICAgICAgICAgICBJbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSAqLworICAgIC8qICAtIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICAgICAgICAgSW5pdC5OYnJPZkRpc2NDb252ZXJzaW9uICAgKi8KKyAgICB0bXBDRkdSICA9IChBRENfQ0ZHUl9DT05USU5VT1VTKCh1aW50MzJfdCloYWRjLT5Jbml0LkNvbnRpbnVvdXNDb252TW9kZSkgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0Lk92ZXJydW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LkRhdGFBbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICBoYWRjLT5Jbml0LlJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRUdfRElTQ09OVElOVU9VUygodWludDMyX3QpaGFkYy0+SW5pdC5EaXNjb250aW51b3VzQ29udk1vZGUpICApOworICAgIAorICAgIGlmIChoYWRjLT5Jbml0LkRpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpCisgICAgeworICAgICAgdG1wQ0ZHUiB8PSBBRENfQ0ZHUl9ESVNDT05USU5VT1VTX05VTShoYWRjLT5Jbml0Lk5ick9mRGlzY0NvbnZlcnNpb24pOworICAgIH0KKyAgICAKKyAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpZiB0cmlnZ2VyIHNlbGVjdGlvbiBpcyBkaWZmZXJlbnQgb2Ygc29mdHdhcmUgICovCisgICAgLyogc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IFRoaXMgY29uZmlndXJhdGlvbiBrZWVwcyB0aGUgaGFyZHdhcmUgZmVhdHVyZSBvZiBwYXJhbWV0ZXIgICAgICAgKi8KKyAgICAvKiAgICAgICBFeHRlcm5hbFRyaWdDb252RWRnZSAidHJpZ2dlciBlZGdlIG5vbmUiIGVxdWl2YWxlbnQgdG8gICAgICAgICAgICovCisgICAgLyogICAgICAgc29mdHdhcmUgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0LkV4dGVybmFsVHJpZ0NvbnYgIT0gQURDX1NPRlRXQVJFX1NUQVJUKQorICAgIHsKKyAgICAgIHRtcENGR1IgfD0gKCAgKGhhZGMtPkluaXQuRXh0ZXJuYWxUcmlnQ29udiAmIEFEQ19DRkdSX0VYVFNFTCkKKyAgICAgICAgICAgICAgICAgIHwgaGFkYy0+SW5pdC5FeHRlcm5hbFRyaWdDb252RWRnZQorICAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICAKKyAgICAvKiBVcGRhdGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBDRkdSICovCisgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRklFTERTXzEsIHRtcENGR1IpOyAKKyAgICAKKyAgICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAqLworICAgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gcmVndWxhciBhbmQgaW5qZWN0ZWQgZ3JvdXBzOiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBETUEgY29udGludW91cyByZXF1ZXN0ICAgICAgICAgIEluaXQuRE1BQ29udGludW91c1JlcXVlc3RzICAgICAgICAgICovCisgICAgLyogIC0gTG93UG93ZXJBdXRvV2FpdCBmZWF0dXJlICAgICAgICBJbml0Lkxvd1Bvd2VyQXV0b1dhaXQgICAgICAgICAgICAgICAqLworICAgIC8qICAtIE92ZXJzYW1wbGluZyBwYXJhbWV0ZXJzICAgICAgICAgSW5pdC5PdmVyc2FtcGxpbmcgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgICAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0gTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgICBpZiAoICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkKKyAgICAgICAgJiYgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpCisgICAgICAgKQorICAgIHsKKyAgICAgIHRtcENGR1IgPSAoIEFEQ19DRkdSX0RGU0RNKGhhZGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9BVVRPV0FJVCgodWludDMyX3QpaGFkYy0+SW5pdC5Mb3dQb3dlckF1dG9XYWl0KSAgICAgICAgfAorICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRE1BQ09OVFJFUSgodWludDMyX3QpaGFkYy0+SW5pdC5ETUFDb250aW51b3VzUmVxdWVzdHMpICApOworICAgICAgCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9GSUVMRFNfMiwgdG1wQ0ZHUik7CisgICAgICAKKyAgICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKQorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX09WRVJTQU1QTElOR19SQVRJTyhoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SYXRpbykpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX1JJR0hUX0JJVF9TSElGVChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0KSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19BRENfVFJJR0dFUkVEX09WRVJTQU1QTElOR19NT0RFKGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlRyaWdnZXJlZE1vZGUpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SRUdPVkVSU0FNUExJTkdfTU9ERShoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZy5PdmVyc2FtcGxpbmdTdG9wUmVzZXQpKTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgT3ZlcnNhbXBsZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgLSBPdmVyc2FtcGxpbmcgUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogIC0gUmlnaHQgYml0IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAtIFRyaWdnZXJlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgLSBPdmVyc2FtcGxpbmcgbW9kZSAoY29udGludWVkL3Jlc3VtZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsCisgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1IgIHwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTUyAgfAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9UUk9WUyB8CisgICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX1JPVlNNLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9ST1ZTRSAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlJhdGlvICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlJpZ2h0Qml0U2hpZnQgfAorICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLlRyaWdnZXJlZE1vZGUgfAorICAgICAgICAgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnNhbXBsaW5nLk92ZXJzYW1wbGluZ1N0b3BSZXNldAorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBREMgb3ZlcnNhbXBsaW5nIHNjb3BlIG9uIEFEQyBncm91cCByZWd1bGFyICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9ST1ZTRSk7CisgICAgICB9CisgICAgICAKKyAgICB9CisgICAgCisgICAgLyogQ29uZmlndXJhdGlvbiBvZiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkLCByZWd1bGFyIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gKi8KKyAgICAvKiAgIDB4MDA6IDEgY2hhbm5lbCBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gcmVndWxhciByYW5rIDEpICAgICAgICAgICAgICAgICovCisgICAgLyogICBQYXJhbWV0ZXIgIk5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgTm90ZTogU2NhbiBtb2RlIGlzIG5vdCBwcmVzZW50IGJ5IGhhcmR3YXJlIG9uIHRoaXMgZGV2aWNlLCBidXQgICAgICAgKi8KKyAgICAvKiAgIGVtdWxhdGVkIGJ5IHNvZnR3YXJlIGZvciBhbGlnbm1lbnQgb3ZlciBhbGwgU1RNMzIgZGV2aWNlcy4gICAgICAgICAgICovCisgICAgLyogLSBpZiBzY2FuIG1vZGUgaXMgZW5hYmxlZCwgcmVndWxhciBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvICAqLworICAgIC8qICAgcGFyYW1ldGVyICJOYnJPZkNvbnZlcnNpb24iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIGlmIChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IG51bWJlciBvZiByYW5rcyBpbiByZWd1bGFyIGdyb3VwIHNlcXVlbmNlciAqLworICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+U1FSMSwgQURDX1NRUjFfTCwgKGhhZGMtPkluaXQuTmJyT2ZDb252ZXJzaW9uIC0gKHVpbnQ4X3QpMSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVIxLCBBRENfU1FSMV9MKTsKKyAgICB9CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQURDIHN0YXRlICovCisgICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMIGJpdCwgc2V0IEhBTF9BRENfU1RBVEVfUkVBRFkgYml0ICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCwgSEFMX0FEQ19TVEFURV9SRUFEWSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgQURDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQKKyAgKiAgICAgICAgIHZhbHVlcywgd2l0aCBkZWluaXRpYWxpemF0aW9uIG9mIHRoZSBBREMgTVNQLgorICAqIEBub3RlICAgRm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQ3M6IHJlc2V0IG9mIEFEQyBjb21tb24gcmVnaXN0ZXJzIGlzIGRvbmUgCisgICogICAgICAgICBvbmx5IGlmIGFsbCBBRENzIHNoYXJpbmcgdGhlIHNhbWUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4KKyAgKiAgICAgICAgIChmdW5jdGlvbiAiSEFMX0FEQ19Nc3BEZUluaXQoKSIgaXMgYWxzbyBjYWxsZWQgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9uczoKKyAgKiAgICAgICAgIGFsbCBBREMgaW5zdGFuY2VzIHVzZSB0aGUgc2FtZSBjb3JlIGNsb2NrIGF0IFJDQyBsZXZlbCwgZGlzYWJsaW5nCisgICogICAgICAgICB0aGUgY29yZSBjbG9jayByZXNldCBhbGwgQURDIGluc3RhbmNlcykuCisgICogICAgICAgICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgcmVzZXQgb2YgdGhlc2UgY29tbW9uIHBhcmFtZXRlcnMgcmVzZXQgaXMgIAorICAqICAgICAgICAgYnlwYXNzZWQgd2l0aG91dCBlcnJvciByZXBvcnRpbmc6IGl0IGNhbiBiZSB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgaW4KKyAgKiAgICAgICAgIGNhc2Ugb2YgcmVzZXQgb2YgYSBzaW5nbGUgQURDIHdoaWxlIHRoZSBvdGhlciBBRENzIHNoYXJpbmcgdGhlIHNhbWUgCisgICogICAgICAgICBjb21tb24gZ3JvdXAgaXMgc3RpbGwgcnVubmluZy4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIEhBTF9BRENfRGVJbml0KCkgc2V0IEFEQyBpbiBtb2RlIGRlZXAgcG93ZXItZG93bjoKKyAgKiAgICAgICAgIHRoaXMgc2F2ZXMgbW9yZSBwb3dlciBieSByZWR1Y2luZyBsZWFrYWdlIGN1cnJlbnRzIAorICAqICAgICAgICAgYW5kIGlzIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBiZWZvcmUgZW50ZXJpbmcgTUNVIGxvdy1wb3dlciBtb2Rlcy4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0RlSW5pdChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayBBREMgaGFuZGxlICovCisgIGlmKGhhZGMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXQgQURDIHN0YXRlICovCisgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQlVTWV9JTlRFUk5BTCk7CisgIAorICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAqLworICAvKiBGbHVzaCByZWdpc3RlciBKU1FSOiByZXNldCB0aGUgcXVldWUgc2VxdWVuY2VyIHdoZW4gaW5qZWN0ZWQgICAgICAgICAgICAgKi8KKyAgLyogcXVldWUgc2VxdWVuY2VyIGlzIGVuYWJsZWQgYW5kIEFEQyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgdHJpZ2dlcnMgb2YgdGhlIGluamVjdGVkIHNlcXVlbmNlIGFyZSBib3RoICAgICAqLworICAvKiBpbnRlcm5hbGx5IGRpc2FibGVkIGp1c3QgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxhc3QgdmFsaWQgICAgICAgICAgKi8KKyAgLyogaW5qZWN0ZWQgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgCisgICAgLyogQ2hlY2sgaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlICovCisgICAgICBoYWRjLT5TdGF0ZSA9IEhBTF9BRENfU1RBVEVfUkVBRFk7CisgICAgfQorICB9CisgIAorICAvKiBOb3RlOiBIQUwgQURDIGRlSW5pdCBpcyBkb25lIGluZGVwZW5kZW50bHkgb2YgQURDIGNvbnZlcnNpb24gc3RvcCAgICAgICAgKi8KKyAgLyogICAgICAgYW5kIGRpc2FibGUgcmV0dXJuIHN0YXR1cy4gSW4gY2FzZSBvZiBzdGF0dXMgZmFpbCwgYXR0ZW1wdCB0byAgICAgICovCisgIC8qICAgICAgIHBlcmZvcm0gZGVpbml0aWFsaXphdGlvbiBhbnl3YXkgYW5kIGl0IGlzIHVwIHVzZXIgY29kZSBpbiAgICAgICAgICAqLworICAvKiAgICAgICBpbiBIQUxfQURDX01zcERlSW5pdCgpIHRvIHJlc2V0IHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyAgICAgICAgICAgKi8KKyAgLyogICAgICAgc3lzdGVtIFJDQyBoYXJkIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICAvKiA9PT09PT09PT09IFJlc2V0IEFEQyByZWdpc3RlcnMgPT09PT09PT09PSAqLworICAvKiBSZXNldCByZWdpc3RlciBJRVIgKi8KKyAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9BV0QzICB8IEFEQ19JVF9BV0QyIHwgQURDX0lUX0FXRDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0pRT1ZGIHwgQURDX0lUX09WUiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0pFT1MgIHwgQURDX0lUX0pFT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0VPUyAgIHwgQURDX0lUX0VPQyAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0lUX0VPU01QIHwgQURDX0lUX1JEWSAgICAgICAgICAgICAgICAgKSApOworICAgICAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIElTUiAqLworICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfQVdEMyAgfCBBRENfRkxBR19BV0QyIHwgQURDX0ZMQUdfQVdEMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19KUU9WRiB8IEFEQ19GTEFHX09WUiAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0ZMQUdfSkVPUyAgfCBBRENfRkxBR19KRU9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19GTEFHX0VPUyAgIHwgQURDX0ZMQUdfRU9DICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfRkxBR19FT1NNUCB8IEFEQ19GTEFHX1JEWSAgICAgICAgICAgICAgICAgICApICk7CisgIAorICAvKiBSZXNldCByZWdpc3RlciBDUiAqLworIC8qIEJpdHMgQURDX0NSX0pBRFNUUCwgQURDX0NSX0FEU1RQLCBBRENfQ1JfSkFEU1RBUlQsIEFEQ19DUl9BRFNUQVJULCAKKyAgICBBRENfQ1JfQURDQUwsIEFEQ19DUl9BRERJUyBhbmQgQURDX0NSX0FERU4gYXJlIGluIGFjY2VzcyBtb2RlICJyZWFkLXNldCI6IAorICAgIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlLiAKKyAgICBVcGRhdGUgQ1IgcmVnaXN0ZXIgdG8gcmVzZXQgdmFsdWUgd2hlcmUgZG9hYmxlIGJ5IHNvZnR3YXJlICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q1IsIEFEQ19DUl9BRFZSRUdFTiB8IEFEQ19DUl9BRENBTERJRik7CisgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNSLCBBRENfQ1JfREVFUFBXRCk7ICAgIAorICAgICAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9GSUVMRFMpOworICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUURJUyk7ICAKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9ST1ZTTSAgfCBBRENfQ0ZHUjJfVFJPVlMgICB8IEFEQ19DRkdSMl9PVlNTIHwgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfT1ZTUiAgfCBBRENfQ0ZHUjJfSk9WU0UgfCBBRENfQ0ZHUjJfUk9WU0UgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIxICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U01QUjEsIEFEQ19TTVBSMV9GSUVMRFMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgU01QUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TTVBSMiwgQURDX1NNUFIyX1NNUDE4IHwgQURDX1NNUFIyX1NNUDE3IHwgQURDX1NNUFIyX1NNUDE2IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TTVBSMl9TTVAxNSB8IEFEQ19TTVBSMl9TTVAxNCB8IEFEQ19TTVBSMl9TTVAxMyB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU01QUjJfU01QMTIgfCBBRENfU01QUjJfU01QMTEgfCBBRENfU01QUjJfU01QMTAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlRSMSwgQURDX1RSMV9IVDEgfCBBRENfVFIxX0xUMSk7CisgIAorICAvKiBSZXNldCByZWdpc3RlciBUUjIgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIpOyAgICAKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMyAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlRSMywgQURDX1RSM19IVDMgfCBBRENfVFIzX0xUMyk7ICAgICAgCisgIAorICAvKiBSZXNldCByZWdpc3RlciBTUVIxICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U1FSMSwgQURDX1NRUjFfU1E0IHwgQURDX1NRUjFfU1EzIHwgQURDX1NRUjFfU1EyIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjFfU1ExIHwgQURDX1NRUjFfTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+U1FSMiwgQURDX1NRUjJfU1E5IHwgQURDX1NRUjJfU1E4IHwgQURDX1NRUjJfU1E3IHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NRUjJfU1E2IHwgQURDX1NRUjJfU1E1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgU1FSMyAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPlNRUjMsIEFEQ19TUVIzX1NRMTQgfCBBRENfU1FSM19TUTEzIHwgQURDX1NRUjNfU1ExMiB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TUVIzX1NRMTEgfCBBRENfU1FSM19TUTEwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjQgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5TUVI0LCBBRENfU1FSNF9TUTE2IHwgQURDX1NRUjRfU1ExNSk7IAorICAKKyAgLyogUmVnaXN0ZXIgSlNRUiB3YXMgcmVzZXQgd2hlbiB0aGUgQURDIHdhcyBkaXNhYmxlZCAqLworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgLyogYml0cyBpbiBhY2Nlc3MgbW9kZSByZWFkIG9ubHksIG5vIGRpcmVjdCByZXNldCBhcHBsaWNhYmxlKi8KKyAgICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMSAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjEsIEFEQ19PRlIxX09GRlNFVDFfRU4gfCBBRENfT0ZSMV9PRkZTRVQxX0NIIHwgQURDX09GUjFfT0ZGU0VUMSk7IAorICAvKiBSZXNldCByZWdpc3RlciBPRlIyICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+T0ZSMiwgQURDX09GUjJfT0ZGU0VUMl9FTiB8IEFEQ19PRlIyX09GRlNFVDJfQ0ggfCBBRENfT0ZSMl9PRkZTRVQyKTsgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjMgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5PRlIzLCBBRENfT0ZSM19PRkZTRVQzX0VOIHwgQURDX09GUjNfT0ZGU0VUM19DSCB8IEFEQ19PRlIzX09GRlNFVDMpOyAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSNCAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPk9GUjQsIEFEQ19PRlI0X09GRlNFVDRfRU4gfCBBRENfT0ZSNF9PRkZTRVQ0X0NIIHwgQURDX09GUjRfT0ZGU0VUNCk7CisgIAorICAvKiBSZXNldCByZWdpc3RlcnMgSkRSMSwgSkRSMiwgSkRSMywgSkRSNCAqLworICAvKiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUqLworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgQVdEMkNSICovCisgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEMkNSLCBBRENfQVdEMkNSX0FXRDJDSCk7CisgIAorICAvKiBSZXNldCByZWdpc3RlciBBV0QzQ1IgKi8KKyAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5BV0QzQ1IsIEFEQ19BV0QzQ1JfQVdEM0NIKTsKKyAgCisgIC8qIFJlc2V0IHJlZ2lzdGVyIERJRlNFTCAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkRJRlNFTCwgQURDX0RJRlNFTF9ESUZTRUwpOworICAKKyAgLyogUmVzZXQgcmVnaXN0ZXIgQ0FMRkFDVCAqLworICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNBTEZBQ1QsIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7CisgIAorICAKKyAgLyogPT09PT09PT09PSBSZXNldCBjb21tb24gQURDIHJlZ2lzdGVycyA9PT09PT09PT09ICovCisgICAgICAgIAorICAvKiBTb2Z0d2FyZSBpcyBhbGxvd2VkIHRvIGNoYW5nZSBjb21tb24gcGFyYW1ldGVycyBvbmx5IHdoZW4gYWxsIHRoZSBvdGhlcgorICAgICBBRENzIGFyZSBkaXNhYmxlZC4gICAqLworICBpZiAoX19MTF9BRENfSVNfRU5BQkxFRF9BTExfQ09NTU9OX0lOU1RBTkNFKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpID09IDBVTCkKKyAgeworICAgIC8qIFJlc2V0IGNvbmZpZ3VyYXRpb24gb2YgQURDIGNvbW1vbiByZWdpc3RlciBDQ1I6CisgICAgICAtIGNsb2NrIG1vZGU6IENLTU9ERSwgUFJFU0NFTgorICAgICAgLSBtdWx0aW1vZGUgcmVsYXRlZCBwYXJhbWV0ZXJzICh3aGVuIHRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUpOiBNRE1BLCAKKyAgICAgICAgRE1BQ0ZHLCBERUxBWSwgRFVBTCAoc2V0IGJ5IEhBTF9BRENFeF9NdWx0aU1vZGVDb25maWdDaGFubmVsKCkgQVBJKQorICAgICAgLSBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoczogVmJhdCwgdGVtcGVyYXR1cmUgc2Vuc29yLCBWcmVmIChzZXQgaW50bworICAgICAgICBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBvciBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgKQorICAgICovCisgICAgQURDX0NMRUFSX0NPTU1PTl9DT05UUk9MX1JFR0lTVEVSKGhhZGMpOworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUuIAorICAKKyAgICAgRm9yIGV4YW1wbGU6CisgICAgX19IQUxfUkNDX0FEQ19GT1JDRV9SRVNFVCgpOworICAgIF9fSEFMX1JDQ19BRENfUkVMRUFTRV9SRVNFVCgpOworICAgIF9fSEFMX1JDQ19BRENfQ0xLX0RJU0FCTEUoKTsKKyAgICAKKyAgICBLZWVwIGluIG1pbmQgdGhhdCBhbGwgQURDcyB1c2UgdGhlIHNhbWUgY2xvY2s6IGRpc2FibGluZworICAgIHRoZSBjbG9jayB3aWxsIHJlc2V0IGFsbCBBRENzLiAKKyAgICAKKyAgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICB9CisgIAorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogUkNDIGNsb2NrLCBOVklDICovCisgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IFJDQyBjbG9jaywgTlZJQyAqLworICBIQUxfQURDX01zcERlSW5pdChoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgCisgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBub25lICovCisgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7CisgIAorICAvKiBSZXNldCBpbmplY3RlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gMDsKKyAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudCA9IDA7IAorICAgIAorICAvKiBTZXQgQURDIHN0YXRlICovCisgIGhhZGMtPlN0YXRlID0gSEFMX0FEQ19TVEFURV9SRVNFVDsKKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQURDIE1TUC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX01zcEluaXQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENfTXNwSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEFEQyBNU1AuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEBub3RlICAgQWxsIEFEQyBpbnN0YW5jZXMgdXNlIHRoZSBzYW1lIGNvcmUgY2xvY2sgYXQgUkNDIGxldmVsLCBkaXNhYmxpbmcKKyAgKiAgICAgICAgIHRoZSBjb3JlIGNsb2NrIHJlc2V0IGFsbCBBREMgaW5zdGFuY2VzKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfTXNwRGVJbml0KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX01zcERlSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLyAKK30KKworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIEFEQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhhZGMgUG9pbnRlciB0byBhIEFEQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQURDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICAgICAgQURDIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgICAgICAgICAgQURDIGNvbnZlcnNpb24gRE1BIGhhbGYtdHJhbnNmZXIgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzFfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZyAxIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfRVJST1JfQ0JfSUQgICAgICAgICAgICAgICAgICAgIEFEQyBlcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0lOSl9RVUVVRV9PVkVGTE9XX0NCX0lEICAgICAgICBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDIgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQgICAgQURDIGFuYWxvZyB3YXRjaGRvZyAzIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfRU5EX09GX1NBTVBMSU5HX0NCX0lEICAgICAgICAgIEFEQyBlbmQgb2Ygc2FtcGxpbmcgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgICAgQURDIE1zcCBJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICAgIEFEQyBNc3AgRGVJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1JlZ2lzdGVyQ2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYgKmhhZGMsIEhBTF9BRENfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEFEQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAKKyAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfUkVBRFkpICE9IDBVTCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfQ09OVkVSU0lPTl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18xX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19JTkpfQ09OVkVSU0lPTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhhZGMtPkluamVjdGVkQ29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19JTkpfUVVFVUVfT1ZFRkxPV19DQl9JRCA6CisgICAgICAgIGhhZGMtPkluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRCA6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18zX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgOgorICAgICAgICBoYWRjLT5FbmRPZlNhbXBsaW5nQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGFkYy0+RXJyb3JDb2RlIHw9IEhBTF9BRENfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9BRENfU1RBVEVfUkVTRVQgPT0gaGFkYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQURDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIAorICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBBREMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEFEQyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhhZGMgUG9pbnRlciB0byBhIEFEQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQURDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgICAgICBBREMgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0NPTlZFUlNJT05fSEFMRl9DQl9JRCAgICAgICAgICBBREMgY29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMV9DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDEgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICAgQURDIGVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfSU5KX0NPTlZFUlNJT05fQ09NUExFVEVfQ0JfSUQgIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfSU5KX1FVRVVFX09WRUZMT1dfQ0JfSUQgICAgICAgIEFEQyBncm91cCBpbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18yX0NCX0lEICAgIEFEQyBhbmFsb2cgd2F0Y2hkb2cgMiBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfM19DQl9JRCAgICBBREMgYW5hbG9nIHdhdGNoZG9nIDMgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19FTkRfT0ZfU0FNUExJTkdfQ0JfSUQgICAgICAgICAgQURDIGVuZCBvZiBzYW1wbGluZyBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQURDX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgICBBREMgTXNwIEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgICAgICAgICAgICAgICAgQURDIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0FEQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1VuUmVnaXN0ZXJDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiAqaGFkYywgSEFMX0FEQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIAorICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9SRUFEWSkgIT0gMFVMKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayA9IEhBTF9BRENfQ29udkNwbHRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19DT05WRVJTSU9OX0hBTEZfQ0JfSUQgOgorICAgICAgICBoYWRjLT5Db252SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9BRENfQ29udkhhbGZDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTEVWRUxfT1VUX09GX1dJTkRPV18xX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrID0gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfRVJST1JfQ0JfSUQgOgorICAgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrID0gSEFMX0FEQ19FcnJvckNhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0lOSl9DT05WRVJTSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+SW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrID0gSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19JTkpfUVVFVUVfT1ZFRkxPV19DQl9JRCA6CisgICAgICAgIGhhZGMtPkluamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrID0gSEFMX0FEQ0V4X0luamVjdGVkUXVldWVPdmVyZmxvd0NhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX0xFVkVMX09VVF9PRl9XSU5ET1dfMl9DQl9JRCA6CisgICAgICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2sgPSBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzJDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19MRVZFTF9PVVRfT0ZfV0lORE9XXzNfQ0JfSUQgOgorICAgICAgICBoYWRjLT5MZXZlbE91dE9mV2luZG93M0NhbGxiYWNrID0gSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfRU5EX09GX1NBTVBMSU5HX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+RW5kT2ZTYW1wbGluZ0NhbGxiYWNrID0gSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSBIQUxfQURDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhhZGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQURDX1NUQVRFX1JFU0VUID09IGhhZGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0FEQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0FEQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBjYXNlIEhBTF9BRENfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGFkYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQURDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhhZGMtPkVycm9yQ29kZSB8PSBIQUxfQURDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoYWRjLT5FcnJvckNvZGUgfD0gSEFMX0FEQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIAorICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgQURDIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBBREMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgICAgICgrKSBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIG9uIHJlZ3VsYXIgZ3JvdXAuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBldmVudC4KKyAgICAgICgrKSBHZXQgcmVzdWx0IG9mIHJlZ3VsYXIgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cCBhbmQgZW5hYmxlIGludGVycnVwdGlvbnMuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIGRpc2FibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0CisgICAgICAoKykgU3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIGFuZCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBBREMsIHN0YXJ0IGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOiBOb25lLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8IEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSAqLworICAgICAgLyogQ2hlY2sgaWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLworICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUiB8IEhBTF9BRENfRVJST1JfRE1BKSk7ICAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7ICAKKyAgICAgICAgLyogUmVzZXQgYWxsIEFEQyBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogQ2xlYXIgQURDIGdyb3VwIHJlZ3VsYXIgY29udmVyc2lvbiBmbGFnIGFuZCBvdmVycnVuIGZsYWcgICAgICAgICAgICAgICAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUyB8IEFEQ19GTEFHX09WUikpOworICAgICAgCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAvKiBVbmxvY2sgYmVmb3JlIHN0YXJ0aW5nIEFEQyBjb252ZXJzaW9uczogaW4gY2FzZSBvZiBwb3RlbnRpYWwgICAgICAgICAqLworICAgICAgLyogaW50ZXJydXB0aW9uLCB0byBsZXQgdGhlIHByb2Nlc3MgdG8gQURDIElSUSBIYW5kbGVyLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgIAorICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgY2hhbm5lbHMgaW4gCisgICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIEFEQyBwZXJpcGhlcmFsLgorICAqIEBub3RlOiAgQURDIHBlcmlwaGVyYWwgZGlzYWJsZSBpcyBmb3JjaW5nIHN0b3Agb2YgcG90ZW50aWFsIAorICAqICAgICAgICAgY29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cC4gSWYgaW5qZWN0ZWQgZ3JvdXAgaXMgdW5kZXIgdXNlLCBpdAorICAqICAgICAgICAgc2hvdWxkIGJlIHByZWxpbWluYXJpbHkgc3RvcHBlZCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wIGZ1bmN0aW9uLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX1N0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nLCBvbiBBREMgZ3JvdXBzIHJlZ3VsYXIgYW5kIGluamVjdGVkICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAKKyAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgcmVndWxhciBncm91cCBjb252ZXJzaW9uIHRvIGJlIGNvbXBsZXRlZC4KKyAgKiBAbm90ZSAgIEFEQyBjb252ZXJzaW9uIGZsYWdzIEVPUyAoZW5kIG9mIHNlcXVlbmNlKSBhbmQgRU9DIChlbmQgb2YKKyAgKiAgICAgICAgIGNvbnZlcnNpb24pIGFyZSBjbGVhcmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHdpdGggYW4gZXhjZXB0aW9uOgorICAqICAgICAgICAgaWYgbG93IHBvd2VyIGZlYXR1cmUgIkxvd1Bvd2VyQXV0b1dhaXQiIGlzIGVuYWJsZWQsIGZsYWdzIGFyZSAKKyAgKiAgICAgICAgIG5vdCBjbGVhcmVkIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUgdW50aWwgZGF0YSByZWdpc3RlcgorICAqICAgICAgICAgaXMgcmVhZCB1c2luZyBmdW5jdGlvbiBIQUxfQURDX0dldFZhbHVlKCkuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFydGljdWxhciBzZXR1cDogQURDIGNvbmZpZ3VyZWQgCisgICogICAgICAgICBpbiBETUEgbW9kZSBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbiAoQURDIGluaXQKKyAgKiAgICAgICAgIHBhcmFtZXRlciAiRU9DU2VsZWN0aW9uIiBzZXQgdG8gQURDX0VPQ19TSU5HTEVfQ09OVikuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIERNQSByZXNldHMgdGhlIGZsYWcgRU9DIGFuZCBwb2xsaW5nIGNhbm5vdCBiZQorICAqICAgICAgICAgcGVyZm9ybWVkIG9uIGVhY2ggY29udmVyc2lvbi4gTmV2ZXJ0aGVsZXNzLCBwb2xsaW5nIGNhbiBzdGlsbCAKKyAgKiAgICAgICAgIGJlIHBlcmZvcm1lZCBvbiB0aGUgY29tcGxldGUgc2VxdWVuY2UgKEFEQyBpbml0CisgICogICAgICAgICBwYXJhbWV0ZXIgIkVPQ1NlbGVjdGlvbiIgc2V0IHRvIEFEQ19FT0NfU0VRX0NPTlYpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbihBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXBfRmxhZ19FbmQ7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogSWYgZW5kIG9mIGNvbnZlcnNpb24gc2VsZWN0ZWQgdG8gZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb25zICovCisgIGlmIChoYWRjLT5Jbml0LkVPQ1NlbGVjdGlvbiA9PSBBRENfRU9DX1NFUV9DT05WKQorICB7CisgICAgdG1wX0ZsYWdfRW5kID0gQURDX0ZMQUdfRU9TOworICB9CisgIC8qIElmIGVuZCBvZiBjb252ZXJzaW9uIHNlbGVjdGVkIHRvIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gKi8KKyAgZWxzZSAvKiBBRENfRU9DX1NJTkdMRV9DT05WICovCisgIHsKKyAgICAvKiBWZXJpZmljYXRpb24gdGhhdCBBREMgY29uZmlndXJhdGlvbiBpcyBjb21wbGlhbnQgd2l0aCBwb2xsaW5nIGZvciAgICAgICovCisgICAgLyogZWFjaCBjb252ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBpcyBBREMgY29uZmlndXJlZCBpbiBETUEgbW9kZSBhbmQgQURDIHNlcXVlbmNlciB3aXRoICAgKi8KKyAgICAvKiBzZXZlcmFsIHJhbmtzIGFuZCBwb2xsaW5nIGZvciBlbmQgb2YgZWFjaCBjb252ZXJzaW9uLiAgICAgICAgICAgICAgICAgICovCisgICAgLyogRm9yIGNvZGUgc2ltcGxpY2l0eSBzYWtlLCB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcyBnZW5lcmFsaXplZCB0byAgICAgICAqLworICAgIC8qIEFEQyBjb25maWd1cmVkIGluIERNQSBtb2RlIGFuZCBhbmQgcG9sbGluZyBmb3IgZW5kIG9mIGVhY2ggY29udmVyc2lvbi4gKi8KKyAgICBpZihSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcF9GbGFnX0VuZCA9IChBRENfRkxBR19FT0MpOworICAgIH0KKyAgfQorICAKKyAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIC8qIFdhaXQgdW50aWwgRW5kIG9mIHVuaXRhcnkgY29udmVyc2lvbiBvciBzZXF1ZW5jZSBjb252ZXJzaW9ucyBmbGFnIGlzIHJhaXNlZCAqLworICB3aGlsZSgoaGFkYy0+SW5zdGFuY2UtPklTUiAmIHRtcF9GbGFnX0VuZCkgPT0gMFVMKQorICB7CisgICAgLyogQ2hlY2sgaWYgdGltZW91dCBpcyBkaXNhYmxlZCAoc2V0IHRvIGluZmluaXRlIHdhaXQpICovCisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gdGltZW91dCAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1RJTUVPVVQpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIAorICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKyAgCisgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgICAqLworICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZy4gICAgICAgICAgKi8KKyAgaWYoICAgKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAmJiAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRElTQUJMRSkKKyAgICApCisgIHsKKyAgICAvKiBDaGVjayB3aGV0aGVyIGVuZCBvZiBzZXF1ZW5jZSBpcyByZWFjaGVkICovCisgICAgaWYoIF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19FT1MpICkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOworICAgICAgCisgICAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gMFVMKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENsZWFyIHBvbGxlZCBmbGFnICovCisgIGlmICh0bXBfRmxhZ19FbmQgPT0gQURDX0ZMQUdfRU9TKQorICB7CisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TKTsgIAorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIGVuZCBvZiBjb252ZXJzaW9uIEVPQyBmbGFnIG9mIHJlZ3VsYXIgZ3JvdXAgaWYgbG93IHBvd2VyIGZlYXR1cmUgKi8KKyAgICAvKiAiTG93UG93ZXJBdXRvV2FpdCAiIGlzIGRpc2FibGVkLCB0byBub3QgaW50ZXJmZXJlIHdpdGggdGhpcyBmZWF0dXJlICAgICovCisgICAgLyogdW50aWwgZGF0YSByZWdpc3RlciBpcyByZWFkIHVzaW5nIGZ1bmN0aW9uIEhBTF9BRENfR2V0VmFsdWUoKS4gICAgICAgICAqLworICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQVVURExZKSA9PSAwVUwpCisgICAgeworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPQyB8IEFEQ19GTEFHX0VPUykpOworICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBvbGwgZm9yIEFEQyBldmVudC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtIEV2ZW50VHlwZSB0aGUgQURDIGV2ZW50IHR5cGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfRU9TTVBfRVZFTlQgIEFEQyBFbmQgb2YgU2FtcGxpbmcgZXZlbnQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfQVdEMV9FVkVOVCAgIEFEQyBBbmFsb2cgd2F0Y2hkb2cgMSBldmVudCAobWFpbiBhbmFsb2cgd2F0Y2hkb2csIHByZXNlbnQgb24gYWxsIFNUTTMyIGRldmljZXMpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0FXRDJfRVZFTlQgICBBREMgQW5hbG9nIHdhdGNoZG9nIDIgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0FXRDNfRVZFTlQgICBBREMgQW5hbG9nIHdhdGNoZG9nIDMgZXZlbnQgKGFkZGl0aW9uYWwgYW5hbG9nIHdhdGNoZG9nLCBub3QgcHJlc2VudCBvbiBhbGwgU1RNMzIgZmFtaWxpZXMpCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX09WUl9FVkVOVCAgICBBREMgT3ZlcnJ1biBldmVudAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19KUU9WRl9FVkVOVCAgQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgZXZlbnQKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kLgorICAqIEBub3RlICAgVGhlIHJlbGV2YW50IGZsYWcgaXMgY2xlYXJlZCBpZiBmb3VuZCB0byBiZSBzZXQsIGV4Y2VwdCBmb3IgQURDX0ZMQUdfT1ZSLgorICAqICAgICAgICAgSW5kZWVkLCB0aGUgbGF0dGVyIGlzIHJlc2V0IG9ubHkgaWYgaGFkYy0+SW5pdC5PdmVycnVuIGZpZWxkIGlzIHNldCAgCisgICogICAgICAgICB0byBBRENfT1ZSX0RBVEFfT1ZFUldSSVRURU4uIE90aGVyd2lzZSwgZGF0YSByZWdpc3RlciBtYXkgYmUgcG90ZW50aWFsbHkgb3ZlcndyaXR0ZW4gCisgICogICAgICAgICBieSBhIG5ldyBjb252ZXJ0ZWQgZGF0YSBhcyBzb29uIGFzIE9WUiBpcyBjbGVhcmVkLgorICAqICAgICAgICAgVG8gcmVzZXQgT1ZSIGZsYWcgb25jZSB0aGUgcHJlc2VydmVkIGRhdGEgaXMgcmV0cmlldmVkLCB0aGUgdXNlciBjYW4gcmVzb3J0CisgICogICAgICAgICB0byBtYWNybyBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19PVlIpOyAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfUG9sbEZvckV2ZW50KEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBFdmVudFR5cGUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfRVZFTlRfVFlQRShFdmVudFR5cGUpKTsKKyAgCisgIC8qIEdldCB0aWNrIGNvdW50ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIAorICAvKiBDaGVjayBzZWxlY3RlZCBldmVudCBmbGFnICovCisgIHdoaWxlKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBFdmVudFR5cGUpID09IDBVTCkKKyAgeworICAgIC8qIENoZWNrIGlmIHRpbWVvdXQgaXMgZGlzYWJsZWQgKHNldCB0byBpbmZpbml0ZSB3YWl0KSAqLworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIHRpbWVvdXQgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9USU1FT1VUKTsKKyAgICAgICAgCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgc3dpdGNoKEV2ZW50VHlwZSkKKyAgeworICAvKiBFbmQgT2YgU2FtcGxpbmcgZXZlbnQgKi8KKyAgY2FzZSBBRENfRU9TTVBfRVZFTlQ6CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QKTsKKyAgICAgCisgICAgLyogQ2xlYXIgdGhlIEVuZCBPZiBTYW1wbGluZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfRU9TTVApOworICAgICAgIAorICAgIGJyZWFrOyAgCisgIAorICAvKiBBbmFsb2cgd2F0Y2hkb2cgKGxldmVsIG91dCBvZiB3aW5kb3cpIGV2ZW50ICovCisgIC8qIE5vdGU6IEluIGNhc2Ugb2Ygc2V2ZXJhbCBhbmFsb2cgd2F0Y2hkb2cgZW5hYmxlZCwgaWYgbmVlZGVkIHRvIGtub3cgICAgICAqLworICAvKiB3aGljaCBvbmUgdHJpZ2dlcmVkIGFuZCBvbiB3aGljaCBBREN4LCB0ZXN0IEFEQyBzdGF0ZSBvZiBhbmFsb2cgd2F0Y2hkb2cgKi8KKyAgLyogZmxhZ3MgSEFMX0FEQ19TVEFURV9BV0QxLzIvMyB1c2luZyBmdW5jdGlvbiAiSEFMX0FEQ19HZXRTdGF0ZSgpIi4gICAgICAgICovCisgIC8qIEZvciBleGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIiBpZiAoKEhBTF9BRENfR2V0U3RhdGUoaGFkYzEpICYgSEFMX0FEQ19TVEFURV9BV0QxKSAhPSAwVUwpICIgICAgICAgICAgKi8KKyAgLyogICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfQVdEMikgIT0gMFVMKSAiICAgICAgICAgICovCisgIC8qICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDMpICE9IDBVTCkgIiAgICAgICAgICAqLworICAKKyAgLyogQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDEgZmxhZyAqLworICBjYXNlIEFEQ19BV0RfRVZFTlQ6CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7CisgICAgCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMSk7CisgICAgCisgICAgYnJlYWs7CisgIAorICAvKiBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMiBmbGFnICovCisgIGNhc2UgQURDX0FXRDJfRVZFTlQ6CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisgICAgICAKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QyKTsKKyAgICAKKyAgICBicmVhazsKKyAgCisgIC8qIENoZWNrIGFuYWxvZyB3YXRjaGRvZyAzIGZsYWcgKi8KKyAgY2FzZSBBRENfQVdEM19FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsKKyAgICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDMpOworICAgIAorICAgIGJyZWFrOworICAKKyAgLyogSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBldmVudCAqLworICBjYXNlIEFEQ19KUU9WRl9FVkVOVDoKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYpOworICAgIAorICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93ICovCisgICAgU0VUX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOworICAgIAorICAgIC8qIENsZWFyIEFEQyBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19KUU9WRik7CisgICAgCisgICAgYnJlYWs7CisgICAgCisgIC8qIE92ZXJydW4gZXZlbnQgKi8KKyAgZGVmYXVsdDogLyogQ2FzZSBBRENfT1ZSX0VWRU5UICovCisgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEsIG92ZXJydW4gZXZlbnQgaXMgbm90ICAgICAqLworICAgIC8qIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovCisgICAgLyogb3ZlcnJ1biAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChoYWRjLT5Jbml0Lk92ZXJydW4gPT0gQURDX09WUl9EQVRBX1BSRVNFUlZFRCkKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19PVlIpOworICAgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBvdmVycnVuICovCisgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9PVlIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2xlYXIgQURDIE92ZXJydW4gZmxhZyBvbmx5IGlmIE92ZXJydW4gaXMgc2V0IHRvIEFEQ19PVlJfREFUQV9PVkVSV1JJVFRFTgorICAgICAgICAgb3RoZXJ3aXNlLCBkYXRhIHJlZ2lzdGVyIGlzIHBvdGVudGlhbGx5IG92ZXJ3cml0dGVuIGJ5IG5ldyBjb252ZXJ0ZWQgZGF0YSBhcyBzb29uCisgICAgICAgICBhcyBPVlIgaXMgY2xlYXJlZC4gKi8KKyAgICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX09WUik7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIHdpdGggaW50ZXJydXB0aW9uLgorICAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGluaXRpYWxpemF0aW9uCisgICogICAgICAgICBzZXR0aW5nIDogRU9DIChlbmQgb2YgY29udmVyc2lvbiksIEVPUyAoZW5kIG9mIHNlcXVlbmNlKSwgCisgICogICAgICAgICBPVlIgb3ZlcnJ1bi4KKyAgKiAgICAgICAgIEVhY2ggb2YgdGhlc2UgaW50ZXJydXB0aW9ucyBoYXMgaXRzIGRlZGljYXRlZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIGd1YXJhbnRlZSBhIHByb3BlciByZXNldCBvZiBhbGwgaW50ZXJydXB0aW9ucyBvbmNlIGFsbCB0aGUgbmVlZGVkCisgICogICAgICAgICBjb252ZXJzaW9ucyBhcmUgb2J0YWluZWQsIEhBTF9BRENfU3RvcF9JVCgpIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSAKKyAgKiAgICAgICAgIGEgY29ycmVjdCBzdG9wIG9mIHRoZSBJVC1iYXNlZCBjb252ZXJzaW9ucy4KKyAgKiBAbm90ZSAgIEJ5IGRlZmF1bHQsIEhBTF9BRENfU3RhcnRfSVQoKSBkb2VzIG5vdCBlbmFibGUgdGhlIEVuZCBPZiBTYW1wbGluZyAKKyAgKiAgICAgICAgIGludGVycnVwdGlvbi4gSWYgcmVxdWlyZWQgKGUuZy4gaW4gY2FzZSBvZiBvdmVyc2FtcGxpbmcgd2l0aCB0cmlnZ2VyCisgICogICAgICAgICBtb2RlKSwgdGhlIHVzZXIgbXVzdDoKKyAgKiAgICAgICAgICAxLiBmaXJzdCBjbGVhciB0aGUgRU9TTVAgZmxhZyBpZiBzZXQgd2l0aCBtYWNybyBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19FT1NNUCkgICAgICAgICAgICAgCisgICogICAgICAgICAgMi4gdGhlbiBlbmFibGUgdGhlIEVPU01QIGludGVycnVwdCB3aXRoIG1hY3JvIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0VPU01QKSAgICAgCisgICogICAgICAgICAgYmVmb3JlIGNhbGxpbmcgSEFMX0FEQ19TdGFydF9JVCgpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFBlcmZvcm0gQURDIGVuYWJsZSBhbmQgY29udmVyc2lvbiBzdGFydCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nICovCisgIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAKKyAgICAvKiBFbmFibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAgIAorICAgIC8qIFN0YXJ0IGNvbnZlcnNpb24gaWYgQURDIGlzIGVmZmVjdGl2ZWx5IGVuYWJsZWQgKi8KKyAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAtIENsZWFyIHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gcmVndWxhciBncm91cCBjb252ZXJzaW9uIHJlc3VsdHMgICAqLworICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUFEWSB8IEhBTF9BRENfU1RBVEVfUkVHX0VPQyB8IEhBTF9BRENfU1RBVEVfUkVHX09WUiB8IEhBTF9BRENfU1RBVEVfUkVHX0VPU01QLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAKKyAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSAqLworICAgICAgLyogQ2hlY2sgaWYgYSBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLworICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGRzIHJlbGF0ZWQgdG8gcmVndWxhciBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIChIQUxfQURDX0VSUk9SX09WUnxIQUxfQURDX0VSUk9SX0RNQSkpOyAgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBSZXNldCBhbGwgQURDIGVycm9yIGNvZGUgZmllbGRzICovCisgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7IAorICAgICAgfQorICAgICAgCisgICAgICAvKiBDbGVhciBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGZsYWcgYW5kIG92ZXJydW4gZmxhZyAgICAgICAgICAgICAgICovCisgICAgICAvKiAoVG8gZW5zdXJlIG9mIG5vIHVua25vd24gc3RhdGUgZnJvbSBwb3RlbnRpYWwgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRpb25zIGJlZm9yZSBlbmFibGluZyB0aGUgZGVzaXJlZCBvbmVzICovCisgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCAoQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MgfCBBRENfSVRfT1ZSKSk7CisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0ICovCisgICAgICBzd2l0Y2goaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24pCisgICAgICB7CisgICAgICAgIGNhc2UgQURDX0VPQ19TRVFfQ09OVjoKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9FT1MpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBjYXNlIEFEQ19FT0NfU0lOR0xFX0NPTlYgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9FT0MpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgICAvKiBJZiBoYWRjLT5Jbml0Lk92ZXJydW4gaXMgc2V0IHRvIEFEQ19PVlJfREFUQV9QUkVTRVJWRUQsIG9ubHkgdGhlbiBpcworICAgICAgICAgQURDX0lUX09WUiBlbmFibGVkOyBvdGhlcndpc2UgZGF0YSBvdmVyd3JpdGUgaXMgY29uc2lkZXJlZCBhcyBub3JtYWwKKyAgICAgICAgIGJlaGF2aW9yIGFuZCBubyBDUFUgdGltZSBpcyBsb3N0IGZvciBhIG5vbi1wcm9jZXNzZWQgaW50ZXJydXB0aW9uICovCisgICAgICBpZiAoaGFkYy0+SW5pdC5PdmVycnVuID09IEFEQ19PVlJfREFUQV9QUkVTRVJWRUQpCisgICAgICB7CisgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX09WUik7ICAKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRW5hYmxlIGNvbnZlcnNpb24gb2YgcmVndWxhciBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIElmIHNvZnR3YXJlIHN0YXJ0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHN0YXJ0cyBpbW1lZGlhdGVseS4gICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgLyogdHJpZ2dlciBldmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgICAgCisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgZ3JvdXAgaW4gCisgICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIGludGVycnV0aW9uIG9mIAorICAqICAgICAgICAgZW5kLW9mLWNvbnZlcnNpb24sIGRpc2FibGUgQURDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcsIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVApOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBjb252ZXJzaW9ucyBhcmUgZWZmZWN0aXZlbHkgc3RvcHBlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciByZWd1bGFyIGdyb3VwICovCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCAoQURDX0lUX0VPQyB8IEFEQ19JVF9FT1MgfCBBRENfSVRfT1ZSKSk7CisgICAgCisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgIAorICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgYW5kIHRyYW5zZmVyIHJlc3VsdCB0aHJvdWdoIERNQS4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOgorICAqICAgICAgICAgb3ZlcnJ1biAoaWYgYXBwbGljYWJsZSksIERNQSBoYWxmIHRyYW5zZmVyLCBETUEgdHJhbnNmZXIgY29tcGxldGUuIAorICAqICAgICAgICAgRWFjaCBvZiB0aGVzZSBpbnRlcnJ1cHRpb25zIGhhcyBpdHMgZGVkaWNhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gcERhdGEgRGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtIExlbmd0aCBOdW1iZXIgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIEFEQyBwZXJpcGhlcmFsIHRvIG1lbW9yeQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RhcnRfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCogcERhdGEsIHVpbnQzMl90IExlbmd0aCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUGVyZm9ybSBBREMgZW5hYmxlIGFuZCBjb252ZXJzaW9uIHN0YXJ0IGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRW5hYmxlKGhhZGMpOworICAgIAorICAgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHRzICAgKi8KKyAgICAgICAgLyogLSBTZXQgc3RhdGUgYml0ZmllbGQgcmVsYXRlZCB0byByZWd1bGFyIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX1JFR19FT0MgfCBIQUxfQURDX1NUQVRFX1JFR19PVlIgfCBIQUxfQURDX1NUQVRFX1JFR19FT1NNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBhIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIGluamVjdGVkICovCisgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSAhPSAwVUwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZXNldCBBREMgZXJyb3IgY29kZSBmaWVsZHMgcmVsYXRlZCB0byByZWd1bGFyIGNvbnZlcnNpb25zIG9ubHkgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+RXJyb3JDb2RlLCAoSEFMX0FEQ19FUlJPUl9PVlIgfCBIQUxfQURDX0VSUk9SX0RNQSkpOyAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgCisgICAgICAgICAgLyogUmVzZXQgYWxsIEFEQyBlcnJvciBjb2RlIGZpZWxkcyAqLworICAgICAgICAgIEFEQ19DTEVBUl9FUlJPUkNPREUoaGFkYyk7IAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gQURDX0RNQUNvbnZDcGx0OworICAgICAgICAKKyAgICAgICAgLyogU2V0IHRoZSBETUEgaGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IEFEQ19ETUFIYWxmQ29udkNwbHQ7CisgICAgICAgIAorICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoYWRjLT5ETUFfSGFuZGxlLT5YZmVyRXJyb3JDYWxsYmFjayA9IEFEQ19ETUFFcnJvcjsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKiBNYW5hZ2UgQURDIGFuZCBETUEgc3RhcnQ6IEFEQyBvdmVycnVuIGludGVycnVwdGlvbiwgRE1BIHN0YXJ0LCAgICAgKi8KKyAgICAgICAgLyogQURDIHN0YXJ0IChpbiBjYXNlIG9mIFNXIHN0YXJ0KTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIAorICAgICAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyBhbmQgb3ZlcnJ1biBmbGFnICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyAgICAgICAgICovCisgICAgICAgIC8qIG9wZXJhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TIHwgQURDX0ZMQUdfT1ZSKSk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAgIC8qIGludGVycnVwdGlvbiwgdG8gbGV0IHRoZSBwcm9jZXNzIHRvIEFEQyBJUlEgSGFuZGxlci4gICAgICAgICAgICAgICAgICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIC8qIFdpdGggRE1BLCBvdmVycnVuIGV2ZW50IGlzIGFsd2F5cyBjb25zaWRlcmVkIGFzIGFuIGVycm9yIGV2ZW4gaWYgCisgICAgICAgICAgIGhhZGMtPkluaXQuT3ZlcnJ1biBpcyBzZXQgdG8gQURDX09WUl9EQVRBX09WRVJXUklUVEVOLiBUaGVyZWZvcmUsICAKKyAgICAgICAgICAgQURDX0lUX09WUiBpcyBlbmFibGVkLiAqLworICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9PVlIpOworICAgICAgICAKKyAgICAgICAgLyogRW5hYmxlIEFEQyBETUEgbW9kZSAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTik7CisgICAgICAgIAorICAgICAgICAvKiBTdGFydCB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhhZGMtPkRNQV9IYW5kbGUsICh1aW50MzJfdCkmaGFkYy0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIExlbmd0aCk7CisgICAgICAgIAorICAgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAqLworICAgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAqLworICAgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBTdGFydCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uICovCisgICAgICAgIExMX0FEQ19SRUdfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCBBREMgY29udmVyc2lvbiBvZiByZWd1bGFyIGdyb3VwIChhbmQgaW5qZWN0ZWQgZ3JvdXAgaW4gCisgICogICAgICAgICBjYXNlIG9mIGF1dG9faW5qZWN0aW9uIG1vZGUpLCBkaXNhYmxlIEFEQyBETUEgdHJhbnNmZXIsIGRpc2FibGUgCisgICogICAgICAgICBBREMgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZTogIEFEQyBwZXJpcGhlcmFsIGRpc2FibGUgaXMgZm9yY2luZyBzdG9wIG9mIHBvdGVudGlhbAorICAqICAgICAgICAgY29udmVyc2lvbiBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuIElmIEFEQyBncm91cCBpbmplY3RlZCBpcyB1bmRlciB1c2UsIGl0CisgICogICAgICAgICBzaG91bGQgYmUgcHJlbGltaW5hcmlseSBzdG9wcGVkIHVzaW5nIEhBTF9BRENFeF9JbmplY3RlZFN0b3AgZnVuY3Rpb24uCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENfU3RvcF9ETUEoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0lOSkVDVEVEX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIERpc2FibGUgQURDIERNQSAoQURDIERNQSBjb25maWd1cmF0aW9uIG9mIGNvbnRpbm91cyByZXF1ZXN0cyBpcyBrZXB0KSAqLworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfRE1BRU4pOworICAgIAorICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3AgICAgICAgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoaGFkYy0+RE1BX0hhbmRsZS0+U3RhdGUgPT0gSEFMX0RNQV9TVEFURV9CVVNZKQorICAgIHsKKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0RNQV9BYm9ydChoYWRjLT5ETUFfSGFuZGxlKTsKKyAgICAgIAorICAgICAgLyogQ2hlY2sgaWYgRE1BIGNoYW5uZWwgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0RNQSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIERpc2FibGUgQURDIG92ZXJydW4gaW50ZXJydXB0ICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX09WUik7CisgICAgCisgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBVcGRhdGUgInRtcF9oYWxfc3RhdHVzIiBvbmx5IGlmIERNQSBjaGFubmVsIGRpc2FibGluZyBwYXNzZWQsICAgICAgICAgICovCisgICAgLyogdG8ga2VlcCBpbiBtZW1vcnkgYSBwb3RlbnRpYWwgZmFpbGluZyBzdGF0dXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICh2b2lkKUFEQ19EaXNhYmxlKGhhZGMpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgIH0KKyAgICAKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQURDIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiByZXN1bHQuCisgICogQG5vdGUgICBSZWFkaW5nIHJlZ2lzdGVyIERSIGF1dG9tYXRpY2FsbHkgY2xlYXJzIEFEQyBmbGFnIEVPQworICAqICAgICAgICAgKEFEQyBncm91cCByZWd1bGFyIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbGVhciBBREMgZmxhZyBFT1MgCisgICogICAgICAgICAoQURDIGdyb3VwIHJlZ3VsYXIgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24pLgorICAqICAgICAgICAgT2NjdXJyZW5jZSBvZiBmbGFnIEVPUyByaXNpbmc6CisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2YgMSByYW5rLCBmbGFnIEVPUyBpcyBlcXVpdmFsZW50CisgICogICAgICAgICAgICB0byBmbGFnIEVPQy4KKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiBzZXZlcmFsIHJhbmtzLCBkdXJpbmcgdGhlIHNjYW4KKyAgKiAgICAgICAgICAgIHNlcXVlbmNlIGZsYWcgRU9DIG9ubHkgaXMgcmFpc2VkLCBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuIHNlcXVlbmNlCisgICogICAgICAgICAgICBib3RoIGZsYWdzIEVPQyBhbmQgRU9TIGFyZSByYWlzZWQuCisgICogICAgICAgICBUbyBjbGVhciB0aGlzIGZsYWcsIGVpdGhlciB1c2UgZnVuY3Rpb246CisgICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAgKiAgICAgICAgIG1vZGVsIHBvbGxpbmc6IEByZWYgSEFMX0FEQ19Qb2xsRm9yQ29udmVyc2lvbigpCisgICogICAgICAgICBvciBAcmVmIF9fSEFMX0FEQ19DTEVBUl9GTEFHKCZoYWRjLCBBRENfRkxBR19FT1MpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gZGF0YQorICAqLwordWludDMyX3QgSEFMX0FEQ19HZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKworICAvKiBOb3RlOiBFT0MgZmxhZyBpcyBub3QgY2xlYXJlZCBoZXJlIGJ5IHNvZnR3YXJlIGJlY2F1c2UgYXV0b21hdGljYWxseSAgICAgKi8KKyAgLyogICAgICAgY2xlYXJlZCBieSBoYXJkd2FyZSB3aGVuIHJlYWRpbmcgcmVnaXN0ZXIgRFIuICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICAvKiBSZXR1cm4gQURDIGNvbnZlcnRlZCB2YWx1ZSAqLyAKKyAgcmV0dXJuIGhhZGMtPkluc3RhbmNlLT5EUjsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgQURDIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0FEQ19JUlFIYW5kbGVyKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCBvdmVycnVuX2Vycm9yID0gMFVMOyAvKiBmbGFnIHNldCBpZiBvdmVycnVuIG9jY3VycmVuY2UgaGFzIHRvIGJlIGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IgKi8KKyAgdWludDMyX3QgdG1wX2lzciA9IGhhZGMtPkluc3RhbmNlLT5JU1I7CisgIHVpbnQzMl90IHRtcF9pZXIgPSBoYWRjLT5JbnN0YW5jZS0+SUVSOworICB1aW50MzJfdCB0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsKKyAgdWludDMyX3QgdG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQ7CisgIHVpbnQzMl90IHRtcF9jZmdyOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19FT0NfU0VMRUNUSU9OKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKSk7CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIEVuZCBvZiBTYW1wbGluZyBmbGFnIGZvciBBREMgZ3JvdXAgcmVndWxhciA9PT09PT09PT09ICovCisgIGlmKCgodG1wX2lzciAmIEFEQ19GTEFHX0VPU01QKSA9PSBBRENfRkxBR19FT1NNUCkgJiYgKCh0bXBfaWVyICYgQURDX0lUX0VPU01QKSA9PSBBRENfSVRfRU9TTVApKQorICB7CisgICAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gZW5kIG9mIHNhbXBsaW5nIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPU01QKTsKKyAgICB9CisgICAgCisgICAgLyogRW5kIE9mIFNhbXBsaW5nIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhhZGMtPkVuZE9mU2FtcGxpbmdDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAKKyAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPU01QICk7CisgIH0KKyAgCisgIC8qID09PT09PSBDaGVjayBBREMgZ3JvdXAgcmVndWxhciBlbmQgb2YgdW5pdGFyeSBjb252ZXJzaW9uIHNlcXVlbmNlIGNvbnZlcnNpb25zID09PT09ICovCisgIGlmKCgoKHRtcF9pc3IgJiBBRENfRkxBR19FT0MpID09IEFEQ19GTEFHX0VPQykgJiYgKCh0bXBfaWVyICYgQURDX0lUX0VPQykgPT0gQURDX0lUX0VPQykpIHx8CisgICAgICgoKHRtcF9pc3IgJiBBRENfRkxBR19FT1MpID09IEFEQ19GTEFHX0VPUykgJiYgKCh0bXBfaWVyICYgQURDX0lUX0VPUykgPT0gQURDX0lUX0VPUykpICApCisgIHsKKyAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBjb252ZXJzaW9uIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0VPQyk7CisgICAgfQorICAgIAorICAgIC8qIERldGVybWluZSB3aGV0aGVyIGFueSBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgb24gZ3JvdXAgcmVndWxhciAgICAgKi8KKyAgICAvKiBieSBleHRlcm5hbCB0cmlnZ2VyLCBjb250aW51b3VzIG1vZGUgb3Igc2NhbiBzZXF1ZW5jZSBvbiBnb2luZyAgICAgICAgICovCisgICAgLyogdG8gZGlzYWJsZSBpbnRlcnJ1cHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIENhcnJ5IG9uIGlmIGNvbnRpbnVvdXMgbW9kZSBpcyBkaXNhYmxlZCAqLworICAgICAgaWYgKFJFQURfQklUIChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQ09OVCkgIT0gQURDX0NGR1JfQ09OVCkKKyAgICAgIHsKKyAgICAgICAgLyogSWYgRW5kIG9mIFNlcXVlbmNlIGlzIHJlYWNoZWQsIGRpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgICBpZiggX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0VPUykgKQorICAgICAgICB7CisgICAgICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfRU9DL0FEQ19JVF9FT1Mgb25seSBpZiBiaXQgICAgICAgICAqLworICAgICAgICAgIC8qIEFEU1RBUlQ9PTAgKG5vIGNvbnZlcnNpb24gb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24gaW50ZXJydXB0ICovCisgICAgICAgICAgICAvKiBOb3RlOiBPdmVycnVuIGludGVycnVwdCB3YXMgZW5hYmxlZCB3aXRoIEVPQyBpbnRlcnJ1cHQgaW4gICAgICAqLworICAgICAgICAgICAgLyogSEFMX1N0YXJ0X0lUKCksIGJ1dCBpcyBub3QgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIGNhbiBiZSB1c2VkICAgKi8KKyAgICAgICAgICAgIC8qIGJ5IG92ZXJydW4gSVJRIHByb2Nlc3MgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfRU9DIHwgQURDX0lUX0VPUyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKSA9PSAwVUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDaGFuZ2UgQURDIHN0YXRlIHRvIGVycm9yIHN0YXRlICovCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIEFEQyBwZXJpcGhlcmFsIGludGVybmFsIGVycm9yICovCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAvKiBOb3RlOiBJbnRvIGNhbGxiYWNrIGZ1bmN0aW9uICJIQUxfQURDX0NvbnZDcGx0Q2FsbGJhY2soKSIsICAgICAgICAgICAgICovCisgICAgLyogICAgICAgdG8gZGV0ZXJtaW5lIGlmIGNvbnZlcnNpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGZyb20gRU9DIG9yIEVPUywgICAqLworICAgIC8qICAgICAgIHBvc3NpYmlsaXR5IHRvIHVzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgIiBpZiggX19IQUxfQURDX0dFVF9GTEFHKCZoYWRjLCBBRENfRkxBR19FT1MpKSAiICAgICAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhhZGMtPkNvbnZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAKKyAgICAvKiBDbGVhciByZWd1bGFyIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgIC8qIE5vdGU6IGluIGNhc2Ugb2Ygb3ZlcnJ1biBzZXQgdG8gQURDX09WUl9EQVRBX1BSRVNFUlZFRCwgZW5kIG9mICAgICAgICAgKi8KKyAgICAvKiAgICAgICBjb252ZXJzaW9uIGZsYWdzIGNsZWFyIGluZHVjZXMgdGhlIHJlbGVhc2Ugb2YgdGhlIHByZXNlcnZlZCBkYXRhLiovCisgICAgLyogICAgICAgVGhlcmVmb3JlLCBpZiB0aGUgcHJlc2VydmVkIGRhdGEgdmFsdWUgaXMgbmVlZGVkLCBpdCBtdXN0IGJlICAgICAqLworICAgIC8qICAgICAgIHJlYWQgcHJlbGltaW5hcmlseSBpbnRvIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjaygpLiAgICAgICAgICAgICAgKi8KKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCAoQURDX0ZMQUdfRU9DIHwgQURDX0ZMQUdfRU9TKSApOworICB9CisgIAorICAvKiA9PT09PT0gQ2hlY2sgQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24gc2VxdWVuY2UgY29udmVyc2lvbnMgPT09PT0gKi8KKyAgaWYoICgoKHRtcF9pc3IgJiBBRENfRkxBR19KRU9DKSA9PSBBRENfRkxBR19KRU9DKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfSkVPQykgPT0gQURDX0lUX0pFT0MpKSB8fAorICAgICAgKCgodG1wX2lzciAmIEFEQ19GTEFHX0pFT1MpID09IEFEQ19GTEFHX0pFT1MpICYmICgodG1wX2llciAmIEFEQ19JVF9KRU9TKSA9PSBBRENfSVRfSkVPUykpICApICAgICAgCisgIHsKKyAgICAvKiBVcGRhdGUgc3RhdGUgbWFjaGluZSBvbiBjb252ZXJzaW9uIHN0YXR1cyBpZiBub3QgaW4gZXJyb3Igc3RhdGUgKi8KKyAgICBpZiAoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0VPQyk7CisgICAgfQorICAgIAorICAgIC8qIFJldHJpZXZlIEFEQyBjb25maWd1cmF0aW9uICovCisgICAgdG1wX2FkY19pbmpfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgPSBMTF9BRENfSU5KX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpOworICAgIHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0gTExfQURDX1JFR19Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsKKyAgICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiBpZiBubyBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgYnkgaW5qZWN0ZWQgICAgICovCisgICAgLyogZXh0ZXJuYWwgdHJpZ2dlciBvciBieSBhdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiB3aXRoIHJlZ3VsYXIgICAgICAqLworICAgIC8qIGdyb3VwIGhhdmluZyBubyBmdXJ0aGVyIGNvbnZlcnNpb24gdXBjb21pbmcgKHNhbWUgY29uZGl0aW9ucyBhcyAgICAgICAgKi8KKyAgICAvKiByZWd1bGFyIGdyb3VwIGludGVycnVwdGlvbiBkaXNhYmxpbmcgYWJvdmUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogYW5kIGlmIGluamVjdGVkIHNjYW4gc2VxdWVuY2UgaXMgY29tcGxldGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKCh0bXBfYWRjX2lual9pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydCAhPSAwVUwpICAgICAgICAgICAgfHwKKyAgICAgICAoKFJFQURfQklUICh0bXBfY2ZnciwgQURDX0NGR1JfSkFVVE8pID09IDBVTCkgICAgICAmJgorICAgICAgICAoKHRtcF9hZGNfcmVnX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgICYmCisgICAgICAgICAoUkVBRF9CSVQgKHRtcF9jZmdyLCBBRENfQ0ZHUl9DT05UKSA9PSAwVUwpICAgICkgICApICAgKQorICAgIHsKKyAgICAgIC8qIElmIEVuZCBvZiBTZXF1ZW5jZSBpcyByZWFjaGVkLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIGlmKF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKSkKKyAgICAgIHsKKyAgICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICAgICAgICAgICAgICovCisgICAgICAgIC8qIHdoZW4gdGhlIGxhc3QgY29udGV4dCBoYXMgYmVlbiBmdWxseSBwcm9jZXNzZWQsIEpTUVIgaXMgcmVzZXQgICAgICAqLworICAgICAgICAvKiBieSB0aGUgaGFyZHdhcmUuIEV2ZW4gaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBwbGFubmVkIHRvIGNvbWUgKi8KKyAgICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAgICAgICAgICAgICovCisgICAgICAgIC8qIGltbWVkaWF0ZWx5IGFmdGVyIHNldHRpbmcgYSBuZXcgY29udGV4dCAoSkFEU1RBUlQgaXMgc3RpbGwgc2V0KS4gICAqLworICAgICAgICAvKiBUaGVyZWZvcmUsIHN0YXRlIG9mIEhBTCBBREMgaW5qZWN0ZWQgZ3JvdXAgaXMga2VwdCB0byBidXN5LiAgICAgICAgKi8KKyAgICAgICAgaWYoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgLyogQWxsb3dlZCB0byBtb2RpZnkgYml0cyBBRENfSVRfSkVPQy9BRENfSVRfSkVPUyBvbmx5IGlmIGJpdCAgICAgICAqLworICAgICAgICAgIC8qIEpBRFNUQVJUPT0wIChubyBjb252ZXJzaW9uIG9uIGdvaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIHNlcXVlbmNlIGNvbnZlcnNpb24gaW50ZXJydXB0ICAqLworICAgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MgfCBBRENfSVRfSkVPUyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisKKyAgICAgICAgICAgIGlmICgoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSA9PSAwVUwpCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgICAgCisgICAgICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogSW5qZWN0ZWQgQ29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIC8qIE5vdGU6ICBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIGNhbiByZXNvcnQgdG8gCisgICAgICAgICAgICAgIGlmKCBfX0hBTF9BRENfR0VUX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT1MpKSBvcgorICAgICAgICAgICAgICBpZiggX19IQUxfQURDX0dFVF9GTEFHKCZoYWRjLCBBRENfRkxBR19KRU9DKSkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAgICAgICAgICAgaW50ZXJydXB0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBlbmQgb2YgY29udmVyc2lvbiBvciBlbmQgb2YgCisgICAgICAgICAgICAgIHNlcXVlbmNlLiAgICAqLyAgICAKKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+SW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIENsZWFyIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKTsKKyAgfQorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBBbmFsb2cgd2F0Y2hkb2cgMSBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0FXRDEpID09IEFEQ19GTEFHX0FXRDEpICYmICgodG1wX2llciAmIEFEQ19JVF9BV0QxKSA9PSBBRENfSVRfQVdEMSkpICAgICAgCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QxKTsKKyAgICAKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDEgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvd0NhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAKKyAgICAvKiBDbGVhciBBREMgYW5hbG9nIHdhdGNoZG9nIGZsYWcgKi8gCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfQVdEMSk7CisgIH0KKyAgCisgIC8qID09PT09PT09PT0gQ2hlY2sgYW5hbG9nIHdhdGNoZG9nIDIgZmxhZyA9PT09PT09PT09ICovCisgIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19BV0QyKSA9PSBBRENfRkxBR19BV0QyKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfQVdEMikgPT0gQURDX0lUX0FXRDIpKSAgICAgIAorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisgICAgCisgICAgLyogTGV2ZWwgb3V0IG9mIHdpbmRvdyAyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhhZGMtPkxldmVsT3V0T2ZXaW5kb3cyQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIAorICAgIC8qIENsZWFyIEFEQyBhbmFsb2cgd2F0Y2hkb2cgZmxhZyAqLyAKKyAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19BV0QyKTsKKyAgfQorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBhbmFsb2cgd2F0Y2hkb2cgMyBmbGFnID09PT09PT09PT0gKi8KKyAgaWYgKCgodG1wX2lzciAmIEFEQ19GTEFHX0FXRDMpID09IEFEQ19GTEFHX0FXRDMpICYmICgodG1wX2llciAmIEFEQ19JVF9BV0QzKSA9PSBBRENfSVRfQVdEMykpICAgICAgCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9BV0QzKTsKKyAgICAKKyAgICAvKiBMZXZlbCBvdXQgb2Ygd2luZG93IDMgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+TGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ0V4X0xldmVsT3V0T2ZXaW5kb3czQ2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgCisgICAgLyogQ2xlYXIgQURDIGFuYWxvZyB3YXRjaGRvZyBmbGFnICovIAorICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0FXRDMpOworICB9CisgIAorICAvKiA9PT09PT09PT09IENoZWNrIE92ZXJydW4gZmxhZyA9PT09PT09PT09ICovCisgIGlmICgoKHRtcF9pc3IgJiBBRENfRkxBR19PVlIpID09IEFEQ19GTEFHX09WUikgJiYgKCh0bXBfaWVyICYgQURDX0lUX09WUikgPT0gQURDX0lUX09WUikpIAorICB7CisgICAgLyogSWYgb3ZlcnJ1biBpcyBzZXQgdG8gb3ZlcndyaXRlIHByZXZpb3VzIGRhdGEgKGRlZmF1bHQgc2V0dGluZyksICAgICAgICAqLworICAgIC8qIG92ZXJydW4gZXZlbnQgaXMgbm90IGNvbnNpZGVyZWQgYXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAoY2YgcmVmIG1hbnVhbCAiTWFuYWdpbmcgY29udmVyc2lvbnMgd2l0aG91dCB1c2luZyB0aGUgRE1BIGFuZCB3aXRob3V0ICovCisgICAgLyogb3ZlcnJ1biAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEV4Y2VwdGlvbiBmb3IgdXNhZ2Ugd2l0aCBETUEgb3ZlcnJ1biBldmVudCBhbHdheXMgY29uc2lkZXJlZCBhcyBhbiAgICAgKi8KKyAgICAvKiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluaXQuT3ZlcnJ1biA9PSBBRENfT1ZSX0RBVEFfUFJFU0VSVkVEKQorICAgIHsKKyAgICAgIG92ZXJydW5fZXJyb3IgPSAxVUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayBETUEgY29uZmlndXJhdGlvbiAqLworICAgICAgaWYgKExMX0FEQ19SRUdfR2V0RE1BVHJhbnNmZXIoaGFkYy0+SW5zdGFuY2UpICE9IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkUpCisgICAgICB7CisgICAgICAgIG92ZXJydW5fZXJyb3IgPSAxVUw7CisgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICBpZiAob3ZlcnJ1bl9lcnJvciA9PSAxVUwpCisgICAgeworICAgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSB0byBlcnJvciBzdGF0ZSAqLworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfT1ZSKTsKKyAgICAgIAorICAgICAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIG92ZXJydW4gKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX09WUik7CisgICAgICAKKyAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCisgICAgICAvKiBOb3RlOiBJbiBjYXNlIG9mIG92ZXJydW4sIEFEQyBjb252ZXJzaW9uIGRhdGEgaXMgcHJlc2VydmVkIHVudGlsICAgICAqLworICAgICAgLyogICAgICAgZmxhZyBPVlIgaXMgcmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIFRoZXJlZm9yZSwgb2xkIEFEQyBjb252ZXJzaW9uIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBpbiAgICAgICAgICovCisgICAgICAvKiAgICAgICBmdW5jdGlvbiAiSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhhZGMtPkVycm9yQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgICAgSEFMX0FEQ19FcnJvckNhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICAKKyAgICAvKiBDbGVhciBBREMgb3ZlcnJ1biBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfT1ZSKTsKKyAgfQorICAKKyAgLyogPT09PT09PT09PSBDaGVjayBJbmplY3RlZCBjb250ZXh0IHF1ZXVlIG92ZXJmbG93IGZsYWcgPT09PT09PT09PSAqLworICBpZiAoKCh0bXBfaXNyICYgQURDX0ZMQUdfSlFPVkYpID09IEFEQ19GTEFHX0pRT1ZGKSAmJiAoKHRtcF9pZXIgJiBBRENfSVRfSlFPVkYpID09IEFEQ19JVF9KUU9WRikpIAorICB7CisgICAgLyogQ2hhbmdlIEFEQyBzdGF0ZSB0byBvdmVycnVuIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfSlFPVkYpOworICAgICAgICAKKyAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyAqLworICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0pRT1ZGKTsKKyAgICAKKyAgICAvKiBDbGVhciB0aGUgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBmbGFnICovCisgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgQURDX0ZMQUdfSlFPVkYpOworICAgIAorICAgIC8qIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+SW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICAgIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICAKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENfQ29udkNwbHRDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVyc2lvbiBETUEgaGFsZi10cmFuc2ZlciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDX0xldmVsT3V0T2ZXaW5kb3dDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFEQyBlcnJvciBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqICAgICAgICAgKEFEQyBjb252ZXJzaW9uIHdpdGggaW50ZXJydXB0aW9uIG9yIHRyYW5zZmVyIGJ5IERNQSkuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIGVycm9yIGR1ZSB0byBvdmVycnVuIHdoZW4gdXNpbmcgQURDIHdpdGggRE1BIHRyYW5zZmVyIAorICAqICAgICAgICAgKEhBTCBBREMgaGFuZGxlIHBhcmFtZXRlciAiRXJyb3JDb2RlIiB0byBzdGF0ZSAiSEFMX0FEQ19FUlJPUl9PVlIiKToKKyAgKiAgICAgICAgIC0gUmVpbml0aWFsaXplIHRoZSBETUEgdXNpbmcgZnVuY3Rpb24gIkhBTF9BRENfU3RvcF9ETUEoKSIuCisgICogICAgICAgICAtIElmIG5lZWRlZCwgcmVzdGFydCBhIG5ldyBBREMgY29udmVyc2lvbiB1c2luZyBmdW5jdGlvbgorICAqICAgICAgICAgICAiSEFMX0FEQ19TdGFydF9ETUEoKSIKKyAgKiAgICAgICAgICAgKHRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjbGVhcmluZyBvdmVycnVuIGZsYWcpCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ19FcnJvckNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDX0Vycm9yQ2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIGNoYW5uZWxzIG9uIHJlZ3VsYXIgZ3JvdXAKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZworICAgICAgCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBhIGNoYW5uZWwgdG8gYmUgYXNzaWduZWQgdG8gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOgorICAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgICogICAgICAgICBUaGVzZSBpbnRlcm5hbCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgZnVuY3Rpb24gCisgICogICAgICAgICBIQUxfQURDX0RlSW5pdCgpLgorICAqIEBub3RlICAgUG9zc2liaWxpdHkgdG8gdXBkYXRlIHBhcmFtZXRlcnMgb24gdGhlIGZseToKKyAgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgY2hhbm5lbCBpbnRvIEFEQyBncm91cCByZWd1bGFyLAorICAqICAgICAgICAgZm9sbG93aW5nIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUKKyAgKiAgICAgICAgIHNvbWUgcGFyYW1ldGVycyBvZiBzdHJ1Y3R1cmUgIkFEQ19DaGFubmVsQ29uZlR5cGVEZWYiIG9uIHRoZSBmbHksCisgICogICAgICAgICB3aXRob3V0IHJlc2V0dGluZyB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBSZWZlciB0byBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgIkFEQ19DaGFubmVsQ29uZlR5cGVEZWYiLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gc0NvbmZpZyBTdHJ1Y3R1cmUgb2YgQURDIGNoYW5uZWwgYXNzaWduZWQgdG8gQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMsIEFEQ19DaGFubmVsQ29uZlR5cGVEZWYqIHNDb25maWcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBPZmZzZXRTaGlmdGVkOworICB1aW50MzJfdCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWw7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMDsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfUkVHVUxBUl9SQU5LKHNDb25maWctPlJhbmspKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTEVfVElNRShzQ29uZmlnLT5TYW1wbGluZ1RpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKHNDb25maWctPlNpbmdsZURpZmYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PRkZTRVRfTlVNQkVSKHNDb25maWctPk9mZnNldE51bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgc0NvbmZpZy0+T2Zmc2V0KSk7CisgIAorICAvKiBpZiBST1ZTRSBpcyBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUgT0ZGU0VUeV9FTiBiaXQgaW4gQURDeF9PRlJ5IHJlZ2lzdGVyIGlzICAKKyAgICAgaWdub3JlZCAoY29uc2lkZXJlZCBhcyByZXNldCkgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKHNDb25maWctPk9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpICYmIChoYWRjLT5Jbml0Lk92ZXJzYW1wbGluZ01vZGUgPT0gRU5BQkxFKSkpOyAgCisgIAorICAvKiBWZXJpZmljYXRpb24gb2YgY2hhbm5lbCBudW1iZXIgKi8KKyAgaWYgKHNDb25maWctPlNpbmdsZURpZmYgIT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkKKyAgeworICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoaGFkYywgc0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfRElGRl9DSEFOTkVMKGhhZGMsIHNDb25maWctPkNoYW5uZWwpKTsKKyAgfQorICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBDaGFubmVsIHJhbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHNlcXVlbmNlOiBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzY2FuIHNlcXVlbmNlIHJhbmsgKi8KKyAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnLT5SYW5rLCBzQ29uZmlnLT5DaGFubmVsKTsKKyAgICAKKyAgICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIHJlZ3VsYXIgZ3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBDaGFubmVsIHNhbXBsaW5nIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBDaGFubmVsIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgICAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0gTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgICBpZiAoICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkKKyAgICAgICAgJiYgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpCisgICAgICAgKQorICAgIHsKKyAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLworICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoaGFkYy0+SW5zdGFuY2UsIHNDb25maWctPkNoYW5uZWwsIHNDb25maWctPlNhbXBsaW5nVGltZSk7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIGNoYW5uZWwsIG9mZnNldCB2YWx1ZSAqLworCisgICAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IHdpdGggcmVzcGVjdCB0byB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24uICovCisgICAgICAvKiBPZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMCAqLworICAgICAgdG1wT2Zmc2V0U2hpZnRlZCA9IEFEQ19PRkZTRVRfU0hJRlRfUkVTT0xVVElPTihoYWRjLCAodWludDMyX3Qpc0NvbmZpZy0+T2Zmc2V0KTsKKyAgICAgCisgICAgICBpZihzQ29uZmlnLT5PZmZzZXROdW1iZXIgIT0gQURDX09GRlNFVF9OT05FKQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIHNlbGVjdGVkIG9mZnNldCBudW1iZXIgKi8KKyAgICAgICAgTExfQURDX1NldE9mZnNldChoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+T2Zmc2V0TnVtYmVyLCBzQ29uZmlnLT5DaGFubmVsLCB0bXBPZmZzZXRTaGlmdGVkKTsKKyAgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTY2FuIGVhY2ggb2Zmc2V0IHJlZ2lzdGVyIHRvIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzIHRhcmdldGVkLiAqLworICAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgY29ycmVzcG9uZGluZyBvZmZzZXQgbnVtYmVyIGlzIGRpc2FibGVkLiAgICAgICAqLworICAgICAgICBpZihfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSkpID09IF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgICAgeworICAgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8xLCBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOworICAgICAgICB9CisgICAgICAgIGlmKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8yKSkgPT0gX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWctPkNoYW5uZWwpKQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX1NldE9mZnNldFN0YXRlKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzIsIExMX0FEQ19PRkZTRVRfRElTQUJMRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKExMX0FEQ19HZXRPZmZzZXRDaGFubmVsKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfT0ZGU0VUXzMpKSA9PSBfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoc0NvbmZpZy0+Q2hhbm5lbCkpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMywgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgICAgfQorICAgICAgICBpZihfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoTExfQURDX0dldE9mZnNldENoYW5uZWwoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCkpID09IF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgICAgeworICAgICAgICAgIExMX0FEQ19TZXRPZmZzZXRTdGF0ZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF80LCBMTF9BRENfT0ZGU0VUX0RJU0FCTEUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBvbmx5IHdoZW4gQURDIGlzIGRpc2FibGVkOiAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIEludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOiBWYmF0L1ZyZWZJbnQvVGVtcFNlbnNvciAgICAgICAgICAgICAgICAqLworICAgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgeworICAgICAgLyogU2V0IG1vZGUgc2luZ2xlLWVuZGVkIG9yIGRpZmZlcmVudGlhbCBpbnB1dCBvZiB0aGUgc2VsZWN0ZWQgQURDIGNoYW5uZWwgKi8KKyAgICAgIExMX0FEQ19TZXRDaGFubmVsU2luZ2xlRGlmZihoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZy0+Q2hhbm5lbCwgc0NvbmZpZy0+U2luZ2xlRGlmZik7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgZGlmZmVyZW50aWFsIG1vZGUgKi8KKyAgICAgIGlmIChzQ29uZmlnLT5TaW5nbGVEaWZmID09IEFEQ19ESUZGRVJFTlRJQUxfRU5ERUQpCisgICAgICB7CisgICAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLworICAgICAgICAvKiBOb3RlOiBBREMgY2hhbm5lbCBudW1iZXIgbWFza2VkIHdpdGggdmFsdWUgIjB4MUYiIHRvIGVuc3VyZSBzaGlmdCB2YWx1ZSB3aXRoaW4gMzIgYml0cyByYW5nZSAqLworICAgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgKHVpbnQzMl90KShfX0xMX0FEQ19ERUNJTUFMX05CX1RPX0NIQU5ORUwoKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQigodWludDMyX3Qpc0NvbmZpZy0+Q2hhbm5lbCkgKyAxVUwpICYgMHgxRlVMKSksIHNDb25maWctPlNhbXBsaW5nVGltZSk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZiYXQvVnJlZkludC9UZW1wU2Vuc29yLiAgKi8KKyAgICAgIC8qIElmIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQsIGVuYWJsZSBkZWRpY2F0ZWQgaW50ZXJuYWwgYnVmZmVycyBhbmQgICAgKi8KKyAgICAgIC8qIHBhdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIE5vdGU6IHRoZXNlIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAgICAgICAgICAgKi8KKyAgICAgIC8qIEhBTF9BRENfRGVJbml0KCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIAorICAgICAgaWYoX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChzQ29uZmlnLT5DaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsID0gTExfQURDX0dldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAgICAgICAKKyAgICAgICAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgY29tbW9uIHBhcmFtZXRlcnMgb25seSB3aGVuIGFsbCBBRENzICAgKi8KKyAgICAgICAgLyogb2YgdGhlIGNvbW1vbiBncm91cCBhcmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGggaGFzIGFscmVhZHkgYmVlbiBlbmFibGVkLCAqLworICAgICAgICAgIC8qIGJ5cGFzcyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgaWYgKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpICYmICgodG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsICYgTExfQURDX1BBVEhfSU5URVJOQUxfVEVNUFNFTlNPUikgPT0gMFVMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQURDX1RFTVBFUkFUVVJFX1NFTlNPUl9JTlNUQU5DRShoYWRjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgLyogRGVsYXkgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBzdGFiaWxpemF0aW9uIHRpbWUgKi8KKyAgICAgICAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgICAgICAgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSAyIHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5ICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgICAgICAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgICAgICAgICAgd2FpdF9sb29wX2luZGV4ID0gKChMTF9BRENfREVMQVlfVEVNUFNFTlNPUl9TVEFCX1VTIC8gMTBVTCkgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMFVMICogMlVMKSkpOworICAgICAgICAgICAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFVMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKHNDb25maWctPkNoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkgJiYgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUKSA9PSAwVUwpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChBRENfQkFUVEVSWV9WT0xUQUdFX0lOU1RBTkNFKGhhZGMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBMTF9BRENfU2V0Q29tbW9uUGF0aEludGVybmFsQ2goX19MTF9BRENfQ09NTU9OX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSwgTExfQURDX1BBVEhfSU5URVJOQUxfVkJBVCB8IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICYmICgodG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsICYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCkgPT0gMFVMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoQURDX1ZSRUZJTlRfSU5TVEFOQ0UoaGFkYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLCBMTF9BRENfUEFUSF9JTlRFUk5BTF9WUkVGSU5UIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlIHJlcXVlc3RlZCBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRoIGhhcyBhbHJlYWR5IGJlZW4gICAgICAgICAgKi8KKyAgICAgICAgLyogZW5hYmxlZCBhbmQgb3RoZXIgQURDIG9mIHRoZSBjb21tb24gZ3JvdXAgYXJlIGVuYWJsZWQsIGludGVybmFsICAgICAgKi8KKyAgICAgICAgLyogbWVhc3VyZW1lbnQgcGF0aHMgY2Fubm90IGJlIGVuYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgZWxzZSAgCisgICAgICAgIHsKKyAgICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0NPTkZJRyk7CisgICAgICAgICAgCisgICAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIElmIGEgY29udmVyc2lvbiBpcyBvbiBnb2luZyBvbiByZWd1bGFyIGdyb3VwLCBubyB1cGRhdGUgb24gcmVndWxhciAgICAgICAqLworICAvKiBjaGFubmVsIGNvdWxkIGJlIGRvbmUgb24gbmVpdGhlciBvZiB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KKyAgLyogcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGFuYWxvZyB3YXRjaGRvZy4KKyAgKiBAbm90ZSAgIFBvc3NpYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIG9uIHRoZSBmbHk6CisgICogICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzZWxlY3RlZCBhbmFsb2cgd2F0Y2hkb2csIHN1Y2Nlc3NpdmUgIAorICAqICAgICAgICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgCisgICogICAgICAgICBvZiBzdHJ1Y3R1cmUgIkFEQ19BbmFsb2dXREdDb25mVHlwZURlZiIgb24gdGhlIGZseSwgd2l0aG91dCByZXNldHRpbmcgCisgICogICAgICAgICB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGUuCisgICogICAgICAgICBGb3IgcGFyYW1ldGVycyBjb25zdHJhaW50cywgc2VlIGNvbW1lbnRzIG9mIHN0cnVjdHVyZSAKKyAgKiAgICAgICAgICJBRENfQW5hbG9nV0RHQ29uZlR5cGVEZWYiLgorICAqIEBub3RlICAgT24gdGhpcyBTVE0zMiBzZXJpZSwgYW5hbG9nIHdhdGNoZG9nIHRocmVzaG9sZHMgY2Fubm90IGJlIG1vZGlmaWVkCisgICogICAgICAgICB3aGlsZSBBREMgY29udmVyc2lvbiBpcyBvbiBnb2luZy4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHBhcmFtIEFuYWxvZ1dER0NvbmZpZyBTdHJ1Y3R1cmUgb2YgQURDIGFuYWxvZyB3YXRjaGRvZyBjb25maWd1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDX0FuYWxvZ1dER0NvbmZpZyhBRENfSGFuZGxlVHlwZURlZiogaGFkYywgQURDX0FuYWxvZ1dER0NvbmZUeXBlRGVmKiBBbmFsb2dXREdDb25maWcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0bXBBV0RIaWdoVGhyZXNob2xkU2hpZnRlZDsKKyAgdWludDMyX3QgdG1wQVdETG93VGhyZXNob2xkU2hpZnRlZDsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQU5BTE9HX1dBVENIRE9HX05VTUJFUihBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfQU5BTE9HX1dBVENIRE9HX01PREUoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoQW5hbG9nV0RHQ29uZmlnLT5JVE1vZGUpKTsKKyAgCisgIGlmKChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFRykgICAgIHx8CisgICAgIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDKSAgIHx8CisgICAgIChBbmFsb2dXREdDb25maWctPldhdGNoZG9nTW9kZSA9PSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDKSAgKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DSEFOTkVMKGhhZGMsIEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkpOworICB9CisgIAorICAvKiBWZXJpZnkgdGhyZXNob2xkcyByYW5nZSAqLworICBpZiAoaGFkYy0+SW5pdC5PdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkKKyAgeworICAgIC8qIENhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGVuYWJsZWQ6IGRlcGVuZGluZyBvbiByYXRpbyBhbmQgc2hpZnQgY29uZmlndXJhdGlvbiwKKyAgICAgICBhbmFsb2cgd2F0Y2hkb2cgdGhyZXNob2xkcyBjYW4gYmUgaGlnaGVyIHRoYW4gQURDIHJlc29sdXRpb24uCisgICAgICAgVmVyaWZ5IGlmIHRocmVzaG9sZHMgYXJlIHdpdGhpbiBtYXhpbXVtIHRocmVzaG9sZHMgcmFuZ2UuICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfUkVTT0xVVElPTl8xMkIsIEFuYWxvZ1dER0NvbmZpZy0+SGlnaFRocmVzaG9sZCkpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQURDX1JFU09MVVRJT05fMTJCLCBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFZlcmlmeSBpZiB0aHJlc2hvbGRzIGFyZSB3aXRoaW4gdGhlIHNlbGVjdGVkIEFEQyByZXNvbHV0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SQU5HRShBRENfR0VUX1JFU09MVVRJT04oaGFkYyksIEFuYWxvZ1dER0NvbmZpZy0+SGlnaFRocmVzaG9sZCkpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfUkFOR0UoQURDX0dFVF9SRVNPTFVUSU9OKGhhZGMpLCBBbmFsb2dXREdDb25maWctPkxvd1RocmVzaG9sZCkpOworICB9CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogUGFyYW1ldGVycyB1cGRhdGUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCB3aGVuIEFEQyBpcyBkaXNhYmxlZCBvciBlbmFibGVkIHdpdGhvdXQgICAqLworICAvKiBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQ6ICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQW5hbG9nIHdhdGNoZG9nIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9IExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIGlmICggICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKQorICAgICAgJiYgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpCisgICAgICkKKyAgeworICAgIC8qIEFuYWxvZyB3YXRjaGRvZyBjb25maWd1cmF0aW9uICovCisgICAgaWYoQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ051bWJlciA9PSBBRENfQU5BTE9HV0FUQ0hET0dfMSkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIGFuYWxvZyB3YXRjaGRvZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gU2V0IHRoZSBhbmFsb2cgd2F0Y2hkb2cgZW5hYmxlIG1vZGU6IG9uZSBvciBvdmVyYWxsIGdyb3VwIG9mICAgICAgKi8KKyAgICAgIC8qICAgIGNoYW5uZWxzLCBvbiBncm91cHMgcmVndWxhciBhbmQtb3IgaW5qZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBzd2l0Y2goQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUc6CisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX0FXRDEsIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsLCBMTF9BRENfR1JPVVBfUkVHVUxBUikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX0lOSkVDOgorICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLCBfX0xMX0FEQ19BTkFMT0dXRF9DSEFOTkVMX0dST1VQKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCwgTExfQURDX0dST1VQX0lOSkVDVEVEKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19TSU5HTEVfUkVHSU5KRUM6CisgICAgICAgICAgTExfQURDX1NldEFuYWxvZ1dETW9uaXRDaGFubmVscyhoYWRjLT5JbnN0YW5jZSwgTExfQURDX0FXRDEsIF9fTExfQURDX0FOQUxPR1dEX0NIQU5ORUxfR1JPVVAoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsLCBMTF9BRENfR1JPVVBfUkVHVUxBUl9JTkpFQ1RFRCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfQUxMX1JFRzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9JTkpFQzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfSU5KKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUdJTkpFQzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBMTF9BRENfQVdEMSwgTExfQURDX0FXRF9BTExfQ0hBTk5FTFNfUkVHX0lOSik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBkZWZhdWx0OiAvKiBBRENfQU5BTE9HV0FUQ0hET0dfTk9ORSAqLworICAgICAgICAgIExMX0FEQ19TZXRBbmFsb2dXRE1vbml0Q2hhbm5lbHMoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19BV0QxLCBMTF9BRENfQVdEX0RJU0FCTEUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBTaGlmdCB0aGUgb2Zmc2V0IGluIGZ1bmN0aW9uIG9mIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbjogICAgICAgICAqLworICAgICAgLyogVGhyZXNob2xkcyBoYXZlIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpICAgKi8KKyAgICAgIC8qIGFyZSBzZXQgdG8gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICAgICAgdG1wQVdESGlnaFRocmVzaG9sZFNoaWZ0ZWQgPSBBRENfQVdEMVRIUkVTSE9MRF9TSElGVF9SRVNPTFVUSU9OKGhhZGMsIEFuYWxvZ1dER0NvbmZpZy0+SGlnaFRocmVzaG9sZCk7CisgICAgICB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkICA9IEFEQ19BV0QxVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIHZhbHVlIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgKi8KKyAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoaGFkYy0+SW5zdGFuY2UsIEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIsIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkLCB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkKTsKKyAgICAgIAorICAgICAgLyogVXBkYXRlIHN0YXRlLCBjbGVhciBwcmV2aW91cyByZXN1bHQgcmVsYXRlZCB0byBBV0QxICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMSk7CisgICAgICAKKyAgICAgIC8qIENsZWFyIGZsYWcgQURDIGFuYWxvZyB3YXRjaGRvZyAqLworICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovCisgICAgICAvKiB0byB1c2UgZm9yIEhBTF9BRENfSVJRSGFuZGxlcigpIG9yIEhBTF9BRENfUG9sbEZvckV2ZW50KCkgICAgICAgICAgKi8KKyAgICAgIC8qIChpbiBjYXNlIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBBREMgb3BlcmF0aW9ucykuICAgICAgICAgICAgICAgICAqLworICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIAorICAgICAgLyogQ29uZmlndXJlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgaW50ZXJydXB0ICovCisgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICB7CisgICAgICAgIExMX0FEQ19FbmFibGVJVF9BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QxKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2FzZSBvZiBBRENfQU5BTE9HV0FUQ0hET0dfMiBvciBBRENfQU5BTE9HV0FUQ0hET0dfMyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2goQW5hbG9nV0RHQ29uZmlnLT5XYXRjaGRvZ01vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9SRUc6CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX1NJTkdMRV9JTkpFQzoKKyAgICAgICAgY2FzZSBBRENfQU5BTE9HV0FUQ0hET0dfU0lOR0xFX1JFR0lOSkVDOgorICAgICAgICAgIC8qIFVwZGF0ZSBBV0QgYnkgYml0ZmllbGQgdG8ga2VlcCB0aGUgcG9zc2liaWxpdHkgdG8gbW9uaXRvciAgICAgICAgKi8KKyAgICAgICAgICAvKiBzZXZlcmFsIGNoYW5uZWxzIGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICovCisgICAgICAgICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpCisgICAgICAgICAgeworICAgICAgICAgICAgU0VUX0JJVChoYWRjLT5JbnN0YW5jZS0+QVdEMkNSLCAoMVVMIDw8IChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoQW5hbG9nV0RHQ29uZmlnLT5DaGFubmVsKSAmIDB4MUZVTCkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaGFkYy0+SW5zdGFuY2UtPkFXRDNDUiwgKDFVTCA8PCAoX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKEFuYWxvZ1dER0NvbmZpZy0+Q2hhbm5lbCkgJiAweDFGVUwpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfUkVHOgorICAgICAgICBjYXNlIEFEQ19BTkFMT0dXQVRDSERPR19BTExfSU5KRUM6CisgICAgICAgIGNhc2UgQURDX0FOQUxPR1dBVENIRE9HX0FMTF9SRUdJTkpFQzoKKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLCBMTF9BRENfQVdEX0FMTF9DSEFOTkVMU19SRUdfSU5KKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDogLyogQURDX0FOQUxPR1dBVENIRE9HX05PTkUgKi8KKyAgICAgICAgICBMTF9BRENfU2V0QW5hbG9nV0RNb25pdENoYW5uZWxzKGhhZGMtPkluc3RhbmNlLCBBbmFsb2dXREdDb25maWctPldhdGNoZG9nTnVtYmVyLCBMTF9BRENfQVdEX0RJU0FCTEUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBTaGlmdCB0aGUgdGhyZXNob2xkcyBpbiBmdW5jdGlvbiBvZiB0aGUgc2VsZWN0ZWQgQURDIHJlc29sdXRpb24gICAgICAqLworICAgICAgLyogaGF2ZSB0byBiZSBsZWZ0LWFsaWduZWQgb24gYml0IDcsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMCAgKi8KKyAgICAgIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkID0gQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5IaWdoVGhyZXNob2xkKTsKKyAgICAgIHRtcEFXRExvd1RocmVzaG9sZFNoaWZ0ZWQgID0gQURDX0FXRDIzVEhSRVNIT0xEX1NISUZUX1JFU09MVVRJT04oaGFkYywgQW5hbG9nV0RHQ29uZmlnLT5Mb3dUaHJlc2hvbGQpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGFuYWxvZyB3YXRjaGRvZyB0aHJlc2hvbGRzIHZhbHVlIG9mIGJvdGggdGhyZXNob2xkcyBoaWdoIGFuZCBsb3cgKi8KKyAgICAgIExMX0FEQ19Db25maWdBbmFsb2dXRFRocmVzaG9sZHMoaGFkYy0+SW5zdGFuY2UsIEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIsIHRtcEFXREhpZ2hUaHJlc2hvbGRTaGlmdGVkLCB0bXBBV0RMb3dUaHJlc2hvbGRTaGlmdGVkKTsKKyAgICAgIAorICAgICAgaWYgKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzIpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gQVdEMiAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMik7CisgICAgICAgIAorICAgICAgICAvKiBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgKi8KKyAgICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovCisgICAgICAgIC8qIHRvIHVzZSBmb3IgSEFMX0FEQ19JUlFIYW5kbGVyKCkgb3IgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoKSAgICAgICAgICAqLworICAgICAgICAvKiAoaW4gY2FzZSBsZWZ0IGVuYWJsZWQgYnkgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QyKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbmZpZ3VyZSBBREMgYW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMihoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QyKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogKEFuYWxvZ1dER0NvbmZpZy0+V2F0Y2hkb2dOdW1iZXIgPT0gQURDX0FOQUxPR1dBVENIRE9HXzMpICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gQVdEMyAqLworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfQVdEMyk7CisgICAgICAgIAorICAgICAgICAvKiBDbGVhciBmbGFnIEFEQyBhbmFsb2cgd2F0Y2hkb2cgKi8KKyAgICAgICAgLyogTm90ZTogRmxhZyBjbGVhcmVkIENsZWFyIHRoZSBBREMgQW5hbG9nIHdhdGNoZG9nIGZsYWcgdG8gYmUgcmVhZHkgICovCisgICAgICAgIC8qIHRvIHVzZSBmb3IgSEFMX0FEQ19JUlFIYW5kbGVyKCkgb3IgSEFMX0FEQ19Qb2xsRm9yRXZlbnQoKSAgICAgICAgICAqLworICAgICAgICAvKiAoaW4gY2FzZSBsZWZ0IGVuYWJsZWQgYnkgcHJldmlvdXMgQURDIG9wZXJhdGlvbnMpLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTExfQURDX0NsZWFyRmxhZ19BV0QzKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbmZpZ3VyZSBBREMgYW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCAqLworICAgICAgICBpZihBbmFsb2dXREdDb25maWctPklUTW9kZSA9PSBFTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBMTF9BRENfRW5hYmxlSVRfQVdEMyhoYWRjLT5JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTExfQURDX0Rpc2FibGVJVF9BV0QzKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAvKiBJZiBhIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIgb3IgaW5qZWN0ZWQsIG5vIHVwZGF0ZSAgKi8KKyAgLyogY291bGQgYmUgZG9uZSBvbiBuZWl0aGVyIG9mIHRoZSBBV0QgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgcGFyYW1ldGVycy4gICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQURDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgQURDIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBzdGF0ZSBhbmQgZXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgIAorICAgIHBlcmlwaGVyYWwuCisgICAgICAoKykgQ2hlY2sgdGhlIEFEQyBzdGF0ZQorICAgICAgKCspIENoZWNrIHRoZSBBREMgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAbm90ZSAgIEFEQyBzdGF0ZSBtYWNoaW5lIGlzIG1hbmFnZWQgYnkgYml0ZmllbGRzLCBBREMgc3RhdHVzIG11c3QgYmUgCisgICogICAgICAgICBjb21wYXJlZCB3aXRoIHN0YXRlcyBiaXRzLgorICAqICAgICAgICAgRm9yIGV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICogICAgICAgICAgICIgaWYgKChIQUxfQURDX0dldFN0YXRlKGhhZGMxKSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkgIgorICAqICAgICAgICAgICAiIGlmICgoSEFMX0FEQ19HZXRTdGF0ZShoYWRjMSkgJiBIQUxfQURDX1NUQVRFX0FXRDEpICE9IDBVTCkgIgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEFEQyBoYW5kbGUgc3RhdGUgKGJpdGZpZWxkIG9uIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldFN0YXRlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUmV0dXJuIEFEQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhhZGMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQURDIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgQURDIGVycm9yIGNvZGUgKGJpdGZpZWxkIG9uIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQURDX0dldEVycm9yKEFEQ19IYW5kbGVUeXBlRGVmICpoYWRjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgcmV0dXJuIGhhZGMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENfUHJpdmF0ZV9GdW5jdGlvbnMgQURDIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gQ29udmVyc2lvbkdyb3VwIEFEQyBncm91cCByZWd1bGFyIGFuZC9vciBpbmplY3RlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19SRUdVTEFSX0dST1VQICAgICAgICAgICBBREMgcmVndWxhciBjb252ZXJzaW9uIHR5cGUuCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX0lOSkVDVEVEX0dST1VQICAgICAgICAgIEFEQyBpbmplY3RlZCBjb252ZXJzaW9uIHR5cGUuCisgICogICAgICAgICAgICBAYXJnIEByZWYgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVAgIEFEQyByZWd1bGFyIGFuZCBpbmplY3RlZCBjb252ZXJzaW9uIHR5cGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0NvbnZlcnNpb25TdG9wKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBDb252ZXJzaW9uR3JvdXApCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgQ29udmVyc2lvbl9UaW1lb3V0X0NQVV9jeWNsZXMgPSAwVUw7CisgIHVpbnQzMl90IGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCA9IENvbnZlcnNpb25Hcm91cDsKKyAgdWludDMyX3QgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhcjsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT05WRVJTSU9OX0dST1VQKENvbnZlcnNpb25Hcm91cCkpOworICAKKyAgLyogVmVyaWZpY2F0aW9uIGlmIEFEQyBpcyBub3QgYWxyZWFkeSBzdG9wcGVkIChvbiByZWd1bGFyIGFuZCBpbmplY3RlZCAgICAgICovCisgIC8qIGdyb3VwcykgdG8gYnlwYXNzIHRoaXMgZnVuY3Rpb24gaWYgbm90IG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9IExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIGlmICggICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgIT0gMFVMKQorICAgICAgfHwgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCAhPSAwVUwpCisgICAgICkKKyAgeworICAgIC8qIFBhcnRpY3VsYXIgY2FzZSBvZiBjb250aW51b3VzIGF1dG8taW5qZWN0aW9uIG1vZGUgY29tYmluZWQgd2l0aCAgICAgICAgKi8KKyAgICAvKiBhdXRvLWRlbGF5IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW4gYXV0by1pbmplY3Rpb24gbW9kZSwgcmVndWxhciBncm91cCBzdG9wIEFEQ19DUl9BRFNUUCBpcyB1c2VkIChub3QgICAqLworICAgIC8qIGluamVjdGVkIGdyb3VwIHN0b3AgQURDX0NSX0pBRFNUUCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBQcm9jZWR1cmUgdG8gYmUgZm9sbG93ZWQ6IFdhaXQgdW50aWwgSkVPUz0xLCBjbGVhciBKRU9TLCBzZXQgQURTVFA9MSAgICovCisgICAgLyogKHNlZSByZWZlcmVuY2UgbWFudWFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggICAgKChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiAmIEFEQ19DRkdSX0pBVVRPKSAhPSAwVUwpCisgICAgICAgICAmJiAoaGFkYy0+SW5pdC5Db250aW51b3VzQ29udk1vZGUgPT0gRU5BQkxFKQorICAgICAgICAgJiYgKGhhZGMtPkluaXQuTG93UG93ZXJBdXRvV2FpdCA9PSBFTkFCTEUpCisgICAgICAgKQorICAgIHsKKyAgICAgIC8qIFVzZSBzdG9wIG9mIHJlZ3VsYXIgZ3JvdXAgKi8KKyAgICAgIGNvbnZlcnNpb25fZ3JvdXBfcmVhc3NpZ25lZCA9IEFEQ19SRUdVTEFSX0dST1VQOworICAgICAgCisgICAgICAvKiBXYWl0IHVudGlsIEpFT1M9MSAobWF4aW11bSBUaW1lb3V0OiA0IGluamVjdGVkIGNvbnZlcnNpb25zKSAqLworICAgICAgd2hpbGUoX19IQUxfQURDX0dFVF9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT1MpID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzID49IChBRENfQ09OVkVSU0lPTl9USU1FX01BWF9DUFVfQ1lDTEVTICogNFVMKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAgIAorICAgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIENvbnZlcnNpb25fVGltZW91dF9DUFVfY3ljbGVzICsrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBDbGVhciBKRU9TICovCisgICAgICBfX0hBTF9BRENfQ0xFQVJfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKTsKKyAgICB9CisgICAgCisgICAgLyogU3RvcCBwb3RlbnRpYWwgY29udmVyc2lvbiBvbiBnb2luZyBvbiBBREMgZ3JvdXAgcmVndWxhciAqLworICAgIGlmIChjb252ZXJzaW9uX2dyb3VwX3JlYXNzaWduZWQgIT0gQURDX0lOSkVDVEVEX0dST1VQKQorICAgIHsKKyAgICAgIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gc2V0IEFEU1RQIG9ubHkgd2hlbiBBRFNUQVJUPTEgYW5kIEFERElTPTAgKi8KKyAgICAgIGlmIChMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTdG9wIEFEQyBncm91cCByZWd1bGFyIGNvbnZlcnNpb24gKi8KKyAgICAgICAgICBMTF9BRENfUkVHX1N0b3BDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZCAqLworICAgIGlmIChjb252ZXJzaW9uX2dyb3VwX3JlYXNzaWduZWQgIT0gQURDX1JFR1VMQVJfR1JPVVApCisgICAgeworICAgICAgLyogU29mdHdhcmUgaXMgYWxsb3dlZCB0byBzZXQgSkFEU1RQIG9ubHkgd2hlbiBKQURTVEFSVD0xIGFuZCBBRERJUz0wICovCisgICAgICBpZiAoTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIGlmIChMTF9BRENfSXNEaXNhYmxlT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgLyogU3RvcCBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udmVyc2lvbiAqLworICAgICAgICAgIExMX0FEQ19JTkpfU3RvcENvbnZlcnNpb24oaGFkYy0+SW5zdGFuY2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFNlbGVjdGlvbiBvZiBzdGFydCBhbmQgc3RvcCBiaXRzIHdpdGggcmVzcGVjdCB0byB0aGUgcmVndWxhciBvciBpbmplY3RlZCBncm91cCAqLworICAgIHN3aXRjaChjb252ZXJzaW9uX2dyb3VwX3JlYXNzaWduZWQpCisgICAgeworICAgIGNhc2UgQURDX1JFR1VMQVJfSU5KRUNURURfR1JPVVA6CisgICAgICAgIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCA9IChBRENfQ1JfQURTVEFSVCB8IEFEQ19DUl9KQURTVEFSVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQURDX0lOSkVDVEVEX0dST1VQOgorICAgICAgICB0bXBfQURDX0NSX0FEU1RBUlRfSkFEU1RBUlQgPSBBRENfQ1JfSkFEU1RBUlQ7CisgICAgICAgIGJyZWFrOworICAgIC8qIENhc2UgQURDX1JFR1VMQVJfR1JPVVAgb25seSovCisgICAgZGVmYXVsdDoKKyAgICAgICAgdG1wX0FEQ19DUl9BRFNUQVJUX0pBRFNUQVJUID0gQURDX0NSX0FEU1RBUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBjb252ZXJzaW9uIGVmZmVjdGl2ZWx5IHN0b3BwZWQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgCisgICAgd2hpbGUoKGhhZGMtPkluc3RhbmNlLT5DUiAmIHRtcF9BRENfQ1JfQURTVEFSVF9KQURTVEFSVCkgIT0gMFVMKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPiBBRENfU1RPUF9DT05WRVJTSU9OX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMuCisgICogQG5vdGUgICBQcmVyZXF1aXNpdGUgY29uZGl0aW9uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uOiBBREMgbXVzdCBiZSBkaXNhYmxlZAorICAqICAgICAgICAgYW5kIHZvbHRhZ2UgcmVndWxhdG9yIG11c3QgYmUgZW5hYmxlZCAoZG9uZSBpbnRvIEhBTF9BRENfSW5pdCgpKS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgQURDX0VuYWJsZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICAKKyAgLyogQURDIGVuYWJsZSBhbmQgd2FpdCBmb3IgQURDIHJlYWR5IChpbiBjYXNlIG9mIEFEQyBpcyBkaXNhYmxlZCBvciAgICAgICAgICovCisgIC8qIGVuYWJsaW5nIHBoYXNlIG5vdCB5ZXQgY29tcGxldGVkOiBmbGFnIEFEQyByZWFkeSBub3QgeWV0IHNldCkuICAgICAgICAgICAqLworICAvKiBUaW1lb3V0IGltcGxlbWVudGVkIHRvIG5vdCBiZSBzdHVjayBpZiBBREMgY2Fubm90IGJlIGVuYWJsZWQgKHBvc3NpYmxlICAgKi8KKyAgLyogY2F1c2VzOiBBREMgY2xvY2sgbm90IHJ1bm5pbmcsIC4uLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmIChMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjb25kaXRpb25zIHRvIGVuYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DUiAmIChBRENfQ1JfQURDQUwgfCBBRENfQ1JfSkFEU1RQIHwgQURDX0NSX0FEU1RQIHwgQURDX0NSX0pBRFNUQVJUIHwgQURDX0NSX0FEU1RBUlQgfCBBRENfQ1JfQURESVMgfCBBRENfQ1JfQURFTikpICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgCisgICAgLyogRW5hYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIExMX0FEQ19FbmFibGUoaGFkYy0+SW5zdGFuY2UpOworICAgIAorICAgIC8qIFdhaXQgZm9yIEFEQyBlZmZlY3RpdmVseSBlbmFibGVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAKKyAgICB3aGlsZShfX0hBTF9BRENfR0VUX0ZMQUcoaGFkYywgQURDX0ZMQUdfUkRZKSA9PSAwVUwpCisgICAgeworICAgICAgLyogIElmIEFERU4gYml0IGlzIHNldCBsZXNzIHRoYW4gNCBBREMgY2xvY2sgY3ljbGVzIGFmdGVyIHRoZSBBRENBTCBiaXQgCisgICAgICAgICAgaGFzIGJlZW4gY2xlYXJlZCAoYWZ0ZXIgYSBjYWxpYnJhdGlvbiksIEFERU4gYml0IGlzIHJlc2V0IGJ5IHRoZSAKKyAgICAgICAgICBjYWxpYnJhdGlvbiBsb2dpYy4KKyAgICAgICAgICBUaGUgd29ya2Fyb3VuZCBpcyB0byBjb250aW51ZSBzZXR0aW5nIEFERU4gdW50aWwgQURSRFkgaXMgYmVjb21lcyAxLgorICAgICAgICAgIEFkZGl0aW9uYWxseSwgQURDX0VOQUJMRV9USU1FT1VUIGlzIGRlZmluZWQgdG8gZW5jb21wYXNzIHRoaXMKKyAgICAgICAgICA0IEFEQyBjbG9jayBjeWNsZSBkdXJhdGlvbiAqLworICAgICAgLyogTm90ZTogVGVzdCBvZiBBREMgZW5hYmxlZCByZXF1aXJlZCBkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludCB0byAgICAgKi8KKyAgICAgIC8qICAgICAgIG5vdCBlbmFibGUgQURDIGlmIGFscmVhZHkgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZihMTF9BRENfSXNFbmFibGVkKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0FEQ19FbmFibGUoaGFkYy0+SW5zdGFuY2UpOworICAgICAgfQorICAgICAgCisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBBRENfRU5BQkxFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICAgCisgIC8qIFJldHVybiBIQUwgc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDLgorICAqIEBub3RlICAgUHJlcmVxdWlzaXRlIGNvbmRpdGlvbiB0byB1c2UgdGhpcyBmdW5jdGlvbjogQURDIGNvbnZlcnNpb25zIG11c3QgYmUKKyAgKiAgICAgICAgIHN0b3BwZWQuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEFEQ19EaXNhYmxlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIGNvbnN0IHVpbnQzMl90IHRtcF9hZGNfaXNfZGlzYWJsZV9vbl9nb2luZyA9IExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgCisgIC8qIFZlcmlmaWNhdGlvbiBpZiBBREMgaXMgbm90IGFscmVhZHkgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlOiBmb3JiaWRkZW4gdG8gZGlzYWJsZSBBREMgKHNldCBiaXQgQURDX0NSX0FERElTKSBpZiBBREMgaXMgYWxyZWFkeSAgKi8KKyAgLyogICAgICAgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmICggICAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAgJiYgKHRtcF9hZGNfaXNfZGlzYWJsZV9vbl9nb2luZyA9PSAwVUwpCisgICAgICkKKyAgeworICAgIC8qIENoZWNrIGlmIGNvbmRpdGlvbnMgdG8gZGlzYWJsZSB0aGUgQURDIGFyZSBmdWxmaWxsZWQgKi8KKyAgICBpZigoaGFkYy0+SW5zdGFuY2UtPkNSICYgKEFEQ19DUl9KQURTVEFSVCB8IEFEQ19DUl9BRFNUQVJUIHwgQURDX0NSX0FERU4pKSA9PSBBRENfQ1JfQURFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgICAgTExfQURDX0Rpc2FibGUoaGFkYy0+SW5zdGFuY2UpOworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0VPU01QIHwgQURDX0ZMQUdfUkRZKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgCisgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gQURDIHBlcmlwaGVyYWwgaW50ZXJuYWwgZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+RXJyb3JDb2RlLCBIQUxfQURDX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgIAorICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgCisgICAgLyogV2FpdCBmb3IgQURDIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgLyogR2V0IHRpY2sgY291bnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIAorICAgIHdoaWxlKChoYWRjLT5JbnN0YW5jZS0+Q1IgJiBBRENfQ1JfQURFTikgIT0gMFVMKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEFEQ19ESVNBQkxFX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNldCBBREMgZXJyb3IgY29kZSB0byBBREMgcGVyaXBoZXJhbCBpbnRlcm5hbCBlcnJvciAqLworICAgICAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogUmV0dXJuIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgQURDX0RNQUNvbnZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBSZXRyaWV2ZSBBREMgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBETUEgaGFuZGxlICovCisgIEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjID0gKCBBRENfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICAKKyAgLyogVXBkYXRlIHN0YXRlIG1hY2hpbmUgb24gY29udmVyc2lvbiBzdGF0dXMgaWYgbm90IGluIGVycm9yIHN0YXRlICovCisgIGlmKChoYWRjLT5TdGF0ZSAmIChIQUxfQURDX1NUQVRFX0VSUk9SX0lOVEVSTkFMIHwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpKSA9PSAwVUwpCisgIHsKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfRU9DKTsKKyAgICAKKyAgICAvKiBEZXRlcm1pbmUgd2hldGhlciBhbnkgZnVydGhlciBjb252ZXJzaW9uIHVwY29taW5nIG9uIGdyb3VwIHJlZ3VsYXIgICAgICovCisgICAgLyogYnkgZXh0ZXJuYWwgdHJpZ2dlciwgY29udGludW91cyBtb2RlIG9yIHNjYW4gc2VxdWVuY2Ugb24gZ29pbmcgICAgICAgICAqLworICAgIC8qIHRvIGRpc2FibGUgaW50ZXJydXB0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJcyBpdCB0aGUgZW5kIG9mIHRoZSByZWd1bGFyIHNlcXVlbmNlID8gKi8KKyAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5JU1IgJiBBRENfRkxBR19FT1MpICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBBcmUgY29udmVyc2lvbnMgc29mdHdhcmUtdHJpZ2dlcmVkID8gKi8KKyAgICAgIGlmKExMX0FEQ19SRUdfSXNUcmlnZ2VyU291cmNlU1dTdGFydChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAgeworICAgICAgICAvKiBJcyBDT05UIGJpdCBzZXQgPyAqLworICAgICAgICBpZihSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQ09OVCkgPT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgLyogQ09OVCBiaXQgaXMgbm90IHNldCwgbm8gbW9yZSBjb252ZXJzaW9ucyBleHBlY3RlZCAqLworICAgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgICAgICAgaWYoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gMFVMKQorICAgICAgICAgIHsgCisgICAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERNQSBFbmQgb2YgVHJhbnNmZXIgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgYnV0IGNvbnZlcnNpb25zIHNlcXVlbmNlCisgICAgICAgICBpcyBub3Qgb3Zlci4gSWYgRE1BQ0ZHIGlzIHNldCB0byAwLCBjb252ZXJzaW9ucyBhcmUgc3RvcHBlZC4gKi8KKyAgICAgIGlmKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFDRkcpID09IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogRE1BQ0ZHIGJpdCBpcyBub3Qgc2V0LCBjb252ZXJzaW9ucyBhcmUgc3RvcHBlZC4gKi8KKyAgICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsKKyAgICAgICAgaWYoKGhhZGMtPlN0YXRlICYgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSkgPT0gMFVMKQorICAgICAgICB7IAorICAgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGFkYy0+Q29udkNwbHRDYWxsYmFjayhoYWRjKTsKKyNlbHNlCisgICAgSEFMX0FEQ19Db252Q3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UgLyogRE1BIGFuZC1vciBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCAqLworICB7CisgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBDYWxsIEhBTCBBREMgRXJyb3IgQ2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoYWRjLT5FcnJvckNhbGxiYWNrKGhhZGMpOworI2Vsc2UKKyAgICAgIEhBTF9BRENfRXJyb3JDYWxsYmFjayhoYWRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENhbGwgQURDIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGFkYy0+RE1BX0hhbmRsZS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suIAorICAqIEBwYXJhbSBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgQURDX0RNQUhhbGZDb252Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLworICBBRENfSGFuZGxlVHlwZURlZiogaGFkYyA9ICggQURDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIC8qIEhhbGYgY29udmVyc2lvbiBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0FEQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaGFkYy0+Q29udkhhbGZDcGx0Q2FsbGJhY2soaGFkYyk7CisjZWxzZQorICBIQUxfQURDX0NvbnZIYWxmQ3BsdENhbGxiYWNrKGhhZGMpOworI2VuZGlmIC8qIFVTRV9IQUxfQURDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEFEQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogUmV0cmlldmUgQURDIGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbnQgRE1BIGhhbmRsZSAqLworICBBRENfSGFuZGxlVHlwZURlZiogaGFkYyA9ICggQURDX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKKyAgCisgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9ETUEpOworICAKKyAgLyogU2V0IEFEQyBlcnJvciBjb2RlIHRvIERNQSBlcnJvciAqLworICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9ETUEpOworICAKKyAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhhZGMtPkVycm9yQ2FsbGJhY2soaGFkYyk7CisjZWxzZQorICBIQUxfQURDX0Vycm9yQ2FsbGJhY2soaGFkYyk7CisjZW5kaWYgLyogVVNFX0hBTF9BRENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfQURDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfYWRjX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9hZGNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYwOGJlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfYWRjX2V4LmMKQEAgLTAsMCArMSwxNjcxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9hZGNfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydG9yIChBREMpCisgICogICAgICAgICAgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBPcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgU3RhcnQsIHN0b3AsIGdldCByZXN1bHQgb2YgY29udmVyc2lvbnMgb2YgQURDIGdyb3VwIGluamVjdGVkLAorICAqICAgICAgICAgICAgICAgIHVzaW5nIDIgcG9zc2libGUgbW9kZXM6IHBvbGxpbmcsIGludGVycnVwdGlvbi4KKyAgKiAgICAgICAgICAgICArKyBDYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgKysrIEFEQyBhdXRvbWF0aWMgc2VsZi1jYWxpYnJhdGlvbgorICAqICAgICAgICAgICAgICAgKysrIENhbGlicmF0aW9uIGZhY3RvcnMgZ2V0IG9yIHNldAorICAqICAgICAgICAgICArIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICAgKysgQ2hhbm5lbHMgY29uZmlndXJhdGlvbiBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQKKyAgKiAgICAgICAgICAgKyBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgICArKyBBREMgZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgbWFuYWdlbWVudAorICAqICAgICAgICAgIE90aGVyIGZ1bmN0aW9ucyAoZ2VuZXJpYyBmdW5jdGlvbnMpIGFyZSBhdmFpbGFibGUgaW4gZmlsZQorICAqICAgICAgICAgICJzdG0zMndieHhfaGFsX2FkYy5jIi4KKyAgKgorICBAdmVyYmF0aW0KKyAgWy4uXSAKKyAgKEApIFNlY3Rpb25zICJBREMgcGVyaXBoZXJhbCBmZWF0dXJlcyIgYW5kICJIb3cgdG8gdXNlIHRoaXMgZHJpdmVyIiBhcmUKKyAgICAgIGF2YWlsYWJsZSBpbiBmaWxlIG9mIGdlbmVyaWMgZnVuY3Rpb25zICJzdG0zMndieHhfaGFsX2FkYy5jIi4KKyAgWy4uXQorICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeCBBRENFeAorICAqIEBicmllZiBBREMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0FEQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9Qcml2YXRlX0NvbnN0YW50cyBBREMgRXh0ZW5kZWQgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworCisjZGVmaW5lIEFEQ19KU1FSX0ZJRUxEUyAgKChBRENfSlNRUl9KTCB8IEFEQ19KU1FSX0pFWFRTRUwgfCBBRENfSlNRUl9KRVhURU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19KU1FSX0pTUTEgIHwgQURDX0pTUVJfSlNRMiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX0pTUVJfSlNRMyB8IEFEQ19KU1FSX0pTUTQgKSkgIC8qITwgQURDX0pTUVIgZmllbGRzIG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbnl0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlIHRoZSBBREMgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEZpeGVkIHRpbWVvdXQgdmFsdWUgZm9yIEFEQyBjYWxpYnJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWYWx1ZXMgZGVmaW5lZCB0byBiZSBoaWdoZXIgdGhhbiB3b3JzdCBjYXNlczogbWF4aW11bSByYXRpbyBiZXR3ZWVuIEFEQyAgICAqLworLyogYW5kIENQVSBjbG9jayBmcmVxdWVuY2llcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEV4YW1wbGUgb2YgcHJvZmlsZSBsb3cgZnJlcXVlbmN5IDogQURDIGZyZXF1ZW5jeSBhdCA0Ni45a0h6IChBREMgY2xvY2sgICAgICovCisvKiBzb3VyY2UgUExMIFNBSSAxMk1IeiwgQURDIGNsb2NrIHByZXNjYWxlciAyNTYpLCBDUFUgZnJlcXVlbmN5IDY0TUh6LiAgICAgICAqLworLyogQ2FsaWJyYXRpb24gdGltZSBtYXggPSAxMTYgLyBmQURDIChyZWZlciB0byBkYXRhc2hlZXQpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgID0gMTU4IDM3OSBDUFUgY3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFEQ19DQUxJQlJBVElPTl9USU1FT1VUICAgICAgICAgKDE1ODM3OVVMKSAgIC8qITwgQURDIGNhbGlicmF0aW9uIHRpbWUtb3V0IHZhbHVlICh1bml0OiBDUFUgY3ljbGVzKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBBREMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBBRENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAKKyAgICAgICgrKSBQZXJmb3JtIHRoZSBBREMgc2VsZi1jYWxpYnJhdGlvbiBmb3Igc2luZ2xlIG9yIGRpZmZlcmVudGlhbCBlbmRpbmcuCisgICAgICAoKykgR2V0IGNhbGlicmF0aW9uIGZhY3RvcnMgZm9yIHNpbmdsZSBvciBkaWZmZXJlbnRpYWwgZW5kaW5nLgorICAgICAgKCspIFNldCBjYWxpYnJhdGlvbiBmYWN0b3JzIGZvciBzaW5nbGUgb3IgZGlmZmVyZW50aWFsIGVuZGluZy4KKworICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgQURDIGdyb3VwIGluamVjdGVkLgorICAgICAgKCspIFN0b3AgY29udmVyc2lvbiBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICAgICAoKykgUG9sbCBmb3IgY29udmVyc2lvbiBjb21wbGV0ZSBvbiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICAgICAoKykgR2V0IHJlc3VsdCBvZiBBREMgZ3JvdXAgaW5qZWN0ZWQgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgKCspIFN0YXJ0IGNvbnZlcnNpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIGFuZCBlbmFibGUgaW50ZXJydXB0aW9ucy4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gb2YgQURDIGdyb3VwIGluamVjdGVkIGFuZCBkaXNhYmxlIGludGVycnVwdGlvbnMuCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUGVyZm9ybSBhbiBBREMgYXV0b21hdGljIHNlbGYtY2FsaWJyYXRpb24KKyAgKiAgICAgICAgIENhbGlicmF0aW9uIHByZXJlcXVpc2l0ZTogQURDIG11c3QgYmUgZGlzYWJsZWQgKGV4ZWN1dGUgdGhpcworICAqICAgICAgICAgZnVuY3Rpb24gYmVmb3JlIEhBTF9BRENfU3RhcnQoKSBvciBhZnRlciBIQUxfQURDX1N0b3AoKSApLgorICAqIEBwYXJhbSAgaGFkYyAgICAgICBBREMgaGFuZGxlCisgICogQHBhcmFtICBTaW5nbGVEaWZmIFNlbGVjdGlvbiBvZiBzaW5nbGUtZW5kZWQgb3IgZGlmZmVyZW50aWFsIGlucHV0CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgQURDX1NJTkdMRV9FTkRFRCAgICAgICBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgICogICAgICAgICAgIEBhcmcgQHJlZiBBRENfRElGRkVSRU5USUFMX0VOREVEIENoYW5uZWwgaW4gbW9kZSBpbnB1dCBkaWZmZXJlbnRpYWwgZW5kZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydChBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgU2luZ2xlRGlmZikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBDYWxpYnJhdGlvbiBwcmVyZXF1aXNpdGU6IEFEQyBtdXN0IGJlIGRpc2FibGVkLiAqLworICAKKyAgLyogRGlzYWJsZSB0aGUgQURDIChpZiBub3QgYWxyZWFkeSBkaXNhYmxlZCkgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgCisgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFR19CVVNZIHwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSwKKyAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwpOworICAgIAorICAgIC8qIFN0YXJ0IEFEQyBjYWxpYnJhdGlvbiBpbiBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgKi8KKyAgICBMTF9BRENfU3RhcnRDYWxpYnJhdGlvbihoYWRjLT5JbnN0YW5jZSwgU2luZ2xlRGlmZik7CisgICAgCisgICAgLyogV2FpdCBmb3IgY2FsaWJyYXRpb24gY29tcGxldGlvbiAqLworICAgIHdoaWxlKExMX0FEQ19Jc0NhbGlicmF0aW9uT25Hb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgIHsKKyAgICAgIHdhaXRfbG9vcF9pbmRleCsrOworICAgICAgaWYgKHdhaXRfbG9vcF9pbmRleCA+PSBBRENfQ0FMSUJSQVRJT05fVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0JVU1lfSU5URVJOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9CVVNZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICB9CisgIGVsc2UKKyAgeworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfSU5URVJOQUwpOworICAgIAorICAgIC8qIE5vdGU6IE5vIG5lZWQgdG8gdXBkYXRlIHZhcmlhYmxlICJ0bXBfaGFsX3N0YXR1cyIgaGVyZTogYWxyZWFkeSBzZXQgICAgKi8KKyAgICAvKiAgICAgICB0byBzdGF0ZSAiSEFMX0VSUk9SIiBieSBmdW5jdGlvbiBkaXNhYmxpbmcgdGhlIEFEQy4gICAgICAgICAgICAgICovCisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBjYWxpYnJhdGlvbiBmYWN0b3IuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZS4KKyAgKiBAcGFyYW0gU2luZ2xlRGlmZiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25seToKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEFEQ19TSU5HTEVfRU5ERUQgICAgICAgQ2hhbm5lbCBpbiBtb2RlIGlucHV0IHNpbmdsZSBlbmRlZAorICAqICAgICAgICAgICBAYXJnIEByZWYgQURDX0RJRkZFUkVOVElBTF9FTkRFRCBDaGFubmVsIGluIG1vZGUgaW5wdXQgZGlmZmVyZW50aWFsIGVuZGVkCisgICogQHJldHZhbCBDYWxpYnJhdGlvbiB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9BRENFeF9DYWxpYnJhdGlvbl9HZXRWYWx1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgU2luZ2xlRGlmZikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TSU5HTEVfRElGRkVSRU5USUFMKFNpbmdsZURpZmYpKTsgCisgIAorICAvKiBSZXR1cm4gdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiB2YWx1ZSAqLworICAgIHJldHVybiBMTF9BRENfR2V0Q2FsaWJyYXRpb25GYWN0b3IoaGFkYy0+SW5zdGFuY2UsIFNpbmdsZURpZmYpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgY2FsaWJyYXRpb24gZmFjdG9yIHRvIG92ZXJ3cml0ZSBhdXRvbWF0aWMgY29udmVyc2lvbiByZXN1bHQuCisgICogICAgICAgICBBREMgbXVzdCBiZSBlbmFibGVkIGFuZCBubyBjb252ZXJzaW9uIGlzIG9uZ29pbmcuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSBTaW5nbGVEaWZmIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmx5OgorICAqICAgICAgICAgICBAYXJnIEByZWYgQURDX1NJTkdMRV9FTkRFRCAgICAgICBDaGFubmVsIGluIG1vZGUgaW5wdXQgc2luZ2xlIGVuZGVkCisgICogICAgICAgICAgIEBhcmcgQHJlZiBBRENfRElGRkVSRU5USUFMX0VOREVEIENoYW5uZWwgaW4gbW9kZSBpbnB1dCBkaWZmZXJlbnRpYWwgZW5kZWQKKyAgKiBAcGFyYW0gQ2FsaWJyYXRpb25GYWN0b3IgQ2FsaWJyYXRpb24gZmFjdG9yIChjb2RlZCBvbiA3IGJpdHMgbWF4aW11bSkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0NhbGlicmF0aW9uX1NldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBTaW5nbGVEaWZmLCB1aW50MzJfdCBDYWxpYnJhdGlvbkZhY3RvcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1NJTkdMRV9ESUZGRVJFTlRJQUwoU2luZ2xlRGlmZikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NBTEZBQ1QoQ2FsaWJyYXRpb25GYWN0b3IpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiBWZXJpZmljYXRpb24gb2YgaGFyZHdhcmUgY29uc3RyYWludHMgYmVmb3JlIG1vZGlmeWluZyB0aGUgY2FsaWJyYXRpb24gICAgKi8KKyAgLyogZmFjdG9ycyByZWdpc3RlcjogQURDIG11c3QgYmUgZW5hYmxlZCwgbm8gY29udmVyc2lvbiBvbiBnb2luZy4gICAgICAgICAgICovCisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0gTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0gTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgCisgIGlmICggICAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICAgICAgJiYgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkKKyAgICAgICYmICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKQorICAgICApCisgIHsKKyAgICAvKiBTZXQgdGhlIHNlbGVjdGVkIEFEQyBjYWxpYnJhdGlvbiB2YWx1ZSAqLworICAgIExMX0FEQ19TZXRDYWxpYnJhdGlvbkZhY3RvcihoYWRjLT5JbnN0YW5jZSwgU2luZ2xlRGlmZiwgQ2FsaWJyYXRpb25GYWN0b3IpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAvKiBVcGRhdGUgQURDIGVycm9yIGNvZGUgKi8KKyAgICBTRVRfQklUKGhhZGMtPkVycm9yQ29kZSwgSEFMX0FEQ19FUlJPUl9JTlRFUk5BTCk7CisgICAgCisgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIEFEQywgc3RhcnQgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cC4KKyAgKiBAbm90ZSAgIEludGVycnVwdGlvbnMgZW5hYmxlZCBpbiB0aGlzIGZ1bmN0aW9uOiBOb25lLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluIGNhc2Ugb2Ygc29mdHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gZW5hYmxlZCwgSlFESVMgbXVzdCBiZSBzZXQgCisgICAgICAod2hpY2ggY2FuIGJlIGRvbmUgb25seSBpZiBBRFNUQVJUIGFuZCBKQURTVEFSVCBhcmUgYm90aCBjbGVhcmVkKS4KKyAgICAgICBJZiBKUURJUyBpcyBub3Qgc2V0IGF0IHRoYXQgcG9pbnQsIHJldHVybnMgYW4gZXJyb3IKKyAgICAgICAtIHNpbmNlIHNvZnR3YXJlIHRyaWdnZXIgZGV0ZWN0aW9uIGlzIGRpc2FibGVkLiBVc2VyIG5lZWRzIHRvCisgICAgICAgcmVzb3J0IHRvIEhBTF9BRENFeF9EaXNhYmxlSW5qZWN0ZWRRdWV1ZSgpIEFQSSB0byBzZXQgSlFESVMuICAKKyAgICAgICAtIG9yIChpZiBKUURJUyBpcyBpbnRlbnRpb25hbGx5IHJlc2V0KSBzaW5jZSBKRVhURU4gPSAwIHdoaWNoIG1lYW5zIAorICAgICAgICAgdGhlIHF1ZXVlIGlzIGVtcHR5ICovCisgICAgdG1wX2NvbmZpZ19pbmplY3RlZF9xdWV1ZSA9IFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUURJUyk7CisgICAgCisgICAgaWYgKCAgIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAwVUwpCisgICAgICAgICYmICh0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID09IDBVTCkKKyAgICAgICApCisgICAgeworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOyAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIAorICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoYWRjKTsKKyAgICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgYSByZWd1bGFyIGNvbnZlcnNpb24gaXMgb25nb2luZyAqLworICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0cyAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICAgIAorICAgICAgLyogQ2xlYXIgQURDIGdyb3VwIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCwgaWYgYXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICovCisgICAgICAvKiBpcyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAgICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAgICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZihMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQpCisgICAgICB7CisgICAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgICAgIExMX0FEQ19JTkpfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGFkYyk7ICAgIAorICAgIH0KKyAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgY29udmVyc2lvbiBvZiBpbmplY3RlZCBjaGFubmVscy4gRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZgorICAqICAgICAgICAgbm8gcmVndWxhciBjb252ZXJzaW9uIGlzIG9uIGdvaW5nLgorICAqIEBub3RlICAgSWYgQURDIG11c3QgYmUgZGlzYWJsZWQgYW5kIGlmIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gCisgICogICAgICAgICByZWd1bGFyIGdyb3VwLCBmdW5jdGlvbiBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkIHRvIHN0b3AgYm90aAorICAqICAgICAgICAgaW5qZWN0ZWQgYW5kIHJlZ3VsYXIgZ3JvdXBzLCBhbmQgZGlzYWJsZSB0aGUgQURDLgorICAqIEBub3RlICAgSWYgaW5qZWN0ZWQgZ3JvdXAgbW9kZSBhdXRvLWluamVjdGlvbiBpcyBlbmFibGVkLAorICAqICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0luamVjdGVkU3RvcChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoYWRjKTsKKyAgCisgIC8qIDEuIFN0b3AgcG90ZW50aWFsIGNvbnZlcnNpb24gb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXAgb25seS4gKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX0lOSkVDVEVEX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgaW5qZWN0ZWQgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAqLworICAvKiBhbmQgaWYgbm8gY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIGlzIG9uLWdvaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaWYgKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kgfCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29udmVyc2lvbiBvbiBpbmplY3RlZCBncm91cCBpcyBzdG9wcGVkLCBidXQgQURDIG5vdCBkaXNhYmxlZCBzaW5jZSAgICAqLworICAgIC8qIGNvbnZlcnNpb24gb24gcmVndWxhciBncm91cCBpcyBzdGlsbCBydW5uaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FpdCBmb3IgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiB0byBiZSBjb21wbGV0ZWQuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmQuCisgICogQG5vdGUgICBEZXBlbmRpbmcgb24gaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24sIEpFT1Mgb3IgSkVPQyBpcworICAqICAgICAgICAgY2hlY2tlZCBhbmQgY2xlYXJlZCBkZXBlbmRpbmcgb24gQVVURExZIGJpdCBzdGF0dXMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRQb2xsRm9yQ29udmVyc2lvbihBRENfSGFuZGxlVHlwZURlZiogaGFkYywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXBfRmxhZ19FbmQ7CisgIHVpbnQzMl90IHRtcF9hZGNfaW5qX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0OworICB1aW50MzJfdCB0bXBfYWRjX3JlZ19pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydDsKKyAgdWludDMyX3QgdG1wX2NmZ3I7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworCisgIC8qIElmIGVuZCBvZiBzZXF1ZW5jZSBzZWxlY3RlZCAqLworICBpZiAoaGFkYy0+SW5pdC5FT0NTZWxlY3Rpb24gPT0gQURDX0VPQ19TRVFfQ09OVikKKyAgeworICAgIHRtcF9GbGFnX0VuZCA9IEFEQ19GTEFHX0pFT1M7CisgIH0KKyAgZWxzZSAvKiBlbmQgb2YgY29udmVyc2lvbiBzZWxlY3RlZCAqLworICB7CisgICAgdG1wX0ZsYWdfRW5kID0gQURDX0ZMQUdfSkVPQzsKKyAgfQorICAKKyAgLyogR2V0IHRpbWVvdXQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAgCisgICAvKiBXYWl0IHVudGlsIEVuZCBvZiBDb252ZXJzaW9uIG9yIFNlcXVlbmNlIGZsYWcgaXMgcmFpc2VkICovCisgIHdoaWxlKChoYWRjLT5JbnN0YW5jZS0+SVNSICYgdG1wX0ZsYWdfRW5kKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8KKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVTCkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSB0byB0aW1lb3V0ICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfVElNRU9VVCk7CisgICAgICAgIAorICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIFJldHJpZXZlIEFEQyBjb25maWd1cmF0aW9uICovCisgIHRtcF9hZGNfaW5qX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ID0gTExfQURDX0lOSl9Jc1RyaWdnZXJTb3VyY2VTV1N0YXJ0KGhhZGMtPkluc3RhbmNlKTsKKyAgdG1wX2FkY19yZWdfaXNfdHJpZ2dlcl9zb3VyY2Vfc3dfc3RhcnQgPSBMTF9BRENfUkVHX0lzVHJpZ2dlclNvdXJjZVNXU3RhcnQoaGFkYy0+SW5zdGFuY2UpOworICB0bXBfY2ZnciA9IFJFQURfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSKTsKKyAgCisgIC8qIFVwZGF0ZSBBREMgc3RhdGUgbWFjaGluZSAqLworICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9FT0MpOworICAKKyAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IGZ1cnRoZXIgY29udmVyc2lvbiB1cGNvbWluZyBvbiBncm91cCBpbmplY3RlZCAgICAgICovCisgIC8qIGJ5IGV4dGVybmFsIHRyaWdnZXIgb3IgYnkgYXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAqLworICAvKiBmcm9tIGdyb3VwIHJlZ3VsYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoKHRtcF9hZGNfaW5qX2lzX3RyaWdnZXJfc291cmNlX3N3X3N0YXJ0ICE9IDBVTCkgICAgICAgICAgICB8fAorICAgICAoKFJFQURfQklUICh0bXBfY2ZnciwgQURDX0NGR1JfSkFVVE8pID09IDBVTCkgICAgICAmJgorICAgICAgKCh0bXBfYWRjX3JlZ19pc190cmlnZ2VyX3NvdXJjZV9zd19zdGFydCAhPSAwVUwpICAmJgorICAgICAgIChSRUFEX0JJVCAodG1wX2NmZ3IsIEFEQ19DRkdSX0NPTlQpID09IDBVTCkgICAgKSAgICkgICApCisgIHsKKyAgICAvKiBDaGVjayB3aGV0aGVyIGVuZCBvZiBzZXF1ZW5jZSBpcyByZWFjaGVkICovCisgICAgaWYoIF9fSEFMX0FEQ19HRVRfRkxBRyhoYWRjLCBBRENfRkxBR19KRU9TKSApCisgICAgeworICAgICAgLyogUGFydGljdWxhciBjYXNlIGlmIGluamVjdGVkIGNvbnRleHRzIHF1ZXVlIGlzIGVuYWJsZWQ6ICAgICAgICAgICAgICovCisgICAgICAvKiB3aGVuIHRoZSBsYXN0IGNvbnRleHQgaGFzIGJlZW4gZnVsbHkgcHJvY2Vzc2VkLCBKU1FSIGlzIHJlc2V0ICAgICAgKi8KKyAgICAgIC8qIGJ5IHRoZSBoYXJkd2FyZS4gRXZlbiBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIHBsYW5uZWQgdG8gY29tZSAqLworICAgICAgLyogKHF1ZXVlIGVtcHR5LCB0cmlnZ2VycyBhcmUgaWdub3JlZCksIGl0IGNhbiBzdGFydCBhZ2FpbiAgICAgICAgICAgICovCisgICAgICAvKiBpbW1lZGlhdGVseSBhZnRlciBzZXR0aW5nIGEgbmV3IGNvbnRleHQgKEpBRFNUQVJUIGlzIHN0aWxsIHNldCkuICAgKi8KKyAgICAgIC8qIFRoZXJlZm9yZSwgc3RhdGUgb2YgSEFMIEFEQyBpbmplY3RlZCBncm91cCBpcyBrZXB0IHRvIGJ1c3kuICAgICAgICAqLworICAgICAgaWYoUkVBRF9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pRTSkgPT0gMFVMKQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgICAgIAorICAgICAgICBpZigoaGFkYy0+U3RhdGUgJiBIQUxfQURDX1NUQVRFX1JFR19CVVNZKSA9PSAwVUwpCisgICAgICAgIHsKKyAgICAgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogQ2xlYXIgcG9sbGVkIGZsYWcgKi8KKyAgaWYgKHRtcF9GbGFnX0VuZCA9PSBBRENfRkxBR19KRU9TKQorICB7CisgICAgLyogQ2xlYXIgZW5kIG9mIHNlcXVlbmNlIEpFT1MgZmxhZyBvZiBpbmplY3RlZCBncm91cCBpZiBsb3cgcG93ZXIgZmVhdHVyZSAqLworICAgIC8qICJMb3dQb3dlckF1dG9XYWl0ICIgaXMgZGlzYWJsZWQsIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGlzIGZlYXR1cmUuICAgKi8KKyAgICAvKiBGb3IgaW5qZWN0ZWQgZ3JvdXBzLCBubyBuZXcgY29udmVyc2lvbiB3aWxsIHN0YXJ0IGJlZm9yZSBKRU9TIGlzICAgICAgICovCisgICAgLyogY2xlYXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfQVVURExZKSA9PSAwVUwpCisgICAgeworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX0FEQ19DTEVBUl9GTEFHKGhhZGMsIEFEQ19GTEFHX0pFT0MpOworICB9CisgIAorICAvKiBSZXR1cm4gQVBJIEhBTCBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQURDLCBzdGFydCBjb252ZXJzaW9uIG9mIGluamVjdGVkIGdyb3VwIHdpdGggaW50ZXJydXB0aW9uLgorICAqIEBub3RlICAgSW50ZXJydXB0aW9ucyBlbmFibGVkIGluIHRoaXMgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGluaXRpYWxpemF0aW9uCisgICogICAgICAgICBzZXR0aW5nIDogSkVPQyAoZW5kIG9mIGNvbnZlcnNpb24pIG9yIEpFT1MgKGVuZCBvZiBzZXF1ZW5jZSkgCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVChBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW5qZWN0ZWRfcXVldWU7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgIT0gMFVMKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluIGNhc2Ugb2Ygc29mdHdhcmUgdHJpZ2dlciBkZXRlY3Rpb24gZW5hYmxlZCwgSlFESVMgbXVzdCBiZSBzZXQgCisgICAgICAod2hpY2ggY2FuIGJlIGRvbmUgb25seSBpZiBBRFNUQVJUIGFuZCBKQURTVEFSVCBhcmUgYm90aCBjbGVhcmVkKS4KKyAgICAgICBJZiBKUURJUyBpcyBub3Qgc2V0IGF0IHRoYXQgcG9pbnQsIHJldHVybnMgYW4gZXJyb3IKKyAgICAgICAtIHNpbmNlIHNvZnR3YXJlIHRyaWdnZXIgZGV0ZWN0aW9uIGlzIGRpc2FibGVkLiBVc2VyIG5lZWRzIHRvCisgICAgICAgcmVzb3J0IHRvIEhBTF9BRENFeF9EaXNhYmxlSW5qZWN0ZWRRdWV1ZSgpIEFQSSB0byBzZXQgSlFESVMuICAKKyAgICAgICAtIG9yIChpZiBKUURJUyBpcyBpbnRlbnRpb25hbGx5IHJlc2V0KSBzaW5jZSBKRVhURU4gPSAwIHdoaWNoIG1lYW5zIAorICAgICAgICAgdGhlIHF1ZXVlIGlzIGVtcHR5ICovCisgICAgdG1wX2NvbmZpZ19pbmplY3RlZF9xdWV1ZSA9IFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KUURJUyk7CisgICAgCisgICAgaWYgKCAgIChSRUFEX0JJVChoYWRjLT5JbnN0YW5jZS0+SlNRUiwgQURDX0pTUVJfSkVYVEVOKSA9PSAwVUwpCisgICAgICAgICYmICh0bXBfY29uZmlnX2luamVjdGVkX3F1ZXVlID09IDBVTCkKKyAgICAgICApCisgICAgeworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOyAKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhhZGMpOworICAgIAorICAgIC8qIEVuYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19FbmFibGUoaGFkYyk7CisgICAgCisgICAgLyogU3RhcnQgY29udmVyc2lvbiBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZW5hYmxlZCAqLworICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgYSByZWd1bGFyIGNvbnZlcnNpb24gaXMgb25nb2luZyAqLworICAgICAgaWYgKChoYWRjLT5TdGF0ZSAmIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgQURDIGVycm9yIGNvZGUgZmllbGQgcmVsYXRlZCB0byBpbmplY3RlZCBjb252ZXJzaW9ucyBvbmx5ICovCisgICAgICAgIENMRUFSX0JJVChoYWRjLT5FcnJvckNvZGUsIEhBTF9BRENfRVJST1JfSlFPVkYpOyAgICAgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIGVycm9yIGNvZGUgdG8gbm9uZSAqLworICAgICAgICBBRENfQ0xFQVJfRVJST1JDT0RFKGhhZGMpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBTZXQgQURDIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogLSBDbGVhciBzdGF0ZSBiaXRmaWVsZCByZWxhdGVkIHRvIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gcmVzdWx0cyAgKi8KKyAgICAgIC8qIC0gU2V0IHN0YXRlIGJpdGZpZWxkIHJlbGF0ZWQgdG8gaW5qZWN0ZWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICovCisgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkgfCBIQUxfQURDX1NUQVRFX0lOSl9FT0MsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICAgIAorICAgICAgLyogQ2xlYXIgQURDIGdyb3VwIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZyAqLworICAgICAgLyogKFRvIGVuc3VyZSBvZiBubyB1bmtub3duIHN0YXRlIGZyb20gcG90ZW50aWFsIHByZXZpb3VzIEFEQyBvcGVyYXRpb25zKSAqLworICAgICAgX19IQUxfQURDX0NMRUFSX0ZMQUcoaGFkYywgKEFEQ19GTEFHX0pFT0MgfCBBRENfRkxBR19KRU9TKSk7CisgICAgICAKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIC8qIFVubG9jayBiZWZvcmUgc3RhcnRpbmcgQURDIGNvbnZlcnNpb25zOiBpbiBjYXNlIG9mIHBvdGVudGlhbCAgICAgICAgICovCisgICAgICAvKiBpbnRlcnJ1cHRpb24sIHRvIGxldCB0aGUgcHJvY2VzcyB0byBBREMgSVJRIEhhbmRsZXIuICAgICAgICAgICAgICAgICAqLworICAgICAgX19IQUxfVU5MT0NLKGhhZGMpOworICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIEluamVjdGVkIGNvbnRleHQgcXVldWUgb3ZlcmZsb3cgaW50ZXJydXB0IGlmIHRoaXMgZmVhdHVyZSAgICovCisgICAgICAvKiBpcyBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoKGhhZGMtPkluc3RhbmNlLT5DRkdSICYgQURDX0NGR1JfSlFNKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0ZMQUdfSlFPVkYpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgQURDIGVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCAqLworICAgICAgc3dpdGNoKGhhZGMtPkluaXQuRU9DU2VsZWN0aW9uKQorICAgICAgeworICAgICAgICBjYXNlIEFEQ19FT0NfU0VRX0NPTlY6IAorICAgICAgICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9DKTsKKyAgICAgICAgICBfX0hBTF9BRENfRU5BQkxFX0lUKGhhZGMsIEFEQ19JVF9KRU9TKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogY2FzZSBBRENfRU9DX1NJTkdMRV9DT05WICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgQURDX0lUX0pFT1MpOyAgICAgIAorICAgICAgICAgIF9fSEFMX0FEQ19FTkFCTEVfSVQoaGFkYywgQURDX0lUX0pFT0MpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvKiBFbmFibGUgY29udmVyc2lvbiBvZiBpbmplY3RlZCBncm91cCwgaWYgYXV0b21hdGljIGluamVjdGVkIGNvbnZlcnNpb24gICovCisgICAgICAvKiBpcyBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBJZiBzb2Z0d2FyZSBzdGFydCBoYXMgYmVlbiBzZWxlY3RlZCwgY29udmVyc2lvbiBzdGFydHMgaW1tZWRpYXRlbHkuICAgICovCisgICAgICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIGhhcyBiZWVuIHNlbGVjdGVkLCBjb252ZXJzaW9uIHdpbGwgc3RhcnQgYXQgbmV4dCAgICovCisgICAgICAvKiB0cmlnZ2VyIGV2ZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZihMTF9BRENfSU5KX0dldFRyaWdBdXRvKGhhZGMtPkluc3RhbmNlKSA9PSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQpCisgICAgICB7CisgICAgICAgIC8qIFN0YXJ0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uICovCisgICAgICAgIExMX0FEQ19JTkpfU3RhcnRDb252ZXJzaW9uKGhhZGMtPkluc3RhbmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgICB9CisgICAgCisgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgY29udmVyc2lvbiBvZiBpbmplY3RlZCBjaGFubmVscywgZGlzYWJsZSBpbnRlcnJ1cHRpb24gb2YgCisgICogICAgICAgICBlbmQtb2YtY29udmVyc2lvbi4gRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyByZWd1bGFyIGNvbnZlcnNpb24KKyAgKiAgICAgICAgIGlzIG9uIGdvaW5nLgorICAqIEBub3RlICAgSWYgQURDIG11c3QgYmUgZGlzYWJsZWQgYW5kIGlmIGNvbnZlcnNpb24gaXMgb24gZ29pbmcgb24gCisgICogICAgICAgICByZWd1bGFyIGdyb3VwLCBmdW5jdGlvbiBIQUxfQURDX1N0b3AgbXVzdCBiZSB1c2VkIHRvIHN0b3AgYm90aAorICAqICAgICAgICAgaW5qZWN0ZWQgYW5kIHJlZ3VsYXIgZ3JvdXBzLCBhbmQgZGlzYWJsZSB0aGUgQURDLgorICAqIEBub3RlICAgSWYgaW5qZWN0ZWQgZ3JvdXAgbW9kZSBhdXRvLWluamVjdGlvbiBpcyBlbmFibGVkLAorICAqICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ19TdG9wIG11c3QgYmUgdXNlZC4KKyAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgYXV0by1pbmplY3Rpb24gbW9kZSwgSEFMX0FEQ19TdG9wKCkgbXVzdCBiZSB1c2VkLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9BRENFeF9JbmplY3RlZFN0b3BfSVQoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwIG9ubHkuICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19JTkpFQ1RFRF9HUk9VUCk7CisgIAorICAvKiBEaXNhYmxlIEFEQyBwZXJpcGhlcmFsIGlmIGluamVjdGVkIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkICAgKi8KKyAgLyogYW5kIGlmIG5vIGNvbnZlcnNpb24gb24gdGhlIG90aGVyIGdyb3VwIChyZWd1bGFyIGdyb3VwKSBpcyBpbnRlbmRlZCB0byAgICovCisgIC8qIGNvbnRpbnVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogRGlzYWJsZSBBREMgZW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IGZvciBpbmplY3RlZCBjaGFubmVscyAqLworICAgIF9fSEFMX0FEQ19ESVNBQkxFX0lUKGhhZGMsIChBRENfSVRfSkVPQyB8IEFEQ19JVF9KRU9TIHwgQURDX0ZMQUdfSlFPVkYpKTsKKyAgICAKKyAgICBpZiAoTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKSA9PSAwVUwpCisgICAgeworICAgICAgLyogMi4gRGlzYWJsZSB0aGUgQURDIHBlcmlwaGVyYWwgKi8KKyAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICAKKyAgICAgIC8qIENoZWNrIGlmIEFEQyBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLworICAgICAgaWYgKHRtcF9oYWxfc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IEFEQyBzdGF0ZSAqLworICAgICAgICBBRENfU1RBVEVfQ0xSX1NFVChoYWRjLT5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSB8IEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIGlzIHN0b3BwZWQsIGJ1dCBBREMgbm90IGRpc2FibGVkIHNpbmNlICAgICovCisgICAgLyogY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIGlzIHN0aWxsIHJ1bm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IEFEQyBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIHJlc3VsdC4KKyAgKiBAbm90ZSAgIFJlYWRpbmcgcmVnaXN0ZXIgSkRSeCBhdXRvbWF0aWNhbGx5IGNsZWFycyBBREMgZmxhZyBKRU9DCisgICogICAgICAgICAoQURDIGdyb3VwIGluamVjdGVkIGVuZCBvZiB1bml0YXJ5IGNvbnZlcnNpb24pLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjbGVhciBBREMgZmxhZyBKRU9TIAorICAqICAgICAgICAgKEFEQyBncm91cCBpbmplY3RlZCBlbmQgb2Ygc2VxdWVuY2UgY29udmVyc2lvbikKKyAgKiAgICAgICAgIE9jY3VycmVuY2Ugb2YgZmxhZyBKRU9TIHJpc2luZzoKKyAgKiAgICAgICAgICAtIElmIHNlcXVlbmNlciBpcyBjb21wb3NlZCBvZiAxIHJhbmssIGZsYWcgSkVPUyBpcyBlcXVpdmFsZW50CisgICogICAgICAgICAgICB0byBmbGFnIEpFT0MuCisgICogICAgICAgICAgLSBJZiBzZXF1ZW5jZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCByYW5rcywgZHVyaW5nIHRoZSBzY2FuCisgICogICAgICAgICAgICBzZXF1ZW5jZSBmbGFnIEpFT0Mgb25seSBpcyByYWlzZWQsIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4gc2VxdWVuY2UKKyAgKiAgICAgICAgICAgIGJvdGggZmxhZ3MgSkVPQyBhbmQgRU9TIGFyZSByYWlzZWQuCisgICogICAgICAgICBGbGFnIEpFT1MgbXVzdCBub3QgYmUgY2xlYXJlZCBieSB0aGlzIGZ1bmN0aW9uIGJlY2F1c2UKKyAgKiAgICAgICAgIGl0IHdvdWxkIG5vdCBiZSBjb21wbGlhbnQgd2l0aCBsb3cgcG93ZXIgZmVhdHVyZXMKKyAgKiAgICAgICAgIChmZWF0dXJlIGxvdyBwb3dlciBhdXRvLXdhaXQsIG5vdCBhdmFpbGFibGUgb24gYWxsIFNUTTMyIGZhbWlsaWVzKS4KKyAgKiAgICAgICAgIFRvIGNsZWFyIHRoaXMgZmxhZywgZWl0aGVyIHVzZSBmdW5jdGlvbjogCisgICogICAgICAgICBpbiBwcm9ncmFtbWluZyBtb2RlbCBJVDogQHJlZiBIQUxfQURDX0lSUUhhbmRsZXIoKSwgaW4gcHJvZ3JhbW1pbmcKKyAgKiAgICAgICAgIG1vZGVsIHBvbGxpbmc6IEByZWYgSEFMX0FEQ0V4X0luamVjdGVkUG9sbEZvckNvbnZlcnNpb24oKSAKKyAgKiAgICAgICAgIG9yIEByZWYgX19IQUxfQURDX0NMRUFSX0ZMQUcoJmhhZGMsIEFEQ19GTEFHX0pFT1MpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gSW5qZWN0ZWRSYW5rIHRoZSBjb252ZXJ0ZWQgQURDIGluamVjdGVkIHJhbmsuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSU5KRUNURURfUkFOS18xIEFEQyBncm91cCBpbmplY3RlZCByYW5rIDEKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSU5KRUNURURfUkFOS18yIEFEQyBncm91cCBpbmplY3RlZCByYW5rIDIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSU5KRUNURURfUkFOS18zIEFEQyBncm91cCBpbmplY3RlZCByYW5rIDMKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBBRENfSU5KRUNURURfUkFOS180IEFEQyBncm91cCBpbmplY3RlZCByYW5rIDQKKyAgKiBAcmV0dmFsIEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIGRhdGEKKyAgKi8KK3VpbnQzMl90IEhBTF9BRENFeF9JbmplY3RlZEdldFZhbHVlKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCB1aW50MzJfdCBJbmplY3RlZFJhbmspCit7CisgIHVpbnQzMl90IHRtcF9qZHI7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0lOSkVDVEVEX1JBTksoSW5qZWN0ZWRSYW5rKSk7CisgIAorICAvKiBHZXQgQURDIGNvbnZlcnRlZCB2YWx1ZSAqLworICBzd2l0Y2goSW5qZWN0ZWRSYW5rKQorICB7ICAKKyAgICBjYXNlIEFEQ19JTkpFQ1RFRF9SQU5LXzQ6CisgICAgICB0bXBfamRyID0gaGFkYy0+SW5zdGFuY2UtPkpEUjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFEQ19JTkpFQ1RFRF9SQU5LXzM6IAorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRENfSU5KRUNURURfUkFOS18yOiAKKyAgICAgIHRtcF9qZHIgPSBoYWRjLT5JbnN0YW5jZS0+SkRSMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQURDX0lOSkVDVEVEX1JBTktfMToKKyAgICBkZWZhdWx0OgorICAgICAgdG1wX2pkciA9IGhhZGMtPkluc3RhbmNlLT5KRFIxOworICAgICAgYnJlYWs7CisgIH0KKyAgCisgIC8qIFJldHVybiBBREMgY29udmVydGVkIHZhbHVlICovIAorICByZXR1cm4gdG1wX2pkcjsKK30KKworLyoqCisgICogQGJyaWVmICBJbmplY3RlZCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhhZGMpOworICAKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4gV2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgZnVuY3Rpb24gSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSW5qZWN0ZWQgY29udGV4dCBxdWV1ZSBvdmVyZmxvdyBjYWxsYmFjay4KKyAgKiBAbm90ZSAgIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIGluamVjdGVkIGNvbnRleHQgcXVldWUgaXMgZW5hYmxlZAorICAgICAgICAgICAgKHBhcmFtZXRlciAiUXVldWVJbmplY3RlZENvbnRleHQiIGluIGluamVjdGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIGFuZCBpZiBhIG5ldyBpbmplY3RlZCBjb250ZXh0IGlzIHNldCB3aGVuIHF1ZXVlIGlzIGZ1bGwgKG1heGltdW0gMgorICAgICAgICAgICAgY29udGV4dHMpLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9JbmplY3RlZFF1ZXVlT3ZlcmZsb3dDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDRXhfSW5qZWN0ZWRRdWV1ZU92ZXJmbG93Q2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFuYWxvZyB3YXRjaGRvZyAyIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoYWRjKTsKKyAgCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9BRENFeF9MZXZlbE91dE9mV2luZG93MkNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBbmFsb2cgd2F0Y2hkb2cgMyBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDRXhfTGV2ZWxPdXRPZldpbmRvdzNDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICovCit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgT2YgU2FtcGxpbmcgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0FEQ0V4X0VuZE9mU2FtcGxpbmdDYWxsYmFjayhBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGFkYyk7CisgIAorICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfQURDRXhfRW5kT2ZTYW1wbGluZ0NhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBjaGFubmVscyBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgbm8gCisgICogICAgICAgICBjb252ZXJzaW9uIGlzIG9uIGdvaW5nIG9uIGluamVjdGVkIGdyb3VwLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3AoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGFkYyk7CisgIAorICAvKiAxLiBTdG9wIHBvdGVudGlhbCByZWd1bGFyIGNvbnZlcnNpb24gb24gZ29pbmcgKi8KKyAgdG1wX2hhbF9zdGF0dXMgPSBBRENfQ29udmVyc2lvblN0b3AoaGFkYywgQURDX1JFR1VMQVJfR1JPVVApOworICAKKyAgLyogRGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiByZWd1bGFyIGNvbnZlcnNpb25zIGFyZSBlZmZlY3RpdmVseSBzdG9wcGVkIAorICAgICBhbmQgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbnMgYXJlIG9uLWdvaW5nICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDbGVhciBIQUxfQURDX1NUQVRFX1JFR19CVVNZIGJpdCAqLyAKKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfUkVHX0JVU1kpOyAKKyAgICAgCisgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgIHsKKyAgICAgIC8qIDIuIERpc2FibGUgdGhlIEFEQyBwZXJpcGhlcmFsICovCisgICAgICB0bXBfaGFsX3N0YXR1cyA9IEFEQ19EaXNhYmxlKGhhZGMpOworICAgICAgCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb252ZXJzaW9uIG9uIGluamVjdGVkIGdyb3VwIGlzIHN0b3BwZWQsIGJ1dCBBREMgbm90IGRpc2FibGVkIHNpbmNlICAgICovCisgICAgLyogY29udmVyc2lvbiBvbiByZWd1bGFyIGdyb3VwIGlzIHN0aWxsIHJ1bm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBTRVRfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX0lOSl9CVVNZKTsKKyAgICB9CisgIH0KKyAgCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhhZGMpOworICAKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gdG1wX2hhbF9zdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIEFEQyBncm91cHMgcmVndWxhciBhbmQgaW5qZWN0ZWQsCisgICogICAgICAgICBkaXNhYmxlIGludGVycnV0aW9uIG9mIGVuZC1vZi1jb252ZXJzaW9uLAorICAqICAgICAgICAgZGlzYWJsZSBBREMgcGVyaXBoZXJhbCBpZiBubyBjb252ZXJzaW9uIGlzIG9uIGdvaW5nCisgICogICAgICAgICBvbiBpbmplY3RlZCBncm91cC4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X1JlZ3VsYXJTdG9wX0lUKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQKKyAgICBhbmQgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLworICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ2xlYXIgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSBiaXQgKi8gCisgICAgQ0xFQVJfQklUKGhhZGMtPlN0YXRlLCBIQUxfQURDX1NUQVRFX1JFR19CVVNZKTsgIAorICAgIAorICAgIC8qIERpc2FibGUgYWxsIHJlZ3VsYXItcmVsYXRlZCBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQURDX0RJU0FCTEVfSVQoaGFkYywgKEFEQ19JVF9FT0MgfCBBRENfSVRfRU9TIHwgQURDX0lUX09WUikpOworICAgIAorICAgIC8qIDIuIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgbm8gaW5qZWN0ZWQgY29udmVyc2lvbnMgYXJlIG9uLWdvaW5nICovCisgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgIHsgICAgIAorICAgICAgdG1wX2hhbF9zdGF0dXMgPSBBRENfRGlzYWJsZShoYWRjKTsKKyAgICAgIC8qIGlmIG5vIGlzc3VlIHJlcG9ydGVkICovCisgICAgICBpZiAodG1wX2hhbF9zdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZXQgQURDIHN0YXRlICovCisgICAgICAgIEFEQ19TVEFURV9DTFJfU0VUKGhhZGMtPlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX0lOSl9CVVNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfQURDX1NUQVRFX1JFQURZKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0JVU1kpOworICAgIH0KKyAgfQorICAKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGFkYyk7CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIEFEQyBjb252ZXJzaW9uIG9mIHJlZ3VsYXIgZ3JvdXAgKGFuZCBpbmplY3RlZCBncm91cCBpbiAKKyAgKiAgICAgICAgIGNhc2Ugb2YgYXV0b19pbmplY3Rpb24gbW9kZSksIGRpc2FibGUgQURDIERNQSB0cmFuc2ZlciwgZGlzYWJsZSAKKyAgKiAgICAgICAgIEFEQyBwZXJpcGhlcmFsIGlmIG5vIGNvbnZlcnNpb24gaXMgb24gZ29pbmcKKyAgKiAgICAgICAgIG9uIGluamVjdGVkIGdyb3VwLgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfUmVndWxhclN0b3BfRE1BKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogMS4gU3RvcCBwb3RlbnRpYWwgcmVndWxhciBjb252ZXJzaW9uIG9uIGdvaW5nICovCisgIHRtcF9oYWxfc3RhdHVzID0gQURDX0NvbnZlcnNpb25TdG9wKGhhZGMsIEFEQ19SRUdVTEFSX0dST1VQKTsKKyAgCisgIC8qIERpc2FibGUgQURDIHBlcmlwaGVyYWwgaWYgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgCisgICAgIGFuZCBpZiBubyBpbmplY3RlZCBjb252ZXJzaW9uIGlzIG9uLWdvaW5nICovCisgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDbGVhciBIQUxfQURDX1NUQVRFX1JFR19CVVNZIGJpdCAqLworICAgIENMRUFSX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9SRUdfQlVTWSk7CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgRE1BIChBREMgRE1BIGNvbmZpZ3VyYXRpb24gQURDX0NGR1JfRE1BQ0ZHIGlzIGtlcHQpICovCisgICAgQ0xFQVJfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9ETUFFTik7IAorICAgIAorICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsIChpbiBjYXNlIG9mIERNQSBpbiBjaXJjdWxhciBtb2RlIG9yIHN0b3Agd2hpbGUgKi8KKyAgICAvKiB3aGlsZSBETUEgdHJhbnNmZXIgaXMgb24gZ29pbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhhZGMtPkRNQV9IYW5kbGUpOworICAgIAorICAgIC8qIENoZWNrIGlmIERNQSBjaGFubmVsIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCisgICAgaWYgKHRtcF9oYWxfc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfRE1BKTsKKyAgICB9CisgICAgCisgICAgLyogRGlzYWJsZSBBREMgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9BRENfRElTQUJMRV9JVChoYWRjLCBBRENfSVRfT1ZSKTsKKyAgICAKKyAgICAvKiAyLiBEaXNhYmxlIHRoZSBBREMgcGVyaXBoZXJhbCAqLworICAgIC8qIFVwZGF0ZSAidG1wX2hhbF9zdGF0dXMiIG9ubHkgaWYgRE1BIGNoYW5uZWwgZGlzYWJsaW5nIHBhc3NlZCwgICAgICAgICAgKi8KKyAgICAvKiB0byBrZWVwIGluIG1lbW9yeSBhIHBvdGVudGlhbCBmYWlsaW5nIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICAgIHsKKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gQURDX0Rpc2FibGUoaGFkYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICh2b2lkKUFEQ19EaXNhYmxlKGhhZGMpOworICAgICAgfQorICAgICAgCisgICAgICAvKiBDaGVjayBpZiBBREMgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICAgIGlmICh0bXBfaGFsX3N0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBBREMgc3RhdGUgKi8KKyAgICAgICAgQURDX1NUQVRFX0NMUl9TRVQoaGFkYy0+U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfSU5KX0JVU1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9BRENfU1RBVEVfUkVBRFkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9JTkpfQlVTWSk7CisgICAgfQorICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEFEQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgQURDIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgQURDIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgY2hhbm5lbHMgb24gaW5qZWN0ZWQgZ3JvdXAKKyAgICAgICgrKSBFbmFibGUgb3IgRGlzYWJsZSBJbmplY3RlZCBRdWV1ZQorICAgICAgKCspIERpc2FibGUgQURDIHZvbHRhZ2UgcmVndWxhdG9yCisgICAgICAoKykgRW50ZXIgQURDIGRlZXAtcG93ZXItZG93biBtb2RlCisgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIGEgY2hhbm5lbCB0byBiZSBhc3NpZ25lZCB0byBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogQG5vdGUgICBQb3NzaWJpbGl0eSB0byB1cGRhdGUgcGFyYW1ldGVycyBvbiB0aGUgZmx5OgorICAqICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBpbmplY3RlZCBncm91cCwgZm9sbG93aW5nIGNhbGxzIHRvIHRoaXMgCisgICogICAgICAgICBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvbmZpZ3VyZSBzb21lIHBhcmFtZXRlcnMgb2Ygc3RydWN0dXJlCisgICogICAgICAgICAiQURDX0luamVjdGlvbkNvbmZUeXBlRGVmIiBvbiB0aGUgZmx5LCB3aXRob3V0IHJlc2V0dGluZyB0aGUgQURDLgorICAqICAgICAgICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6CisgICogICAgICAgICBSZWZlciB0byBjb21tZW50cyBvZiBzdHJ1Y3R1cmUgIkFEQ19JbmplY3Rpb25Db25mVHlwZURlZiIuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIHVzYWdlIG9mIGludGVybmFsIG1lYXN1cmVtZW50IGNoYW5uZWxzOgorICAqICAgICAgICAgVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IuCisgICogICAgICAgICBUaGVzZSBpbnRlcm5hbCBwYXRocyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgZnVuY3Rpb24gCisgICogICAgICAgICBIQUxfQURDX0RlSW5pdCgpLgorICAqIEBub3RlICAgQ2F1dGlvbjogRm9yIEluamVjdGVkIENvbnRleHQgUXVldWUgdXNlLCBhIGNvbnRleHQgbXVzdCBiZSBmdWxseSAKKyAgKiAgICAgICAgIGRlZmluZWQgYmVmb3JlIHN0YXJ0IG9mIGluamVjdGVkIGNvbnZlcnNpb24uIEFsbCBjaGFubmVscyBhcmUgY29uZmlndXJlZCAKKyAgKiAgICAgICAgIGNvbnNlY3V0aXZlbHkgZm9yIHRoZSBzYW1lIEFEQyBpbnN0YW5jZS4gVGhlcmVmb3JlLCB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIAorICAqICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIG11c3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHBhcmFtZXRlciAKKyAgKiAgICAgICAgIEluamVjdGVkTmJyT2ZDb252ZXJzaW9uIGZvciBlYWNoIGNvbnRleHQuCisgICogIC0gRXhhbXBsZSAxOiBJZiAxIGNvbnRleHQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCAob3IgaWYgdGhlcmUgaXMgbm8gdXNlIG9mIHRoZSAKKyAgKiAgICBJbmplY3RlZCBRdWV1ZSBDb250ZXh0IGZlYXR1cmUpIGFuZCBpZiB0aGUgY29udGV4dCBjb250YWlucyAzIGluamVjdGVkIHJhbmtzIAorICAqICAgIChJbmplY3RlZE5ick9mQ29udmVyc2lvbiA9IDMpLCBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgbXVzdCBiZSAgCisgICogICAgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY2hhbm5lbCAoaS5lLiAzIHRpbWVzKSBiZWZvcmUgc3RhcnRpbmcgYSBjb252ZXJzaW9uLiAgIAorICAqICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHRvIGNvbmZpZ3VyZSBhIDR0aCBpbmplY3RlZCBjaGFubmVsOiAgIAorICAqICAgIGl0IHdvdWxkIHN0YXJ0IGEgbmV3IGNvbnRleHQgaW50byBjb250ZXh0IHF1ZXVlLgorICAqICAtIEV4YW1wbGUgMjogSWYgMiBjb250ZXh0cyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhbmQgZWFjaCBvZiB0aGVtIGNvbnRhaW5zIAorICAqICAgIDMgaW5qZWN0ZWQgcmFua3MgKEluamVjdGVkTmJyT2ZDb252ZXJzaW9uID0gMyksICAKKyAgKiAgICBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKCkgbXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBjaGFubmVsIGFuZCAgCisgICogICAgZm9yIGVhY2ggY29udGV4dCAoMyBjaGFubmVscyB4IDIgY29udGV4dHMgPSA2IGNhbGxzKS4gQ29udmVyc2lvbiBjYW4gIAorICAqICAgIHN0YXJ0IG9uY2UgdGhlIDFzdCBjb250ZXh0IGlzIHNldCwgdGhhdCBpcyBhZnRlciB0aGUgZmlyc3QgdGhyZWUgCisgICogICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGxzLiBUaGUgMm5kIGNvbnRleHQgY2FuIGJlIHNldCBvbiB0aGUgZmx5LgorICAqIEBwYXJhbSBoYWRjIEFEQyBoYW5kbGUKKyAgKiBAcGFyYW0gc0NvbmZpZ0luamVjdGVkIFN0cnVjdHVyZSBvZiBBREMgaW5qZWN0ZWQgZ3JvdXAgYW5kIEFEQyBjaGFubmVsIGZvcgorICAqICAgICAgICAgaW5qZWN0ZWQgZ3JvdXAuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfSW5qZWN0ZWRDb25maWdDaGFubmVsKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjLCBBRENfSW5qZWN0aW9uQ29uZlR5cGVEZWYqIHNDb25maWdJbmplY3RlZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRtcE9mZnNldFNoaWZ0ZWQ7CisgIHVpbnQzMl90IHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbDsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXI7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZDsKKyAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwOworICAKKyAgdWludDMyX3QgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCA9IDBVOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19TQU1QTEVfVElNRShzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2FtcGxpbmdUaW1lKSk7CisgIGFzc2VydF9wYXJhbShJU19BRENfU0lOR0xFX0RJRkZFUkVOVElBTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZikpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5RdWV1ZUluamVjdGVkQ29udGV4dCkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdJTkpFQ19FREdFKHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX0VYVFRSSUdJTkpFQyhoYWRjLCBzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX09GRlNFVF9OVU1CRVIoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfQURDX1JBTkdFKEFEQ19HRVRfUkVTT0xVVElPTihoYWRjKSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCkpOworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nTW9kZSkpOworICAKKyAgaWYoaGFkYy0+SW5pdC5TY2FuQ29udk1vZGUgIT0gQURDX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfUkFOSyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuaykpOworICAgIGFzc2VydF9wYXJhbShJU19BRENfSU5KRUNURURfTkJfQ09OVihzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZSkpOworICB9CisgIAorICAKKyAgLyogaWYgSk9WU0UgaXMgc2V0LCB0aGUgdmFsdWUgb2YgdGhlIE9GRlNFVHlfRU4gYml0IGluIEFEQ3hfT0ZSeSByZWdpc3RlciBpcyAgCisgICAgIGlnbm9yZWQgKGNvbnNpZGVyZWQgYXMgcmVzZXQpICovCisgIGFzc2VydF9wYXJhbSghKChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyICE9IEFEQ19PRkZTRVRfTk9ORSkgJiYgKHNDb25maWdJbmplY3RlZC0+SW5qZWNPdmVyc2FtcGxpbmdNb2RlID09IEVOQUJMRSkpKTsgCisgIAorICAvKiBKRElTQ0VOIGFuZCBKQVVUTyBiaXRzIGNhbid0IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lICAqLworICBhc3NlcnRfcGFyYW0oISgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZERpc2NvbnRpbnVvdXNDb252TW9kZSA9PSBFTkFCTEUpICYmIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKSkpOyAKKyAgCisgIC8qICBESVNDRU4gYW5kIEpBVVRPIGJpdHMgY2FuJ3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgYXNzZXJ0X3BhcmFtKCEoKGhhZGMtPkluaXQuRGlzY29udGludW91c0NvbnZNb2RlID09IEVOQUJMRSkgJiYgKHNDb25maWdJbmplY3RlZC0+QXV0b0luamVjdGVkQ29udiA9PSBFTkFCTEUpKSk7ICAKKyAgCisgIC8qIFZlcmlmaWNhdGlvbiBvZiBjaGFubmVsIG51bWJlciAqLworICBpZiAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNpbmdsZURpZmYgIT0gQURDX0RJRkZFUkVOVElBTF9FTkRFRCkKKyAgeworICAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0NIQU5ORUwoaGFkYywgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQURDX0RJRkZfQ0hBTk5FTChoYWRjLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpOworICB9CisgIAorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhhZGMpOworICAKKyAgLyogQ29uZmlndXJhdGlvbiBvZiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEhhcmR3YXJlIGNvbnN0cmFpbnQ6IE11c3QgZnVsbHkgZGVmaW5lIGluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiAgICAqLworICAvKiBiZWZvcmUgbWFrZSBpdCBlbnRlcmluZyBpbnRvIGluamVjdGVkIHNlcXVlbmNlciBxdWV1ZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gaWYgc2NhbiBtb2RlIGlzIGRpc2FibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNoYW5uZWxzIHNlcXVlbmNlIGxlbmd0aCBpcyBzZXQgdG8gMHgwMDogMSBjaGFubmVsICAgICAgICAgKi8KKyAgLyogICAgICBjb252ZXJ0ZWQgKGNoYW5uZWwgb24gaW5qZWN0ZWQgcmFuayAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgUGFyYW1ldGVyICJJbmplY3RlZE5ick9mQ29udmVyc2lvbiIgaXMgZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIGlzIHNpbXBsZTogcmVnaXN0ZXIgaXMgZnVsbHkgKi8KKyAgLyogICAgICBkZWZpbmVkIG9uIG9uZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gKGZvciBpbmplY3RlZCByYW5rIDEpIGFuZCBjYW4gICovCisgIC8qICAgICAgYmUgZW50ZXJlZCBpbnRvIHF1ZXVlIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGlmIHNjYW4gbW9kZSBpcyBlbmFibGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgKiBJbmplY3RlZCBjaGFubmVscyBzZXF1ZW5jZSBsZW5ndGggaXMgc2V0IHRvIHBhcmFtZXRlciAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIkluamVjdGVkTmJyT2ZDb252ZXJzaW9uIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAqIEluamVjdGVkIGNvbnRleHQgcmVnaXN0ZXIgSlNRUiBzZXR0aW5nIG1vcmUgY29tcGxleDogcmVnaXN0ZXIgaXMgICAgKi8KKyAgLyogICAgICBmdWxseSBkZWZpbmVkIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLCBmb3IgZWFjaCAgICAgICovCisgIC8qICAgICAgaW5qZWN0ZWQgY2hhbm5lbCByYW5rLiBJdCBpcyBlbnRlcmVkIGludG8gcXVldWUgb25seSB3aGVuIGFsbCAgICAgICAqLworICAvKiAgICAgIGluamVjdGVkIHJhbmtzIGhhdmUgYmVlbiBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlOiBTY2FuIG1vZGUgaXMgbm90IHByZXNlbnQgYnkgaGFyZHdhcmUgb24gdGhpcyBkZXZpY2UsIGJ1dCB1c2VkICAgICovCisgIC8qICAgYnkgc29mdHdhcmUgZm9yIGFsaWdubWVudCBvdmVyIGFsbCBTVE0zMiBkZXZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAKKyAgaWYgKChoYWRjLT5Jbml0LlNjYW5Db252TW9kZSA9PSBBRENfU0NBTl9ESVNBQkxFKSAgfHwKKyAgICAgIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkTmJyT2ZDb252ZXJzaW9uID09IDFVKSAgKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb250ZXh0IHJlZ2lzdGVyIEpTUVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIG51bWJlciBvZiByYW5rcyBpbiBpbmplY3RlZCBncm91cCBzZXF1ZW5jZXI6IGZpeGVkIHRvIDFzdCByYW5rICAgICAgKi8KKyAgICAvKiAgICAoc2NhbiBtb2RlIGRpc2FibGVkLCBvbmx5IHJhbmsgMSB1c2VkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBjaGFubmVsIHNldCB0byByYW5rIDEgKHNjYW4gbW9kZSBkaXNhYmxlZCwgb25seSByYW5rIDEgY2FuIGJlIHVzZWQpICovCisgICAgCisgICAgaWYgKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRSYW5rID09IEFEQ19JTkpFQ1RFRF9SQU5LXzEpCisgICAgeworICAgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaWYgdHJpZ2dlciBzZWxlY3Rpb24gaXMgZGlmZmVyZW50IG9mICAgICAgICAgKi8KKyAgICAgIC8qIHNvZnR3YXJlIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBOb3RlOiBUaGlzIGNvbmZpZ3VyYXRpb24ga2VlcHMgdGhlIGhhcmR3YXJlIGZlYXR1cmUgb2YgcGFyYW1ldGVyICAgICAqLworICAgICAgLyogICAgICAgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSAidHJpZ2dlciBlZGdlIG5vbmUiIGVxdWl2YWxlbnQgdG8gICAgKi8KKyAgICAgIC8qICAgICAgIHNvZnR3YXJlIHN0YXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgIT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKQorICAgICAgeworICAgICAgICAgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCA9ICggIEFEQ19KU1FSX1JLKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLCBBRENfSU5KRUNURURfUkFOS18xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiAmIEFEQ19KU1FSX0pFWFRTRUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgPSAoIEFEQ19KU1FSX1JLKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsLCBBRENfSU5KRUNURURfUkFOS18xKSApOworICAgICAgfQorICAgICAgCisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KU1FSLCBBRENfSlNRUl9GSUVMRFMsIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQpOyAKKyAgICAgIC8qIEZvciBkZWJ1ZyBhbmQgaW5mb3JtYXRpdmUgcmVhc29ucywgaGFkYyBoYW5kbGUgc2F2ZXMgSlNRUiBzZXR0aW5nICovCisgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdDsKKyAgICAKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2FzZSBvZiBzY2FuIG1vZGUgZW5hYmxlZCwgc2V2ZXJhbCBjaGFubmVscyB0byBzZXQgaW50byBpbmplY3RlZCBncm91cCAqLworICAgIC8qIHNlcXVlbmNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogUHJvY2VkdXJlIHRvIGRlZmluZSBpbmplY3RlZCBjb250ZXh0IHJlZ2lzdGVyIEpTUVIgb3ZlciBzdWNjZXNzaXZlICAgICAqLworICAgIC8qIGNhbGxzIG9mIHRoaXMgZnVuY3Rpb24sIGZvciBlYWNoIGluamVjdGVkIGNoYW5uZWwgcmFuazogICAgICAgICAgICAgICAgKi8KKyAgICAvKiAxLiBTdGFydCBuZXcgY29udGV4dCBhbmQgc2V0IHBhcmFtZXRlcnMgcmVsYXRlZCB0byBhbGwgaW5qZWN0ZWQgICAgICAgICovCisgICAgLyogICAgY2hhbm5lbHM6IGluamVjdGVkIHNlcXVlbmNlIGxlbmd0aCBhbmQgdHJpZ2dlci4gICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIC8qIGlmIGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgaXMgZXF1YWwgdG8gMCwgdGhpcyBpcyB0aGUgZmlyc3QgKi8KKyAgICAvKiAgIGNhbGwgb2YgdGhlIGNvbnRleHQgdW5kZXIgc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKGhhZGMtPkluamVjdGlvbkNvbmZpZy5DaGFubmVsQ291bnQgPT0gMFUpIAorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIG9uIHRoZSBjb250ZXh0ICovCisgICAgICAvKiAgYmVpbmcgYnVpbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudCA9IHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWROYnJPZkNvbnZlcnNpb247CisgICAgICAvKiBIYW5kbGUgaGFkYyBzYXZlcyB0aGUgY29udGV4dCB1bmRlciBidWlsZCB1cCBvdmVyIGVhY2ggSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpCisgICAgICAgICBjYWxsLCB0aGlzIGNvbnRleHQgd2lsbCBiZSB3cml0dGVuIGluIEpTUVIgcmVnaXN0ZXIgYXQgdGhlIGxhc3QgY2FsbC4KKyAgICAgICAgIEF0IHRoaXMgcG9pbnQsIHRoZSBjb250ZXh0IGlzIG1lcmVseSByZXNldCAgKi8KKyAgICAgICBoYWRjLT5JbmplY3Rpb25Db25maWcuQ29udGV4dFF1ZXVlID0gMHgwMDAwMDAwMFU7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgY29udGV4dCByZWdpc3RlciBKU1FSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLSBudW1iZXIgb2YgcmFua3MgaW4gaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIC0gZXh0ZXJuYWwgdHJpZ2dlciB0byBzdGFydCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIGV4dGVybmFsIHRyaWdnZXIgcG9sYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAKKyAgICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGlmIHRyaWdnZXIgc2VsZWN0aW9uIGlzIGRpZmZlcmVudCBvZiAgICAgICAgICovCisgICAgICAvKiBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogVGhpcyBjb25maWd1cmF0aW9uIGtlZXBzIHRoZSBoYXJkd2FyZSBmZWF0dXJlIG9mIHBhcmFtZXRlciAgICAgKi8KKyAgICAgIC8qICAgICAgIEV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgInRyaWdnZXIgZWRnZSBub25lIiBlcXVpdmFsZW50IHRvICAgICovCisgICAgICAvKiAgICAgICBzb2Z0d2FyZSBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKHNDb25maWdJbmplY3RlZC0+RXh0ZXJuYWxUcmlnSW5qZWNDb252ICE9IEFEQ19JTkpFQ1RFRF9TT0ZUV0FSRV9TVEFSVCkKKyAgICAgIHsKKyAgICAgICAgIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgPSAoICAoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbiAtIDFVKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udiAmIEFEQ19KU1FSX0pFWFRTRUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnZFZGdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCA9ICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE5ick9mQ29udmVyc2lvbiAtIDFVKSApOworICAgICAgfQorICAgICAgCisgICAgfQorICAgIAorICAgIC8qIDIuIENvbnRpbnVlIHNldHRpbmcgb2YgY29udGV4dCB1bmRlciBkZWZpbml0aW9uIHdpdGggcGFyYW1ldGVyICAgICAgICovCisgICAgLyogICAgcmVsYXRlZCB0byBlYWNoIGNoYW5uZWw6IGNoYW5uZWwgcmFuayBzZXF1ZW5jZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBDbGVhciB0aGUgb2xkIEpTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8KKyAgICB0bXBfSlNRUl9Db250ZXh0UXVldWVCZWluZ0J1aWx0ICY9IH5BRENfSlNRUl9SSyhBRENfU1FSM19TUTEwLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkUmFuayk7CisgICAgCisgICAgLyogU2V0IHRoZSBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovCisgICAgdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdCB8PSBBRENfSlNRUl9SSyhzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFJhbmspOworICAgIAorICAgIC8qIERlY3JlYXNlIGNoYW5uZWwgY291bnQgICovCisgICAgaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudC0tOworICAgIAorICAgIC8qIDMuIHRtcF9KU1FSX0NvbnRleHRRdWV1ZUJlaW5nQnVpbHQgaXMgZnVsbHkgYnVpbHQgZm9yIHRoaXMgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpCisgICAgICAgICAgY2FsbCwgYWdncmVnYXRlIHRoZSBzZXR0aW5nIHRvIHRob3NlIGFscmVhZHkgYnVpbHQgZHVyaW5nIHRoZSBwcmV2aW91cyAgCisgICAgICAgICAgSEFMX0FEQ0V4X0luamVjdGVkQ29uZmlnQ2hhbm5lbCgpIGNhbGxzIChmb3IgdGhlIHNhbWUgY29udGV4dCBvZiBjb3Vyc2UpICAqLworICAgIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUgfD0gdG1wX0pTUVJfQ29udGV4dFF1ZXVlQmVpbmdCdWlsdDsKKyAgICAKKyAgICAvKiA0LiBFbmQgb2YgY29udGV4dCBzZXR0aW5nOiBpZiB0aGlzIGlzIHRoZSBsYXN0IGNoYW5uZWwgc2V0LCB0aGVuIHdyaXRlIGNvbnRleHQKKyAgICAgICAgaW50byByZWdpc3RlciBKU1FSIGFuZCBtYWtlIGl0IGVudGVyIGludG8gcXVldWUgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoaGFkYy0+SW5qZWN0aW9uQ29uZmlnLkNoYW5uZWxDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5KU1FSLCBBRENfSlNRUl9GSUVMRFMsIGhhZGMtPkluamVjdGlvbkNvbmZpZy5Db250ZXh0UXVldWUpOyAKKyAgICB9CisgIH0KKworICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIHdoZW4gQURDIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQgd2l0aG91dCAgICovCisgIC8qIGNvbnZlcnNpb24gb24gZ29pbmcgb24gaW5qZWN0ZWQgZ3JvdXA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbmplY3RlZCBjb250ZXh0IHF1ZXVlOiBRdWV1ZSBkaXNhYmxlIChhY3RpdmUgY29udGV4dCBpcyBrZXB0KSBvciAgICAgKi8KKyAgLyogICAgZW5hYmxlIChjb250ZXh0IGRlY3JlbWVudGVkLCB1cCB0byAyIGNvbnRleHRzIHF1ZXVlZCkgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZTogY2FuIGJlIGVuYWJsZWQgb25seSBpZiBhdXRvLWluamVjdGVkICAgICAqLworICAvKiAgICBtb2RlIGlzIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgLyogSWYgYXV0by1pbmplY3RlZCBtb2RlIGlzIGRpc2FibGVkOiBubyBjb25zdHJhaW50ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRElTQUJMRSkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSlFNIHwgQURDX0NGR1JfSkRJU0NFTiwgCisgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0lOSkVDVF9DT05URVhUX1FVRVVFKCh1aW50MzJfdClzQ29uZmlnSW5qZWN0ZWQtPlF1ZXVlSW5qZWN0ZWRDb250ZXh0KSAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9JTkpFQ1RfRElTQ0NPTlRJTlVPVVMoKHVpbnQzMl90KXNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWREaXNjb250aW51b3VzQ29udk1vZGUpICApOworICAgIH0KKyAgICAvKiBJZiBhdXRvLWluamVjdGVkIG1vZGUgaXMgZW5hYmxlZDogSW5qZWN0ZWQgZGlzY29udGludW91cyBzZXR0aW5nIGlzICAgICovCisgICAgLyogZGlzY2FyZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBNT0RJRllfUkVHKGhhZGMtPkluc3RhbmNlLT5DRkdSLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KUU0gfCBBRENfQ0ZHUl9KRElTQ0VOLCAKKyAgICAgICAgICAgICAgICAgQURDX0NGR1JfSU5KRUNUX0NPTlRFWFRfUVVFVUUoKHVpbnQzMl90KXNDb25maWdJbmplY3RlZC0+UXVldWVJbmplY3RlZENvbnRleHQpICk7CisgICAgfQorCisgIH0KKyAgCisgIC8qIFBhcmFtZXRlcnMgdXBkYXRlIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgd2hlbiBBREMgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZCB3aXRob3V0ICAgKi8KKyAgLyogY29udmVyc2lvbiBvbiBnb2luZyBvbiByZWd1bGFyIGFuZCBpbmplY3RlZCBncm91cHM6ICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIEF1dG9tYXRpYyBpbmplY3RlZCBjb252ZXJzaW9uOiBjYW4gYmUgZW5hYmxlZCBpZiBpbmplY3RlZCBncm91cCAgICAgICAqLworICAvKiAgICBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQ2hhbm5lbCBzYW1wbGluZyB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENoYW5uZWwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhciA9IExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9IExMX0FEQ19JTkpfSXNDb252ZXJzaW9uT25nb2luZyhoYWRjLT5JbnN0YW5jZSk7CisgIAorICBpZiAoICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkKKyAgICAgICYmICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKQorICAgICApCisgIHsKKyAgICAvKiBJZiBpbmplY3RlZCBncm91cCBleHRlcm5hbCB0cmlnZ2VycyBhcmUgZGlzYWJsZWQgKHNldCB0byBpbmplY3RlZCAgICAgICovCisgICAgLyogc29mdHdhcmUgc3RhcnQpOiBubyBjb25zdHJhaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICgoc0NvbmZpZ0luamVjdGVkLT5FeHRlcm5hbFRyaWdJbmplY0NvbnYgPT0gQURDX0lOSkVDVEVEX1NPRlRXQVJFX1NUQVJUKQorICAgICAgIHx8IChzQ29uZmlnSW5qZWN0ZWQtPkV4dGVybmFsVHJpZ0luamVjQ29udkVkZ2UgPT0gQURDX0VYVEVSTkFMVFJJR0lOSkVDQ09OVl9FREdFX05PTkUpKQorICAgIHsKKyAgICAgICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkF1dG9JbmplY3RlZENvbnYgPT0gRU5BQkxFKQorICAgICAgICAgeworICAgICAgICAgICBTRVRfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSLCBBRENfQ0ZHUl9KQVVUTyk7ICAgIAorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsgICAgCisgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAvKiBJZiBBdXRvbWF0aWMgaW5qZWN0ZWQgY29udmVyc2lvbiB3YXMgaW50ZW5kZWQgdG8gYmUgc2V0IGFuZCBjb3VsZCBub3QgICovCisgICAgLyogZHVlIHRvIGluamVjdGVkIGdyb3VwIGV4dGVybmFsIHRyaWdnZXJzIGVuYWJsZWQsIGVycm9yIGlzIHJlcG9ydGVkLiAgICAqLworICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc0NvbmZpZ0luamVjdGVkLT5BdXRvSW5qZWN0ZWRDb252ID09IEVOQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEFEQyBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCisgICAgICAgIFNFVF9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfRVJST1JfQ09ORklHKTsKKyAgICAgICAgCisgICAgICAgIHRtcF9oYWxfc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaGFkYy0+SW5zdGFuY2UtPkNGR1IsIEFEQ19DRkdSX0pBVVRPKTsgCisgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nTW9kZSA9PSBFTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19PVkVSU0FNUExJTkdfUkFUSU8oc0NvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZy5SYXRpbykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0FEQ19SSUdIVF9CSVRfU0hJRlQoc0NvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0KSk7CisgICAgICAKKyAgICAgIC8qICBKT1ZTRSBtdXN0IGJlIHJlc2V0IGluIGNhc2Ugb2YgdHJpZ2dlcmVkIHJlZ3VsYXIgbW9kZSAgKi8KKyAgICAgIGFzc2VydF9wYXJhbSghKFJFQURfQklUKGhhZGMtPkluc3RhbmNlLT5DRkdSMiwgQURDX0NGR1IyX1JPVlNFfEFEQ19DRkdSMl9UUk9WUykgPT0gKEFEQ19DRkdSMl9ST1ZTRXxBRENfQ0ZHUjJfVFJPVlMpKSk7CisgICAgICAKKyAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgSW5qZWN0ZWQgT3ZlcnNhbXBsZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIE92ZXJzYW1wbGluZyBSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAtIFJpZ2h0IGJpdCBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIAorICAgICAgLyogRW5hYmxlIE92ZXJTYW1wbGluZyBtb2RlICovCisgICAgICAgTU9ESUZZX1JFRyhoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsCisgICAgICAgICAgICAgICAgICBBRENfQ0ZHUjJfSk9WU0UgfAorICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX09WU1IgIHwKKyAgICAgICAgICAgICAgICAgIEFEQ19DRkdSMl9PVlNTLAorICAgICAgICAgICAgICAgICAgQURDX0NGR1IyX0pPVlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCisgICAgICAgICAgICAgICAgICBzQ29uZmlnSW5qZWN0ZWQtPkluamVjT3ZlcnNhbXBsaW5nLlJhdGlvICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgc0NvbmZpZ0luamVjdGVkLT5JbmplY092ZXJzYW1wbGluZy5SaWdodEJpdFNoaWZ0CisgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFJlZ3VsYXIgT3ZlclNhbXBsaW5nICovCisgICAgICAgQ0xFQVJfQklUKCBoYWRjLT5JbnN0YW5jZS0+Q0ZHUjIsIEFEQ19DRkdSMl9KT1ZTRSk7CisgICAgfQorICAgIAorICAgICAgLyogU2V0IHNhbXBsaW5nIHRpbWUgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovCisgICAgICBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZShoYWRjLT5JbnN0YW5jZSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwsIHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRTYW1wbGluZ1RpbWUpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgb2Zmc2V0OiBvZmZzZXQgZW5hYmxlL2Rpc2FibGUsIGNoYW5uZWwsIG9mZnNldCB2YWx1ZSAqLworICAgIAorICAgIC8qIFNoaWZ0IHRoZSBvZmZzZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzZWxlY3RlZCBBREMgcmVzb2x1dGlvbi4gKi8KKyAgICAvKiBPZmZzZXQgaGFzIHRvIGJlIGxlZnQtYWxpZ25lZCBvbiBiaXQgMTEsIHRoZSBMU0IgKHJpZ2h0IGJpdHMpIGFyZSBzZXQgdG8gMCAqLworICAgIHRtcE9mZnNldFNoaWZ0ZWQgPSBBRENfT0ZGU0VUX1NISUZUX1JFU09MVVRJT04oaGFkYywgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldCk7CisgICAgCisgICAgaWYoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZE9mZnNldE51bWJlciAhPSBBRENfT0ZGU0VUX05PTkUpCisgICAgeworICAgICAgLyogU2V0IEFEQyBzZWxlY3RlZCBvZmZzZXQgbnVtYmVyICovCisgICAgICBMTF9BRENfU2V0T2Zmc2V0KGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkT2Zmc2V0TnVtYmVyLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgdG1wT2Zmc2V0U2hpZnRlZCk7CisgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTY2FuIGVhY2ggb2Zmc2V0IHJlZ2lzdGVyIHRvIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBjaGFubmVsIGlzIHRhcmdldGVkLiAqLworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IG51bWJlciBpcyBkaXNhYmxlZC4gICAgICAgKi8KKyAgICAgIGlmKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8xKSkgPT0gX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMSwgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICAgIGlmKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8yKSkgPT0gX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMiwgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICAgIGlmKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF8zKSkgPT0gX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfMywgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICAgIGlmKF9fTExfQURDX0NIQU5ORUxfVE9fREVDSU1BTF9OQihMTF9BRENfR2V0T2Zmc2V0Q2hhbm5lbChoYWRjLT5JbnN0YW5jZSwgTExfQURDX09GRlNFVF80KSkgPT0gX19MTF9BRENfQ0hBTk5FTF9UT19ERUNJTUFMX05CKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSkKKyAgICAgIHsKKyAgICAgICBMTF9BRENfU2V0T2Zmc2V0U3RhdGUoaGFkYy0+SW5zdGFuY2UsIExMX0FEQ19PRkZTRVRfNCwgTExfQURDX09GRlNFVF9ESVNBQkxFKTsKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIAorICAvKiBQYXJhbWV0ZXJzIHVwZGF0ZSBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSB1cGRhdGVkIG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQ6ICAgICAgICAgICAgICAgICovCisgIC8qICAtIFNpbmdsZSBvciBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBJbnRlcm5hbCBtZWFzdXJlbWVudCBjaGFubmVsczogVmJhdC9WcmVmSW50L1RlbXBTZW5zb3IgICAgICAgICAgICAgICAgKi8KKyAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgeworICAgIC8qIFNldCBtb2RlIHNpbmdsZS1lbmRlZCBvciBkaWZmZXJlbnRpYWwgaW5wdXQgb2YgdGhlIHNlbGVjdGVkIEFEQyBjaGFubmVsICovCisgICAgTExfQURDX1NldENoYW5uZWxTaW5nbGVEaWZmKGhhZGMtPkluc3RhbmNlLCBzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNpbmdsZURpZmYpOworICAgIAorICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgZGlmZmVyZW50aWFsIG1vZGUgKi8KKyAgICAvKiBOb3RlOiBBREMgY2hhbm5lbCBudW1iZXIgbWFza2VkIHdpdGggdmFsdWUgIjB4MUYiIHRvIGVuc3VyZSBzaGlmdCB2YWx1ZSB3aXRoaW4gMzIgYml0cyByYW5nZSAqLworICAgIGlmIChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkU2luZ2xlRGlmZiA9PSBBRENfRElGRkVSRU5USUFMX0VOREVEKQorICAgIHsKKyAgICAgIC8qIFNldCBzYW1wbGluZyB0aW1lIG9mIHRoZSBzZWxlY3RlZCBBREMgY2hhbm5lbCAqLworICAgICAgTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoaGFkYy0+SW5zdGFuY2UsICh1aW50MzJfdCkoX19MTF9BRENfREVDSU1BTF9OQl9UT19DSEFOTkVMKChfX0xMX0FEQ19DSEFOTkVMX1RPX0RFQ0lNQUxfTkIoKHVpbnQzMl90KXNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsKSArIDFVTCkgJiAweDFGVUwpKSwgc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZFNhbXBsaW5nVGltZSk7CisgICAgfQorICAgIAorICAgIC8qIE1hbmFnZW1lbnQgb2YgaW50ZXJuYWwgbWVhc3VyZW1lbnQgY2hhbm5lbHM6IFZiYXQvVnJlZkludC9UZW1wU2Vuc29yICAgKi8KKyAgICAvKiBpbnRlcm5hbCBtZWFzdXJlbWVudCBwYXRocyBlbmFibGU6IElmIGludGVybmFsIGNoYW5uZWwgc2VsZWN0ZWQsICAgICAgICovCisgICAgLyogZW5hYmxlIGRlZGljYXRlZCBpbnRlcm5hbCBidWZmZXJzIGFuZCBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IHRoZXNlIGludGVybmFsIG1lYXN1cmVtZW50IHBhdGhzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAgICAgICAgICAgKi8KKyAgICAvKiBIQUxfQURDX0RlSW5pdCgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgaWYoX19MTF9BRENfSVNfQ0hBTk5FTF9JTlRFUk5BTChzQ29uZmlnSW5qZWN0ZWQtPkluamVjdGVkQ2hhbm5lbCkpCisgICAgeworICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21tb24gQURDIHBhcmFtZXRlcnMgKGNvbnRpbnVhdGlvbikgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qIFNvZnR3YXJlIGlzIGFsbG93ZWQgdG8gY2hhbmdlIGNvbW1vbiBwYXJhbWV0ZXJzIG9ubHkgd2hlbiBhbGwgQURDcyAgICovCisgICAgICAvKiBvZiB0aGUgY29tbW9uIGdyb3VwIGFyZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKF9fTExfQURDX0lTX0VOQUJMRURfQUxMX0NPTU1PTl9JTlNUQU5DRShfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKSA9PSAwVUwpCisgICAgICB7CisgICAgICAgIHRtcF9jb25maWdfaW50ZXJuYWxfY2hhbm5lbCA9IExMX0FEQ19HZXRDb21tb25QYXRoSW50ZXJuYWxDaChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgICAgICAgCisgICAgICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQsICovCisgICAgICAgIC8qIGJ5cGFzcyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVEVNUFNFTlNPUikgJiYgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9URU1QU0VOU09SKSA9PSAwVUwpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEFEQ19URU1QRVJBVFVSRV9TRU5TT1JfSU5TVEFOQ0UoaGFkYykpCisgICAgICAgICAgeworICAgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIExMX0FEQ19QQVRIX0lOVEVSTkFMX1RFTVBTRU5TT1IgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBEZWxheSBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIHN0YWJpbGl6YXRpb24gdGltZSAqLworICAgICAgICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgICAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoTExfQURDX0RFTEFZX1RFTVBTRU5TT1JfU1RBQl9VUyAvIDEwVUwpICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpKTsKKyAgICAgICAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwVUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc0NvbmZpZ0luamVjdGVkLT5JbmplY3RlZENoYW5uZWwgPT0gQURDX0NIQU5ORUxfVkJBVCkgJiYgKCh0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwgJiBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUKSA9PSAwVUwpKQorICAgICAgICB7IAorICAgICAgICAgIGlmIChBRENfQkFUVEVSWV9WT0xUQUdFX0lOU1RBTkNFKGhhZGMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExMX0FEQ19TZXRDb21tb25QYXRoSW50ZXJuYWxDaChfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpLCBMTF9BRENfUEFUSF9JTlRFUk5BTF9WQkFUIHwgdG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHNDb25maWdJbmplY3RlZC0+SW5qZWN0ZWRDaGFubmVsID09IEFEQ19DSEFOTkVMX1ZSRUZJTlQpICYmICgodG1wX2NvbmZpZ19pbnRlcm5hbF9jaGFubmVsICYgTExfQURDX1BBVEhfSU5URVJOQUxfVlJFRklOVCkgPT0gMFVMKSkKKyAgICAgICAgeyAKKyAgICAgICAgICBpZiAoQURDX1ZSRUZJTlRfSU5TVEFOQ0UoaGFkYykpCisgICAgICAgICAgeworICAgICAgICAgICAgTExfQURDX1NldENvbW1vblBhdGhJbnRlcm5hbENoKF9fTExfQURDX0NPTU1PTl9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSksIExMX0FEQ19QQVRIX0lOVEVSTkFMX1ZSRUZJTlQgfCB0bXBfY29uZmlnX2ludGVybmFsX2NoYW5uZWwpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIElmIHRoZSByZXF1ZXN0ZWQgaW50ZXJuYWwgbWVhc3VyZW1lbnQgcGF0aCBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQgICovCisgICAgICAvKiBhbmQgb3RoZXIgQURDIG9mIHRoZSBjb21tb24gZ3JvdXAgYXJlIGVuYWJsZWQsIGludGVybmFsICAgICAgICAgICAgICAqLworICAgICAgLyogbWVhc3VyZW1lbnQgcGF0aHMgY2Fubm90IGJlIGVuYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGVsc2UgIAorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgQURDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgU0VUX0JJVChoYWRjLT5TdGF0ZSwgSEFMX0FEQ19TVEFURV9FUlJPUl9DT05GSUcpOworICAgICAgICAKKyAgICAgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIAorICB9CisgIAorICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoYWRjKTsKKyAgCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJbmplY3RlZCBRdWV1ZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiByZXNldHMgQ0ZHUiByZWdpc3RlciBKUURJUyBiaXQgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZQorICAqICAgICAgICAgSW5qZWN0ZWQgUXVldWUuIEpRRElTIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBBRFNUQVJUIGFuZCBKRFNUQVJUCisgICogICAgICAgICBhcmUgYm90aCBlcXVhbCB0byAwIHRvIGVuc3VyZSB0aGF0IG5vIHJlZ3VsYXIgbm9yIGluamVjdGVkIAorICAqICAgICAgICAgY29udmVyc2lvbiBpcyBvbmdvaW5nLiAKKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRW5hYmxlSW5qZWN0ZWRRdWV1ZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIHVpbnQzMl90IHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQ7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPSBMTF9BRENfUkVHX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPSBMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoaGFkYy0+SW5zdGFuY2UpOworICAKKyAgLyogUGFyYW1ldGVyIGNhbiBiZSBzZXQgb25seSBpZiBubyBjb252ZXJzaW9uIGlzIG9uLWdvaW5nICovCisgIGlmICggICAodG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX3JlZ3VsYXIgPT0gMFVMKQorICAgICAgJiYgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19pbmplY3RlZCA9PSAwVUwpCisgICAgICkKKyAgeworICAgIENMRUFSX0JJVChoYWRjLT5JbnN0YW5jZS0+Q0ZHUiwgQURDX0NGR1JfSlFESVMpOworICAgIAorICAgIC8qIFVwZGF0ZSBzdGF0ZSwgY2xlYXIgcHJldmlvdXMgcmVzdWx0IHJlbGF0ZWQgdG8gaW5qZWN0ZWQgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICBDTEVBUl9CSVQoaGFkYy0+U3RhdGUsIEhBTF9BRENfU1RBVEVfSU5KX0pRT1ZGKTsKKyAgICAKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgSW5qZWN0ZWQgUXVldWUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0cyBDRkdSIHJlZ2lzdGVyIEpRRElTIGJpdCBpbiBvcmRlciB0byBkaXNhYmxlIHRoZQorICAqICAgICAgICAgSW5qZWN0ZWQgUXVldWUuIEpRRElTIGNhbiBiZSB3cml0dGVuIG9ubHkgd2hlbiBBRFNUQVJUIGFuZCBKRFNUQVJUCisgICogICAgICAgICBhcmUgYm90aCBlcXVhbCB0byAwIHRvIGVuc3VyZSB0aGF0IG5vIHJlZ3VsYXIgbm9yIGluamVjdGVkIAorICAqICAgICAgICAgY29udmVyc2lvbiBpcyBvbmdvaW5nLiAKKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRGlzYWJsZUluamVjdGVkUXVldWUoQURDX0hhbmRsZVR5cGVEZWYqIGhhZGMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHRtcF9oYWxfc3RhdHVzOworICB1aW50MzJfdCB0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfcmVndWxhcjsKKyAgdWludDMyX3QgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoaGFkYy0+SW5zdGFuY2UpKTsKKyAgCisgIHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID0gTExfQURDX1JFR19Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgdG1wX2FkY19pc19jb252ZXJzaW9uX29uX2dvaW5nX2luamVjdGVkID0gTExfQURDX0lOSl9Jc0NvbnZlcnNpb25PbmdvaW5nKGhhZGMtPkluc3RhbmNlKTsKKyAgCisgIC8qIFBhcmFtZXRlciBjYW4gYmUgc2V0IG9ubHkgaWYgbm8gY29udmVyc2lvbiBpcyBvbi1nb2luZyAqLworICBpZiAoICAgKHRtcF9hZGNfaXNfY29udmVyc2lvbl9vbl9nb2luZ19yZWd1bGFyID09IDBVTCkKKyAgICAgICYmICh0bXBfYWRjX2lzX2NvbnZlcnNpb25fb25fZ29pbmdfaW5qZWN0ZWQgPT0gMFVMKQorICAgICApCisgIHsKKyAgICBMTF9BRENfSU5KX1NldFF1ZXVlTW9kZShoYWRjLT5JbnN0YW5jZSwgTExfQURDX0lOSl9RVUVVRV9ESVNBQkxFKTsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgQURDIHZvbHRhZ2UgcmVndWxhdG9yLgorICAqIEBub3RlICAgRGlzYWJsaW5nIHZvbHRhZ2UgcmVndWxhdG9yIGFsbG93cyB0byBzYXZlIHBvd2VyLiBUaGlzIG9wZXJhdGlvbiBjYW4KKyAgKiAgICAgICAgIGJlIGNhcnJpZWQgb3V0IG9ubHkgd2hlbiBBREMgaXMgZGlzYWJsZWQuCisgICogQG5vdGUgICBUbyBlbmFibGUgYWdhaW4gdGhlIHZvbHRhZ2UgcmVndWxhdG9yLCB0aGUgdXNlciBpcyBleHBlY3RlZCB0byAKKyAgKiAgICAgICAgIHJlc29ydCB0byBIQUxfQURDX0luaXQoKSBBUEkuCisgICogQHBhcmFtIGhhZGMgQURDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKEFEQ19IYW5kbGVUeXBlRGVmKiBoYWRjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiB0bXBfaGFsX3N0YXR1czsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKGhhZGMtPkluc3RhbmNlKSk7CisgIAorICAvKiBTZXR0aW5nIG9mIHRoaXMgZmVhdHVyZSBpcyBjb25kaXRpb25lZCB0byBBREMgc3RhdGU6IEFEQyBtdXN0IGJlIEFEQyBkaXNhYmxlZCAqLworICBpZiAoTExfQURDX0lzRW5hYmxlZChoYWRjLT5JbnN0YW5jZSkgPT0gMFVMKQorICB7CisgICAgTExfQURDX0Rpc2FibGVJbnRlcm5hbFJlZ3VsYXRvcihoYWRjLT5JbnN0YW5jZSk7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX2hhbF9zdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgCisgIHJldHVybiB0bXBfaGFsX3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFbnRlciBBREMgZGVlcC1wb3dlci1kb3duIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgbW9kZSBpcyBhY2hpZXZlZCBpbiBzZXR0aW5nIERFRVBQV0QgYml0IGFuZCBhbGxvd3MgdG8gc2F2ZSBwb3dlciAKKyAgKiAgICAgICAgIGluIHJlZHVjaW5nIGxlYWthZ2UgY3VycmVudHMuIEl0IGlzIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBiZWZvcmUgCisgICogICAgICAgICBlbnRlcmluZyBzdG9wIG1vZGVzLgorICAqIEBub3RlICAgU2V0dGluZyBERUVQUFdEIGF1dG9tYXRpY2FsbHkgY2xlYXJzIEFEVlJFR0VOIGJpdCBhbmQgZGlzYWJsZXMgdGhlCisgICogICAgICAgICBBREMgdm9sdGFnZSByZWd1bGF0b3IuIFRoaXMgbWVhbnMgdGhhdCB0aGlzIEFQSSBlbmNvbXBhc3NlcworICAqICAgICAgICAgSEFMX0FEQ0V4X0Rpc2FibGVWb2x0YWdlUmVndWxhdG9yKCkuIEFkZGl0aW9uYWxseSwgdGhlIGludGVybmFsCisgICogICAgICAgICBjYWxpYnJhdGlvbiBpcyBsb3N0LgorICAqIEBub3RlICAgVG8gZXhpdCB0aGUgQURDIGRlZXAtcG93ZXItZG93biBtb2RlLCB0aGUgdXNlciBpcyBleHBlY3RlZCB0byAKKyAgKiAgICAgICAgIHJlc29ydCB0byBIQUxfQURDX0luaXQoKSBBUEkgYXMgd2VsbCBhcyB0byByZWxhdW5jaCBhIGNhbGlicmF0aW9uCisgICogICAgICAgICB3aXRoIEhBTF9BRENFeF9DYWxpYnJhdGlvbl9TdGFydCgpIEFQSSBvciB0byByZS1hcHBseSBhIHByZXZpb3VzbHkKKyAgKiAgICAgICAgIHNhdmVkIGNhbGlicmF0aW9uIGZhY3Rvci4KKyAgKiBAcGFyYW0gaGFkYyBBREMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQURDRXhfRW50ZXJBRENEZWVwUG93ZXJEb3duTW9kZShBRENfSGFuZGxlVHlwZURlZiogaGFkYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgdG1wX2hhbF9zdGF0dXM7CisgIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0FMTF9JTlNUQU5DRShoYWRjLT5JbnN0YW5jZSkpOworICAKKyAgLyogU2V0dGluZyBvZiB0aGlzIGZlYXR1cmUgaXMgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlOiBBREMgbXVzdCBiZSBBREMgZGlzYWJsZWQgKi8KKyAgaWYgKExMX0FEQ19Jc0VuYWJsZWQoaGFkYy0+SW5zdGFuY2UpID09IDBVTCkKKyAgeworICAgIExMX0FEQ19FbmFibGVEZWVwUG93ZXJEb3duKGhhZGMtPkluc3RhbmNlKTsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXBfaGFsX3N0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHRtcF9oYWxfc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0FEQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2NvbXAuYyBiL1NyYy9zdG0zMndieHhfaGFsX2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I0YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfY29tcC5jCkBAIC0wLDAgKzEsOTkyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jb21wLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENPTVAgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ09NUCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgaW4gcG9sbGluZyBtb2RlCisgICogICAgICAgICAgICsgU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zIGluIGludGVycnVwdCBtb2RlICh0aHJvdWdoIEVYVEkgaW50ZXJydXB0KQorICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgY29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIHN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAjIyMjIyBDT01QIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXQorICAgICAgVGhlIFNUTTMyV0J4eCBkZXZpY2UgZmFtaWx5IGludGVncmF0ZXMgdHdvIGFuYWxvZyBjb21wYXJhdG9ycyBpbnN0YW5jZXM6CisgICAgICBDT01QMSwgQ09NUDIuCisgICAgICAoIykgQ29tcGFyYXRvcnMgaW5wdXQgbWludXMgKGludmVydGluZyBpbnB1dCkgYW5kIGlucHV0IHBsdXMgKG5vbiBpbnZlcnRpbmcgaW5wdXQpCisgICAgICAgICAgY2FuIGJlIHNldCB0byBpbnRlcm5hbCByZWZlcmVuY2VzIG9yIHRvIEdQSU8gcGlucworICAgICAgICAgIChyZWZlciB0byBHUElPIGxpc3QgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKKyAgICAgICgjKSBDb21wYXJhdG9ycyBvdXRwdXQgbGV2ZWwgaXMgYXZhaWxhYmxlIHVzaW5nIEhBTF9DT01QX0dldE91dHB1dExldmVsKCkKKyAgICAgICAgICBhbmQgY2FuIGJlIHJlZGlyZWN0ZWQgdG8gb3RoZXIgcGVyaXBoZXJhbHM6IEdQSU8gcGlucyAoaW4gbW9kZQorICAgICAgICAgIGFsdGVybmF0ZSBmdW5jdGlvbnMgZm9yIGNvbXBhcmF0b3IpLCB0aW1lcnMuCisgICAgICAgICAgKHJlZmVyIHRvIEdQSU8gbGlzdCBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworICAgICAgKCMpIFRoZSBjb21wYXJhdG9ycyBoYXZlIGludGVycnVwdCBjYXBhYmlsaXR5IHRocm91Z2ggdGhlIEVYVEkgY29udHJvbGxlcgorICAgICAgICAgIHdpdGggd2FrZS11cCBmcm9tIHNsZWVwIGFuZCBzdG9wIG1vZGVzLgorCisgICAgICAoIykgUGFpcnMgb2YgY29tcGFyYXRvcnMgaW5zdGFuY2VzIGNhbiBiZSBjb21iaW5lZCBpbiB3aW5kb3cgbW9kZQorICAgICAgICAgICgyIGNvbnNlY3V0aXZlIGluc3RhbmNlcyBvZGQgYW5kIGV2ZW4gQ09NUDx4PiBhbmQgQ09NUDx4KzE+KS4KKworICAgICAgICAgIEZyb20gdGhlIGNvcnJlc3BvbmRpbmcgSVJRIGhhbmRsZXIsIHRoZSByaWdodCBpbnRlcnJ1cHQgc291cmNlIGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICB1c2luZyBtYWNybyBfX0hBTF9DT01QX0NPTVB4X0VYVElfR0VUX0ZMQUcoKS4KKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBhbmQgcHJvZ3JhbSB0aGUgY29tcGFyYXRvciBpbnN0YW5jZXMKKyAgICAgIG9mIFNUTTMyV0J4eCBkZXZpY2VzLgorCisgICAgICBUbyB1c2UgdGhlIGNvbXBhcmF0b3IsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczoKKworICAgICAgKCMpICBJbml0aWFsaXplIHRoZSBDT01QIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfQ09NUF9Nc3BJbml0KCk6CisgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgR1BJTyBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBpbnB1dHMgcGx1cyBhbmQgbWludXMgaW4gYW5hbG9nIG1vZGUKKyAgICAgICAgICAgdXNpbmcgSEFMX0dQSU9fSW5pdCgpLgorICAgICAgKCsrKSBJZiBuZWVkZWQsIGNvbmZpZ3VyZSB0aGUgR1BJTyBjb25uZWN0ZWQgdG8gY29tcGFyYXRvciBvdXRwdXQgaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUKKyAgICAgICAgICAgdXNpbmcgSEFMX0dQSU9fSW5pdCgpLgorICAgICAgKCsrKSBJZiByZXF1aXJlZCBlbmFibGUgdGhlIENPTVAgaW50ZXJydXB0IGJ5IGNvbmZpZ3VyaW5nIGFuZCBlbmFibGluZyBFWFRJIGxpbmUgaW4gSW50ZXJydXB0IG1vZGUgYW5kCisgICAgICAgICAgIHNlbGVjdGluZyB0aGUgZGVzaXJlZCBzZW5zaXRpdml0eSBsZXZlbCB1c2luZyBIQUxfR1BJT19Jbml0KCkgZnVuY3Rpb24uIEFmdGVyIHRoYXQgZW5hYmxlIHRoZSBjb21wYXJhdG9yCisgICAgICAgICAgIGludGVycnVwdCB2ZWN0b3IgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfSW5pdCgpIGZ1bmN0aW9uOgorICAgICAgKCsrKSBTZWxlY3QgdGhlIGlucHV0IG1pbnVzIChpbnZlcnRpbmcgaW5wdXQpCisgICAgICAoKyspIFNlbGVjdCB0aGUgaW5wdXQgcGx1cyAobm9uLWludmVydGluZyBpbnB1dCkKKyAgICAgICgrKykgU2VsZWN0IHRoZSBoeXN0ZXJlc2lzCisgICAgICAoKyspIFNlbGVjdCB0aGUgYmxhbmtpbmcgc291cmNlCisgICAgICAoKyspIFNlbGVjdCB0aGUgb3V0cHV0IHBvbGFyaXR5CisgICAgICAoKyspIFNlbGVjdCB0aGUgcG93ZXIgbW9kZQorICAgICAgKCsrKSBTZWxlY3QgdGhlIHdpbmRvdyBtb2RlCisKKyAgICAgIC1AQC0gSEFMX0NPTVBfSW5pdCgpIGNhbGxzIGludGVybmFsbHkgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkKKyAgICAgICAgICB0byBlbmFibGUgaW50ZXJuYWwgY29udHJvbCBjbG9jayBvZiB0aGUgY29tcGFyYXRvcnMuCisgICAgICAgICAgSG93ZXZlciwgdGhpcyBpcyBhIGxlZ2FjeSBzdHJhdGVneS4gSW4gZnV0dXJlIFNUTTMyIGZhbWlsaWVzLAorICAgICAgICAgIENPTVAgY2xvY2sgZW5hYmxlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdXNlciBpbiAiSEFMX0NPTVBfTXNwSW5pdCgpIi4KKyAgICAgICAgICBUaGVyZWZvcmUsIGZvciBjb21wYXRpYmlsaXR5IGFudGljaXBhdGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyAgICAgICAgICBpbXBsZW1lbnQgX19IQUxfUkNDX1NZU0NGR19DTEtfRU5BQkxFKCkgaW4gIkhBTF9DT01QX01zcEluaXQoKSIuCisKKyAgICAgICgjKSBSZWNvbmZpZ3VyYXRpb24gb24tdGhlLWZseSBvZiBjb21wYXJhdG9yIGNhbiBiZSBkb25lIGJ5IGNhbGxpbmcgYWdhaW4KKyAgICAgICAgICBmdW5jdGlvbiBIQUxfQ09NUF9Jbml0KCkgd2l0aCBuZXcgaW5wdXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzLgorCisgICAgICAoIykgRW5hYmxlIHRoZSBjb21wYXJhdG9yIHVzaW5nIEhBTF9DT01QX1N0YXJ0KCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBVc2UgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKCkgb3IgSEFMX0NPTVBfR2V0T3V0cHV0TGV2ZWwoKSBmdW5jdGlvbnMKKyAgICAgICAgICB0byBtYW5hZ2UgY29tcGFyYXRvciBvdXRwdXRzIChldmVudHMgYW5kIG91dHB1dCBsZXZlbCkuCisKKyAgICAgICgjKSBEaXNhYmxlIHRoZSBjb21wYXJhdG9yIHVzaW5nIEhBTF9DT01QX1N0b3AoKSBmdW5jdGlvbi4KKworICAgICAgKCMpIERlLWluaXRpYWxpemUgdGhlIGNvbXBhcmF0b3IgdXNpbmcgSEFMX0NPTVBfRGVJbml0KCkgZnVuY3Rpb24uCisKKyAgICAgICgjKSBGb3Igc2FmZXR5IHB1cnBvc2UsIGNvbXBhcmF0b3IgY29uZmlndXJhdGlvbiBjYW4gYmUgbG9ja2VkIHVzaW5nIEhBTF9DT01QX0xvY2soKSBmdW5jdGlvbi4KKyAgICAgICAgICBUaGUgb25seSB3YXkgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGlzIGEgZGV2aWNlIGhhcmR3YXJlIHJlc2V0LgorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUywgd2hlbiBzZXQgdG8gMSwKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9DT01QX1JlZ2lzdGVyQ2FsbGJhY2soKQorICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICAgWy4uXQorCisgICAgIEZ1bmN0aW9uIEByZWYgSEFMX0NPTVBfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgOiBjYWxsYmFjayBmb3IgQ09NUCB0cmlnZ2VyLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9DT01QX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIEByZWYgSEFMX0NPTVBfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgVHJpZ2dlckNhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIENPTVAgdHJpZ2dlci4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgWy4uXQorCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9DT01QX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfQ09NUF9TVEFURV9SRVNFVAorICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgIGV4YW1wbGUgQHJlZiBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soKS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUKKyAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfQ09NUF9Jbml0KCkvIEByZWYgSEFMX0NPTVBfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgWy4uXQorCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0NPTVBfSW5pdCgpLyBAcmVmIEhBTF9DT01QX0RlSW5pdCgpCisgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorICAgICBbLi5dCisKKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9DT01QX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICBpbiBAcmVmIEhBTF9DT01QX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0NPTVBfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgWy4uXQorCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfQ09NUF9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQ09NUF9EZUluaXQoKQorICAgICBvciBAcmVmIEhBTF9DT01QX0luaXQoKSBmdW5jdGlvbi4KKyAgICAgWy4uXQorCisgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9DT01QX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9DT01QX01PRFVMRV9FTkFCTEVECisKKworCisvKiogQGRlZmdyb3VwIENPTVAgQ09NUAorICAqIEBicmllZiBDT01QIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisKKy8qIERlbGF5IGZvciBDT01QIHN0YXJ0dXAgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOb3RlOiBEZWxheSByZXF1aXJlZCB0byByZWFjaCBwcm9wYWdhdGlvbiBkZWxheSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAqLworLyogTGl0ZXJhbCBzZXQgdG8gbWF4aW11bSB2YWx1ZSAocmVmZXIgdG8gZGV2aWNlIGRhdGFzaGVldCwgICAgICAgICAgICAgICAgICAgKi8KKy8qIHBhcmFtZXRlciAidFNUQVJUIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVbml0OiB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01QX0RFTEFZX1NUQVJUVVBfVVMgICAgICAgICAgKDgwVUwpIC8qITwgRGVsYXkgZm9yIENPTVAgc3RhcnR1cCB0aW1lICovCisKKy8qIERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMaXRlcmFsIHNldCB0byBtYXhpbXVtIHZhbHVlIChyZWZlciB0byBkZXZpY2UgZGF0YXNoZWV0LCAgICAgICAgICAgICAgICAgICAqLworLyogcGFyYW1ldGVyICJ0U1RBUlRfU0NBTEVSIikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVuaXQ6IHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAoMjAwVUwpICAvKiE8IERlbGF5IGZvciBDT01QIHZvbHRhZ2Ugc2NhbGVyIHN0YWJpbGl6YXRpb24gdGltZSAqLworCisjZGVmaW5lIENPTVBfT1VUUFVUX0xFVkVMX0JJVE9GRlNFVF9QT1MgICAgKDMwVUwpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnMgQ09NUCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENPTVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGRlLWluaXRpYWxpemUgY29tcGFyYXRvcnMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDT01QIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDT01QX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIElmIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yIGlzIGxvY2tlZCwgaW5pdGlhbGl6YXRpb24gY2FuJ3QgYmUgcGVyZm9ybWVkLgorICAqICAgICAgICAgVG8gdW5sb2NrIHRoZSBjb25maWd1cmF0aW9uLCBwZXJmb3JtIGEgc3lzdGVtIHJlc2V0LgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9Jbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIHVpbnQzMl90IHRtcF9jc3I7CisgIHVpbnQzMl90IGV4dGlfbGluZTsKKyAgdWludDMyX3QgY29tcF92b2x0YWdlX3NjYWxlcl9pbml0aWFsaXplZDsgLyogVmFsdWUgIjAiIGlmIGNvbXBhcmF0b3Igdm9sdGFnZSBzY2FsZXIgaXMgbm90IGluaXRpYWxpemVkICovCisgIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMFVMOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIENPTVAgaGFuZGxlIGFsbG9jYXRpb24gYW5kIGxvY2sgc3RhdHVzICovCisgIGlmKGhjb21wID09IE5VTEwpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZSBpZihfX0hBTF9DT01QX0lTX0xPQ0tFRChoY29tcCkpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfSU5QVVRfUExVUyhoY29tcC0+SW5zdGFuY2UsIGhjb21wLT5Jbml0LklucHV0UGx1cykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0lOUFVUX01JTlVTKGhjb21wLT5JbnN0YW5jZSwgaGNvbXAtPkluaXQuSW5wdXRNaW51cykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX09VVFBVVFBPTChoY29tcC0+SW5pdC5PdXRwdXRQb2wpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9QT1dFUk1PREUoaGNvbXAtPkluaXQuTW9kZSkpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0hZU1RFUkVTSVMoaGNvbXAtPkluaXQuSHlzdGVyZXNpcykpOworICAgIGFzc2VydF9wYXJhbShJU19DT01QX0JMQU5LSU5HU1JDX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSwgaGNvbXAtPkluaXQuQmxhbmtpbmdTcmNlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfVFJJR0dFUk1PREUoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9XSU5ET1dNT0RFKGhjb21wLT5Jbml0LldpbmRvd01vZGUpKTsKKworICAgIGlmKGhjb21wLT5TdGF0ZSA9PSBIQUxfQ09NUF9TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgICBoY29tcC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgICAgLyogU2V0IENPTVAgZXJyb3IgY29kZSB0byBub25lICovCisgICAgICBDT01QX0NMRUFSX0VSUk9SQ09ERShoY29tcCk7CisKKworI2lmIChVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBJbml0IHRoZSBDT01QIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrID0gSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworCisgICAgICBpZiAoaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgICAgeworICAgICAgICBoY29tcC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NPTVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICAgIH0KKworICAgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgICAvKiBOb3RlOiBJbnRlcm5hbCBjb250cm9sIGNsb2NrIG9mIHRoZSBjb21wYXJhdG9ycyBtdXN0ICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgYmUgZW5hYmxlZCBpbiAiSEFMX0NPTVBfTXNwSW5pdCgpIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIHVzaW5nICJfX0hBTF9SQ0NfU1lTQ0ZHX0NMS19FTkFCTEUoKSIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBoY29tcC0+TXNwSW5pdENhbGxiYWNrKGhjb21wKTsKKyNlbHNlCisgICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICAgIC8qIE5vdGU6IEludGVybmFsIGNvbnRyb2wgY2xvY2sgb2YgdGhlIGNvbXBhcmF0b3JzIG11c3QgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICBiZSBlbmFibGVkIGluICJIQUxfQ09NUF9Nc3BJbml0KCkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgdXNpbmcgIl9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpIi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIEhBTF9DT01QX01zcEluaXQoaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisKKyAgICAvKiBNZW1vcml6ZSB2b2x0YWdlIHNjYWxlciBzdGF0ZSBiZWZvcmUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBjb21wX3ZvbHRhZ2Vfc2NhbGVyX2luaXRpYWxpemVkID0gUkVBRF9CSVQoaGNvbXAtPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX1NDQUxFTik7CisKKyAgICAvKiBTZXQgQ09NUCBwYXJhbWV0ZXJzICovCisgICAgdG1wX2NzciA9ICggIGhjb21wLT5Jbml0LklucHV0TWludXMKKyAgICAgICAgICAgICAgIHwgaGNvbXAtPkluaXQuSW5wdXRQbHVzCisgICAgICAgICAgICAgICB8IGhjb21wLT5Jbml0LkJsYW5raW5nU3JjZQorICAgICAgICAgICAgICAgfCBoY29tcC0+SW5pdC5IeXN0ZXJlc2lzCisgICAgICAgICAgICAgICB8IGhjb21wLT5Jbml0Lk91dHB1dFBvbAorICAgICAgICAgICAgICAgfCBoY29tcC0+SW5pdC5Nb2RlCisgICAgICAgICAgICAgICk7CisKKyAgICAvKiBTZXQgcGFyYW1ldGVycyBpbiBDT01QIHJlZ2lzdGVyICovCisgICAgLyogTm90ZTogVXBkYXRlIGFsbCBiaXRzIGV4Y2VwdCByZWFkLW9ubHksIGxvY2sgYW5kIGVuYWJsZSBiaXRzICovCisgICAgTU9ESUZZX1JFRyhoY29tcC0+SW5zdGFuY2UtPkNTUiwKKyAgICAgICAgICAgICAgIENPTVBfQ1NSX1BXUk1PREUgIHwgQ09NUF9DU1JfSU5NU0VMICAgfCBDT01QX0NTUl9JTlBTRUwgIHwKKyAgICAgICAgICAgICAgIENPTVBfQ1NSX1dJTk1PREUgIHwgQ09NUF9DU1JfUE9MQVJJVFkgfCBDT01QX0NTUl9IWVNUICAgIHwKKyAgICAgICAgICAgICAgIENPTVBfQ1NSX0JMQU5LSU5HIHwgQ09NUF9DU1JfQlJHRU4gICAgfCBDT01QX0NTUl9TQ0FMRU4gIHwgQ09NUF9DU1JfSU5NRVNFTCwKKyAgICAgICAgICAgICAgIHRtcF9jc3IKKyAgICAgICAgICAgICAgKTsKKworICAgIC8qIFNldCB3aW5kb3cgbW9kZSAqLworICAgIC8qIE5vdGU6IFdpbmRvdyBtb2RlIGJpdCBpcyBsb2NhdGVkIGludG8gMSBvdXQgb2YgdGhlIDIgcGFpcnMgb2YgQ09NUCAgICAgKi8KKyAgICAvKiAgICAgICBpbnN0YW5jZXMuIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiBjYW4gdXBkYXRlIGFub3RoZXIgQ09NUCAgICAgICovCisgICAgLyogICAgICAgaW5zdGFuY2UgdGhhdCB0aGUgb25lIGN1cnJlbnRseSBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKGhjb21wLT5Jbml0LldpbmRvd01vZGUgPT0gQ09NUF9XSU5ET1dNT0RFX0NPTVAxX0lOUFVUX1BMVVNfQ09NTU9OKQorICAgIHsKKyAgICAgIFNFVF9CSVQoQ09NUDEyX0NPTU1PTi0+Q1NSLCBDT01QX0NTUl9XSU5NT0RFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIENMRUFSX0JJVChDT01QMTJfQ09NTU9OLT5DU1IsIENPTVBfQ1NSX1dJTk1PREUpOworICAgIH0KKworICAgIC8qIERlbGF5IGZvciBDT01QIHNjYWxlciBicmlkZ2Ugdm9sdGFnZSBzdGFiaWxpemF0aW9uICovCisgICAgLyogQXBwbHkgdGhlIGRlbGF5IGlmIHZvbHRhZ2Ugc2NhbGVyIGJyaWRnZSBpcyByZXF1aXJlZCBhbmQgbm90IGFscmVhZHkgZW5hYmxlZCAqLworICAgIGlmICgoUkVBRF9CSVQoaGNvbXAtPkluc3RhbmNlLT5DU1IsIENPTVBfQ1NSX1NDQUxFTikgIT0gMFVMKSAmJgorICAgICAgICAoY29tcF92b2x0YWdlX3NjYWxlcl9pbml0aWFsaXplZCA9PSAwVUwpICAgICAgICAgICAgICAgKQorICAgIHsKKyAgICAgIC8qIFdhaXQgbG9vcCBpbml0aWFsaXphdGlvbiBhbmQgZXhlY3V0aW9uICovCisgICAgICAvKiBOb3RlOiBWYXJpYWJsZSBkaXZpZGVkIGJ5IDIgdG8gY29tcGVuc2F0ZSBwYXJ0aWFsbHkgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICBDUFUgcHJvY2Vzc2luZyBjeWNsZXMsIHNjYWxpbmcgaW4gdXMgc3BsaXQgdG8gbm90ICAgICAgICAgICovCisgICAgICAvKiAgICAgICBleGNlZWQgMzIgYml0cyByZWdpc3RlciBjYXBhY2l0eSBhbmQgaGFuZGxlIGxvdyBmcmVxdWVuY3kuICovCisgICAgICB3YWl0X2xvb3BfaW5kZXggPSAoKENPTVBfREVMQVlfVk9MVEFHRV9TQ0FMRVJfU1RBQl9VUyAvIDEwVUwpICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDBVTCAqIDJVTCkpKTsKKyAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwVUwpCisgICAgICB7CisgICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCB0aGUgRVhUSSBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UgKi8KKyAgICBleHRpX2xpbmUgPSBDT01QX0dFVF9FWFRJX0xJTkUoaGNvbXAtPkluc3RhbmNlKTsKKworICAgIC8qIE1hbmFnZSBFWFRJIHNldHRpbmdzICovCisgICAgaWYoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgKENPTVBfRVhUSV9JVCB8IENPTVBfRVhUSV9FVkVOVCkpICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgRVhUSSByaXNpbmcgZWRnZSAqLworICAgICAgaWYoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9FWFRJX1JJU0lORykgIT0gMFVMKQorICAgICAgeworICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9FWFRJX0Rpc2FibGVSaXNpbmdUcmlnXzBfMzEoZXh0aV9saW5lKTsKKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIEVYVEkgZmFsbGluZyBlZGdlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfRkFMTElORykgIT0gMFVMKQorICAgICAgeworICAgICAgICBMTF9FWFRJX0VuYWJsZUZhbGxpbmdUcmlnXzBfMzEoZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorCisgICAgICAvKiBDbGVhciBDT01QIEVYVEkgcGVuZGluZyBiaXQgKGlmIGFueSkgKi8KKyAgICAgIExMX0VYVElfQ2xlYXJGbGFnXzBfMzEoZXh0aV9saW5lKTsKKworICAgICAgLyogQ29uZmlndXJlIEVYVEkgZXZlbnQgbW9kZSAqLworICAgICAgaWYoKGhjb21wLT5Jbml0LlRyaWdnZXJNb2RlICYgQ09NUF9FWFRJX0VWRU5UKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShleHRpX2xpbmUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBFWFRJIGludGVycnVwdCBtb2RlICovCisgICAgICBpZigoaGNvbXAtPkluaXQuVHJpZ2dlck1vZGUgJiBDT01QX0VYVElfSVQpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKGV4dGlfbGluZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIExMX0VYVElfRGlzYWJsZUlUXzBfMzEoZXh0aV9saW5lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVhUSSBldmVudCBtb2RlICovCisgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKGV4dGlfbGluZSk7CisKKyAgICAgIC8qIERpc2FibGUgRVhUSSBpbnRlcnJ1cHQgbW9kZSAqLworICAgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShleHRpX2xpbmUpOworICAgIH0KKworICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAvKiBOb3RlOiBUcmFuc2l0aW9uIGZyb20gc3RhdGUgcmVzZXQgdG8gc3RhdGUgcmVhZHksICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgb3RoZXJ3aXNlIChjb21pbmcgZnJvbSBzdGF0ZSByZWFkeSBvciBidXN5KSBubyBzdGF0ZSB1cGRhdGUuICAgICAqLworICAgIGlmIChoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIENPTVAgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZSAgIERlaW5pdGlhbGl6YXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBpZiB0aGUgQ09NUCBjb25maWd1cmF0aW9uIGlzIGxvY2tlZC4KKyAgKiAgICAgICAgIFRvIHVubG9jayB0aGUgY29uZmlndXJhdGlvbiwgcGVyZm9ybSBhIHN5c3RlbSByZXNldC4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NPTVBfRGVJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoaGNvbXAgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlIGlmKF9fSEFMX0NPTVBfSVNfTE9DS0VEKGhjb21wKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogU2V0IENPTVBfQ1NSIHJlZ2lzdGVyIHRvIHJlc2V0IHZhbHVlICovCisgICAgV1JJVEVfUkVHKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCAweDAwMDAwMDAwVUwpOworCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBpZiAoaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NPTVBfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgICAgfQorCisgICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIFJDQyBjbG9jaywgTlZJQyAqLworICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayhoY29tcCk7CisjZWxzZQorICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBSQ0MgY2xvY2ssIE5WSUMgKi8KKyAgICBIQUxfQ09NUF9Nc3BEZUluaXQoaGNvbXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVDsKKworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoY29tcCk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIENPTVAgTVNQLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9Nc3BJbml0KENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjb21wKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NPTVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgQ09NUCBNU1AuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DT01QX01zcERlSW5pdChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY29tcCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DT01QX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIENPTVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoY29tcCBQb2ludGVyIHRvIGEgQ09NUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ09NUC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX1RSSUdHRVJfQ0JfSUQgVHJpZ2dlciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9SZWdpc3RlckNhbGxiYWNrKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXAsIEhBTF9DT01QX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBDT01QX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKEhBTF9DT01QX1NUQVRFX1JFQURZID09IGhjb21wLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DT01QX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQ09NUF9TVEFURV9SRVNFVCA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NPTVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIENPTVAgQ2FsbGJhY2sKKyAgKiAgICAgICAgIENPTVAgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoY29tcCBQb2ludGVyIHRvIGEgQ09NUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgQ09NUC4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NPTVBfVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DT01QX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ09NUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCwgSEFMX0NPTVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChIQUxfQ09NUF9TVEFURV9SRUFEWSA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9DT01QX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBjYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfQ09NUF9TVEFURV9SRVNFVCA9PSBoY29tcC0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ09NUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNvbXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcEluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DT01QX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjb21wLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DT01QX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjb21wLT5FcnJvckNvZGUgfD0gSEFMX0NPTVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY29tcC0+RXJyb3JDb2RlIHw9IEhBTF9DT01QX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ09NUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorICAgICAgKCspIFN0b3AgYSBjb21wYXJhdG9yIGluc3RhbmNlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdGFydChDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICBfX0lPIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleCA9IDBVTDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UgaWYoX19IQUxfQ09NUF9JU19MT0NLRUQoaGNvbXApKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgICBpZihoY29tcC0+U3RhdGUgPT0gSEFMX0NPTVBfU1RBVEVfUkVBRFkpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBjb21wYXJhdG9yICovCisgICAgICBTRVRfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9FTik7CisKKyAgICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAgIGhjb21wLT5TdGF0ZSA9IEhBTF9DT01QX1NUQVRFX0JVU1k7CisKKyAgICAgIC8qIERlbGF5IGZvciBDT01QIHN0YXJ0dXAgdGltZSAqLworICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gKi8KKyAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgMiB0byBjb21wZW5zYXRlIHBhcnRpYWxseSAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIENQVSBwcm9jZXNzaW5nIGN5Y2xlcywgc2NhbGluZyBpbiB1cyBzcGxpdCB0byBub3QgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGV4Y2VlZCAzMiBiaXRzIHJlZ2lzdGVyIGNhcGFjaXR5IGFuZCBoYW5kbGUgbG93IGZyZXF1ZW5jeS4gKi8KKyAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgoQ09NUF9ERUxBWV9TVEFSVFVQX1VTIC8gMTBVTCkgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMFVMICogMlVMKSkpOworICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgd2FpdF9sb29wX2luZGV4LS07CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBjb21wYXJhdG9yLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ09NUF9TdG9wKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiBhbmQgbG9jayBzdGF0dXMgKi8KKyAgaWYoaGNvbXAgPT0gTlVMTCkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlIGlmKF9fSEFMX0NPTVBfSVNfTE9DS0VEKGhjb21wKSkKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgICAgLyogQ2hlY2sgY29tcGxpYW50IHN0YXRlczogSEFMX0NPTVBfU1RBVEVfUkVBRFkgb3IgSEFMX0NPTVBfU1RBVEVfQlVTWSAgICAqLworICAgIC8qIChhbGwgc3RhdGVzIGV4Y2VwdCBIQUxfQ09NUF9TVEFURV9SRVNFVCBhbmQgZXhjZXB0IGxvY2tlZCBzdGF0dXMuICAgICAgKi8KKyAgICBpZihoY29tcC0+U3RhdGUgIT0gSEFMX0NPTVBfU1RBVEVfUkVTRVQpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgICAgQ0xFQVJfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9FTik7CisKKyAgICAgIC8qIFNldCBIQUwgQ09NUCBoYW5kbGUgc3RhdGUgKi8KKyAgICAgIGhjb21wLT5TdGF0ZSA9IEhBTF9DT01QX1NUQVRFX1JFQURZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyYXRvciBJUlEgaGFuZGxlci4KKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ09NUF9JUlFIYW5kbGVyKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIEdldCB0aGUgRVhUSSBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIENPTVAgaW5zdGFuY2UgKi8KKyAgdWludDMyX3QgZXh0aV9saW5lID0gQ09NUF9HRVRfRVhUSV9MSU5FKGhjb21wLT5JbnN0YW5jZSk7CisKKyAgLyogQ2hlY2sgQ09NUCBFWFRJIGZsYWcgKi8KKyAgaWYoTExfRVhUSV9Jc0FjdGl2ZUZsYWdfMF8zMShleHRpX2xpbmUpICE9IDBVTCkKKyAgeworICAgIC8qIENoZWNrIHdoZXRoZXIgY29tcGFyYXRvciBpcyBpbiBpbmRlcGVuZGVudCBvciB3aW5kb3cgbW9kZSAqLworICAgIGlmKFJFQURfQklUKENPTVAxMl9DT01NT04tPkNTUiwgQ09NUF9DU1JfV0lOTU9ERSkgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIENsZWFyIENPTVAgRVhUSSBsaW5lIHBlbmRpbmcgYml0IG9mIHRoZSBwYWlyIG9mIGNvbXBhcmF0b3JzICAgICAgICAgICovCisgICAgICAvKiBpbiB3aW5kb3cgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZTogUGFpciBvZiBjb21wYXJhdG9ycyBpbiB3aW5kb3cgbW9kZSBjYW4gYm90aCB0cmlnIElSUSB3aGVuICAgICAgKi8KKyAgICAgIC8qICAgICAgIGlucHV0IHZvbHRhZ2UgaXMgY2hhbmdpbmcgZnJvbSAib3V0IG9mIHdpbmRvdyIgYXJlYSAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAobG93IG9yIGhpZ2ggKSB0byB0aGUgb3RoZXIgIm91dCBvZiB3aW5kb3ciIGFyZWEgKGhpZ2ggb3IgbG93KS4qLworICAgICAgLyogICAgICAgQm90aCBmbGFncyBtdXN0IGJlIGNsZWFyZWQgdG8gY2FsbCBjb21wYXJhdG9yIHRyaWdnZXIgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgIGNhbGxiYWNrIGlzIGNhbGxlZCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBMTF9FWFRJX0NsZWFyRmxhZ18wXzMxKChDT01QX0VYVElfTElORV9DT01QMSB8IENPTVBfRVhUSV9MSU5FX0NPTVAyKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciBDT01QIEVYVEkgbGluZSBwZW5kaW5nIGJpdCAqLworICAgICAgTExfRVhUSV9DbGVhckZsYWdfMF8zMShleHRpX2xpbmUpOworICAgIH0KKworICAgIC8qIENPTVAgdHJpZ2dlciB1c2VyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ09NUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoY29tcC0+VHJpZ2dlckNhbGxiYWNrKGhjb21wKTsKKyNlbHNlCisgICAgSEFMX0NPTVBfVHJpZ2dlckNhbGxiYWNrKGhjb21wKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NPTVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBNYW5hZ2VtZW50IGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgY29tcGFyYXRvcnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTG9jayB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgQSBzeXN0ZW0gcmVzZXQgaXMgcmVxdWlyZWQgdG8gdW5sb2NrIHRoZSBjb21wYXJhdG9yIGNvbmZpZ3VyYXRpb24uCisgICogQG5vdGUgICBMb2NraW5nIHRoZSBjb21wYXJhdG9yIGZyb20gcmVzZXQgc3RhdGUgaXMgcG9zc2libGUKKyAgKiAgICAgICAgIGlmIF9fSEFMX1JDQ19TWVNDRkdfQ0xLX0VOQUJMRSgpIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUuCisgICogQHBhcmFtICBoY29tcCAgQ09NUCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DT01QX0xvY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBDT01QIGhhbmRsZSBhbGxvY2F0aW9uIGFuZCBsb2NrIHN0YXR1cyAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UgaWYoX19IQUxfQ09NUF9JU19MT0NLRUQoaGNvbXApKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgICAvKiBTZXQgSEFMIENPTVAgaGFuZGxlIHN0YXRlICovCisgICAgc3dpdGNoKGhjb21wLT5TdGF0ZSkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DT01QX1NUQVRFX1JFU0VUOgorICAgICAgICBoY29tcC0+U3RhdGUgPSBIQUxfQ09NUF9TVEFURV9SRVNFVF9MT0NLRUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ09NUF9TVEFURV9SRUFEWToKKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfUkVBRFlfTE9DS0VEOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIEhBTF9DT01QX1NUQVRFX0JVU1kgKi8KKyAgICAgICAgaGNvbXAtPlN0YXRlID0gSEFMX0NPTVBfU1RBVEVfQlVTWV9MT0NLRUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgdGhlIGxvY2sgYml0IGNvcnJlc3BvbmRpbmcgdG8gc2VsZWN0ZWQgY29tcGFyYXRvciAqLworICAgIF9fSEFMX0NPTVBfTE9DSyhoY29tcCk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgb3V0cHV0IGxldmVsIChoaWdoIG9yIGxvdykgb2YgdGhlIHNlbGVjdGVkIGNvbXBhcmF0b3IuCisgICogICAgICAgICBUaGUgb3V0cHV0IGxldmVsIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIHBvbGFyaXR5LgorICAqICAgICAgICAgSWYgdGhlIHBvbGFyaXR5IGlzIG5vdCBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGxvd2VyCisgICogICAgICAgICAgICAgdm9sdGFnZSB0aGFuIHRoZSBpbnB1dCBtaW51cworICAqICAgICAgICAgICAtIENvbXBhcmF0b3Igb3V0cHV0IGlzIGhpZ2ggd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgIElmIHRoZSBwb2xhcml0eSBpcyBpbnZlcnRlZDoKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBoaWdoIHdoZW4gdGhlIGlucHV0IHBsdXMgaXMgYXQgYSBsb3dlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiAgICAgICAgICAgLSBDb21wYXJhdG9yIG91dHB1dCBpcyBsb3cgd2hlbiB0aGUgaW5wdXQgcGx1cyBpcyBhdCBhIGhpZ2hlcgorICAqICAgICAgICAgICAgIHZvbHRhZ2UgdGhhbiB0aGUgaW5wdXQgbWludXMKKyAgKiBAcGFyYW0gIGhjb21wICBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29tcGFyYXRvciBvdXRwdXQgbGV2ZWw6CisgICogICAgICAgICBAYXJnIENPTVBfT1VUUFVUX0xFVkVMX0xPVworICAqICAgICAgICAgQGFyZyBDT01QX09VVFBVVF9MRVZFTF9ISUdICisgICoKKyAgKi8KK3VpbnQzMl90IEhBTF9DT01QX0dldE91dHB1dExldmVsKENPTVBfSGFuZGxlVHlwZURlZiAqaGNvbXApCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKGhjb21wLT5JbnN0YW5jZSkpOworCisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKGhjb21wLT5JbnN0YW5jZS0+Q1NSLCBDT01QX0NTUl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgPj4gQ09NUF9PVVRQVVRfTEVWRUxfQklUT0ZGU0VUX1BPUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29tcGFyYXRvciB0cmlnZ2VyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2soQ09NUF9IYW5kbGVUeXBlRGVmICpoY29tcCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNvbXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ09NUF9UcmlnZ2VyQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDT01QX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdCB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENPTVAgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaGNvbXAgIENPTVAgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DT01QX1N0YXRlVHlwZURlZiBIQUxfQ09NUF9HZXRTdGF0ZShDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBDaGVjayB0aGUgQ09NUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihoY29tcCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9DT01QX1NUQVRFX1JFU0VUOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgLyogUmV0dXJuIEhBTCBDT01QIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGNvbXAtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgQ09NUCBlcnJvciBjb2RlLgorICAqIEBwYXJhbSBoY29tcCBDT01QIGhhbmRsZQorICAqIEByZXR2YWwgQ09NUCBlcnJvciBjb2RlCisgICovCit1aW50MzJfdCBIQUxfQ09NUF9HZXRFcnJvcihDT01QX0hhbmRsZVR5cGVEZWYgKmhjb21wKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoaGNvbXAtPkluc3RhbmNlKSk7CisKKyAgcmV0dXJuIGhjb21wLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKworCisjZW5kaWYgLyogSEFMX0NPTVBfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2NvcnRleC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfY29ydGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyN2UwZgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2NvcnRleC5jCkBAIC0wLDAgKzEsNDgyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jb3J0ZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ09SVEVYIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENPUlRFWDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgCisgICAgKioqIEhvdyB0byBjb25maWd1cmUgSW50ZXJydXB0cyB1c2luZyBDT1JURVggSEFMIGRyaXZlciAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgTlZJQyBpbnRlcnJ1cHRzIChJUlEpLgorICAgIFRoZSBDb3J0ZXggTTArIGV4Y2VwdGlvbnMgYXJlIG1hbmFnZWQgYnkgQ01TSVMgZnVuY3Rpb25zLgorICAgICAgKCMpIEVuYWJsZSBhbmQgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBvZiB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzLgorICAgICAgICAgICAgIFRoZSBwcmlvcml0eSBjYW4gYmUgMC4uMy4KKworICAgICAgICAtQC0gTG93ZXIgcHJpb3JpdHkgdmFsdWVzIGdpdmVzIGhpZ2hlciBwcmlvcml0eS4KKyAgICAgICAgLUAtIFByaW9yaXR5IE9yZGVyOgorICAgICAgICAgICAgKCNAKSBMb3dlc3QgcHJpb3JpdHkuCisgICAgICAgICAgICAoI0ApIExvd2VzdCBoYXJkd2FyZSBwcmlvcml0eSAoSVJRbiBwb3NpdGlvbikuCisKKyAgICAgICgjKSAgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBvZiB0aGUgc2VsZWN0ZWQgSVJRIENoYW5uZWxzIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKworICAgICAgKCMpICBFbmFibGUgdGhlIHNlbGVjdGVkIElSUSBDaGFubmVscyB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQorICAgICAgCisgICAgICAtQC0gIE5lZ2F0aXZlIHZhbHVlIG9mIElSUW5fVHlwZSBhcmUgbm90IGFsbG93ZWQuCisKKyAgICAqKiogSG93IHRvIGNvbmZpZ3VyZSBTeXN0aWNrIHVzaW5nIENPUlRFWCBIQUwgZHJpdmVyICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFNldHVwIFN5c1RpY2sgVGltZXIgZm9yIHRpbWUgYmFzZS4KKworICAgKCspIFRoZSBIQUxfU1lTVElDS19Db25maWcoKWZ1bmN0aW9uIGNhbGxzIHRoZSBTeXNUaWNrX0NvbmZpZygpIGZ1bmN0aW9uIHdoaWNoCisgICAgICAgaXMgYSBDTVNJUyBmdW5jdGlvbiB0aGF0OgorICAgICAgICAoKyspIENvbmZpZ3VyZXMgdGhlIFN5c1RpY2sgUmVsb2FkIHJlZ2lzdGVyIHdpdGggdmFsdWUgcGFzc2VkIGFzIGZ1bmN0aW9uIHBhcmFtZXRlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIElSUSBwcmlvcml0eSB0byB0aGUgbG93ZXN0IHZhbHVlICgweDAzKS4KKyAgICAgICAgKCsrKSBSZXNldHMgdGhlIFN5c1RpY2sgQ291bnRlciByZWdpc3Rlci4KKyAgICAgICAgKCsrKSBDb25maWd1cmVzIHRoZSBTeXNUaWNrIENvdW50ZXIgY2xvY2sgc291cmNlIHRvIGJlIENvcmUgQ2xvY2sgU291cmNlIChIQ0xLKS4KKyAgICAgICAgKCsrKSBFbmFibGVzIHRoZSBTeXNUaWNrIEludGVycnVwdC4KKyAgICAgICAgKCsrKSBTdGFydHMgdGhlIFN5c1RpY2sgQ291bnRlci4KKworICAgKCspIFlvdSBjYW4gY2hhbmdlIHRoZSBTeXNUaWNrIENsb2NrIHNvdXJjZSB0byBiZSBIQ0xLX0RpdjggYnkgY2FsbGluZyB0aGUgbWFjcm8KKyAgICAgICBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4KSBqdXN0IGFmdGVyIHRoZQorICAgICAgIEhBTF9TWVNUSUNLX0NvbmZpZygpIGZ1bmN0aW9uIGNhbGwuIFRoZSBfX0hBTF9DT1JURVhfU1lTVElDS0NMS19DT05GSUcoKSBtYWNybyBpcyBkZWZpbmVkCisgICAgICAgaW5zaWRlIHRoZSBzdG0zMndieHhfaGFsX2NvcnRleC5oIGZpbGUuCisKKyAgICgrKSBZb3UgY2FuIGNoYW5nZSB0aGUgU3lzVGljayBJUlEgcHJpb3JpdHkgYnkgY2FsbGluZyB0aGUKKyAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShTeXNUaWNrX0lSUW4sLi4uKSBmdW5jdGlvbiBqdXN0IGFmdGVyIHRoZSBIQUxfU1lTVElDS19Db25maWcoKSBmdW5jdGlvbiAKKyAgICAgICBjYWxsLiBUaGUgSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBjYWxsIHRoZSBOVklDX1NldFByaW9yaXR5KCkgZnVuY3Rpb24gd2hpY2ggaXMgYSBDTVNJUyBmdW5jdGlvbi4KKworICAgKCspIFRvIGFkanVzdCB0aGUgU3lzVGljayB0aW1lIGJhc2UsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisKKyAgICAgICBSZWxvYWQgVmFsdWUgPSBTeXNUaWNrIENvdW50ZXIgQ2xvY2sgKEh6KSB4ICBEZXNpcmVkIFRpbWUgYmFzZSAocykKKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBpcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCBmb3IgSEFMX1NZU1RJQ0tfQ29uZmlnKCkgZnVuY3Rpb24KKyAgICAgICAoKyspIFJlbG9hZCBWYWx1ZSBzaG91bGQgbm90IGV4Y2VlZCAweEZGRkZGRgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09SVEVYCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9DT1JURVhfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ09SVEVYX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIENPUlRFWF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyB0aGUgQ09SVEVYIEhBTCBkcml2ZXIgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBJbnRlcnJ1cHRzCisgICAgICBTeXN0aWNrIGZ1bmN0aW9uYWxpdGllcyAKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHByaW9yaXR5IGdyb3VwaW5nIGZpZWxkIChwcmUtZW1wdGlvbiBwcmlvcml0eSBhbmQgc3VicHJpb3JpdHkpCisgICogICAgICAgICB1c2luZyB0aGUgcmVxdWlyZWQgdW5sb2NrIHNlcXVlbmNlLgorICAqIEBwYXJhbSBQcmlvcml0eUdyb3VwIFRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzIGxlbmd0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8wOiAwIGJpdCAgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMTogMSBiaXQgIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgYml0cyBmb3Igc3VicHJpb3JpdHkKKyAgKiAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzI6IDIgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8zOiAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXQgIGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfNDogNCBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgYml0ICBmb3Igc3VicHJpb3JpdHkKKyAgKiBAbm90ZSAgIFdoZW4gdGhlIE5WSUNfUHJpb3JpdHlHcm91cF8wIGlzIHNlbGVjdGVkLCBJUlEgcHJlLWVtcHRpb24gaXMgbm8gbW9yZSBwb3NzaWJsZS4KKyAgKiAgICAgICAgIFRoZSBwZW5kaW5nIElSUSBwcmlvcml0eSB3aWxsIGJlIG1hbmFnZWQgb25seSBieSB0aGUgc3VicHJpb3JpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX1NldFByaW9yaXR5R3JvdXBpbmcodWludDMyX3QgUHJpb3JpdHlHcm91cCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoUHJpb3JpdHlHcm91cCkpOworCisgIC8qIFNldCB0aGUgUFJJR1JPVVBbMTA6OF0gYml0cyBhY2NvcmRpbmcgdG8gdGhlIFByaW9yaXR5R3JvdXAgcGFyYW1ldGVyIHZhbHVlICovCisgIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyhQcmlvcml0eUdyb3VwKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHByaW9yaXR5IG9mIGFuIGludGVycnVwdC4KKyAgKiBAcGFyYW0gSVJRbiBFeHRlcm5hbCBpbnRlcnJ1cHQgbnVtYmVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGVudW1lcmF0b3Igb2YgSVJRbl9UeXBlIGVudW1lcmF0aW9uCisgICogICAgICAgICAoRm9yIHRoZSBjb21wbGV0ZSBTVE0zMiBEZXZpY2VzIElSUSBDaGFubmVscyBsaXN0LCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIENNU0lTIGRldmljZSBmaWxlIChzdG0zMndieHh4eC5oKSkKKyAgKiBAcGFyYW0gUHJlZW1wdFByaW9yaXR5IFRoZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBmb3IgdGhlIElSUW4gY2hhbm5lbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTUKKyAgKiAgICAgICAgIEEgbG93ZXIgcHJpb3JpdHkgdmFsdWUgaW5kaWNhdGVzIGEgaGlnaGVyIHByaW9yaXR5CisgICogQHBhcmFtIFN1YlByaW9yaXR5IHRoZSBzdWJwcmlvcml0eSBsZXZlbCBmb3IgdGhlIElSUSBjaGFubmVsLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxNQorICAqICAgICAgICAgQSBsb3dlciBwcmlvcml0eSB2YWx1ZSBpbmRpY2F0ZXMgYSBoaWdoZXIgcHJpb3JpdHkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX1NldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmVlbXB0UHJpb3JpdHksIHVpbnQzMl90IFN1YlByaW9yaXR5KQoreworICB1aW50MzJfdCBwcmlvcml0eWdyb3VwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX1NVQl9QUklPUklUWShTdWJQcmlvcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFByZWVtcHRQcmlvcml0eSkpOworCisgIHByaW9yaXR5Z3JvdXAgPSBOVklDX0dldFByaW9yaXR5R3JvdXBpbmcoKTsKKworICBOVklDX1NldFByaW9yaXR5KElSUW4sIE5WSUNfRW5jb2RlUHJpb3JpdHkocHJpb3JpdHlncm91cCwgUHJlZW1wdFByaW9yaXR5LCBTdWJQcmlvcml0eSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhIGRldmljZSBzcGVjaWZpYyBpbnRlcnJ1cHQgaW4gdGhlIE5WSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyd2J4eHh4LmgpKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19FbmFibGVJUlEoSVJRbl9UeXBlIElSUW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworICAKKyAgLyogRW5hYmxlIGludGVycnVwdCAqLworICBOVklDX0VuYWJsZUlSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGEgZGV2aWNlIHNwZWNpZmljIGludGVycnVwdCBpbiB0aGUgTlZJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4KKyAgKiBAcGFyYW0gIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJ3Ynh4eHguaCkpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX0Rpc2FibGVJUlEoSVJRbl9UeXBlIElSUW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworICAKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKyAgTlZJQ19EaXNhYmxlSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYXRlIGEgc3lzdGVtIHJlc2V0IHJlcXVlc3QgdG8gcmVzZXQgdGhlIE1DVS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX05WSUNfU3lzdGVtUmVzZXQodm9pZCkKK3sKKyAgLyogU3lzdGVtIFJlc2V0ICovCisgIE5WSUNfU3lzdGVtUmVzZXQoKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTeXN0ZW0gVGltZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZCBhbmQgc3RhcnQgdGhlIFN5c3RlbSBUaWNrIFRpbWVyIChTeXNUaWNrKTogCisgICogICAgICAgICBDb3VudGVyIGlzIGluIGZyZWUgcnVubmluZyBtb2RlIHRvIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdHMuCisgICogQHBhcmFtIFRpY2tzTnVtYiBTcGVjaWZpZXMgdGhlIHRpY2tzIE51bWJlciBvZiB0aWNrcyBiZXR3ZWVuIHR3byBpbnRlcnJ1cHRzLgorICAqIEByZXR2YWwgc3RhdHVzOiAgLSAwICBGdW5jdGlvbiBzdWNjZWVkZWQuCisgICogICAgICAgICAgICAgICAgICAtIDEgIEZ1bmN0aW9uIGZhaWxlZC4KKyAgKi8KK3VpbnQzMl90IEhBTF9TWVNUSUNLX0NvbmZpZyh1aW50MzJfdCBUaWNrc051bWIpCit7CisgICByZXR1cm4gU3lzVGlja19Db25maWcoVGlja3NOdW1iKTsKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDT1JURVhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIENvcnRleCBjb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgQ09SVEVYCisgICAgICAoTlZJQywgU1lTVElDSywgTVBVKSBmdW5jdGlvbmFsaXRpZXMuCisKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgcHJpb3JpdHkgZ3JvdXBpbmcgZmllbGQgZnJvbSB0aGUgTlZJQyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KKyAgKiBAcmV0dmFsIFByaW9yaXR5IGdyb3VwaW5nIGZpZWxkIChTQ0ItPkFJUkNSIFsxMDo4XSBQUklHUk9VUCBmaWVsZCkKKyAgKi8KK3VpbnQzMl90IEhBTF9OVklDX0dldFByaW9yaXR5R3JvdXBpbmcodm9pZCkKK3sKKyAgLyogR2V0IHRoZSBQUklHUk9VUFsxMDo4XSBmaWVsZCB2YWx1ZSAqLworICByZXR1cm4gTlZJQ19HZXRQcmlvcml0eUdyb3VwaW5nKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBwcmlvcml0eSBvZiBhbiBpbnRlcnJ1cHQuCisgICogQHBhcmFtIElSUW4gRXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJ3Ynh4eHguaCkpCisgICogQHBhcmFtIFByaW9yaXR5R3JvdXAgdGhlIHByaW9yaXR5IGdyb3VwaW5nIGJpdHMgbGVuZ3RoLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBOVklDX1BSSU9SSVRZR1JPVVBfMDogMCBiaXQgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzE6IDEgYml0IGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eSwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF8yOiAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5CisgICogICAgICAgICAgIEBhcmcgTlZJQ19QUklPUklUWUdST1VQXzM6IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHksCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgYml0IGZvciBzdWJwcmlvcml0eQorICAqICAgICAgICAgICBAYXJnIE5WSUNfUFJJT1JJVFlHUk9VUF80OiA0IGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5LAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGJpdCBmb3Igc3VicHJpb3JpdHkKKyAgKiBAcGFyYW0gcFByZWVtcHRQcmlvcml0eSBQb2ludGVyIG9uIHRoZSBQcmVlbXB0aXZlIHByaW9yaXR5IHZhbHVlIChzdGFydGluZyBmcm9tIDApLgorICAqIEBwYXJhbSBwU3ViUHJpb3JpdHkgUG9pbnRlciBvbiB0aGUgU3VicHJpb3JpdHkgdmFsdWUgKHN0YXJ0aW5nIGZyb20gMCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX0dldFByaW9yaXR5KElSUW5fVHlwZSBJUlFuLCB1aW50MzJfdCBQcmlvcml0eUdyb3VwLCB1aW50MzJfdCAqcFByZWVtcHRQcmlvcml0eSwgdWludDMyX3QgKnBTdWJQcmlvcml0eSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoUHJpb3JpdHlHcm91cCkpOworIC8qIEdldCBwcmlvcml0eSBmb3IgQ29ydGV4LU0gc3lzdGVtIG9yIGRldmljZSBzcGVjaWZpYyBpbnRlcnJ1cHRzICovCisgIE5WSUNfRGVjb2RlUHJpb3JpdHkoTlZJQ19HZXRQcmlvcml0eShJUlFuKSwgUHJpb3JpdHlHcm91cCwgcFByZWVtcHRQcmlvcml0eSwgcFN1YlByaW9yaXR5KTsKK30gIAorCisvKioKKyAgKiBAYnJpZWYgIFNldCBQZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbiBlbnVtZXJhdG9yIG9mIElSUW5fVHlwZSBlbnVtZXJhdGlvbgorICAqICAgICAgICAgKEZvciB0aGUgY29tcGxldGUgU1RNMzIgRGV2aWNlcyBJUlEgQ2hhbm5lbHMgbGlzdCwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBDTVNJUyBkZXZpY2UgZmlsZSAoc3RtMzJ3Ynh4eHguaCkpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9OVklDX1NldFBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworICAKKyAgLyogU2V0IGludGVycnVwdCBwZW5kaW5nICovCisgIE5WSUNfU2V0UGVuZGluZ0lSUShJUlFuKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUGVuZGluZyBJbnRlcnJ1cHQgKHJlYWQgdGhlIHBlbmRpbmcgcmVnaXN0ZXIgaW4gdGhlIE5WSUMKKyAgKiAgICAgICAgIGFuZCByZXR1cm4gdGhlIHBlbmRpbmcgYml0IGZvciB0aGUgc3BlY2lmaWVkIGludGVycnVwdCkuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyd2J4eHh4LmgpKQorICAqIEByZXR2YWwgc3RhdHVzOiAtIDAgIEludGVycnVwdCBzdGF0dXMgaXMgbm90IHBlbmRpbmcuCisgICogICAgICAgICAgICAgICAgIC0gMSAgSW50ZXJydXB0IHN0YXR1cyBpcyBwZW5kaW5nLgorICAqLwordWludDMyX3QgSEFMX05WSUNfR2V0UGVuZGluZ0lSUShJUlFuX1R5cGUgSVJRbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX05WSUNfREVWSUNFX0lSUShJUlFuKSk7CisgIAorICAvKiBSZXR1cm4gMSBpZiBwZW5kaW5nIGVsc2UgMCAqLworICByZXR1cm4gTlZJQ19HZXRQZW5kaW5nSVJRKElSUW4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBwZW5kaW5nIGJpdCBvZiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBJUlFuIEV4dGVybmFsIGludGVycnVwdCBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW4gZW51bWVyYXRvciBvZiBJUlFuX1R5cGUgZW51bWVyYXRpb24KKyAgKiAgICAgICAgIChGb3IgdGhlIGNvbXBsZXRlIFNUTTMyIERldmljZXMgSVJRIENoYW5uZWxzIGxpc3QsIHBsZWFzZSByZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgQ01TSVMgZGV2aWNlIGZpbGUgKHN0bTMyd2J4eHh4LmgpKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbl9UeXBlIElSUW4pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19OVklDX0RFVklDRV9JUlEoSVJRbikpOworICAKKyAgLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKyAgTlZJQ19DbGVhclBlbmRpbmdJUlEoSVJRbik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTeXNUaWNrIGNsb2NrIHNvdXJjZS4KKyAgKiBAcGFyYW0gQ0xLU291cmNlIHNwZWNpZmllcyB0aGUgU3lzVGljayBjbG9jayBzb3VyY2UuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgU1lTVElDS19DTEtTT1VSQ0VfSENMS19ESVY4OiBBSEIgY2xvY2sgZGl2aWRlZCBieSA4IHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLgorICAqICAgICAgICAgICAgIEBhcmcgU1lTVElDS19DTEtTT1VSQ0VfSENMSzogQUhCIGNsb2NrIHNlbGVjdGVkIGFzIFN5c1RpY2sgY2xvY2sgc291cmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTVElDS19DTEtTb3VyY2VDb25maWcodWludDMyX3QgQ0xLU291cmNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1lTVElDS19DTEtfU09VUkNFKENMS1NvdXJjZSkpOworICBpZiAoQ0xLU291cmNlID09IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEspCisgIHsKKyAgICBTeXNUaWNrLT5DVFJMIHw9IFNZU1RJQ0tfQ0xLU09VUkNFX0hDTEs7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3lzVGljay0+Q1RSTCAmPSB+U1lTVElDS19DTEtTT1VSQ0VfSENMSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTWVNUSUNLIGludGVycnVwdCByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1lTVElDS19JUlFIYW5kbGVyKHZvaWQpCit7CisgIEhBTF9TWVNUSUNLX0NhbGxiYWNrKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU1lTVElDSyBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TWVNUSUNLX0NhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1lTVElDS19DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKF9fTVBVX1BSRVNFTlQgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBNUFUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX01QVV9EaXNhYmxlKHZvaWQpCit7CisgIC8qIE1ha2Ugc3VyZSBvdXRzdGFuZGluZyB0cmFuc2ZlcnMgYXJlIGRvbmUgKi8KKyAgX19ETUIoKTsKKworICAvKiBEaXNhYmxlIGZhdWx0IGV4Y2VwdGlvbnMgKi8KKyAgU0NCLT5TSENTUiAmPSB+U0NCX1NIQ1NSX01FTUZBVUxURU5BX01zazsKKyAgCisgIC8qIERpc2FibGUgdGhlIE1QVSBhbmQgY2xlYXIgdGhlIGNvbnRyb2wgcmVnaXN0ZXIqLworICBNUFUtPkNUUkwgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIE1QVS4KKyAgKiBAcGFyYW0gIE1QVV9Db250cm9sOiBTcGVjaWZpZXMgdGhlIGNvbnRyb2wgbW9kZSBvZiB0aGUgTVBVIGR1cmluZyBoYXJkIGZhdWx0LCAKKyAgKiAgICAgICAgICBOTUksIEZBVUxUTUFTSyBhbmQgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIGRlZmF1bHQgbWVtb3J5IAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIE1QVV9IRk5NSV9QUklWREVGX05PTkUKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX0hBUkRGQVVMVF9OTUkKKyAgKiAgICAgICAgICAgIEBhcmcgTVBVX1BSSVZJTEVHRURfREVGQVVMVAorICAqICAgICAgICAgICAgQGFyZyBNUFVfSEZOTUlfUFJJVkRFRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfTVBVX0VuYWJsZSh1aW50MzJfdCBNUFVfQ29udHJvbCkKK3sKKyAgLyogRW5hYmxlIHRoZSBNUFUgKi8KKyAgTVBVLT5DVFJMID0gTVBVX0NvbnRyb2wgfCBNUFVfQ1RSTF9FTkFCTEVfTXNrOworICAKKyAgLyogRW5hYmxlIGZhdWx0IGV4Y2VwdGlvbnMgKi8KKyAgU0NCLT5TSENTUiB8PSBTQ0JfU0hDU1JfTUVNRkFVTFRFTkFfTXNrOworICAKKyAgLyogRW5zdXJlIE1QVSBzZXR0aW5nIHRha2UgZWZmZWN0cyAqLworICBfX0RTQigpOworICBfX0lTQigpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgUmVnaW9uIGFuZCB0aGUgbWVtb3J5IHRvIGJlIHByb3RlY3RlZC4KKyAgKiBAcGFyYW0gTVBVX0luaXQgUG9pbnRlciB0byBhIE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9NUFVfQ29uZmlnUmVnaW9uKE1QVV9SZWdpb25fSW5pdFR5cGVEZWYgKk1QVV9Jbml0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9OVU1CRVIoTVBVX0luaXQtPk51bWJlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTVBVX1JFR0lPTl9FTkFCTEUoTVBVX0luaXQtPkVuYWJsZSkpOworCisgIC8qIFNldCB0aGUgUmVnaW9uIG51bWJlciAqLworICBNUFUtPlJOUiA9IE1QVV9Jbml0LT5OdW1iZXI7CisKKyAgaWYgKChNUFVfSW5pdC0+RW5hYmxlKSAhPSAwVSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9JTlNUUlVDVElPTl9BQ0NFU1MoTVBVX0luaXQtPkRpc2FibGVFeGVjKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9SRUdJT05fUEVSTUlTU0lPTl9BVFRSSUJVVEUoTVBVX0luaXQtPkFjY2Vzc1Blcm1pc3Npb24pKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1RFWF9MRVZFTChNUFVfSW5pdC0+VHlwZUV4dEZpZWxkKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX01QVV9BQ0NFU1NfU0hBUkVBQkxFKE1QVV9Jbml0LT5Jc1NoYXJlYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfQUNDRVNTX0NBQ0hFQUJMRShNUFVfSW5pdC0+SXNDYWNoZWFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX0FDQ0VTU19CVUZGRVJBQkxFKE1QVV9Jbml0LT5Jc0J1ZmZlcmFibGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTVBVX1NVQl9SRUdJT05fRElTQUJMRShNUFVfSW5pdC0+U3ViUmVnaW9uRGlzYWJsZSkpOworICAgIGFzc2VydF9wYXJhbShJU19NUFVfUkVHSU9OX1NJWkUoTVBVX0luaXQtPlNpemUpKTsKKyAgICAKKyAgICBNUFUtPlJCQVIgPSBNUFVfSW5pdC0+QmFzZUFkZHJlc3M7CisgICAgTVBVLT5SQVNSID0gKCh1aW50MzJfdClNUFVfSW5pdC0+RGlzYWJsZUV4ZWMgICAgICAgICAgICAgPDwgTVBVX1JBU1JfWE5fUG9zKSAgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5BY2Nlc3NQZXJtaXNzaW9uICAgICAgICA8PCBNUFVfUkFTUl9BUF9Qb3MpICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPlR5cGVFeHRGaWVsZCAgICAgICAgICAgIDw8IE1QVV9SQVNSX1RFWF9Qb3MpICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+SXNTaGFyZWFibGUgICAgICAgICAgICAgPDwgTVBVX1JBU1JfU19Qb3MpICAgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5Jc0NhY2hlYWJsZSAgICAgICAgICAgICA8PCBNUFVfUkFTUl9DX1BvcykgICAgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPklzQnVmZmVyYWJsZSAgICAgICAgICAgIDw8IE1QVV9SQVNSX0JfUG9zKSAgICB8CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClNUFVfSW5pdC0+U3ViUmVnaW9uRGlzYWJsZSAgICAgICAgPDwgTVBVX1JBU1JfU1JEX1BvcykgIHwKKyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KU1QVV9Jbml0LT5TaXplICAgICAgICAgICAgICAgICAgICA8PCBNUFVfUkFTUl9TSVpFX1BvcykgfAorICAgICAgICAgICAgICAgICgodWludDMyX3QpTVBVX0luaXQtPkVuYWJsZSAgICAgICAgICAgICAgICAgIDw8IE1QVV9SQVNSX0VOQUJMRV9Qb3MpOworICB9CisgIGVsc2UKKyAgeworICAgIE1QVS0+UkJBUiA9IDB4MDBVOworICAgIE1QVS0+UkFTUiA9IDB4MDBVOworICB9Cit9CisjZW5kaWYgLyogX19NUFVfUFJFU0VOVCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NPUlRFWF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2NyYy5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2NyYy5jCkBAIC0wLDAgKzEsNTE4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jcmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ1JDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrIChDUkMpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgKCspIEVuYWJsZSBDUkMgQUhCIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19DUkNfQ0xLX0VOQUJMRSgpOworICAgICAgICAgKCspIEluaXRpYWxpemUgQ1JDIGNhbGN1bGF0b3IKKyAgICAgICAgICAgICAoKyspIHNwZWNpZnkgZ2VuZXJhdGluZyBwb2x5bm9taWFsIChwZXJpcGhlcmFsIGRlZmF1bHQgb3Igbm9uLWRlZmF1bHQgb25lKQorICAgICAgICAgICAgICgrKykgc3BlY2lmeSBpbml0aWFsaXphdGlvbiB2YWx1ZSAocGVyaXBoZXJhbCBkZWZhdWx0IG9yIG5vbi1kZWZhdWx0IG9uZSkKKyAgICAgICAgICAgICAoKyspIHNwZWNpZnkgaW5wdXQgZGF0YSBmb3JtYXQKKyAgICAgICAgICAgICAoKyspIHNwZWNpZnkgaW5wdXQgb3Igb3V0cHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUgaWYgYW55CisgICAgICAgICAoKykgVXNlIEhBTF9DUkNfQWNjdW11bGF0ZSgpIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIENSQyB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgICBpbnB1dCBkYXRhIGJ1ZmZlciBzdGFydGluZyB3aXRoIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIENSQyBhcworICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHZhbHVlCisgICAgICAgICAoKykgVXNlIEhBTF9DUkNfQ2FsY3VsYXRlKCkgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgQ1JDIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgIGlucHV0IGRhdGEgYnVmZmVyIHN0YXJ0aW5nIHdpdGggdGhlIGRlZmluZWQgaW5pdGlhbGl6YXRpb24gdmFsdWUKKyAgICAgICAgICAgICAoZGVmYXVsdCBvciBub24tZGVmYXVsdCkgdG8gaW5pdGlhdGUgQ1JDIGNhbGN1bGF0aW9uCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDIENSQworICAqIEBicmllZiBDUkMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9DUkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIENSQ19Qcml2YXRlX0Z1bmN0aW9ucyBDUkMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAqIEB7CisgKi8KK3N0YXRpYyB1aW50MzJfdCBDUkNfSGFuZGxlXzgoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQ4X3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpOworc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfMTYoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQxNl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JDIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICBpbiB0aGUgQ1JDX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUkMgcGVyaXBoZXJhbAorICAgICAgKCspIEluaXRpYWxpemUgdGhlIENSQyBNU1AgKE1DVSBTcGVjaWZpYyBQYWNrYWdlKQorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JDIE1TUAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIENSQyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ1JDX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDX0luaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIENoZWNrIHRoZSBDUkMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhjcmMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JDX0FMTF9JTlNUQU5DRShoY3JjLT5JbnN0YW5jZSkpOworCisgIGlmIChoY3JjLT5TdGF0ZSA9PSBIQUxfQ1JDX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhjcmMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgSEFMX0NSQ19Nc3BJbml0KGhjcmMpOworICB9CisKKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgLyogY2hlY2sgd2hldGhlciBvciBub3Qgbm9uLWRlZmF1bHQgZ2VuZXJhdGluZyBwb2x5bm9taWFsIGhhcyBiZWVuCisgICAqIHBpY2tlZCB1cCBieSB1c2VyICovCisgIGFzc2VydF9wYXJhbShJU19ERUZBVUxUX1BPTFlOT01JQUwoaGNyYy0+SW5pdC5EZWZhdWx0UG9seW5vbWlhbFVzZSkpOworICBpZiAoaGNyYy0+SW5pdC5EZWZhdWx0UG9seW5vbWlhbFVzZSA9PSBERUZBVUxUX1BPTFlOT01JQUxfRU5BQkxFKQorICB7CisgICAgLyogaW5pdGlhbGl6ZSBwZXJpcGhlcmFsIHdpdGggZGVmYXVsdCBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyAgICBXUklURV9SRUcoaGNyYy0+SW5zdGFuY2UtPlBPTCwgREVGQVVMVF9DUkMzMl9QT0xZKTsKKyAgICBNT0RJRllfUkVHKGhjcmMtPkluc3RhbmNlLT5DUiwgQ1JDX0NSX1BPTFlTSVpFLCBDUkNfUE9MWUxFTkdUSF8zMkIpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIGluaXRpYWxpemUgQ1JDIHBlcmlwaGVyYWwgd2l0aCBnZW5lcmF0aW5nIHBvbHlub21pYWwgZGVmaW5lZCBieSB1c2VyICovCisgICAgaWYgKEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldChoY3JjLCBoY3JjLT5Jbml0LkdlbmVyYXRpbmdQb2x5bm9taWFsLCBoY3JjLT5Jbml0LkNSQ0xlbmd0aCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogY2hlY2sgd2hldGhlciBvciBub3Qgbm9uLWRlZmF1bHQgQ1JDIGluaXRpYWwgdmFsdWUgaGFzIGJlZW4KKyAgICogcGlja2VkIHVwIGJ5IHVzZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RFRkFVTFRfSU5JVF9WQUxVRShoY3JjLT5Jbml0LkRlZmF1bHRJbml0VmFsdWVVc2UpKTsKKyAgaWYgKGhjcmMtPkluaXQuRGVmYXVsdEluaXRWYWx1ZVVzZSA9PSBERUZBVUxUX0lOSVRfVkFMVUVfRU5BQkxFKQorICB7CisgICAgV1JJVEVfUkVHKGhjcmMtPkluc3RhbmNlLT5JTklULCBERUZBVUxUX0NSQ19JTklUVkFMVUUpOworICB9CisgIGVsc2UKKyAgeworICAgIFdSSVRFX1JFRyhoY3JjLT5JbnN0YW5jZS0+SU5JVCwgaGNyYy0+SW5pdC5Jbml0VmFsdWUpOworICB9CisKKworICAvKiBzZXQgaW5wdXQgZGF0YSBpbnZlcnNpb24gbW9kZSAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JDX0lOUFVUREFUQV9JTlZFUlNJT05fTU9ERShoY3JjLT5Jbml0LklucHV0RGF0YUludmVyc2lvbk1vZGUpKTsKKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfSU4sIGhjcmMtPkluaXQuSW5wdXREYXRhSW52ZXJzaW9uTW9kZSk7CisKKyAgLyogc2V0IG91dHB1dCBkYXRhIGludmVyc2lvbiBtb2RlICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fTU9ERShoY3JjLT5Jbml0Lk91dHB1dERhdGFJbnZlcnNpb25Nb2RlKSk7CisgIE1PRElGWV9SRUcoaGNyYy0+SW5zdGFuY2UtPkNSLCBDUkNfQ1JfUkVWX09VVCwgaGNyYy0+SW5pdC5PdXRwdXREYXRhSW52ZXJzaW9uTW9kZSk7CisKKyAgLyogbWFrZXMgc3VyZSB0aGUgaW5wdXQgZGF0YSBmb3JtYXQgKGJ5dGVzLCBoYWxmd29yZHMgb3Igd29yZHMgc3RyZWFtKQorICAgKiBpcyBwcm9wZXJseSBzcGVjaWZpZWQgYnkgdXNlciAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JDX0lOUFVUREFUQV9GT1JNQVQoaGNyYy0+SW5wdXREYXRhRm9ybWF0KSk7CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDUkMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSQ19EZUluaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIENoZWNrIHRoZSBDUkMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhjcmMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ1JDX0FMTF9JTlNUQU5DRShoY3JjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBpZiAoaGNyYy0+U3RhdGUgPT0gSEFMX0NSQ19TVEFURV9CVVNZKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IENSQyBjYWxjdWxhdGlvbiB1bml0ICovCisgIF9fSEFMX0NSQ19EUl9SRVNFVChoY3JjKTsKKworICAvKiBSZXNldCBJRFIgcmVnaXN0ZXIgY29udGVudCAqLworICBDTEVBUl9CSVQoaGNyYy0+SW5zdGFuY2UtPklEUiwgQ1JDX0lEUl9JRFIpOworCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9DUkNfTXNwRGVJbml0KGhjcmMpOworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGNyYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUkMgTVNQLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JDX01zcEluaXQoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JDX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDUkMgTVNQLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JDX01zcERlSW5pdChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUkNfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgbWFuYWdlbWVudCBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBjb21wdXRlIHRoZSA3LCA4LCAxNiBvciAzMi1iaXQgQ1JDIHZhbHVlIG9mIGFuIDgsIDE2IG9yIDMyLWJpdCBkYXRhIGJ1ZmZlcgorICAgICAgICAgIHVzaW5nIGNvbWJpbmF0aW9uIG9mIHRoZSBwcmV2aW91cyBDUkMgdmFsdWUgYW5kIHRoZSBuZXcgb25lLgorCisgICAgICAgWy4uXSAgb3IKKworICAgICAgKCspIGNvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICAgICAgICAgaW5kZXBlbmRlbnRseSBvZiB0aGUgcHJldmlvdXMgQ1JDIHZhbHVlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbXB1dGUgdGhlIDcsIDgsIDE2IG9yIDMyLWJpdCBDUkMgdmFsdWUgb2YgYW4gOCwgMTYgb3IgMzItYml0IGRhdGEgYnVmZmVyCisgICogICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIENSQyBhcyBpbml0aWFsaXphdGlvbiB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciwgZXhhY3QgaW5wdXQgZGF0YSBmb3JtYXQgaXMKKyAgKiAgICAgICAgIHByb3ZpZGVkIGJ5IGhjcmMtPklucHV0RGF0YUZvcm1hdC4KKyAgKiBAcGFyYW0gIEJ1ZmZlckxlbmd0aCBpbnB1dCBkYXRhIGJ1ZmZlciBsZW5ndGggKG51bWJlciBvZiBieXRlcyBpZiBwQnVmZmVyCisgICogICAgICAgICB0eXBlIGlzICogdWludDhfdCwgbnVtYmVyIG9mIGhhbGYtd29yZHMgaWYgcEJ1ZmZlciB0eXBlIGlzICogdWludDE2X3QsCisgICogICAgICAgICBudW1iZXIgb2Ygd29yZHMgaWYgcEJ1ZmZlciB0eXBlIGlzICogdWludDMyX3QpLgorICAqIEBub3RlICBCeSBkZWZhdWx0LCB0aGUgQVBJIGV4cGVjdHMgYSB1aW50MzJfdCBwb2ludGVyIGFzIGlucHV0IGJ1ZmZlciBwYXJhbWV0ZXIuCisgICogICAgICAgIElucHV0IGJ1ZmZlciBwb2ludGVycyB3aXRoIG90aGVyIHR5cGVzIHNpbXBseSBuZWVkIHRvIGJlIGNhc3QgaW4gdWludDMyX3QKKyAgKiAgICAgICAgYW5kIHRoZSBBUEkgd2lsbCBpbnRlcm5hbGx5IGFkanVzdCBpdHMgaW5wdXQgZGF0YSBwcm9jZXNzaW5nIGJhc2VkIG9uIHRoZQorICAqICAgICAgICBoYW5kbGUgZmllbGQgaGNyYy0+SW5wdXREYXRhRm9ybWF0LgorICAqIEByZXR2YWwgdWludDMyX3QgQ1JDIChyZXR1cm5lZCB2YWx1ZSBMU0JzIGZvciBDUkMgc2hvcnRlciB0aGFuIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQ1JDX0FjY3VtdWxhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKQoreworICB1aW50MzJfdCBpbmRleDsgICAgICAvKiBDUkMgaW5wdXQgZGF0YSBidWZmZXIgaW5kZXggKi8KKyAgdWludDMyX3QgdGVtcCA9IDBVOyAgLyogQ1JDIG91dHB1dCAocmVhZCBmcm9tIGhjcmMtPkluc3RhbmNlLT5EUiByZWdpc3RlcikgKi8KKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgc3dpdGNoIChoY3JjLT5JbnB1dERhdGFGb3JtYXQpCisgIHsKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX1dPUkRTOgorICAgICAgLyogRW50ZXIgRGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IgKi8KKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBCdWZmZXJMZW5ndGg7IGluZGV4KyspCisgICAgICB7CisgICAgICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9IHBCdWZmZXJbaW5kZXhdOworICAgICAgfQorICAgICAgdGVtcCA9IGhjcmMtPkluc3RhbmNlLT5EUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUzoKKyAgICAgIHRlbXAgPSBDUkNfSGFuZGxlXzgoaGNyYywgKHVpbnQ4X3QgKilwQnVmZmVyLCBCdWZmZXJMZW5ndGgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENSQ19JTlBVVERBVEFfRk9STUFUX0hBTEZXT1JEUzoKKyAgICAgIHRlbXAgPSBDUkNfSGFuZGxlXzE2KGhjcmMsICh1aW50MTZfdCAqKSh2b2lkICopcEJ1ZmZlciwgQnVmZmVyTGVuZ3RoKTsgICAgLyogRGVyb2dhdGlvbiBNaXNyYUMyMDEyIFIuMTEuNSAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gdGhlIENSQyBjb21wdXRlZCB2YWx1ZSAqLworICByZXR1cm4gdGVtcDsKK30KKworLyoqCisgICogQGJyaWVmICBDb21wdXRlIHRoZSA3LCA4LCAxNiBvciAzMi1iaXQgQ1JDIHZhbHVlIG9mIGFuIDgsIDE2IG9yIDMyLWJpdCBkYXRhIGJ1ZmZlcgorICAqICAgICAgICAgc3RhcnRpbmcgd2l0aCBoY3JjLT5JbnN0YW5jZS0+SU5JVCBhcyBpbml0aWFsaXphdGlvbiB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgcEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciwgZXhhY3QgaW5wdXQgZGF0YSBmb3JtYXQgaXMKKyAgKiAgICAgICAgIHByb3ZpZGVkIGJ5IGhjcmMtPklucHV0RGF0YUZvcm1hdC4KKyAgKiBAcGFyYW0gIEJ1ZmZlckxlbmd0aCBpbnB1dCBkYXRhIGJ1ZmZlciBsZW5ndGggKG51bWJlciBvZiBieXRlcyBpZiBwQnVmZmVyCisgICogICAgICAgICB0eXBlIGlzICogdWludDhfdCwgbnVtYmVyIG9mIGhhbGYtd29yZHMgaWYgcEJ1ZmZlciB0eXBlIGlzICogdWludDE2X3QsCisgICogICAgICAgICBudW1iZXIgb2Ygd29yZHMgaWYgcEJ1ZmZlciB0eXBlIGlzICogdWludDMyX3QpLgorICAqIEBub3RlICBCeSBkZWZhdWx0LCB0aGUgQVBJIGV4cGVjdHMgYSB1aW50MzJfdCBwb2ludGVyIGFzIGlucHV0IGJ1ZmZlciBwYXJhbWV0ZXIuCisgICogICAgICAgIElucHV0IGJ1ZmZlciBwb2ludGVycyB3aXRoIG90aGVyIHR5cGVzIHNpbXBseSBuZWVkIHRvIGJlIGNhc3QgaW4gdWludDMyX3QKKyAgKiAgICAgICAgYW5kIHRoZSBBUEkgd2lsbCBpbnRlcm5hbGx5IGFkanVzdCBpdHMgaW5wdXQgZGF0YSBwcm9jZXNzaW5nIGJhc2VkIG9uIHRoZQorICAqICAgICAgICBoYW5kbGUgZmllbGQgaGNyYy0+SW5wdXREYXRhRm9ybWF0LgorICAqIEByZXR2YWwgdWludDMyX3QgQ1JDIChyZXR1cm5lZCB2YWx1ZSBMU0JzIGZvciBDUkMgc2hvcnRlciB0aGFuIDMyIGJpdHMpCisgICovCit1aW50MzJfdCBIQUxfQ1JDX0NhbGN1bGF0ZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgcEJ1ZmZlcltdLCB1aW50MzJfdCBCdWZmZXJMZW5ndGgpCit7CisgIHVpbnQzMl90IGluZGV4OyAgICAgIC8qIENSQyBpbnB1dCBkYXRhIGJ1ZmZlciBpbmRleCAqLworICB1aW50MzJfdCB0ZW1wID0gMFU7ICAvKiBDUkMgb3V0cHV0IChyZWFkIGZyb20gaGNyYy0+SW5zdGFuY2UtPkRSIHJlZ2lzdGVyKSAqLworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gVW5pdCAoaGNyYy0+SW5zdGFuY2UtPklOSVQgaXMKKyAgKiAgd3JpdHRlbiBpbiBoY3JjLT5JbnN0YW5jZS0+RFIpICovCisgIF9fSEFMX0NSQ19EUl9SRVNFVChoY3JjKTsKKworICBzd2l0Y2ggKGhjcmMtPklucHV0RGF0YUZvcm1hdCkKKyAgeworICAgIGNhc2UgQ1JDX0lOUFVUREFUQV9GT1JNQVRfV09SRFM6CisgICAgICAvKiBFbnRlciAzMi1iaXQgaW5wdXQgZGF0YSB0byB0aGUgQ1JDIGNhbGN1bGF0b3IgKi8KKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBCdWZmZXJMZW5ndGg7IGluZGV4KyspCisgICAgICB7CisgICAgICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9IHBCdWZmZXJbaW5kZXhdOworICAgICAgfQorICAgICAgdGVtcCA9IGhjcmMtPkluc3RhbmNlLT5EUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9CWVRFUzoKKyAgICAgIC8qIFNwZWNpZmljIDgtYml0IGlucHV0IGRhdGEgaGFuZGxpbmcgICovCisgICAgICB0ZW1wID0gQ1JDX0hhbmRsZV84KGhjcmMsICh1aW50OF90ICopcEJ1ZmZlciwgQnVmZmVyTGVuZ3RoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUkNfSU5QVVREQVRBX0ZPUk1BVF9IQUxGV09SRFM6CisgICAgICAvKiBTcGVjaWZpYyAxNi1iaXQgaW5wdXQgZGF0YSBoYW5kbGluZyAgKi8KKyAgICAgIHRlbXAgPSBDUkNfSGFuZGxlXzE2KGhjcmMsICh1aW50MTZfdCAqKSh2b2lkICopcEJ1ZmZlciwgQnVmZmVyTGVuZ3RoKTsgICAgLyogRGVyb2dhdGlvbiBNaXNyYUMyMDEyIFIuMTEuNSAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovCisgIHJldHVybiB0ZW1wOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBDUkMgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DUkNfU3RhdGVUeXBlRGVmIEhBTF9DUkNfR2V0U3RhdGUoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMpCit7CisgIC8qIFJldHVybiBDUkMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoY3JjLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSQ19Qcml2YXRlX0Z1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEVudGVyIDgtYml0IGlucHV0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yLgorICAqICAgICAgICAgU3BlY2lmaWMgZGF0YSBoYW5kbGluZyB0byBvcHRpbWl6ZSBwcm9jZXNzaW5nIHRpbWUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBCdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIEJ1ZmZlckxlbmd0aCBpbnB1dCBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAgKiBAcmV0dmFsIHVpbnQzMl90IENSQyAocmV0dXJuZWQgdmFsdWUgTFNCcyBmb3IgQ1JDIHNob3J0ZXIgdGhhbiAzMiBiaXRzKQorICAqLworc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfOChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDhfdCBwQnVmZmVyW10sIHVpbnQzMl90IEJ1ZmZlckxlbmd0aCkKK3sKKyAgdWludDMyX3QgaTsgLyogaW5wdXQgZGF0YSBidWZmZXIgaW5kZXggKi8KKyAgdWludDE2X3QgZGF0YTsKKyAgX19JTyB1aW50MTZfdCAqcFJlZzsKKworICAvKiBQcm9jZXNzaW5nIHRpbWUgb3B0aW1pemF0aW9uOiA0IGJ5dGVzIGFyZSBlbnRlcmVkIGluIGEgcm93IHdpdGggYSBzaW5nbGUgd29yZCB3cml0ZSwKKyAgICogbGFzdCBieXRlcyBtdXN0IGJlIGNhcmVmdWxseSBmZWQgdG8gdGhlIENSQyBjYWxjdWxhdG9yIHRvIGVuc3VyZSBhIGNvcnJlY3QgdHlwZQorICAgKiBoYW5kbGluZyBieSB0aGUgcGVyaXBoZXJhbCAqLworICBmb3IgKGkgPSAwVTsgaSA8IChCdWZmZXJMZW5ndGggLyA0VSk7IGkrKykKKyAgeworICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9ICgodWludDMyX3QpcEJ1ZmZlcls0VSAqIGldIDw8IDI0VSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClwQnVmZmVyWyg0VSAqIGkpICsgMVVdIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClwQnVmZmVyWyg0VSAqIGkpICsgMlVdIDw8IDhVKSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBCdWZmZXJbKDRVICogaSkgKyAzVV07CisgIH0KKyAgLyogbGFzdCBieXRlcyBzcGVjaWZpYyBoYW5kbGluZyAqLworICBpZiAoKEJ1ZmZlckxlbmd0aCAlIDRVKSAhPSAwVSkKKyAgeworICAgIGlmICgoQnVmZmVyTGVuZ3RoICUgNFUpID09IDFVKQorICAgIHsKKyAgICAgICooX19JTyB1aW50OF90ICopKF9fSU8gdm9pZCAqKSgmaGNyYy0+SW5zdGFuY2UtPkRSKSA9IHBCdWZmZXJbNFUgKiBpXTsgICAgICAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgfQorICAgIGlmICgoQnVmZmVyTGVuZ3RoICUgNFUpID09IDJVKQorICAgIHsKKyAgICAgIGRhdGEgPSAoKHVpbnQxNl90KShwQnVmZmVyWzRVICogaV0pIDw8IDhVKSB8ICh1aW50MTZfdClwQnVmZmVyWyg0VSAqIGkpICsgMVVdOworICAgICAgcFJlZyA9IChfX0lPIHVpbnQxNl90ICopKF9fSU8gdm9pZCAqKSgmaGNyYy0+SW5zdGFuY2UtPkRSKTsgICAgICAgICAgICAgICAgICAgIC8qIERlcm9nYXRpb24gTWlzcmFDMjAxMiBSLjExLjUgKi8KKyAgICAgICpwUmVnID0gZGF0YTsKKyAgICB9CisgICAgaWYgKChCdWZmZXJMZW5ndGggJSA0VSkgPT0gM1UpCisgICAgeworICAgICAgZGF0YSA9ICgodWludDE2X3QpKHBCdWZmZXJbNFUgKiBpXSkgPDwgOFUpIHwgKHVpbnQxNl90KXBCdWZmZXJbKDRVICogaSkgKyAxVV07CisgICAgICBwUmVnID0gKF9fSU8gdWludDE2X3QgKikoX19JTyB2b2lkICopKCZoY3JjLT5JbnN0YW5jZS0+RFIpOyAgICAgICAgICAgICAgICAgICAgLyogRGVyb2dhdGlvbiBNaXNyYUMyMDEyIFIuMTEuNSAqLworICAgICAgKnBSZWcgPSBkYXRhOworCisgICAgICAqKF9fSU8gdWludDhfdCAqKShfX0lPIHZvaWQgKikoJmhjcmMtPkluc3RhbmNlLT5EUikgPSBwQnVmZmVyWyg0VSAqIGkpICsgMlVdOyAgLyogRGVyb2dhdGlvbiBNaXNyYUMyMDEyIFIuMTEuNSAqLworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiB0aGUgQ1JDIGNvbXB1dGVkIHZhbHVlICovCisgIHJldHVybiBoY3JjLT5JbnN0YW5jZS0+RFI7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW50ZXIgMTYtYml0IGlucHV0IGRhdGEgdG8gdGhlIENSQyBjYWxjdWxhdG9yLgorICAqICAgICAgICAgU3BlY2lmaWMgZGF0YSBoYW5kbGluZyB0byBvcHRpbWl6ZSBwcm9jZXNzaW5nIHRpbWUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBCdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIEJ1ZmZlckxlbmd0aCBpbnB1dCBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAgKiBAcmV0dmFsIHVpbnQzMl90IENSQyAocmV0dXJuZWQgdmFsdWUgTFNCcyBmb3IgQ1JDIHNob3J0ZXIgdGhhbiAzMiBiaXRzKQorICAqLworc3RhdGljIHVpbnQzMl90IENSQ19IYW5kbGVfMTYoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQxNl90IHBCdWZmZXJbXSwgdWludDMyX3QgQnVmZmVyTGVuZ3RoKQoreworICB1aW50MzJfdCBpOyAgLyogaW5wdXQgZGF0YSBidWZmZXIgaW5kZXggKi8KKyAgX19JTyB1aW50MTZfdCAqcFJlZzsKKworICAvKiBQcm9jZXNzaW5nIHRpbWUgb3B0aW1pemF0aW9uOiAyIEhhbGZXb3JkcyBhcmUgZW50ZXJlZCBpbiBhIHJvdyB3aXRoIGEgc2luZ2xlIHdvcmQgd3JpdGUsCisgICAqIGluIGNhc2Ugb2Ygb2RkIGxlbmd0aCwgbGFzdCBIYWxmV29yZCBtdXN0IGJlIGNhcmVmdWxseSBmZWQgdG8gdGhlIENSQyBjYWxjdWxhdG9yIHRvIGVuc3VyZQorICAgKiBhIGNvcnJlY3QgdHlwZSBoYW5kbGluZyBieSB0aGUgcGVyaXBoZXJhbCAqLworICBmb3IgKGkgPSAwVTsgaSA8IChCdWZmZXJMZW5ndGggLyAyVSk7IGkrKykKKyAgeworICAgIGhjcmMtPkluc3RhbmNlLT5EUiA9ICgodWludDMyX3QpcEJ1ZmZlclsyVSAqIGldIDw8IDE2VSkgfCAodWludDMyX3QpcEJ1ZmZlclsoMlUgKiBpKSArIDFVXTsKKyAgfQorICBpZiAoKEJ1ZmZlckxlbmd0aCAlIDJVKSAhPSAwVSkKKyAgeworICAgIHBSZWcgPSAoX19JTyB1aW50MTZfdCAqKShfX0lPIHZvaWQgKikoJmhjcmMtPkluc3RhbmNlLT5EUik7ICAgICAgICAgICAgICAgICAvKiBEZXJvZ2F0aW9uIE1pc3JhQzIwMTIgUi4xMS41ICovCisgICAgKnBSZWcgPSBwQnVmZmVyWzJVICogaV07CisgIH0KKworICAvKiBSZXR1cm4gdGhlIENSQyBjb21wdXRlZCB2YWx1ZSAqLworICByZXR1cm4gaGNyYy0+SW5zdGFuY2UtPkRSOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0NSQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2NyY19leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfY3JjX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMGM2ZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2NyY19leC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9jcmNfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgQ1JDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBleHRlbmRlZAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgQ1JDIHBlcmlwaGVyYWwuCisgICoKKyAgQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAgICAoKykgU2V0IHVzZXItZGVmaW5lZCBnZW5lcmF0aW5nIHBvbHlub21pYWwgdGhydSBIQUxfQ1JDRXhfUG9seW5vbWlhbF9TZXQoKQorICAgICAgICAgKCspIENvbmZpZ3VyZSBJbnB1dCBvciBPdXRwdXQgZGF0YSBpbnZlcnNpb24KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUkNFeCBDUkNFeAorICAqIEBicmllZiBDUkMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0NSQ19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgQ1JDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIENSQyBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGdlbmVyYXRpbmcgcG9seW5vbWlhbAorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgaW5wdXQgZGF0YSBpbnZlcnNpb24KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIG91dHB1dCBkYXRhIGludmVyc2lvbgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JDIHBvbHlub21pYWwgaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdCBvbmUuCisgICogQHBhcmFtICBoY3JjIENSQyBoYW5kbGUKKyAgKiBAcGFyYW0gIFBvbCBDUkMgZ2VuZXJhdGluZyBwb2x5bm9taWFsICg3LCA4LCAxNiBvciAzMi1iaXQgbG9uZykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB3cml0dGVuIGluIG5vcm1hbCByZXByZXNlbnRhdGlvbiwgZS5nLgorICAqICAgICAgICAgQGFyZyBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3LCBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxIGlzIHdyaXR0ZW4gMHg2NQorICAqICAgICAgICAgQGFyZyBmb3IgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNiwgWF4xNiArIFheMTIgKyBYXjUgKyAxIGlzIHdyaXR0ZW4gMHgxMDIxCisgICogQHBhcmFtICBQb2x5TGVuZ3RoIENSQyBwb2x5bm9taWFsIGxlbmd0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19QT0xZTEVOR1RIXzdCICA3LWJpdCBsb25nIENSQyAoZ2VuZXJhdGluZyBwb2x5bm9taWFsIG9mIGRlZ3JlZSA3KQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfUE9MWUxFTkdUSF84QiAgOC1iaXQgbG9uZyBDUkMgKGdlbmVyYXRpbmcgcG9seW5vbWlhbCBvZiBkZWdyZWUgOCkKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfMTZCIDE2LWJpdCBsb25nIENSQyAoZ2VuZXJhdGluZyBwb2x5bm9taWFsIG9mIGRlZ3JlZSAxNikKKyAgKiAgICAgICAgICBAYXJnIEByZWYgQ1JDX1BPTFlMRU5HVEhfMzJCIDMyLWJpdCBsb25nIENSQyAoZ2VuZXJhdGluZyBwb2x5bm9taWFsIG9mIGRlZ3JlZSAzMikKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9Qb2x5bm9taWFsX1NldChDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgUG9sLCB1aW50MzJfdCBQb2x5TGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IG1zYiA9IDMxVTsgLyogcG9seW5vbWlhbCBkZWdyZWUgaXMgMzIgYXQgbW9zdCwgc28gbXNiIGlzIGluaXRpYWxpemVkIHRvIG1heCB2YWx1ZSAqLworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfUE9MX0xFTkdUSChQb2x5TGVuZ3RoKSk7CisKKyAgLyogY2hlY2sgcG9seW5vbWlhbCBkZWZpbml0aW9uIHZzIHBvbHlub21pYWwgc2l6ZToKKyAgICogcG9seW5vbWlhbCBsZW5ndGggbXVzdCBiZSBhbGlnbmVkIHdpdGggcG9seW5vbWlhbAorICAgKiBkZWZpbml0aW9uLiBIQUxfRVJST1IgaXMgcmVwb3J0ZWQgaWYgUG9sIGRlZ3JlZSBpcworICAgKiBsYXJnZXIgdGhhbiB0aGF0IGluZGljYXRlZCBieSBQb2x5TGVuZ3RoLgorICAgKiBMb29rIGZvciBNU0IgcG9zaXRpb246IG1zYiB3aWxsIGNvbnRhaW4gdGhlIGRlZ3JlZSBvZgorICAgKiAgdGhlIHNlY29uZCB0byB0aGUgbGFyZ2VzdCBwb2x5bm9taWFsIG1lbWJlci4gRS5nLiwgZm9yCisgICAqICBYXjcgKyBYXjYgKyBYXjUgKyBYXjIgKyAxLCBtc2IgPSA2LiAqLworICB3aGlsZSAoKG1zYi0tID4gMFUpICYmICgoUG9sICYgKCh1aW50MzJfdCkoMHgxVSkgPDwgKG1zYiAmIDB4MUZVKSkpID09IDBVKSkKKyAgeworICB9CisKKyAgc3dpdGNoIChQb2x5TGVuZ3RoKQorICB7CisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF83QjoKKyAgICAgIGlmIChtc2IgPj0gSEFMX0NSQ19MRU5HVEhfN0IpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9ICAgSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF84QjoKKyAgICAgIGlmIChtc2IgPj0gSEFMX0NSQ19MRU5HVEhfOEIpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9ICAgSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUkNfUE9MWUxFTkdUSF8xNkI6CisgICAgICBpZiAobXNiID49IEhBTF9DUkNfTEVOR1RIXzE2QikKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gICBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ1JDX1BPTFlMRU5HVEhfMzJCOgorICAgICAgLyogbm8gcG9seW5vbWlhbCBkZWZpbml0aW9uIHZzLiBwb2x5bm9taWFsIGxlbmd0aCBpc3N1ZSBwb3NzaWJsZSAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgeworICAgIC8qIHNldCBnZW5lcmF0aW5nIHBvbHlub21pYWwgKi8KKyAgICBXUklURV9SRUcoaGNyYy0+SW5zdGFuY2UtPlBPTCwgUG9sKTsKKworICAgIC8qIHNldCBnZW5lcmF0aW5nIHBvbHlub21pYWwgc2l6ZSAqLworICAgIE1PRElGWV9SRUcoaGNyYy0+SW5zdGFuY2UtPkNSLCBDUkNfQ1JfUE9MWVNJWkUsIFBvbHlMZW5ndGgpOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJldmVyc2UgSW5wdXQgZGF0YSBtb2RlLgorICAqIEBwYXJhbSAgaGNyYyBDUkMgaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFJldmVyc2VNb2RlIElucHV0IERhdGEgaW52ZXJzaW9uIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9OT05FICAgICBubyBjaGFuZ2UgaW4gYml0IG9yZGVyIChkZWZhdWx0IHZhbHVlKQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9CWVRFICAgICBCeXRlLXdpc2UgYml0IHJldmVyc2FsCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX0hBTEZXT1JEIEhhbGZXb3JkLXdpc2UgYml0IHJldmVyc2FsCisgICogICAgICAgICAgQGFyZyBAcmVmIENSQ19JTlBVVERBVEFfSU5WRVJTSU9OX1dPUkQgICAgIFdvcmQtd2lzZSBiaXQgcmV2ZXJzYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUkNFeF9JbnB1dF9EYXRhX1JldmVyc2UoQ1JDX0hhbmRsZVR5cGVEZWYgKmhjcmMsIHVpbnQzMl90IElucHV0UmV2ZXJzZU1vZGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfSU5QVVREQVRBX0lOVkVSU0lPTl9NT0RFKElucHV0UmV2ZXJzZU1vZGUpKTsKKworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX0JVU1k7CisKKyAgLyogc2V0IGlucHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUgKi8KKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfSU4sIElucHV0UmV2ZXJzZU1vZGUpOworICAvKiBDaGFuZ2UgQ1JDIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyYy0+U3RhdGUgPSBIQUxfQ1JDX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJldmVyc2UgT3V0cHV0IGRhdGEgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcmMgQ1JDIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0UmV2ZXJzZU1vZGUgT3V0cHV0IERhdGEgaW52ZXJzaW9uIG1vZGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRElTQUJMRSBubyBDUkMgaW52ZXJzaW9uIChkZWZhdWx0IHZhbHVlKQorICAqICAgICAgICAgIEBhcmcgQHJlZiBDUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fRU5BQkxFICBiaXQtbGV2ZWwgaW52ZXJzaW9uIChlLmcuIGZvciBhIDgtYml0IENSQzogMHhCNSBiZWNvbWVzIDB4QUQpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JDRXhfT3V0cHV0X0RhdGFfUmV2ZXJzZShDUkNfSGFuZGxlVHlwZURlZiAqaGNyYywgdWludDMyX3QgT3V0cHV0UmV2ZXJzZU1vZGUpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUkNfT1VUUFVUREFUQV9JTlZFUlNJT05fTU9ERShPdXRwdXRSZXZlcnNlTW9kZSkpOworCisgIC8qIENoYW5nZSBDUkMgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoY3JjLT5TdGF0ZSA9IEhBTF9DUkNfU1RBVEVfQlVTWTsKKworICAvKiBzZXQgb3V0cHV0IGRhdGEgaW52ZXJzaW9uIG1vZGUgKi8KKyAgTU9ESUZZX1JFRyhoY3JjLT5JbnN0YW5jZS0+Q1IsIENSQ19DUl9SRVZfT1VULCBPdXRwdXRSZXZlcnNlTW9kZSk7CisKKyAgLyogQ2hhbmdlIENSQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcmMtPlN0YXRlID0gSEFMX0NSQ19TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworCisjZW5kaWYgLyogSEFMX0NSQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2NyeXAuYyBiL1NyYy9zdG0zMndieHhfaGFsX2NyeXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWExYjAwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfY3J5cC5jCkBAIC0wLDAgKzEsNTMxMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfY3J5cC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDUllQIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENyeXB0b2dyYXBoeSAoQ1JZUCkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiwgZGUtaW5pdGlhbGl6YXRpb24sIHNldCBjb25maWcgYW5kIGdldCBjb25maWcgIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIERFUy9UREVTLCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBETUEgY2FsbGJhY2sgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgQ1JZUCBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBDUllQIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgaW4gQ1JZUCBvciBUaW55QUVTIHBlcmlwaGVyYWwgYXMgZm9sbG93czoKKworICAgICAgKCMpSW5pdGlhbGl6ZSB0aGUgQ1JZUCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX0NSWVBfTXNwSW5pdCgpOgorICAgICAgICAgKCMjKSBFbmFibGUgdGhlIENSWVAgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19DUllQX0NMS19FTkFCTEUoKW9yIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRSBmb3IgVGlueUFFUyBwZXJpcGhlcmFsCisgICAgICAgICAoIyMpIEluIGNhc2Ugb2YgdXNpbmcgaW50ZXJydXB0cyAoZS5nLiBIQUxfQ1JZUF9FbmNyeXB0X0lUKCkpCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBDUllQIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBDUllQIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpCisgICAgICAgICAgICAgKCsrKykgSW4gQ1JZUCBJUlEgaGFuZGxlciwgY2FsbCBIQUxfQ1JZUF9JUlFIYW5kbGVyKCkKKyAgICAgICAgICgjIykgSW4gY2FzZSBvZiB1c2luZyBETUEgdG8gY29udHJvbCBkYXRhIHRyYW5zZmVyIChlLmcuIEhBTF9DUllQX0VuY3J5cHRfRE1BKCkpCisgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZyBfX1JDQ19ETUF4X0NMS19FTkFCTEUoKQorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBhbmQgZW5hYmxlIHR3byBETUEgc3RyZWFtcyBvbmUgZm9yIG1hbmFnaW5nIGRhdGEgdHJhbnNmZXIgZnJvbQorICAgICAgICAgICAgICAgICBtZW1vcnkgdG8gcGVyaXBoZXJhbCAoaW5wdXQgc3RyZWFtKSBhbmQgYW5vdGhlciBzdHJlYW0gZm9yIG1hbmFnaW5nIGRhdGEKKyAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeSAob3V0cHV0IHN0cmVhbSkKKyAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIENSWVAgRE1BIGhhbmRsZQorICAgICAgICAgICAgICAgICB1c2luZyAgX19IQUxfTElOS0RNQSgpCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgaW50ZXJydXB0IG9uIHRoZSB0d28gRE1BIFN0cmVhbXMuIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBoYXZlIGhpZ2hlcgorICAgICAgICAgICAgICAgICBwcmlvcml0eSB0aGFuIHRoZSBpbnB1dCBzdHJlYW0gSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkKKworICAgICAgKCMpSW5pdGlhbGl6ZSB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIDoKKyAgICAgICAgICgjIykgVGhlIGRhdGEgdHlwZTogMS1iaXQsIDgtYml0LCAxNi1iaXQgb3IgMzItYml0LgorICAgICAgICAgKCMjKSBUaGUga2V5IHNpemU6IDEyOCwgMTkyIG9yIDI1Ni4KKyAgICAgICAgICgjIykgVGhlIEFsZ29Nb2RlIERFUy8gVERFUyBBbGdvcml0aG0gRUNCL0NCQyBvciBBRVMgQWxnb3JpdGhtIEVDQi9DQkMvQ1RSL0dDTSBvciBDQ00uCisgICAgICAgICAoIyMpIFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKGNvdW50ZXIpLiBJdCBpcyBub3QgdXNlZCBpbiBFQ0IgbW9kZS4KKyAgICAgICAgICgjIykgVGhlIGtleSBidWZmZXIgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLgorICAgICAgICAgICAgICgrKyspIEluIHNvbWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMsIHRoZSBrZXkgaXMgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICBjb2RlIG91dCBvZiB0aGUgSEFMIHNjb3BlLiBJbiB0aGF0IGNhc2UsIHVzZXIgY2FuIHN0aWxsIHJlc29ydCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICBIQUwgQVBJcyBhcyB1c3VhbCBidXQgbXVzdCBtYWtlIHN1cmUgdGhhdCBwS2V5IHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwuCisgICAgICAgICAoIyMpIFRoZSBIZWFkZXIgdXNlZCBvbmx5IGluIEFFUyBHQ00gYW5kIENDTSBBbGdvcml0aG0gZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAgKCMjKSBUaGUgSGVhZGVyU2l6ZSBUaGUgc2l6ZSBvZiBoZWFkZXIgYnVmZmVyIGluIHdvcmQuCisgICAgICAgICAoIyMpIFRoZSBCMCBibG9jayBpcyB0aGUgZmlyc3QgYXV0aGVudGljYXRpb24gYmxvY2sgdXNlZCBvbmx5ICBpbiBBRVMgQ0NNIG1vZGUuCisKKyAgICAgICgjKVRocmVlIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24vZGVjcnlwdGlvbikgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGU6CisgICAgICAgICAoIyMpIFBvbGxpbmcgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBibG9ja2luZyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgYW5kIHdhaXQgdGlsbCB0aGUgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgZS5nLiBIQUxfQ1JZUF9FbmNyeXB0ICYgSEFMX0NSWVBfRGVjcnlwdAorICAgICAgICAgKCMjKSBJbnRlcnJ1cHQgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBub3QgYmxvY2tpbmcgZnVuY3Rpb25zCisgICAgICAgICAgICAgIGkuZS4gdGhleSBwcm9jZXNzIHRoZSBkYXRhIHVuZGVyIGludGVycnVwdCwKKyAgICAgICAgICAgICAgZS5nLiBIQUxfQ1JZUF9FbmNyeXB0X0lUICYgSEFMX0NSWVBfRGVjcnlwdF9JVAorICAgICAgICAgKCMjKSBETUEgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBub3QgYmxvY2tpbmcgZnVuY3Rpb25zCisgICAgICAgICAgICAgIGkuZS4gdGhlIGRhdGEgdHJhbnNmZXIgaXMgZW5zdXJlZCBieSBETUEsCisgICAgICAgICAgICAgIGUuZy4gSEFMX0NSWVBfRW5jcnlwdF9ETUEgJiBIQUxfQ1JZUF9EZWNyeXB0X0RNQQorCisgICAgICAoIylXaGVuIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBmaXJzdCB0aW1lIGFmdGVyIEhBTF9DUllQX0luaXQoKQorICAgICAgICAgdGhlIENSWVAgcGVyaXBoZXJhbCBpcyBjb25maWd1cmVkIGFuZCBwcm9jZXNzZXMgdGhlIGJ1ZmZlciBpbiBpbnB1dC4KKyAgICAgICAgIEF0IHNlY29uZCBjYWxsLCBubyBuZWVkIHRvIEluaXRpYWxpemUgdGhlIENSWVAsIHVzZXIgaGF2ZSB0byBnZXQgY3VycmVudCBjb25maWd1cmF0aW9uIHZpYQorICAgICAgICAgSEFMX0NSWVBfR2V0Q29uZmlnKCkgQVBJLCB0aGVuIG9ubHkgIEhBTF9DUllQX1NldENvbmZpZygpIGlzIHJlcXVlc3RlZCB0byBzZXQKKyAgICAgICAgIG5ldyBwYXJhbWV0cmVzLCBmaW5hbGx5IHVzZXIgY2FuICBzdGFydCBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCisKKyAgICAgICAoIylDYWxsIEhBTF9DUllQX0RlSW5pdCgpIHRvIGRlaW5pdGlhbGl6ZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgorCisgICAgICAgKCMpVG8gcHJvY2VzcyBhIHNpbmdsZSBtZXNzYWdlIHdpdGggY29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0NSWVBfRW5jcnlwdCgpIG9yIEhBTF9DUllQX0RlY3J5cHQoKQorICAgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGNvbmZpZ3VyZSBhZ2FpbiB0aGUgS2V5IG9yIHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgYmV0d2VlbiBlYWNoIEFQSSBjYWxsLAorICAgICAgICAgIHRoZSBmaWVsZCBLZXlJVkNvbmZpZ1NraXAgb2YgdGhlIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBtdXN0IGJlIHNldCB0byBDUllQX0tFWUlWQ09ORklHX09OQ0UuCisgICAgICAgICAgU2FtZSBpcyB0cnVlIGZvciBjb25zZWN1dGl2ZSBjYWxscyBvZiBIQUxfQ1JZUF9FbmNyeXB0X0lUKCksIEhBTF9DUllQX0RlY3J5cHRfSVQoKSwgSEFMX0NSWVBfRW5jcnlwdF9ETUEoKQorICAgICAgICAgIG9yIEhBTF9DUllQX0RlY3J5cHRfRE1BKCkuCisKKyAgICBbLi5dCisgICAgICBUaGUgY3J5cHRvZ3JhcGhpYyBwcm9jZXNzb3Igc3VwcG9ydHMgZm9sbG93aW5nIHN0YW5kYXJkczoKKyAgICAgICgjKSBUaGUgZGF0YSBlbmNyeXB0aW9uIHN0YW5kYXJkIChERVMpIGFuZCBUcmlwbGUtREVTIChUREVTKSBzdXBwb3J0ZWQgb25seSBieSBDUllQMSBwZXJpcGhlcmFsOgorICAgICAgICAgKCMjKTY0LWJpdCBkYXRhIGJsb2NrIHByb2Nlc3NpbmcKKyAgICAgICAgICgjIykgY2hhaW5pbmcgbW9kZXMgc3VwcG9ydGVkIDoKKyAgICAgICAgICAgICAoKysrKSAgRWxlY3Ryb25pYyBDb2RlIEJvb2soRUNCKQorICAgICAgICAgICAgICgrKyspICBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKKyAgICAgICAgICgjIykga2V5cyBsZW5ndGggc3VwcG9ydGVkIDo2NC1iaXQsIDEyOC1iaXQgYW5kIDE5Mi1iaXQuCisgICAgICAoIykgVGhlIGFkdmFuY2VkIGVuY3J5cHRpb24gc3RhbmRhcmQgKEFFUykgc3VwcG9ydGVkICBieSBDUllQMSAmIFRpbnlBRVMgcGVyaXBoZXJhbDoKKyAgICAgICAgICgjIykxMjgtYml0IGRhdGEgYmxvY2sgcHJvY2Vzc2luZworICAgICAgICAgKCMjKSBjaGFpbmluZyBtb2RlcyBzdXBwb3J0ZWQgOgorICAgICAgICAgICAgICgrKyspICBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCisgICAgICAgICAgICAgKCsrKykgIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQorICAgICAgICAgICAgICgrKyspICBDb3VudGVyIG1vZGUgKENUUikKKyAgICAgICAgICAgICAoKysrKSAgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNL0dNQUMpCisgICAgICAgICAgICAgKCsrKykgIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pCisgICAgICAgICAoIyMpIGtleXMgbGVuZ3RoIFN1cHBvcnRlZCA6CisgICAgICAgICAgICAgKCsrKykgZm9yIENSWVAxIHBlcmlwaGVyYWw6IDEyOC1iaXQsIDE5Mi1iaXQgYW5kIDI1Ni1iaXQuCisgICAgICAgICAgICAgKCsrKykgZm9yIFRpbnlBRVMgcGVyaXBoZXJhbDogIDEyOC1iaXQgYW5kIDI1Ni1iaXQKKworICAgIFsuLl0KKyAgICAoQCkgU3BlY2lmaWMgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGZvcm1hdCB0aGUga2V5IGFuZCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIElWIQorCisgICAgWy4uXSBJZiB0aGUga2V5IGlzIGRlZmluZWQgYXMgYSAxMjgtYml0IGxvbmcgYXJyYXkga2V5WzEyNy4uMF0gPSB7YjEyNyAuLi4gYjB9IHdoZXJlCisgICAgICAgICBiMTI3IGlzIHRoZSBNU0IgYW5kIGIwIHRoZSBMU0IsIHRoZSBrZXkgbXVzdCBiZSBzdG9yZWQgaW4gTUNVIG1lbW9yeQorICAgICAgICAgKCspIGFzIGEgc2VxdWVuY2Ugb2Ygd29yZHMgd2hlcmUgdGhlIE1TQiB3b3JkIGNvbWVzIGZpcnN0IChvY2N1cGllcyB0aGUKKyAgICAgICAgICAgbG93ZXN0IG1lbW9yeSBhZGRyZXNzKQorICAgICAgICAgICgrKykgICBhZGRyZXNzIG4rMCA6IDBiIGIxMjcgLi4gYjEyMCBiMTE5IC4uIGIxMTIgYjExMSAuLiBiMTA0IGIxMDMgLi4gYjk2CisgICAgICAgICAgKCsrKSAgIGFkZHJlc3Mgbis0IDogMGIgYjk1IC4uIGI4OCBiODcgLi4gYjgwIGI3OSAuLiBiNzIgYjcxIC4uIGI2NAorICAgICAgICAgICgrKykgICBhZGRyZXNzIG4rOCA6IDBiIGI2MyAuLiBiNTYgYjU1IC4uIGI0OCBiNDcgLi4gYjQwIGIzOSAuLiBiMzIKKyAgICAgICAgICAoKyspICAgYWRkcmVzcyBuK0MgOiAwYiBiMzEgLi4gYjI0IGIyMyAuLiBiMTYgYjE1IC4uIGI4IGI3IC4uIGIwCisgICAgIFsuLl0gSGVyZWFmdGVyLCBhbm90aGVyIGlsbHVzdHJhdGlvbiB3aGVuIGNvbnNpZGVyaW5nIGEgMTI4LWJpdCBsb25nIGtleSBtYWRlIG9mIDE2IGJ5dGVzIHtCMTUuLkIwfS4KKyAgICAgICAgIFRoZSA0IDMyLWJpdCB3b3JkcyB0aGF0IG1ha2UgdGhlIGtleSBtdXN0IGJlIHN0b3JlZCBhcyBmb2xsb3dzIGluIE1DVSBtZW1vcnk6CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswIDogMHggQjE1IEIxNCBCMTMgQjEyCisgICAgICAgICAgKCspICAgIGFkZHJlc3Mgbis0IDogMHggQjExIEIxMCBCOSBCOAorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rOCA6IDB4IEI3IEI2IEI1IEI0CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbitDIDogMHggQjMgQjIgQjEgQjAKKyAgICAgWy4uXSAgd2hpY2ggbGVhZHMgdG8gdGhlIGV4cGVjdGVkIHNldHRpbmcKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIzID0gMHggQjE1IEIxNCBCMTMgQjEyCisgICAgICAgKCspICAgICAgIEFFU19LRVlSMiA9IDB4IEIxMSBCMTAgQjkgQjgKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIxID0gMHggQjcgQjYgQjUgQjQKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIwID0gMHggQjMgQjIgQjEgQjAKKworICAgIFsuLl0gIFNhbWUgZm9ybWF0IG11c3QgYmUgYXBwbGllZCBmb3IgYSAyNTYtYml0IGxvbmcga2V5IG1hZGUgb2YgMzIgYnl0ZXMge0IzMS4uQjB9LgorICAgICAgICAgIFRoZSA4IDMyLWJpdCB3b3JkcyB0aGF0IG1ha2UgdGhlIGtleSBtdXN0IGJlIHN0b3JlZCBhcyBmb2xsb3dzIGluIE1DVSBtZW1vcnk6CisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswMCA6IDB4IEIzMSBCMzAgQjI5IEIyOAorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMDQgOiAweCBCMjcgQjI2IEIyNSBCMjQKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzA4IDogMHggQjIzIEIyMiBCMjEgQjIwCisgICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswQyA6IDB4IEIxOSBCMTggQjE3IEIxNgorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMTAgOiAweCBCMTUgQjE0IEIxMyBCMTIKKyAgICAgICAgICAoKykgICAgYWRkcmVzcyBuKzE0IDogMHggQjExIEIxMCBCOSBCOAorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMTggOiAweCBCNyBCNiBCNSBCNAorICAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMUMgOiAweCBCMyBCMiBCMSBCMAorICAgICBbLi5dICB3aGljaCBsZWFkcyB0byB0aGUgZXhwZWN0ZWQgc2V0dGluZworICAgICAgICgrKSAgICAgICBBRVNfS0VZUjcgPSAweCBCMzEgQjMwIEIyOSBCMjgKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVI2ID0gMHggQjI3IEIyNiBCMjUgQjI0CisgICAgICAgKCspICAgICAgIEFFU19LRVlSNSA9IDB4IEIyMyBCMjIgQjIxIEIyMAorICAgICAgICgrKSAgICAgICBBRVNfS0VZUjQgPSAweCBCMTkgQjE4IEIxNyBCMTYKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIzID0gMHggQjE1IEIxNCBCMTMgQjEyCisgICAgICAgKCspICAgICAgIEFFU19LRVlSMiA9IDB4IEIxMSBCMTAgQjkgQjgKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIxID0gMHggQjcgQjYgQjUgQjQKKyAgICAgICAoKykgICAgICAgQUVTX0tFWVIwID0gMHggQjMgQjIgQjEgQjAKKworICAgIFsuLl0gSW5pdGlhbGl6YXRpb24gVmVjdG9yIElWICg0IDMyLWJpdCB3b3JkcykgZm9ybWF0IG11c3QgZm9sbG93IHRoZSBzYW1lIGFzCisgICAgICAgICB0aGF0IG9mIGEgMTI4LWJpdCBsb25nIGtleS4KKworICAgIFsuLl0gTm90ZSB0aGF0IGtleSBhbmQgSVYgcmVnaXN0ZXJzIGFyZSBub3Qgc2Vuc2l0aXZlIHRvIHN3YXAgbW9kZSBzZWxlY3Rpb24uCisKKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBBRVMgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKSBzdXBwb3J0ZWQgYnkgYm90aCBDUllQMSBhbmQgVGlueUFFUyBwZXJpcGhlcmFsczoKKyAgICAgICgjKSAgQWxnb3JpdGhtIHN1cHBvcnRlZCA6CisgICAgICAgICAoIyMpIEdhbG9pcy9jb3VudGVyIG1vZGUgKEdDTSkKKyAgICAgICAgICgjIykgR2Fsb2lzIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSAoR01BQykgOmlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKKyAgICAgICAgICAgICAgR0NNIGFsZ29yaXRobSBjb21wb3NlZCBvbmx5IGJ5IGFuIGhlYWRlci4KKyAgICAgICgjKSAgRm91ciBwaGFzZXMgYXJlIHBlcmZvcm1lZCBpbiBHQ00gOgorICAgICAgICAgKCMjKSBJbml0IHBoYXNlOiBwZXJpcGhlcmFsIHByZXBhcmVzIHRoZSBHQ00gaGFzaCBzdWJrZXkgKEgpIGFuZCBkbyB0aGUgSVYgcHJvY2Vzc2luZworICAgICAgICAgKCMjKSBIZWFkZXIgcGhhc2U6IHBlcmlwaGVyYWwgcHJvY2Vzc2VzIHRoZSBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0ZWQgRGF0YSAoQUFEKSwgd2l0aCBoYXNoCisgICAgICAgICAgY29tcHV0YXRpb24gb25seS4KKyAgICAgICAgICgjIykgUGF5bG9hZCBwaGFzZTogcGVyaXBoZXJhbCBwcm9jZXNzZXMgdGhlIHBsYWludGV4dCAoUCkgd2l0aCBoYXNoIGNvbXB1dGF0aW9uICsga2V5c3RyZWFtCisgICAgICAgICAgZW5jcnlwdGlvbiArIGRhdGEgWE9SaW5nLiBJdCB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciBjaXBoZXJ0ZXh0IChDKS4KKyAgICAgICAgICgjIykgRmluYWwgcGhhc2U6IHBlcmlwaGVyYWwgZ2VuZXJhdGVzIHRoZSBhdXRoZW50aWNhdGVkIHRhZyAoVCkgdXNpbmcgdGhlIGxhc3QgYmxvY2sgb2YgZGF0YS4KKyAgICAgICgjKSAgc3RydWN0dXJlIG9mIG1lc3NhZ2UgY29uc3RydWN0aW9uIGluIEdDTSBpcyBkZWZpbmVkIGFzIGJlbG93ICA6CisgICAgICAgICAoIyMpIDE2IGJ5dGVzIEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKWNvbXBvc2VkIG9mIElWIGFuZCBjb3VudGVyCisgICAgICAgICAoIyMpIFRoZSBhdXRoZW50aWNhdGVkIGhlYWRlciBBIChhbHNvIGtub3dzIGFzIEFkZGl0aW9uYWwgQXV0aGVudGljYXRpb24gRGF0YSBBQUQpCisgICAgICAgICAgdGhpcyBwYXJ0IG9mIHRoZSBtZXNzYWdlIGlzIG9ubHkgYXV0aGVudGljYXRlZCwgbm90IGVuY3J5cHRlZC4KKyAgICAgICAgICgjIykgVGhlIHBsYWludGV4dCBtZXNzYWdlIFAgaXMgYm90aCBhdXRoZW50aWNhdGVkIGFuZCBlbmNyeXB0ZWQgYXMgY2lwaGVydGV4dC4KKyAgICAgICAgICBHQ00gc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgY2lwaGVydGV4dCBoYXMgc2FtZSBiaXQgbGVuZ3RoIGFzIHRoZSBwbGFpbnRleHQuCisgICAgICAgICAoIyMpIFRoZSBsYXN0IGJsb2NrIGlzIGNvbXBvc2VkIG9mIHRoZSBsZW5ndGggb2YgQSAob24gNjQgYml0cykgYW5kIHRoZSBsZW5ndGggb2YgY2lwaGVydGV4dAorICAgICAgICAgIChvbiA2NCBiaXRzKQorICAgICAgICAgIAorICAgIFsuLl0gIEEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgR0NNIG1lc3NhZ2Ugc3RydWN0dXJlIGlzIGF2YWlsYWJsZSBiZWxvdy4gICAgICAgICAKKworICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBkZXNjcmliZSBUaGUgQUVTIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZQorICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIENvZGUgKENDTSkgc3VwcG9ydGVkIGJ5IGJvdGggQ1JZUDEgYW5kIFRpbnlBRVMgcGVyaXBoZXJhbDoKKyAgICAgICgjKSAgU3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgQ0NNICA6CisKKyAgICAgICAgICgjIykgQjAgYmxvY2sgIDogZm9sbG93cyBOSVNUIFNwZWNpYWwgUHVibGljYXRpb24gODAwLTM4QywKKyAgICAgICAgICgjIykgQjEgYmxvY2sgKGhlYWRlcikgCisgICAgICAgICAoIyMpIENUUnggYmxvY2sgIDogY29udHJvbCBibG9ja3MKKyAgICAgICAgICAgICAKKyAgICBbLi5dICBBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBDQ00gbWVzc2FnZSBzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlIGJlbG93LiAgICAgICAgICAgICAKKworICAgICAgKCMpICBGb3VyIHBoYXNlcyBhcmUgcGVyZm9ybWVkIGluIENDTSBmb3IgQ1JZUDEgcGVyaXBoZXJhbDoKKyAgICAgICAgICgjIykgSW5pdCBwaGFzZTogcGVyaXBoZXJhbCBwcmVwYXJlcyB0aGUgR0NNIGhhc2ggc3Via2V5IChIKSBhbmQgZG8gdGhlIElWIHByb2Nlc3NpbmcKKyAgICAgICAgICgjIykgSGVhZGVyIHBoYXNlOiBwZXJpcGhlcmFsIHByb2Nlc3NlcyB0aGUgQWRkaXRpb25hbCBBdXRoZW50aWNhdGVkIERhdGEgKEFBRCksIHdpdGggaGFzaAorICAgICAgICAgIGNvbXB1dGF0aW9uIG9ubHkuCisgICAgICAgICAoIyMpIFBheWxvYWQgcGhhc2U6IHBlcmlwaGVyYWwgcHJvY2Vzc2VzIHRoZSBwbGFpbnRleHQgKFApIHdpdGggaGFzaCBjb21wdXRhdGlvbiArIGtleXN0cmVhbQorICAgICAgICAgIGVuY3J5cHRpb24gKyBkYXRhIFhPUmluZy4gSXQgd29ya3MgaW4gYSBzaW1pbGFyIHdheSBmb3IgY2lwaGVydGV4dCAoQykuCisgICAgICAgICAoIyMpIEZpbmFsIHBoYXNlOiBwZXJpcGhlcmFsIGdlbmVyYXRlcyB0aGUgYXV0aGVudGljYXRlZCB0YWcgKFQpIHVzaW5nIHRoZSBsYXN0IGJsb2NrIG9mIGRhdGEuCisgICAgICAoIykgICAgQ0NNIGluIFRpbnlBRVMgcGVyaXBoZXJhbDoKKyAgICAgICAgICgjIykgVG8gcGVyZm9ybSBtZXNzYWdlIHBheWxvYWQgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIEFFUyBpcyBjb25maWd1cmVkIGluIENUUiBtb2RlLgorICAgICAgICAgKCMjKSBGb3IgYXV0aGVudGljYXRpb24gdHdvIHBoYXNlcyBhcmUgcGVyZm9ybWVkIDoKKyAgICAgICAgICAtIEhlYWRlciBwaGFzZTogcGVyaXBoZXJhbCBwcm9jZXNzZXMgdGhlIEFkZGl0aW9uYWwgQXV0aGVudGljYXRlZCBEYXRhIChBQUQpIGZpcnN0LCB0aGVuIHRoZSBjbGVhcnRleHQgbWVzc2FnZQorICAgICAgICAgIG9ubHkgY2xlYXJ0ZXh0IHBheWxvYWQgKG5vdCB0aGUgY2lwaGVydGV4dCBwYXlsb2FkKSBpcyB1c2VkIGFuZCBubyBvdXRwb3V0LgorICAgICAgICAgKCMjKSBGaW5hbCBwaGFzZTogcGVyaXBoZXJhbCBnZW5lcmF0ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgdGFnIChUKSB1c2luZyB0aGUgbGFzdCBibG9jayBvZiBkYXRhLgorCisgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEhBTF9DUllQX1JlZ2lzdGVyWFhYQ2FsbGJhY2soKQorICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisKKyAgRnVuY3Rpb24gQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEluQ3BsdENhbGxiYWNrICAgICA6ICBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgICAoKykgT3V0Q3BsdENhbGxiYWNrICAgIDogT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBDUllQIE1zcEluaXQuCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IENSWVAgTXNwRGVJbml0LgorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICB3ZWFrIGZ1bmN0aW9uLgorICBAcmVmIEhBTF9DUllQX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgSW5DcGx0Q2FsbGJhY2sgICAgIDogIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAgICgrKSBPdXRDcGx0Q2FsbGJhY2sgICAgOiBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IENSWVAgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogQ1JZUCBNc3BEZUluaXQuCisKKyAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfQ1JZUF9TVEFURV9SRVNFVAorICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMgOgorICBleGFtcGxlcyBAcmVmIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKCkgLCBAcmVmIEhBTF9DUllQX091dENwbHRDYWxsYmFjaygpLgorICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb24gaW4gdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpLyBAcmVmIEhBTF9DUllQX0RlSW5pdCgpIG9ubHkgd2hlbgorICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICBpZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpIC8gQHJlZiBIQUxfQ1JZUF9EZUluaXQoKQorICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfQ1JZUF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgaW4gSEFMX0NSWVBfU1RBVEVfUkVBRFkgb3IgSEFMX0NSWVBfU1RBVEVfUkVTRVQgc3RhdGUsCisgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgdXNpbmcgQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfQ1JZUF9EZUluaXQoKQorICBvciBAcmVmIEhBTF9DUllQX0luaXQoKSBmdW5jdGlvbi4KKworICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworCisgICoqKiBTdXNwZW5kL1Jlc3VtZSBmZWF0dXJlICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byByZXNvcnQgdG8gdGhlIHN1c3BlbmQvcmVzdW1lIGZlYXR1cmUuCisgIEEgbG93IHByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcgY2FuIGJlIHN1c3BlbmRlZCB0byBwcm9jZXNzIGEgaGlnaCBwcmlvcml0eSBibG9jaworICBpbnN0ZWFkLiBXaGVuIHRoZSBoaWdoIHByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcgaXMgb3ZlciwgdGhlIGxvdyBwcmlvcml0eSBibG9jaworICBwcm9jZXNzaW5nIGNhbiBiZSByZXN1bWVkLCByZXN0YXJ0aW5nIGZyb20gdGhlIHBvaW50IHdoZXJlIGl0IHdhcyBzdXNwZW5kZWQuIFRoaXMKKyAgZmVhdHVyZSBpcyBhcHBsaWNhYmxlIG9ubHkgaW4gbm9uLWJsb2NraW5nIGludGVycnVwdCBtb2RlLgorCisgIFsuLl0gVXNlciBtdXN0IHJlc29ydCB0byBIQUxfQ1JZUF9TdXNwZW5kKCkgdG8gc3VzcGVuZCB0aGUgbG93IHByaW9yaXR5IGJsb2NrCisgIHByb2Nlc3NpbmcuIFRoaXMgQVBJIG1hbmFnZXMgdGhlIGhhcmR3YXJlIGJsb2NrIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiBhbmQgc2F2ZXMgYWxsIHRoZQorICBpbnRlcm5hbCBkYXRhIHRoYXQgd2lsbCBiZSBuZWVkZWQgdG8gcmVzdGFydCBsYXRlciBvbi4gVXBvbiBIQUxfQ1JZUF9TdXNwZW5kKCkgY29tcGxldGlvbiwKKyAgdGhlIHVzZXIgY2FuIGxhdW5jaCB0aGUgcHJvY2Vzc2luZyBvZiBhbnkgb3RoZXIgYmxvY2sgKGhpZ2ggcHJpb3JpdHkgYmxvY2sgcHJvY2Vzc2luZykuCisKKyAgWy4uXSBXaGVuIHRoZSBoaWdoIHByaW9yaXR5IGJsb2NrIHByb2Nlc3NpbmcgaXMgb3ZlciwgdXNlciBtdXN0IGludm9rZSBIQUxfQ1JZUF9SZXN1bWUoKQorICB0byByZXN1bWUgdGhlIGxvdyBwcmlvcml0eSBibG9jayBwcm9jZXNzaW5nLiBDaXBoZXJpbmcgKG9yIGRlY2lwaGVyaW5nKSByZXN0YXJ0cyBmcm9tCisgIHRoZSBzdXNwZW5zaW9uIHBvaW50IGFuZCBlbmRzIGFzIHVzdWFsLgorCisgIFsuLl0gSEFMX0NSWVBfU3VzcGVuZCgpIHJlcG9ydHMgYW4gZXJyb3Igd2hlbiB0aGUgc3VzcGVuc2lvbiByZXF1ZXN0IGlzIHNlbnQgdG9vIGxhdGUKKyAgKGkuZSB3aGVuIHRoZSBsb3cgcHJpb3JpdHkgYmxvY2sgcHJvY2Vzc2luZyBpcyBhYm91dCB0byBlbmQpLiBUaGVyZSBpcyBubyB1c2UgdG8KKyAgc3VzcGVuZCB0aGUgdGFnIGdlbmVyYXRpb24gcHJvY2Vzc2luZyBmb3IgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtcy4KKworICAgIFsuLl0KKyAgICAoQCkgSWYgdGhlIGtleSBpcyB3cml0dGVuIG91dCBvZiBIQUwgc2NvcGUgKGNhc2UgcEtleSBwb2ludGVyIHNldCB0byBOVUxMIGJ5IHRoZSB1c2VyKSwKKyAgICAgICAgdGhlIGJsb2NrIHByb2Nlc3Npbmcgc3VzcGVuc2lvbi9yZXN1bXB0aW9uIG1lY2hhbmlzbSBpcyBOT1QgYXBwbGljYWJsZS4KKworICAgIFsuLl0KKyAgICAoQCkgSWYgdGhlIEtleSBhbmQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIGFyZSBjb25maWd1cmVkIG9ubHkgb25jZSBhbmQgY29uZmlndXJhdGlvbiBpcworICAgICAgICBza2lwcGVkIGZvciBjb25zZWN1dGl2ZSBwcm9jZXNzaW5ncyAoY2FzZSBLZXlJVkNvbmZpZ1NraXAgc2V0IHRvIENSWVBfS0VZSVZDT05GSUdfT05DRSksCisgICAgICAgIHRoZSBibG9jayBwcm9jZXNzaW5nIHN1c3BlbnNpb24vcmVzdW1wdGlvbiBtZWNoYW5pc20gaXMgTk9UIGFwcGxpY2FibGUuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUllQCisgICogQHsKKyAgKi8KKworCisjaWZkZWYgSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0RlZmluZXMKKyAgKiBAeworICAqLworI2RlZmluZSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT04gICAgICA4MlUgICAgICAgICAvKiBUaGUgbGF0ZW5jeSBvZiBrZXkgcHJlcGFyYXRpb24gb3BlcmF0aW9uIGlzIDgyIGNsb2NrIGN5Y2xlcy4qLworI2RlZmluZSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFICAgICAyOTlVICAgICAgICAvKiBUaGUgbGF0ZW5jeSBvZiAgR0NNL0NDTSBpbml0IHBoYXNlIHRvIHByZXBhcmUgaGFzaCBzdWJrZXkgaXMgMjk5IGNsb2NrIGN5Y2xlcy4qLworI2RlZmluZSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0UgICAyOTBVICAgICAgICAvKiBUaGUgbGF0ZW5jeSBvZiAgR0NNL0NDTSBoZWFkZXIgcGhhc2UgaXMgMjkwIGNsb2NrIGN5Y2xlcy4qLworCisjZGVmaW5lIENSWVBfUEhBU0VfUkVBRFkgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIHJlYWR5IGZvciBpbml0aWFsaXphdGlvbi4gKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9QUk9DRVNTICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisjZGVmaW5lICBDUllQX1BIQVNFX0hFQURFUl9TVVNQRU5ERUQgICAgIDB4MDAwMDAwMDRVICAgIC8qITwgR0NNL0dNQUMvQ0NNIGhlYWRlciBwaGFzZSBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgIENSWVBfUEhBU0VfUEFZTE9BRF9TVVNQRU5ERUQgICAgMHgwMDAwMDAwNVUgICAgLyohPCBHQ00vQ0NNIHBheWxvYWQgcGhhc2UgaXMgc3VzcGVuZGVkICAgICAqLworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworCisjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IEVuY3J5cHRpb24gbW9kZShNb2RlIDEpICAqLworI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTiAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8wICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zIChNb2RlIDIpICovCisjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgICAgICAgICAgICAgIEFFU19DUl9NT0RFXzEgICAvKiE8IERlY3J5cHRpb24gICAgKE1vZGUgMykgICAgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCAgICAgQUVTX0NSX01PREUgICAgIC8qITwgS2V5IGRlcml2YXRpb24gYW5kIGRlY3J5cHRpb24gb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAoTW9kZSA0KSAqLworI2RlZmluZSBDUllQX1BIQVNFX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAvKiE8IEdDTS9HTUFDIG9yIENDTSBoZWFkZXIgcGhhc2UgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAgICAqLworI2RlZmluZSBDUllQX1BIQVNFX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEggICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICovCisKKy8qICBDVFIxIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMCAgICAgICAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMSAgICAgICAgICAgICAgICAgIDB4RkZGRkZGMDBVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9TRVRfUEhBU0UoX19IQU5ETEVfXywgX19QSEFTRV9fKSAgZG97KF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KSh+QUVTX0NSX0dDTVBIKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoX19QSEFTRV9fKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDBVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIHN0cnVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIENSWVBfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCitzdGF0aWMgdm9pZCBDUllQX1NldERNQUNvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBpbnB1dGFkZHIsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IG91dHB1dGFkZHIpOworc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQ1JZUF9ETUFPdXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIENSWVBfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgQ1JZUF9TZXRLZXkoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgS2V5U2l6ZSk7CitzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIHZvaWQgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cHQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25DQ0ZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKK3N0YXRpYyB2b2lkIENSWVBfUmVhZF9JVlJlZ2lzdGVycyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCogT3V0cHV0KTsKK3N0YXRpYyB2b2lkIENSWVBfV3JpdGVfSVZSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0KTsKK3N0YXRpYyB2b2lkIENSWVBfUmVhZF9TdXNwZW5kUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQpOworc3RhdGljIHZvaWQgQ1JZUF9Xcml0ZV9TdXNwZW5kUmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBJbnB1dCk7CitzdGF0aWMgdm9pZCBDUllQX1JlYWRfS2V5UmVnaXN0ZXJzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90KiBPdXRwdXQsIHVpbnQzMl90IEtleVNpemUpOworc3RhdGljIHZvaWQgQ1JZUF9Xcml0ZV9LZXlSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0LCB1aW50MzJfdCBLZXlTaXplKTsKK3N0YXRpYyB2b2lkIENSWVBfUGhhc2VQcm9jZXNzaW5nUmVzdW1lKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24sIGRlLWluaXRpYWxpemF0aW9uIGFuZCBTZXQgYW5kIEdldCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKKyAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSWVAgTVNQCisgICAgICAoKykgY29uZmlndXJlIENSWVAgKEhBTF9DUllQX1NldENvbmZpZykgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfQ29uZmlnVHlwZURlZgorICAgICAgICAgIFBhcmFtZXRlcnMgd2hpY2ggYXJlIGNvbmZpZ3VyZWQgaW4gVGhpcyBzZWN0aW9uIGFyZSA6CisgICAgICAgICAgKCspIEtleSBzaXplCisgICAgICAgICAgKCspIERhdGEgVHlwZSA6IDMyLDE2LCA4IG9yIDFiaXQKKyAgICAgICAgICAoKykgQWxnb01vZGUgOgorICAgICAgICAgICAgICAtIGZvciBDUllQMSBwZXJpcGhlcmFsIDoKKyAgICAgICAgICAgICAgICAgRUNCIGFuZCBDQkMgaW4gREVTL1RERVMgU3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgRUNCLENCQyxDVFIsR0NNL0dNQUMgYW5kIENDTSBpbiBBRVMgU3RhbmRhcmQuCisgICAgICAgICAgICAgIC0gZm9yIFRpbnlBRVMyIHBlcmlwaGVyYWwsIG9ubHkgRUNCLENCQyxDVFIsR0NNL0dNQUMgYW5kIENDTSBpbiBBRVMgU3RhbmRhcmQgYXJlIHN1cHBvcnRlZC4KKyAgICAgICgrKSBHZXQgQ1JZUCBjb25maWd1cmF0aW9uIChIQUxfQ1JZUF9HZXRDb25maWcpIGZyb20gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0hhbmRsZVR5cGVEZWYKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGNyeXAgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19DUllQX0tFWVNJWkUoaGNyeXAtPkluaXQuS2V5U2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9EQVRBVFlQRShoY3J5cC0+SW5pdC5EYXRhVHlwZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0oaGNyeXAtPkluaXQuQWxnb3JpdGhtKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0lOSVQoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwKSk7CisKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayAgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEluQ3BsdENhbGxiYWNrICAgKi8KKyAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICovCisgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgICA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAqLworCisgICAgaWYgKGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrKGhjcnlwKTsKKyAgfQorI2Vsc2UKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIEhBTF9DUllQX01zcEluaXQoaGNyeXApOworICB9CisjZW5kaWYgLyogKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisKKyAgLyogU2V0IHRoZSBrZXkgc2l6ZSAoVGhpcyBiaXQgZmllbGQgaXMgZG8gbm90IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSwgZGF0YSB0eXBlIGFuZCBBbGdvcml0aG0gKi8KKyAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUgfCBBRVNfQ1JfS0VZU0laRSB8IEFFU19DUl9DSE1PRCwgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKworICAvKiBSZXNldCBFcnJvciBDb2RlIGZpZWxkICovCisgIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9OT05FOworCisgIC8qIFJlc2V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGZsYWcgKi8KKyAgaGNyeXAtPktleUlWQ29uZmlnID0gMFU7CisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCisgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhjcnlwID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KKyAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9SRUFEWTsKKworICAvKiBSZXNldCBDcnlwSW5Db3VudCBhbmQgQ3J5cE91dENvdW50ICovCisgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwOworICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMDsKKworICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorCisgIGlmIChoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayhoY3J5cCk7CisKKyNlbHNlCisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCisgIEhBTF9DUllQX01zcERlSW5pdChoY3J5cCk7CisKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIENSWVAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfQ29uZmlnVHlwZURlZgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIHBDb25mIHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYpCit7CisgIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmICgoaGNyeXAgPT0gTlVMTCkgfHwgKHBDb25mID09IE5VTEwpKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfS0VZU0laRShwQ29uZi0+S2V5U2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9EQVRBVFlQRShwQ29uZi0+RGF0YVR5cGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfQUxHT1JJVEhNKHBDb25mLT5BbGdvcml0aG0pKTsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBTZXQgIENSWVAgcGFyYW1ldGVycyAgKi8KKyAgICBoY3J5cC0+SW5pdC5EYXRhVHlwZSAgID0gcENvbmYtPkRhdGFUeXBlOworICAgIGhjcnlwLT5Jbml0LnBLZXkgICAgICAgPSBwQ29uZi0+cEtleTsKKyAgICBoY3J5cC0+SW5pdC5BbGdvcml0aG0gID0gcENvbmYtPkFsZ29yaXRobTsKKyAgICBoY3J5cC0+SW5pdC5LZXlTaXplICAgID0gcENvbmYtPktleVNpemU7CisgICAgaGNyeXAtPkluaXQucEluaXRWZWN0ICA9IHBDb25mLT5wSW5pdFZlY3Q7CisgICAgaGNyeXAtPkluaXQuSGVhZGVyICAgICA9IHBDb25mLT5IZWFkZXI7CisgICAgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9IHBDb25mLT5IZWFkZXJTaXplOworICAgIGhjcnlwLT5Jbml0LkIwICAgICAgICAgPSBwQ29uZi0+QjA7CisgICAgaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9IHBDb25mLT5EYXRhV2lkdGhVbml0OworCisgICAgLyogU2V0IHRoZSBrZXkgc2l6ZSAoVGhpcyBiaXQgZmllbGQgaXMgZG8gbm90IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSwgZGF0YSB0eXBlIGFuZCBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUgfCBBRVNfQ1JfS0VZU0laRSB8IEFFU19DUl9DSE1PRCwgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKworICAgIC8qY2xlYXIgZXJyb3IgZmxhZ3MqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9FUlJfQ0xFQVIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBSZXNldCBFcnJvciBDb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9SRUFEWTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQ1JZUCBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBwQ29uZiBwb2ludGVyIHRvIGEgQ1JZUF9Db25maWdUeXBlRGVmIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9HZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZikKK3sKKyAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKChoY3J5cCA9PSBOVUxMKSB8fCAocENvbmYgPT0gTlVMTCkpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogR2V0ICBDUllQIHBhcmFtZXRlcnMgICovCisgICAgcENvbmYtPkRhdGFUeXBlICAgICAgICA9IGhjcnlwLT5Jbml0LkRhdGFUeXBlOworICAgIHBDb25mLT5wS2V5ICAgICAgICAgICAgPSBoY3J5cC0+SW5pdC5wS2V5OworICAgIHBDb25mLT5BbGdvcml0aG0gICAgICAgPSBoY3J5cC0+SW5pdC5BbGdvcml0aG07CisgICAgcENvbmYtPktleVNpemUgICAgICAgICA9IGhjcnlwLT5Jbml0LktleVNpemUgOworICAgIHBDb25mLT5wSW5pdFZlY3QgICAgICAgPSBoY3J5cC0+SW5pdC5wSW5pdFZlY3Q7CisgICAgcENvbmYtPkhlYWRlciAgICAgICAgICA9IGhjcnlwLT5Jbml0LkhlYWRlciA7CisgICAgcENvbmYtPkhlYWRlclNpemUgICAgICA9IGhjcnlwLT5Jbml0LkhlYWRlclNpemU7CisgICAgcENvbmYtPkIwICAgICAgICAgICAgICA9IGhjcnlwLT5Jbml0LkIwOworICAgIHBDb25mLT5EYXRhV2lkdGhVbml0ICAgID0gaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIE1TUC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NSWVBfTXNwSW5pdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUllQX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIENSWVAgTVNQLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9Nc3BEZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgQ1JZUCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaGNyeXAgY3J5cCBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBDUllQX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNyeXApOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBDUllQIENhbGxiYWNrCisgICogICAgICAgICBDUllQIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBoY3J5cCBjcnlwIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGNyeXApOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgIEluQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrID0gSEFMX0NSWVBfRXJyb3JDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzs7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworI2lmIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgPT0gMVUpCisvKioKKyAgKiBAYnJpZWYgIFJlcXVlc3QgQ1JZUCBwcm9jZXNzaW5nIHN1c3BlbnNpb24gd2hlbiBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFNldCB0aGUgaGFuZGxlIGZpZWxkIFN1c3BlbmRSZXF1ZXN0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBzbyB0aGF0CisgICogICAgICAgICB0aGUgb24tZ29pbmcgQ1JZUCBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCBhcyBzb29uIGFzIHRoZSByZXF1aXJlZAorICAqICAgICAgICAgY29uZGl0aW9ucyBhcmUgbWV0LgorICAqIEBub3RlICAgSEFMX0NSWVBfUHJvY2Vzc1N1c3BlbmQoKSBjYW4gb25seSBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3NpbmcgaXMgZG9uZQorICAqICAgICAgICAgaW4gbm9uLWJsb2NraW5nIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgSXQgaXMgYWR2aXNlZCBub3QgdG8gc3VzcGVuZCB0aGUgQ1JZUCBwcm9jZXNzaW5nIHdoZW4gdGhlIERNQSBjb250cm9sbGVyCisgICogICAgICAgICBpcyBtYW5hZ2luZyB0aGUgZGF0YSB0cmFuc2Zlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0NSWVBfUHJvY2Vzc1N1c3BlbmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogU2V0IEhhbmRsZSBTdXNwZW5kUmVxdWVzdCBmaWVsZCAqLworICBoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPSBIQUxfQ1JZUF9TVVNQRU5EOworfQorCisKKworLyoqCisgICogQGJyaWVmICBDUllQIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiBhbmQgcGVyaXBoZXJhbCBpbnRlcm5hbCBwYXJhbWV0ZXJzIHN0b3JhZ2UuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAbm90ZSAgIHBlcmlwaGVyYWwgaW50ZXJuYWwgcGFyYW1ldGVycyBhcmUgc3RvcmVkIHRvIGJlIHJlYWRpbHkgYXZhaWxhYmxlIHdoZW4KKyAgKiAgICAgICAgIHN1c3BlbmRlZCBwcm9jZXNzaW5nIGlzIHJlc3VtZWQgbGF0ZXIgb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TdXNwZW5kKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIFJlcXVlc3Qgc3VzcGVuc2lvbiAqLworICBIQUxfQ1JZUF9Qcm9jZXNzU3VzcGVuZChoY3J5cCk7CisKKyAgd2hpbGUgKChIQUxfQ1JZUF9HZXRTdGF0ZShoY3J5cCkgIT0gSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEKSAmJiBcCisgICAgICAgICAgKEhBTF9DUllQX0dldFN0YXRlKGhjcnlwKSAhPSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkpOworCisgIGlmIChIQUxfQ1JZUF9HZXRTdGF0ZShoY3J5cCkgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzaW5nIHdhcyBhbHJlYWR5IG92ZXIgb3Igd2FzIGFib3V0IHRvIGVuZC4gTm8gc3VzcGVuc2lvbiBkb25lICovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTdXNwZW5kIFByb2Nlc3NpbmcgKi8KKworICAgIC8qIElmIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgb24tZ29pbmcsIGNhcnJ5IG91dCBmaXJzdCBzYXZpbmcgc3RlcHMKKyAgICAgICBiZWZvcmUgZGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSB8fCBcCisgICAgICAgICAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkpCisgICAgeworICAgICAgICAvKiBTYXZlIFN1c3BlbnNpb24gcmVnaXN0ZXJzICovCisgICAgICAgIENSWVBfUmVhZF9TdXNwZW5kUmVnaXN0ZXJzKGhjcnlwLCBoY3J5cC0+U1VTUHhSX3NhdmVkKTsKKyAgICAgICAgLyogU2F2ZSBLZXkgKi8KKyAgICAgICAgQ1JZUF9SZWFkX0tleVJlZ2lzdGVycyhoY3J5cCwgaGNyeXAtPktleV9zYXZlZCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisgICAgICAgIC8qIFNhdmUgSVYgKi8KKyAgICAgICAgQ1JZUF9SZWFkX0lWUmVnaXN0ZXJzKGhjcnlwLCBoY3J5cC0+SVZfc2F2ZWQpOworICAgIH0KKyAgICAvKiBEaXNhYmxlIEFFUyAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTYXZlIGxvdy1wcmlvcml0eSBibG9jayBDUllQIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgICAgaGNyeXAtPkluaXRfc2F2ZWQgICAgICAgICAgICAgID0gaGNyeXAtPkluaXQ7CisgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyX3NhdmVkICAgID0gaGNyeXAtPnBDcnlwSW5CdWZmUHRyOworICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHJfc2F2ZWQgICA9IGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHI7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50X3NhdmVkICAgICAgID0gaGNyeXAtPkNyeXBJbkNvdW50OworICAgIGhjcnlwLT5DcnlwT3V0Q291bnRfc2F2ZWQgICAgICA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgICAgaGNyeXAtPlBoYXNlX3NhdmVkICAgICAgICAgICAgID0gaGNyeXAtPlBoYXNlOworICAgIGhjcnlwLT5TdGF0ZV9zYXZlZCAgICAgICAgICAgICA9IGhjcnlwLT5TdGF0ZTsKKyAgICBoY3J5cC0+U2l6ZV9zYXZlZCAgICAgICAgICAgICAgPSAoIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKSA/IGhjcnlwLT5TaXplIC80IDogaGNyeXAtPlNpemUpOworICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbl9zYXZlZCA9IGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbjsKKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50X3NhdmVkICAgPSBoY3J5cC0+Q3J5cEhlYWRlckNvdW50OworICAgIGhjcnlwLT5TdXNwZW5kUmVxdWVzdCAgICAgICAgICA9IEhBTF9DUllQX1NVU1BFTkRfTk9ORTsKKworICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NCQykgfHwgXAorICAgICAgICAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NUUikpCisgICAgeworICAgICAgLyogU2F2ZSBJbml0aWFsaXNhdGlvbiBWZWN0b3IgcmVnaXN0ZXJzICovCisgICAgICBDUllQX1JlYWRfSVZSZWdpc3RlcnMoaGNyeXAsIGhjcnlwLT5JVl9zYXZlZCk7CisgICAgfQorCisgICAgLyogU2F2ZSBDb250cm9sIHJlZ2lzdGVyICovCisgICAgaGNyeXAtPkNSX3NhdmVkID0gaGNyeXAtPkluc3RhbmNlLT5DUjsKKworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDUllQIHByb2Nlc3NpbmcgcmVzdW1wdGlvbi4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBub3RlICAgUHJvY2Vzc2luZyByZXN0YXJ0cyBhdCB0aGUgZXhhY3QgcG9pbnQgd2hlcmUgaXQgd2FzIHN1c3BlbmRlZCwgYmFzZWQKKyAgKiAgICAgICAgIG9uIHRoZSBwYXJhbWV0ZXJzIHNhdmVkIGF0IHN1c3BlbnNpb24gdGltZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1Jlc3VtZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICBpZiAoaGNyeXAtPlN0YXRlX3NhdmVkICE9IEhBTF9DUllQX1NUQVRFX1NVU1BFTkRFRCkKKyAgeworICAgIC8qIENSWVAgd2FzIG5vdCBzdXNwZW5kZWQgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworCisgICAgLyogUmVzdG9yZSBsb3ctcHJpb3JpdHkgYmxvY2sgQ1JZUCBoYW5kbGUgcGFyYW1ldGVycyAqLworICAgIGhjcnlwLT5Jbml0ICAgICAgICAgICAgPSBoY3J5cC0+SW5pdF9zYXZlZDsKKyAgICBoY3J5cC0+U3RhdGUgICAgICAgICAgID0gaGNyeXAtPlN0YXRlX3NhdmVkOworCisgICAgLyogQ2hhaW5pbmcgYWxnb3JpdGhtcyBjYXNlICovCisgICAgaWYgKChoY3J5cC0+SW5pdF9zYXZlZC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfRUNCKSB8fCBcCisgICAgICAgIChoY3J5cC0+SW5pdF9zYXZlZC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0JDKSB8fCBcCisgICAgICAgIChoY3J5cC0+SW5pdF9zYXZlZC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIGxvdy1wcmlvcml0eSBibG9jayBDUllQIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgICAgICBoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPSBoY3J5cC0+QXV0b0tleURlcml2YXRpb25fc2F2ZWQ7CisKKyAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NCQykgfHwgXAorICAgICAgICAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NUUikpCisgICAgICB7CisgICAgICAgIGhjcnlwLT5Jbml0LnBJbml0VmVjdCAgICAgPSBoY3J5cC0+SVZfc2F2ZWQ7CisgICAgICB9CisgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworICAgICAgaWYgKEhBTF9DUllQX0luaXQoaGNyeXApICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgICAvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zIGNhc2UgKi8KKyAgICB7CisgICAgICAvKiBSZXN0b3JlIGxvdy1wcmlvcml0eSBibG9jayBDUllQIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgICAgICBoY3J5cC0+UGhhc2UgICAgICAgICAgID0gaGNyeXAtPlBoYXNlX3NhdmVkOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IGhjcnlwLT5DcnlwSGVhZGVyQ291bnRfc2F2ZWQ7CisKKyAgICAgIC8qIERpc2FibGUgQUVTIGFuZCB3cml0ZS1iYWNrIFNVU1B4UiByZWdpc3RlcnMgKi87CisgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworICAgICAgLyogUmVzdG9yZSBBRVMgU3VzcGVuZCBSZWdpc3RlcnMgKi8KKyAgICAgIENSWVBfV3JpdGVfU3VzcGVuZFJlZ2lzdGVycyhoY3J5cCwgaGNyeXAtPlNVU1B4Ul9zYXZlZCk7CisgICAgICAvKiBSZXN0b3JlIENvbnRyb2wsICBLZXkgYW5kIElWIFJlZ2lzdGVycywgdGhlbiBlbmFibGUgQUVTICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkNSID0gaGNyeXAtPkNSX3NhdmVkOworICAgICAgQ1JZUF9Xcml0ZV9LZXlSZWdpc3RlcnMoaGNyeXAsIGhjcnlwLT5LZXlfc2F2ZWQsIGhjcnlwLT5Jbml0LktleVNpemUpOworICAgICAgQ1JZUF9Xcml0ZV9JVlJlZ2lzdGVycyhoY3J5cCwgaGNyeXAtPklWX3NhdmVkKTsKKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgICAgLyogQXQgdGhlIHNhbWUgdGltZSwgc2V0IGhhbmRsZSBzdGF0ZSBiYWNrIHRvIFJFQURZIHRvIGJlIGFibGUgdG8gcmVzdW1lIHRoZSBBRVMgY2FsY3VsYXRpb25zCisgICAgICB3aXRob3V0IHRoZSBwcm9jZXNzaW5nIEFQSXMgcmV0dXJuaW5nIEhBTF9CVVNZIHdoZW4gY2FsbGVkLiAqLworICAgICAgaGNyeXAtPlN0YXRlICAgICAgICA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIH0KKworCisgICAgLyogUmVzdW1lIGxvdy1wcmlvcml0eSBibG9jayBwcm9jZXNzaW5nIHVuZGVyIElUICovCisgICAgaGNyeXAtPlJlc3VtaW5nRmxhZyA9IDFVOworICAgIGlmIChSRUFEX0JJVChoY3J5cC0+Q1Jfc2F2ZWQsIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgICB7CisgICAgICBpZiAoSEFMX0NSWVBfRW5jcnlwdF9JVChoY3J5cCwgaGNyeXAtPnBDcnlwSW5CdWZmUHRyX3NhdmVkLCBoY3J5cC0+U2l6ZV9zYXZlZCwgaGNyeXAtPnBDcnlwT3V0QnVmZlB0cl9zYXZlZCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKEhBTF9DUllQX0RlY3J5cHRfSVQoaGNyeXAsIGhjcnlwLT5wQ3J5cEluQnVmZlB0cl9zYXZlZCwgaGNyeXAtPlNpemVfc2F2ZWQsIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHJfc2F2ZWQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZiAvKiBkZWZpbmVkIChVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEVuY3J5cHRpb24gRGVjcnlwdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRW5jcnlwdGlvbiBEZWNyeXB0aW9uIGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEVuY3J5cHQgRGVjcnlwdCAgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBBUEkgYWxsb3dpbmcgdG8gRW5jcnlwdC9EZWNyeXB0IERhdGEgZm9sbG93aW5nCisgICAgICAgICAgU3RhbmRhcmQgREVTL1RERVMgb3IgQUVTLCBhbmQgQWxnb3JpdGhtIGNvbmZpZ3VyZWQgYnkgdGhlIHVzZXI6CisgICAgICAoKykgU3RhbmRhcmQgREVTL1RERVMgb25seSBzdXBwb3J0ZWQgYnkgQ1JZUDEgcGVyaXBoZXJhbCwgYmVsb3cgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkIDoKKyAgICAgICAgICAgLSBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCisgICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCisgICAgICAoKykgU3RhbmRhcmQgQUVTICBzdXBwb3J0ZWQgYnkgQ1JZUDEgcGVyaXBoZXJhbCAmIFRpbnlBRVMsIGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZDoKKyAgICAgICAgICAgLSBFbGVjdHJvbmljIENvZGUgQm9vayhFQ0IpCisgICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCisgICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCisgICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCisgICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCisgICAgICAgICAgIC0gR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQorICAgICAgICAgICAtIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pCisgICAgWy4uXSAgVGhyZWUgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKKyAgICAgICgrKSBQb2xsaW5nIG1vZGUgOiBIQUxfQ1JZUF9FbmNyeXB0ICYgSEFMX0NSWVBfRGVjcnlwdAorICAgICAgKCspIEludGVycnVwdCBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9JVCAmIEhBTF9DUllQX0RlY3J5cHRfSVQKKyAgICAgICgrKSBETUEgbW9kZSA6IEhBTF9DUllQX0VuY3J5cHRfRE1BICYgSEFMX0NSWVBfRGVjcnlwdF9ETUEKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyogR0NNIG1lc3NhZ2Ugc3RydWN0dXJlIGFkZGl0aW9uYWwgZGV0YWlscworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNCCisgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgfCAgICAgICBJbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSAgICAgIHwgIENvdW50ZXIgICAgICB8CisgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS18CisgICAgICAgICAxMjcgICAgICAgICAgICAgIDk1ICAgICAgICAgICAgICAgIDYzICAgICAgICAgICAgMzEgICAgICAgMAorCisKKyAgICAgICAgICAgICAgQml0IE51bWJlciAgICBSZWdpc3RlciAgICAgICAgICAgQ29udGVudHMKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLQorICAgICAgICAgICAgICAxMjcgLi4uOTYgICAgQ1JZUF9JVjFSWzMxOjBdICAgICBJQ0JbMTI3Ojk2XQorICAgICAgICAgICAgICA5NSAgLi4uNjQgICAgQ1JZUF9JVjFMWzMxOjBdICAgICBCMFs5NTo2NF0KKyAgICAgICAgICAgICAgNjMgLi4uIDMyICAgIENSWVBfSVYwUlszMTowXSAgICAgSUNCWzYzOjMyXQorICAgICAgICAgICAgICAzMSAuLi4gMCAgICAgQ1JZUF9JVjBMWzMxOjBdICAgICBJQ0JbMzE6MF0sIHdoZXJlIDMyLWJpdCBjb3VudGVyPSAweDIKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDTSBsYXN0IGJsb2NrIGRlZmluaXRpb24KKyAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICB8ICBCaXRbMF0gICB8ICBCaXRbMzJdICAgICAgICAgICB8ICBCaXRbNjRdICB8IEJpdFs5Nl0gICAgICAgICAgICAgIHwKKyAgICAgICAgICB8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICB8ICAgMHgwICAgICB8IEhlYWRlciBsZW5ndGhbMzE6MF18ICAgICAweDAgICB8IFBheWxvYWQgbGVuZ3RoWzMxOjBdIHwKKyAgICAgICAgICB8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworKi8KKworLyogQ0NNIG1lc3NhZ2UgYmxvY2tzIGRlc2NyaXB0aW9uCisKKyAgICAgICAgICgjIykgQjAgYmxvY2sgIDogQWNjb3JkaW5nIHRvIE5JU1QgU3BlY2lhbCBQdWJsaWNhdGlvbiA4MDAtMzhDLAorICAgICAgICAgICAgVGhlIGZpcnN0IGJsb2NrIEIwIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzLCB3aGVyZSBsKG0pIGlzIGVuY29kZWQgaW4KKyAgICAgICAgICAgIG1vc3Qtc2lnbmlmaWNhbnQtYnl0ZSBmaXJzdCBvcmRlcjoKKworICAgICAgICAgICAgICAgIE9jdGV0IE51bWJlciAgIENvbnRlbnRzCisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgRmxhZ3MKKyAgICAgICAgICAgICAgICAxIC4uLiAxNS1xICAgICBOb25jZSBOCisgICAgICAgICAgICAgICAgMTYtcSAuLi4gMTUgICAgUQorCisgICAgICAgICAgICB0aGUgRmxhZ3MgZmllbGQgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICBCaXQgTnVtYmVyICAgQ29udGVudHMKKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIDcgICAgICAgICAgICBSZXNlcnZlZCAoYWx3YXlzIHplcm8pCisgICAgICAgICAgICAgICAgNiAgICAgICAgICAgIEFkYXRhCisgICAgICAgICAgICAgICAgNSAuLi4gMyAgICAgICh0LTIpLzIKKyAgICAgICAgICAgICAgICAyIC4uLiAwICAgICAgW3EtMV0zCisKKyAgICAgICAgICAgICAgLSBROiBhIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGV0IGxlbmd0aCBvZiBQIChwbGFpbnRleHQpCisgICAgICAgICAgICAgIC0gcSBUaGUgb2N0ZXQgbGVuZ3RoIG9mIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGV0IGxlbmd0aCBvZiB0aGUgcGF5bG9hZAorICAgICAgICAgICAgICAtIEEgbm9uY2UgKE4pLCBuIFRoZSBvY3RldCBsZW5ndGggb2YgdGhlIHdoZXJlIG4rcT0xNS4KKyAgICAgICAgICAgICAgLSBGbGFnczogbW9zdCBzaWduaWZpY2FudCBvY3RldCBjb250YWluaW5nIGZvdXIgZmxhZ3MgZm9yIGNvbnRyb2wgaW5mb3JtYXRpb24sCisgICAgICAgICAgICAgIC0gdCBUaGUgb2N0ZXQgbGVuZ3RoIG9mIHRoZSBNQUMuCisgICAgICAgICAoIyMpIEIxIGJsb2NrIChoZWFkZXIpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aChhKSBjb25jYXRlbmF0ZWQgd2l0aCBBc3NvY2lhdGVkIERhdGEgKEEpCisgICAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGV4cHJlc3NlZCBpbiBieXRlcyAoYSkgZGVmaW5lZCBhcyBiZWxvdzoKKyAgICAgICAgICAgIC0gSWYgMCA8IGEgPCAyMTYtMjgsIHRoZW4gaXQgaXMgZW5jb2RlZCBhcyBbYV0xNiwgaS5lLiB0d28gb2N0ZXRzCisgICAgICAgICAgICAtIElmIDIxNi0yOCA8IGEgPCAyMzIsIHRoZW4gaXQgaXMgZW5jb2RlZCBhcyAweGZmIHx8IDB4ZmUgfHwgW2FdMzIsIGkuZS4gc2l4IG9jdGV0cworICAgICAgICAgICAgLSBJZiAyMzIgPCBhIDwgMjY0LCB0aGVuIGl0IGlzIGVuY29kZWQgYXMgMHhmZiB8fCAweGZmIHx8IFthXTY0LCBpLmUuIHRlbiBvY3RldHMKKyAgICAgICAgICgjIykgQ1RSeCBibG9jayAgOiBjb250cm9sIGJsb2NrcworICAgICAgICAgICAgLSBHZW5lcmF0aW9uIG9mIENUUjEgZnJvbSBmaXJzdCBibG9jayBCMCBpbmZvcm1hdGlvbiA6CisgICAgICAgICAgICAgIGVxdWFsIHRvIEIwIHdpdGggZmlyc3QgNSBiaXRzIHplcm9lZCBhbmQgbW9zdCBzaWduaWZpY2FudCBiaXRzIHN0b3Jpbmcgb2N0ZXQKKyAgICAgICAgICAgICAgbGVuZ3RoIG9mIFAgYWxzbyB6ZXJvZWQsIHRoZW4gaW5jcmVtZW50ZWQgYnkgb25lCisKKyAgICAgICAgICAgICAgICBCaXQgTnVtYmVyICAgIFJlZ2lzdGVyICAgICAgICAgICBDb250ZW50cworICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAxMjcgLi4uOTYgICAgQ1JZUF9JVjFSWzMxOjBdICAgICBCMFsxMjc6OTZdLCB3aGVyZSBRIGxlbmd0aCBiaXRzIGFyZSBzZXQgdG8gMCwgZXhjZXB0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAwIHRoYXQgaXMgc2V0IHRvIDEKKyAgICAgICAgICAgICAgICA5NSAgLi4uNjQgICAgQ1JZUF9JVjFMWzMxOjBdICAgICBCMFs5NTo2NF0KKyAgICAgICAgICAgICAgICA2MyAuLi4gMzIgICAgQ1JZUF9JVjBSWzMxOjBdICAgICBCMFs2MzozMl0KKyAgICAgICAgICAgICAgICAzMSAuLi4gMCAgICAgQ1JZUF9JVjBMWzMxOjBdICAgICBCMFszMTowXSwgd2hlcmUgZmxhZyBiaXRzIHNldCB0byAwCisKKyAgICAgICAgICAgIC0gR2VuZXJhdGlvbiBvZiBDVFIwOiBzYW1lIGFzIENUUjEgd2l0aCBiaXRbMF0gc2V0IHRvIHplcm8uCisKKyovCisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHBsYWludGV4dCkKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCBhbGdvOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGNpcGhlcnRleHQgKQorICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZC4KKyAgKiBAcGFyYW0gIE91dHB1dCBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCBhbGdvOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciAgcGFyYW1ldGVycyovCisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOworICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OworICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CisKKyAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLworICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZSAqIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNldCBEZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCisgICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgYWxnbzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgIGlmIChoY3J5cC0+UmVzdW1pbmdGbGFnID09IDFVKQorICAgeworICAgICBoY3J5cC0+UmVzdW1pbmdGbGFnID0gMFU7CisgICAgIGlmIChoY3J5cC0+UGhhc2UgIT0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEKQorICAgICB7CisgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50X3NhdmVkOworICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50X3NhdmVkOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICAgfQorICAgfQorICAgZWxzZQorI2VuZGlmICAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKyAgIHsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CisgICB9CisKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgZW5jcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorCisgICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihwbGFpbnRleHQpCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCBhbGdvOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KKyNpZiAoVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FID09IDFVKQorICAgaWYgKGhjcnlwLT5SZXN1bWluZ0ZsYWcgPT0gMVUpCisgICB7CisgICAgIGhjcnlwLT5SZXN1bWluZ0ZsYWcgPSAwVTsKKyAgICAgaWYgKGhjcnlwLT5QaGFzZSAhPSBDUllQX1BIQVNFX0hFQURFUl9TVVNQRU5ERUQpCisgICAgIHsKKyAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnRfc2F2ZWQ7CisgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnRfc2F2ZWQ7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOworICAgICB9CisgICB9CisgICBlbHNlCisjZW5kaWYgIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworICAgeworICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKKyAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOworICAgfQorICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OworICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CisKKyAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLworICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZSAqIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNyeXAtPlNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFbmNyeXB0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHBsYWludGV4dCkKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCisgICogQHBhcmFtICBPdXRwdXQgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90IGFsZ287CisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgZW5jcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICAgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgICAgICAgICB7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBBRVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplIC8gNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgc3RhdHVzID0gSEFMX09LOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKKworICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgSW5wdXQgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKKyAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQKKyAgKiBAcGFyYW0gIE91dHB1dCBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCBhbGdvOworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKKworICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciwgcENyeXBPdXRCdWZmUHRyIGFuZCBTaXplIHBhcmFtZXRlcnMqLworICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKKyAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKKyAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OworCisgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKKyAgICB7CisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKKworICAgICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKiBAYnJpZWYgICAgQ1JZUCBJUlEgaGFuZGxlci4KKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjIENSWVAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1suLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBDUllQIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMuCisgICAgICAoKykgSEFMX0NSWVBfSVJRSGFuZGxlciBDUllQIGludGVycnVwdCByZXF1ZXN0CisgICAgICAoKykgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2sgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgKCspIEhBTF9DUllQX091dENwbHRDYWxsYmFjayBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgKCspIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2sgIENSWVAgZXJyb3IgY2FsbGJhY2sKKyAgICAgICgrKSBIQUxfQ1JZUF9HZXRTdGF0ZSByZXR1cm4gdGhlIENSWVAgc3RhdGUKKyAgICAgICgrKSBIQUxfQ1JZUF9HZXRFcnJvciByZXR1cm4gdGhlIENSWVAgZXJyb3IgY29kZQorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgY3J5cHRvZ3JhcGhpYyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfQ1JZUF9JUlFIYW5kbGVyKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisKKyAgLyogQ2hlY2sgaWYgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCxDUllQX0lUX0VSUklFKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIElmIHdyaXRlIEVycm9yIG9jY3VycmVkICovCisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9XUkVSUikgIT0gUkVTRVQpCisgICAgeworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9XUklURTsKKyAgICB9CisgICAgLyogSWYgcmVhZCBFcnJvciBvY2N1cnJlZCAqLworICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLENSWVBfSVRfUkRFUlIpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfUkVBRDsKKyAgICB9CisgIH0KKworICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9DQ0YpICE9IFJFU0VUKQorICB7CisgICAgaWYoX19IQUxfQ1JZUF9HRVRfSVRfU09VUkNFKGhjcnlwLCBDUllQX0lUX0NDRklFKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgeworCisgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KKyAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfUEhBU0VfSEVBREVSKSA9PSBDUllQX1BIQVNFX0hFQURFUikKKyAgICAgIHsKKyAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOworICAgICAgfQorICAgICAgZWxzZSAgLyogaWYgcGF5bG9hZCBwaGFzZSAqLworICAgICAgeworICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQorICAgIHsKKyAgICAgIC8qIGlmIGhlYWRlciBwaGFzZSAqLworICAgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPj0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgICAgICB7CisgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgICAvKiBpZiBwYXlsb2FkIHBoYXNlICovCisgICAgICB7CisgICAgICAgIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChoY3J5cCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLworICAgIHsKKyAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsKKyAgICB9CisgIH0KK30KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENSWVAgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSAgQ1JZUCBwZXJpcGhlcmFsCisgICogQHJldHZhbCBDUllQIGVycm9yIGNvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9DUllQX0dldEVycm9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIHJldHVybiBoY3J5cC0+RXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIENSWVAgc3RhdGUuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9DUllQX1NUQVRFVHlwZURlZiBIQUxfQ1JZUF9HZXRTdGF0ZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICByZXR1cm4gaGNyeXAtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGNyeXApOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoY3J5cCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9DUllQX091dENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENSWVAgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhjcnlwKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgQWxnb3JpdGhtIHdpdGggQUVTIFN0YW5kYXJkCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgVGltZW91dCBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KKyAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgIHsKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDNVKTsKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgLyogU2V0IHRoZSBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgLyogRW5hYmxlIENSWVAgKi8KKyAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgd2hpbGUgKChpbmNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQorICB7CisgICAgLyogV3JpdGUgcGxhaW4gRGR0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworICAgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB9CisKKyAgLyogRGlzYWJsZSBDUllQICovCisgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMlUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKKyAgeworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQxNl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KKyAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgIHsKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgS2V5IHByZXBhcmF0aW9uIGZvciBFQ0IvQ0JDICovCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpICAgLypFQ0Igb3IgQ0JDKi8KKyAgICB7CisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKkFsZ29yaXRobSBDVFIgKi8KKyAgICB7CisgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworICAgIH0KKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMVUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDNVKTsKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgLyogU2V0IHRoZSBwaGFzZSAqLworICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgLyogRW5hYmxlIENSWVAgKi8KKyAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgd2hpbGUgKChpbmNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQorICB7CisgICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworICAgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB9CisKKyAgLyogRGlzYWJsZSBDUllQICovCisgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyAgICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLworICAgICAgeworICAgICAgICAvKiBTZXQga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOworCisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0tFWVBSRVBBUkFUSU9OOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLworICAgIHsKKyAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisgICAgfQorCisgICAgLyogU2V0IElWICovCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDJVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICAvKiBTZXQgdGhlIHBoYXNlICovCisgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKyAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQorICB7CisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBETUEgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyAgICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBrZXkgcHJlcGFyYXRpb24qLworICAgICAgeworICAgICAgICAvKiBTZXQga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOworCisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0tFWVBSRVBBUkFUSU9OOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYgS2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLworICAgIHsKKyAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisgICAgfQorCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDJVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgM1UpOworICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICAvKiBTZXQgdGhlIHBoYXNlICovCisgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8KKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUgLyA0VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgQ1JZUCBpbnB1dCBkYXRhIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfRE1BSW5DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIFN0b3AgdGhlIERNQSB0cmFuc2ZlcnMgdG8gdGhlIElOIEZJRk8gYnkgY2xlYXJpbmcgdG8gIjAiIHRoZSBETUFJTkVOICovCisgIENMRUFSX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfRE1BSU5FTik7CisKKyAgLyogQ2FsbCBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIENSWVAgb3V0cHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9ETUFPdXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICB1aW50MzJfdCBjb3VudDsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBtb2RlOworCisgIENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogU3RvcCB0aGUgRE1BIHRyYW5zZmVycyB0byB0aGUgT1VUIEZJRk8gYnkgY2xlYXJpbmcgdG8gIjAiIHRoZSBETUFPVVRFTiAqLworICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQU9VVEVOKTsKKworICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAvKiBMYXN0IGJsb2NrIHRyYW5zZmVyIGluIGNhc2Ugb2YgR0NNIG9yIENDTSB3aXRoIFNpemUgbm90ICUxNiovCisgIGlmICgoKGhjcnlwLT5TaXplKSAlIDE2VSkgIT0gMFUpCisgIHsKKyAgICAvKiBzZXQgQ3J5cEluQ291bnQgYW5kIENyeXBPdXRDb3VudCB0byBleGFjdCBudW1iZXIgb2Ygd29yZCBhbHJlYWR5IGNvbXB1dGVkIHZpYSBETUEgICovCisgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gKGhjcnlwLT5TaXplIC8gMTZVKSAqIDRVOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CisKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9ICgoKCh1aW50MzJfdCloY3J5cC0+U2l6ZSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSk7CisKKyAgICBtb2RlID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFOworICAgIGlmICgoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKSB8fAorICAgICAgICAoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgeworICAgICAgLyogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICB9CisKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKKyAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICBmb3IgKGNvdW50ID0gMFU7IGNvdW50IDwgbGFzdHdvcmRzaXplOyBjb3VudCsrKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIH0KKyAgICB3aGlsZSAoY291bnQgPCA0VSkKKyAgICB7CisgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICBjb3VudCsrOworICAgIH0KKworICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPICovCisgICAgZm9yIChjb3VudCA9IDBVOyBjb3VudCA8IDRVOyBjb3VudCsrKQorICAgIHsKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB9CisgIH0KKworICBpZiAoKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19HQ01fR01BQykgIT0gQ1JZUF9BRVNfR0NNX0dNQUMpICYmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfQ0NNKSAhPSBDUllQX0FFU19DQ00pKQorICB7CisgICAgLyogRGlzYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNKSovCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKyAgfQorCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSB0byByZWFkeSAqLworICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgLyogQ2FsbCBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLworICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLworICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgQ1JZUCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgIC8qIERNQSBlcnJvciBjb2RlIGZpZWxkICovCisgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCisgIC8qIENsZWFyIENDRiBmbGFnICovCisgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBETUEgY29uZmlndXJhdGlvbiBhbmQgc3RhcnQgdGhlIERNQSB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBpbnB1dGFkZHIgYWRkcmVzcyBvZiB0aGUgaW5wdXQgYnVmZmVyCisgICogQHBhcmFtICBTaXplIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgorICAqIEBwYXJhbSAgb3V0cHV0YWRkciBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYnVmZmVyCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1NldERNQUNvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBpbnB1dGFkZHIsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IG91dHB1dGFkZHIpCit7CisgIC8qIFNldCB0aGUgQ1JZUCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGNyeXAtPmhkbWFpbi0+WGZlckNwbHRDYWxsYmFjayA9IENSWVBfRE1BSW5DcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGlucHV0IGVycm9yIGNhbGxiYWNrICovCisgIGhjcnlwLT5oZG1haW4tPlhmZXJFcnJvckNhbGxiYWNrID0gQ1JZUF9ETUFFcnJvcjsKKworICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhjcnlwLT5oZG1hb3V0LT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFPdXRDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIG91dHB1dCBlcnJvciBjYWxsYmFjayAqLworICBoY3J5cC0+aGRtYW91dC0+WGZlckVycm9yQ2FsbGJhY2sgPSBDUllQX0RNQUVycm9yOworCisgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKQorICB7CisgICAgLyogRW5hYmxlIENSWVAgKG5vdCBhbGxvd2VkIGluICBHQ00gJiBDQ00pKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIERNQSBpbnB1dCBzdHJlYW0gKi8KKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkgIT0gSEFMX09LKQorICB7CisgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsKKworICAgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICAvKiBFbmFibGUgdGhlIERNQSBvdXRwdXQgc3RyZWFtICovCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVFIsIG91dHB1dGFkZHIsIFNpemUpICE9IEhBTF9PSykKKyAgeworICAgIC8qIERNQSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CisKKyAgICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCisgIFNFVF9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgKEFFU19DUl9ETUFJTkVOIHwgQUVTX0NSX0RNQU9VVEVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvY2VzcyBEYXRhOiBXcml0ZSBJbnB1dCBkYXRhIGluIHBvbGxpbmcgbW9kZSBhbmQgdXNlZCBpbiBBRVMgZnVuY3Rpb25zLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKK3sKKworICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisKKyAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgeworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIENsZWFyIENDRiBGbGFnICovCisgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIqLworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBibG9jayBpbnB1dC9vdXRwdXQgZGF0YSBoYW5kbGluZyB1bmRlciBpbnRlcnJ1cHRpb24uCisgICogQG5vdGUgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9DUllQX0VuY3J5cHRfSVQgb3IgSEFMX0NSWVBfRGVjcnlwdF9JVC4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfQUVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX0JVU1kpCisgIHsKKyAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworCisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIENvbXB1dGF0aW9uIENvbXBsZXRlIGZsYWcgYW5kIGVycm9ycyBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogRGlzYWJsZSBDUllQICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgICAgIC8qIElmIHN1c3BlbnNpb24gZmxhZyBoYXMgYmVlbiByYWlzZWQsIHN1c3BlbmQgcHJvY2Vzc2luZworICAgICAgICAgb25seSBpZiBub3QgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBwYXlsb2FkICovCisgICAgICBpZiAoaGNyeXAtPlN1c3BlbmRSZXF1ZXN0ID09IEhBTF9DUllQX1NVU1BFTkQpCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIHJlc2V0IFN1c3BlbmRSZXF1ZXN0ICovCisgICAgICAgIGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9IEhBTF9DUllQX1NVU1BFTkRfTk9ORTsKKyAgICAgICAgLyogRGlzYWJsZSBDb21wdXRhdGlvbiBDb21wbGV0ZSBGbGFnIGFuZCBFcnJvcnMgSW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUV8Q1JZUF9JVF9FUlJJRSk7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9TVVNQRU5ERUQ7CisgICAgICAgIC8qIE1hcmsgdGhhdCB0aGUgcGF5bG9hZCBwaGFzZSBpcyBzdXNwZW5kZWQgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QQVlMT0FEX1NVU1BFTkRFRDsKKworICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKyAgICAgIHsKKyAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisgICAgICAgIGlmIChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLworICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlcyBLZXkgaW4gS2V5IHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgS2V5U2l6ZSBTaXplIG9mIEtleQorICAqIEBub3RlICAgSWYgcEtleSBpcyBOVUxMLCB0aGUgS2V5IHJlZ2lzdGVycyBhcmUgbm90IHdyaXR0ZW4uIFRoaXMgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgb2NjdXJzIHdoZW4gdGhlIGtleSBpcyB3cml0dGVuIG91dCBvZiBIQUwgc2NvcGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBLZXlTaXplKQoreworICBpZiAoaGNyeXAtPkluaXQucEtleSAhPSBOVUxMKQorICB7CisgICAgc3dpdGNoIChLZXlTaXplKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzI1NkI6CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI2ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMVUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMlUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI0ID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgM1UpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNFUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNVUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNlUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgN1UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMVUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMlUpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgM1UpOworCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHByb2Nlc3MgaW4gQUVTIEdDTSBtb2RlIGFuZCBwcmVwYXJlIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHdvcmRzaXplID0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSAvIDRVKSA7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGluZGV4OworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KKyAgdWludDMyX3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgIHsKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisKKyAgICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgeworICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLworICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CisgIH0KKworICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdyaXRlIGlucHV0IGRhdGEgYW5kIGdldCBvdXRwdXQgRGF0YSAqLworICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIHdoaWxlICgoaW5jb3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCisgIHsKKyAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKKyAgfQorCisgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQorICB7CisgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgbnBibGIgPSAoKCgodWludDMyX3QpaGNyeXAtPlNpemUgLyAxNlUpICsgMVUpICogMTZVKSAtICgodWludDMyX3QpaGNyeXAtPlNpemUpOworCisgICAgLyogIFNldCBOcGJsYiBpbiBjYXNlIG9mIEFFUyBHQ00gcGF5bG9hZCBlbmNyeXB0aW9uIHRvIGdldCByaWdodCB0YWcqLworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgICB7CisgICAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICB9CisgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgfQorICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IDRVKQorICAgIHsKKyAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOworICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisKKyAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLypSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gKi8KKyAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCisgICAgeworICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gcHJvY2VzcyBpbiBBRVMgR0NNIG1vZGUgYW5kIHByZXBhcmUgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CisgIHVpbnQzMl90IGxvb3Bjb3VudGVyOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgaWYgKChoY3J5cC0+UGhhc2UgPT0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEKSB8fCAoaGNyeXAtPlBoYXNlID09IENSWVBfUEhBU0VfUEFZTE9BRF9TVVNQRU5ERUQpKQorICB7CisgICAgQ1JZUF9QaGFzZVByb2Nlc3NpbmdSZXN1bWUoaGNyeXApOworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgeworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgLyogQ29uZmlndXJlIEtleSwgSVYgYW5kIHByb2Nlc3MgbWVzc2FnZSAoaGVhZGVyIGFuZCBwYXlsb2FkKSAqLworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDFVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDJVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDNVKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLworICAgIHsKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaWYgKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKGhjcnlwLT5TaXplIC8gNFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgLyogU2l6ZSA8IDE2Qnl0ZXMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLworICAgICAgeworICAgICAgICAvKiBXb3JrYXJvdW5kIG5vdCBpbXBsZW1lbnRlZCBmb3IgVGlueUFFUzIqLworICAgICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgorICAgICAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgorICAgICAgICBwYXlsb2FkIDwxMjhiaXQgZG8gbm90IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLworCisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgICAgIG5wYmxiID0gMTZVIC0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSk7CisKKyAgICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMFUpOworICAgICAgICB9CisKKyAgICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgICAgICB9CisKKyAgICAgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemUgOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQorICAgIHsKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplIDsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIH0KKworICB9IC8qIGVuZCBvZiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgZWxzZSAgLyogS2V5IGFuZCBJViBoYXZlIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLAorICAgICAgICAgIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZDsKKyAgICAgICAgICBvbmx5IHByb2Nlc3MgaGVyZSBtZXNzYWdlIHBheWxvYWQgKi8KKyAgeworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgIH0KKyAgICBlbHNlIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaWYgKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKGhjcnlwLT5TaXplIC8gNFUpKQorICAgICAgeworICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogU2l6ZSA8IDE2Qnl0ZXMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLworICAgIHsKKyAgICAgIC8qIFdvcmthcm91bmQgbm90IGltcGxlbWVudGVkIGZvciBUaW55QUVTMiovCisgICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgorICAgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICAgIHBheWxvYWQgPDEyOGJpdCBkbyBub3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCisKKworICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgICBucGJsYiA9IDE2VSAtICgodWludDMyX3QpaGNyeXAtPlNpemUpOworCisgICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgICB9CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgICB9CisKKyAgICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZSA7IGxvb3Bjb3VudGVyKyspCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICB9CisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHByb2Nlc3MgaW4gQUVTIEdDTSBtb2RlIGFuZCBwcmVwYXJlIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgdXNpbmcgRE1BCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50OworICB1aW50MTZfdCB3b3Jkc2l6ZSA9IGhjcnlwLT5TaXplIC8gNFUgOworICB1aW50MzJfdCBpbmRleDsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworCisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgIHsKKyAgICAvKiBQcm9jZXNzIHVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgfQorICBlbHNlIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCisgIHsKKyAgICAvKkRNQSB0cmFuc2ZlciBtdXN0IG5vdCBpbmNsdWRlIHRoZSBsYXN0IGJsb2NrIGluIGNhc2Ugb2YgU2l6ZSBpcyBub3QgJTE2ICovCisgICAgd29yZHNpemUgPSB3b3Jkc2l6ZSAtICh3b3Jkc2l6ZSAlIDRVKTsKKworICAgIC8qRE1BIHRyYW5zZmVyICovCisgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgd29yZHNpemUsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICB9CisgIGVsc2UgLyogbGVuZ3RoIG9mIGlucHV0IGRhdGEgaXMgPCAxNiAqLworICB7CisgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgbnBibGIgPSAxNlUgLSAodWludDMyX3QpaGNyeXAtPlNpemU7CisKKyAgICAvKiBTZXQgTnBibGIgaW4gY2FzZSBvZiBBRVMgR0NNIHBheWxvYWQgZW5jcnlwdGlvbiB0byBnZXQgcmlnaHQgdGFnKi8KKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCisgICAgeworICAgICAgLyogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKKyAgICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIH0KKyAgICB3aGlsZSAoaW5kZXggPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAwVTsKKyAgICAgIGluZGV4Kys7CisgICAgfQorICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLypSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gKi8KKyAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCisgICAgeworICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgIH0KKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSB0byByZWFkeSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZQorICAqICAgICAgICAgZm9yIFRpbnlBRVMgcGVyaXBoZXJhbCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHdvcmRzaXplID0gKCh1aW50MzJfdCloY3J5cC0+U2l6ZSAvIDRVKSA7CisgIHVpbnQzMl90IGxvb3Bjb3VudGVyOworICB1aW50MzJfdCBucGJsYjsKKyAgdWludDMyX3QgbGFzdHdvcmRzaXplOworICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KKyAgdWludDMyX3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgIHsKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBCMCAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDJVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgM1UpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZAorICAgIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCisgICAgaWYgKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKGhjcnlwLCAgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKipQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIDBVKTsKKworICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQorICB7CisgICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovCisgICAgd29yZHNpemUgPSAoKHdvcmRzaXplIC8gNFUpICogNFUpIDsKKyAgfQorICAvKiBHZXQgdGljayAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdyaXRlIGlucHV0IGRhdGEgYW5kIGdldCBvdXRwdXQgZGF0YSAqLworICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIHdoaWxlICgoaW5jb3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCisgIHsKKyAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKKyAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIH0KKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgeworICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KWhjcnlwLT5TaXplIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAoKHVpbnQzMl90KWhjcnlwLT5TaXplKTsKKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkKKyAgICB7CisgICAgICAvKiBTZXQgTnBibGIgaW4gY2FzZSBvZiBBRVMgQ0NNIHBheWxvYWQgZGVjcnlwdGlvbiB0byBnZXQgcmlnaHQgdGFnICAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwKTsKKworICAgIH0KKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSB0aGUgbGFzdCBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisKKyAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7CisgICAgICBsb29wY291bnRlcisrOworICAgIH0KKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCA0VTsgbG9vcGNvdW50ZXIrKykKKyAgICB7CisgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKworICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFFUyBDQ00gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHByb2Nlc3MgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiAgICAgICAgIGZvciBUaW55QUVTIHBlcmlwaGVyYWwsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IG1vZGU7CisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyNpZiAoVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FID09IDFVKQorICBpZiAoKGhjcnlwLT5QaGFzZSA9PSBDUllQX1BIQVNFX0hFQURFUl9TVVNQRU5ERUQpIHx8IChoY3J5cC0+UGhhc2UgPT0gQ1JZUF9QSEFTRV9QQVlMT0FEX1NVU1BFTkRFRCkpCisgIHsKKyAgICBDUllQX1BoYXNlUHJvY2Vzc2luZ1Jlc3VtZShoY3J5cCk7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICAvKiBDb25maWd1cmUgS2V5LCBJViBhbmQgcHJvY2VzcyBtZXNzYWdlIChoZWFkZXIgYW5kIHBheWxvYWQpICovCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBCMCAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxVSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDJVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgM1UpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICAgMFUpIC8qaGVhZGVyIHBoYXNlIGlzICBza2lwcGVkKi8KKyAgICB7CisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisgICAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKKyAgICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCAwVSk7CisKKyAgICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQorICAgICAgeworICAgICAgICAvKiBJbmNyZW1lbnQgQ3J5cEhlYWRlckNvdW50IHRvIHBhc3MgaW4gQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUICovCisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgICBpZiAoKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAvKiBTaXplIDwgNCB3b3JkcyAgOiBmaXJzdCBibG9jayBpcyB0aGUgbGFzdCBibG9jayovCisgICAgICB7CisgICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgICBucGJsYiA9IDE2VSAtICh1aW50MzJfdCloY3J5cC0+U2l6ZTsKKworICAgICAgICBtb2RlID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFOworICAgICAgICBpZiAoKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkgfHwKKyAgICAgICAgICAgICgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMFUpOworICAgICAgICB9CisKKyAgICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgICAgICB9CisKKyAgICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIDwgNFUpIC8qSGVhZGVyU2l6ZSA8IDQgKi8KKyAgICB7CisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgfQorCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworICBlbHNlICAvKiBLZXkgYW5kIElWIGhhdmUgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsCisgICAgICAgICAgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkOworICAgICAgICAgIG9ubHkgcHJvY2VzcyBoZXJlIG1lc3NhZ2UgcGF5bG9hZCAqLworICB7CisgICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgaWYgKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogU2l6ZSA8IDQgd29yZHMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLworICAgIHsKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAxNlUgLSAodWludDMyX3QpaGNyeXAtPlNpemU7CisKKyAgICAgIG1vZGUgPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREU7CisgICAgICBpZiAoKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkgfHwKKyAgICAgICAgICAoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgICB7CisgICAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICAgIH0KKworICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKworICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzIGluIERNQSBtb2RlCisgICogICAgICAgICBmb3IgVGlueUFFUyBwZXJpcGhlcmFsLCBubyBlbmNyeXB0L2RlY3J5cHQgcGVyZm9ybWVkLCBvbmx5IGF1dGhlbnRpY2F0aW9uIHByZXBhcmF0aW9uLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCAgICA9IDBVOworICB1aW50MTZfdCB3b3Jkc2l6ZSA9IGhjcnlwLT5TaXplIC8gNFUgOworICB1aW50MzJfdCBpbmRleDsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQorICB7CisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOyAvKiBNZXJlbHkgc3RvcmUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgeworCisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIEIwICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDFVKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMlUpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzVSk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIFNldCB0byAwIHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgMFUpOworCisgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX1BBWUxPQUQpOworCisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgaWYgKGhjcnlwLT5TaXplID09IDBVKQorICB7CisgICAgLyogUHJvY2VzcyB1bkxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICB7CisgICAgLypETUEgdHJhbnNmZXIgbXVzdCBub3QgaW5jbHVkZSB0aGUgbGFzdCBibG9jayBpbiBjYXNlIG9mIFNpemUgaXMgbm90ICUxNiAqLworICAgIHdvcmRzaXplID0gd29yZHNpemUgLSAod29yZHNpemUgJSA0VSk7CisKKyAgICAvKkRNQSB0cmFuc2ZlciAqLworICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIHdvcmRzaXplLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgfQorICBlbHNlIC8qIGxlbmd0aCBvZiBpbnB1dCBkYXRhIGlzIDwgMTYgKi8KKyAgeworICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgIG5wYmxiID0gMTZVIC0gKHVpbnQzMl90KWhjcnlwLT5TaXplOworCisgICAgLyogU2V0IE5wYmxiIGluIGNhc2Ugb2YgQUVTIENDTSBwYXlsb2FkIGRlY3J5cHRpb24gdG8gZ2V0IHJpZ2h0IHRhZyovCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKQorICAgIHsKKyAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIG5wYmxiIDw8IDIwVSk7CisgICAgfQorCisgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgfQorCisgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGxhc3QgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisgICAgd2hpbGUgKGluZGV4IDwgNFUpCisgICAgeworICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgIC8qUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPICovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgIHsKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsKKyAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIHBheWxvYWQgcGhhc2UgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQorICAqIEByZXR2YWwgc3RhdGUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCBsb29wY291bnRlcjsKKyAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBtb2RlOworICB1aW50MTZfdCBpbmNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovCisgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKKyAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOworICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CisgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKworICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisgIGlmICgob3V0Y291bnQgPj0gIChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChpbmNvdW50ICogNFUpID49ICBoY3J5cC0+U2l6ZSkpCisgIHsKKworICAgICAvKiBXaGVuIGluIENDTSB3aXRoIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBza2lwcGVkLCBkb24ndCBkaXNhYmxlIGludGVycnVwdGlvbnMgKi8KKyAgICAgaWYgKCEoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pICYmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpKSkKKyAgICAgeworICAgICAgLyogRGlzYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvcnMgaW50ZXJydXB0cyAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisgICAgIH0KKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CisjZWxzZQorICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSAtIChoY3J5cC0+Q3J5cEluQ291bnQpKSA+PSA0VSkKKyAgeworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKyAgICAvKiBJZiBzdXNwZW5zaW9uIGZsYWcgaGFzIGJlZW4gcmFpc2VkLCBzdXNwZW5kIHByb2Nlc3NpbmcKKyAgICAgICBvbmx5IGlmIG5vdCBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIHBheWxvYWQgKi8KKyAgICBpZiAoaGNyeXAtPlN1c3BlbmRSZXF1ZXN0ID09IEhBTF9DUllQX1NVU1BFTkQpCisgICAgeworICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAvKiByZXNldCBTdXNwZW5kUmVxdWVzdCAqLworICAgICAgaGNyeXAtPlN1c3BlbmRSZXF1ZXN0ID0gSEFMX0NSWVBfU1VTUEVORF9OT05FOworICAgICAgLyogRGlzYWJsZSBDb21wdXRhdGlvbiBDb21wbGV0ZSBGbGFnIGFuZCBFcnJvcnMgSW50ZXJydXB0cyAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9TVVNQRU5ERUQ7CisgICAgICAvKiBNYXJrIHRoYXQgdGhlIHBheWxvYWQgcGhhc2UgaXMgc3VzcGVuZGVkICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BBWUxPQURfU1VTUEVOREVEOworCisgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKyAgICB7CisgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBpZiAoKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgaGNyeXAtPlNpemUpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKQorICAgIHsKKyAgICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICB9CisgIGVsc2UgLyogTGFzdCBibG9jayBvZiBwYXlsb2FkIDwgMTI4Yml0Ki8KKyAgeworICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KWhjcnlwLT5TaXplIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAoKHVpbnQzMl90KWhjcnlwLT5TaXplKTsKKworICAgIG1vZGUgPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREU7CisgICAgaWYgKCgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpIHx8CisgICAgICAgICgobW9kZSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pKSkKKyAgICB7CisgICAgICAvKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXZhbGlkIGJ5dGVzIHVzaW5nIE5QQkxCIHJlZ2lzdGVyKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYiA8PCAyMFUpOworICAgIH0KKworICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgIH0KKworICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgfQorICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgIHsKKyAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgfQorICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2UgaW4gcG9sbGluZyBtb2RlCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgc3RhdGUKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCBsb29wY291bnRlcjsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCisgIHsKKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQorICAgIHsKKyAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qV3JpdGUgaGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgICAgfQorICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKlBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorCisgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQorICAgIHsKKyAgICAgIC8qV29ya2Fyb3VuZCAxOiBvbmx5IEFFUywgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBwZXJpcGhlcmFsLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKworICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICB9CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldHMgdGhlIGhlYWRlciBwaGFzZSB3aGVuIHVzaW5nIERNQSBpbiBwcm9jZXNzCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudCAgPSAwVTsKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSBmb3IgR0NNL0dNQUMgb3IgQ0NNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKKyAgeworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSkpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovCisgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICB9CisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorCisgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLworICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CisgICAgICBkbworICAgICAgeworICAgICAgICBjb3VudC0tIDsKKyAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgfQorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIGluIGludGVycnVwdCBtb2RlCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCit7CisgIHVpbnQzMl90IGxvb3Bjb3VudGVyOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBtb2RlOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkKKyAgeworICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2UgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKKyAgICAvKiBTZXQgdG8gMCB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIDBVKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQorICAgIHsKKyAgICAgIC8qIEluY3JlbWVudCBDcnlwSGVhZGVyQ291bnQgdG8gcGFzcyBpbiBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQgKi8KKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICB9CisgICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgaWYgKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogU2l6ZSA8IDQgd29yZHMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLworICAgIHsKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAxNlUgLSAoKHVpbnQzMl90KWhjcnlwLT5TaXplKTsKKyAgICAgIG1vZGUgPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREU7CisgICAgICBpZiAoKChtb2RlID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkgfHwKKyAgICAgICAgICAoKG1vZGUgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKSkpCisgICAgICB7CisgICAgICAgIC8qIFNwZWNpZnkgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9OUEJMQiwgbnBibGIgPDwgMjBVKTsKKyAgICAgIH0KKworICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKworICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICgoKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+Q3J5cEhlYWRlckNvdW50KSkgPj0gNFUpKQorICB7CisKKyNpZiAoVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FID09IDFVKQorICAgIC8qIElmIHN1c3BlbnNpb24gZmxhZyBoYXMgYmVlbiByYWlzZWQsIHN1c3BlbmQgcHJvY2Vzc2luZworICAgICAgIG9ubHkgaWYgbm90IGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyICovCisgICAgaWYgKGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9PSBIQUxfQ1JZUF9TVVNQRU5EKQorICAgIHsKKyAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgLyogcmVzZXQgU3VzcGVuZFJlcXVlc3QgKi8KKyAgICAgIGhjcnlwLT5TdXNwZW5kUmVxdWVzdCA9IEhBTF9DUllQX1NVU1BFTkRfTk9ORTsKKyAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBhbmQgRXJyb3JzIEludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXxDUllQX0lUX0VSUklFKTsKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfU1VTUEVOREVEOworICAgICAgLyogTWFyayB0aGF0IHRoZSBwYXlsb2FkIHBoYXNlIGlzIHN1c3BlbmRlZCAqLworICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEOworCisgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfU1VTUEVORF9SRVNVTUUgKi8KKyAgICB7CisgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICB9CisgIH0KKyAgZWxzZSAvKkhlYWRlclNpemUgPCA0IG9yIEhlYWRlclNpemUgPjQgJiBIZWFkZXJTaXplICU0ICE9IDAqLworICB7CisgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpOyBsb29wY291bnRlcisrKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgIH0KKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICBsb29wY291bnRlcisrOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25DQ0ZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisjaWYgKFVTRV9IQUxfQ1JZUF9TVVNQRU5EX1JFU1VNRSA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgSW4gY2FzZSBvZiBtZXNzYWdlIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiwgcmVhZCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yLgorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgorICAqIEBwYXJhbSAgT3V0cHV0IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYXZlZCBJbml0aWFsaXphdGlvbiBWZWN0b3IuCisgICogQG5vdGUgICBUaGlzIHZhbHVlIGhhcyB0byBiZSBzdG9yZWQgZm9yIHJldXNlIGJ5IHdyaXRpbmcgdGhlIEFFU19JVlJ4IHJlZ2lzdGVycworICAqICAgICAgICAgYXMgc29vbiBhcyB0aGUgc3VzcGVuZGVkIHByb2Nlc3NpbmcgaGFzIHRvIGJlIHJlc3VtZWQuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1JlYWRfSVZSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIE91dHB1dCkKK3sKKyAgdWludDMyX3Qgb3V0cHV0YWRkciA9ICh1aW50MzJfdClPdXRwdXQ7CisKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5JVlIzOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5JVlIyOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5JVlIxOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5JVlIwOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluIGNhc2Ugb2YgbWVzc2FnZSBwcm9jZXNzaW5nIHJlc3VtcHRpb24sIHJld3JpdGUgdGhlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICBWZWN0b3IgaW4gdGhlIEFFU19JVlJ4IHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcGFyYW0gIElucHV0IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYXZlZCBJbml0aWFsaXphdGlvbiBWZWN0b3IgdG8KKyAgKiAgICAgICAgIHdyaXRlIGJhY2sgaW4gdGhlIENSWVAgaGFyZHdhcmUgYmxvY2suCisgICogQG5vdGUgICBBRVMgbXVzdCBiZSBkaXNhYmxlZCB3aGVuIHJlY29uZmlndXJpbmcgdGhlIElWIHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfV3JpdGVfSVZSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0KQoreworICB1aW50MzJfdCBpdmFkZHIgPSAodWludDMyX3QpSW5wdXQ7CisKKyAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCopKGl2YWRkcik7CisgIGl2YWRkcis9NFU7CisgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShpdmFkZHIpOworICBpdmFkZHIrPTRVOworICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGl2YWRkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW4gY2FzZSBvZiBtZXNzYWdlIEdDTS9HTUFDL0NDTSBwcm9jZXNzaW5nIHN1c3BlbnNpb24sCisgICogICAgICAgICByZWFkIHRoZSBTdXNwZW5kIFJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcGFyYW0gIE91dHB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQgU3VzcGVuZCBSZWdpc3RlcnMuCisgICogQG5vdGUgICBUaGVzZSB2YWx1ZXMgaGF2ZSB0byBiZSBzdG9yZWQgZm9yIHJldXNlIGJ5IHdyaXRpbmcgYmFjayB0aGUgQUVTX1NVU1B4UiByZWdpc3RlcnMKKyAgKiAgICAgICAgIGFzIHNvb24gYXMgdGhlIHN1c3BlbmRlZCBwcm9jZXNzaW5nIGhhcyB0byBiZSByZXN1bWVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9SZWFkX1N1c3BlbmRSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIE91dHB1dCkKK3sKKyAgdWludDMyX3Qgb3V0cHV0YWRkciA9ICh1aW50MzJfdClPdXRwdXQ7CisgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKKworICAvKiBJbiBjYXNlIG9mIEdDTSBwYXlsb2FkIHBoYXNlIGVuY3J5cHRpb24sIGNoZWNrIHRoYXQgc3VzcGVuc2lvbiBjYW4gYmUgY2FycmllZCBvdXQgKi8KKyAgaWYgKFJFQURfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfQ0hNT0R8QUVTX0NSX0dDTVBIfEFFU19DUl9NT0RFKSkgPT0gKENSWVBfQUVTX0dDTV9HTUFDfEFFU19DUl9HQ01QSF8xfDB4MCkpCisgIHsKKworICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIGNsZWFyZWQgKi8KKyAgICAgIGNvdW50ID0gMHhGRkY7CisgICAgICBkbworICAgICAgeworICAgICAgICBjb3VudC0tIDsKKyAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9CVVNZKSk7CisKKyAgfQorCisKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQN1I7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPlNVU1A2UjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+U1VTUDVSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQNFI7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPlNVU1AzUjsKKyAgb3V0cHV0YWRkcis9NFU7CisgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+U1VTUDJSOworICBvdXRwdXRhZGRyKz00VTsKKyAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5TVVNQMVI7CisgIG91dHB1dGFkZHIrPTRVOworICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPlNVU1AwUjsKK30KKworLyoqCisgICogQGJyaWVmICBJbiBjYXNlIG9mIG1lc3NhZ2UgR0NNL0dNQUMvQ0NNIHByb2Nlc3NpbmcgcmVzdW1wdGlvbiwgcmV3cml0ZSB0aGUgU3VzcGVuZAorICAqICAgICAgICAgUmVnaXN0ZXJzIGluIHRoZSBBRVNfU1VTUHhSIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcGFyYW0gIElucHV0IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYXZlZCBzdXNwZW5kIHJlZ2lzdGVycyB0bworICAqICAgICAgICAgd3JpdGUgYmFjayBpbiB0aGUgQ1JZUCBoYXJkd2FyZSBibG9jay4KKyAgKiBAbm90ZSAgIEFFUyBtdXN0IGJlIGRpc2FibGVkIHdoZW4gcmVjb25maWd1cmluZyB0aGUgc3VzcGVuZCByZWdpc3RlcnMuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1dyaXRlX1N1c3BlbmRSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0KQoreworICB1aW50MzJfdCBpdmFkZHIgPSAodWludDMyX3QpSW5wdXQ7CisKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQN1IgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQNlIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQNVIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQNFIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQM1IgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQMlIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQMVIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKKyAgaXZhZGRyKz00VTsKKyAgaGNyeXAtPkluc3RhbmNlLT5TVVNQMFIgPSAqKHVpbnQzMl90KikoaXZhZGRyKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbiBjYXNlIG9mIG1lc3NhZ2UgR0NNL0dNQUMvQ0NNIHByb2Nlc3Npbmcgc3VzcGVuc2lvbiwgcmVhZCB0aGUgS2V5IFJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KKyAgKiBAcGFyYW0gIE91dHB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQgS2V5IFJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIEtleVNpemUgSW5kaWNhdGVzIHRoZSBrZXkgc2l6ZSAoMTI4IG9yIDI1NiBiaXRzKS4KKyAgKiBAbm90ZSAgIFRoZXNlIHZhbHVlcyBoYXZlIHRvIGJlIHN0b3JlZCBmb3IgcmV1c2UgYnkgd3JpdGluZyBiYWNrIHRoZSBBRVNfS0VZUnggcmVnaXN0ZXJzCisgICogICAgICAgICBhcyBzb29uIGFzIHRoZSBzdXNwZW5kZWQgcHJvY2Vzc2luZyBoYXMgdG8gYmUgcmVzdW1lZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIENSWVBfUmVhZF9LZXlSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIE91dHB1dCwgdWludDMyX3QgS2V5U2l6ZSkKK3sKKyAgdWludDMyX3Qga2V5YWRkciA9ICh1aW50MzJfdClPdXRwdXQ7CisKKyAgc3dpdGNoIChLZXlTaXplKQorICB7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDFVKTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMlUpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzVSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDRVKTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNVUpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA2VSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDdVKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAga2V5YWRkcis9NFU7CisgICAgICAqKHVpbnQzMl90Kikoa2V5YWRkcikgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxVSk7CisgICAgICBrZXlhZGRyKz00VTsKKyAgICAgICoodWludDMyX3QqKShrZXlhZGRyKSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDJVKTsKKyAgICAgIGtleWFkZHIrPTRVOworICAgICAgKih1aW50MzJfdCopKGtleWFkZHIpID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgM1UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSW4gY2FzZSBvZiBtZXNzYWdlIEdDTS9HTUFDIChDQ00vQ01BQyB3aGVuIGFwcGxpY2FibGUpIHByb2Nlc3NpbmcgcmVzdW1wdGlvbiwgcmV3cml0ZSB0aGUgS2V5CisgICogICAgICAgICBSZWdpc3RlcnMgaW4gdGhlIEFFU19LRVlSeCByZWdpc3RlcnMuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCisgICogQHBhcmFtICBJbnB1dCBQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2F2ZWQga2V5IHJlZ2lzdGVycyB0bworICAqICAgICAgICAgd3JpdGUgYmFjayBpbiB0aGUgQ1JZUCBoYXJkd2FyZSBibG9jay4KKyAgKiBAcGFyYW0gIEtleVNpemUgSW5kaWNhdGVzIHRoZSBrZXkgc2l6ZSAoMTI4IG9yIDI1NiBiaXRzKQorICAqIEBub3RlICAgQUVTIG11c3QgYmUgZGlzYWJsZWQgd2hlbiByZWNvbmZpZ3VyaW5nIHRoZSBLZXkgcmVnaXN0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgQ1JZUF9Xcml0ZV9LZXlSZWdpc3RlcnMoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QqIElucHV0LCB1aW50MzJfdCBLZXlTaXplKQoreworICB1aW50MzJfdCBrZXlhZGRyID0gKHVpbnQzMl90KUlucHV0OworCisgIGlmIChLZXlTaXplID09IENSWVBfS0VZU0laRV8yNTZCKQorICB7CisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNyA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKKyAgICBrZXlhZGRyKz00OworICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjYgPSAqKHVpbnQzMl90Kikoa2V5YWRkcik7CisgICAga2V5YWRkcis9NDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0gKih1aW50MzJfdCopKGtleWFkZHIpOworICAgIGtleWFkZHIrPTQ7CisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNCA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKKyAgICBrZXlhZGRyKz00OworICB9CisKKyAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0gKih1aW50MzJfdCopKGtleWFkZHIpOworICAgIGtleWFkZHIrPTQ7CisgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QqKShrZXlhZGRyKTsKKyAgICBrZXlhZGRyKz00OworICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjEgPSAqKHVpbnQzMl90Kikoa2V5YWRkcik7CisgICAga2V5YWRkcis9NDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0gKih1aW50MzJfdCopKGtleWFkZHIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEF1dGhlbnRpY2F0aW9uIHBoYXNlIHJlc3VtcHRpb24gaW4gY2FzZSBvZiBHQ00vR01BQy9DQ00gcHJvY2VzcyBpbiBpbnRlcnJ1cHQgbW9kZQorICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlKEhlYWRlciAmIEhlYWRlclNpemUpCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBDUllQX1BoYXNlUHJvY2Vzc2luZ1Jlc3VtZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQoreworICB1aW50MzJfdCBsb29wY291bnRlciA9IDBVOworICB1aW50MzJfdCBsYXN0d29yZHNpemUgPTA7CisgIHVpbnQzMl90IG5wYmxiID0gMFUgOworCisgIC8qIENhc2Ugb2YgaGVhZGVyIHBoYXNlIHJlc3VtcHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUF9QSEFTRV9IRUFERVJfU1VTUEVOREVEKQorICB7CisgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICBpZiAoKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+Q3J5cEhlYWRlckNvdW50KSA+PSA0VSkpCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgfQorICAgIGVsc2UgLypIZWFkZXJTaXplIDwgNCBvciBIZWFkZXJTaXplID40ICYgSGVhZGVyU2l6ZSAlNCAhPSAwKi8KKyAgICB7CisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApOyBsb29wY291bnRlcisrKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICB9CisgICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQorICAgICAgeworICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQ2FzZSBvZiBwYXlsb2FkIHBoYXNlIHJlc3VtcHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgIGVsc2UgaWYgKGhjcnlwLT5QaGFzZSA9PSBDUllQX1BIQVNFX1BBWUxPQURfU1VTUEVOREVEKQorICB7CisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKKworICAgLyogU2V0IHRvIDAgdGhlIG51bWJlciBvZiBub24tdmFsaWQgYnl0ZXMgdXNpbmcgTlBCTEIgcmVnaXN0ZXIqLworICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTlBCTEIsIDBVKTsKKworICAgIGlmICgoaGNyeXAtPlNpemUvNCkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSA+PSA0VSkKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBpZigoaGNyeXAtPkNyeXBJbkNvdW50ID09ICBoY3J5cC0+U2l6ZSkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpCisgICAgICB7CisgICAgICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBMYXN0IGJsb2NrIG9mIHBheWxvYWQgPCAxMjhiaXQqLworICAgIHsKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAoKGhjcnlwLT5TaXplLzE2VSkrMVUpKjE2VS0gKGhjcnlwLT5TaXplKTsKKyAgICAgIGlmKCgoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKSB8fAorICAgICAgICAgKCgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pKSkKKyAgICAgIHsKKyAgICAgICAgLyogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIG5vbi12YWxpZCBieXRlcyB1c2luZyBOUEJMQiByZWdpc3RlciovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCLCBucGJsYjw8IDIwVSk7CisgICAgICB9CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAobnBibGIgJSA0VSA9PTBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFUgKzFVOworICAgICAgfQorCisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICB9CisgICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKKyAgICAgIHsKKyAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYgLyogZGVmaW5lZCAoVVNFX0hBTF9DUllQX1NVU1BFTkRfUkVTVU1FKSAqLworLyoqCisgICogQH0KKyAgKi8KKworCisjZW5kaWYgLyogSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAqIEB9CisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9jcnlwX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9jcnlwX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMGU1ZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2NyeXBfZXguYwpAQCAtMCwwICsxLDM4MiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfY3J5cF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBDUllQRXggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDcnlwdG9ncmFwaHkgKENSWVApIHBlcmlwaGVyYWwuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSWVBFeAorICAqIEB7CisgICovCisKKworCisjaWZkZWYgSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRGVmaW5lcworICAqIEB7CisgICovCisKKyNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLworCisjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLworI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgICAgICAgICAvKiE8IERlY3J5cHRpb24gICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCAgICAgQUVTX0NSX01PREUgICAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBhbmQgZGVjcnlwdGlvbiBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLworCisjZGVmaW5lICBDUllQRXhfUEhBU0VfUFJPQ0VTUyAgICAgICAweDAyVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLworI2RlZmluZSAgQ1JZUEV4X1BIQVNFX0ZJTkFMICAgICAgICAgMHgwM1UgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIGluIGZpbmFsIHBoYXNlIHRoaXMgaXMgcmVsZXZhbnQgb25seSB3aXRoIENDTSBhbmQgR0NNIG1vZGVzICovCisKKy8qICBDVFIwIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMCAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGdlbmVyYXRlIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICAgIFRBRyBpbiBQb2xsaW5nIG1vZGUKKyAgICAgICgjKUhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRworICAgICAgKCMpSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHCisgICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgZ2VuZXJhdGUgdGhlIEdDTSBhdXRoZW50aWNhdGlvbiBUQUcuCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIEF1dGhUYWcgUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAqIDMyVTsgLyogSGVhZGVyIGxlbmd0aCBpbiBiaXRzICovCisgIHVpbnQ2NF90IGlucHV0bGVuZ3RoID0gKHVpbnQ2NF90KWhjcnlwLT5TaXplc1N1bSAqIDhVOyAvKiBpbnB1dCBsZW5ndGggaW4gYml0cyAqLworICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLworICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCisgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CisgICAgfQorICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKKyAgICAvKiBTZXQgdGhlIGVuY3J5cHQgb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qVGlueUFFUyBwZXJpcGhlcmFsIGZyb20gVjMuMS4xIDogZGF0YSBoYXMgdG8gYmUgaW5zZXJ0ZWQgbm9ybWFsbHkgKG5vIHN3YXBwaW5nKSovCisgICAgLyogV3JpdGUgaW50byB0aGUgQUVTX0RJTlIgcmVnaXN0ZXIgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykKKyAgICBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHBheWxvYWQgKi8KKworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAodWludDMyX3QpKGlucHV0bGVuZ3RoKTsKKworICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFFUyBDQ00gQXV0aGVudGljYXRpb24gVEFHIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIEF1dGhUYWcgUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGFnYWRkciA9ICh1aW50MzJfdClBdXRoVGFnOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgaW4gY2FzZSB0aGV5IHdlcmUga2VwdCBlbmFibGVkIHRvIHByb2NlZWQKKyAgICAgICBhIHNpbmdsZSBtZXNzYWdlIGluIHNldmVyYWwgaXRlcmF0aW9ucyAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOworCisgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KKyAgICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwaGFzZSAqLworICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOworICAgIH0KKyAgICBlbHNlIC8qIEluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQqLworICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgIC8qIFNlcXVlbmNlIGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKKworICAgIC8qIFNldCBlbmNyeXB0ICBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgeworICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIENsb2NrICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKKyAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisKKyAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAvKiBEaXNhYmxlIENSWVAgICovCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBBRVMgS2V5IERlcml2YXRpb25zIGZ1bmN0aW9ucworICAqIEBicmllZiAgIEV4dGVuZGVkIEtleSBEZXJpdmF0aW9ucyBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gRW5hYmxlIG9yIERpc2FibGUgdGhlCisgICAgICAgICAgdGhlIEF1dG9LZXlEZXJpdmF0aW9uIHBhcmFtZXRlciBpbiBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICAgICAgICAgVGhlc2UgZnVuY3Rpb24gYXJlIGFsbG93ZWQgb25seSBpbiBUaW55QUVTIHBlcmlwaGVyYWwuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEFFUyBlbmFibGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb25zCisgICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZS4KKyAgKi8KK3ZvaWQgIEhBTF9DUllQRXhfRW5hYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IEVOQUJMRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBBRVMgZGlzYWJsZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbnMKKyAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlLgorICAqLwordm9pZCAgSEFMX0NSWVBFeF9EaXNhYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKK3sKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IERJU0FCTEU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2RtYS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NDc3NwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2RtYS5jCkBAIC0wLDAgKzEsMTEwMiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfZG1hLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERNQSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKERNQSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIGVycm9ycyBmdW5jdGlvbnMKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgKCMpIEVuYWJsZSBhbmQgY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgRE1BIENoYW5uZWwKKyAgICAgICAoZXhjZXB0IGZvciBpbnRlcm5hbCBTUkFNIC8gRkxBU0ggbWVtb3JpZXM6IG5vIGluaXRpYWxpemF0aW9uIGlzCisgICAgICAgbmVjZXNzYXJ5KS4gUGxlYXNlIHJlZmVyIHRvIHRoZSBSZWZlcmVuY2UgbWFudWFsIGZvciBjb25uZWN0aW9uIGJldHdlZW4gcGVyaXBoZXJhbHMKKyAgICAgICBhbmQgRE1BIHJlcXVlc3RzLgorCisgICAgICAgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0VOQUJMRQorCisgICAoIykgRm9yIGEgZ2l2ZW4gQ2hhbm5lbCwgcHJvZ3JhbSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAgICBDaGFubmVsIHJlcXVlc3QsIFRyYW5zZmVyIERpcmVjdGlvbiwgU291cmNlIGFuZCBEZXN0aW5hdGlvbiBkYXRhIGZvcm1hdHMsCisgICAgICAgQ2lyY3VsYXIgb3IgTm9ybWFsIG1vZGUsIENoYW5uZWwgUHJpb3JpdHkgbGV2ZWwsIFNvdXJjZSBhbmQgRGVzdGluYXRpb24gSW5jcmVtZW50IG1vZGUKKyAgICAgICB1c2luZyBIQUxfRE1BX0luaXQoKSBmdW5jdGlvbi4KKworICAgICAgIFByaW9yIHRvIEhBTF9ETUFfSW5pdCB0aGUgQ0xLIHNoYWxsIGJlIGVuYWJsZWQgZm9yIGJvdGggRE1BICYgRE1BTVVYCisgICAgICAgdGhhbmtzIHRvOgorICAgICAgIERNQTEgb3IgRE1BMjogX19IQUxfUkNDX0RNQTFfQ0xLX0VOQUJMRSgpIG9yICBfX0hBTF9SQ0NfRE1BMl9DTEtfRU5BQkxFKCkgOworICAgICAgIERNQU1VWDE6ICAgICAgX19IQUxfUkNDX0RNQU1VWDFfQ0xLX0VOQUJMRSgpOworCisgICAoIykgVXNlIEhBTF9ETUFfR2V0U3RhdGUoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIERNQSBzdGF0ZSBhbmQgSEFMX0RNQV9HZXRFcnJvcigpIGluIGNhc2Ugb2YgZXJyb3IKKyAgICAgICBkZXRlY3Rpb24uCisKKyAgICgjKSBVc2UgSEFMX0RNQV9BYm9ydCgpIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyCisKKyAgICAgLUAtICAgSW4gTWVtb3J5LXRvLU1lbW9yeSB0cmFuc2ZlciBtb2RlLCBDaXJjdWxhciBtb2RlIGlzIG5vdCBhbGxvd2VkLgorICAgICAqKiogUG9sbGluZyBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgICgrKSBVc2UgSEFMX0RNQV9TdGFydCgpIHRvIHN0YXJ0IERNQSB0cmFuc2ZlciBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBvZiBTb3VyY2UKKyAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIExlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCisgICAgICAgICAgKCspIFVzZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIHRvIHBvbGwgZm9yIHRoZSBlbmQgb2YgY3VycmVudCB0cmFuc2ZlciwgaW4gdGhpcworICAgICAgICAgICAgICBjYXNlIGEgZml4ZWQgVGltZW91dCBjYW4gYmUgY29uZmlndXJlZCBieSBVc2VyIGRlcGVuZGluZyBmcm9tIGhpcyBhcHBsaWNhdGlvbi4KKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEgaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkKKyAgICAgICAgICAoKykgRW5hYmxlIHRoZSBETUEgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfU3RhcnRfSVQoKSB0byBzdGFydCBETUEgdHJhbnNmZXIgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgICAgICAgICAgU291cmNlIGFkZHJlc3MgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBMZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZC4KKyAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBETUEgaW50ZXJydXB0IGlzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAoKykgVXNlIEhBTF9ETUFfSVJRSGFuZGxlcigpIGNhbGxlZCB1bmRlciBETUFfSVJRSGFuZGxlcigpIEludGVycnVwdCBzdWJyb3V0aW5lCisgICAgICAgICAgKCspIEF0IHRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfRE1BX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgICAgYWRkIGhpcyBvd24gZnVuY3Rpb24gYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIFhmZXJDcGx0Q2FsbGJhY2sgYW5kCisgICAgICAgICAgICAgIFhmZXJFcnJvckNhbGxiYWNrIChpLmUuIGEgbWVtYmVyIG9mIERNQSBoYW5kbGUgc3RydWN0dXJlKS4KKworICAgICAqKiogRE1BIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gRE1BIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfRE1BX0VOQUJMRTogRW5hYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICAgICAgKCspIF9fSEFMX0RNQV9HRVRfRkxBRzogR2V0IHRoZSBETUEgQ2hhbm5lbCBwZW5kaW5nIGZsYWdzLgorICAgICAgICgrKSBfX0hBTF9ETUFfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIERNQSBDaGFubmVsIHBlbmRpbmcgZmxhZ3MuCisgICAgICAgKCspIF9fSEFMX0RNQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsIGludGVycnVwdHMuCisgICAgICAgKCspIF9fSEFMX0RNQV9ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwgaW50ZXJydXB0cy4KKyAgICAgICAoKykgX19IQUxfRE1BX0dFVF9JVF9TT1VSQ0U6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KKworICAgICBbLi5dCisgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgRE1BIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BIERNQQorICAqIEBicmllZiBETUEgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0RNQV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRE1BX1ByaXZhdGVfRnVuY3Rpb25zIERNQSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBETUFfU2V0Q29uZmlnKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKTsKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYQ2hhbm5lbEJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9ucyBETUEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBETUFfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBETUEgQ2hhbm5lbCBzb3VyY2UKKyAgICBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBpbmNyZW1lbnRhdGlvbiBhbmQgZGF0YSBzaXplcywgdHJhbnNmZXIgZGlyZWN0aW9uLAorICAgIGNpcmN1bGFyL25vcm1hbCBtb2RlIHNlbGVjdGlvbiwgbWVtb3J5LXRvLW1lbW9yeSBtb2RlIHNlbGVjdGlvbiBhbmQgQ2hhbm5lbCBwcmlvcml0eSB2YWx1ZS4KKyAgICBbLi5dCisgICAgVGhlIEhBTF9ETUFfSW5pdCgpIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIERNQSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgYXMgZGVzY3JpYmVkIGluCisgICAgcmVmZXJlbmNlIG1hbnVhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIERNQV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfSW5pdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBETUEgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhkbWEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0RJUkVDVElPTihoZG1hLT5Jbml0LkRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfSU5DX1NUQVRFKGhkbWEtPkluaXQuUGVyaXBoSW5jKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTUVNT1JZX0lOQ19TVEFURShoZG1hLT5Jbml0Lk1lbUluYykpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX1BFUklQSEVSQUxfREFUQV9TSVpFKGhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BX01FTU9SWV9EQVRBX1NJWkUoaGRtYS0+SW5pdC5NZW1EYXRhQWxpZ25tZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFfTU9ERShoZG1hLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9QUklPUklUWShoZG1hLT5Jbml0LlByaW9yaXR5KSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfUkVRVUVTVChoZG1hLT5Jbml0LlJlcXVlc3QpKTsKKworICAvKiBDb21wdXRlIHRoZSBjaGFubmVsIGluZGV4ICovCisgIGlmICgodWludDMyX3QpKGhkbWEtPkluc3RhbmNlKSA8ICh1aW50MzJfdCkoRE1BMl9DaGFubmVsMSkpCisgIHsKKyAgICAvKiBETUExICovCisgICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTFfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMV9DaGFubmVsMSkpIDw8IDI7CisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MgPSBETUExOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERNQTIgKi8KKyAgICBoZG1hLT5DaGFubmVsSW5kZXggPSAoKCh1aW50MzJfdCloZG1hLT5JbnN0YW5jZSAtICh1aW50MzJfdClETUEyX0NoYW5uZWwxKSAvICgodWludDMyX3QpRE1BMl9DaGFubmVsMiAtICh1aW50MzJfdClETUEyX0NoYW5uZWwxKSkgPDwgMjsKKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcyA9IERNQTI7CisgIH0KKworICAvKiBDaGFuZ2UgRE1BIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBDUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXAgPSBoZG1hLT5JbnN0YW5jZS0+Q0NSOworCisgIC8qIENsZWFyIFBMLCBNU0laRSwgUFNJWkUsIE1JTkMsIFBJTkMsIENJUkMsIERJUiBhbmQgTUVNMk1FTSBiaXRzICovCisgIHRtcCAmPSAoKHVpbnQzMl90KX4oRE1BX0NDUl9QTCAgICB8IERNQV9DQ1JfTVNJWkUgIHwgRE1BX0NDUl9QU0laRSAgfAorICAgICAgICAgICAgICAgICAgICAgIERNQV9DQ1JfTUlOQyAgfCBETUFfQ0NSX1BJTkMgICB8IERNQV9DQ1JfQ0lSQyAgIHwKKyAgICAgICAgICAgICAgICAgICAgICBETUFfQ0NSX0RJUiAgIHwgRE1BX0NDUl9NRU0yTUVNKSk7CisKKyAgLyogUHJlcGFyZSB0aGUgRE1BIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICB0bXAgfD0gIGhkbWEtPkluaXQuRGlyZWN0aW9uICAgICAgICB8CisgICAgICAgICAgaGRtYS0+SW5pdC5QZXJpcGhJbmMgICAgICAgICAgIHwgaGRtYS0+SW5pdC5NZW1JbmMgICAgICAgICAgIHwKKyAgICAgICAgICBoZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgfCBoZG1hLT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgfAorICAgICAgICAgIGhkbWEtPkluaXQuTW9kZSAgICAgICAgICAgICAgICB8IGhkbWEtPkluaXQuUHJpb3JpdHk7CisKKyAgLyogV3JpdGUgdG8gRE1BIENoYW5uZWwgQ1IgcmVnaXN0ZXIgKi8KKyAgaGRtYS0+SW5zdGFuY2UtPkNDUiA9IHRtcDsKKworICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgZm9yIERNQU1VWCBjaGFubmVsIDoKKyAgICAgRE1BbXV4Q2hhbm5lbCwgRE1BbXV4Q2hhbm5lbFN0YXR1cyBhbmQgRE1BbXV4Q2hhbm5lbFN0YXR1c01hc2sKKyAgKi8KKyAgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soaGRtYSk7CisKKyAgaWYgKGhkbWEtPkluaXQuRGlyZWN0aW9uID09IERNQV9NRU1PUllfVE9fTUVNT1JZKQorICB7CisgICAgLyogaWYgbWVtb3J5IHRvIG1lbW9yeSBmb3JjZSB0aGUgcmVxdWVzdCB0byAwKi8KKyAgICBoZG1hLT5Jbml0LlJlcXVlc3QgPSBETUFfUkVRVUVTVF9NRU0yTUVNOworICB9CisKKyAgLyogU2V0IHBlcmlwaGVyYWwgcmVxdWVzdCAgdG8gRE1BTVVYIGNoYW5uZWwgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSID0gKGhkbWEtPkluaXQuUmVxdWVzdCAmIERNQU1VWF9DeENSX0RNQVJFUV9JRCk7CisKKyAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsKKworICBpZiAoKChoZG1hLT5Jbml0LlJlcXVlc3QgPiAgMFUpICYmIChoZG1hLT5Jbml0LlJlcXVlc3QgPD0gRE1BX1JFUVVFU1RfR0VORVJBVE9SMykpKQorICB7CisgICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgOgorICAgICAgIERNQW11eFJlcXVlc3RHZW4sIERNQW11eFJlcXVlc3RHZW5TdGF0dXMgYW5kIERNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrCisgICAgKi8KKyAgICBETUFfQ2FsY0RNQU1VWFJlcXVlc3RHZW5CYXNlQW5kTWFzayhoZG1hKTsKKworICAgIC8qIFJlc2V0IHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgcmVnaXN0ZXIqLworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgPSAwVTsKKworICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuID0gMFU7CisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cyA9IDBVOworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMFU7CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBlcnJvciBjb2RlICovCisgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAvKiBJbml0aWFsaXplIHRoZSBETUEgc3RhdGUqLworICBoZG1hLT5TdGF0ZSAgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgaGRtYS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgRE1BIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfRGVJbml0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgRE1BIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChOVUxMID09IGhkbWEpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9BTExfSU5TVEFOQ0UoaGRtYS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBETUEgQ2hhbm5lbHggKi8KKyAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgLyogQ29tcHV0ZSB0aGUgY2hhbm5lbCBpbmRleCAqLworICBpZiAoKHVpbnQzMl90KShoZG1hLT5JbnN0YW5jZSkgPCAodWludDMyX3QpKERNQTJfQ2hhbm5lbDEpKQorICB7CisgICAgLyogRE1BMSAqLworICAgIGhkbWEtPkNoYW5uZWxJbmRleCA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlIC0gKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpIC8gKCh1aW50MzJfdClETUExX0NoYW5uZWwyIC0gKHVpbnQzMl90KURNQTFfQ2hhbm5lbDEpKSA8PCAyOworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzID0gRE1BMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBETUEyICovCisgICAgaGRtYS0+Q2hhbm5lbEluZGV4ID0gKCgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkgLyAoKHVpbnQzMl90KURNQTJfQ2hhbm5lbDIgLSAodWludDMyX3QpRE1BMl9DaGFubmVsMSkpIDw8IDI7CisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MgPSBETUEyOworICB9CisKKyAgLyogUmVzZXQgRE1BIENoYW5uZWwgY29udHJvbCByZWdpc3RlciAqLworICBoZG1hLT5JbnN0YW5jZS0+Q0NSICA9IDBVOworCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBETUFNVVggY2hhbm5lbCA6CisgICAgIERNQW11eENoYW5uZWwsIERNQW11eENoYW5uZWxTdGF0dXMgYW5kIERNQW11eENoYW5uZWxTdGF0dXNNYXNrICovCisKKyAgRE1BX0NhbGNETUFNVVhDaGFubmVsQmFzZUFuZE1hc2soaGRtYSk7CisKKyAgLyogUmVzZXQgdGhlIERNQU1VWCBjaGFubmVsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERNQSBjaGFubmVsICovCisgIGhkbWEtPkRNQW11eENoYW5uZWwtPkNDUiA9IDBVOworCisgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgLyogUmVzZXQgUmVxdWVzdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBpZiBhbnkgKi8KKyAgaWYgKCgoaGRtYS0+SW5pdC5SZXF1ZXN0ID4gIDBVKSAmJiAoaGRtYS0+SW5pdC5SZXF1ZXN0IDw9IERNQV9SRVFVRVNUX0dFTkVSQVRPUjMpKSkKKyAgeworICAgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyBmb3IgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIDoKKyAgICAgICBETUFtdXhSZXF1ZXN0R2VuLCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzIGFuZCBETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaworICAgICovCisgICAgRE1BX0NhbGNETUFNVVhSZXF1ZXN0R2VuQmFzZUFuZE1hc2soaGRtYSk7CisKKyAgICAvKiBSZXNldCB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIHJlZ2lzdGVyKi8KKyAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSID0gMFU7CisKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisgIH0KKworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuID0gMFU7CisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMgPSAwVTsKKyAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2sgPSAwVTsKKworICAvKiBDbGVhbiBjYWxsYmFja3MgKi8KKyAgaGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICBoZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29kZSAqLworICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BIHN0YXRlICovCisgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBkYXRhIGxlbmd0aCBhbmQgU3RhcnQgRE1BIHRyYW5zZmVyCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGRhdGEgbGVuZ3RoIGFuZAorICAgICAgICAgIFN0YXJ0IERNQSB0cmFuc2ZlciB3aXRoIGludGVycnVwdAorICAgICAgKCspIEFib3J0IERNQSB0cmFuc2ZlcgorICAgICAgKCspIFBvbGwgZm9yIHRyYW5zZmVyIGNvbXBsZXRlCisgICAgICAoKykgSGFuZGxlIERNQSBpbnRlcnJ1cHQgcmVxdWVzdAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gU3JjQWRkcmVzcyBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSBEc3RBZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gRGF0YUxlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfU3RhcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIHVpbnQzMl90IFNyY0FkZHJlc3MsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IERhdGFMZW5ndGgpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0JVRkZFUl9TSVpFKERhdGFMZW5ndGgpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmIChIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKQorICB7CisgICAgLyogQ2hhbmdlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX0JVU1k7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOworCisgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHRoZSBkYXRhIGxlbmd0aCAmIGNsZWFyIGZsYWdzKi8KKyAgICBETUFfU2V0Q29uZmlnKGhkbWEsIFNyY0FkZHJlc3MsIERzdEFkZHJlc3MsIERhdGFMZW5ndGgpOworCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfRE1BX0VOQUJMRShoZG1hKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworICAgIHN0YXR1cyA9IEhBTF9CVVNZOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIERNQSBUcmFuc2ZlciB3aXRoIGludGVycnVwdCBlbmFibGVkLgorICAqIEBwYXJhbSBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHBhcmFtIFNyY0FkZHJlc3MgVGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MKKyAgKiBAcGFyYW0gRHN0QWRkcmVzcyBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtIERhdGFMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX1N0YXJ0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCB1aW50MzJfdCBTcmNBZGRyZXNzLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBEYXRhTGVuZ3RoKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0RNQV9CVUZGRVJfU0laRShEYXRhTGVuZ3RoKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZG1hKTsKKworICBpZiAoSEFMX0RNQV9TVEFURV9SRUFEWSA9PSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIC8qIENoYW5nZSBETUEgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9CVVNZOworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKKworICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRShoZG1hKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggJiBjbGVhciBmbGFncyovCisgICAgRE1BX1NldENvbmZpZyhoZG1hLCBTcmNBZGRyZXNzLCBEc3RBZGRyZXNzLCBEYXRhTGVuZ3RoKTsKKworICAgIC8qIEVuYWJsZSB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCisgICAgLyogRW5hYmxlIHRoZSB0cmFuc2ZlciBFcnJvciBpbnRlcnJ1cHQgKi8KKyAgICBpZiAoTlVMTCAhPSBoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjaykKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGFzIHdlbGwgKi8KKyAgICAgIF9fSEFMX0RNQV9FTkFCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX0hUKTsKKyAgICAgIF9fSEFMX0RNQV9FTkFCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9URSkpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIERNQU1VWCBTeW5jaHJvbml6YXRpb24gaXMgZW5hYmxlZCovCisgICAgaWYgKChoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJiBETUFNVVhfQ3hDUl9TRSkgIT0gMFUpCisgICAgeworICAgICAgLyogRW5hYmxlIERNQU1VWCBzeW5jIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSIHw9IERNQU1VWF9DeENSX1NPSUU7CisgICAgfQorCisgICAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpCisgICAgeworICAgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yLCBlbmFibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIElUKi8KKyAgICAgIC8qIGVuYWJsZSB0aGUgcmVxdWVzdCBnZW4gb3ZlcnJ1biBJVCovCisgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSIHw9IERNQU1VWF9SR3hDUl9PSUU7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgX19IQUxfRE1BX0VOQUJMRShoZG1hKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogUmVtYWluIEJVU1kgKi8KKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9BYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKworICAvKiBDaGVjayB0aGUgRE1BIHBlcmlwaGVyYWwgaGFuZGxlICovCisgIGlmIChOVUxMID09IGhkbWEpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIERNQSBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfQlVTWSkKKyAgeworICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9fWEZFUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgRE1BIElUICovCisgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworCisgICAgLyogZGlzYWJsZSB0aGUgRE1BTVVYIHN5bmMgb3ZlcnJ1biBJVCovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSICY9IH5ETUFNVVhfQ3hDUl9TT0lFOworCisgICAgLyogRGlzYWJsZSB0aGUgY2hhbm5lbCAqLworICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhkbWEpOworCisgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpOworCisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgICAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpCisgICAgeworICAgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yLCBkaXNhYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBJVCovCisgICAgICAvKiBkaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIElUKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4tPlJHQ1IgJj0gfkRNQU1VWF9SR3hDUl9PSUU7CisKKyAgICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiA9IGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrOworICAgIH0KKworICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgaGRtYS0+U3RhdGUgPSBIQUxfRE1BX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnRzIHRoZSBETUEgVHJhbnNmZXIgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoZG1hICBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BX0Fib3J0X0lUKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKEhBTF9ETUFfU1RBVEVfQlVTWSAhPSBoZG1hLT5TdGF0ZSkKKyAgeworICAgIC8qIG5vIHRyYW5zZmVyIG9uZ29pbmcgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PX1hGRVI7CisKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSBETUEgSVQgKi8KKyAgICBfX0hBTF9ETUFfRElTQUJMRV9JVChoZG1hLCAoRE1BX0lUX1RDIHwgRE1BX0lUX0hUIHwgRE1BX0lUX1RFKSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjaGFubmVsICovCisgICAgX19IQUxfRE1BX0RJU0FCTEUoaGRtYSk7CisKKyAgICAvKiBkaXNhYmxlIHRoZSBETUFNVVggc3luYyBvdmVycnVuIElUKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsLT5DQ1IgJj0gfkRNQU1VWF9DeENSX1NPSUU7CisKKyAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHN5bmNocm8gb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSID0gaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2s7CisKKyAgICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkKKyAgICB7CisgICAgICAvKiBpZiB1c2luZyBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IsIGRpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIElUKi8KKyAgICAgIC8qIGRpc2FibGUgdGhlIHJlcXVlc3QgZ2VuIG92ZXJydW4gSVQqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiAmPSB+RE1BTVVYX1JHeENSX09JRTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHQ0ZSID0gaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2s7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgLyogQ2FsbCBVc2VyIEFib3J0IGNhbGxiYWNrICovCisgICAgaWYgKGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUG9sbGluZyBmb3IgdHJhbnNmZXIgY29tcGxldGUuCisgICogQHBhcmFtIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gQ29tcGxldGVMZXZlbCBTcGVjaWZpZXMgdGhlIERNQSBsZXZlbCBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQV9Qb2xsRm9yVHJhbnNmZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEsIEhBTF9ETUFfTGV2ZWxDb21wbGV0ZVR5cGVEZWYgQ29tcGxldGVMZXZlbCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGVtcDsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChIQUxfRE1BX1NUQVRFX0JVU1kgIT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICAvKiBubyB0cmFuc2ZlciBvbmdvaW5nICovCisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT19YRkVSOworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUG9sbGluZyBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gY2lyY3VsYXIgbW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IDBVKQorICB7CisgICAgaGRtYS0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBHZXQgdGhlIGxldmVsIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKQorICB7CisgICAgLyogVHJhbnNmZXIgQ29tcGxldGUgZmxhZyAqLworICAgIHRlbXAgPSBETUFfRkxBR19UQzEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBIYWxmIFRyYW5zZmVyIENvbXBsZXRlIGZsYWcgKi8KKyAgICB0ZW1wID0gRE1BX0ZMQUdfSFQxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggICYgMHgxY1UpOworICB9CisKKyAgLyogR2V0IHRpY2sgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICB3aGlsZSAoMFUgPT0gKGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1IgJiB0ZW1wKSkKKyAgeworICAgIGlmICgoMFUgIT0gKGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JU1IgJiAoRE1BX0ZMQUdfVEUxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSkpCisgICAgeworICAgICAgLyogV2hlbiBhIERNQSB0cmFuc2ZlciBlcnJvciBvY2N1cnMgKi8KKyAgICAgIC8qIEEgaGFyZHdhcmUgY2xlYXIgb2YgaXRzIEVOIGJpdHMgaXMgcGVyZm9ybWVkICovCisgICAgICAvKiBDbGVhciBhbGwgZmxhZ3MgKi8KKyAgICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfR0lGMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVEU7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgRE1BIHN0YXRlICovCisgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkbWEtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQSBzdGF0ZSAqLworICAgICAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKkNoZWNrIGZvciBETUFNVVggUmVxdWVzdCBnZW5lcmF0b3IgKGlmIHVzZWQpIG92ZXJydW4gc3RhdHVzICovCisgIGlmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKQorICB7CisgICAgLyogaWYgdXNpbmcgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIENoZWNrIGZvciBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biAqLworICAgIGlmICgoaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdTUiAmIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSByZXF1ZXN0IGdlbiBvdmVycnVuIGludGVycnVwdCAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiB8PSBETUFNVVhfUkd4Q1JfT0lFOworCisgICAgICAvKiBDbGVhciB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gZmxhZyAqLworICAgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1JFUUdFTjsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBmb3IgRE1BTVVYIFN5bmNocm9uaXphdGlvbiBvdmVycnVuICovCisgIGlmICgoaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q1NSICYgaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1c01hc2spICE9IDBVKQorICB7CisgICAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNGUiA9IGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgfD0gSEFMX0RNQV9FUlJPUl9TWU5DOworICB9CisKKyAgaWYgKEhBTF9ETUFfRlVMTF9UUkFOU0ZFUiA9PSBDb21wbGV0ZUxldmVsKQorICB7CisgICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfRkxBR19UQzEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgICAvKiBUaGUgc2VsZWN0ZWQgQ2hhbm5lbHggRU4gYml0IGlzIGNsZWFyZWQgKERNQSBpcyBkaXNhYmxlZCBhbmQKKyAgICBhbGwgdHJhbnNmZXJzIGFyZSBjb21wbGV0ZSkgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgdGhlIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIERNQSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRE1BX0lSUUhhbmRsZXIoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIHVpbnQzMl90IGZsYWdfaXQgPSBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SVNSOworICB1aW50MzJfdCBzb3VyY2VfaXQgPSBoZG1hLT5JbnN0YW5jZS0+Q0NSOworCisgIC8qIEhhbGYgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKChmbGFnX2l0ICYgKERNQV9GTEFHX0hUMSA8PCAoaGRtYS0+Q2hhbm5lbEluZGV4ICYgMHgxY1UpKSkgIT0gMFUpICYmICgoc291cmNlX2l0ICYgRE1BX0lUX0hUKSAhPSAwVSkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBoYWxmIHRyYW5zZmVyIGludGVycnVwdCBpZiB0aGUgRE1BIG1vZGUgaXMgbm90IENJUkNVTEFSICovCisgICAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBoYWxmIHRyYW5zZmVyIGludGVycnVwdCAqLworICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX0hUKTsKKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIGhhbGYgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLworICAgIGhkbWEtPkRtYUJhc2VBZGRyZXNzLT5JRkNSID0gKERNQV9JU1JfSFRJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgICAvKiBETUEgcGVyaXBoZXJhbCBzdGF0ZSBpcyBub3QgdXBkYXRlZCBpbiBIYWxmIFRyYW5zZmVyICovCisgICAgLyogYnV0IGluIFRyYW5zZmVyIENvbXBsZXRlIGNhc2UgKi8KKworICAgIGlmIChoZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEhhbGYgdHJhbnNmZXIgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorCisgIC8qIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBlbHNlIGlmICgoMFUgIT0gKGZsYWdfaXQgJiAoRE1BX0ZMQUdfVEMxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpKSkgJiYgKDBVICE9IChzb3VyY2VfaXQgJiBETUFfSVRfVEMpKSkKKyAgeworICAgIGlmICgoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgdHJhbnNmZXIgY29tcGxldGUgYW5kIGVycm9yIGludGVycnVwdCAqLworICAgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgRE1BX0lUX1RFIHwgRE1BX0lUX1RDKTsKKworICAgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICAgIGhkbWEtPlN0YXRlID0gSEFMX0RNQV9TVEFURV9SRUFEWTsKKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KKyAgICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX1RDSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZG1hKTsKKworICAgIGlmIChoZG1hLT5YZmVyQ3BsdENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgLyogVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisKKyAgLyogVHJhbnNmZXIgRXJyb3IgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIGVsc2UgaWYgKCgoZmxhZ19pdCAmIChETUFfRkxBR19URTEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSkpIT0gMFUpICYmICgoc291cmNlX2l0ICYgRE1BX0lUX1RFKSAhPSAwVSkpCisgIHsKKyAgICAvKiBXaGVuIGEgRE1BIHRyYW5zZmVyIGVycm9yIG9jY3VycyAqLworICAgIC8qIEEgaGFyZHdhcmUgY2xlYXIgb2YgaXRzIEVOIGJpdHMgaXMgcGVyZm9ybWVkICovCisgICAgLyogRGlzYWJsZSBBTEwgRE1BIElUICovCisgICAgX19IQUxfRE1BX0RJU0FCTEVfSVQoaGRtYSwgKERNQV9JVF9UQyB8IERNQV9JVF9IVCB8IERNQV9JVF9URSkpOworCisgICAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgICAgaGRtYS0+RG1hQmFzZUFkZHJlc3MtPklGQ1IgPSAoRE1BX0lTUl9HSUYxIDw8IChoZG1hLT5DaGFubmVsSW5kZXggJiAweDFjVSkpOworCisgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICBoZG1hLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX1RFOworCisgICAgLyogQ2hhbmdlIHRoZSBETUEgc3RhdGUgKi8KKyAgICBoZG1hLT5TdGF0ZSA9IEhBTF9ETUFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgaWYgKGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgLyogVHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhkbWEtPlhmZXJFcnJvckNhbGxiYWNrKGhkbWEpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIFRvIERvICovCisgIH0KKyAgcmV0dXJuOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGNhbGxiYWNrcworICAqIEBwYXJhbSBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSBDYWxsYmFja0lEIFVzZXIgQ2FsbGJhY2sgaWRlbnRpZmVyCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIEVOVU0gYXMgcGFyYW1ldGVyLgorICAqIEBwYXJhbSBwQ2FsbGJhY2sgUG9pbnRlciB0byBwcml2YXRlIGNhbGxiYWNzayBmdW5jdGlvbiB3aGljaCBoYXMgcG9pbnRlciB0bworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIGFzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfUmVnaXN0ZXJDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCB2b2lkICgqIHBDYWxsYmFjaykoRE1BX0hhbmRsZVR5cGVEZWYgKl9oZG1hKSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRtYSk7CisKKyAgaWYgKEhBTF9ETUFfU1RBVEVfUkVBRFkgPT0gaGRtYS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0NQTFRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfSEFMRkNQTFRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9BQk9SVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciBjYWxsYmFja3MKKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgQ2hhbm5lbC4KKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBVc2VyIENhbGxiYWNrIGlkZW50aWZlcgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgSEFMX0RNQV9DYWxsYmFja0lEVHlwZURlZiBFTlVNIGFzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFfVW5SZWdpc3RlckNhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hLCBIQUxfRE1BX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhkbWEpOworCisgIGlmIChIQUxfRE1BX1NUQVRFX1JFQURZID09IGhkbWEtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9DUExUX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgIEhBTF9ETUFfWEZFUl9IQUxGQ1BMVF9DQl9JRDoKKyAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAgSEFMX0RNQV9YRkVSX0VSUk9SX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICBIQUxfRE1BX1hGRVJfQUJPUlRfQ0JfSUQ6CisgICAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgICBIQUxfRE1BX1hGRVJfQUxMX0NCX0lEOgorICAgICAgICBoZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoZG1hLT5YZmVyRXJyb3JDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKiBAZGVmZ3JvdXAgRE1BX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEBicmllZiAgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIENoZWNrIHRoZSBETUEgc3RhdGUKKyAgICAgICgrKSBHZXQgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgRE1BIGhhbmRlIHN0YXRlLgorICAqIEBwYXJhbSBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9ETUFfU3RhdGVUeXBlRGVmIEhBTF9ETUFfR2V0U3RhdGUoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIC8qIFJldHVybiBETUEgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoZG1hLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIERNQSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIENoYW5uZWwuCisgICogQHJldHZhbCBETUEgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0RNQV9HZXRFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgcmV0dXJuIGhkbWEtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0cyB0aGUgRE1BIFRyYW5zZmVyIHBhcmFtZXRlci4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBDaGFubmVsLgorICAqIEBwYXJhbSBTcmNBZGRyZXNzIFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzCisgICogQHBhcmFtIERzdEFkZHJlc3MgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcworICAqIEBwYXJhbSBEYXRhTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIHZvaWQgRE1BX1NldENvbmZpZyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgdWludDMyX3QgU3JjQWRkcmVzcywgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgRGF0YUxlbmd0aCkKK3sKKyAgLyogQ2xlYXIgdGhlIERNQU1VWCBzeW5jaHJvIG92ZXJydW4gZmxhZyAqLworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzLT5DRlIgPSBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzazsKKworICBpZiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkKKyAgeworICAgIC8qIENsZWFyIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3Igb3ZlcnJ1biBmbGFnICovCisgICAgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1cy0+UkdDRlIgPSBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzazsKKyAgfQorCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBoZG1hLT5EbWFCYXNlQWRkcmVzcy0+SUZDUiA9IChETUFfSVNSX0dJRjEgPDwgKGhkbWEtPkNoYW5uZWxJbmRleCAmIDB4MWNVKSk7CisKKyAgLyogQ29uZmlndXJlIERNQSBDaGFubmVsIGRhdGEgbGVuZ3RoICovCisgIGhkbWEtPkluc3RhbmNlLT5DTkRUUiA9IERhdGFMZW5ndGg7CisKKyAgLyogUGVyaXBoZXJhbCB0byBNZW1vcnkgKi8KKyAgaWYgKChoZG1hLT5Jbml0LkRpcmVjdGlvbikgPT0gRE1BX01FTU9SWV9UT19QRVJJUEgpCisgIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DUEFSID0gRHN0QWRkcmVzczsKKworICAgIC8qIENvbmZpZ3VyZSBETUEgQ2hhbm5lbCBzb3VyY2UgYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gU3JjQWRkcmVzczsKKyAgfQorICAvKiBNZW1vcnkgdG8gUGVyaXBoZXJhbCAqLworICBlbHNlCisgIHsKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgc291cmNlIGFkZHJlc3MgKi8KKyAgICBoZG1hLT5JbnN0YW5jZS0+Q1BBUiA9IFNyY0FkZHJlc3M7CisKKyAgICAvKiBDb25maWd1cmUgRE1BIENoYW5uZWwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIGhkbWEtPkluc3RhbmNlLT5DTUFSID0gRHN0QWRkcmVzczsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFVwZGF0ZXMgdGhlIERNQSBoYW5kbGUgd2l0aCB0aGUgRE1BTVVYICBjaGFubmVsIGFuZCBzdGF0dXMgbWFzayBkZXBlbmRpbmcgb24gc3RyZWFtIG51bWJlcgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBETUFfQ2FsY0RNQU1VWENoYW5uZWxCYXNlQW5kTWFzayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgdWludDMyX3QgY2hhbm5lbF9udW1iZXI7CisKKyAgLyogY2hlY2sgaWYgaW5zdGFuY2UgaXMgbm90IG91dHNpZGUgdGhlIERNQSBjaGFubmVsIHJhbmdlICovCisgIGlmICgodWludDMyX3QpaGRtYS0+SW5zdGFuY2UgPCAodWludDMyX3QpRE1BMl9DaGFubmVsMSkKKyAgeworICAgIC8qIERNQTEgKi8KKyAgICBoZG1hLT5ETUFtdXhDaGFubmVsID0gKERNQU1VWDFfQ2hhbm5lbDAgKyAoaGRtYS0+Q2hhbm5lbEluZGV4ID4+IDJVKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRE1BMiAqLworICAgIGhkbWEtPkRNQW11eENoYW5uZWwgPSAoRE1BTVVYMV9DaGFubmVsNyArIChoZG1hLT5DaGFubmVsSW5kZXggPj4gMlUpKTsKKyAgfQorICBjaGFubmVsX251bWJlciA9ICgoKHVpbnQzMl90KWhkbWEtPkluc3RhbmNlICYgMHhGRlUpIC0gOFUpIC8gMjBVOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzID0gRE1BTVVYMV9DaGFubmVsU3RhdHVzOworICBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzayA9IDFVTCA8PCAoY2hhbm5lbF9udW1iZXIgJiAweDFjVSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVXBkYXRlcyB0aGUgRE1BIGhhbmRsZSB3aXRoIHRoZSBETUFNVVggIHJlcXVlc3QgZ2VuZXJhdG9yIHBhcmFtcworICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBTdHJlYW0uCisgICogQHJldHZhbCBOb25lCisgICovCisKK3N0YXRpYyB2b2lkIERNQV9DYWxjRE1BTVVYUmVxdWVzdEdlbkJhc2VBbmRNYXNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICB1aW50MzJfdCByZXF1ZXN0ID0gIGhkbWEtPkluaXQuUmVxdWVzdCAmIERNQU1VWF9DeENSX0RNQVJFUV9JRDsKKworICAvKiBETUEgQ2hhbm5lbHMgYXJlIGNvbm5lY3RlZCB0byBETUFNVVgxIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrcyovCisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gPSAoRE1BTVVYX1JlcXVlc3RHZW5fVHlwZURlZiAqKSgodWludDMyX3QpKCgodWludDMyX3QpRE1BTVVYMV9SZXF1ZXN0R2VuZXJhdG9yMCkgKyAoKHJlcXVlc3QgLSAxVSkgKiA0VSkpKTsKKworICBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzID0gRE1BTVVYMV9SZXF1ZXN0R2VuU3RhdHVzOworCisgIC8qIGhlcmUgIlJlcXVlc3QiIGlzIGVpdGhlciBETUFfUkVRVUVTVF9HRU5FUkFUT1IwIHRvIDQsIGkuZS4gPD0gNCovCisgIGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXNNYXNrID0gMVVMIDw8ICgocmVxdWVzdCAtIDFVKSAmIDB4M1UpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0RNQV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2RtYV9leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfZG1hX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMzhjMQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2RtYV9leC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9kbWFfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRE1BIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlcgorICAqICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBETUEgRXh0ZW5zaW9uIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICBUaGUgRE1BIEV4dGVuc2lvbiBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICgrKSBDb25maWd1cmUgdGhlIERNQV9NVVggU3luY2hyb25pemF0aW9uIEJsb2NrIHVzaW5nIEhBTF9ETUFFeF9Db25maWdNdXhTeW5jIGZ1bmN0aW9uLgorICAgKCspIENvbmZpZ3VyZSB0aGUgRE1BX01VWCBSZXF1ZXN0IEdlbmVyYXRvciBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICBGdW5jdGlvbnMgSEFMX0RNQUV4X0VuYWJsZU11eFJlcXVlc3RHZW5lcmF0b3IgYW5kIEhBTF9ETUFFeF9EaXNhYmxlTXV4UmVxdWVzdEdlbmVyYXRvciBjYW4gdGhlbiBiZSB1c2VkCisgICAgICAgdG8gcmVzcGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHRoZSByZXF1ZXN0IGdlbmVyYXRvci4KKworICAgKCspIFRvIGhhbmRsZSB0aGUgRE1BTVVYIEludGVycnVwdHMsIHRoZSBmdW5jdGlvbiAgSEFMX0RNQUV4X01VWF9JUlFIYW5kbGVyIHNob3VsZCBiZSBjYWxsZWQgZnJvbQorICAgICAgIHRoZSBETUFNVVggSVJRIGhhbmRsZXIgaS5lIERNQU1VWDFfT1ZSX0lSUUhhbmRsZXIuCisgICAgICAgQXMgb25seSBvbmUgaW50ZXJydXB0IGxpbmUgaXMgYXZhaWxhYmxlIGZvciBhbGwgRE1BTVVYIGNoYW5uZWxzIGFuZCByZXF1ZXN0IGdlbmVyYXRvcnMgLCBIQUxfRE1BRXhfTVVYX0lSUUhhbmRsZXIgc2hvdWxkIGJlCisgICAgICAgY2FsbGVkIHdpdGgsIGFzIHBhcmFtZXRlciwgdGhlIGFwcHJvcHJpYXRlIERNQSBoYW5kbGUgYXMgbWFueSBhcyB1c2VkIERNQXMgaW4gdGhlIHVzZXIgcHJvamVjdAorICAgICAgKGV4Y2VwdGlvbiBkb25lIGlmIGEgZ2l2ZW4gRE1BIGlzIG5vdCB1c2luZyB0aGUgRE1BTVVYIFNZTkMgYmxvY2sgbmVpdGhlciBhIHJlcXVlc3QgZ2VuZXJhdG9yKQorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRE1BRXggRE1BRXgKKyAgKiBAYnJpZWYgRE1BIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9ETUFfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBETUFFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIERNQUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRE1BRXggRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICMjIyMjICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisKKyAgICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFN5bmNocm9uaXphdGlvbiBCbG9jayB1c2luZyBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYyBmdW5jdGlvbi4KKyAgICAoKykgQ29uZmlndXJlIHRoZSBETUFfTVVYIFJlcXVlc3QgR2VuZXJhdG9yIEJsb2NrIHVzaW5nIEhBTF9ETUFFeF9Db25maWdNdXhSZXF1ZXN0R2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgIEZ1bmN0aW9ucyBIQUxfRE1BRXhfRW5hYmxlTXV4UmVxdWVzdEdlbmVyYXRvciBhbmQgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yIGNhbiB0aGVuIGJlIHVzZWQKKyAgICAgICB0byByZXNwZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIERNQSBjaGFubmVsIChpbnN0YW5jZSkuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisgICogQHBhcmFtICBwU3luY0NvbmZpZyBQb2ludGVyIHRvIEhBTF9ETUFfTXV4U3luY0NvbmZpZ1R5cGVEZWYgOiBjb250YWlucyB0aGUgRE1BTVVYIHN5bmNocm9uaXphdGlvbiBwYXJhbWV0ZXJzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4U3luYyhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9NdXhTeW5jQ29uZmlnVHlwZURlZiAqcFN5bmNDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX1NJR05BTF9JRChwU3luY0NvbmZpZy0+U3luY1NpZ25hbElEKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfU1lOQ19QT0xBUklUWShwU3luY0NvbmZpZy0+IFN5bmNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1NZTkNfU1RBVEUocFN5bmNDb25maWctPlN5bmNFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9TWU5DX0VWRU5UKHBTeW5jQ29uZmlnLT5FdmVudEVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRE1BTVVYX1NZTkNfUkVRVUVTVF9OVU1CRVIocFN5bmNDb25maWctPlJlcXVlc3ROdW1iZXIpKTsKKworICAvKkNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkgKi8KKyAgaWYgKGhkbWEtPlN0YXRlID09IEhBTF9ETUFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGRtYSk7CisKKyAgICAvKiBTZXQgdGhlIG5ldyBzeW5jaHJvbml6YXRpb24gcGFyYW1ldGVycyAoYW5kIGtlZXAgdGhlIHJlcXVlc3QgSUQgZmlsbGVkIGR1cmluZyB0aGUgSW5pdCkqLworICAgIE1PRElGWV9SRUcoaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSLCBcCisgICAgICAgICAgICAgICAoRE1BTVVYX0N4Q1JfU1lOQ19JRCB8IERNQU1VWF9DeENSX05CUkVRIHwgRE1BTVVYX0N4Q1JfU1BPTCB8IERNQU1VWF9DeENSX1NFIHwgRE1BTVVYX0N4Q1JfRUdFKSwgXAorICAgICAgICAgICAgICAgKHBTeW5jQ29uZmlnLT5TeW5jU2lnbmFsSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAoKHBTeW5jQ29uZmlnLT5SZXF1ZXN0TnVtYmVyIC0gMVUpIDw8IERNQU1VWF9DeENSX05CUkVRX1BvcykgICAgfCBcCisgICAgICAgICAgICAgICAgcFN5bmNDb25maWctPlN5bmNQb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICgodWludDMyX3QpcFN5bmNDb25maWctPlN5bmNFbmFibGUgPDwgRE1BTVVYX0N4Q1JfU0VfUG9zKSAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgKCh1aW50MzJfdClwU3luY0NvbmZpZy0+RXZlbnRFbmFibGUgPDwgRE1BTVVYX0N4Q1JfRUdFX1BvcykpKTsKKworICAgIC8qIFByb2Nlc3MgVW5Mb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGRtYSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qRE1BIFN0YXRlIG5vdCBSZWFkeSovCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIGJsb2NrIHVzZWQgYnkgdGhlIGdpdmVuIERNQSBjaGFubmVsIChpbnN0YW5jZSkuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisqIEBwYXJhbSAgcFJlcXVlc3RHZW5lcmF0b3JDb25maWcgUG9pbnRlciB0byBIQUxfRE1BX011eFJlcXVlc3RHZW5lcmF0b3JDb25maWdUeXBlRGVmIDoKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSByZXF1ZXN0IGdlbmVyYXRvciBwYXJhbWV0ZXJzLgorICAqCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BRXhfQ29uZmlnTXV4UmVxdWVzdEdlbmVyYXRvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSwgSEFMX0RNQV9NdXhSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnVHlwZURlZiAqcFJlcXVlc3RHZW5lcmF0b3JDb25maWcpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19ETUFfQUxMX0lOU1RBTkNFKGhkbWEtPkluc3RhbmNlKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0RNQU1VWF9SRVFVRVNUX0dFTl9TSUdOQUxfSUQocFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlNpZ25hbElEKSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfUkVRVUVTVF9HRU5fUE9MQVJJVFkocFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19ETUFNVVhfUkVRVUVTVF9HRU5fUkVRVUVTVF9OVU1CRVIocFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlJlcXVlc3ROdW1iZXIpKTsKKworICAvKiBjaGVjayBpZiB0aGUgRE1BIHN0YXRlIGlzIHJlYWR5CisgICAgIGFuZCBETUEgaXMgdXNpbmcgYSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sKKyAgKi8KKyAgaWYgKChoZG1hLT5TdGF0ZSA9PSBIQUxfRE1BX1NUQVRFX1JFQURZKSAmJiAoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbiAhPSAwVSkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGRtYSk7CisKKyAgICAvKiBTZXQgdGhlIHJlcXVlc3QgZ2VuZXJhdG9yIG5ldyBwYXJhbWV0ZXJzKi8KKyAgICBXUklURV9SRUcoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiwgKHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5TaWduYWxJRCAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXF1ZXN0R2VuZXJhdG9yQ29uZmlnLT5Qb2xhcml0eSAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocFJlcXVlc3RHZW5lcmF0b3JDb25maWctPlJlcXVlc3ROdW1iZXIgLSAxVSkgPDwgRE1BTVVYX1JHeENSX0dOQlJFUV9Qb3MpKSk7CisKKyAgICAvKiBQcm9jZXNzIFVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhkbWEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBETUFNVVggcmVxdWVzdCBnZW5lcmF0b3IgYmxvY2sgdXNlZCBieSB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwgKGluc3RhbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUFFeF9FbmFibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkKKyAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaworICAqLworICBpZiAoKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfUkVTRVQpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDBVKSkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IqLworICAgIFNFVF9CSVQoaGRtYS0+RE1BbXV4UmVxdWVzdEdlbi0+UkdDUiwgRE1BTVVYX1JHeENSX0dFKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayB1c2VkIGJ5IHRoZSBnaXZlbiBETUEgY2hhbm5lbCAoaW5zdGFuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQUV4X0Rpc2FibGVNdXhSZXF1ZXN0R2VuZXJhdG9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRE1BX0FMTF9JTlNUQU5DRShoZG1hLT5JbnN0YW5jZSkpOworCisgIC8qIGNoZWNrIGlmIHRoZSBETUEgc3RhdGUgaXMgcmVhZHkKKyAgICAgYW5kIERNQSBpcyB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jaworICAqLworICBpZiAoKGhkbWEtPlN0YXRlICE9IEhBTF9ETUFfU1RBVEVfUkVTRVQpICYmIChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuICE9IDApKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBnZW5lcmF0b3IqLworICAgIENMRUFSX0JJVChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSLCBETUFNVVhfUkd4Q1JfR0UpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBETUFNVVggaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9ETUFFeF9NVVhfSVJRSGFuZGxlcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgLyogQ2hlY2sgZm9yIERNQU1VWCBTeW5jaHJvbml6YXRpb24gb3ZlcnJ1biAqLworICBpZiAoKGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXMtPkNTUiAmIGhkbWEtPkRNQW11eENoYW5uZWxTdGF0dXNNYXNrKSAhPSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIHN5bmNocm8gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICBDTEVBUl9CSVQoaGRtYS0+RE1BbXV4Q2hhbm5lbC0+Q0NSLCBETUFNVVhfQ3hDUl9TT0lFKTsKKworICAgIC8qIENsZWFyIHRoZSBETUFNVVggc3luY2hybyBvdmVycnVuIGZsYWcgKi8KKyAgICBXUklURV9SRUcoaGRtYS0+RE1BbXV4Q2hhbm5lbFN0YXR1cy0+Q0ZSLCBoZG1hLT5ETUFtdXhDaGFubmVsU3RhdHVzTWFzayk7CisKKyAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgIGhkbWEtPkVycm9yQ29kZSB8PSBIQUxfRE1BX0VSUk9SX1NZTkM7CisKKyAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUcmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgfQorICB9CisKKyAgaWYgKGhkbWEtPkRNQW11eFJlcXVlc3RHZW4gIT0gMFUpCisgIHsKKyAgICAvKiBpZiB1c2luZyBhIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBibG9jayBDaGVjayBmb3IgRE1BTVVYIHJlcXVlc3QgZ2VuZXJhdG9yIG92ZXJydW4gKi8KKyAgICBpZiAoKGhkbWEtPkRNQW11eFJlcXVlc3RHZW5TdGF0dXMtPlJHU1IgJiBoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzTWFzaykgIT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgcmVxdWVzdCBnZW4gb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuLT5SR0NSLCBETUFNVVhfUkd4Q1JfT0lFKTsKKworICAgICAgLyogQ2xlYXIgdGhlIERNQU1VWCByZXF1ZXN0IGdlbmVyYXRvciBvdmVycnVuIGZsYWcgKi8KKyAgICAgIFdSSVRFX1JFRyhoZG1hLT5ETUFtdXhSZXF1ZXN0R2VuU3RhdHVzLT5SR0NGUiwgaGRtYS0+RE1BbXV4UmVxdWVzdEdlblN0YXR1c01hc2spOworCisgICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLworICAgICAgaGRtYS0+RXJyb3JDb2RlIHw9IEhBTF9ETUFfRVJST1JfUkVRR0VOOworCisgICAgICBpZiAoaGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogVHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGRtYS0+WGZlckVycm9yQ2FsbGJhY2soaGRtYSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRE1BX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfZXh0aS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfZXh0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDg2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9leHRpLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2V4dGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRVhUSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBHZW5lcmFsIFB1cnBvc2UgSW5wdXQvT3V0cHV0IChFWFRJKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBFWFRJIFBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgRWFjaCBFeHRpIGxpbmUgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aGluIHRoaXMgZHJpdmVyLgorCisgICAgKCspIEV4dGkgbGluZSBjYW4gYmUgY29uZmlndXJlZCBpbiAzIGRpZmZlcmVudCBtb2RlcworICAgICAgICAoKyspIEludGVycnVwdAorICAgICAgICAoKyspIEV2ZW50CisgICAgICAgICgrKykgQm90aCBvZiB0aGVtCisKKyAgICAoKykgQ29uZmlndXJhYmxlIEV4dGkgbGluZXMgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCAzIGRpZmZlcmVudCB0cmlnZ2VycworICAgICAgICAoKyspIFJpc2luZworICAgICAgICAoKyspIEZhbGxpbmcKKyAgICAgICAgKCsrKSBCb3RoIG9mIHRoZW0KKworICAgICgrKSBXaGVuIHNldCBpbiBpbnRlcnJ1cHQgbW9kZSwgY29uZmlndXJhYmxlIEV4dGkgbGluZXMgaGF2ZSBvbmUKKyAgICAgICAgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXI6CisgICAgICAgICgrKykgVHJpZ2dlciByZXF1ZXN0IG9jY3VycmVkCisKKyAgICAoKykgRXh0aSBsaW5lcyAwIHRvIDE1IGFyZSBsaW5rZWQgdG8gZ3BpbyBwaW4gbnVtYmVyIDAgdG8gMTUuIEdwaW8gcG9ydCBjYW4KKyAgICAgICAgYmUgc2VsZWN0ZWQgdGhyb3VnaHQgbXVsdGlwbGV4ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKworICAgICgjKSBDb25maWd1cmUgdGhlIEVYVEkgbGluZSB1c2luZyBIQUxfRVhUSV9TZXRDb25maWdMaW5lKCkuCisgICAgICAgICgrKykgQ2hvb3NlIHRoZSBpbnRlcnJ1cHQgbGluZSBudW1iZXIgYnkgc2V0dGluZyAiTGluZSIgbWVtYmVyIGZyb20KKyAgICAgICAgICAgICBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlLgorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IGFuZC9vciBldmVudCBtb2RlIHVzaW5nICJNb2RlIiBtZW1iZXIgZnJvbQorICAgICAgICAgICAgIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIGNvbmZpZ3VyYWJsZSBsaW5lcywgY29uZmlndXJlIHJpc2luZyBhbmQvb3IgZmFsbGluZyB0cmlnZ2VyCisgICAgICAgICAgICAgIlRyaWdnZXIiIG1lbWJlciBmcm9tIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgRm9yIEV4dGkgbGluZXMgbGlua2VkIHRvIGdwaW8sIGNob29zZSBncGlvIHBvcnQgdXNpbmcgIkdQSU9TZWwiCisgICAgICAgICAgICAgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAoIykgR2V0IGN1cnJlbnQgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcKKyAgICAgICAgSEFMX0VYVElfR2V0Q29uZmlnTGluZSgpLgorICAgICAgICAoKyspIFByb3ZpZGUgZXhpdGluZyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgICAgICAoKyspIFByb3ZpZGUgcG9pbnRlciBvbiBFWFRJX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIGFzIHNlY29uZCBwYXJhbWV0ZXIuCisKKyAgICAoIykgQ2xlYXIgRXh0aSBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIGxpbmUgdXNpbmcgSEFMX0VYVElfR2V0Q29uZmlnTGluZSgpLgorICAgICAgICAoKyspIFByb3ZpZGUgZXhpdGluZyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorCisgICAgKCMpIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHRyZWF0IEV4dGkgaW50ZXJydXB0cyB1c2luZyBIQUxfRVhUSV9SZWdpc3RlckNhbGxiYWNrKCkuCisgICAgICAgICgrKykgUHJvdmlkZSBleGl0aW5nIGhhbmRsZSBhcyBmaXJzdCBwYXJhbWV0ZXIuCisgICAgICAgICgrKykgUHJvdmlkZSB3aGljaCBjYWxsYmFjayB3aWxsIGJlIHJlZ2lzdGVyZWQgdXNpbmcgb25lIHZhbHVlIGZyb20KKyAgICAgICAgICAgICBFWFRJX0NhbGxiYWNrSURUeXBlRGVmLgorICAgICAgICAoKyspIFByb3ZpZGUgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlci4KKworICAgICgjKSBHZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0IHVzaW5nIEhBTF9FWFRJX0dldFBlbmRpbmcoKS4KKworICAgICgjKSBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdXNpbmcgSEFMX0VYVElfR2V0UGVuZGluZygpLgorCisgICAgKCMpIEdlbmVyYXRlIHNvZnR3YXJlIGludGVycnVwdCB1c2luZyBIQUxfRVhUSV9HZW5lcmF0ZVNXSSgpLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJCisgICogQHsKKyAgKi8KKy8qKiBNSVNSQSBDOjIwMTIgZGV2aWF0aW9uIHJ1bGUgaGFzIGJlZW4gZ3JhbnRlZCBmb3IgZm9sbG93aW5nIHJ1bGU6CisgICogUnVsZS0xOC4xX2IgLSBNZWRpdW06IEFycmF5IGBFWFRJQ1InIDFzdCBzdWJzY3JpcHQgaW50ZXJ2YWwgWzAsN10gbWF5IGJlIG91dAorICAqIG9mIGJvdW5kcyBbMCwzXSBpbiBmb2xsb3dpbmcgQVBJIDoKKyAgKiBIQUxfRVhUSV9TZXRDb25maWdMaW5lCisgICogSEFMX0VYVElfR2V0Q29uZmlnTGluZQorICAqIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZQorICAqLworCisjaWZkZWYgSEFMX0VYVElfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBFWFRJX1ByaXZhdGVfQ29uc3RhbnRzIEVYVEkgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBFWFRJX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAweDA0dSAgIC8qIDB4MTA6IG9mZnNldCBiZXR3ZWVuIENQVSBJTVIvRU1SIHJlZ2lzdGVycyAqLworI2RlZmluZSBFWFRJX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAgICAweDA4dSAgIC8qIDB4MjA6IG9mZnNldCBiZXR3ZWVuIENQVSBSaXNpbmcvRmFsbGluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEVYVElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBkZWRpY2F0ZWQgRXh0aSBsaW5lLgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHBhcmFtICBwRXh0aUNvbmZpZyBQb2ludGVyIG9uIEVYVEkgY29uZmlndXJhdGlvbiB0byBiZSBzZXQuCisgICogQHJldHZhbCBIQUwgU3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0VYVElfU2V0Q29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCBFWFRJX0NvbmZpZ1R5cGVEZWYgKnBFeHRpQ29uZmlnKQoreworICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOworICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IGxpbmVwb3M7CisgIHVpbnQzMl90IG1hc2tsaW5lOworICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgLyogQ2hlY2sgbnVsbCBwb2ludGVyICovCisgIGlmICgoaGV4dGkgPT0gTlVMTCkgfHwgKHBFeHRpQ29uZmlnID09IE5VTEwpKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShwRXh0aUNvbmZpZy0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9NT0RFKHBFeHRpQ29uZmlnLT5Nb2RlKSk7CisKKyAgLyogQXNzaWduIGxpbmUgbnVtYmVyIHRvIGhhbmRsZSAqLworICBoZXh0aS0+TGluZSA9IHBFeHRpQ29uZmlnLT5MaW5lOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBsaW5lcG9zID0gKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiBDb25maWd1cmUgdHJpZ2dlcnMgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfVFJJR0dFUihwRXh0aUNvbmZpZy0+VHJpZ2dlcikpOworCisgICAgLyogQ29uZmlndXJlIHJpc2luZyB0cmlnZ2VyICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBNYXNrIG9yIHNldCBsaW5lICovCisgICAgaWYgKChwRXh0aUNvbmZpZy0+VHJpZ2dlciAmIEVYVElfVFJJR0dFUl9SSVNJTkcpICE9IDB4MDB1KQorICAgIHsKKyAgICAgIHJlZ3ZhbCB8PSBtYXNrbGluZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJlZ3ZhbCAmPSB+bWFza2xpbmU7CisgICAgfQorCisgICAgLyogU3RvcmUgcmlzaW5nIHRyaWdnZXIgbW9kZSAqLworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogQ29uZmlndXJlIGZhbGxpbmcgdHJpZ2dlciAqLworICAgIHJlZ2FkZHIgPSAoJkVYVEktPkZUU1IxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworICAgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgICAgLyogTWFzayBvciBzZXQgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPlRyaWdnZXIgJiBFWFRJX1RSSUdHRVJfRkFMTElORykgIT0gMHgwMHUpCisgICAgeworICAgICAgcmVndmFsIHw9IG1hc2tsaW5lOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgICB9CisKKyAgICAvKiBTdG9yZSBmYWxsaW5nIHRyaWdnZXIgbW9kZSAqLworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgLyogQ29uZmlndXJlIGdwaW8gcG9ydCBzZWxlY3Rpb24gaW4gY2FzZSBvZiBncGlvIGV4dGkgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX0dQSU8pID09IEVYVElfR1BJTykKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BPUlQocEV4dGlDb25maWctPkdQSU9TZWwpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsKKworICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICByZWd2YWwgJj0gfihTWVNDRkdfRVhUSUNSMV9FWFRJMCA8PCAoU1lTQ0ZHX0VYVElDUjFfRVhUSTFfUG9zICogKGxpbmVwb3MgJiAweDAzdSkpKTsKKyAgICAgIHJlZ3ZhbCB8PSAocEV4dGlDb25maWctPkdQSU9TZWwgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7CisgICAgICBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XSA9IHJlZ3ZhbDsKKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgaW50ZXJydXB0IG1vZGUgOiByZWFkIGN1cnJlbnQgbW9kZSAqLworICByZWdhZGRyID0gKCZFWFRJLT5JTVIxICsgKEVYVElfTU9ERV9PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgLyogTWFzayBvciBzZXQgbGluZSAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5Nb2RlICYgRVhUSV9NT0RFX0lOVEVSUlVQVCkgIT0gMHgwMHUpCisgIHsKKyAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgfQorCisgIC8qIFN0b3JlIGludGVycnVwdCBtb2RlICovCisgICpyZWdhZGRyID0gcmVndmFsOworCisgIC8qIFRoZSBldmVudCBtb2RlIGNhbm5vdCBiZSBjb25maWd1cmVkIGlmIHRoZSBsaW5lIGRvZXMgbm90IHN1cHBvcnQgaXQgKi8KKyAgYXNzZXJ0X3BhcmFtKCgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX0VWRU5UKSA9PSBFWFRJX0VWRU5UKSB8fCAoKHBFeHRpQ29uZmlnLT5Nb2RlICYgRVhUSV9NT0RFX0VWRU5UKSAhPSBFWFRJX01PREVfRVZFTlQpKTsKKyAgCisgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlIDogcmVhZCBjdXJyZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgIC8qIE1hc2sgb3Igc2V0IGxpbmUgKi8KKyAgaWYgKChwRXh0aUNvbmZpZy0+TW9kZSAmIEVYVElfTU9ERV9FVkVOVCkgIT0gMHgwMHUpCisgIHsKKyAgICByZWd2YWwgfD0gbWFza2xpbmU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVndmFsICY9IH5tYXNrbGluZTsKKyAgfQorCisgIC8qIFN0b3JlIGV2ZW50IG1vZGUgKi8KKyAgKnJlZ2FkZHIgPSByZWd2YWw7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCBjb25maWd1cmF0aW9uIG9mIGEgZGVkaWNhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgcEV4dGlDb25maWcgUG9pbnRlciBvbiBzdHJ1Y3R1cmUgdG8gc3RvcmUgRXh0aSBjb25maWd1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoKGhleHRpID09IE5VTEwpIHx8IChwRXh0aUNvbmZpZyA9PSBOVUxMKSkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKworICAvKiBTdG9yZSBoYW5kbGUgbGluZSBudW1iZXIgdG8gY29uZmlnaWd1cmF0aW9uIHN0cnVjdHVyZSAqLworICBwRXh0aUNvbmZpZy0+TGluZSA9IGhleHRpLT5MaW5lOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBsaW5lcG9zID0gKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiAxXSBHZXQgY29yZSBtb2RlIDogaW50ZXJydXB0ICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPklNUjEgKyAoRVhUSV9NT0RFX09GRlNFVCAqIG9mZnNldCkpOworICByZWd2YWwgPSAqcmVnYWRkcjsKKworICAvKiBDaGVjayBpZiBzZWxlY3RlZCBsaW5lIGlzIGVuYWJsZSAqLworICBpZiAoKHJlZ3ZhbCAmIG1hc2tsaW5lKSAhPSAweDAwdSkKKyAgeworICAgIHBFeHRpQ29uZmlnLT5Nb2RlID0gRVhUSV9NT0RFX0lOVEVSUlVQVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwRXh0aUNvbmZpZy0+TW9kZSA9IEVYVElfTU9ERV9OT05FOworICB9CisKKyAgLyogR2V0IGV2ZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICpyZWdhZGRyOworCisgIC8qIENoZWNrIGlmIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgIGlmICgocmVndmFsICYgbWFza2xpbmUpICE9IDB4MDB1KQorICB7CisgICAgcEV4dGlDb25maWctPk1vZGUgfD0gRVhUSV9NT0RFX0VWRU5UOworICB9CisKKyAgLyogMl0gR2V0IHRyaWdnZXIgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyA6IHJpc2luZyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQorICB7CisgICAgcmVnYWRkciA9ICgmRVhUSS0+UlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfUklTSU5HOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfTk9ORTsKKyAgICB9CisKKyAgICAvKiBHZXQgZmFsbGluZyBjb25maWd1cmF0aW9uICovCisgICAgcmVnYWRkciA9ICgmRVhUSS0+RlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKnJlZ2FkZHI7CisKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChyZWd2YWwgJiBtYXNrbGluZSkgIT0gMHgwMHUpCisgICAgeworICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgfD0gRVhUSV9UUklHR0VSX0ZBTExJTkc7CisgICAgfQorCisgICAgLyogR2V0IEdwaW8gcG9ydCBzZWxlY3Rpb24gZm9yIGdwaW8gbGluZXMgKi8KKyAgICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9HUElPKSA9PSBFWFRJX0dQSU8pCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfR1BJT19QSU4obGluZXBvcykpOworCisgICAgICByZWd2YWwgPSBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XTsKKyAgICAgIHBFeHRpQ29uZmlnLT5HUElPU2VsID0gKChyZWd2YWwgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqICgzdUwgLSAobGluZXBvcyAmIDB4MDN1KSkpKSA+PiAyNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwRXh0aUNvbmZpZy0+R1BJT1NlbCA9IDB4MDB1OworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBwRXh0aUNvbmZpZy0+VHJpZ2dlciA9IEVYVElfVFJJR0dFUl9OT05FOworICAgIHBFeHRpQ29uZmlnLT5HUElPU2VsID0gMHgwMHU7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgd2hvbGUgY29uZmlndXJhdGlvbiBvZiBhIGRlZGljYXRlZCBFeHRpIGxpbmUuCisgICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9DbGVhckNvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoaGV4dGkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKworICAvKiBjb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbGluZXBvcyA9IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spOworICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7CisKKyAgLyogMV0gQ2xlYXIgaW50ZXJydXB0IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+SU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7CisgICpyZWdhZGRyID0gcmVndmFsOworCisgIC8qIDJdIENsZWFyIGV2ZW50IG1vZGUgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+RU1SMSArIChFWFRJX01PREVfT0ZGU0VUICogb2Zmc2V0KSk7CisgIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIH5tYXNrbGluZSk7CisgICpyZWdhZGRyID0gcmVndmFsOworCisgIC8qIDNdIENsZWFyIHRyaWdnZXJzIGluIGNhc2Ugb2YgY29uZmlndXJhYmxlIGxpbmVzICovCisgIGlmICgoaGV4dGktPkxpbmUgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpCisgIHsKKyAgICByZWdhZGRyID0gKCZFWFRJLT5SVFNSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgICByZWd2YWwgPSAoKnJlZ2FkZHIgJiB+bWFza2xpbmUpOworICAgICpyZWdhZGRyID0gcmVndmFsOworCisgICAgcmVnYWRkciA9ICgmRVhUSS0+RlRTUjEgKyAoRVhUSV9DT05GSUdfT0ZGU0VUICogb2Zmc2V0KSk7CisgICAgcmVndmFsID0gKCpyZWdhZGRyICYgfm1hc2tsaW5lKTsKKyAgICAqcmVnYWRkciA9IHJlZ3ZhbDsKKworICAgIC8qIEdldCBHcGlvIHBvcnQgc2VsZWN0aW9uIGZvciBncGlvIGxpbmVzICovCisgICAgaWYgKChoZXh0aS0+TGluZSAmIEVYVElfR1BJTykgPT0gRVhUSV9HUElPKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsKKworICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICByZWd2YWwgJj0gfihTWVNDRkdfRVhUSUNSMV9FWFRJMCA8PCAoU1lTQ0ZHX0VYVElDUjFfRVhUSTFfUG9zICogKGxpbmVwb3MgJiAweDAzdSkpKTsKKyAgICAgIFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdID0gcmVndmFsOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBjYWxsYmFjayBmb3IgYSBkZWRpY2FhdGVkIEV4dGkgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBVc2VyIGNhbGxiYWNrIGlkZW50aWZpZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEBhcmcgQHJlZiBFWFRJX0NhbGxiYWNrSURUeXBlRGVmIHZhbHVlcy4KKyAgKiBAcGFyYW0gIHBQZW5kaW5nQ2JmbiBmdW5jdGlvbiBwb2ludGVyIHRvIGJlIHN0b3JlZCBhcyBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRVhUSV9SZWdpc3RlckNhbGxiYWNrKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGksIEVYVElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgdm9pZCAoKnBQZW5kaW5nQ2Jmbikodm9pZCkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgIHsKKyAgICBjYXNlICBIQUxfRVhUSV9DT01NT05fQ0JfSUQ6CisgICAgICBoZXh0aS0+UGVuZGluZ0NhbGxiYWNrID0gcFBlbmRpbmdDYmZuOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RvcmUgbGluZSBudW1iZXIgYXMgaGFuZGxlIHByaXZhdGUgZmllbGQuCisgICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEV4dGlMaW5lIEV4dGkgbGluZSBudW1iZXIuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgZnJvbSAwIHRvIEByZWYgRVhUSV9MSU5FX05CLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldEhhbmRsZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpLCB1aW50MzJfdCBFeHRpTGluZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShFeHRpTGluZSkpOworCisgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLworICBpZiAoaGV4dGkgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU3RvcmUgbGluZSBudW1iZXIgYXMgaGFuZGxlIHByaXZhdGUgZmllbGQgKi8KKyAgICBoZXh0aS0+TGluZSA9IEV4dGlMaW5lOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBFWFRJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgRVhUSSBJTyBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBFWFRJIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHJldHZhbCBub25lLgorICAqLwordm9pZCBIQUxfRVhUSV9JUlFIYW5kbGVyKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpCit7CisgIF9fSU8gdWludDMyX3QgKnJlZ2FkZHI7CisgIHVpbnQzMl90IHJlZ3ZhbDsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICAvKiBHZXQgcGVuZGluZyBiaXQgICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgcmVndmFsID0gKCpyZWdhZGRyICYgbWFza2xpbmUpOworCisgIGlmIChyZWd2YWwgIT0gMHgwMHUpCisgIHsKKyAgICAvKiBDbGVhciBwZW5kaW5nIGJpdCAqLworICAgICpyZWdhZGRyID0gbWFza2xpbmU7CisKKyAgICAvKiBDYWxsIGNhbGxiYWNrICovCisgICAgaWYgKGhleHRpLT5QZW5kaW5nQ2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBoZXh0aS0+UGVuZGluZ0NhbGxiYWNrKCk7CisgICAgfQorICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBHZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0IG9mIGEgZGVkaWNhdGVkIGxpbmUuCisgICogQHBhcmFtICBoZXh0aSBFeHRpIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEVkZ2UgU3BlY2lmeSB3aGljaCBwZW5kaW5nIGVkZ2UgYXMgdG8gYmUgY2hlY2tlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBFWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBzZXJpZXMuCisgICogQHJldHZhbCAxIGlmIGludGVycnVwdCBpcyBwZW5kaW5nIGVsc2UgMC4KKyAgKi8KK3VpbnQzMl90IEhBTF9FWFRJX0dldFBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9DT05GSUdfTElORShoZXh0aS0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9QRU5ESU5HX0VER0UoRWRnZSkpOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKGhleHRpLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBsaW5lcG9zID0gKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiBHZXQgcGVuZGluZyBiaXQgKi8KKyAgcmVnYWRkciA9ICgmRVhUSS0+UFIxICsgKEVYVElfQ09ORklHX09GRlNFVCAqIG9mZnNldCkpOworCisgIC8qIHJldHVybiAxIGlmIGJpdCBpcyBzZXQgZWxzZSAwICovCisgIHJlZ3ZhbCA9ICgoKnJlZ2FkZHIgJiBtYXNrbGluZSkgPj4gbGluZXBvcyk7CisgIHJldHVybiByZWd2YWw7Cit9CisKKworLyoqCisgICogQGJyaWVmICBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgb2YgYSBkZWRpY2F0ZWQgbGluZS4KKyAgKiBAcGFyYW0gIGhleHRpIEV4dGkgaGFuZGxlLgorICAqIEBwYXJhbSAgRWRnZSBTcGVjaWZ5IHdoaWNoIHBlbmRpbmcgZWRnZSBhcyB0byBiZSBjbGVhci4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBFWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBzZXJpZXMuCisgICogQHJldHZhbCBOb25lLgorICAqLwordm9pZCBIQUxfRVhUSV9DbGVhclBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkKK3sKKyAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKKyAgdWludDMyX3QgbWFza2xpbmU7CisgIHVpbnQzMl90IG9mZnNldDsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfUEVORElOR19FREdFKEVkZ2UpKTsKKworICAvKiBjb21wdXRlIGxpbmUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBsaW5lIG1hc2sgKi8KKyAgb2Zmc2V0ID0gKChoZXh0aS0+TGluZSAmIEVYVElfUkVHX01BU0spID4+IEVYVElfUkVHX1NISUZUKTsKKyAgbWFza2xpbmUgPSAoMXVMIDw8IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spKTsKKworICAvKiBHZXQgcGVuZGluZyByZWdpc3RlciBhZGRyZXNzICovCisgIHJlZ2FkZHIgPSAoJkVYVEktPlBSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKworICAvKiBDbGVhciBQZW5kaW5nIGJpdCAqLworICAqcmVnYWRkciA9ICBtYXNrbGluZTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgc29mdHdhcmUgaW50ZXJydXB0IGZvciBhIGRlZGljYXRlZCBsaW5lLgorICAqIEBwYXJhbSAgaGV4dGkgRXh0aSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lLgorICAqLwordm9pZCBIQUxfRVhUSV9HZW5lcmF0ZVNXSShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKQoreworICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOworICB1aW50MzJfdCBtYXNrbGluZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9DT05GSUdfTElORShoZXh0aS0+TGluZSkpOworCisgIC8qIGNvbXB1dGUgbGluZSByZWdpc3RlciBvZmZzZXQgYW5kIGxpbmUgbWFzayAqLworICBvZmZzZXQgPSAoKGhleHRpLT5MaW5lICYgRVhUSV9SRUdfTUFTSykgPj4gRVhUSV9SRUdfU0hJRlQpOworICBtYXNrbGluZSA9ICgxdUwgPDwgKGhleHRpLT5MaW5lICYgRVhUSV9QSU5fTUFTSykpOworCisgIHJlZ2FkZHIgPSAoJkVYVEktPlNXSUVSMSArIChFWFRJX0NPTkZJR19PRkZTRVQgKiBvZmZzZXQpKTsKKyAgKnJlZ2FkZHIgPSBtYXNrbGluZTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0VYVElfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzdjZTZiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfZmxhc2guYwpAQCAtMCwwICsxLDc0MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfZmxhc2guYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRkxBU0ggSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgaW50ZXJuYWwgRkxBU0ggbWVtb3J5OgorICAqICAgICAgICAgICArIFByb2dyYW0gb3BlcmF0aW9ucyBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBNZW1vcnkgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMKKyAgKgorIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEZMQVNIIHBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBUaGUgRmxhc2ggbWVtb3J5IGludGVyZmFjZSBtYW5hZ2VzIENQVSBBSEIgSS1Db2RlIGFuZCBELUNvZGUgYWNjZXNzZXMKKyAgICAgICB0byB0aGUgRmxhc2ggbWVtb3J5LiBJdCBpbXBsZW1lbnRzIHRoZSBlcmFzZSBhbmQgcHJvZ3JhbSBGbGFzaCBtZW1vcnkgb3BlcmF0aW9ucworICAgICAgIGFuZCB0aGUgcmVhZCBhbmQgd3JpdGUgcHJvdGVjdGlvbiBtZWNoYW5pc21zLgorCisgIFsuLl0gVGhlIEZsYXNoIG1lbW9yeSBpbnRlcmZhY2UgYWNjZWxlcmF0ZXMgY29kZSBleGVjdXRpb24gd2l0aCBhIHN5c3RlbSBvZiBpbnN0cnVjdGlvbgorICAgICAgIHByZWZldGNoIGFuZCBjYWNoZSBsaW5lcy4KKworICBbLi5dIFRoZSBGTEFTSCBtYWluIGZlYXR1cmVzIGFyZToKKyAgICAgICgrKSBGbGFzaCBtZW1vcnkgcmVhZCBvcGVyYXRpb25zCisgICAgICAoKykgRmxhc2ggbWVtb3J5IHByb2dyYW0vZXJhc2Ugb3BlcmF0aW9ucworICAgICAgKCspIFByb2dyYW0gYW5kIEVyYXNlIHN1c3BlbnNpb24KKyAgICAgICgrKSBSZWFkIC8gd3JpdGUgcHJvdGVjdGlvbnMgKDIgYXJlYXMgcGVyIGZlYXR1cmVzKQorICAgICAgKCspIENQVTIgU2VjdXJpdHkgYXJlYQorICAgICAgKCspIE9wdGlvbiBieXRlcyBwcm9ncmFtbWluZworICAgICAgKCspIFByZWZldGNoIG9uIENQVTEgSS1Db2RlIGFuZCBDUFUyIFMtYnVzCisgICAgICAoKykgMzIgaW5zdHJ1Y3Rpb24gY2FjaGUgbGluZXMgb2YgNCo2NCBiaXRzIG9uIEktQ29kZSBmb3IgQ1BVMQorICAgICAgKCspIDggZGF0YSBjYWNoZSBsaW5lcyBvZiA0KjY0IGJpdHMgb24gRC1Db2RlIGZvciBDUFUxCisgICAgICAoKykgNCBpbnN0cnVjdGlvbiBjYWNoZSBsaW5lcyBvZiAxKjY0IGJpdHMgb24gUy1idXMgZm9yIENQVTIKKyAgICAgICgrKSA0IGRhdGEgY2FjaGUgbGluZXMgb2YgMSo2NCBiaXRzIG9uIFMtQnVzIGZvciBDUFUyCisgICAgICAoKykgRXJyb3IgY29kZSBjb3JyZWN0aW9uIChFQ0MpIDogRGF0YSBpbiBmbGFzaCBhcmUgNzItYml0cyB3b3JkCisgICAgICAgICAgKDggYml0cyBhZGRlZCBwZXIgZG91YmxlIHdvcmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgYW5kIG1hY3JvcyB0byBjb25maWd1cmUgYW5kIHByb2dyYW0gdGhlIEZMQVNICisgICAgICBtZW1vcnkgb2YgYWxsIFNUTTMyV0J4eCBkZXZpY2VzLgorCisgICAgICAoIykgRmxhc2ggTWVtb3J5IElPIFByb2dyYW1taW5nIGZ1bmN0aW9uczoKKyAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0xvY2soKSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSBQcm9ncmFtIGZ1bmN0aW9uczogZG91YmxlIHdvcmQgYW5kIGZhc3QgcHJvZ3JhbSAoZnVsbCByb3cgcHJvZ3JhbW1pbmcpCisgICAgICAgICAgICgrKykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiBwcm9ncmFtbWluZzoKKyAgICAgICAgICAgICgrKyspIFBvbGxpbmcgbW9kZSB1c2luZyBIQUxfRkxBU0hfUHJvZ3JhbSgpIGZ1bmN0aW9uCisgICAgICAgICAgICAoKysrKSBJbnRlcnJ1cHQgbW9kZSB1c2luZyBIQUxfRkxBU0hfUHJvZ3JhbV9JVCgpIGZ1bmN0aW9uCisKKyAgICAgICgjKSBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50IGZ1bmN0aW9uczoKKyAgICAgICAgICAgKCsrKSBIYW5kbGUgRkxBU0ggaW50ZXJydXB0cyBieSBjYWxsaW5nIEhBTF9GTEFTSF9JUlFIYW5kbGVyKCkKKyAgICAgICAgICAgKCsrKSBDYWxsYmFjayBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aGVuIHRoZSBmbGFzaCBvcGVyYXRpb25zIGFyZSBmaW5pc2hlZCA6CisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0VuZE9mT3BlcmF0aW9uQ2FsbGJhY2soKSB3aGVuIGV2ZXJ5dGhpbmcgaXMgb2ssIG90aGVyd2lzZQorICAgICAgICAgICAgICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgICAgKCsrKSBHZXQgZXJyb3IgZmxhZyBzdGF0dXMgYnkgY2FsbGluZyBIQUxfR2V0RXJyb3IoKQorCisgICAgICAoIykgT3B0aW9uIGJ5dGVzIG1hbmFnZW1lbnQgZnVuY3Rpb25zIDoKKyAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIG9wdGlvbiBieXRlcyB1c2luZyBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX09CX0xvY2soKSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSBMYXVuY2ggdGhlIHJlbG9hZCBvZiB0aGUgb3B0aW9uIGJ5dGVzIHVzaW5nIEhBTF9GTEFTSF9PQl9MYXVuY2goKSBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGEgcmVzZXQgaXMgZ2VuZXJhdGVkCisKKyAgICBbLi5dCisgICAgICBJbiBhZGRpdGlvbiB0byB0aGVzZSBmdW5jdGlvbnMsIHRoaXMgZHJpdmVyIGluY2x1ZGVzIGEgc2V0IG9mIG1hY3JvcyBhbGxvd2luZworICAgICAgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoKKyAgICAgICAoKykgU2V0IHRoZSBsYXRlbmN5CisgICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBwcmVmZXRjaCBidWZmZXIKKyAgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgdGhlIHN1c3BlbmQgcHJvZ3JhbSBvciBlcmFzZSByZXF1ZXN0CisgICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBJbnN0cnVjdGlvbiBjYWNoZSBhbmQgdGhlIERhdGEgY2FjaGUKKyAgICAgICAoKykgUmVzZXQgdGhlIEluc3RydWN0aW9uIGNhY2hlIGFuZCB0aGUgRGF0YSBjYWNoZQorICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgRmxhc2ggaW50ZXJydXB0cworICAgICAgICgrKSBNb25pdG9yIHRoZSBGbGFzaCBmbGFncyBzdGF0dXMKKworIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIIEZMQVNICisgICogQGJyaWVmIEZMQVNIIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9GTEFTSF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTEFTSF9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIEZMQVNIX05CX0RPVUJMRV9XT1JEU19JTl9ST1cgIDY0CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hfUHJpdmF0ZV9WYXJpYWJsZXMgRkxBU0ggUHJpdmF0ZSBWYXJpYWJsZXMKKyAqIEB7CisgKi8KKy8qKgorICAqIEBicmllZiAgVmFyaWFibGUgdXNlZCBmb3IgUHJvZ3JhbS9FcmFzZSBzZWN0b3JzIHVuZGVyIGludGVycnVwdGlvbgorICAqLworRkxBU0hfUHJvY2Vzc1R5cGVEZWYgcEZsYXNoID0gey5Mb2NrID0gSEFMX1VOTE9DS0VELCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlByb2NlZHVyZU9uR29pbmcgPSAwVSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRyZXNzID0gMFUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuUGFnZSA9IDBVLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk5iUGFnZXNUb0VyYXNlID0gMFUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTEFTSF9Qcml2YXRlX0Z1bmN0aW9ucyBGTEFTSCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgICAgICAgICAgRkxBU0hfUHJvZ3JhbV9Eb3VibGVXb3JkKHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpOworc3RhdGljIHZvaWQgICAgICAgICAgRkxBU0hfUHJvZ3JhbV9GYXN0KHVpbnQzMl90IEFkZHJlc3MsIHVpbnQzMl90IERhdGFBZGRyZXNzKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTEFTSCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgUHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIFByb2dyYW1taW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBQcm9ncmFtbWluZyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgRkxBU0gKKyAgICBwcm9ncmFtIG9wZXJhdGlvbnMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBkb3VibGUgd29yZCBvciBmYXN0IHByb2dyYW0gb2YgYSByb3cgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIEJlZm9yZSBhbnkgb3BlcmF0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byBjaGVjayB0aGVyZSBpcyBubyBvcGVyYXRpb24gc3VzcGVuZGVkCisgICogICAgICAgICBieSBjYWxsIEhBTF9GTEFTSEV4X0lzT3BlcmF0aW9uU3VzcGVuZGVkKCkKKyAgKiBAcGFyYW0gIFR5cGVQcm9ncmFtIEluZGljYXRlIHRoZSB3YXkgdG8gcHJvZ3JhbSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzCisgICogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVFlQRV9QUk9HUkFNCisgICogQHBhcmFtICBBZGRyZXNzIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgRGF0YSBTcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZAorICAqICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBkYXRhIGZvciB0aGUgZG91YmxlIHdvcmQgcHJvZ3JhbSBhbmQgdGhlIGFkZHJlc3Mgd2hlcmUKKyAgKiAgICAgICAgICAgICAgICBhcmUgc3RvcmVkIHRoZSBkYXRhIGZvciB0aGUgcm93IGZhc3QgcHJvZ3JhbS4KKyAgKgorICAqIEByZXR2YWwgSEFMX1N0YXR1c1R5cGVEZWYgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW0odWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FERFJfQUxJR05FRF82NEJJVFMoQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFkZHJlc3MpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIFJlc2V0IGVycm9yIGNvZGUgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIFZlcmlmeSB0aGF0IG5leHQgb3BlcmF0aW9uIGNhbiBiZSBwcm9jZWVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaWYgKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBQcm9ncmFtIGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgKi8KKyAgICAgIEZMQVNIX1Byb2dyYW1fRG91YmxlV29yZChBZGRyZXNzLCBEYXRhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfRkFTVF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBGYXN0IHByb2dyYW0gYSA2NCByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworICAgICAgRkxBU0hfUHJvZ3JhbV9GYXN0KEFkZHJlc3MsICh1aW50MzJfdClEYXRhKTsKKyAgICB9CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICAgIC8qIElmIHRoZSBwcm9ncmFtIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIGRpc2FibGUgdGhlIFBHIG9yIEZTVFBHIEJpdCAqLworICAgIENMRUFSX0JJVChGTEFTSC0+Q1IsIFR5cGVQcm9ncmFtKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworCisgIC8qIHJldHVybiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQcm9ncmFtIGRvdWJsZSB3b3JkIG9yIGZhc3QgcHJvZ3JhbSBvZiBhIHJvdyBhdCBhIHNwZWNpZmllZCBhZGRyZXNzIHdpdGggaW50ZXJydXB0IGVuYWJsZWQuCisgICogQG5vdGUgICBCZWZvcmUgYW55IG9wZXJhdGlvbiwgaXQgaXMgcG9zc2libGUgdG8gY2hlY2sgdGhlcmUgaXMgbm8gb3BlcmF0aW9uIHN1c3BlbmRlZAorICAqICAgICAgICAgYnkgY2FsbCBIQUxfRkxBU0hFeF9Jc09wZXJhdGlvblN1c3BlbmRlZCgpCisgICogQHBhcmFtICBUeXBlUHJvZ3JhbSBJbmRpY2F0ZSB0aGUgd2F5IHRvIHByb2dyYW0gYXQgYSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRkxBU0hfVFlQRV9QUk9HUkFNCisgICogQHBhcmFtICBBZGRyZXNzIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB0byBiZSBwcm9ncmFtbWVkLgorICAqIEBwYXJhbSAgRGF0YSBTcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgcHJvZ3JhbW1lZAorICAqICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBkYXRhIGZvciB0aGUgZG91YmxlIHdvcmQgcHJvZ3JhbSBhbmQgdGhlIGFkZHJlc3Mgd2hlcmUKKyAgKiAgICAgICAgICAgICAgICBhcmUgc3RvcmVkIHRoZSBkYXRhIGZvciB0aGUgcm93IGZhc3QgcHJvZ3JhbS4KKyAgKgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX1Byb2dyYW1fSVQodWludDMyX3QgVHlwZVByb2dyYW0sIHVpbnQzMl90IEFkZHJlc3MsIHVpbnQ2NF90IERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfVFlQRVBST0dSQU0oVHlwZVByb2dyYW0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0FERFJfQUxJR05FRF82NEJJVFMoQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUFJPR1JBTV9BRERSRVNTKEFkZHJlc3MpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIFJlc2V0IGVycm9yIGNvZGUgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIFZlcmlmeSB0aGF0IG5leHQgb3BlcmF0aW9uIGNhbiBiZSBwcm9jZWVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgIT0gSEFMX09LKQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSygmcEZsYXNoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIElSUSBoYW5kbGVyICovCisgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBUeXBlUHJvZ3JhbTsKKyAgICBwRmxhc2guQWRkcmVzcyA9IEFkZHJlc3M7CisKKyAgICAvKiBFbmFibGUgRW5kIG9mIE9wZXJhdGlvbiBhbmQgRXJyb3IgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0VOQUJMRV9JVChGTEFTSF9JVF9FT1AgfCBGTEFTSF9JVF9PUEVSUiB8IEZMQVNIX0lUX0VDQ0MpOworCisgICAgaWYgKFR5cGVQcm9ncmFtID09IEZMQVNIX1RZUEVQUk9HUkFNX0RPVUJMRVdPUkQpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19GTEFTSF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBQcm9ncmFtIGRvdWJsZS13b3JkICg2NC1iaXQpIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MgKi8KKyAgICAgIEZMQVNIX1Byb2dyYW1fRG91YmxlV29yZChBZGRyZXNzLCBEYXRhKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfRkFTVF9QUk9HUkFNX0FERFJFU1MoQWRkcmVzcykpOworCisgICAgICAvKiBGYXN0IHByb2dyYW0gYSA2NCByb3cgZG91YmxlLXdvcmQgKDY0LWJpdCkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyAqLworICAgICAgRkxBU0hfUHJvZ3JhbV9GYXN0KEFkZHJlc3MsICh1aW50MzJfdClEYXRhKTsKKyAgICB9CisgIH0KKworICAvKiByZXR1cm4gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBIYW5kbGUgRkxBU0ggaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTEFTSF9JUlFIYW5kbGVyKHZvaWQpCit7CisgIHVpbnQzMl90IHBhcmFtID0gMHhGRkZGRkZGRlU7CisgIHVpbnQzMl90IGVycm9yOworCisgIC8qIFNhdmUgZmxhc2ggZXJyb3JzLiBPbmx5IEVDQyBkZXRlY3Rpb24gY2FuIGJlIGNoZWNrZWQgaGVyZSBhcyBFQ0NDCisgICAgIGdlbmVyYXRlcyBOTUkgKi8KKyAgZXJyb3IgPSAoRkxBU0gtPlNSICYgRkxBU0hfRkxBR19TUl9FUlJPUik7CisKKyAgLyogQ2xlYXIgQ3VycmVudCBvcGVyYXRpb24gKi8KKyAgQ0xFQVJfQklUKEZMQVNILT5DUiwgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcpOworICBlcnJvciB8PSAoRkxBU0gtPkVDQ1IgJiBGTEFTSF9GTEFHX0VDQ0MpOworCisgIC8qIEFdIFNldCBwYXJhbWV0ZXIgZm9yIHVzZXIgb3IgZXJyb3IgY2FsbGJhY2tzICovCisgIC8qIGNoZWNrIG9wZXJhdGlvbiB3YXMgYSBwcm9ncmFtIG9yIGVyYXNlICovCisgIGlmICgocEZsYXNoLlByb2NlZHVyZU9uR29pbmcgJiAoRkxBU0hfVFlQRVBST0dSQU1fRE9VQkxFV09SRCB8IEZMQVNIX1RZUEVQUk9HUkFNX0ZBU1QpKSAhPSAwVSkKKyAgeworICAgIC8qIHJldHVybiBhZHJlc3MgYmVpbmcgcHJvZ3JhbW1lZCAqLworICAgIHBhcmFtID0gcEZsYXNoLkFkZHJlc3M7CisgIH0KKyAgZWxzZSBpZiAoKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nICYgKEZMQVNIX1RZUEVFUkFTRV9NQVNTRVJBU0UgfCBGTEFTSF9UWVBFRVJBU0VfUEFHRVMpKSAhPSAwVSkKKyAgeworICAgIC8qIHJldHVybiBwYWdlIG51bWJlciBiZWluZyBlcmFzZWQgKDAgZm9yIG1hc3MgZXJhc2UpICovCisgICAgcGFyYW0gPSBwRmxhc2guUGFnZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBObyBQcm9jZWR1cmUgb24tZ29pbmcgKi8KKyAgICAvKiBOb3RoaW5nIHRvIGRvLCBidXQgY2hlY2sgZXJyb3IgaWYgYW55ICovCisgIH0KKworICAvKiBCXSBDaGVjayBlcnJvcnMgKi8KKyAgaWYgKGVycm9yICE9IDBVKQorICB7CisgICAgLypTYXZlIHRoZSBlcnJvciBjb2RlKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlIHw9IGVycm9yOworCisgICAgLyogY2xlYXIgZXJyb3IgZmxhZ3MgKi8KKyAgICBfX0hBTF9GTEFTSF9DTEVBUl9GTEFHKGVycm9yKTsKKworICAgIC8qU3RvcCB0aGUgcHJvY2VkdXJlIG9uZ29pbmcqLworICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfVFlQRU5PTkU7CisKKyAgICAvKiBFcnJvciBjYWxsYmFjayAqLworICAgIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHBhcmFtKTsKKyAgfQorCisgIC8qIENdIENoZWNrIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAqLworICBpZiAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19FT1ApKQorICB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworCisgICAgaWYgKHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID09IEZMQVNIX1RZUEVFUkFTRV9QQUdFUykKKyAgICB7CisgICAgICAvKiBOYiBvZiBwYWdlcyB0byBlcmFzZWQgY2FuIGJlIGRlY3JlYXNlZCAqLworICAgICAgcEZsYXNoLk5iUGFnZXNUb0VyYXNlLS07CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBwYWdlcyB0byBlcmFzZSovCisgICAgICBpZiAocEZsYXNoLk5iUGFnZXNUb0VyYXNlICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBJbmNyZW1lbnQgcGFnZSBudW1iZXIgKi8KKyAgICAgICAgcEZsYXNoLlBhZ2UrKzsKKyAgICAgICAgRkxBU0hfUGFnZUVyYXNlKHBGbGFzaC5QYWdlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm8gbW9yZSBwYWdlcyB0byBlcmFzZTogc3RvcCBlcmFzZSBwYWdlcyBwcm9jZWR1cmUgKi8KKyAgICAgICAgcEZsYXNoLlByb2NlZHVyZU9uR29pbmcgPSBGTEFTSF9UWVBFTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qU3RvcCB0aGUgb25nb2luZyBwcm9jZWR1cmUgKi8KKyAgICAgIHBGbGFzaC5Qcm9jZWR1cmVPbkdvaW5nID0gRkxBU0hfVFlQRU5PTkU7CisgICAgfQorCisgICAgLyogVXNlciBjYWxsYmFjayAqLworICAgIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHBhcmFtKTsKKyAgfQorCisgIGlmIChwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9PSBGTEFTSF9UWVBFTk9ORSkKKyAgeworICAgIC8qIERpc2FibGUgRW5kIG9mIE9wZXJhdGlvbiBhbmQgRXJyb3IgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX0ZMQVNIX0RJU0FCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfT1BFUlIgfCBGTEFTSF9JVF9FQ0NDKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBGTEFTSCBlbmQgb2Ygb3BlcmF0aW9uIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nIHByb2NlZHVyZQorICAqICAgICAgICAgICAgICAgICAgTWFzcyBFcmFzZTogMAorICAqICAgICAgICAgICAgICAgICAgUGFnZSBFcmFzZTogUGFnZSB3aGljaCBoYXMgYmVlbiBlcmFzZWQKKyAgKiAgICAgICAgICAgICAgICAgIFByb2dyYW06IEFkZHJlc3Mgd2hpY2ggd2FzIHNlbGVjdGVkIGZvciBkYXRhIHByb2dyYW0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChSZXR1cm5WYWx1ZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GTEFTSF9FbmRPZk9wZXJhdGlvbkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRkxBU0ggb3BlcmF0aW9uIGVycm9yIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIFJldHVyblZhbHVlIFRoZSB2YWx1ZSBzYXZlZCBpbiB0aGlzIHBhcmFtZXRlciBkZXBlbmRzIG9uIHRoZSBvbmdvaW5nIHByb2NlZHVyZQorICAqICAgICAgICAgICAgICAgICBNYXNzIEVyYXNlOiAwCisgICogICAgICAgICAgICAgICAgIFBhZ2UgRXJhc2U6IFBhZ2UgbnVtYmVyIHdoaWNoIHJldHVybmVkIGFuIGVycm9yCisgICogICAgICAgICAgICAgICAgIFByb2dyYW06IEFkZHJlc3Mgd2hpY2ggd2FzIHNlbGVjdGVkIGZvciBkYXRhIHByb2dyYW0KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrKHVpbnQzMl90IFJldHVyblZhbHVlKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChSZXR1cm5WYWx1ZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GTEFTSF9PcGVyYXRpb25FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRkxBU0hfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgTWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBGTEFTSAorICAgIG1lbW9yeSBvcGVyYXRpb25zLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFVubG9jayB0aGUgRkxBU0ggY29udHJvbCByZWdpc3RlciBhY2Nlc3MuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfVW5sb2NrKHZvaWQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKSAhPSAwVSkKKyAgeworICAgIC8qIEF1dGhvcml6ZSB0aGUgRkxBU0ggUmVnaXN0ZXJzIGFjY2VzcyAqLworICAgIFdSSVRFX1JFRyhGTEFTSC0+S0VZUiwgRkxBU0hfS0VZMSk7CisgICAgV1JJVEVfUkVHKEZMQVNILT5LRVlSLCBGTEFTSF9LRVkyKTsKKworICAgIC8qIHZlcmlmeSBGbGFzaCBpcyB1bmxvY2sgKi8KKyAgICBpZiAoUkVBRF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9MT0NLKSAhPSAwVSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBMb2NrIHRoZSBGTEFTSCBjb250cm9sIHJlZ2lzdGVyIGFjY2Vzcy4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSF9Mb2NrKHZvaWQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBTZXQgdGhlIExPQ0sgQml0IHRvIGxvY2sgdGhlIEZMQVNIIFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyAgLyogQE5vdGUgIFRoZSBsb2NrIGFuZCB1bmxvY2sgcHJvY2VkdXJlIGlzIGRvbmUgb25seSB1c2luZyBDUiByZWdpc3RlcnMgZXZlbiBmcm9tIENQVTIgKi8KKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0xPQ0spOworCisgIC8qIHZlcmlmeSBGbGFzaCBpcyBsb2NrZWQgKi8KKyAgaWYgKFJFQURfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfTE9DSykgPT0gMFUpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVubG9jayB0aGUgRkxBU0ggT3B0aW9uIEJ5dGVzIFJlZ2lzdGVycyBhY2Nlc3MuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKHZvaWQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAvKiBATm90ZSBUaGUgbG9jayBhbmQgdW5sb2NrIHByb2NlZHVyZSBpcyBkb25lIG9ubHkgdXNpbmcgQ1IgcmVnaXN0ZXJzIGV2ZW4gZnJvbSBDUFUyICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVExPQ0spICE9IDBVKQorICB7CisgICAgLyogQXV0aG9yaXplcyB0aGUgT3B0aW9uIEJ5dGUgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgKi8KKyAgICBXUklURV9SRUcoRkxBU0gtPk9QVEtFWVIsIEZMQVNIX09QVEtFWTEpOworICAgIFdSSVRFX1JFRyhGTEFTSC0+T1BUS0VZUiwgRkxBU0hfT1BUS0VZMik7CisKKyAgICAvKiB2ZXJpZnkgb3B0aW9uIGJ5dGVzIGFyZSB1bmxvY2tlZCAqLworICAgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVExPQ0spID09IDBVKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9PSzsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIExvY2sgdGhlIEZMQVNIIE9wdGlvbiBCeXRlcyBSZWdpc3RlcnMgYWNjZXNzLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIX09CX0xvY2sodm9pZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFNldCB0aGUgT1BUTE9DSyBCaXQgdG8gbG9jayB0aGUgRkxBU0ggT3B0aW9uIEJ5dGUgUmVnaXN0ZXJzIGFjY2VzcyAqLworICAvKiBATm90ZSBUaGUgbG9jayBhbmQgdW5sb2NrIHByb2NlZHVyZSBpcyBkb25lIG9ubHkgdXNpbmcgQ1IgcmVnaXN0ZXJzIGV2ZW4gZnJvbSBDUFUyICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PUFRMT0NLKTsKKworICAvKiB2ZXJpZnkgb3B0aW9uIGJ5dGVzIGFyZSBsb2NrICovCisgIGlmIChSRUFEX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX09QVExPQ0spID09IDBVKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBMYXVuY2ggdGhlIG9wdGlvbiBieXRlIGxvYWRpbmcuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKHZvaWQpCit7CisgIC8qIFNldCB0aGUgYml0IHRvIGZvcmNlIHRoZSBvcHRpb24gYnl0ZSByZWxvYWRpbmcgKi8KKyAgLyogVGhlIE9CIGxhdW5jaCBpcyBkb25lIGZyb20gdGhlIHNhbWUgcmVnaXN0ZXIgZWl0aGVyIGZyb20gQ1BVMSBvciBDUFUyICovCisgIFNFVF9CSVQoRkxBU0gtPkNSLCBGTEFTSF9DUl9PQkxfTEFVTkNIKTsKKworICAvKiBXZSBzaG91bGQgbm90IHJlYWNoIGhlcmUgOiBPcHRpb24gYnl0ZSBsYXVuY2ggZ2VuZXJhdGVzIE9wdGlvbiBieXRlIHJlc2V0CisgICAgIHNvIHJldHVybiBlcnJvciAqLworICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSBFcnJvcnMgb2YgdGhlIEZMQVNIIHBlcmlwaGVyYWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzcGVjaWZpYyBGTEFTSCBlcnJvciBmbGFnLgorICAqIEByZXR2YWwgRkxBU0hfRXJyb3JDb2RlIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfTk9ORSBObyBlcnJvciBzZXQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfT1AgRkxBU0ggT3BlcmF0aW9uIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX1BST0cgRkxBU0ggUHJvZ3JhbW1pbmcgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfV1JQIEZMQVNIIFdyaXRlIHByb3RlY3Rpb24gZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfUEdBIEZMQVNIIFByb2dyYW1taW5nIGFsaWdubWVudCBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9TSVogRkxBU0ggU2l6ZSBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9QR1MgRkxBU0ggUHJvZ3JhbW1pbmcgc2VxdWVuY2UgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRkxBU0hfRVJST1JfTUlTIEZMQVNIIEZhc3QgcHJvZ3JhbW1pbmcgZGF0YSBtaXNzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZMQVNIX0VSUk9SX0ZBU1QgRkxBU0ggRmFzdCBwcm9ncmFtbWluZyBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9SRCBGTEFTSCBSZWFkIFByb3RlY3Rpb24gZXJyb3IgKFBDUk9QKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9PUFRWIEZMQVNIIE9wdGlvbiB2YWxpZGl0eSBlcnJvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTEFTSF9FUlJPUl9FQ0NEIEZMQVNIIHR3byBFQ0MgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZAorICAqLwordWludDMyX3QgSEFMX0ZMQVNIX0dldEVycm9yKHZvaWQpCit7CisgIHJldHVybiBwRmxhc2guRXJyb3JDb2RlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgRkxBU0hfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdhaXQgZm9yIGEgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgVGltZW91dCBNYXhpbXVtIGZsYXNoIG9wZXJhdGlvbiB0aW1lb3V0CisgICogQHJldHZhbCBIQUxfU3RhdHVzVHlwZURlZiBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbih1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCBlcnJvcjsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IGZvciB0aGUgRkxBU0ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGJ5IHBvbGxpbmcgb24gQlVTWSBmbGFnIHRvIGJlIHJlc2V0LgorICAgICBFdmVuIGlmIHRoZSBGTEFTSCBvcGVyYXRpb24gZmFpbHMsIHRoZSBCVVNZIGZsYWcgd2lsbCBiZSByZXNldCBhbmQgYW4gZXJyb3IKKyAgICAgZmxhZyB3aWxsIGJlIHNldCAqLworICB3aGlsZSAoX19IQUxfRkxBU0hfR0VUX0ZMQUcoRkxBU0hfRkxBR19CU1kpKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSBUaW1lb3V0KQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBjaGVjayBmbGFzaCBlcnJvcnMuIE9ubHkgRUNDIGNvcnJlY3Rpb24gY2FuIGJlIGNoZWNrZWQgaGVyZSBhcyBFQ0NECisgICAgICBnZW5lcmF0ZXMgTk1JICovCisgIGVycm9yID0gRkxBU0gtPlNSOworCisgIC8qIENoZWNrIEZMQVNIIEVuZCBvZiBPcGVyYXRpb24gZmxhZyAqLworICBpZiAoKGVycm9yICYgRkxBU0hfRkxBR19FT1ApICE9IDBVKQorICB7CisgICAgLyogQ2xlYXIgRkxBU0ggRW5kIG9mIE9wZXJhdGlvbiBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX0ZMQVNIX0NMRUFSX0ZMQUcoRkxBU0hfRkxBR19FT1ApOworICB9CisKKyAgLyogTm93IHVwZGF0ZSBlcnJvciB2YXJpYWJsZSB0byBvbmx5IGVycm9yIHZhbHVlICovCisgIGVycm9yICY9IEZMQVNIX0ZMQUdfU1JfRVJST1I7CisKKyAgLyogVXBkYXRlIGVycm9yIHdpdGggRUNDIGVycm9yIHZhbHVlICovCisgIGVycm9yIHw9IChGTEFTSC0+RUNDUiAmIEZMQVNIX0ZMQUdfRUNDQyk7CisKKyAgLyogY2xlYXIgZXJyb3IgZmxhZ3MgKi8KKyAgX19IQUxfRkxBU0hfQ0xFQVJfRkxBRyhlcnJvcik7CisKKyAgaWYgKGVycm9yICE9IDBVKQorICB7CisgICAgLypTYXZlIHRoZSBlcnJvciBjb2RlKi8KKyAgICBwRmxhc2guRXJyb3JDb2RlID0gZXJyb3I7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogV2FpdCBmb3IgY29udHJvbCByZWdpc3RlciB0byBiZSB3cml0dGVuICovCisgIHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0NGR0JTWSkpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49IFRpbWVvdXQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgQWRkcmVzcyBTcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGEgU3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQodWludDMyX3QgQWRkcmVzcywgdWludDY0X3QgRGF0YSkKK3sKKyAgLyogU2V0IFBHIGJpdCAqLworICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfUEcpOworCisgIC8qIFByb2dyYW0gZmlyc3Qgd29yZCAqLworICAqKHVpbnQzMl90ICopQWRkcmVzcyA9ICh1aW50MzJfdClEYXRhOworCisgIC8qIEJhcnJpZXIgdG8gZW5zdXJlIHByb2dyYW1taW5nIGlzIHBlcmZvcm1lZCBpbiAyIHN0ZXBzLCBpbiByaWdodCBvcmRlcgorICAgIChpbmRlcGVuZGVudGx5IG9mIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiZWhhdmlvcikgKi8KKyAgX19JU0IoKTsKKworICAvKiBQcm9ncmFtIHNlY29uZCB3b3JkICovCisgICoodWludDMyX3QgKikoQWRkcmVzcyArIDRVKSA9ICh1aW50MzJfdCkoRGF0YSA+PiAzMlUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZhc3QgcHJvZ3JhbSBhIDMyIHJvdyBkb3VibGUtd29yZCAoNjQtYml0KSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzLgorICAqIEBwYXJhbSAgQWRkcmVzcyBTcGVjaWZpZXMgdGhlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIERhdGFBZGRyZXNzIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgZGF0YSBhcmUgc3RvcmVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIF9fUkFNX0ZVTkMgdm9pZCBGTEFTSF9Qcm9ncmFtX0Zhc3QodWludDMyX3QgQWRkcmVzcywgdWludDMyX3QgRGF0YUFkZHJlc3MpCit7CisgIHVpbnQ4X3Qgcm93X2luZGV4ID0gKDIgKiBGTEFTSF9OQl9ET1VCTEVfV09SRFNfSU5fUk9XKTsKKyAgX19JTyB1aW50MzJfdCAqZGVzdF9hZGRyID0gKF9fSU8gdWludDMyX3QgKilBZGRyZXNzOworICBfX0lPIHVpbnQzMl90ICpzcmNfYWRkciA9IChfX0lPIHVpbnQzMl90ICopRGF0YUFkZHJlc3M7CisgIHVpbnQzMl90IHByaW1hc2tfYml0OworCisgIC8qIFNldCBGU1RQRyBiaXQgKi8KKyAgU0VUX0JJVChGTEFTSC0+Q1IsIEZMQVNIX0NSX0ZTVFBHKTsKKworICAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uOiByb3cgcHJvZ3JhbW1pbmcgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiA3IG1zICovCisgIHByaW1hc2tfYml0ID0gX19nZXRfUFJJTUFTSygpOworICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgLyogUHJvZ3JhbSB0aGUgZG91YmxlIHdvcmQgb2YgdGhlIHJvdyAqLworICBkbworICB7CisgICAgKmRlc3RfYWRkciA9ICpzcmNfYWRkcjsKKyAgICBkZXN0X2FkZHIrKzsKKyAgICBzcmNfYWRkcisrOworICAgIHJvd19pbmRleC0tOworICB9CisgIHdoaWxlIChyb3dfaW5kZXggIT0gMFUpOworCisgIC8qIHdhaXQgZm9yIEJTWSBpbiBvcmRlciB0byBiZSBzdXJlIHRoYXQgZmxhc2ggb3BlcmF0aW9uIGlzIGVuZGVkIGJlZm9yZQorICAgICBhbGxvd2luZyBwcmVmZXRjaCBpbiBmbGFzaC4gVGltZW91dCBkb2VzIG5vdCByZXR1cm4gc3RhdHVzLCBhcyBpdCB3aWxsCisgICAgIGJlIGFueXdheSBkb25lIGxhdGVyICovCisgIHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfRkxBRyhGTEFTSF9GTEFHX0JTWSkgIT0gMFUpCisgIHsKKyAgfQorCisgIC8qIEV4aXQgY3JpdGljYWwgc2VjdGlvbjogcmVzdG9yZSBwcmV2aW91cyBwcmlvcml0eSBtYXNrICovCisgIF9fc2V0X1BSSU1BU0socHJpbWFza19iaXQpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0ZMQVNIX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9mbGFzaF9leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfZmxhc2hfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk3NmJiCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfZmxhc2hfZXguYwpAQCAtMCwwICsxLDEwNTggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2ZsYXNoX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIEZMQVNIIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEZMQVNIIGV4dGVuZGVkIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgcHJvZ3JhbW1pbmcgb3BlcmF0aW9ucyBmdW5jdGlvbnMKKyAgKgorIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICMjIyMjIEZsYXNoIEV4dGVuZGVkIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0gQ29tcGFyaW5nIHRvIG90aGVyIHByZXZpb3VzIGRldmljZXMsIHRoZSBGTEFTSCBpbnRlcmZhY2UgZm9yIFNUTTMyV0J4eAorICAgICAgIGRldmljZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzCisKKyAgICAgICAoKykgQ2FwYWNpdHkgdXAgdG8gMSBNYnl0ZSB3aXRoIHNpbmdsZSBiYW5rIGFyY2hpdGVjdHVyZSBzdXBwb3J0aW5nIHJlYWQtd2hpbGUtd3JpdGUKKyAgICAgICAgICAgY2FwYWJpbGl0eSAoUldXKQorICAgICAgICgrKSBTaW5nbGUgYmFuayBtZW1vcnkgb3JnYW5pemF0aW9uCisgICAgICAgKCspIFBDUk9QIHByb3RlY3Rpb24KKyAgICAgICAoKykgV1JQIHByb3RlY3Rpb24KKyAgICAgICAoKykgQ1BVMiBTZWN1cml0eSBhcmVhCisgICAgICAgKCspIFByb2dyYW0gRXJhc2UgU3VzcGVuZCBmZWF0dXJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGlzIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgdG8gY29uZmlndXJlIGFuZCBwcm9ncmFtIHRoZSBGTEFTSCBtZW1vcnkKKyAgICAgICBvZiBhbGwgU1RNMzJXQnh4IGRldmljZXMuIEl0IGluY2x1ZGVzCisgICAgICAoIykgRmxhc2ggTWVtb3J5IEVyYXNlIGZ1bmN0aW9uczoKKyAgICAgICAgICAgKCsrKSBMb2NrIGFuZCBVbmxvY2sgdGhlIEZMQVNIIGludGVyZmFjZSB1c2luZyBIQUxfRkxBU0hfVW5sb2NrKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIX0xvY2soKSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSBFcmFzZSBmdW5jdGlvbjogRXJhc2UgcGFnZSwgZXJhc2UgYWxsIHNlY3RvcnMKKyAgICAgICAgICAgKCsrKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIGVyYXNlIDoKKyAgICAgICAgICAgICAoKysrKSBQb2xsaW5nIE1vZGUgdXNpbmcgSEFMX0ZMQVNIRXhfRXJhc2UoKQorICAgICAgICAgICAgICgrKyspIEludGVycnVwdCBNb2RlIHVzaW5nIEhBTF9GTEFTSEV4X0VyYXNlX0lUKCkKKworICAgICAgKCMpIE9wdGlvbiBCeXRlcyBQcm9ncmFtbWluZyBmdW5jdGlvbjogVXNlIEhBTF9GTEFTSEV4X09CUHJvZ3JhbSgpIHRvIDoKKyAgICAgICAgKCsrKSBTZXQvUmVzZXQgdGhlIHdyaXRlIHByb3RlY3Rpb24gKHBlciA0IEtCeXRlKQorICAgICAgICAoKyspIFNldCB0aGUgUmVhZCBwcm90ZWN0aW9uIExldmVsCisgICAgICAgICgrKykgUHJvZ3JhbSB0aGUgdXNlciBPcHRpb24gQnl0ZXMKKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIFBDUk9QIHByb3RlY3Rpb24gKHBlciAyIEtCeXRlKQorICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgSVBDQyBCdWZmZXIgc3RhcnQgQWRkcmVzcworICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgQ1BVMiBib290IHJlZ2lvbiBhbmQgcmVzZXQgdmVjdG9yIHN0YXJ0IEFkZHJlc3MKKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIEZsYXNoIGFuZCBTUkFNMiBzZWN1cmUgYXJlYQorCisgICAgICAoIykgR2V0IE9wdGlvbiBCeXRlcyBDb25maWd1cmF0aW9uIGZ1bmN0aW9uOiBVc2UgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoKSB0byA6CisgICAgICAgICgrKykgR2V0IHRoZSB2YWx1ZSBvZiBhIHdyaXRlIHByb3RlY3Rpb24gYXJlYQorICAgICAgICAoKyspIEtub3cgaWYgdGhlIHJlYWQgcHJvdGVjdGlvbiBpcyBhY3RpdmF0ZWQKKyAgICAgICAgKCsrKSBHZXQgdGhlIHZhbHVlIG9mIHRoZSB1c2VyIE9wdGlvbiBCeXRlcworICAgICAgICAoKyspIEdldCB0aGUgdmFsdWUgb2YgYSBQQ1JPUCBhcmVhCisgICAgICAgICgrKykgR2V0IHRoZSBJUENDIEJ1ZmZlciBzdGFydCBBZGRyZXNzCisgICAgICAgICgrKykgR2V0IHRoZSBDUFUyIGJvb3QgcmVnaW9uIGFuZCByZXNldCB2ZWN0b3Igc3RhcnQgQWRkcmVzcworICAgICAgICAoKyspIEdldCB0aGUgRmxhc2ggYW5kIFNSQU0yIHNlY3VyZSBhcmVhCisKKyAgICAgICgjKSBGbGFzaCBTdXNwZW5kLCBBbGxvdyBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgU3VzcGVuZCBvciBBbGxvdyBuZXcgcHJvZ3JhbSBvciBlcmFzZSBvcGVyYXRpb24gcmVxdWVzdCB1c2luZyBIQUxfRkxBU0hFeF9TdXNwZW5kT3BlcmF0aW9uKCkgYW5kCisgICAgICAgICAgICAgICAgSEFMX0ZMQVNIRXhfQWxsb3dPcGVyYXRpb24oKSBmdW5jdGlvbnMKKworICAgICAgKCMpIENoZWNrIGlzIGZsYXNoIGNvbnRlbnQgaXMgZW1wdHkgb3Igbm90IHVzaW5nIEhBTF9GTEFTSEV4X0ZsYXNoRW1wdHlDaGVjaygpLgorICAgICAgICAgIGFuZCBtb2RpZnkgdGhpcyBzZXR0aW5nIChmb3IgZmxhc2ggbG9hZGVyIHB1cnBvc2UgZS5nLikgdXNpbmcKKyAgICAgICAgICBIQUxfRkxBU0hFeF9Gb3JjZUZsYXNoRW1wdHkoKS4KKworIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZMQVNIRXggRkxBU0hFeAorICAqIEBicmllZiBGTEFTSCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMgRkxBU0hFeCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIHZvaWQgICAgICAgICAgICAgIEZMQVNIX01hc3NFcmFzZSh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9BY2tub3dsZWRnZVBhZ2VFcmFzZSh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9GbHVzaENhY2hlcyh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9PQl9XUlBDb25maWcodWludDMyX3QgV1JQQXJlYSwgdWludDMyX3QgV1JQU3RhcnRPZmZzZXQsIHVpbnQzMl90IFdSRFBFbmRPZmZzZXQpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgIEZMQVNIX09CX09wdHJDb25maWcodWludDMyX3QgVXNlclR5cGUsIHVpbnQzMl90IFVzZXJDb25maWcsIHVpbnQzMl90IFJEUExldmVsKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9PQl9QQ1JPUDFBQ29uZmlnKHVpbnQzMl90IFBDUk9QQ29uZmlnLCB1aW50MzJfdCBQQ1JPUDFBU3RhcnRBZGRyLCB1aW50MzJfdCBQQ1JPUDFBRW5kQWRkcik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgRkxBU0hfT0JfUENST1AxQkNvbmZpZyh1aW50MzJfdCBQQ1JPUDFCU3RhcnRBZGRyLCB1aW50MzJfdCBQQ1JPUDFCRW5kQWRkcik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgRkxBU0hfT0JfSVBDQ0J1ZmZlckFkZHJDb25maWcodWludDMyX3QgSVBDQ0RhdGFCdWZBZGRyKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9PQl9TZWN1cmVDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQlBhcmFtKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9PQl9HZXRXUlAodWludDMyX3QgV1JQQXJlYSwgdWludDMyX3QgKldSUFN0YXJ0T2Zmc2V0LCB1aW50MzJfdCAqV1JEUEVuZE9mZnNldCk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgRkxBU0hfT0JfR2V0UkRQKHZvaWQpOworc3RhdGljIHVpbnQzMl90ICAgICAgICAgIEZMQVNIX09CX0dldFVzZXIodm9pZCk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgRkxBU0hfT0JfR2V0UENST1AodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUFFbmRBZGRyLCB1aW50MzJfdCAqUENST1AxQlN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUJFbmRBZGRyKTsKK3N0YXRpYyB1aW50MzJfdCAgICAgICAgICBGTEFTSF9PQl9HZXRJUENDQnVmZmVyQWRkcih2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICBGTEFTSF9PQl9HZXRTZWN1cmVNZW1vcnlDb25maWcodWludDMyX3QgKlNlY3VyZUZsYXNoU3RhcnRBZGRyLCB1aW50MzJfdCAqU2VjdXJlUkFNMmFTdGFydEFkZHIsIHVpbnQzMl90ICpTZWN1cmVSQU0yYlN0YXJ0QWRkciwgdWludDMyX3QgKlNlY3VyZU1vZGUpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgIEZMQVNIX09CX0dldEMyQm9vdFJlc2V0Q29uZmlnKHVpbnQzMl90ICpDMkJvb3RSZXNldFZlY3RBZGRyLCB1aW50MzJfdCAqQzJCb290UmVzZXRSZWdpb24pOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1Byb2NlZWRXcml0ZU9wZXJhdGlvbih2b2lkKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRkxBU0hFeF9FeHBvcnRlZF9GdW5jdGlvbnMgRkxBU0ggRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTEFTSEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIEV4dGVuZGVkIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgcHJvZ3JhbW1pbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIEV4dGVuZGVkIEZMQVNICisgICAgcHJvZ3JhbW1pbmcgb3BlcmF0aW9ucyBPcGVyYXRpb25zLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGEgbWFzcyBlcmFzZSBvciBlcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlcy4KKyAgKiBAbm90ZSAgIEJlZm9yZSBhbnkgb3BlcmF0aW9uLCBpdCBpcyBwb3NzaWJsZSB0byBjaGVjayB0aGVyZSBpcyBubyBvcGVyYXRpb24gc3VzcGVuZGVkCisgICogICAgICAgICBieSBjYWxsIEhBTF9GTEFTSEV4X0lzT3BlcmF0aW9uU3VzcGVuZGVkKCkKKyAgKiBAcGFyYW1baW5dICBwRXJhc2VJbml0IFBvaW50ZXIgdG8gYW4gQHJlZiBGTEFTSF9FcmFzZUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVyYXNpbmcuCisgICogQHBhcmFtW291dF0gIFBhZ2VFcnJvciBQb2ludGVyIHRvIHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgIGluZm9ybWF0aW9uIG9uIGZhdWx0eSBwYWdlIGluIGNhc2Ugb2YgZXJyb3IgKDB4RkZGRkZGRkYgbWVhbnMgdGhhdCBhbGwKKyAgKiAgICAgICAgIHRoZSBwYWdlcyBoYXZlIGJlZW4gY29ycmVjdGx5IGVyYXNlZCkKKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X0VyYXNlKEZMQVNIX0VyYXNlSW5pdFR5cGVEZWYgKnBFcmFzZUluaXQsIHVpbnQzMl90ICpQYWdlRXJyb3IpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgaW5kZXg7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX1RZUEVFUkFTRShwRXJhc2VJbml0LT5UeXBlRXJhc2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIC8qIFJlc2V0IGVycm9yIGNvZGUgKi8KKyAgcEZsYXNoLkVycm9yQ29kZSA9IEhBTF9GTEFTSF9FUlJPUl9OT05FOworCisgIC8qIFZlcmlmeSB0aGF0IG5leHQgb3BlcmF0aW9uIGNhbiBiZSBwcm9jZWVkICovCisgIHN0YXR1cyA9IEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKEZMQVNIX1RJTUVPVVRfVkFMVUUpOworCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgaWYgKHBFcmFzZUluaXQtPlR5cGVFcmFzZSA9PSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFKQorICAgIHsKKyAgICAgIC8qIE1hc3MgZXJhc2UgdG8gYmUgZG9uZSAqLworICAgICAgRkxBU0hfTWFzc0VyYXNlKCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlZCAqLworICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAgIC8qIElmIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgb3IgaW50ZXJydXB0ZWQsIG5vIG5lZWQgdG8gY2xlYXIgdGhlIE1hc3MgRXJhc2UgQml0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKkluaXRpYWxpemF0aW9uIG9mIFBhZ2VFcnJvciB2YXJpYWJsZSovCisgICAgICAqUGFnZUVycm9yID0gMHhGRkZGRkZGRlU7CisKKyAgICAgIGZvciAoaW5kZXggPSBwRXJhc2VJbml0LT5QYWdlOyBpbmRleCA8IChwRXJhc2VJbml0LT5QYWdlICsgcEVyYXNlSW5pdC0+TmJQYWdlcyk7IGluZGV4KyspCisgICAgICB7CisgICAgICAgIC8qIFN0YXJ0IGVyYXNlIHBhZ2UgKi8KKyAgICAgICAgRkxBU0hfUGFnZUVyYXNlKGluZGV4KTsKKworICAgICAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBzdG9wIGVyYXNlIHByb2NlZHVyZSBhbmQgcmV0dXJuIHRoZSBmYXVsdHkgYWRkcmVzcyAqLworICAgICAgICAgICpQYWdlRXJyb3IgPSBpbmRleDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBvcGVyYXRpb24gaXMgY29tcGxldGVkIG9yIGludGVycnVwdGVkLCBkaXNhYmxlIHRoZSBQYWdlIEVyYXNlIEJpdCAqLworICAgICAgRkxBU0hfQWNrbm93bGVkZ2VQYWdlRXJhc2UoKTsKKyAgICB9CisKKyAgICAvKiBGbHVzaCB0aGUgY2FjaGVzIHRvIGJlIHN1cmUgb2YgdGhlIGRhdGEgY29uc2lzdGVuY3kgKi8KKyAgICBGTEFTSF9GbHVzaENhY2hlcygpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBQZXJmb3JtIGEgbWFzcyBlcmFzZSBvciBlcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlcyB3aXRoIGludGVycnVwdCBlbmFibGVkLgorICAqIEBub3RlICAgQmVmb3JlIGFueSBvcGVyYXRpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrIHRoZXJlIGlzIG5vIG9wZXJhdGlvbiBzdXNwZW5kZWQKKyAgKiAgICAgICAgIGJ5IGNhbGwgSEFMX0ZMQVNIRXhfSXNPcGVyYXRpb25TdXNwZW5kZWQoKQorICAqIEBwYXJhbSAgcEVyYXNlSW5pdCBQb2ludGVyIHRvIGFuIEByZWYgRkxBU0hfRXJhc2VJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlcmFzaW5nLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZMQVNIRXhfRXJhc2VfSVQoRkxBU0hfRXJhc2VJbml0VHlwZURlZiAqcEVyYXNlSW5pdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9UWVBFRVJBU0UocEVyYXNlSW5pdC0+VHlwZUVyYXNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSygmcEZsYXNoKTsKKworICAvKiBSZXNldCBlcnJvciBjb2RlICovCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBzYXZlIHByb2NlZHVyZSBmb3IgaW50ZXJydXB0IHRyZWF0bWVudCAqLworICBwRmxhc2guUHJvY2VkdXJlT25Hb2luZyA9IHBFcmFzZUluaXQtPlR5cGVFcmFzZTsKKworICAvKiBWZXJpZnkgdGhhdCBuZXh0IG9wZXJhdGlvbiBjYW4gYmUgcHJvY2VlZCAqLworICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKworICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soJnBGbGFzaCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRW5hYmxlIEVuZCBvZiBPcGVyYXRpb24gYW5kIEVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9GTEFTSF9FTkFCTEVfSVQoRkxBU0hfSVRfRU9QIHwgRkxBU0hfSVRfT1BFUlIpOworCisgICAgaWYgKHBFcmFzZUluaXQtPlR5cGVFcmFzZSA9PSBGTEFTSF9UWVBFRVJBU0VfTUFTU0VSQVNFKQorICAgIHsKKyAgICAgIC8qIFNldCBQYWdlIHRvIDAgZm9yIEludGVycnVwdCBjYWxsYmFjayBtYW5hZ21lbnQgKi8KKyAgICAgIHBGbGFzaC5QYWdlID0gMDsKKworICAgICAgLyogUHJvY2VlZCB0byBNYXNzIEVyYXNlICovCisgICAgICBGTEFTSF9NYXNzRXJhc2UoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEVyYXNlIGJ5IHBhZ2UgdG8gYmUgZG9uZSAqLworICAgICAgcEZsYXNoLk5iUGFnZXNUb0VyYXNlID0gcEVyYXNlSW5pdC0+TmJQYWdlczsKKyAgICAgIHBGbGFzaC5QYWdlID0gcEVyYXNlSW5pdC0+UGFnZTsKKworICAgICAgLypFcmFzZSAxc3QgcGFnZSBhbmQgd2FpdCBmb3IgSVQgKi8KKyAgICAgIEZMQVNIX1BhZ2VFcmFzZShwRXJhc2VJbml0LT5QYWdlKTsKKyAgICB9CisgIH0KKworICAvKiByZXR1cm4gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvZ3JhbSBPcHRpb24gYnl0ZXMuCisgICogQHBhcmFtICBwT0JJbml0IFBvaW50ZXIgdG8gYW4gQHJlZiBGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9ncmFtbWluZy4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSBhbnkgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQorICAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICAqIEBub3RlICAgTmV3IG9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IG9ubHkKKyAgKiAgICAgICAgIC0gYWZ0ZXIgYW4gb3B0aW9uIGJ5dGVzIGxhdW5jaCB0aHJvdWdoIHRoZSBjYWxsIG9mIEByZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCgpCisgICogICAgICAgICAtIGEgUG93ZXIgT24gUmVzZXQKKyAgKiAgICAgICAgIC0gYW4gZXhpdCBmcm9tIFN0YW5kYnkgb3IgU2h1dGRvd24gbW9kZS4KKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTEFTSEV4X09CUHJvZ3JhbShGTEFTSF9PQlByb2dyYW1Jbml0VHlwZURlZiAqcE9CSW5pdCkKK3sKKyAgdWludDMyX3Qgb3B0cjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PUFRJT05CWVRFKHBPQkluaXQtPk9wdGlvblR5cGUpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKCZwRmxhc2gpOworCisgIHBGbGFzaC5FcnJvckNvZGUgPSBIQUxfRkxBU0hfRVJST1JfTk9ORTsKKworICAvKiBXcml0ZSBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9XUlApICE9IDBVKQorICB7CisgICAgLyogQ29uZmlndXJlIG9mIFdyaXRlIHByb3RlY3Rpb24gb24gdGhlIHNlbGVjdGVkIGFyZWEgKi8KKyAgICBGTEFTSF9PQl9XUlBDb25maWcocE9CSW5pdC0+V1JQQXJlYSwgcE9CSW5pdC0+V1JQU3RhcnRPZmZzZXQsIHBPQkluaXQtPldSUEVuZE9mZnNldCk7CisgIH0KKworICAvKiBPcHRpb24gcmVnaXN0ZXIgKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgKE9QVElPTkJZVEVfUkRQIHwgT1BUSU9OQllURV9VU0VSKSkgPT0gKE9QVElPTkJZVEVfUkRQIHwgT1BUSU9OQllURV9VU0VSKSkKKyAgeworICAgIC8qIEZ1bGx5IG1vZGlmeSBPUFRSIHJlZ2lzdGVyIHdpdGggUkRQICYgdXNlciBkYXRhcyAqLworICAgIEZMQVNIX09CX09wdHJDb25maWcocE9CSW5pdC0+VXNlclR5cGUsIHBPQkluaXQtPlVzZXJDb25maWcsIHBPQkluaXQtPlJEUExldmVsKTsKKyAgfQorICBlbHNlIGlmICgocE9CSW5pdC0+T3B0aW9uVHlwZSAmIE9QVElPTkJZVEVfUkRQKSAhPSAwVSkKKyAgeworICAgIC8qIE9ubHkgbW9kaWZ5IFJEUCBzbyBnZXQgY3VycmVudCB1c2VyIGRhdGEgKi8KKyAgICBvcHRyID0gRkxBU0hfT0JfR2V0VXNlcigpOworCisgICAgLyogUmVtb3ZlIEJPUiBMRVZFTCBVc2VyIFR5cGUqLworICAgIG9wdHIgJj0gfk9CX1VTRVJfQk9SX0xFVjsKKworICAgIEZMQVNIX09CX09wdHJDb25maWcob3B0ciwgb3B0ciwgcE9CSW5pdC0+UkRQTGV2ZWwpOworICB9CisgIGVsc2UgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9VU0VSKSAhPSAwVSkKKyAgeworICAgIC8qIE9ubHkgbW9kaWZ5IHVzZXIgc28gZ2V0IGN1cnJlbnQgUkRQIGxldmVsICovCisgICAgb3B0ciA9IEZMQVNIX09CX0dldFJEUCgpOworICAgIEZMQVNIX09CX09wdHJDb25maWcocE9CSW5pdC0+VXNlclR5cGUsIHBPQkluaXQtPlVzZXJDb25maWcsIG9wdHIpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERvIE5vdGhpbmcgKi8KKyAgfQorCisgIC8qIFBDUk9QIENvbmZpZ3VyYXRpb24gKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9QQ1JPUCkgIT0gMFUpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19PQl9QQ1JPUF9DT05GSUcocE9CSW5pdC0+UENST1BDb25maWcpKTsKKworICAgIGlmICgocE9CSW5pdC0+UENST1BDb25maWcgJiAoT0JfUENST1BfWk9ORV9BIHwgT0JfUENST1BfUkRQX0VSQVNFKSkgIT0gMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBab25lIDFBIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uICovCisgICAgICBGTEFTSF9PQl9QQ1JPUDFBQ29uZmlnKHBPQkluaXQtPlBDUk9QQ29uZmlnLCBwT0JJbml0LT5QQ1JPUDFBU3RhcnRBZGRyLCBwT0JJbml0LT5QQ1JPUDFBRW5kQWRkcik7CisgICAgfQorCisgICAgaWYgKChwT0JJbml0LT5QQ1JPUENvbmZpZyAmIE9CX1BDUk9QX1pPTkVfQikgIT0gMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBab25lIDFCIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uICovCisgICAgICBGTEFTSF9PQl9QQ1JPUDFCQ29uZmlnKHBPQkluaXQtPlBDUk9QMUJTdGFydEFkZHIsIHBPQkluaXQtPlBDUk9QMUJFbmRBZGRyKTsKKyAgICB9CisgIH0KKworICAvKiAgU2VjdXJlIG1vZGUgYW5kIENQVTIgQm9vdCBWZWN0b3IgKi8KKyAgaWYgKChwT0JJbml0LT5PcHRpb25UeXBlICYgKE9QVElPTkJZVEVfU0VDVVJFX01PREUgfCBPUFRJT05CWVRFX0MyX0JPT1RfVkVDVCkpICE9IDBVKQorICB7CisgICAgLyogU2V0IHRoZSBzZWN1cmUgZmxhc2ggYW5kIFNSQU0gbWVtb3J5IHN0YXJ0IGFkZHJlc3MgKi8KKyAgICBGTEFTSF9PQl9TZWN1cmVDb25maWcocE9CSW5pdCk7CisgIH0KKworICAvKiBJUENDIG1haWxib3ggZGF0YSBidWZmZXIgYWRkcmVzcyAqLworICBpZiAoKHBPQkluaXQtPk9wdGlvblR5cGUgJiBPUFRJT05CWVRFX0lQQ0NfQlVGX0FERFIpICE9IDBVKQorICB7CisgICAgLyogQ29uZmlndXJlIHRoZSBJUENDIGRhdGEgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICBGTEFTSF9PQl9JUENDQnVmZmVyQWRkckNvbmZpZyhwT0JJbml0LT5JUENDZGF0YUJ1ZkFkZHIpOworICB9CisKKyAgLyogUHJvY2VlZCB0aGUgT0IgV3JpdGUgT3BlcmF0aW9uICovCisgIHN0YXR1cyA9IEZMQVNIX09CX1Byb2NlZWRXcml0ZU9wZXJhdGlvbigpOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKCZwRmxhc2gpOworCisgIC8qIHJldHVybiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIE9wdGlvbiBieXRlcyBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICAgd2FybmluZzogdGhpcyBBUEkgb25seSByZWFkIGZsYXNoIHJlZ2lzdGVyLCBpdCBkb2VzIG5vdCByZWZsZWN0IGFueQorICAqICAgICAgICAgY2hhbmdlIHRoYXQgd291bGQgaGF2ZSBiZWVuIHByb2dyYW1tZWQgYmV0d2VlbiBwcmV2aW91cyBPcHRpb24gYnl0ZQorICAqICAgICAgICAgbG9hZGluZyBhbmQgY3VycmVudCBjYWxsLgorICAqIEBwYXJhbSAgcE9CSW5pdCBQb2ludGVyIHRvIGFuIEByZWYgRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlCisgICogICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBUaGUgZmllbGRzIHBPQkluaXQtPldSUEFyZWEgYW5kCisgICogICAgICAgICAgICAgICAgICBwT0JJbml0LT5QQ1JPUENvbmZpZyBzaG91bGQgaW5kaWNhdGUgd2hpY2ggYXJlYSBpcyByZXF1ZXN0ZWQKKyAgKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgV1JQIGFuZCBQQ1JPUC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfT0JHZXRDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQkluaXQpCit7CisgIHBPQkluaXQtPk9wdGlvblR5cGUgPSBPUFRJT05CWVRFX0FMTDsKKworICBpZiAoKHBPQkluaXQtPldSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkgfHwgKHBPQkluaXQtPldSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQikpCisgIHsKKyAgICAvKiBHZXQgd3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgYXJlYSAqLworICAgIEZMQVNIX09CX0dldFdSUChwT0JJbml0LT5XUlBBcmVhLCAmKHBPQkluaXQtPldSUFN0YXJ0T2Zmc2V0KSwgJihwT0JJbml0LT5XUlBFbmRPZmZzZXQpKTsKKyAgfQorCisgIC8qIEdldCBSZWFkIHByb3RlY3Rpb24gbGV2ZWwgKi8KKyAgcE9CSW5pdC0+UkRQTGV2ZWwgPSBGTEFTSF9PQl9HZXRSRFAoKTsKKworICAvKiBHZXQgdGhlIHVzZXIgb3B0aW9uIGJ5dGVzICovCisgIHBPQkluaXQtPlVzZXJDb25maWcgPSBGTEFTSF9PQl9HZXRVc2VyKCk7CisgIHBPQkluaXQtPlVzZXJUeXBlID0gT0JfVVNFUl9BTEw7CisKKyAgLyogR2V0IHRoZSBab25lIDFBIGFuZCAxQiBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbiAqLworICBGTEFTSF9PQl9HZXRQQ1JPUCgmKHBPQkluaXQtPlBDUk9QQ29uZmlnKSwgJihwT0JJbml0LT5QQ1JPUDFBU3RhcnRBZGRyKSwgJihwT0JJbml0LT5QQ1JPUDFBRW5kQWRkciksICYocE9CSW5pdC0+UENST1AxQlN0YXJ0QWRkciksICYocE9CSW5pdC0+UENST1AxQkVuZEFkZHIpKTsKKyAgcE9CSW5pdC0+UENST1BDb25maWcgfD0gKE9CX1BDUk9QX1pPTkVfQSB8IE9CX1BDUk9QX1pPTkVfQik7CisKKyAgLyogR2V0IHRoZSBJUENDIHN0YXJ0IEFkZHJlc3MgKi8KKyAgcE9CSW5pdC0+SVBDQ2RhdGFCdWZBZGRyID0gRkxBU0hfT0JfR2V0SVBDQ0J1ZmZlckFkZHIoKTsKKworICAvKiBHZXQgdGhlIFNlY3VyZSBGbGFzaCBzdGFydCBhZGRyZXNzLCBTZWN1cmUgQmFja3VwIFJBTTJhIHN0YXJ0IGFkZHJlc3MsIFNlY3VyZSBub24tQmFja3VwIFJBTTJiIHN0YXJ0IGFkZHJlc3MgYW5kIHRoZSBTZWN1cml0eSBNb2RlLCAqLworICBGTEFTSF9PQl9HZXRTZWN1cmVNZW1vcnlDb25maWcoJihwT0JJbml0LT5TZWN1cmVGbGFzaFN0YXJ0QWRkciksICYocE9CSW5pdC0+U2VjdXJlUkFNMmFTdGFydEFkZHIpLCAmKHBPQkluaXQtPlNlY3VyZVJBTTJiU3RhcnRBZGRyKSwgJihwT0JJbml0LT5TZWN1cmVNb2RlKSk7CisKKyAgLyogR2V0IHRoZSBNMCsgU2VjdXJlIEJvb3QgcmVzZXQgdmVjdG9yIGFuZCBTZWN1cmUgQm9vdCBtZW1vcnkgc2VsZWN0aW9uICovCisgIEZMQVNIX09CX0dldEMyQm9vdFJlc2V0Q29uZmlnKCYocE9CSW5pdC0+QzJTZWN1cmVCb290VmVjdEFkZHIpLCAmKHBPQkluaXQtPkMyQm9vdFJlZ2lvbikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZsYXNoIEVtcHR5IGNoZWNrCisgICogQG5vdGUgICBUaGlzIEFQSSBjaGVja3MgaWYgZmlyc3QgbG9jYXRpb24gaW4gRmxhc2ggaXMgcHJvZ3JhbW1lZCBvciBub3QuCisgICogICAgICAgICBUaGlzIGNoZWNrIGlzIGRvbmUgb25jZSBieSBPcHRpb24gQnl0ZSBMb2FkZXIuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX1BST0dfTk9UX0VNUFRZIDFzdCBsb2NhdGlvbiBpbiBGbGFzaCBpcyBwcm9ncmFtbWVkCisgICogICAgICAgICBAYXJnIEByZWYgRkxBU0hfUFJPR19FTVBUWSAxc3QgbG9jYXRpb24gaW4gRmxhc2ggaXMgZW1wdHkKKyAgKi8KK3VpbnQzMl90IEhBTF9GTEFTSEV4X0ZsYXNoRW1wdHlDaGVjayh2b2lkKQoreworICByZXR1cm4gKFJFQURfQklUKEZMQVNILT5BQ1IsIEZMQVNIX0FDUl9FTVBUWSkpOworfQorCisKKy8qKgorICAqIEBicmllZiAgRm9yY2UgRW1wdHkgY2hlY2sgdmFsdWUuCisgICogQG5vdGUgICBBbGxvd3MgdG8gbW9kaWZ5IHByb2dyYW0gZW1wdHkgY2hlY2sgdmFsdWUgaW4gb3JkZXIgdG8gZm9yY2UgdGhpcworICAqICAgICAgICAgaW5mb3JtYXRpb24gaW4gRmxhc2ggSW50ZXJmYWNlLCBmb3IgYWxsIG5leHQgcmVzZXQgdGhhdCBkbyBub3QgbGF1bmNoCisgICogICAgICAgICBPcHRpb24gQnl0ZSBMb2FkZXIuCisgICogQHBhcmFtICBGbGFzaEVtcHR5IFNwZWNpZmllcyB0aGUgZW1wdHkgY2hlY2sgdmFsdWUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZMQVNIX1BST0dfTk9UX0VNUFRZIDFzdCBsb2NhdGlvbiBpbiBGbGFzaCBpcyBwcm9ncmFtbWVkCisgICogICAgICAgICAgICBAYXJnIEByZWYgRkxBU0hfUFJPR19FTVBUWSAxc3QgbG9jYXRpb24gaW4gRmxhc2ggaXMgZW1wdHkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZMQVNIRXhfRm9yY2VGbGFzaEVtcHR5KHVpbnQzMl90IEZsYXNoRW1wdHkpCit7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9FTVBUWV9DSEVDSyhGbGFzaEVtcHR5KSk7CisKKyAgTU9ESUZZX1JFRyhGTEFTSC0+QUNSLCBGTEFTSF9BQ1JfRU1QVFksIEZsYXNoRW1wdHkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN1c3BlbmQgbmV3IHByb2dyYW0gb3IgZXJhc2Ugb3BlcmF0aW9uIHJlcXVlc3QuCisgICogQG5vdGUgICBBbnkgbmV3IEZsYXNoIHByb2dyYW0gYW5kIGVyYXNlIG9wZXJhdGlvbiBvbiBib3RoIENQVSBzaWRlIHdpbGwgYmUgc3VzcGVuZGVkCisgICogICAgICAgICB1bnRpbCB0aGlzIGJpdCBhbmQgdGhlIHNhbWUgYml0IGluIEZsYXNoIENQVTIgYWNjZXNzIGNvbnRyb2wgcmVnaXN0ZXIgKEZMQVNIX0MyQUNSKSBhcmUKKyAgKiAgICAgICAgIGNsZWFyZWQuIFRoZSBQRVNEIGJpdCBpbiBib3RoIHRoZSBGbGFzaCBzdGF0dXMgcmVnaXN0ZXIgKEZMQVNIX1NSKSBhbmQgRmxhc2gKKyAgKiAgICAgICAgIENQVTIgc3RhdHVzIHJlZ2lzdGVyIChGTEFTSF9DMlNSKSByZWdpc3RlciB3aWxsIGJlIHNldCB3aGVuIGF0IGxlYXN0IG9uZSBQRVMKKyAgKiAgICAgICAgIGJpdCBpbiBGTEFTSF9BQ1Igb3IgRkxBU0hfQzJBQ1IgaXMgc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9TdXNwZW5kT3BlcmF0aW9uKHZvaWQpCit7CisgIFNFVF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BFUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWxsb3cgbmV3IHByb2dyYW0gb3IgZXJhc2Ugb3BlcmF0aW9uIHJlcXVlc3QuCisgICogQG5vdGUgICBBbnkgbmV3IEZsYXNoIHByb2dyYW0gYW5kIGVyYXNlIG9wZXJhdGlvbiBvbiBib3RoIENQVSBzaWRlIHdpbGwgYmUgYWxsb3dlZAorICAqICAgICAgICAgdW50aWwgb25lIG9mIHRoaXMgYml0IG9yIHRoZSBzYW1lIGJpdCBpbiBGbGFzaCBDUFUyIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyIChGTEFTSF9DMkFDUikgaXMKKyAgKiAgICAgICAgIHNldC4gVGhlIFBFU0QgYml0IGluIGJvdGggdGhlIEZsYXNoIHN0YXR1cyByZWdpc3RlciAoRkxBU0hfU1IpIGFuZCBGbGFzaAorICAqICAgICAgICAgQ1BVMiBzdGF0dXMgcmVnaXN0ZXIgKEZMQVNIX0MyU1IpIHJlZ2lzdGVyIHdpbGwgYmUgY2xlYXIgd2hlbiBib3RoIFBFUworICAqICAgICAgICAgYml0IGluIEZMQVNIX0FDUiBvciBGTEFTSF9DMkFDUiBpcyBjbGVhcmVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfRkxBU0hFeF9BbGxvd09wZXJhdGlvbih2b2lkKQoreworICBDTEVBUl9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX1BFUyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgbmV3IHByb2dyYW0gb3IgZXJhc2Ugb3BlcmF0aW9uIHJlcXVlc3QgZnJvbSBDUFUxIG9yIENQVTIgaXMgc3VzcGVuZGVkCisgICogQG5vdGUgICBBbnkgbmV3IEZsYXNoIHByb2dyYW0gYW5kIGVyYXNlIG9wZXJhdGlvbiBvbiBib3RoIENQVSBzaWRlIHdpbGwgYmUgYWxsb3dlZAorICAqICAgICAgICAgdW50aWwgb25lIG9mIHRoaXMgYml0IG9yIHRoZSBzYW1lIGJpdCBpbiBGbGFzaCBDUFUyIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyIChGTEFTSF9DMkFDUikgaXMKKyAgKiAgICAgICAgIHNldC4gVGhlIFBFU0QgYml0IGluIGJvdGggdGhlIEZsYXNoIHN0YXR1cyByZWdpc3RlciAoRkxBU0hfU1IpIGFuZCBGbGFzaAorICAqICAgICAgICAgQ1BVMiBzdGF0dXMgcmVnaXN0ZXIgKEZMQVNIX0MyU1IpIHJlZ2lzdGVyIHdpbGwgYmUgY2xlYXJlZCB3aGVuIGJvdGggUEVTCisgICogICAgICAgICBiaXQgaW4gRkxBU0hfQUNSIGFuZCBGTEFTSF9DMkFDUiBhcmUgY2xlYXJlZC4KKyAgKiBAcmV0dmFsIFN0YXR1cworICAqICAgICAgICAgIC0gMCA6IE5vIHN1c3BlbmRlZCBmbGFzaCBvcGVyYXRpb24KKyAgKiAgICAgICAgICAtIDEgOiBGbGFzaCBvcGVyYXRpb24gaXMgc3VzcGVuZGVkCisgICovCit1aW50MzJfdCBIQUxfRkxBU0hFeF9Jc09wZXJhdGlvblN1c3BlbmRlZCh2b2lkKQoreworICB1aW50MzJfdCBzdGF0dXMgPSAwVTsKKworICBpZiAoUkVBRF9CSVQoRkxBU0gtPlNSLCBGTEFTSF9TUl9QRVNEKSA9PSBGTEFTSF9TUl9QRVNEKQorICB7CisgICAgc3RhdHVzID0gMVU7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZMQVNIRXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hc3MgZXJhc2Ugb2YgRkxBU0ggbWVtb3J5LgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfTWFzc0VyYXNlKHZvaWQpCit7CisgIC8qIFNldCB0aGUgTWFzcyBFcmFzZSBCaXQgYW5kIHN0YXJ0IGJpdCAqLworICBTRVRfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX01FUiB8IEZMQVNIX0NSX1NUUlQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBFcmFzZSB0aGUgc3BlY2lmaWVkIEZMQVNIIG1lbW9yeSBwYWdlLgorICAqIEBwYXJhbSAgUGFnZSBGTEFTSCBwYWdlIHRvIGVyYXNlCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAobWF4IG51bWJlciBvZiBwYWdlcyBpbiBGbGFzaCAtIDEpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEZMQVNIX1BhZ2VFcmFzZSh1aW50MzJfdCBQYWdlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShQYWdlKSk7CisKKyAgLyogUHJvY2VlZCB0byBlcmFzZSB0aGUgcGFnZSAqLworICBNT0RJRllfUkVHKEZMQVNILT5DUiwgRkxBU0hfQ1JfUE5CLCAoKFBhZ2UgPDwgRkxBU0hfQ1JfUE5CX1BvcykgfCBGTEFTSF9DUl9QRVIgfCBGTEFTSF9DUl9TVFJUKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmx1c2ggdGhlIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX0ZsdXNoQ2FjaGVzKHZvaWQpCit7CisgIC8qIEZsdXNoIGluc3RydWN0aW9uIGNhY2hlICAqLworICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0lDRU4pID09IEZMQVNIX0FDUl9JQ0VOKQorICB7CisgICAgLyogRGlzYWJsZSBpbnN0cnVjdGlvbiBjYWNoZSAgKi8KKyAgICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9ESVNBQkxFKCk7CisgICAgLyogUmVzZXQgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKyAgICBfX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpOworICAgIC8qIEVuYWJsZSBpbnN0cnVjdGlvbiBjYWNoZSAqLworICAgIF9fSEFMX0ZMQVNIX0lOU1RSVUNUSU9OX0NBQ0hFX0VOQUJMRSgpOworICB9CisKKyAgLyogRmx1c2ggZGF0YSBjYWNoZSAqLworICBpZiAoUkVBRF9CSVQoRkxBU0gtPkFDUiwgRkxBU0hfQUNSX0RDRU4pID09IEZMQVNIX0FDUl9EQ0VOKQorICB7CisgICAgLyogRGlzYWJsZSBkYXRhIGNhY2hlICAqLworICAgIF9fSEFMX0ZMQVNIX0RBVEFfQ0FDSEVfRElTQUJMRSgpOworICAgIC8qIFJlc2V0IGRhdGEgY2FjaGUgKi8KKyAgICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX1JFU0VUKCk7CisgICAgLyogRW5hYmxlIGRhdGEgY2FjaGUgKi8KKyAgICBfX0hBTF9GTEFTSF9EQVRBX0NBQ0hFX0VOQUJMRSgpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWNrbmxvd2xkZ2UgdGhlIHBhZ2UgZXJhc2Ugb3BlcmF0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfQWNrbm93bGVkZ2VQYWdlRXJhc2Uodm9pZCkKK3sKKyAgQ0xFQVJfQklUKEZMQVNILT5DUiwgKEZMQVNIX0NSX1BFUiB8IEZMQVNIX0NSX1BOQikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBvZiB0aGUgZGVzaXJlZCBwYWdlcy4KKyAgKiBAbm90ZSAgIFdoZW4gV1JQIGlzIGFjdGl2ZSBpbiBhIHpvbmUsIGl0IGNhbm5vdCBiZSBlcmFzZWQgb3IgcHJvZ3JhbW1lZC4KKyAgKiAgICAgICAgIENvbnNlcXVlbnRseSwgYSBzb2Z0d2FyZSBtYXNzIGVyYXNlIGNhbm5vdCBiZSBwZXJmb3JtZWQgaWYgb25lIHpvbmUKKyAgKiAgICAgICAgIGlzIHdyaXRlLXByb3RlY3RlZC4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIG1lbW9yeSByZWFkIHByb3RlY3Rpb24gbGV2ZWwgaXMgc2VsZWN0ZWQgKFJEUCBsZXZlbCA9IDEpLAorICAqICAgICAgICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByb2dyYW0gb3IgZXJhc2UgRmxhc2ggbWVtb3J5IGlmIHRoZSBDUFUgZGVidWcKKyAgKiAgICAgICAgIGZlYXR1cmVzIGFyZSBjb25uZWN0ZWQgKEpUQUcgb3Igc2luZ2xlIHdpcmUpIG9yIGJvb3QgY29kZSBpcyBiZWluZworICAqICAgICAgICAgZXhlY3V0ZWQgZnJvbSBSQU0gb3IgU3lzdGVtIGZsYXNoLCBldmVuIGlmIFdSUCBpcyBub3QgYWN0aXZhdGVkLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIHRoZSBXUlAgb3B0aW9ucywgdGhlIG9wdGlvbiBsb2NrIGJpdCBPUFRMT0NLIG11c3QgYmUKKyAgKiAgICAgICAgIGNsZWFyZWQgd2l0aCB0aGUgY2FsbCBvZiB0aGUgQHJlZiBIQUxfRkxBU0hfT0JfVW5sb2NrKCkgZnVuY3Rpb24uCisgICogQG5vdGUgICBUbyB2YWxpZGF0ZSB0aGUgV1JQIG9wdGlvbnMsIHRoZSBvcHRpb24gYnl0ZXMgbXVzdCBiZSByZWxvYWRlZAorICAqICAgICAgICAgdGhyb3VnaCB0aGUgY2FsbCBvZiB0aGUgQHJlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkgZnVuY3Rpb24uCisgICogQHBhcmFtICBXUlBBcmVhIFNwZWNpZmllcyB0aGUgYXJlYSB0byBiZSBjb25maWd1cmVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSBGbGFzaCBCYW5rIDEgQXJlYSBBCisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfV1JQQVJFQV9CQU5LMV9BUkVBQiBGbGFzaCBCYW5rIDEgQXJlYSBCCisgICogQHBhcmFtICBXUlBTdGFydE9mZnNldCBTcGVjaWZpZXMgdGhlIHN0YXJ0IHBhZ2Ugb2YgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHBhZ2UgbnVtYmVyIGJldHdlZW4gMCBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIEZsYXNoIC0gMSkKKyAgKiBAcGFyYW0gIFdSRFBFbmRPZmZzZXQgU3BlY2lmaWVzIHRoZSBlbmQgcGFnZSBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgcGFnZSBudW1iZXIgYmV0d2VlbiBXUlBTdGFydE9mZnNldCBhbmQgKG1heCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIEZsYXNoIC0gMSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX1dSUENvbmZpZyh1aW50MzJfdCBXUlBBcmVhLCB1aW50MzJfdCBXUlBTdGFydE9mZnNldCwgdWludDMyX3QgV1JEUEVuZE9mZnNldCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1dSUEFSRUEoV1JQQXJlYSkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShXUlBTdGFydE9mZnNldCkpOworICBhc3NlcnRfcGFyYW0oSVNfRkxBU0hfUEFHRShXUkRQRW5kT2Zmc2V0KSk7CisKKyAgLyogQ29uZmlndXJlIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYSAqLworICBpZiAoV1JQQXJlYSA9PSBPQl9XUlBBUkVBX0JBTksxX0FSRUFBKQorICB7CisgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMUFSLCAoRkxBU0hfV1JQMUFSX1dSUDFBX1NUUlQgfCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSwKKyAgICAgICAgICAgICAgIChXUlBTdGFydE9mZnNldCB8IChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKSkpOworICB9CisgIGVsc2UgLyogT0JfV1JQQVJFQV9CQU5LMV9BUkVBQiAqLworICB7CisgICAgTU9ESUZZX1JFRyhGTEFTSC0+V1JQMUJSLCAoRkxBU0hfV1JQMUJSX1dSUDFCX1NUUlQgfCBGTEFTSF9XUlAxQlJfV1JQMUJfRU5EKSwKKyAgICAgICAgICAgICAgIChXUlBTdGFydE9mZnNldCB8IChXUkRQRW5kT2Zmc2V0IDw8IEZMQVNIX1dSUDFBUl9XUlAxQV9FTkRfUG9zKSkpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHVzZXIgJiBSRFAgY29uZmlndXJhdGlvbgorICAqIEBub3RlICAgISEhIFdhcm5pbmcgOiBXaGVuIGVuYWJsaW5nIE9CX1JEUCBsZXZlbCAyIGl0J3Mgbm8gbW9yZSBwb3NzaWJsZQorICAqICAgICAgICAgdG8gZ28gYmFjayB0byBsZXZlbCAxIG9yIDAgISEhCisgICogQHBhcmFtICBVc2VyVHlwZSBUaGUgRkxBU0ggVXNlciBPcHRpb24gQnl0ZXMgdG8gYmUgbW9kaWZpZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9VU0VSX0JPUl9MRVYgb3IgQHJlZiBPQl9VU0VSX25SU1RfU1RPUCBvciBAcmVmIE9CX1VTRVJfblJTVF9TVERCWSBvcgorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1VTRVJfblJTVF9TSERXIG9yIEByZWYgT0JfVVNFUl9JV0RHX1NXIG9yIEByZWYgT0JfVVNFUl9JV0RHX1NUT1Agb3IKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9VU0VSX0lXREdfU1REQlkgb3IgQHJlZiBPQl9VU0VSX1dXREdfU1cgb3IgQHJlZiBPQl9VU0VSX25CT09UMSBvcgorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1VTRVJfU1JBTTJQRSBvciBAcmVmIE9CX1VTRVJfU1JBTTJSU1Qgb3IgQHJlZiBPQl9VU0VSX25TV0JPT1QwIG9yCisgICogICAgICAgICBAYXJnIEByZWYgT0JfVVNFUl9uQk9PVDAgb3IgQHJlZiBPQl9VU0VSX0FHQ19UUklNIG9yIEByZWYgT0JfVVNFUl9BTEwKKyAgKiBAcGFyYW0gIFVzZXJDb25maWcgVGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGVzIHZhbHVlcy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9CT1JfTEVWRUxfMCBvciBAcmVmIE9CX0JPUl9MRVZFTF8xIG9yIC4uLiBvciBAcmVmIE9CX0JPUl9MRVZFTF80CisgICogICAgICAgICBAYXJnIEByZWYgT0JfU1RPUF9SU1Qgb3IgQHJlZiBPQl9TVE9QX05PUlNUCisgICogICAgICAgICBAYXJnIEByZWYgT0JfU1RBTkRCWV9SU1Qgb3IgQHJlZiBPQl9TVEFOREJZX05PUlNUCisgICogICAgICAgICBAYXJnIEByZWYgT0JfU0hVVERPV05fUlNUIG9yIEByZWYgT0JfU0hVVERPV05fTk9SU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9JV0RHX1NXIG9yIEByZWYgT0JfSVdER19IVworICAqICAgICAgICAgQGFyZyBAcmVmIE9CX0lXREdfU1RPUF9GUkVFWkUgb3IgQHJlZiBPQl9JV0RHX1NUT1BfUlVOCisgICogICAgICAgICBAYXJnIEByZWYgT0JfSVdER19TVERCWV9GUkVFWkUgb3IgQHJlZiBPQl9JV0RHX1NUREJZX1JVTgorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1dXREdfU1cgb3IgQHJlZiBPQl9XV0RHX0hXCisgICogICAgICAgICBAYXJnIEByZWYgT0JfQk9PVDFfU1JBTSBvciBAcmVmIE9CX0JPT1QxX1NZU1RFTQorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1NSQU0yX1BBUklUWV9FTkFCTEUgb3IgQHJlZiBPQl9TUkFNMl9QQVJJVFlfRElTQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1NSQU0yX1JTVF9FUkFTRSBvciBAcmVmIE9CX1NSQU0yX1JTVF9OT1RfRVJBU0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9CT09UMF9GUk9NX09CIG9yIEByZWYgT0JfQk9PVDBfRlJPTV9QSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9CT09UMF9SRVNFVCBvciBAcmVmIE9CX0JPT1QwX1NFVAorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX0FHQ19UUklNXzAgb3IgQHJlZiBPQl9BR0NfVFJJTV8xIG9yIC4uLiBvciBAcmVmIE9CX0FHQ19UUklNXzcKKyAgKiBAcGFyYW0gIFJEUExldmVsOiBzcGVjaWZpZXMgdGhlIHJlYWQgcHJvdGVjdGlvbiBsZXZlbC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzAgTm8gcHJvdGVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1JEUF9MRVZFTF8xIFJlYWQgcHJvdGVjdGlvbiBvZiB0aGUgbWVtb3J5CisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzIgRnVsbCBjaGlwIHByb3RlY3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZMQVNIX09CX09wdHJDb25maWcodWludDMyX3QgVXNlclR5cGUsIHVpbnQzMl90IFVzZXJDb25maWcsIHVpbnQzMl90IFJEUExldmVsKQoreworICB1aW50MzJfdCBvcHRyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19PQl9VU0VSX1RZUEUoVXNlclR5cGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX09CX1VTRVJfQ09ORklHKFVzZXJUeXBlLCBVc2VyQ29uZmlnKSk7CisgIGFzc2VydF9wYXJhbShJU19PQl9SRFBfTEVWRUwoUkRQTGV2ZWwpKTsKKworICAvKiBDb25maWd1cmUgdGhlIFJEUCBsZXZlbCBpbiB0aGUgb3B0aW9uIGJ5dGVzIHJlZ2lzdGVyICovCisgIG9wdHIgPSBGTEFTSC0+T1BUUjsKKyAgb3B0ciAmPSB+KFVzZXJUeXBlIHwgRkxBU0hfT1BUUl9SRFApOworICBGTEFTSC0+T1BUUiA9IChvcHRyIHwgVXNlckNvbmZpZyB8IFJEUExldmVsKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFpvbmUgMUEgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gb2YgdGhlIGRlc2lyZWQgYWRkcmVzc2VzLAorICAqICAgICAgICAgYW5kIGVyYXNlIGNvbmZpZ3VyYXRpb24gb24gUkRQIHJlZ3Jlc3Npb24uCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgdGhlIFBDUk9QIG9wdGlvbnMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlCisgICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgdGhlIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICAqIEBub3RlICAgVG8gdmFsaWRhdGUgdGhlIFBDUk9QIG9wdGlvbnMsIHRoZSBvcHRpb24gYnl0ZXMgbXVzdCBiZSByZWxvYWRlZAorICAqICAgICAgICAgdGhyb3VnaCB0aGUgY2FsbCBvZiB0aGUgQHJlZiBIQUxfRkxBU0hfT0JfTGF1bmNoKCkgZnVuY3Rpb24uCisgICogQHBhcmFtICBQQ1JPUENvbmZpZzogc3BlY2lmaWVzIHRoZSBlcmFzZSBjb25maWd1cmF0aW9uIChPQl9QQ1JPUF9SRFBfTk9UX0VSQVNFIG9yIE9CX1BDUk9QX1JEUF9FUkFTRSkKKyAgKiAgICAgICAgIG9uIFJEUCBsZXZlbCAxIHJlZ3Jlc3Npb24uCisgICogQHBhcmFtICBQQ1JPUDFBU3RhcnRBZGRyIFNwZWNpZmllcyB0aGUgWm9uZSAxQSBTdGFydCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGFkZHJlc3MgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIG9mIHRoZSBmbGFzaAorICAqIEBwYXJhbSAgUENST1AxQUVuZEFkZHIgU3BlY2lmaWVzIHRoZSBab25lIDFBIGVuZCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGFkZHJlc3MgYmV0d2VlbiBQQ1JPUDFBU3RhcnRBZGRyIGFuZCBlbmQgb2YgdGhlIGZsYXNoCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9QQ1JPUDFBQ29uZmlnKHVpbnQzMl90IFBDUk9QQ29uZmlnLCB1aW50MzJfdCBQQ1JPUDFBU3RhcnRBZGRyLCB1aW50MzJfdCBQQ1JPUDFBRW5kQWRkcikKK3sKKyAgdWludDMyX3Qgc3RhcnRvZmZzZXQ7CisgIHVpbnQzMl90IGVuZG9mZnNldDsKKyAgdWludDMyX3QgcGNyb3AxYWVuZDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfT0JfUENST1BfQ09ORklHKFBDUk9QQ29uZmlnKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKFBDUk9QMUFTdGFydEFkZHIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoUENST1AxQUVuZEFkZHIpKTsKKworICAvKiBnZXQgcGNyb3AgMUEgZW5kIHJlZ2lzdGVyICovCisgIHBjcm9wMWFlbmQgPSBGTEFTSC0+UENST1AxQUVSOworCisgIC8qIENvbmZpZ3VyZSB0aGUgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gb2Zmc2V0ICovCisgIGlmICgoUENST1BDb25maWcgJiBPQl9QQ1JPUF9aT05FX0EpICE9IDBVKQorICB7CisgICAgLyogQ29tcHV0ZSBvZmZzZXQgZGVwZW5kaW5nIG9uIHBjcm9wIGdyYW51bGFyaXR5ICovCisgICAgc3RhcnRvZmZzZXQgPSAoKFBDUk9QMUFTdGFydEFkZHIgLSBGTEFTSF9CQVNFKSA+PiBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpOyAvKiAySyBwYWdlcyAqLworICAgIGVuZG9mZnNldCA9ICgoUENST1AxQUVuZEFkZHIgLSBGTEFTSF9CQVNFKSA+PiBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpOyAvKiAySyBwYWdlcyAqLworCisgICAgLyogU2V0IFpvbmUgQSBzdGFydCBvZmZzZXQgKi8KKyAgICBXUklURV9SRUcoRkxBU0gtPlBDUk9QMUFTUiwgc3RhcnRvZmZzZXQpOworCisgICAgLyogU2V0IFpvbmUgQSBlbmQgb2Zmc2V0ICovCisgICAgcGNyb3AxYWVuZCAmPSB+RkxBU0hfUENST1AxQUVSX1BDUk9QMUFfRU5EOworICAgIHBjcm9wMWFlbmQgfD0gZW5kb2Zmc2V0OworICB9CisKKyAgLyogU2V0IFJEUCBlcmFzZSBwcm90ZWN0aW9uIGlmIG5lZWRlZC4gVGhpcyBiaXQgaXMgb25seSBzZXQgJiB3aWxsIGJlIHJlc2V0IGJ5IG1hc3MgZXJhc2UgKi8KKyAgaWYgKChQQ1JPUENvbmZpZyAmIE9CX1BDUk9QX1JEUF9FUkFTRSkgIT0gMFUpCisgIHsKKyAgICBwY3JvcDFhZW5kIHw9IEZMQVNIX1BDUk9QMUFFUl9QQ1JPUF9SRFA7CisgIH0KKworICAvKiBzZXQgMUEgRW5kIHJlZ2lzdGVyICovCisgIFdSSVRFX1JFRyhGTEFTSC0+UENST1AxQUVSLCBwY3JvcDFhZW5kKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFpvbmUgMUIgUHJvcHJpZXRhcnkgY29kZSByZWFkb3V0IHByb3RlY3Rpb24gb2YgdGhlIGRlc2lyZWQgYWRkcmVzc2VzLgorICAqIEBub3RlICAgVG8gY29uZmlndXJlIHRoZSBQQ1JPUCBvcHRpb25zLCB0aGUgb3B0aW9uIGxvY2sgYml0IE9QVExPQ0sgbXVzdCBiZQorICAqICAgICAgICAgY2xlYXJlZCB3aXRoIHRoZSBjYWxsIG9mIHRoZSBAcmVmIEhBTF9GTEFTSF9PQl9VbmxvY2soKSBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIHZhbGlkYXRlIHRoZSBQQ1JPUCBvcHRpb25zLCB0aGUgb3B0aW9uIGJ5dGVzIG11c3QgYmUgcmVsb2FkZWQKKyAgKiAgICAgICAgIHRocm91Z2ggdGhlIGNhbGwgb2YgdGhlIEByZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCgpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgUENST1AxQlN0YXJ0QWRkciBTcGVjaWZpZXMgdGhlIFpvbmUgMUJTdGFydCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGFkZHJlc3MgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIG9mIHRoZSBmbGFzaAorICAqIEBwYXJhbSAgUENST1AxQkVuZEFkZHIgU3BlY2lmaWVzIHRoZSBab25lIDFCIGVuZCBhZGRyZXNzIG9mIHRoZSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFuIGFkZHJlc3MgYmV0d2VlbiBQQ1JPUDFCU3RhcnRBZGRyIGFuZCBlbmQgb2YgdGhlIGZsYXNoCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9QQ1JPUDFCQ29uZmlnKHVpbnQzMl90IFBDUk9QMUJTdGFydEFkZHIsIHVpbnQzMl90IFBDUk9QMUJFbmRBZGRyKQoreworICB1aW50MzJfdCBzdGFydG9mZnNldDsKKyAgdWludDMyX3QgZW5kb2Zmc2V0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9NQUlOX01FTV9BRERSRVNTKFBDUk9QMUJTdGFydEFkZHIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZMQVNIX01BSU5fTUVNX0FERFJFU1MoUENST1AxQkVuZEFkZHIpKTsKKworICAvKiBDb21wdXRlIG9mZnNldCBkZXBlbmRpbmcgb24gcGNyb3AgZ3JhbnVsYXJpdHkgKi8KKyAgc3RhcnRvZmZzZXQgPSAoKFBDUk9QMUJTdGFydEFkZHIgLSBGTEFTSF9CQVNFKSA+PiBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpOyAvKiAySyBwYWdlcyAqLworICBlbmRvZmZzZXQgPSAoKFBDUk9QMUJFbmRBZGRyIC0gRkxBU0hfQkFTRSkgPj4gRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKTsgLyogMksgcGFnZXMgKi8KKworICAvKiBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uIHN0YXJ0IGFkZHJlc3MgKi8KKyAgV1JJVEVfUkVHKEZMQVNILT5QQ1JPUDFCU1IsIHN0YXJ0b2Zmc2V0KTsKKworICAvKiBDb25maWd1cmUgdGhlIFByb3ByaWV0YXJ5IGNvZGUgcmVhZG91dCBwcm90ZWN0aW9uIGVuZCBhZGRyZXNzICovCisgIFdSSVRFX1JFRyhGTEFTSC0+UENST1AxQkVSLCBlbmRvZmZzZXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFByb2dyYW0gdGhlIEZMQVNIIElQQ0MgZGF0YSBidWZmZXIgYWRkcmVzcy4KKyAgKiBAbm90ZSAgIFRvIGNvbmZpZ3VyZSB0aGUgZXh0cmEgdXNlciBvcHRpb24gYnl0ZXMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0CisgICogICAgICAgICBiZSBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgdGhlIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICAqIEBub3RlICAgVG8gdmFsaWRhdGUgdGhlIGV4dHJhIHVzZXIgb3B0aW9uIGJ5dGVzLCB0aGUgb3B0aW9uIGJ5dGVzIG11c3QgYmUgcmVsb2FkZWQKKyAgKiAgICAgICAgIHRocm91Z2ggdGhlIGNhbGwgb2YgdGhlIEByZWYgSEFMX0ZMQVNIX09CX0xhdW5jaCgpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgSVBDQ0RhdGFCdWZBZGRyIElQQ0MgZGF0YSBidWZmZXIgc3RhcnQgYWRkcmVzcyBhcmVhIGluIFNSQU0yCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBkb3VibGUtd29yZCBhbGlnbmVkCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9JUENDQnVmZmVyQWRkckNvbmZpZyh1aW50MzJfdCBJUENDRGF0YUJ1ZkFkZHIpCit7CisgIGFzc2VydF9wYXJhbShJU19PQl9JUENDX0JVRl9BRERSKElQQ0NEYXRhQnVmQWRkcikpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgb3B0aW9uIGJ5dGVzIHJlZ2lzdGVyICovCisgIFdSSVRFX1JFRyhGTEFTSC0+SVBDQ0JSLCAodWludDMyX3QpKChJUENDRGF0YUJ1ZkFkZHIgLSBTUkFNMkFfQkFTRSkgPj4gNCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc2VjdXJlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRpZmZlcmVudCBtZW1vcmllcyAoRkxBU0ggYW5kIFNSQU0yKSwKKyAgKiAgICAgICAgIHRoZSBzZWN1cmUgbW9kZSBhbmQgdGhlIENQVTIgU2VjdXJlIEJvb3QgcmVzZXQgdmVjdG9yCisgICogQG5vdGUgICBUbyBjb25maWd1cmUgdGhlIFBDUk9QIG9wdGlvbnMsIHRoZSBvcHRpb24gbG9jayBiaXQgT1BUTE9DSyBtdXN0IGJlCisgICogICAgICAgICBjbGVhcmVkIHdpdGggdGhlIGNhbGwgb2YgdGhlIEByZWYgSEFMX0ZMQVNIX09CX1VubG9jaygpIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgcE9CUGFyYW0gUG9pbnRlciB0byBhbiBAcmVmIEZMQVNIX09CUHJvZ3JhbUluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2dyYW1taW5nCisgICogQHJldHZhbCB2b2lkCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9TZWN1cmVDb25maWcoRkxBU0hfT0JQcm9ncmFtSW5pdFR5cGVEZWYgKnBPQlBhcmFtKQoreworICB1aW50MzJfdCBzZnJfcmVnX3ZhbCA9IFJFQURfUkVHKEZMQVNILT5TRlIpOworICB1aW50MzJfdCBzcnJ2cl9yZWdfdmFsID0gUkVBRF9SRUcoRkxBU0gtPlNSUlZSKTsKKworICBpZiAoKHBPQlBhcmFtLT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9TRUNVUkVfTU9ERSkgIT0gMFUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfT0JfU0ZTQV9TVEFSVF9BRERSKHBPQlBhcmFtLT5TZWN1cmVGbGFzaFN0YXJ0QWRkcikpOworICAgIGFzc2VydF9wYXJhbShJU19PQl9TQlJTQV9TVEFSVF9BRERSKHBPQlBhcmFtLT5TZWN1cmVSQU0yYVN0YXJ0QWRkcikpOworICAgIGFzc2VydF9wYXJhbShJU19PQl9TTkJSU0FfU1RBUlRfQUREUihwT0JQYXJhbS0+U2VjdXJlUkFNMmJTdGFydEFkZHIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfT0JfU0VDVVJFX01PREUocE9CUGFyYW0tPlNlY3VyZU1vZGUpKTsKKworICAgIC8qIENvbmZpZ3VyZSBTRlIgcmVnaXN0ZXIgY29udGVudCB3aXRoIHN0YXJ0IFBBR0UgaW5kZXggdG8gc2VjdXJlICovCisgICAgTU9ESUZZX1JFRyhzZnJfcmVnX3ZhbCwgRkxBU0hfU0ZSX1NGU0EsICgoKHBPQlBhcmFtLT5TZWN1cmVGbGFzaFN0YXJ0QWRkciAtIEZMQVNIX0JBU0UpIC8gRkxBU0hfUEFHRV9TSVpFKSA8PCBGTEFTSF9TRlJfU0ZTQV9Qb3MpKTsKKworICAgIC8qIENvbmZpZ3VyZSBTUlJWUiByZWdpc3RlciAqLworICAgIE1PRElGWV9SRUcoc3JydnJfcmVnX3ZhbCwgKEZMQVNIX1NSUlZSX1NCUlNBIHwgRkxBU0hfU1JSVlJfU05CUlNBKSwgXAorICAgICAgICAgICAgICAgKCgoKChwT0JQYXJhbS0+U2VjdXJlUkFNMmFTdGFydEFkZHIgLSBTUkFNMkFfQkFTRSkgPj4gU1JBTV9TRUNVUkVfUEFHRV9HUkFOVUxBUklUWV9PRkZTRVQpIDw8IEZMQVNIX1NSUlZSX1NCUlNBX1BvcykpIHwgXAorICAgICAgICAgICAgICAgICgoKChwT0JQYXJhbS0+U2VjdXJlUkFNMmJTdGFydEFkZHIgLSBTUkFNMkJfQkFTRSkgPj4gU1JBTV9TRUNVUkVfUEFHRV9HUkFOVUxBUklUWV9PRkZTRVQpIDw8IEZMQVNIX1NSUlZSX1NOQlJTQV9Qb3MpKSkpOworCisgICAgLyogSWYgRnVsbCBTeXN0ZW0gU2VjdXJlIG1vZGUgaXMgcmVxdWVzdGVkLCBjbGVhciBhbGwgdGhlIGNvcnJlc3BvbmRpbmcgYml0ICovCisgICAgLyogRWxzZSBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYml0ICovCisgICAgaWYgKHBPQlBhcmFtLT5TZWN1cmVNb2RlID09IFNZU1RFTV9JTl9TRUNVUkVfTU9ERSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoc2ZyX3JlZ192YWwsIEZMQVNIX1NGUl9GU0QpOworICAgICAgQ0xFQVJfQklUKHNycnZyX3JlZ192YWwsIChGTEFTSF9TUlJWUl9CUlNEIHwgRkxBU0hfU1JSVlJfTkJSU0QpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFNFVF9CSVQoc2ZyX3JlZ192YWwsIEZMQVNIX1NGUl9GU0QpOworICAgICAgU0VUX0JJVChzcnJ2cl9yZWdfdmFsLCAoRkxBU0hfU1JSVlJfQlJTRCB8IEZMQVNIX1NSUlZSX05CUlNEKSk7CisgICAgfQorCisgICAgLyogVXBkYXRlIEZsYXNoIHJlZ2lzdGVycyAqLworICAgIFdSSVRFX1JFRyhGTEFTSC0+U0ZSLCBzZnJfcmVnX3ZhbCk7CisgIH0KKworICAvKiBCb290IHZlY3RvciAqLworICBpZiAoKHBPQlBhcmFtLT5PcHRpb25UeXBlICYgT1BUSU9OQllURV9DMl9CT09UX1ZFQ1QpICE9IDBVKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfT0JfQk9PVF9WRUNUT1JfQUREUihwT0JQYXJhbS0+QzJTZWN1cmVCb290VmVjdEFkZHIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfT0JfQk9PVF9SRUdJT04ocE9CUGFyYW0tPkMyQm9vdFJlZ2lvbikpOworCisgICAgLyogU2V0IHRoZSBib290IHZlY3RvciAqLworICAgIGlmIChwT0JQYXJhbS0+QzJCb290UmVnaW9uID09IE9CX0MyX0JPT1RfRlJPTV9GTEFTSCkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKHNycnZyX3JlZ192YWwsIChGTEFTSF9TUlJWUl9TQlJWIHwgRkxBU0hfU1JSVlJfQzJPUFQpLCAoKChwT0JQYXJhbS0+QzJTZWN1cmVCb290VmVjdEFkZHIgLSBGTEFTSF9CQVNFKSA+PiAyKSB8IHBPQlBhcmFtLT5DMkJvb3RSZWdpb24pKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoc3JydnJfcmVnX3ZhbCwgKEZMQVNIX1NSUlZSX1NCUlYgfCBGTEFTSF9TUlJWUl9DMk9QVCksICgoKHBPQlBhcmFtLT5DMlNlY3VyZUJvb3RWZWN0QWRkciAtIFNSQU0xX0JBU0UpID4+IDIpIHwgcE9CUGFyYW0tPkMyQm9vdFJlZ2lvbikpOworICAgIH0KKyAgfQorCisgIC8qIFVwZGF0ZSBGbGFzaCByZWdpc3RlcnMgKi8KKyAgV1JJVEVfUkVHKEZMQVNILT5TUlJWUiwgc3JydnJfcmVnX3ZhbCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBXcml0ZSBQcm90ZWN0aW9uIE9wdGlvbiBCeXRlcyB2YWx1ZS4KKyAgKiBAcGFyYW1baW5dICAgV1JQQXJlYSBTcGVjaWZpZXMgdGhlIGFyZWEgdG8gYmUgcmV0dXJuZWQuCisgICogICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9XUlBBUkVBX0JBTksxX0FSRUFBIEZsYXNoIEJhbmsgMSBBcmVhIEEKKyAgKiAgICAgICAgICAgICAgQGFyZyBAcmVmIE9CX1dSUEFSRUFfQkFOSzFfQVJFQUIgRmxhc2ggQmFuayAxIEFyZWEgQgorICAqIEBwYXJhbVtvdXRdICBXUlBTdGFydE9mZnNldCBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBzdGFydCBwYWdlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3cml0ZSBwcm90ZWN0ZWQgYXJlYQorICAqIEBwYXJhbVtvdXRdICBXUkRQRW5kT2Zmc2V0IFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGVuZCBwYWdlIG9mCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdyaXRlIHByb3RlY3RlZCBhcmVhCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9HZXRXUlAodWludDMyX3QgV1JQQXJlYSwgdWludDMyX3QgKldSUFN0YXJ0T2Zmc2V0LCB1aW50MzJfdCAqV1JEUEVuZE9mZnNldCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX09CX1dSUEFSRUEoV1JQQXJlYSkpOworCisgIC8qIEdldCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgd3JpdGUgcHJvdGVjdGVkIGFyZWEgKi8KKyAgaWYgKFdSUEFyZWEgPT0gT0JfV1JQQVJFQV9CQU5LMV9BUkVBQSkKKyAgeworICAgICpXUlBTdGFydE9mZnNldCA9IFJFQURfQklUKEZMQVNILT5XUlAxQVIsIEZMQVNIX1dSUDFBUl9XUlAxQV9TVFJUKTsKKyAgICAqV1JEUEVuZE9mZnNldCA9IChSRUFEX0JJVChGTEFTSC0+V1JQMUFSLCBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EKSA+PiBGTEFTSF9XUlAxQVJfV1JQMUFfRU5EX1Bvcyk7CisgIH0KKyAgZWxzZSAvKiBPQl9XUlBBUkVBX0JBTksxX0FSRUFCICovCisgIHsKKyAgICAqV1JQU3RhcnRPZmZzZXQgPSBSRUFEX0JJVChGTEFTSC0+V1JQMUJSLCBGTEFTSF9XUlAxQlJfV1JQMUJfU1RSVCk7CisgICAgKldSRFBFbmRPZmZzZXQgPSAoUkVBRF9CSVQoRkxBU0gtPldSUDFCUiwgRkxBU0hfV1JQMUJSX1dSUDFCX0VORCkgPj4gRkxBU0hfV1JQMUJSX1dSUDFCX0VORF9Qb3MpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBSZWFkIFByb3RlY3Rpb24gbGV2ZWwuCisgICogQHJldHZhbCBGTEFTSCBSZWFkT3V0IFByb3RlY3Rpb24gU3RhdHVzOgorICAqICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMCBObyBwcm90ZWN0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgT0JfUkRQX0xFVkVMXzEgUmVhZCBwcm90ZWN0aW9uIG9mIHRoZSBtZW1vcnkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBPQl9SRFBfTEVWRUxfMiBGdWxsIGNoaXAgcHJvdGVjdGlvbgorICAqLworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFJEUCh2b2lkKQoreworICB1aW50MzJfdCByZHBsdmwgPSBSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9SRFApOworCisgIGlmICgocmRwbHZsICE9IE9CX1JEUF9MRVZFTF8wKSAmJiAocmRwbHZsICE9IE9CX1JEUF9MRVZFTF8yKSkKKyAgeworICAgIHJldHVybiAoT0JfUkRQX0xFVkVMXzEpOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiByZHBsdmw7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEZMQVNIIFVzZXIgT3B0aW9uIEJ5dGUgdmFsdWUuCisgICogQHJldHZhbCBUaGlzIHJldHVybiB2YWx1ZSBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgT0JfQk9SX0xFVkVMXzAgb3IgQHJlZiBPQl9CT1JfTEVWRUxfMSBvciAuLi4gb3IgQHJlZiBPQl9CT1JfTEVWRUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX1NUT1BfUlNUIG9yIEByZWYgT0JfU1RPUF9SU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9TVEFOREJZX1JTVCBvciBAcmVmIE9CX1NUQU5EQllfTk9SU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9TSFVURE9XTl9SU1Qgb3IgQHJlZiBPQl9TSFVURE9XTl9OT1JTVAorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX0lXREdfU1cgb3IgQHJlZiBPQl9JV0RHX0hXCisgICogICAgICAgICBAYXJnIEByZWYgT0JfSVdER19TVE9QX0ZSRUVaRSBvciBAcmVmIE9CX0lXREdfU1RPUF9SVU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9JV0RHX1NUREJZX0ZSRUVaRSBvciBAcmVmIE9CX0lXREdfU1REQllfUlVOCisgICogICAgICAgICBAYXJnIEByZWYgT0JfV1dER19TVyBvciBAcmVmIE9CX1dXREdfSFcKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBPQl9CT09UMV9TUkFNIG9yIEByZWYgT0JfQk9PVDFfU1lTVEVNCisgICogICAgICAgICBAYXJnIEByZWYgT0JfU1JBTTJfUEFSSVRZX0VOQUJMRSBvciBAcmVmIE9CX1NSQU0yX1BBUklUWV9ESVNBQkxFCisgICogICAgICAgICBAYXJnIEByZWYgT0JfU1JBTTJfUlNUX0VSQVNFIG9yIEByZWYgT0JfU1JBTTJfUlNUX05PVF9FUkFTRQorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1QwX0ZST01fT0Igb3IgQHJlZiBPQl9CT09UMF9GUk9NX1BJTgorICAqICAgICAgICAgQGFyZyBAcmVmIE9CX0JPT1QwX1JFU0VUIG9yIEByZWYgT0JfQk9PVDBfU0VUCisgICogICAgICAgICBAYXJnIEByZWYgT0JfQUdDX1RSSU1fMCBvciBAcmVmIE9CX0FHQ19UUklNXzEgb3IgLi4uIG9yIEByZWYgT0JfQUdDX1RSSU1fNworICAqLworc3RhdGljIHVpbnQzMl90IEZMQVNIX09CX0dldFVzZXIodm9pZCkKK3sKKyAgdWludDMyX3QgdXNlcl9jb25maWcgPSAoUkVBRF9SRUcoRkxBU0gtPk9QVFIpICYgT0JfVVNFUl9BTEwpOworICBDTEVBUl9CSVQodXNlcl9jb25maWcsIChGTEFTSF9PUFRSX1JEUCB8IEZMQVNIX09QVFJfRVNFKSk7CisKKyAgcmV0dXJuIHVzZXJfY29uZmlnOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgRkxBU0ggV3JpdGUgUHJvdGVjdGlvbiBPcHRpb24gQnl0ZXMgdmFsdWUuCisgICogQHBhcmFtIFBDUk9QQ29uZmlnIFtvdXRdIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgUENST1BfUkRQIG9wdGlvbgorICAqIEBwYXJhbSBQQ1JPUDFBU3RhcnRBZGRyIFtvdXRdIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIHN0YXJ0IGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgWm9uZSAxQSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEBwYXJhbSBQQ1JPUDFBRW5kQWRkciBbb3V0XSBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBlbmQgYWRkcmVzcyBvZgorICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgWm9uZSAxQSBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEBwYXJhbSBQQ1JPUDFCU3RhcnRBZGRyIFtvdXRdIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIHN0YXJ0IGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgWm9uZSAxQiBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEBwYXJhbSBQQ1JPUDFCRW5kQWRkciBbb3V0XSBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBlbmQgYWRkcmVzcyBvZgorICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgWm9uZSAxQiBQcm9wcmlldGFyeSBjb2RlIHJlYWRvdXQgcHJvdGVjdGlvbgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0UENST1AodWludDMyX3QgKlBDUk9QQ29uZmlnLCB1aW50MzJfdCAqUENST1AxQVN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUFFbmRBZGRyLCB1aW50MzJfdCAqUENST1AxQlN0YXJ0QWRkciwgdWludDMyX3QgKlBDUk9QMUJFbmRBZGRyKQoreworICB1aW50MzJfdCBwY3JvcDsKKworICBwY3JvcCAgICAgICAgICAgICA9IChSRUFEX0JJVChGTEFTSC0+UENST1AxQlNSLCBGTEFTSF9QQ1JPUDFCU1JfUENST1AxQl9TVFJUKSk7CisgICpQQ1JPUDFCU3RhcnRBZGRyID0gKChwY3JvcCA8PCBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpICsgRkxBU0hfQkFTRSk7CisKKyAgcGNyb3AgICAgICAgICAgICAgPSAoUkVBRF9CSVQoRkxBU0gtPlBDUk9QMUJFUiwgRkxBU0hfUENST1AxQkVSX1BDUk9QMUJfRU5EKSk7CisgICpQQ1JPUDFCRW5kQWRkciAgID0gKChwY3JvcCA8PCBGTEFTSF9QQ1JPUF9HUkFOVUxBUklUWV9PRkZTRVQpICsgRkxBU0hfQkFTRSk7CisKKyAgcGNyb3AgICAgICAgICAgICAgPSAoUkVBRF9CSVQoRkxBU0gtPlBDUk9QMUFTUiwgRkxBU0hfUENST1AxQVNSX1BDUk9QMUFfU1RSVCkpOworICAqUENST1AxQVN0YXJ0QWRkciA9ICgocGNyb3AgPDwgRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKSArIEZMQVNIX0JBU0UpOworCisgIHBjcm9wICAgICAgICAgICAgID0gKFJFQURfQklUKEZMQVNILT5QQ1JPUDFBRVIsIEZMQVNIX1BDUk9QMUFFUl9QQ1JPUDFBX0VORCkpOworICAqUENST1AxQUVuZEFkZHIgICA9ICgocGNyb3AgPDwgRkxBU0hfUENST1BfR1JBTlVMQVJJVFlfT0ZGU0VUKSArIEZMQVNIX0JBU0UpOworCisgICpQQ1JPUENvbmZpZyAgICAgID0gKFJFQURfUkVHKEZMQVNILT5QQ1JPUDFBRVIpICYgRkxBU0hfUENST1AxQUVSX1BDUk9QX1JEUCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTEFTSCBJUENDIGRhdGEgYnVmZmVyIGJhc2UgYWRkcmVzcyBPcHRpb24gQnl0ZSB2YWx1ZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGlzIHRoZSBJUENDIGRhdGEgYnVmZmVyIHN0YXJ0IGFkZHJlc3MgYXJlYSBpbiBTUkFNMi4KKyAgKi8KK3N0YXRpYyB1aW50MzJfdCBGTEFTSF9PQl9HZXRJUENDQnVmZmVyQWRkcih2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KSgoUkVBRF9CSVQoRkxBU0gtPklQQ0NCUiwgRkxBU0hfSVBDQ0JSX0lQQ0NEQkEpIDw8IDQpICsgU1JBTTJBX0JBU0UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU2VjdXJlIEZsYXNoIHN0YXJ0IGFkZHJlc3MsIFNlY3VyZSBCYWNrdXAgUkFNMmEgc3RhcnQgYWRkcmVzcywgU2VjdXJlIG5vbi1CYWNrdXAgUkFNMmIgc3RhcnQgYWRkcmVzcyBhbmQgdGhlIFNlY3VyZU1vZGUKKyAgKiBAcGFyYW0gIFNlY3VyZUZsYXNoU3RhcnRBZGRyIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIFNlY3VyZSBGbGFzaCBzdGFydCBhZGRyZXNzCisgICogQHBhcmFtICBTZWN1cmVSQU0yYVN0YXJ0QWRkciBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBTZWN1cmUgQmFja3VwIFJBTTJhIHN0YXJ0IGFkZHJlc3MKKyAgKiBAcGFyYW0gIFNlY3VyZVJBTTJiU3RhcnRBZGRyIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIFNlY3VyZSBub24tQmFja3VwIFJBTTJiIHN0YXJ0IGFkZHJlc3MKKyAgKiBAcGFyYW0gIFNlY3VyZU1vZGUgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYWRkcmVzcyB3aGVyZSB0byBjb3BpZWQgdGhlIFNlY3VyZSBNb2RlLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBhcmcgQHJlZiBTWVNURU1fSU5fU0VDVVJFX01PREUgOiBTZWN1cml0eSBlbmFibGVkCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYXJnIEByZWYgU1lTVEVNX05PVF9JTl9TRUNVUkVfTU9ERSA6IFNlY3VyaXR5IGRpc2FibGVkCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTEFTSF9PQl9HZXRTZWN1cmVNZW1vcnlDb25maWcodWludDMyX3QgKlNlY3VyZUZsYXNoU3RhcnRBZGRyLCB1aW50MzJfdCAqU2VjdXJlUkFNMmFTdGFydEFkZHIsIHVpbnQzMl90ICpTZWN1cmVSQU0yYlN0YXJ0QWRkciwgdWludDMyX3QgKlNlY3VyZU1vZGUpCit7CisgIHVpbnQzMl90IHNmcl9yZWdfdmFsID0gUkVBRF9SRUcoRkxBU0gtPlNGUik7CisgIHVpbnQzMl90IHNycnZyX3JlZ192YWwgPSBSRUFEX1JFRyhGTEFTSC0+U1JSVlIpOworCisgIC8qIEdldCBTZWN1cmUgRmxhc2ggc3RhcnQgYWRkcmVzcyAqLworICB1aW50MzJfdCB1c2VyX2NvbmZpZyA9IChSRUFEX0JJVChzZnJfcmVnX3ZhbCwgRkxBU0hfU0ZSX1NGU0EpID4+IEZMQVNIX1NGUl9TRlNBX1Bvcyk7CisKKyAgKlNlY3VyZUZsYXNoU3RhcnRBZGRyID0gKCh1c2VyX2NvbmZpZyAqIEZMQVNIX1BBR0VfU0laRSkgKyBGTEFTSF9CQVNFKTsKKworICAvKiBHZXQgU2VjdXJlIFNSQU0yYSBzdGFydCBhZGRyZXNzICovCisgIHVzZXJfY29uZmlnID0gKFJFQURfQklUKHNycnZyX3JlZ192YWwsIEZMQVNIX1NSUlZSX1NCUlNBKSA+PiBGTEFTSF9TUlJWUl9TQlJTQV9Qb3MpOworCisgICpTZWN1cmVSQU0yYVN0YXJ0QWRkciA9ICgodXNlcl9jb25maWcgPDwgU1JBTV9TRUNVUkVfUEFHRV9HUkFOVUxBUklUWV9PRkZTRVQpICsgU1JBTTJBX0JBU0UpOworCisgIC8qIEdldCBTZWN1cmUgU1JBTTJiIHN0YXJ0IGFkZHJlc3MgKi8KKyAgdXNlcl9jb25maWcgPSAoUkVBRF9CSVQoc3JydnJfcmVnX3ZhbCwgRkxBU0hfU1JSVlJfU05CUlNBKSA+PiBGTEFTSF9TUlJWUl9TTkJSU0FfUG9zKTsKKworICAqU2VjdXJlUkFNMmJTdGFydEFkZHIgPSAoKHVzZXJfY29uZmlnIDw8IFNSQU1fU0VDVVJFX1BBR0VfR1JBTlVMQVJJVFlfT0ZGU0VUKSArIFNSQU0yQl9CQVNFKTsKKworICAvKiBHZXQgU2VjdXJlIEFyZWEgbW9kZSAqLworICAqU2VjdXJlTW9kZSA9IChSRUFEX0JJVChGTEFTSC0+T1BUUiwgRkxBU0hfT1BUUl9FU0UpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIENQVTIgU2VjdXJlIEJvb3QgcmVzZXQgdmVjdG9yIGFkZHJlc3MgYW5kIHRoZSBDUFUyIFNlY3VyZSBCb290IFJlZ2lvbgorICAqIEBwYXJhbSAgQzJCb290UmVzZXRWZWN0QWRkciBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdG8gY29waWVkIHRoZSBDUFUyIFNlY3VyZSBCb290IHJlc2V0IHZlY3RvciBhZGRyZXNzCisgICogQHBhcmFtICBDMkJvb3RSZXNldFJlZ2lvbiAgIFNwZWNpZmllcyB0aGUgU2VjdXJlIEJvb3QgcmVzZXQgbWVtb3J5IHJlZ2lvbgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRkxBU0hfT0JfR2V0QzJCb290UmVzZXRDb25maWcodWludDMyX3QgKkMyQm9vdFJlc2V0VmVjdEFkZHIsIHVpbnQzMl90ICpDMkJvb3RSZXNldFJlZ2lvbikKK3sKKyAgKkMyQm9vdFJlc2V0UmVnaW9uID0gKFJFQURfQklUKEZMQVNILT5TUlJWUiwgRkxBU0hfU1JSVlJfQzJPUFQpKTsKKworICBpZiAoKkMyQm9vdFJlc2V0UmVnaW9uID09IE9CX0MyX0JPT1RfRlJPTV9GTEFTSCkKKyAgeworICAgICpDMkJvb3RSZXNldFZlY3RBZGRyID0gKHVpbnQzMl90KSgoUkVBRF9CSVQoRkxBU0gtPlNSUlZSLCBGTEFTSF9TUlJWUl9TQlJWKSA8PCAyKSArIEZMQVNIX0JBU0UpOworICB9CisgIGVsc2UKKyAgeworICAgICpDMkJvb3RSZXNldFZlY3RBZGRyID0gKHVpbnQzMl90KSgoUkVBRF9CSVQoRkxBU0gtPlNSUlZSLCBGTEFTSF9TUlJWUl9TQlJWKSA8PCAyKSArIFNSQU0xX0JBU0UpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUHJvY2VlZCB0aGUgT0IgV3JpdGUgT3BlcmF0aW9uLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZMQVNIX09CX1Byb2NlZWRXcml0ZU9wZXJhdGlvbih2b2lkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogVmVyaWZ5IHRoYXQgbmV4dCBvcGVyYXRpb24gY2FuIGJlIHByb2NlZWQgKi8KKyAgc3RhdHVzID0gRkxBU0hfV2FpdEZvckxhc3RPcGVyYXRpb24oRkxBU0hfVElNRU9VVF9WQUxVRSk7CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBTZXQgT1BUU1RSVCBCaXQgKi8KKyAgICBTRVRfQklUKEZMQVNILT5DUiwgRkxBU0hfQ1JfT1BUU1RSVCk7CisKKyAgICAvKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KKyAgICBzdGF0dXMgPSBGTEFTSF9XYWl0Rm9yTGFzdE9wZXJhdGlvbihGTEFTSF9USU1FT1VUX1ZBTFVFKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfRkxBU0hfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2dwaW8uYyBiL1NyYy9zdG0zMndieHhfaGFsX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg4MDllCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfZ3Bpby5jCkBAIC0wLDAgKzEsNTMzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9ncGlvLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEdQSU8gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoR1BJTykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgR1BJTyBQZXJpcGhlcmFsIGZlYXR1cmVzICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVhY2ggcG9ydCBiaXQgb2YgdGhlIGdlbmVyYWwtcHVycG9zZSBJL08gKEdQSU8pIHBvcnRzIGNhbiBiZSBpbmRpdmlkdWFsbHkKKyAgICAgICAgY29uZmlndXJlZCBieSBzb2Z0d2FyZSBpbiBzZXZlcmFsIG1vZGVzOgorICAgICAgICAoKyspIElucHV0IG1vZGUKKyAgICAgICAgKCsrKSBBbmFsb2cgbW9kZQorICAgICAgICAoKyspIE91dHB1dCBtb2RlCisgICAgICAgICgrKykgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUKKyAgICAgICAgKCsrKSBFeHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbGluZXMKKworICAgICgrKSBEdXJpbmcgYW5kIGp1c3QgYWZ0ZXIgcmVzZXQsIHRoZSBhbHRlcm5hdGUgZnVuY3Rpb25zIGFuZCBleHRlcm5hbCBpbnRlcnJ1cHQKKyAgICAgICAgbGluZXMgYXJlIG5vdCBhY3RpdmUgYW5kIHRoZSBJL08gcG9ydHMgYXJlIGNvbmZpZ3VyZWQgaW4gaW5wdXQgZmxvYXRpbmcgbW9kZS4KKworICAgICgrKSBBbGwgR1BJTyBwaW5zIGhhdmUgd2VhayBpbnRlcm5hbCBwdWxsLXVwIGFuZCBwdWxsLWRvd24gcmVzaXN0b3JzLCB3aGljaCBjYW4gYmUKKyAgICAgICAgYWN0aXZhdGVkIG9yIG5vdC4KKworICAgICgrKSBJbiBPdXRwdXQgb3IgQWx0ZXJuYXRlIG1vZGUsIGVhY2ggSU8gY2FuIGJlIGNvbmZpZ3VyZWQgb24gb3Blbi1kcmFpbiBvciBwdXNoLXB1bGwKKyAgICAgICAgdHlwZSBhbmQgdGhlIElPIHNwZWVkIGNhbiBiZSBzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIFZERCB2YWx1ZS4KKworICAgICgrKSBUaGUgbWljcm9jb250cm9sbGVyIElPIHBpbnMgYXJlIGNvbm5lY3RlZCB0byBvbmJvYXJkIHBlcmlwaGVyYWxzL21vZHVsZXMgdGhyb3VnaCBhCisgICAgICAgIG11bHRpcGxleGVyIHRoYXQgYWxsb3dzIG9ubHkgb25lIHBlcmlwaGVyYWwgYWx0ZXJuYXRlIGZ1bmN0aW9uIChBRikgY29ubmVjdGVkCisgICAgICAgdG8gYW4gSU8gcGluIGF0IGEgdGltZS4gSW4gdGhpcyB3YXksIHRoZXJlIGNhbiBiZSBubyBjb25mbGljdCBiZXR3ZWVuIHBlcmlwaGVyYWxzCisgICAgICAgc2hhcmluZyB0aGUgc2FtZSBJTyBwaW4uCisKKyAgICAoKykgQWxsIHBvcnRzIGhhdmUgZXh0ZXJuYWwgaW50ZXJydXB0L2V2ZW50IGNhcGFiaWxpdHkuIFRvIHVzZSBleHRlcm5hbCBpbnRlcnJ1cHQKKyAgICAgICAgbGluZXMsIHRoZSBwb3J0IG11c3QgYmUgY29uZmlndXJlZCBpbiBpbnB1dCBtb2RlLiBBbGwgYXZhaWxhYmxlIEdQSU8gcGlucyBhcmUKKyAgICAgICAgY29ubmVjdGVkIHRvIHRoZSAxNiBleHRlcm5hbCBpbnRlcnJ1cHQvZXZlbnQgbGluZXMgZnJvbSBFWFRJMCB0byBFWFRJMTUuCisKKyAgICAoKykgVGhlIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBjb250cm9sbGVyIGNvbnNpc3RzIG9mIHVwIHRvIDI4IGVkZ2UgZGV0ZWN0b3JzCisgICAgICAgICgxNiBsaW5lcyBhcmUgY29ubmVjdGVkIHRvIEdQSU8pIGZvciBnZW5lcmF0aW5nIGV2ZW50L2ludGVycnVwdCByZXF1ZXN0cyAoZWFjaAorICAgICAgICBpbnB1dCBsaW5lIGNhbiBiZSBpbmRlcGVuZGVudGx5IGNvbmZpZ3VyZWQgdG8gc2VsZWN0IHRoZSB0eXBlIChpbnRlcnJ1cHQgb3IgZXZlbnQpCisgICAgICAgIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4gRWFjaCBsaW5lIGNhbgorICAgICAgICBhbHNvIGJlIG1hc2tlZCBpbmRlcGVuZGVudGx5LgorCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCMpIEVuYWJsZSB0aGUgR1BJTyBBSEIgY2xvY2sgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjogX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4KKworICAgICgjKSBDb25maWd1cmUgdGhlIEdQSU8gcGluKHMpIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlIElPIG1vZGUgdXNpbmcgIk1vZGUiIG1lbWJlciBmcm9tIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICAgICAgICgrKykgQWN0aXZhdGUgUHVsbC11cCwgUHVsbC1kb3duIHJlc2lzdG9yIHVzaW5nICJQdWxsIiBtZW1iZXIgZnJvbSBHUElPX0luaXRUeXBlRGVmCisgICAgICAgICAgICAgc3RydWN0dXJlLgorICAgICAgICAoKyspIEluIGNhc2Ugb2YgT3V0cHV0IG9yIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbjogdGhlIHNwZWVkIGlzCisgICAgICAgICAgICAgY29uZmlndXJlZCB0aHJvdWdoICJTcGVlZCIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgSW4gYWx0ZXJuYXRlIG1vZGUgaXMgc2VsZWN0aW9uLCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uIGNvbm5lY3RlZCB0byB0aGUgSU8KKyAgICAgICAgICAgICBpcyBjb25maWd1cmVkIHRocm91Z2ggIkFsdGVybmF0ZSIgbWVtYmVyIGZyb20gR1BJT19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICAgICAgICgrKykgQW5hbG9nIG1vZGUgaXMgcmVxdWlyZWQgd2hlbiBhIHBpbiBpcyB0byBiZSB1c2VkIGFzIEFEQyBjaGFubmVsCisgICAgICAgICAgICAgb3IgREFDIG91dHB1dC4KKyAgICAgICAgKCsrKSBJbiBjYXNlIG9mIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBzZWxlY3Rpb24gdGhlICJNb2RlIiBtZW1iZXIgZnJvbQorICAgICAgICAgICAgIEdQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIHNlbGVjdCB0aGUgdHlwZSAoaW50ZXJydXB0IG9yIGV2ZW50KSBhbmQKKyAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyB0cmlnZ2VyIGV2ZW50IChyaXNpbmcgb3IgZmFsbGluZyBvciBib3RoKS4KKworICAgICgjKSBJbiBjYXNlIG9mIGV4dGVybmFsIGludGVycnVwdC9ldmVudCBtb2RlIHNlbGVjdGlvbiwgY29uZmlndXJlIE5WSUMgSVJRIHByaW9yaXR5CisgICAgICAgIG1hcHBlZCB0byB0aGUgRVhUSSBsaW5lIHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIGVuYWJsZSBpdCB1c2luZworICAgICAgICBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKworICAgICgjKSBUbyBnZXQgdGhlIGxldmVsIG9mIGEgcGluIGNvbmZpZ3VyZWQgaW4gaW5wdXQgbW9kZSB1c2UgSEFMX0dQSU9fUmVhZFBpbigpLgorCisgICAgKCMpIFRvIHNldC9yZXNldCB0aGUgbGV2ZWwgb2YgYSBwaW4gY29uZmlndXJlZCBpbiBvdXRwdXQgbW9kZSB1c2UKKyAgICAgICAgSEFMX0dQSU9fV3JpdGVQaW4oKS9IQUxfR1BJT19Ub2dnbGVQaW4oKS4KKworICAgKCMpIFRvIGxvY2sgcGluIGNvbmZpZ3VyYXRpb24gdW50aWwgbmV4dCByZXNldCB1c2UgSEFMX0dQSU9fTG9ja1BpbigpLgorICAKKyAgICAoIykgRHVyaW5nIGFuZCBqdXN0IGFmdGVyIHJlc2V0LCB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhcmUgbm90CisgICAgICAgIGFjdGl2ZSBhbmQgdGhlIEdQSU8gcGlucyBhcmUgY29uZmlndXJlZCBpbiBpbnB1dCBmbG9hdGluZyBtb2RlIChleGNlcHQgSlRBRworICAgICAgICBwaW5zKS4KKworICAgICgjKSBUaGUgTFNFIG9zY2lsbGF0b3IgcGlucyBPU0MzMl9JTiBhbmQgT1NDMzJfT1VUIGNhbiBiZSB1c2VkIGFzIGdlbmVyYWwgcHVycG9zZQorICAgICAgICAoUEMxNCBhbmQgUEMxNSwgcmVzcGVjdGl2ZWx5KSB3aGVuIHRoZSBMU0Ugb3NjaWxsYXRvciBpcyBvZmYuIFRoZSBMU0UgaGFzCisgICAgICAgIHByaW9yaXR5IG92ZXIgdGhlIEdQSU8gZnVuY3Rpb24uCisKKyAgICAoIykgVGhlIEhTRSBvc2NpbGxhdG9yIHBpbnMgT1NDX0lOL09TQ19PVVQgY2FuIGJlIHVzZWQgYXMKKyAgICAgICAgZ2VuZXJhbCBwdXJwb3NlIFBIMCBhbmQgUEgxLCByZXNwZWN0aXZlbHksIHdoZW4gdGhlIEhTRSBvc2NpbGxhdG9yIGlzIG9mZi4KKyAgICAgICAgVGhlIEhTRSBoYXMgcHJpb3JpdHkgb3ZlciB0aGUgR1BJTyBmdW5jdGlvbi4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJTworICAqIEB7CisgICovCisvKiogTUlTUkEgQzoyMDEyIGRldmlhdGlvbiBydWxlIGhhcyBiZWVuIGdyYW50ZWQgZm9yIGZvbGxvd2luZyBydWxlczoKKyAgKiBSdWxlLTEyLjIgLSBNZWRpdW06IFJIUyBhcmd1bWVudCBpcyBpbiBpbnRlcnZhbCBbMCxJTkZdIHdoaWNoIGlzIG91dCBvZgorICAqIHJhbmdlIG9mIHRoZSBzaGlmdCBvcGVyYXRvciBpbiBmb2xsb3dpbmcgQVBJIDoKKyAgKiBIQUxfR1BJT19Jbml0CisgICogSEFMX0dQSU9fRGVJbml0CisgICovCisKKyNpZmRlZiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEdQSU9fUHJpdmF0ZV9Db25zdGFudHMgR1BJTyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIEdQSU9fTU9ERSAgICAgICAgICAgICAoMHgwMDAwMDAwM3UpCisjZGVmaW5lIEVYVElfTU9ERSAgICAgICAgICAgICAoMHgxMDAwMDAwMHUpCisjZGVmaW5lIEdQSU9fTU9ERV9JVCAgICAgICAgICAoMHgwMDAxMDAwMHUpCisjZGVmaW5lIEdQSU9fTU9ERV9FVlQgICAgICAgICAoMHgwMDAyMDAwMHUpCisjZGVmaW5lIFJJU0lOR19FREdFICAgICAgICAgICAoMHgwMDEwMDAwMHUpCisjZGVmaW5lIEZBTExJTkdfRURHRSAgICAgICAgICAoMHgwMDIwMDAwMHUpCisjZGVmaW5lIEdQSU9fT1VUUFVUX1RZUEUgICAgICAoMHgwMDAwMDAxMHUpCisKKyNkZWZpbmUgR1BJT19OVU1CRVIgICAgICAgICAgICgxNnUpCisvKioKKyAgKiBAfQorICAqLworICAKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEdQSU94IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgR1BJT19Jbml0LgorICAqIEBwYXJhbSBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uSCkgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyV0J4eCBmYW1pbHkKKyAgKiBAcGFyYW0gR1BJT19Jbml0IHBvaW50ZXIgdG8gYSBHUElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBHUElPIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX0luaXQoR1BJT19UeXBlRGVmICAqR1BJT3gsIEdQSU9fSW5pdFR5cGVEZWYgKkdQSU9fSW5pdCkKK3sKKyAgdWludDMyX3QgcG9zaXRpb24gPSAweDAwdTsKKyAgdWludDMyX3QgaW9jdXJyZW50OworICB1aW50MzJfdCB0ZW1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19Jbml0LT5QaW4pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fTU9ERShHUElPX0luaXQtPk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUFVMTChHUElPX0luaXQtPlB1bGwpKTsKKworICAvKiBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAqLworICB3aGlsZSAoKChHUElPX0luaXQtPlBpbikgPj4gcG9zaXRpb24pICE9IDB4MDB1KQorICB7CisgICAgLyogR2V0IGN1cnJlbnQgaW8gcG9zaXRpb24gKi8KKyAgICBpb2N1cnJlbnQgPSAoR1BJT19Jbml0LT5QaW4pICYgKDF1TCA8PCBwb3NpdGlvbik7CisKKyAgICBpZiAoaW9jdXJyZW50ICE9IDB4MDB1KQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdQSU8gTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBJbiBjYXNlIG9mIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbiAqLworICAgICAgaWYoKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfUFApIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX09EKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgdGhlIEFsdGVybmF0ZSBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGX0lOU1RBTkNFKEdQSU94KSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIEFsdGVybmF0ZSBmdW5jdGlvbiBtYXBwZWQgd2l0aCB0aGUgY3VycmVudCBJTyAqLworICAgICAgICB0ZW1wID0gR1BJT3gtPkFGUltwb3NpdGlvbiA+PiAzdV07CisgICAgICAgIHRlbXAgJj0gfigweEZ1IDw8ICgocG9zaXRpb24gJiAweDA3dSkgKiA0dSkpOworICAgICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5BbHRlcm5hdGUpIDw8ICgocG9zaXRpb24gJiAweDA3dSkgKiA0dSkpOworICAgICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDN1XSA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBJTyBEaXJlY3Rpb24gbW9kZSAoSW5wdXQsIE91dHB1dCwgQWx0ZXJuYXRlIG9yIEFuYWxvZykgKi8KKyAgICAgIHRlbXAgPSBHUElPeC0+TU9ERVI7CisgICAgICB0ZW1wICY9IH4oR1BJT19NT0RFUl9NT0RFMCA8PCAocG9zaXRpb24gKiAydSkpOworICAgICAgdGVtcCB8PSAoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fTU9ERSkgPDwgKHBvc2l0aW9uICogMnUpKTsKKyAgICAgIEdQSU94LT5NT0RFUiA9IHRlbXA7CisKKyAgICAgIC8qIEluIGNhc2Ugb2YgT3V0cHV0IG9yIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHNlbGVjdGlvbiAqLworICAgICAgaWYoKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfT1VUUFVUX1BQKSB8fCAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9QUCkgfHwKKyAgICAgICAgIChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX09VVFBVVF9PRCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfT0QpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgU3BlZWQgcGFyYW1ldGVyICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX1NQRUVEKEdQSU9fSW5pdC0+U3BlZWQpKTsKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBJTyBTcGVlZCAqLworICAgICAgICB0ZW1wID0gR1BJT3gtPk9TUEVFRFI7CisgICAgICAgIHRlbXAgJj0gfihHUElPX09TUEVFRFJfT1NQRUVEMCA8PCAocG9zaXRpb24gKiAydSkpOworICAgICAgICB0ZW1wIHw9IChHUElPX0luaXQtPlNwZWVkIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisgICAgICAgIEdQSU94LT5PU1BFRURSID0gdGVtcDsKKworICAgICAgICAvKiBDb25maWd1cmUgdGhlIElPIE91dHB1dCBUeXBlICovCisgICAgICAgIHRlbXAgPSBHUElPeC0+T1RZUEVSOworICAgICAgICB0ZW1wICY9IH4oR1BJT19PVFlQRVJfT1QwIDw8IHBvc2l0aW9uKSA7CisgICAgICAgIHRlbXAgfD0gKCgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19PVVRQVVRfVFlQRSkgPj4gNHUpIDw8IHBvc2l0aW9uKTsKKyAgICAgICAgR1BJT3gtPk9UWVBFUiA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIC8qIEFjdGl2YXRlIHRoZSBQdWxsLXVwIG9yIFB1bGwgZG93biByZXNpc3RvciBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIHRlbXAgPSBHUElPeC0+UFVQRFI7CisgICAgICB0ZW1wICY9IH4oR1BJT19QVVBEUl9QVVBEMCA8PCAocG9zaXRpb24gKiAydSkpOworICAgICAgdGVtcCB8PSAoKEdQSU9fSW5pdC0+UHVsbCkgPDwgKHBvc2l0aW9uICogMnUpKTsKKyAgICAgIEdQSU94LT5QVVBEUiA9IHRlbXA7CisKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYVEkgTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX01PREUpID09IEVYVElfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgdGVtcCA9IFNZU0NGRy0+RVhUSUNSW3Bvc2l0aW9uID4+IDJ1XTsKKyAgICAgICAgdGVtcCAmPSB+KDB4MEZ1TCA8PCAoNHUgKiAocG9zaXRpb24gJiAweDAzdSkpKTsKKyAgICAgICAgdGVtcCB8PSAoR1BJT19HRVRfSU5ERVgoR1BJT3gpIDw8ICg0dSAqIChwb3NpdGlvbiAmIDB4MDN1KSkpOworICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAydV0gPSB0ZW1wOworCisgICAgICAgIC8qIENsZWFyIEVYVEkgbGluZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIHRlbXAgPSBFWFRJLT5JTVIxOworICAgICAgICB0ZW1wICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgaWYoKEdQSU9fSW5pdC0+TW9kZSAmIEdQSU9fTU9ERV9JVCkgPT0gR1BJT19NT0RFX0lUKQorICAgICAgICB7CisgICAgICAgICAgdGVtcCB8PSBpb2N1cnJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgRVhUSS0+SU1SMSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IEVYVEktPkVNUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFX0VWVCkgPT0gR1BJT19NT0RFX0VWVCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkVNUjEgPSB0ZW1wOworCisgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLworICAgICAgICB0ZW1wID0gRVhUSS0+UlRTUjE7CisgICAgICAgIHRlbXAgJj0gfihpb2N1cnJlbnQpOworICAgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlICYgUklTSU5HX0VER0UpID09IFJJU0lOR19FREdFKQorICAgICAgICB7CisgICAgICAgICAgdGVtcCB8PSBpb2N1cnJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgRVhUSS0+UlRTUjEgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBFWFRJLT5GVFNSMTsKKyAgICAgICAgdGVtcCAmPSB+KGlvY3VycmVudCk7CisgICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBGQUxMSU5HX0VER0UpID09IEZBTExJTkdfRURHRSkKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgfD0gaW9jdXJyZW50OworICAgICAgICB9CisgICAgICAgIEVYVEktPkZUU1IxID0gdGVtcDsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcG9zaXRpb24rKzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEdQSU94IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSBHUElPeCB3aGVyZSB4IGNhbiBiZSAoQS4uSCkgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwgZm9yIFNUTTMyV0J4eCBmYW1pbHkKKyAgKiBAcGFyYW0gR1BJT19QaW4gc3BlY2lmaWVzIHRoZSBwb3J0IGJpdCB0byBiZSB3cml0dGVuLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiBHUElPX1BJTl94IHdoZXJlIHggY2FuIGJlICgwLi4xNSkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgICpHUElPeCwgdWludDMyX3QgR1BJT19QaW4pCit7CisgIHVpbnQzMl90IHBvc2l0aW9uID0gMHgwMHU7CisgIHVpbnQzMl90IGlvY3VycmVudDsKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsKKworICAvKiBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAqLworICB3aGlsZSAoKEdQSU9fUGluID4+IHBvc2l0aW9uKSAhPSAweDAwdSkKKyAgeworICAgIC8qIEdldCBjdXJyZW50IGlvIHBvc2l0aW9uICovCisgICAgaW9jdXJyZW50ID0gKEdQSU9fUGluKSAmICgxdUwgPDwgcG9zaXRpb24pOworCisgICAgaWYgKGlvY3VycmVudCAhPSAweDAwdSkKKyAgICB7CisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVhUSSBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgLyogQ2xlYXIgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBFdmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIAorICAgICAgdG1wID0gU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMnVdOworICAgICAgdG1wICY9ICgweDBGVUwgPDwgKDR1ICogKHBvc2l0aW9uICYgMHgwM3UpKSk7CisgICAgICBpZiAodG1wID09IChHUElPX0dFVF9JTkRFWChHUElPeCkgPDwgKDR1ICogKHBvc2l0aW9uICYgMHgwM3UpKSkpCisgICAgICB7CisgICAgICAgIHRtcCA9IDB4MEZ1TCA8PCAoNHUgKiAocG9zaXRpb24gJiAweDAzdSkpOworICAgICAgICBTWVNDRkctPkVYVElDUltwb3NpdGlvbiA+PiAydV0gJj0gfnRtcDsKKworICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLworICAgICAgICBFWFRJLT5JTVIxICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgRVhUSS0+RU1SMSAmPSB+KGlvY3VycmVudCk7CisKKyAgICAgICAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovCisgICAgICAgIEVYVEktPlJUU1IxICY9IH4oaW9jdXJyZW50KTsKKyAgICAgICAgRVhUSS0+RlRTUjEgJj0gfihpb2N1cnJlbnQpOworICAgICAgfQorCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR1BJTyBNb2RlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgLyogQ29uZmlndXJlIElPIGluIEFuYWxvZyBNb2RlICovCisgICAgICBHUElPeC0+TU9ERVIgfD0gKEdQSU9fTU9ERVJfTU9ERTAgPDwgKHBvc2l0aW9uICogMnUpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IEFsdGVybmF0ZSBGdW5jdGlvbiBpbiBjdXJyZW50IElPICovCisgICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDN1XSAmPSB+KDB4RnUgPDwgKChwb3NpdGlvbiAmIDB4MDd1KSAqIDR1KSkgOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIElPIFNwZWVkICovCisgICAgICBHUElPeC0+T1NQRUVEUiAmPSB+KEdQSU9fT1NQRUVEUl9PU1BFRUQwIDw8IChwb3NpdGlvbiAqIDJ1KSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBJTyBPdXRwdXQgVHlwZSAqLworICAgICAgR1BJT3gtPk9UWVBFUiAgJj0gfihHUElPX09UWVBFUl9PVDAgPDwgcG9zaXRpb24pIDsKKworICAgICAgLyogRGVhY3RpdmF0ZSB0aGUgUHVsbC11cCBhbmQgUHVsbC1kb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLworICAgICAgR1BJT3gtPlBVUERSICY9IH4oR1BJT19QVVBEUl9QVVBEMCA8PCAocG9zaXRpb24gKiAydSkpOworICAgIH0KKyAgICAKKyAgICBwb3NpdGlvbisrOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKKyAqICBAYnJpZWYgR1BJTyBSZWFkLCBXcml0ZSwgVG9nZ2xlLCBMb2NrIGFuZCBFWFRJIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWFkIHRoZSBzcGVjaWZpZWQgaW5wdXQgcG9ydCBwaW4uCisgICogQHBhcmFtIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJXQnh4IGZhbWlseQorICAqIEBwYXJhbSBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIHJlYWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgR1BJT19QSU5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqIEByZXR2YWwgVGhlIGlucHV0IHBvcnQgcGluIHZhbHVlLgorICAqLworR1BJT19QaW5TdGF0ZSBIQUxfR1BJT19SZWFkUGluKEdQSU9fVHlwZURlZiogR1BJT3gsIHVpbnQxNl90IEdQSU9fUGluKQoreworICBHUElPX1BpblN0YXRlIGJpdHN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19QSU4oR1BJT19QaW4pKTsKKworICBpZiAoKEdQSU94LT5JRFIgJiBHUElPX1BpbikgIT0gMHgwMHUpCisgIHsKKyAgICBiaXRzdGF0dXMgPSBHUElPX1BJTl9TRVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgYml0c3RhdHVzID0gR1BJT19QSU5fUkVTRVQ7CisgIH0KKyAgcmV0dXJuIGJpdHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgb3IgY2xlYXIgdGhlIHNlbGVjdGVkIGRhdGEgcG9ydCBiaXQuCisgICoKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gdXNlcyBHUElPeF9CU1JSIGFuZCBHUElPeF9CUlIgcmVnaXN0ZXJzIHRvIGFsbG93IGF0b21pYyByZWFkL21vZGlmeQorICAqICAgICAgICAgYWNjZXNzZXMuIEluIHRoaXMgd2F5LCB0aGVyZSBpcyBubyByaXNrIG9mIGFuIElSUSBvY2N1cnJpbmcgYmV0d2VlbgorICAqICAgICAgICAgdGhlIHJlYWQgYW5kIHRoZSBtb2RpZnkgYWNjZXNzLgorICAqCisgICogQHBhcmFtIEdQSU94IHdoZXJlIHggY2FuIGJlIChBLi5GKSB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbCBmb3IgU1RNMzJXQnh4IGZhbWlseQorICAqIEBwYXJhbSBHUElPX1BpbiBzcGVjaWZpZXMgdGhlIHBvcnQgYml0IHRvIGJlIHdyaXR0ZW4uCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIEdQSU9fUElOX3ggd2hlcmUgeCBjYW4gYmUgKDAuLjE1KS4KKyAgKiBAcGFyYW0gUGluU3RhdGUgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzZWxlY3RlZCBiaXQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBHUElPX1BpblN0YXRlIGVudW0gdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBHUElPX1BJTl9SRVNFVDogdG8gY2xlYXIgdGhlIHBvcnQgcGluCisgICogICAgICAgICAgICBAYXJnIEdQSU9fUElOX1NFVDogdG8gc2V0IHRoZSBwb3J0IHBpbgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfR1BJT19Xcml0ZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbiwgR1BJT19QaW5TdGF0ZSBQaW5TdGF0ZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTl9BQ1RJT04oUGluU3RhdGUpKTsKKworICBpZihQaW5TdGF0ZSAhPSBHUElPX1BJTl9SRVNFVCkKKyAgeworICAgIEdQSU94LT5CU1JSID0gKHVpbnQzMl90KUdQSU9fUGluOworICB9CisgIGVsc2UKKyAgeworICAgIEdQSU94LT5CUlIgPSAodWludDMyX3QpR1BJT19QaW47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUb2dnbGUgdGhlIHNwZWNpZmllZCBHUElPIHBpbi4KKyAgKiBAcGFyYW0gR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkgpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMldCeHggZmFtaWx5CisgICogQHBhcmFtIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcGluIHRvIGJlIHRvZ2dsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9HUElPX1RvZ2dsZVBpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0dQSU9fUElOKEdQSU9fUGluKSk7CisKKyAgaWYgKChHUElPeC0+T0RSICYgR1BJT19QaW4pICE9IDB4MDB1KQorICB7CisgICAgR1BJT3gtPkJSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBHUElPeC0+QlNSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKKyAgfQorfQorCisvKioKKyogQGJyaWVmICBMb2NrIEdQSU8gUGlucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAbm90ZSAgIFRoZSBsb2NrZWQgcmVnaXN0ZXJzIGFyZSBHUElPeF9NT0RFUiwgR1BJT3hfT1RZUEVSLCBHUElPeF9PU1BFRURSLAorICAqICAgICAgICAgR1BJT3hfUFVQRFIsIEdQSU94X0FGUkwgYW5kIEdQSU94X0FGUkguCisgICogQG5vdGUgICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbG9ja2VkIEdQSU8gcGlucyBjYW4gbm8gbG9uZ2VyIGJlIG1vZGlmaWVkCisgICogICAgICAgICB1bnRpbCB0aGUgbmV4dCByZXNldC4KKyAgKiBAcGFyYW0gR1BJT3ggd2hlcmUgeCBjYW4gYmUgKEEuLkgpIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsIGZvciBTVE0zMldCeHggZmFtaWx5CisgICogQHBhcmFtIEdQSU9fUGluIHNwZWNpZmllcyB0aGUgcG9ydCBiaXRzIHRvIGJlIGxvY2tlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgR1BJT19QaW5feCB3aGVyZSB4IGNhbiBiZSAoMC4uMTUpLgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0dQSU9fTG9ja1BpbihHUElPX1R5cGVEZWYqIEdQSU94LCB1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgX19JTyB1aW50MzJfdCB0bXAgPSBHUElPX0xDS1JfTENLSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19MT0NLX0lOU1RBTkNFKEdQSU94KSk7CisgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOworCisgIC8qIEFwcGx5IGxvY2sga2V5IHdyaXRlIHNlcXVlbmNlICovCisgIHRtcCB8PSBHUElPX1BpbjsKKyAgLyogU2V0IExDS3ggYml0KHMpOiBMQ0tLPScxJyArIExDS1sxNS0wXSAqLworICBHUElPeC0+TENLUiA9IHRtcDsKKyAgLyogUmVzZXQgTENLeCBiaXQocyk6IExDS0s9JzAnICsgTENLWzE1LTBdICovCisgIEdQSU94LT5MQ0tSID0gR1BJT19QaW47CisgIC8qIFNldCBMQ0t4IGJpdChzKTogTENLSz0nMScgKyBMQ0tbMTUtMF0gKi8KKyAgR1BJT3gtPkxDS1IgPSB0bXA7CisgIC8qIFJlYWQgTENLSyByZWdpc3Rlci4gVGhpcyByZWFkIGlzIG1hbmRhdG9yeSB0byBjb21wbGV0ZSBrZXkgbG9jayBzZXF1ZW5jZSAqLworICB0bXAgPSBHUElPeC0+TENLUjsKKworICAvKiByZWFkIGFnYWluIGluIG9yZGVyIHRvIGNvbmZpcm0gbG9jayBpcyBhY3RpdmUgKi8KKyAgaWYgKChHUElPeC0+TENLUiAmIEdQSU9fTENLUl9MQ0tLKSAhPSAweDAwdSkKKyAgeworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBFWFRJIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSBHUElPX1BpbiBTcGVjaWZpZXMgdGhlIHBvcnQgcGluIGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0dQSU9fRVhUSV9JUlFIYW5kbGVyKHVpbnQxNl90IEdQSU9fUGluKQoreworICAvKiBFWFRJIGxpbmUgaW50ZXJydXB0IGRldGVjdGVkICovCisgIGlmKF9fSEFMX0dQSU9fRVhUSV9HRVRfSVQoR1BJT19QaW4pICE9IDB4MDB1KQorICB7CisgICAgX19IQUxfR1BJT19FWFRJX0NMRUFSX0lUKEdQSU9fUGluKTsKKyAgICBIQUxfR1BJT19FWFRJX0NhbGxiYWNrKEdQSU9fUGluKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgbGluZSBkZXRlY3Rpb24gY2FsbGJhY2suCisgICogQHBhcmFtIEdQSU9fUGluIFNwZWNpZmllcyB0aGUgcG9ydCBwaW4gY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgRVhUSSBsaW5lLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayh1aW50MTZfdCBHUElPX1BpbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoR1BJT19QaW4pOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0dQSU9fRVhUSV9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfR1BJT19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2hzZW0uYyBiL1NyYy9zdG0zMndieHhfaGFsX2hzZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZkZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfaHNlbS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9oc2VtLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEhTRU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgc2VtYXBob3JlIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgU2VtYXBob3JlIFRha2UgZnVuY3Rpb24gKDItU3RlcCBQcm9jZWR1cmUpICwgbm9uIGJsb2NraW5nCisgICogICAgICAgICAgICsgU2VtYXBob3JlIEZhc3RUYWtlIGZ1bmN0aW9uICgxLVN0ZXAgUHJvY2VkdXJlKSAsIG5vbiBibG9ja2luZworICAqICAgICAgICAgICArIFNlbWFwaG9yZSBTdGF0dXMgY2hlY2sKKyAgKiAgICAgICAgICAgKyBTZW1hcGhvcmUgQ2xlYXIgS2V5IFNldCBhbmQgR2V0CisgICogICAgICAgICAgICsgUmVsZWFzZSBhbmQgcmVsZWFzZSBhbGwgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgU2VtYXBob3JlIG5vdGlmaWNhdGlvbiBlbmFibGluZyBhbmQgZGlzYWJsaW5nIGFuZCBjYWxsbmFjayBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICoKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICAoIylUYWtlIGEgc2VtYXBob3JlIEluIDItU3RlcCBtb2RlIFVzaW5nIGZ1bmN0aW9uIEhBTF9IU0VNX1Rha2UuIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyA6CisgICAgICAgICAgICgrKykgdGhlIHNlbWFwaG9yZSBJRCBmcm9tIDAgdG8gMzEKKyAgICAgICAgICAgKCsrKSB0aGUgcHJvY2VzcyBJRCBmcm9tIDAgdG8gMjU1CisgICAgICAoIykgRmFzdCBUYWtlIHNlbWFwaG9yZSBJbiAxLVN0ZXAgbW9kZSBVc2luZyBmdW5jdGlvbiBIQUxfSFNFTV9GYXN0VGFrZS4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXIgOgorICAgICAgICAgICAoKyspIHRoZSBzZW1hcGhvcmUgSUQgZnJvbSAwX0lEIHRvIDMxLiBOb3RlIHRoYXQgdGhlIHByb2Nlc3MgSUQgdmFsdWUgaXMgaW1wbGljaXRseSBhc3N1bWVkIGFzIHplcm8KKyAgICAgICgjKSBDaGVjayBpZiBhIHNlbWFwaG9yZSBpcyBUYWtlbiB1c2luZyBmdW5jdGlvbiBIQUxfSFNFTV9Jc1NlbVRha2VuLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlciA6CisgICAgICAgICAgKCsrKSB0aGUgc2VtYXBob3JlIElEIGZyb20gMF9JRCB0byAzMQorICAgICAgICAgICgrKykgSXQgcmV0dXJucyAxIGlmIHRoZSBnaXZlbiBzZW1hcGhvcmUgaXMgdGFrZW4gb3RoZXJ3aXNlIChGcmVlKSB6ZXJvCisgICAgICAoIylSZWxlYXNlIGEgc2VtYXBob3JlIHVzaW5nIGZ1bmN0aW9uIHdpdGggSEFMX0hTRU1fUmVsZWFzZS4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIDoKKyAgICAgICAgICAgKCsrKSB0aGUgc2VtYXBob3JlIElEIGZyb20gMCB0byAzMQorICAgICAgICAgICAoKyspIHRoZSBwcm9jZXNzIElEIGZyb20gMCB0byAyNTU6CisgICAgICAgICAgICgrKykgTm90ZTogSWYgUHJvY2Vzc0lEIGFuZCBNYXN0ZXJJRCBtYXRjaCwgc2VtYXBob3JlIGlzIGZyZWVkLCBhbmQgYW4gaW50ZXJydXB0CisgICAgICAgICBtYXkgYmUgZ2VuZXJhdGVkIHdoZW4gZW5hYmxlZCAobm90aWZpY2F0aW9uIGFjdGl2YXRlZCkuIElmIFByb2Nlc3NJRCBvciBNYXN0ZXJJRCBkb2VzIG5vdCBtYXRjaCwKKyAgICAgICAgIHNlbWFwaG9yZSByZW1haW5zIHRha2VuIChsb2NrZWQpCisKKyAgICAgICgjKVJlbGVhc2UgYWxsIHNlbWFwaG9yZXMgYXQgb25jZSB0YWtlbiBieSBhIGdpdmVuIE1hc3RlciB1c2luZyBmdW5jdGlvbiBIQUxfSFNFTV9SZWxlYXNlX0FsbAorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyA6CisgICAgICAgICAgICgrKykgdGhlIFJlbGVhc2UgS2V5ICh2YWx1ZSBmcm9tIDAgdG8gMHhGRkZGKSBjYW4gYmUgU2V0IG9yIEdldCByZXNwZWN0aXZlbHkgYnkKKyAgICAgICAgICAgICAgSEFMX0hTRU1fU2V0Q2xlYXJLZXkoKSBvciBIQUxfSFNFTV9HZXRDbGVhcktleSBmdW5jdGlvbnMKKyAgICAgICAgICAgKCsrKSB0aGUgTWFzdGVyIElEOgorICAgICAgICAgICAoKyspIE5vdGU6IElmIHRoZSBLZXkgYW5kIE1hc3RlcklEIG1hdGNoLCBhbGwgc2VtYXBob3JlcyB0YWtlbiBieSB0aGUgZ2l2ZW4gQ1BVIHRoYXQgY29ycmVzcG9uZHMKKyAgICAgICAgICAgdG8gTWFzdGVySUQgIHdpbGwgYmUgZnJlZWQsIGFuZCBhbiBpbnRlcnJ1cHQgbWF5IGJlIGdlbmVyYXRlZCB3aGVuIGVuYWJsZWQgKG5vdGlmaWNhdGlvbiBhY3RpdmF0ZWQpLiBJZiB0aGUKKyAgICAgICAgICAgS2V5IG9yIHRoZSBNYXN0ZXJJRCBkb2Vzbid0IG1hdGNoLCBzZW1hcGhvcmVzIHJlbWFpbnMgdGFrZW4gKGxvY2tlZCkKKworICAgICAgKCMpU2VtYXBob3JlcyBSZWxlYXNlIGFsbCBrZXkgZnVuY3Rpb25zOgorICAgICAgICAgKCsrKSAgSEFMX0hTRU1fU2V0Q2xlYXJLZXkoKSB0byBzZXQgc2VtYXBob3JlIHJlbGVhc2UgYWxsIEtleQorICAgICAgICAgKCsrKSAgSEFMX0hTRU1fR2V0Q2xlYXJLZXkoKSB0byBnZXQgcmVsZWFzZSBhbGwgS2V5CisgICAgICAoIylTZW1hcGhvcmVzIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMgOgorICAgICAgICAgKCsrKSAgSEFMX0hTRU1fQWN0aXZhdGVOb3RpZmljYXRpb24gdG8gYWN0aXZhdGUgYSBub3RpZmljYXRpb24gY2FsbGJhY2sgb24KKyAgICAgICAgICAgICAgIGEgZ2l2ZW4gc2VtYXBob3JlcyBNYXNrIChiaXRmaWVsZCkuIFdoZW4gb25lIG9yIG1vcmUgc2VtYXBob3JlcyBkZWZpbmVkIGJ5IHRoZSBtYXNrIGFyZSByZWxlYXNlZAorICAgICAgICAgICAgICAgdGhlIGNhbGxiYWNrIEhBTF9IU0VNX0ZyZWVDYWxsYmFjayB3aWxsIGJlIGFzc2VydGVkIGdpdmluZyBhcyBwYXJhbWV0ZXJzIGEgbWFzayBvZiB0aGUgcmVsZWFzZWQKKyAgICAgICAgICAgICAgIHNlbWFwaG9yZXMgKGJpdGZpZWxkKS4KKworICAgICAgICAgKCsrKSAgSEFMX0hTRU1fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbiB0byBkZWFjdGl2YXRlIHRoZSBub3RpZmljYXRpb24gb2YgYSBnaXZlbiBzZW1hcGhvcmVzIE1hc2sgKGJpdGZpZWxkKS4KKyAgICAgICAgICgrKykgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjcm8gX19IQUxfSFNFTV9TRU1JRF9UT19NQVNLIHRvIGNoZWNrIGhvdyB0byBjYWxjdWxhdGUgYSBzZW1hcGhvcmUgbWFzaworICAgICAgICAgICAgICAgIFVzZWQgYnkgdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMKKyAgICAgKioqIEhTRU0gSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0gQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBIU0VNIEhBTCBkcml2ZXIuCisKKyAgICAgICgrKSBfX0hBTF9IU0VNX1NFTUlEX1RPX01BU0s6IEhlbHBlciBtYWNybyB0byBjb252ZXJ0IGEgU2VtYXBob3JlIElEIHRvIGEgTWFzay4KKyAgICAgIFsuLl0gRXhhbXBsZSBvZiB1c2UgOgorICAgICAgWy4uXSBtYXNrID0gX19IQUxfSFNFTV9TRU1JRF9UT19NQVNLKDgpICB8ICBfX0hBTF9IU0VNX1NFTUlEX1RPX01BU0soMjEpIHwgX19IQUxfSFNFTV9TRU1JRF9UT19NQVNLKDI1KS4KKyAgICAgIFsuLl0gQWxsIG5leHQgbWFjcm9zIHRha2UgYXMgcGFyYW1ldGVyIGEgc2VtYXBob3JlIE1hc2sgKGJpdGZpbGVkKSB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyAgX19IQUxfSFNFTV9TRU1JRF9UT19NQVNLIGFzIHRoZSBhYm92ZSBleGFtcGxlLgorICAgICAgKCspIF9fSEFMX0hTRU1fRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBzZW1hcGhvcmVzIE1hc2sgaW50ZXJydXB0cy4KKyAgICAgICgrKSBfX0hBTF9IU0VNX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBzZW1hcGhvcmVzIE1hc2sgaW50ZXJydXB0cy4KKyAgICAgICgrKSBfX0hBTF9IU0VNX0dFVF9JVDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZW1hcGhvcmUgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCisgICAgICAoKykgX19IQUxfSFNFTV9HRVRfRkxBRzogR2V0IHRoZSBzZW1hcGhvcmVzIHN0YXR1cyByZWxlYXNlIGZsYWdzLgorICAgICAgKCspIF9fSEFMX0hTRU1fQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIHNlbWFwaG9yZXMgc3RhdHVzIHJlbGVhc2UgZmxhZ3MuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSFNFTSBIU0VNCisgICogQGJyaWVmIEhTRU0gSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0hTRU1fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChEVUFMX0NPUkUpCisjaWZuZGVmIEhTRU1fUl9NQVNURVJJRAorI2RlZmluZSBIU0VNX1JfTUFTVEVSSUQgSFNFTV9SX0NPUkVJRAorI2VuZGlmCisKKyNpZm5kZWYgSFNFTV9STFJfTUFTVEVSSUQKKyNkZWZpbmUgSFNFTV9STFJfTUFTVEVSSUQgSFNFTV9STFJfQ09SRUlECisjZW5kaWYKKworI2lmbmRlZiBIU0VNX0NSX01BU1RFUklECisjZGVmaW5lIEhTRU1fQ1JfTUFTVEVSSUQgSFNFTV9DUl9DT1JFSUQKKyNlbmRpZgorI2VuZGlmIC8qIERVQUxfQ09SRSAqLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgSFNFTV9FeHBvcnRlZF9GdW5jdGlvbnMgIEhTRU0gRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBIU0VNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgVGFrZSBhbmQgUmVsZWFzZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEhTRU0gVGFrZSBhbmQgUmVsZWFzZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEhTRU0gVGFrZSBhbmQgUmVsZWFzZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1suLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBUYWtlIGEgc2VtYXBob3JlIHdpdGggMiBTdGVwIG1ldGhvZAorICAgICAgKCspIEZhc3QgVGFrZSBhIHNlbWFwaG9yZSB3aXRoIDEgU3RlcCBtZXRob2QKKyAgICAgICgrKSBDaGVjayBzZW1hcGhvcmUgc3RhdGUgVGFrZW4gb3Igbm90CisgICAgICAoKykgUmVsZWFzZSBhIHNlbWFwaG9yZQorICAgICAgKCspIFJlbGVhc2UgYWxsIHNlbWFwaG9yZSBhdCBvbmNlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKworLyoqCisgICogQGJyaWVmICBUYWtlIGEgc2VtYXBob3JlIGluIDIgU3RlcCBtb2RlLgorICAqIEBwYXJhbSAgU2VtSUQ6IHNlbWFwaG9yZSBJRCBmcm9tIDAgdG8gMzEKKyAgKiBAcGFyYW0gIFByb2Nlc3NJRDogUHJvY2VzcyBJRCBmcm9tIDAgdG8gMjU1CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgSEFMX0hTRU1fVGFrZSh1aW50MzJfdCBTZW1JRCwgdWludDMyX3QgUHJvY2Vzc0lEKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSFNFTV9TRU1JRChTZW1JRCkpOworICBhc3NlcnRfcGFyYW0oSVNfSFNFTV9QUk9DRVNTSUQoUHJvY2Vzc0lEKSk7CisKKyAgLyogRmlyc3Qgc3RlcCAgd3JpdGUgUiByZWdpc3RlciB3aXRoIE1hc3RlcklELCBwcm9jZXNzSUQgYW5kIHRha2UgYml0PTEqLworICBIU0VNLT5SW1NlbUlEXSA9IChQcm9jZXNzSUQgfCBIU0VNX0NSX0NPUkVJRF9DVVJSRU5UIHwgSFNFTV9SX0xPQ0spOworCisgIC8qIHNlY29uZCBzdGVwIDogcmVhZCB0aGUgUiByZWdpc3RlciAuIFRha2UgYWNoaWV2ZWQgaWYgTWFzdGVySUQgYW5kIHByb2Nlc3NJRCBtYXRjaCBhbmQgdGFrZSBiaXQgc2V0IHRvIDEgKi8KKyAgaWYgKEhTRU0tPlJbU2VtSURdID09IChQcm9jZXNzSUQgfCBIU0VNX0NSX0NPUkVJRF9DVVJSRU5UIHwgSFNFTV9SX0xPQ0spKQorICB7CisgICAgLyp0YWtlIHN1Y2Nlc3Mgd2hlbiBNYXN0ZXJJRCBhbmQgUHJvY2Vzc0lEIG1hdGNoIGFuZCB0YWtlIGJpdCBzZXQqLworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKworICAvKiBTZW1hcGhvcmUgdGFrZSBmYWlscyovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgRmFzdCBUYWtlIGEgc2VtYXBob3JlIHdpdGggMSBTdGVwIG1vZGUuCisgICogQHBhcmFtICBTZW1JRDogc2VtYXBob3JlIElEIGZyb20gMCB0byAzMQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hTRU1fRmFzdFRha2UodWludDMyX3QgU2VtSUQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19IU0VNX1NFTUlEKFNlbUlEKSk7CisKKyAgLyogUmVhZCB0aGUgUkxSIHJlZ2lzdGVyIHRvIHRha2UgdGhlIHNlbWFwaG9yZSAqLworICBpZiAoSFNFTS0+UkxSW1NlbUlEXSA9PSAoSFNFTV9DUl9DT1JFSURfQ1VSUkVOVCB8IEhTRU1fUkxSX0xPQ0spKQorICB7CisgICAgLyp0YWtlIHN1Y2Nlc3Mgd2hlbiBNYXN0ZXJJRCBtYXRjaCBhbmQgdGFrZSBiaXQgc2V0Ki8KKyAgICByZXR1cm4gSEFMX09LOworICB9CisKKyAgLyogU2VtYXBob3JlIHRha2UgZmFpbHMgKi8KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKy8qKgorICAqIEBicmllZiAgQ2hlY2sgc2VtYXBob3JlIHN0YXRlIFRha2VuIG9yIG5vdC4KKyAgKiBAcGFyYW0gIFNlbUlEOiBzZW1hcGhvcmUgSUQKKyAgKiBAcmV0dmFsIEhBTCBIU0VNIHN0YXRlCisgICovCit1aW50MzJfdCBIQUxfSFNFTV9Jc1NlbVRha2VuKHVpbnQzMl90IFNlbUlEKQoreworICByZXR1cm4gKCgoSFNFTS0+UltTZW1JRF0gJiBIU0VNX1JfTE9DSykgIT0gMFUpID8gMVVMIDogMFVMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJlbGVhc2UgYSBzZW1hcGhvcmUuCisgICogQHBhcmFtICBTZW1JRDogc2VtYXBob3JlIElEIGZyb20gMCB0byAzMQorICAqIEBwYXJhbSAgUHJvY2Vzc0lEOiBQcm9jZXNzIElEIGZyb20gMCB0byAyNTUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgIEhBTF9IU0VNX1JlbGVhc2UodWludDMyX3QgU2VtSUQsIHVpbnQzMl90IFByb2Nlc3NJRCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hTRU1fU0VNSUQoU2VtSUQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0hTRU1fUFJPQ0VTU0lEKFByb2Nlc3NJRCkpOworCisgIC8qIENsZWFyIHRoZSBzZW1hcGhvcmUgYnkgd3JpdGluZyB0byB0aGUgUiByZWdpc3RlciA6IHRoZSBNYXN0ZXJJRCAsIHRoZSBwcm9jZXNzSUQgYW5kIHRha2UgYml0ID0gMCAgKi8KKyAgSFNFTS0+UltTZW1JRF0gPSAoUHJvY2Vzc0lEIHwgSFNFTV9DUl9DT1JFSURfQ1VSUkVOVCk7CisKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIEFsbCBzZW1hcGhvcmUgdXNlZCBieSBhIGdpdmVuIE1hc3RlciAuCisgICogQHBhcmFtICBLZXk6IFNlbWFwaG9yZSBLZXkgLCB2YWx1ZSBmcm9tIDAgdG8gMHhGRkZGCisgICogQHBhcmFtICBDb3JlSUQ6IENvcmVJRCBvZiB0aGUgQ1BVIHRoYXQgaXMgdXNpbmcgc2VtYXBob3JlcyB0byBiZSByZWxlYXNlZAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSFNFTV9SZWxlYXNlQWxsKHVpbnQzMl90IEtleSwgdWludDMyX3QgQ29yZUlEKQoreworICBhc3NlcnRfcGFyYW0oSVNfSFNFTV9LRVkoS2V5KSk7CisgIGFzc2VydF9wYXJhbShJU19IU0VNX0NPUkVJRChDb3JlSUQpKTsKKworICBIU0VNLT5DUiA9ICgoS2V5IDw8IEhTRU1fQ1JfS0VZX1BvcykgfCAoQ29yZUlEIDw8IEhTRU1fQ1JfQ09SRUlEX1BvcykpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhTRU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBIU0VNIFNldCBhbmQgR2V0IEtleSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEhTRU0gU2V0IGFuZCBHZXQgS2V5IGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAjIyMjIyBIU0VNIFNldCBhbmQgR2V0IEtleSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTZXQgc2VtYXBob3JlIEtleQorICAgICAgKCspIEdldCBzZW1hcGhvcmUgS2V5CitAZW5kdmVyYmF0aW0KKworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IHNlbWFwaG9yZSBLZXkgLgorICAqIEBwYXJhbSAgS2V5OiBTZW1hcGhvcmUgS2V5ICwgdmFsdWUgZnJvbSAwIHRvIDB4RkZGRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCAgSEFMX0hTRU1fU2V0Q2xlYXJLZXkodWludDMyX3QgS2V5KQoreworICBhc3NlcnRfcGFyYW0oSVNfSFNFTV9LRVkoS2V5KSk7CisKKyAgTU9ESUZZX1JFRyhIU0VNLT5LRVlSLCBIU0VNX0tFWVJfS0VZLCAoS2V5IDw8IEhTRU1fS0VZUl9LRVlfUG9zKSk7CisKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgc2VtYXBob3JlIEtleSAuCisgICogQHJldHZhbCBTZW1hcGhvcmUgS2V5ICwgdmFsdWUgZnJvbSAwIHRvIDB4RkZGRgorICAqLwordWludDMyX3QgSEFMX0hTRU1fR2V0Q2xlYXJLZXkodm9pZCkKK3sKKyAgcmV0dXJuIChIU0VNLT5LRVlSID4+IEhTRU1fS0VZUl9LRVlfUG9zKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBIU0VNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgSFNFTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICogIEBicmllZiAgICBIU0VNIE5vdGlmaWNhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICMjIyMjIEhTRU0gSVJRIGhhbmRsZXIgbWFuYWdlbWVudCBhbmQgTm90aWZpY2F0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1suLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBIU0VNIElSUSBoYW5kbGVyIGFuZCBOb3RpZmljYXRpb24gZnVuY3Rpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgU2VtYXBob3JlIHJlbGVhc2UgTm90aWZpY2F0aW9uIGZvciBhIGdpdmVuIFNlbWFwaG9yZXMgTWFzayAuCisgICogQHBhcmFtICBTZW1NYXNrOiBNYXNrIG9mIFJlbGVhc2VkIHNlbWFwaG9yZXMKKyAgKiBAcmV0dmFsIFNlbWFwaG9yZSBLZXkKKyAgKi8KK3ZvaWQgSEFMX0hTRU1fQWN0aXZhdGVOb3RpZmljYXRpb24odWludDMyX3QgU2VtTWFzaykKK3sKKyAgSFNFTV9DT01NT04tPklFUiB8PSBTZW1NYXNrOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgU2VtYXBob3JlIHJlbGVhc2UgTm90aWZpY2F0aW9uIGZvciBhIGdpdmVuIFNlbWFwaG9yZXMgTWFzayAuCisgICogQHBhcmFtICBTZW1NYXNrOiBNYXNrIG9mIFJlbGVhc2VkIHNlbWFwaG9yZXMKKyAgKiBAcmV0dmFsIFNlbWFwaG9yZSBLZXkKKyAgKi8KK3ZvaWQgSEFMX0hTRU1fRGVhY3RpdmF0ZU5vdGlmaWNhdGlvbih1aW50MzJfdCBTZW1NYXNrKQoreworICBIU0VNX0NPTU1PTi0+SUVSICY9IH5TZW1NYXNrOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBIU0VNIGludGVycnVwdCByZXF1ZXN0CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9IU0VNX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgdWludDMyX3Qgc3RhdHVzcmVnOworICAvKiBHZXQgdGhlIGxpc3Qgb2YgbWFza2VkIGZyZWVkIHNlbWFwaG9yZXMqLworICBzdGF0dXNyZWcgPSBIU0VNX0NPTU1PTi0+TUlTUjsKKworICAvKkRpc2FibGUgSW50ZXJydXB0cyovCisgIEhTRU1fQ09NTU9OLT5JRVIgJj0gfigodWludDMyX3Qpc3RhdHVzcmVnKTsKKworICAvKkNsZWFyIEZsYWdzKi8KKyAgSFNFTV9DT01NT04tPklDUiA9ICgodWludDMyX3Qpc3RhdHVzcmVnKTsKKworICAvKiBDYWxsIEZyZWVDYWxsYmFjayAqLworICBIQUxfSFNFTV9GcmVlQ2FsbGJhY2soc3RhdHVzcmVnKTsKK30KKworLyoqCisgICogQGJyaWVmIFNlbWFwaG9yZSBSZWxlYXNlZCBDYWxsYmFjay4KKyAgKiBAcGFyYW0gU2VtTWFzazogTWFzayBvZiBSZWxlYXNlZCBzZW1hcGhvcmVzCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSFNFTV9GcmVlQ2FsbGJhY2sodWludDMyX3QgU2VtTWFzaykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoU2VtTWFzayk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICB0aGUgSEFMX0hTRU1fRnJlZUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9IU0VNX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfaTJjLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjVmMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfaTJjLmMKQEAgLTAsMCArMSw2NTAyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9pMmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEludGVyIEludGVncmF0ZWQgQ2lyY3VpdCAoSTJDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoZSBJMkMgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBJMkNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgSTJDX0hhbmRsZVR5cGVEZWYgIGhpMmM7CisKKyAgICAoIylJbml0aWFsaXplIHRoZSBJMkMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEByZWYgSEFMX0kyQ19Nc3BJbml0KCkgQVBJOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgSTJDeCBpbnRlcmZhY2UgY2xvY2sKKyAgICAgICAgKCMjKSBJMkMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgSTJDIEdQSU9zCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgSTJDIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIG9wZW4tZHJhaW4KKyAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIEkyQ3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgSTJDIElSUSBDaGFubmVsCisgICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgY2hhbm5lbAorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgaGFuZGxlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4IG9yIFJ4IGNoYW5uZWwKKyAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgaGkyYyBETUEgVHggb3IgUnggaGFuZGxlCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24KKyAgICAgICAgICAgICAgICAgIHRoZSBETUEgVHggb3IgUnggY2hhbm5lbAorCisgICAgKCMpIENvbmZpZ3VyZSB0aGUgQ29tbXVuaWNhdGlvbiBDbG9jayBUaW1pbmcsIE93biBBZGRyZXNzMSwgTWFzdGVyIEFkZHJlc3NpbmcgbW9kZSwgRHVhbCBBZGRyZXNzaW5nIG1vZGUsCisgICAgICAgIE93biBBZGRyZXNzMiwgT3duIEFkZHJlc3MyIE1hc2ssIEdlbmVyYWwgY2FsbCBhbmQgTm9zdHJldGNoIG1vZGUgaW4gdGhlIGhpMmMgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpLCBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZQorICAgICAgICAoR1BJTywgQ0xPQ0ssIE5WSUMuLi5ldGMpIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgQHJlZiBIQUxfSTJDX01zcEluaXQoJmhpMmMpIEFQSS4KKworICAgICgjKSBUbyBjaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLCB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KCkKKworICAgICgjKSBGb3IgSTJDIElPIGFuZCBJTyBNRU0gb3BlcmF0aW9ucywgdGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXQoKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmUoKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXQoKQorICAgICAgKCspIFJlY2VpdmUgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKCkKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gTUVNIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdyaXRlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdG8gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcyB1c2luZyBAcmVmIEhBTF9JMkNfTWVtX1dyaXRlKCkKKyAgICAgICgrKSBSZWFkIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nIEByZWYgSEFMX0kyQ19NZW1fUmVhZCgpCisKKworICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKykgRW5kIG9mIGFib3J0IHByb2Nlc3MsIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworCisgICAgKioqIEludGVycnVwdCBtb2RlIG9yIERNQSBtb2RlIElPIHNlcXVlbnRpYWwgb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoQCkgVGhlc2UgaW50ZXJmYWNlcyBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW50aWFsIHRyYW5zZmVyIHdpdGggYSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24KKyAgICAgICAgICB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgICBbLi5dCisgICAgICAoKykgQSBzcGVjaWZpYyBvcHRpb24gZmllbGQgbWFuYWdlIHRoZSBkaWZmZXJlbnQgc3RlcHMgb2YgYSBzZXF1ZW50aWFsIHRyYW5zZmVyCisgICAgICAoKykgT3B0aW9uIGZpZWxkIHZhbHVlcyBhcmUgZGVmaW5lZCB0aHJvdWdoIEByZWYgSTJDX1hGRVJPUFRJT05TIGFuZCBhcmUgbGlzdGVkIGJlbG93OgorICAgICAgKCsrKSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUU6IE5vIHNlcXVlbnRpYWwgdXNhZ2UsIGZ1bmN0aW9ubmFsIGlzIHNhbWUgYXMgYXNzb2NpYXRlZCBpbnRlcmZhY2VzIGluIG5vIHNlcXVlbnRpYWwgbW9kZQorICAgICAgKCsrKSBJMkNfRklSU1RfRlJBTUU6IFNlcXVlbnRpYWwgdXNhZ2UsIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVlbmNlIHdpdGggc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRhdGEgdG8gdHJhbnNmZXIgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uCisgICAgICAoKyspIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSAoTWFzdGVyIG9ubHkpLCB0aGlzIG9wdGlvbiBhbGxvdyB0byBtYW5hZ2UgYSBzZXF1ZW5jZSB3aXRoIHN0YXJ0IGNvbmRpdGlvbiwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkYXRhIHRvIHRyYW5zZmVyIHdpdGhvdXQgYSBmaW5hbCBzdG9wIGNvbmRpdGlvbiwgYW4gdGhlbiBwZXJtaXQgYSBjYWxsIHRoZSBzYW1lIG1hc3RlciBzZXF1ZW50aWFsIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyYWwgdGltZXMgKGxpa2UgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQoKSB0aGVuIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBAcmVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEoKSB0aGVuIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpKQorICAgICAgKCsrKSBJMkNfTkVYVF9GUkFNRTogU2VxdWVudGlhbCB1c2FnZSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgc2VxdWVuY2Ugd2l0aCBhIHJlc3RhcnQgY29uZGl0aW9uLCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdpdGggbmV3IGRhdGEgdG8gdHJhbnNmZXIgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2Ugb3IgbWFuYWdlIG9ubHkgdGhlIG5ldyBkYXRhIHRvIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gZGlyZWN0aW9uIGNoYW5nZSBhbmQgd2l0aG91dCBhIGZpbmFsIHN0b3AgY29uZGl0aW9uIGluIGJvdGggY2FzZXMKKyAgICAgICgrKykgSTJDX0xBU1RfRlJBTUU6IFNlcXVlbnRpYWwgdXNhZ2UsIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHNlcXVhbmNlIHdpdGggYSByZXN0YXJ0IGNvbmRpdGlvbiwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB3aXRoIG5ldyBkYXRhIHRvIHRyYW5zZmVyIGlmIHRoZSBkaXJlY3Rpb24gY2hhbmdlIG9yIG1hbmFnZSBvbmx5IHRoZSBuZXcgZGF0YSB0byB0cmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vIGRpcmVjdGlvbiBjaGFuZ2UgYW5kIHdpdGggYSBmaW5hbCBzdG9wIGNvbmRpdGlvbiBpbiBib3RoIGNhc2VzCisgICAgICAoKyspIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1A6IFNlcXVlbnRpYWwgdXNhZ2UgKE1hc3RlciBvbmx5KSwgdGhpcyBvcHRpb24gYWxsb3cgdG8gbWFuYWdlIGEgcmVzdGFydCBjb25kaXRpb24gYWZ0ZXIgc2V2ZXJhbCBjYWxsIG9mIHRoZSBzYW1lIG1hc3RlciBzZXF1ZW50aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHNldmVyYWwgdGltZXMgKGxpbmsgd2l0aCBvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2FnZSBjYW4sIHRyYW5zZmVyIHNldmVyYWwgYnl0ZXMgb25lIGJ5IG9uZSB1c2luZyBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfSVQob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQShvcHRpb24gSTJDX0ZJUlNUX0FORF9ORVhUX0ZSQU1FIHRoZW4gSTJDX05FWFRfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEob3B0aW9uIEkyQ19GSVJTVF9BTkRfTkVYVF9GUkFNRSB0aGVuIEkyQ19ORVhUX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVuIHVzYWdlIG9mIHRoaXMgb3B0aW9uIEkyQ19MQVNUX0ZSQU1FX05PX1NUT1AgYXQgdGhlIGxhc3QgVHJhbnNtaXQgb3IgUmVjZWl2ZSBzZXF1ZW5jZSBwZXJtaXQgdG8gY2FsbCB0aGUgb3Bvc2l0ZSBpbnRlcmZhY2UgUmVjZWl2ZSBvciBUcmFuc21pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzdG9wcGluZyB0aGUgY29tbXVuaWNhdGlvbiBhbmQgc28gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbi4KKyAgICAgICgrKykgSTJDX09USEVSX0ZSQU1FOiBTZXF1ZW50aWFsIHVzYWdlIChNYXN0ZXIgb25seSksIHRoaXMgb3B0aW9uIGFsbG93IHRvIG1hbmFnZSBhIHJlc3RhcnQgY29uZGl0aW9uIGFmdGVyIGVhY2ggY2FsbCBvZiB0aGUgc2FtZSBtYXN0ZXIgc2VxdWVudGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2FnZSBjYW4sIHRyYW5zZmVyIHNldmVyYWwgYnl0ZXMgb25lIGJ5IG9uZSB3aXRoIGEgcmVzdGFydCB3aXRoIHNsYXZlIGFkZHJlc3MgYmV0d2VlbiBlYWNoIGJ5dGVzIHVzaW5nIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQob3B0aW9uIEkyQ19GSVJTVF9GUkFNRSB0aGVuIEkyQ19PVEhFUl9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEob3B0aW9uIEkyQ19GSVJTVF9GUkFNRSB0aGVuIEkyQ19PVEhFUl9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQShvcHRpb24gSTJDX0ZJUlNUX0ZSQU1FIHRoZW4gSTJDX09USEVSX0ZSQU1FKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVuIHVzYWdlIG9mIHRoaXMgb3B0aW9uIEkyQ19PVEhFUl9BTkRfTEFTVF9GUkFNRSBhdCB0aGUgbGFzdCBmcmFtZSB0byBoZWxwIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIFNUT1AgY29uZGl0aW9uLgorCisgICAgICAoKykgRGlmZmVyZW50cyBzZXF1ZW50aWFsIEkyQyBpbnRlcmZhY2VzIGFyZSBsaXN0ZWQgYmVsb3c6CisgICAgICAoKyspIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgIG9yIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQoKQorICAgICAgICAgICAgb3IgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoKQorICAgICAgKCsrKykgQXQgcmVjZXB0aW9uIGVuZCBvZiBjdXJyZW50IGZyYW1lIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgQWJvcnQgYSBtYXN0ZXIgSVQgb3IgRE1BIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKysrKSBFbmQgb2YgYWJvcnQgcHJvY2VzcywgQHJlZiBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpCisgICAgICAoKyspIEVuYWJsZS9kaXNhYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIGluIHNsYXZlIEkyQyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19FbmFibGVMaXN0ZW5fSVQoKSBAcmVmIEhBTF9JMkNfRGlzYWJsZUxpc3Rlbl9JVCgpCisgICAgICAoKysrKSBXaGVuIGFkZHJlc3Mgc2xhdmUgSTJDIG1hdGNoLCBAcmVmIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgdG8gY2hlY2sgdGhlIEFkZHJlc3MgTWF0Y2ggQ29kZSBhbmQgdGhlIHRyYW5zbWlzc2lvbiBkaXJlY3Rpb24gcmVxdWVzdCBieSBtYXN0ZXIgKFdyaXRlL1JlYWQpLgorICAgICAgKCsrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEByZWYgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAoKyspIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gc2xhdmUgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVCgpCisgICAgICAgICAgICBvciB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKysrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIGN1cnJlbnQgZnJhbWUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgU2VxdWVudGlhbCByZWNlaXZlIGluIHNsYXZlIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9JVCgpCisgICAgICAgICAgICBvciB1c2luZyBAcmVmIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgY3VycmVudCBmcmFtZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKyspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9Xcml0ZV9JVCgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiB3cml0ZSB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVhZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdCBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3MgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWVtX1JlYWRfSVQoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2YgcmVhZCB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorCisgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciwgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZworICAgICAgICAgIEByZWYgSEFMX0kyQ19NYXN0ZXJfUmVjZWl2ZV9ETUEoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcKKyAgICAgICAgICBAcmVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfRE1BKCkKKyAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX1NsYXZlX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyIEkyQyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQgdXNpbmcgQHJlZiBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKykgRW5kIG9mIGFib3J0IHByb2Nlc3MsIEByZWYgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIERpc2NhcmQgYSBzbGF2ZSBJMkMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHVzaW5nIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0soKSBtYWNyby4KKyAgICAgICAgICAgVGhpcyBhY3Rpb24gd2lsbCBpbmZvcm0gTWFzdGVyIHRvIGdlbmVyYXRlIGEgU3RvcCBjb25kaXRpb24gdG8gZGlzY2FyZCB0aGUgY29tbXVuaWNhdGlvbi4KKworICAgICoqKiBETUEgbW9kZSBJTyBNRU0gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoKQorICAgICAgKCspIEF0IE1lbW9yeSBlbmQgb2Ygd3JpdGUgdHJhbnNmZXIsIEByZWYgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlYWQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzIHVzaW5nCisgICAgICAgICAgQHJlZiBIQUxfSTJDX01lbV9SZWFkX0RNQSgpCisgICAgICAoKykgQXQgTWVtb3J5IGVuZCBvZiByZWFkIHRyYW5zZmVyLCBAcmVmIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisKKworICAgICAqKiogSTJDIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSTJDIEhBTCBkcml2ZXIuCisKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19FTkFCTEU6IEVuYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19ESVNBQkxFOiBEaXNhYmxlIHRoZSBJMkMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfSTJDX0dFTkVSQVRFX05BQ0s6IEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIEkyQyBwZXJpcGhlcmFsIGluIFNsYXZlIG1vZGUKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19HRVRfRkxBRzogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19DTEVBUl9GTEFHOiBDbGVhciB0aGUgc3BlY2lmaWVkIEkyQyBwZW5kaW5nIGZsYWcKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQKKyAgICAgICgrKSBAcmVmIF9fSEFMX0kyQ19ESVNBQkxFX0lUOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdAorCisgICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9JMkNfUmVnaXN0ZXJDYWxsYmFjaygpIG9yIEByZWYgSEFMX0kyQ19SZWdpc3RlckFkZHJDYWxsYmFjaygpCisgICAgIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKyAgICBbLi5dCisgICAgIEZ1bmN0aW9uIEByZWYgSEFMX0kyQ19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVUeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVSeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTGlzdGVuQ3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgZW5kIG9mIGxpc3RlbiBtb2RlLgorICAgICAgICgrKSBNZW1UeENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNZW1vcnkgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTWVtUnhDcGx0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTWVtb3J5IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgYWJvcnQgY29tcGxldGlvbiBwcm9jZXNzLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKyAgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIEFkZHJDYWxsYmFjayB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrcyA6IEByZWYgSEFMX0kyQ19SZWdpc3RlckFkZHJDYWxsYmFjaygpLgorICAgIFsuLl0KKyAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0kyQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICBAcmVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIE1lbVR4Q3BsdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1lbW9yeSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNZW1SeENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNZW1vcnkgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBhYm9ydCBjb21wbGV0aW9uIHByb2Nlc3MuCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgIFsuLl0KKyAgICAgRm9yIGNhbGxiYWNrIEFkZHJDYWxsYmFjayB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrcyA6IEByZWYgSEFMX0kyQ19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKCkuCisgICAgWy4uXQorICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfSTJDX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUCisgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgICAgZXhhbXBsZXMgQHJlZiBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjaygpLgorICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQorICAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpLyBAcmVmIEhBTF9JMkNfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0kyQ19Jbml0KCkvIEByZWYgSEFMX0kyQ19EZUluaXQoKQorICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpIHdoYXRldmVyIHRoZSBzdGF0ZS4KKyAgICBbLi5dCisgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICBpbiBAcmVmIEhBTF9JMkNfU1RBVEVfUkVBRFkgb3IgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgIHVzaW5nIEByZWYgSEFMX0kyQ19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfSTJDX0RlSW5pdCgpCisgICAgIG9yIEByZWYgSEFMX0kyQ19Jbml0KCkgZnVuY3Rpb24uCisgICAgWy4uXQorICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIEkyQyBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkMgSTJDCisgICogQGJyaWVmIEkyQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfSTJDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX0RlZmluZSBJMkMgUHJpdmF0ZSBEZWZpbmUKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1JTkdfQ0xFQVJfTUFTSyAgICgweEYwRkZGRkZGVSkgIC8qITwgSTJDIFRJTUlORyBjbGVhciByZWdpc3RlciBNYXNrICovCisjZGVmaW5lIEkyQ19USU1FT1VUX0FERFIgICAgKDEwMDAwVSkgICAgICAgLyohPCAxMCBzICAqLworI2RlZmluZSBJMkNfVElNRU9VVF9CVVNZICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfRElSICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1JYTkUgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9TVE9QRiAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfVEMgICAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEkyQ19USU1FT1VUX1RDUiAgICAgKDI1VSkgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBJMkNfVElNRU9VVF9UWElTICAgICgyNVUpICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVRfRkxBRyAgICAoMjVVKSAgICAgICAgICAvKiE8IDI1IG1zICovCisKKyNkZWZpbmUgTUFYX05CWVRFX1NJWkUgICAgICAyNTVVCisjZGVmaW5lIFNsYXZlQWRkcl9TSElGVCAgICAgN1UKKyNkZWZpbmUgU2xhdmVBZGRyX01TSyAgICAgICAweDA2VQorCisvKiBQcml2YXRlIGRlZmluZSBmb3IgQHJlZiBQcmV2aW91c1N0YXRlIHVzYWdlICovCisjZGVmaW5lIEkyQ19TVEFURV9NU0sgICAgICAgICAgICAgKCh1aW50MzJfdCkoKHVpbnQzMl90KSgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1RYIHwgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9SWCkgJiAodWludDMyX3QpKH4oKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfUkVBRFkpKSkpIC8qITwgTWFzayBTdGF0ZSBkZWZpbmUsIGtlZXAgb25seSBSWCBhbmQgVFggYml0cyAgICAgICAgICAgICovCisjZGVmaW5lIEkyQ19TVEFURV9OT05FICAgICAgICAgICAgKCh1aW50MzJfdCkoSEFMX0kyQ19NT0RFX05PTkUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWZhdWx0IFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9UWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9NQVNURVIpKSAgICAgICAgICAgIC8qITwgTWFzdGVyIEJ1c3kgVFgsIGNvbWJpbmFpc29uIG9mIFN0YXRlIExTQiBhbmQgTW9kZSBlbnVtICovCisjZGVmaW5lIEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWCAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfUlggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfTUFTVEVSKSkgICAgICAgICAgICAvKiE8IE1hc3RlciBCdXN5IFJYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAqLworI2RlZmluZSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCAgICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1RYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX1NMQVZFKSkgICAgICAgICAgICAgLyohPCBTbGF2ZSBCdXN5IFRYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAgKi8KKyNkZWZpbmUgSTJDX1NUQVRFX1NMQVZFX0JVU1lfUlggICAoKHVpbnQzMl90KSgoKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfQlVTWV9SWCAmIEkyQ19TVEFURV9NU0spIHwgKHVpbnQzMl90KUhBTF9JMkNfTU9ERV9TTEFWRSkpICAgICAgICAgICAgIC8qITwgU2xhdmUgQnVzeSBSWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gICovCisjZGVmaW5lIEkyQ19TVEFURV9NRU1fQlVTWV9UWCAgICAgKCh1aW50MzJfdCkoKCh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0JVU1lfVFggJiBJMkNfU1RBVEVfTVNLKSB8ICh1aW50MzJfdClIQUxfSTJDX01PREVfTUVNKSkgICAgICAgICAgICAgICAvKiE8IE1lbW9yeSBCdXN5IFRYLCBjb21iaW5haXNvbiBvZiBTdGF0ZSBMU0IgYW5kIE1vZGUgZW51bSAqLworI2RlZmluZSBJMkNfU1RBVEVfTUVNX0JVU1lfUlggICAgICgodWludDMyX3QpKCgodWludDMyX3QpSEFMX0kyQ19TVEFURV9CVVNZX1JYICYgSTJDX1NUQVRFX01TSykgfCAodWludDMyX3QpSEFMX0kyQ19NT0RFX01FTSkpICAgICAgICAgICAgICAgLyohPCBNZW1vcnkgQnVzeSBSWCwgY29tYmluYWlzb24gb2YgU3RhdGUgTFNCIGFuZCBNb2RlIGVudW0gKi8KKworCisvKiBQcml2YXRlIGRlZmluZSB0byBjZW50cmFsaXplIHRoZSBlbmFibGUvZGlzYWJsZSBvZiBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEkyQ19YRkVSX1RYX0lUICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgSTJDX1hGRVJfUlhfSVQgICAgICAgICAgKDB4MDAwMDAwMDJVKQorI2RlZmluZSBJMkNfWEZFUl9MSVNURU5fSVQgICAgICAoMHgwMDAwMDAwNFUpCisKKyNkZWZpbmUgSTJDX1hGRVJfRVJST1JfSVQgICAgICAgKDB4MDAwMDAwMTFVKQorI2RlZmluZSBJMkNfWEZFUl9DUExUX0lUICAgICAgICAoMHgwMDAwMDAxMlUpCisjZGVmaW5lIEkyQ19YRkVSX1JFTE9BRF9JVCAgICAgICgweDAwMDAwMDEyVSkKKworLyogUHJpdmF0ZSBkZWZpbmUgU2VxdWVudGlhbCBUcmFuc2ZlciBPcHRpb25zIGRlZmF1bHQvcmVzZXQgdmFsdWUgKi8KKyNkZWZpbmUgSTJDX05PX09QVElPTl9GUkFNRSAgICAgKDB4RkZGRjAwMDBVKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX0Z1bmN0aW9ucyBJMkMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIERNQSB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSTJDX0RNQVNsYXZlVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFTbGF2ZVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIEkyQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJMkNfRE1BQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyB0byBoYW5kbGUgSVQgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVEFkZHJDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKTsKK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlclNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpOworc3RhdGljIHZvaWQgSTJDX0lUU2xhdmVTZXFDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKTsKK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lUU2xhdmVDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzKTsKK3N0YXRpYyB2b2lkIEkyQ19JVExpc3RlbkNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpOworc3RhdGljIHZvaWQgSTJDX0lURXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEVycm9yQ29kZSk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHRvIGhhbmRsZSBJVCB0cmFuc2ZlciAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19SZXF1ZXN0TWVtb3J5V3JpdGUoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlSZWFkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBmb3IgSTJDIHRyYW5zZmVyIElSUSBoYW5kbGVyICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX01hc3Rlcl9JU1JfSVQoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1NsYXZlX0lTUl9JVChzdHJ1Y3QgX19JMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncywgdWludDMyX3QgSVRTb3VyY2VzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9ETUEoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcyk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1NsYXZlX0lTUl9ETUEoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcyk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIHRvIGhhbmRsZSBmbGFncyBkdXJpbmcgcG9sbGluZyB0cmFuc2ZlciAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblJYTkVGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfSXNBY2tub3dsZWRnZUZhaWxlZChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgdG8gY2VudHJhbGl6ZSB0aGUgZW5hYmxlL2Rpc2FibGUgb2YgSW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgSTJDX0VuYWJsZV9JUlEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpOworc3RhdGljIHZvaWQgSTJDX0Rpc2FibGVfSVJRKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiB0byBmbHVzaCBUWERSIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBJMkNfRmx1c2hfVFhEUihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CisKKy8qIFByaXZhdGUgZnVuY3Rpb24gdG8gaGFuZGxlICBzdGFydCwgcmVzdGFydCBvciBzdG9wIGEgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIEkyQ19UcmFuc2ZlckNvbmZpZyhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCBTaXplLCB1aW50MzJfdCBNb2RlLCB1aW50MzJfdCBSZXF1ZXN0KTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiB0byBDb252ZXJ0IFNwZWNpZmljIG9wdGlvbnMgKi8KK3N0YXRpYyB2b2lkIEkyQ19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnMgSTJDIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlaW5pdGlhbGl6ZSB0aGUgSTJDeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IEltcGxlbWVudCBIQUxfSTJDX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgRE1BLCBJVCBhbmQgTlZJQyApLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyQ19Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBzZWxlY3RlZCBkZXZpY2Ugd2l0aAorICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOgorICAgICAgICAoKyspIENsb2NrIFRpbWluZworICAgICAgICAoKyspIE93biBBZGRyZXNzIDEKKyAgICAgICAgKCsrKSBBZGRyZXNzaW5nIG1vZGUgKE1hc3RlciwgU2xhdmUpCisgICAgICAgICgrKykgRHVhbCBBZGRyZXNzaW5nIG1vZGUKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMiBNYXNrCisgICAgICAgICgrKykgR2VuZXJhbCBjYWxsIG1vZGUKKyAgICAgICAgKCsrKSBOb3N0cmV0Y2ggbW9kZQorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0kyQ19EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgSTJDeCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBJMkMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIEkyQ19Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogQ2hlY2sgdGhlIEkyQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGkyYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MxKGhpMmMtPkluaXQuT3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BRERSRVNTSU5HX01PREUoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0RVQUxfQUREUkVTUyhoaTJjLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfSTJDX09XTl9BRERSRVNTMihoaTJjLT5Jbml0Lk93bkFkZHJlc3MyKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MyX01BU0soaGkyYy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfR0VORVJBTF9DQUxMKGhpMmMtPkluaXQuR2VuZXJhbENhbGxNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfTk9fU1RSRVRDSChoaTJjLT5Jbml0Lk5vU3RyZXRjaE1vZGUpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoaTJjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIEkyQyBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGhpMmMtPk1hc3RlclR4Q3BsdENhbGxiYWNrID0gSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoaTJjLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclJ4Q3BsdENhbGxiYWNrICovCisgICAgaGkyYy0+U2xhdmVUeENwbHRDYWxsYmFjayAgPSBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBTbGF2ZVR4Q3BsdENhbGxiYWNrICAqLworICAgIGhpMmMtPlNsYXZlUnhDcGx0Q2FsbGJhY2sgID0gSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICBoaTJjLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgICA9IEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIExpc3RlbkNwbHRDYWxsYmFjayAgICovCisgICAgaGkyYy0+TWVtVHhDcGx0Q2FsbGJhY2sgICAgPSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBNZW1UeENwbHRDYWxsYmFjayAgICAqLworICAgIGhpMmMtPk1lbVJ4Q3BsdENhbGxiYWNrICAgID0gSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjazsgICAgLyogTGVnYWN5IHdlYWsgTWVtUnhDcGx0Q2FsbGJhY2sgICAgKi8KKyAgICBoaTJjLT5FcnJvckNhbGxiYWNrICAgICAgICA9IEhBTF9JMkNfRXJyb3JDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2sgICAgPSBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAqLworICAgIGhpMmMtPkFkZHJDYWxsYmFjayAgICAgICAgID0gSEFMX0kyQ19BZGRyQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWRkckNhbGxiYWNrICAgICAgICAgKi8KKworICAgIGlmIChoaTJjLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoaTJjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfSTJDX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIGhpMmMtPk1zcEluaXRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIEhBTF9JMkNfTXNwSW5pdChoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovCisgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IFRJTUlOR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgSTJDeDogRnJlcXVlbmN5IHJhbmdlICovCisgIGhpMmMtPkluc3RhbmNlLT5USU1JTkdSID0gaGkyYy0+SW5pdC5UaW1pbmcgJiBUSU1JTkdfQ0xFQVJfTUFTSzsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogRGlzYWJsZSBPd24gQWRkcmVzczEgYmVmb3JlIHNldCB0aGUgT3duIEFkZHJlc3MxIGNvbmZpZ3VyYXRpb24gKi8KKyAgaGkyYy0+SW5zdGFuY2UtPk9BUjEgJj0gfkkyQ19PQVIxX09BMUVOOworCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBPd24gQWRkcmVzczEgYW5kIGFjayBvd24gYWRkcmVzczEgbW9kZSAqLworICBpZiAoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBJMkNfQUREUkVTU0lOR01PREVfN0JJVCkKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgaGkyYy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgIH0KKyAgZWxzZSAvKiBJMkNfQUREUkVTU0lOR01PREVfMTBCSVQgKi8KKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgSTJDX09BUjFfT0ExTU9ERSB8IGhpMmMtPkluaXQuT3duQWRkcmVzczEpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBBZGRyZXNzaW5nIE1hc3RlciBtb2RlICovCisgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgPSAoSTJDX0NSMl9BREQxMCk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBBVVRPRU5EIGJ5IGRlZmF1bHQsIGFuZCBlbmFibGUgTkFDSyAoc2hvdWxkIGJlIGRpc2FibGUgb25seSBkdXJpbmcgU2xhdmUgcHJvY2VzcyAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IChJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX05BQ0spOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IE9BUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBEaXNhYmxlIE93biBBZGRyZXNzMiBiZWZvcmUgc2V0IHRoZSBPd24gQWRkcmVzczIgY29uZmlndXJhdGlvbiAqLworICBoaTJjLT5JbnN0YW5jZS0+T0FSMiAmPSB+STJDX0RVQUxBRERSRVNTX0VOQUJMRTsKKworICAvKiBDb25maWd1cmUgSTJDeDogRHVhbCBtb2RlIGFuZCBPd24gQWRkcmVzczIgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPk9BUjIgPSAoaGkyYy0+SW5pdC5EdWFsQWRkcmVzc01vZGUgfCBoaTJjLT5Jbml0Lk93bkFkZHJlc3MyIHwgKGhpMmMtPkluaXQuT3duQWRkcmVzczJNYXNrcyA8PCA4KSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBJMkN4OiBHZW5lcmFsY2FsbCBhbmQgTm9TdHJldGNoIG1vZGUgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMSA9IChoaTJjLT5Jbml0LkdlbmVyYWxDYWxsTW9kZSB8IGhpMmMtPkluaXQuTm9TdHJldGNoTW9kZSk7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9JMkNfRU5BQkxFKGhpMmMpOworCisgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgSTJDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfRGVJbml0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgSTJDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaTJjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfSU5TVEFOQ0UoaGkyYy0+SW5zdGFuY2UpKTsKKworICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBJMkMgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9JMkNfRElTQUJMRShoaTJjKTsKKworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoaTJjLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JMkNfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgaGkyYy0+TXNwRGVJbml0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX0kyQ19Nc3BEZUluaXQoaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVTRVQ7CisgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfTk9ORTsKKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIEkyQyBNU1AuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTXNwSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBJMkMgTVNQLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX01zcERlSW5pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBJMkMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX0xJU1RFTl9DT01QTEVURV9DQl9JRCBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NRU1fVFhfQ09NUExFVEVfQ0JfSUQgTWVtb3J5IFR4IFRyYW5zZmVyIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTUVNX1JYX0NPTVBMRVRFX0NCX0lEIE1lbW9yeSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX0FCT1JUX0NCX0lEIEFib3J0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIEhBTF9JMkNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEkyQ19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoSEFMX0kyQ19TVEFURV9SRUFEWSA9PSBoaTJjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMkNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5TbGF2ZVR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19MSVNURU5fQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUVNX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWVtVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUVNX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWVtUnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaTJjLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX0FCT1JUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaTJjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfSTJDX1NUQVRFX1JFU0VUID09IGhpMmMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0kyQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBJMkMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEkyQyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX01FTV9UWF9DT01QTEVURV9DQl9JRCBNZW1vcnkgVHggVHJhbnNmZXIgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NRU1fUlhfQ09NUExFVEVfQ0JfSUQgTWVtb3J5IFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSTJDX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9JMkNfQUJPUlRfQ0JfSUQgQWJvcnQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0kyQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1VuUmVnaXN0ZXJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgSEFMX0kyQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoSEFMX0kyQ19TVEFURV9SRUFEWSA9PSBoaTJjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JMkNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJUeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gSEFMX0kyQ19NYXN0ZXJSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX1NsYXZlVHhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVUeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPlNsYXZlUnhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19MSVNURU5fQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaTJjLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIExpc3RlbkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JMkNfTUVNX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TWVtVHhDcGx0Q2FsbGJhY2sgPSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBNZW1UeENwbHRDYWxsYmFjayAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01FTV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1lbVJ4Q3BsdENhbGxiYWNrID0gSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgTWVtUnhDcGx0Q2FsbGJhY2sgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhpMmMtPkVycm9yQ2FsbGJhY2sgPSBIQUxfSTJDX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19BQk9SVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPkFib3J0Q3BsdENhbGxiYWNrID0gSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0kyQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0kyQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfSTJDX1NUQVRFX1JFU0VUID09IGhpMmMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0kyQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGkyYy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0kyQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSTJDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpMmMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0kyQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIHRoZSBTbGF2ZSBBZGRyZXNzIE1hdGNoIEkyQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQWRkcmVzcyBNYXRjaCBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19SZWdpc3RlckFkZHJDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgcEkyQ19BZGRyQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgaWYgKEhBTF9JMkNfU1RBVEVfUkVBRFkgPT0gaGkyYy0+U3RhdGUpCisgIHsKKyAgICBoaTJjLT5BZGRyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBTbGF2ZSBBZGRyZXNzIE1hdGNoIEkyQyBDYWxsYmFjaworICAqICAgICAgICAgSW5mbyBSZWFkeSBJMkMgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfSTJDX0FkZHJDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoSEFMX0kyQ19TVEFURV9SRUFEWSA9PSBoaTJjLT5TdGF0ZSkKKyAgeworICAgIGhpMmMtPkFkZHJDYWxsYmFjayA9IEhBTF9JMkNfQWRkckNhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBBZGRyQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEkyQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgSTJDIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICAoKyspIEJsb2NraW5nIG1vZGUgOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gdGhlIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgIFRoZSBzdGF0dXMgb2YgYWxsIGRhdGEgcHJvY2Vzc2luZyBpcyByZXR1cm5lZCBieSB0aGUgc2FtZSBmdW5jdGlvbgorICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICgrKykgTm8tQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgICBvciBETUEuIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgc3RhcnR1cC4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgZGVkaWNhdGVkIEkyQyBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuCisgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKworICAgICgjKSBCbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyBhcmUgOgorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0KCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1JlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtX1dyaXRlKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9SZWFkKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fV3JpdGVfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWVtX1JlYWRfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0VuYWJsZUxpc3Rlbl9JVCgpCisgICAgICAgICgrKykgSEFMX0kyQ19EaXNhYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9BYm9ydF9JVCgpCisKKyAgICAoIykgTm8tQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgd2l0aCBETUEgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NZW1fV3JpdGVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbV9SZWFkX0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICgrKykgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEoKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX01lbVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSTJDX0FkZHJDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXRzIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQlVTWSwgU0VULCBJMkNfVElNRU9VVF9CVVNZLCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisKKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWElTIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICpoaTJjLT5wQnVmZlB0cjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisKKyAgICAgIGlmICgoaGkyYy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaGkyYy0+WGZlclNpemUgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRDUiBmbGFnIGlzIHNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVENSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmVzIGluIG1hc3RlciBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19CVVNZLCBTRVQsIEkyQ19USU1FT1VUX0JVU1ksIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisKKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgc2V0ICovCisgICAgICBpZiAoSTJDX1dhaXRPblJYTkVGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisKKyAgICAgIGlmICgoaGkyYy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaGkyYy0+WGZlclNpemUgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRDUiBmbGFnIGlzIHNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfVENSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25TVE9QRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+TW9kZSAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0cyBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogV2FpdCB1bnRpbCBBRERSIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0FERFIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKworICAgIC8qIElmIDEwYml0IGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZCAqLworICAgIGlmIChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEkyQ19BRERSRVNTSU5HTU9ERV8xMEJJVCkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIEFERFIgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19BRERSLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogQ2xlYXIgQUREUiBmbGFnICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKyAgICB9CisKKyAgICAvKiBXYWl0IHVudGlsIERJUiBmbGFnIGlzIHNldCBUcmFuc21pdHRlciBtb2RlICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0RJUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIHdoaWxlIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICpoaTJjLT5wQnVmZlB0cjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICAvKiBXYWl0IHVudGlsIFNUT1AgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblNUT1BGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgICAgIGlmIChoaTJjLT5FcnJvckNvZGUgPT0gSEFMX0kyQ19FUlJPUl9BRikKKyAgICAgIHsKKyAgICAgICAgLyogTm9ybWFsIHVzZSBjYXNlIGZvciBUcmFuc21pdHRlciBtb2RlICovCisgICAgICAgIC8qIEEgTkFDSyBpcyBnZW5lcmF0ZWQgdG8gY29uZmlybSB0aGUgZW5kIG9mIHRyYW5zZmVyICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBXYWl0IHVudGlsIEJVU1kgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19CVVNZLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGkyYy0+WGZlcklTUiAgID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogV2FpdCB1bnRpbCBBRERSIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0FERFIsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKworICAgIC8qIFdhaXQgdW50aWwgRElSIGZsYWcgaXMgcmVzZXQgUmVjZWl2ZXIgbW9kZSAqLworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19ESVIsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgd2hpbGUgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnIGlzIHNldCAqLworICAgICAgaWYgKEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChoaTJjLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgICAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1JYTkUpID09IFNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgICAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgU1RPUCBmbGFnIGlzIHNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogRGlzYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2xlYXIgU1RPUCBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgLyogV2FpdCB1bnRpbCBCVVNZIGZsYWcgaXMgcmVzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfQlVTWSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBtYXN0ZXIgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB4ZmVybW9kZTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfVHJhbnNtaXRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSAgID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0lUOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgVFhJIGludGVycnVwdCAqLworICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCB8IEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gc2xhdmUgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfUmVjZWl2ZV9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgLyogcG9zc2libGUgdG8gZW5hYmxlIGFsbCBvZiB0aGVzZSAqLworICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB4ZmVybW9kZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQlVTWSkgPT0gU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgaWYgKGhpMmMtPlhmZXJTaXplID4gMFUpCisgICAgeworICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdDsKKworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hdHgsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+VFhEUiwgaGkyYy0+WGZlclNpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSk7CisKKyAgICAgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfVFhETUFFTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgVHJhbnNmZXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPlhmZXJJU1IgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCBnZW5lcmF0ZSBTVEFSVCBjb25kaXRpb24gKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gbWFzdGVyIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01BU1RFUjsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoaGkyYy0+WGZlclNpemUgPiAwVSkKKyAgICB7CisgICAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgZG1heGZlcnN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5SWERSLCAodWludDMyX3QpcERhdGEsIGhpMmMtPlhmZXJTaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgICAgIC8qIFNldCBOQllURVMgdG8gcmVhZCBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKworICAgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9FUlJPUl9JVCk7CisKKyAgICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBUcmFuc2ZlciBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaGkyYy0+WGZlcklTUiA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgIC8qIFNldCBOQllURVMgdG8gcmVhZCBhbmQgZ2VuZXJhdGUgU1RBUlQgY29uZGl0aW9uICovCisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19BVVRPRU5EX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGluIHNsYXZlIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1RyYW5zbWl0X0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFTbGF2ZVRyYW5zbWl0Q3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJMkNfRE1BRXJyb3I7CisKKyAgICAgIC8qIFNldCB0aGUgdW51c2VkIERNQSBjYWxsYmFja3MgdG8gTlVMTCAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgZG1heGZlcnN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAvKiBFbmFibGUgRVJSLCBTVE9QLCBOQUNLLCBBRERSIGludGVycnVwdHMgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1RYRE1BRU47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBzbGF2ZSBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19TbGF2ZV9SZWNlaXZlX0RNQShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgICAgPSBIQUxfSTJDX01PREVfU0xBVkU7CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyU2l6ZSAgICA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFTbGF2ZVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdClwRGF0YSwgaGkyYy0+WGZlclNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIsIFNUT1AsIE5BQ0ssIEFERFIgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfUlhETUFFTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1dyaXRlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19CVVNZLCBTRVQsIEkyQ19USU1FT1VUX0JVU1ksIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVySVNSICAgPSBOVUxMOworCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uVFhJU0ZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAqaGkyYy0+cEJ1ZmZQdHI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworCisgICAgICBpZiAoKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhpMmMtPlhmZXJTaXplID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUQ1IgZmxhZyBpcyBzZXQgKi8KKyAgICAgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDUiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19OT19TVEFSVFNUT1ApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpOworCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWVtX1JlYWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX0JVU1ksIFNFVCwgSTJDX1RJTUVPVVRfQlVTWSwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlg7CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhpMmMtPlhmZXJJU1IgICA9IE5VTEw7CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaWYgKEkyQ19SZXF1ZXN0TWVtb3J5UmVhZChoaTJjLCBEZXZBZGRyZXNzLCBNZW1BZGRyZXNzLCBNZW1BZGRTaXplLCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfUkVMT0FEX01PREUsIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFJYTkUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19SWE5FLCBSRVNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhpMmMtPlhmZXJTaXplLS07CisgICAgICBoaTJjLT5YZmVyQ291bnQtLTsKKworICAgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgIT0gMFUpICYmIChoaTJjLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCkgaGkyYy0+WGZlclNpemUsIEkyQ19SRUxPQURfTU9ERSwgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoaGkyYy0+WGZlckNvdW50ID4gMFUpOworCisgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgIGlmIChJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoaGkyYywgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgIGhpMmMtPk1vZGUgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEBicmllZiAgV3JpdGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQgdG8gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fV3JpdGVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHhmZXJtb2RlOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgeGZlcm1vZGUgPSBJMkNfUkVMT0FEX01PREU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgYW5kIE1lbW9yeSBBZGRyZXNzICovCisgICAgaWYgKEkyQ19SZXF1ZXN0TWVtb3J5V3JpdGUoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGkyYy0+WGZlclNpemUsIHhmZXJtb2RlLCBJMkNfTk9fU1RBUlRTVE9QKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBwb3NzaWJsZSB0byBlbmFibGUgYWxsIG9mIHRoZXNlICovCisgICAgLyogSTJDX0lUX0VSUkkgfCBJMkNfSVRfVENJfCBJMkNfSVRfU1RPUEl8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9SWEkgfCBJMkNfSVRfVFhJICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0IGZyb20gYSBzcGVjaWZpYyBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19NRU1BRERfU0laRShNZW1BZGRTaXplKSk7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGhpMmMtPlN0YXRlICAgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1JYOworICAgIGhpMmMtPk1vZGUgICAgICAgID0gSEFMX0kyQ19NT0RFX01FTTsKKyAgICBoaTJjLT5FcnJvckNvZGUgICA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gSTJDX05PX09QVElPTl9GUkFNRTsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBJMkNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBpZiAoSTJDX1JlcXVlc3RNZW1vcnlSZWFkKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIEkyQ19USU1FT1VUX0ZMQUcsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgUlhJIGludGVycnVwdCAqLworICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAvKiBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0l8IEkyQ19JVF9TVE9QSXwgSTJDX0lUX05BQ0tJIHwgSTJDX0lUX0FERFJJIHwgSTJDX0lUX1JYSSB8IEkyQ19JVF9UWEkgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBXcml0ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSB0byBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIE1lbUFkZHJlc3MgSW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIE1lbUFkZFNpemUgU2l6ZSBvZiBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01lbV9Xcml0ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVdyaXRlKGhpMmMsIERldkFkZHJlc3MsIE1lbUFkZHJlc3MsIE1lbUFkZFNpemUsIEkyQ19USU1FT1VUX0ZMQUcsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisKKyAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hdHgsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+VFhEUiwgaGkyYy0+WGZlclNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQV9QQVJBTTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX05PX1NUQVJUU1RPUCk7CisKKyAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfRVJST1JfSVQpOworCisgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVhZHMgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEgZnJvbSBhIHNwZWNpZmljIG1lbW9yeSBhZGRyZXNzLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBNZW1BZGRyZXNzIEludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBNZW1BZGRTaXplIFNpemUgb2YgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVhZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NZW1fUmVhZF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZHJlc3MsIHVpbnQxNl90IE1lbUFkZFNpemUsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICBIQUxfU3RhdHVzVHlwZURlZiBkbWF4ZmVyc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfTUVNQUREX1NJWkUoTWVtQWRkU2l6ZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19CVVNZKSA9PSBTRVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9CVVNZOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgICA9IEhBTF9JMkNfTU9ERV9NRU07CisgICAgaGkyYy0+RXJyb3JDb2RlICAgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciAgICA9IHBEYXRhOworICAgIGhpMmMtPlhmZXJDb3VudCAgID0gU2l6ZTsKKyAgICBoaTJjLT5YZmVyT3B0aW9ucyA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IEkyQ19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBNZW1vcnkgQWRkcmVzcyAqLworICAgIGlmIChJMkNfUmVxdWVzdE1lbW9yeVJlYWQoaGkyYywgRGV2QWRkcmVzcywgTWVtQWRkcmVzcywgTWVtQWRkU2l6ZSwgSTJDX1RJTUVPVVRfRkxBRywgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gSTJDX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGRtYXhmZXJzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWFyeCwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+UlhEUiwgKHVpbnQzMl90KXBEYXRhLCBoaTJjLT5YZmVyU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKGRtYXhmZXJzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAvKiBFbmFibGUgRVJSIGFuZCBOQUNLIGludGVycnVwdHMgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0VSUk9SX0lUKTsKKworICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfUlhETUFFTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrcyBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdpdGggTWVtb3J5IGRldmljZXMKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgVHJpYWxzIE51bWJlciBvZiB0cmlhbHMKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19Jc0RldmljZVJlYWR5KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBfX0lPIHVpbnQzMl90IEkyQ19UcmlhbHMgPSAwVUw7CisKKyAgRmxhZ1N0YXR1cyB0bXAxOworICBGbGFnU3RhdHVzIHRtcDI7CisKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0JVU1kpID09IFNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgZG8KKyAgICB7CisgICAgICAvKiBHZW5lcmF0ZSBTdGFydCAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiA9IEkyQ19HRU5FUkFURV9TVEFSVChoaTJjLT5Jbml0LkFkZHJlc3NpbmdNb2RlLCBEZXZBZGRyZXNzKTsKKworICAgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHNldCBvciBhIE5BQ0sgZmxhZyBpcyBzZXQqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgdG1wMSA9IF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisgICAgICB0bXAyID0gX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgICAgd2hpbGUgKCh0bXAxID09IFJFU0VUKSAmJiAodG1wMiA9PSBSRVNFVCkpCisgICAgICB7CisgICAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfVElNRU9VVDsKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcDEgPSBfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworICAgICAgICB0bXAyID0gX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIE5BQ0tGIGZsYWcgaGFzIG5vdCBiZWVuIHNldCAqLworICAgICAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19BRikgPT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoSTJDX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGkyYywgSTJDX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnLCBhdXRvIGdlbmVyYXRlZCB3aXRoIGF1dG9lbmQqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHRyaWFscyBoYXMgYmVlbiByZWFjaGVkICovCisgICAgICBpZiAoSTJDX1RyaWFscyA9PSBUcmlhbHMpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIFN0b3AgKi8KKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX1NUT1A7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIEluY3JlbWVudCBUcmlhbHMgKi8KKyAgICAgIEkyQ19UcmlhbHMrKzsKKyAgICB9CisgICAgd2hpbGUgKEkyQ19UcmlhbHMgPCBUcmlhbHMpOworCisgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX1RJTUVPVVQ7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHRyYW5zbWl0IGluIG1hc3RlciBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB4ZmVybW9kZTsKKyAgdWludDMyX3QgeGZlcnJlcXVlc3QgPSBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIC8qIElmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFLCB1c2UgcmVsb2FkIG1vZGUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgIH0KKworICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlIGFuZCB0aGVyZSBpcyBubyByZXF1ZXN0IHRvIHN0YXJ0IGFub3RoZXIgZnJhbWUsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgaWYgKChoaTJjLT5QcmV2aW91c1N0YXRlID09IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWCkgJiYgKElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpID09IDApKQorICAgIHsKKyAgICAgIHhmZXJyZXF1ZXN0ID0gSTJDX05PX1NUQVJUU1RPUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhpMmMpOworCisgICAgICAvKiBVcGRhdGUgeGZlcm1vZGUgYWNjb3JkaW5nbHkgaWYgbm8gcmVsb2FkIGlzIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA8IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgc2V0IE5CWVRFUyB0byB3cml0ZSAqLworICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIHhmZXJyZXF1ZXN0KTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBtYXN0ZXIgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIHVpbnQzMl90IHhmZXJtb2RlOworICB1aW50MzJfdCB4ZmVycmVxdWVzdCA9IEkyQ19HRU5FUkFURV9TVEFSVF9XUklURTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9CVVNZX1RYOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9NQVNURVI7CisgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19NYXN0ZXJfSVNSX0RNQTsKKworICAgIC8qIElmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFLCB1c2UgcmVsb2FkIG1vZGUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgIH0KKworICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlIGFuZCB0aGVyZSBpcyBubyByZXF1ZXN0IHRvIHN0YXJ0IGFub3RoZXIgZnJhbWUsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgaWYgKChoaTJjLT5QcmV2aW91c1N0YXRlID09IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWCkgJiYgKElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpID09IDApKQorICAgIHsKKyAgICAgIHhmZXJyZXF1ZXN0ID0gSTJDX05PX1NUQVJUU1RPUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhpMmMpOworCisgICAgICAvKiBVcGRhdGUgeGZlcm1vZGUgYWNjb3JkaW5nbHkgaWYgbm8gcmVsb2FkIGlzIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA8IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoaTJjLT5YZmVyU2l6ZSA+IDBVKQorICAgIHsKKyAgICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBJMkMgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFNYXN0ZXJUcmFuc21pdENwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgZG1heGZlcnN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlRYRFIsIGhpMmMtPlhmZXJTaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBzZXQgTkJZVEVTIHRvIHdyaXRlICovCisgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIHhmZXJyZXF1ZXN0KTsKKworICAgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICAgIGhpMmMtPlhmZXJDb3VudCAtPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLworICAgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9FUlJPUl9JVCk7CisKKyAgICAgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBVcGRhdGUgSTJDIHN0YXRlICovCisgICAgICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAgIC8qIFVwZGF0ZSBJMkMgZXJyb3IgY29kZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBUcmFuc2ZlciBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaGkyYy0+WGZlcklTUiA9IEkyQ19NYXN0ZXJfSVNSX0lUOworCisgICAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIGdlbmVyYXRlIFNUQVJUIGNvbmRpdGlvbiAqLworICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCByZWNlaXZlIGluIG1hc3RlciBJMkMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdAorICAqIEBub3RlICAgVGhpcyBpbnRlcmZhY2UgYWxsb3cgdG8gbWFuYWdlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiB3aGVuIGEgZGlyZWN0aW9uIGNoYW5nZSBkdXJpbmcgdHJhbnNmZXIKKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVST1BUSU9OUworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIHVpbnQzMl90IHhmZXJyZXF1ZXN0ID0gSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9JVDsKKworICAgIC8qIElmIGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFLCB1c2UgcmVsb2FkIG1vZGUgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgIH0KKworICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlIGFuZCB0aGVyZSBpcyBubyByZXF1ZXN0IHRvIHN0YXJ0IGFub3RoZXIgZnJhbWUsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisgICAgaWYgKChoaTJjLT5QcmV2aW91c1N0YXRlID09IEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWCkgJiYgKElTX0kyQ19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpID09IDApKQorICAgIHsKKyAgICAgIHhmZXJyZXF1ZXN0ID0gSTJDX05PX1NUQVJUU1RPUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhpMmMpOworCisgICAgICAvKiBVcGRhdGUgeGZlcm1vZGUgYWNjb3JkaW5nbHkgaWYgbm8gcmVsb2FkIGlzIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA8IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgfQorICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyBhbmQgc2V0IE5CWVRFUyB0byByZWFkICovCisgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgeGZlcnJlcXVlc3QpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gbWFzdGVyIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgdWludDMyX3QgeGZlcm1vZGU7CisgIHVpbnQzMl90IHhmZXJyZXF1ZXN0ID0gSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWDsKKyAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTUFTVEVSOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfTWFzdGVyX0lTUl9ETUE7CisKKyAgICAvKiBJZiBoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSwgdXNlIHJlbG9hZCBtb2RlICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB4ZmVybW9kZSA9IEkyQ19SRUxPQURfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgICAgeGZlcm1vZGUgPSBoaTJjLT5YZmVyT3B0aW9uczsKKyAgICB9CisKKyAgICAvKiBJZiB0cmFuc2ZlciBkaXJlY3Rpb24gbm90IGNoYW5nZSBhbmQgdGhlcmUgaXMgbm8gcmVxdWVzdCB0byBzdGFydCBhbm90aGVyIGZyYW1lLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAvKiBNZWFuIFByZXZpb3VzIHN0YXRlIGlzIHNhbWUgYXMgY3VycmVudCBzdGF0ZSAqLworICAgIGlmICgoaGkyYy0+UHJldmlvdXNTdGF0ZSA9PSBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpICYmIChJU19JMkNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSA9PSAwKSkKKyAgICB7CisgICAgICB4ZmVycmVxdWVzdCA9IEkyQ19OT19TVEFSVFNUT1A7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICAgIEkyQ19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoaTJjKTsKKworICAgICAgLyogVXBkYXRlIHhmZXJtb2RlIGFjY29yZGluZ2x5IGlmIG5vIHJlbG9hZCBpcyBuZWNlc3NhcnkgKi8KKyAgICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPCBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgeGZlcm1vZGUgPSBoaTJjLT5YZmVyT3B0aW9uczsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGkyYy0+WGZlclNpemUgPiAwVSkKKyAgICB7CisgICAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgICAvKiBTZXQgdGhlIHVudXNlZCBETUEgY2FsbGJhY2tzIHRvIE5VTEwgKi8KKyAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgZG1heGZlcnN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGkyYy0+aGRtYXJ4LCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5SWERSLCAodWludDMyX3QpcERhdGEsIGhpMmMtPlhmZXJTaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBVcGRhdGUgSTJDIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfRE1BX1BBUkFNOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIGlmIChkbWF4ZmVyc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzIGFuZCBzZXQgTkJZVEVTIHRvIHJlYWQgKi8KKyAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIERldkFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCB4ZmVybW9kZSwgeGZlcnJlcXVlc3QpOworCisgICAgICAgIC8qIFVwZGF0ZSBYZmVyQ291bnQgdmFsdWUgKi8KKyAgICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgICAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0VSUk9SX0lUKTsKKworICAgICAgICAvKiBFbmFibGUgRE1BIFJlcXVlc3QgKi8KKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBJMkMgc3RhdGUgKi8KKyAgICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0RNQTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIFRyYW5zZmVyIElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoaTJjLT5YZmVySVNSID0gSTJDX01hc3Rlcl9JU1JfSVQ7CisKKyAgICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgICAgLyogU2V0IE5CWVRFUyB0byByZWFkIGFuZCBnZW5lcmF0ZSBTVEFSVCBjb25kaXRpb24gKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcmlzayBvZiBJMkMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworICAgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICAgIC8qIHBvc3NpYmxlIHRvIGVuYWJsZSBhbGwgb2YgdGhlc2UgKi8KKyAgICAgIC8qIEkyQ19JVF9FUlJJIHwgSTJDX0lUX1RDSXwgSTJDX0lUX1NUT1BJfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfQUREUkkgfCBJMkNfSVRfUlhJIHwgSTJDX0lUX1RYSSAqLworICAgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfVFhfSVQpOworICAgIH0KKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VxdWVudGlhbCB0cmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pID09ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfVFhfSVQpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSTJDIGNhbm5vdCBtYW5hZ2UgZnVsbCBkdXBsZXggZXhjaGFuZ2Ugc28gZGlzYWJsZSBwcmV2aW91cyBJVCBlbmFibGVkIGlmIGFueSAqLworICAgIC8qIGFuZCB0aGVuIHRvZ2dsZSB0aGUgSEFMIHNsYXZlIFJYIHN0YXRlIHRvIFRYIHN0YXRlICovCisgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBhc3NvY2lhdGVkIEludGVycnVwdHMgKi8KKyAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAgIC8qIEFib3J0IERNQSBYZmVyIGlmIGFueSAqLworICAgICAgaWYgKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9SWERNQUVOKSA9PSBJMkNfQ1IxX1JYRE1BRU4pCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfUlhETUFFTjsKKworICAgICAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJMkNfRE1BQWJvcnQ7CisKKyAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaTJjLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IFhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaGkyYy0+aGRtYXJ4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0lUOworCisgICAgaWYgKEkyQ19HRVRfRElSKGhpMmMpID09IEkyQ19ESVJFQ1RJT05fUkVDRUlWRSkKKyAgICB7CisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgYWZ0ZXIgcHJlcGFyZSB0aGUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgTWFzdGVyICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgdHJhbnNtaXQgaW4gc2xhdmUvZGV2aWNlIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BCisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZG1heGZlcnN0YXR1czsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSA9PSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIEkyQyBjYW5ub3QgbWFuYWdlIGZ1bGwgZHVwbGV4IGV4Y2hhbmdlIHNvIGRpc2FibGUgcHJldmlvdXMgSVQgZW5hYmxlZCBpZiBhbnkgKi8KKyAgICAvKiBhbmQgdGhlbiB0b2dnbGUgdGhlIEhBTCBzbGF2ZSBSWCBzdGF0ZSB0byBUWCBzdGF0ZSAqLworICAgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgYXNzb2NpYXRlZCBJbnRlcnJ1cHRzICovCisgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworCisgICAgICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikKKyAgICAgIHsKKyAgICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfUlhETUFFTjsKKworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hcngpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKQorICAgIHsKKyAgICAgIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfVFhETUFFTikgPT0gSTJDX0NSMV9UWERNQUVOKQorICAgICAgeworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hdHgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU47CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfRE1BOworCisgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSTJDIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gSTJDX0RNQVNsYXZlVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hdHgsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZoaTJjLT5JbnN0YW5jZS0+VFhEUiwgaGkyYy0+WGZlclNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAvKiBSZXNldCBYZmVyU2l6ZSAqLworICAgICAgaGkyYy0+WGZlclNpemUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoSTJDX0dFVF9ESVIoaGkyYykgPT0gSTJDX0RJUkVDVElPTl9SRUNFSVZFKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBNYXN0ZXIgKi8KKyAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBOb3RlIDogVGhlIEkyQyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBFbmFibGUgRVJSLCBTVE9QLCBOQUNLLCBBRERSIGludGVycnVwdHMgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgLyogRW5hYmxlIERNQSBSZXF1ZXN0ICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1RYRE1BRU47CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZXF1ZW50aWFsIHJlY2VpdmUgaW4gc2xhdmUvZGV2aWNlIEkyQyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0CisgICogQG5vdGUgICBUaGlzIGludGVyZmFjZSBhbGxvdyB0byBtYW5hZ2UgcmVwZWF0ZWQgc3RhcnQgY29uZGl0aW9uIHdoZW4gYSBkaXJlY3Rpb24gY2hhbmdlIGR1cmluZyB0cmFuc2ZlcgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgSTJDX1hGRVJPUFRJT05TCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKCgodWludDMyX3QpaGkyYy0+U3RhdGUgJiAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pID09ICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgLyogSTJDIGNhbm5vdCBtYW5hZ2UgZnVsbCBkdXBsZXggZXhjaGFuZ2Ugc28gZGlzYWJsZSBwcmV2aW91cyBJVCBlbmFibGVkIGlmIGFueSAqLworICAgIC8qIGFuZCB0aGVuIHRvZ2dsZSB0aGUgSEFMIHNsYXZlIFRYIHN0YXRlIHRvIFJYIHN0YXRlICovCisgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBhc3NvY2lhdGVkIEludGVycnVwdHMgKi8KKyAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAgIGlmICgoaGkyYy0+SW5zdGFuY2UtPkNSMSAmIEkyQ19DUjFfVFhETUFFTikgPT0gSTJDX0NSMV9UWERNQUVOKQorICAgICAgeworICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgICAgICAgLyogQWJvcnQgRE1BIFhmZXIgaWYgYW55ICovCisgICAgICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoaTJjLT5oZG1hdHgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhpMmMtPlN0YXRlICAgICA9IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU47CisgICAgaGkyYy0+TW9kZSAgICAgID0gSEFMX0kyQ19NT0RFX1NMQVZFOworICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGkyYy0+cEJ1ZmZQdHIgICAgPSBwRGF0YTsKKyAgICBoaTJjLT5YZmVyQ291bnQgICA9IFNpemU7CisgICAgaGkyYy0+WGZlclNpemUgICAgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKyAgICBoaTJjLT5YZmVySVNSICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisKKyAgICBpZiAoSTJDX0dFVF9ESVIoaGkyYykgPT0gSTJDX0RJUkVDVElPTl9UUkFOU01JVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgYWZ0ZXIgcHJlcGFyZSB0aGUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgTWFzdGVyICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlcXVlbnRpYWwgcmVjZWl2ZSBpbiBzbGF2ZS9kZXZpY2UgSTJDIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEKKyAgKiBAbm90ZSAgIFRoaXMgaW50ZXJmYWNlIGFsbG93IHRvIG1hbmFnZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gd2hlbiBhIGRpcmVjdGlvbiBjaGFuZ2UgZHVyaW5nIHRyYW5zZmVyCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBJMkNfWEZFUk9QVElPTlMKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfRE1BKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGRtYXhmZXJzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0kyQ19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKCh1aW50MzJfdCloaTJjLT5TdGF0ZSAmICh1aW50MzJfdClIQUxfSTJDX1NUQVRFX0xJU1RFTikgPT0gKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgaGkyYy0+RXJyb3JDb2RlID0gSEFMX0kyQ19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBJMkMgY2Fubm90IG1hbmFnZSBmdWxsIGR1cGxleCBleGNoYW5nZSBzbyBkaXNhYmxlIHByZXZpb3VzIElUIGVuYWJsZWQgaWYgYW55ICovCisgICAgLyogYW5kIHRoZW4gdG9nZ2xlIHRoZSBIQUwgc2xhdmUgVFggc3RhdGUgdG8gUlggc3RhdGUgKi8KKyAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGFzc29jaWF0ZWQgSW50ZXJydXB0cyAqLworICAgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUKTsKKworICAgICAgaWYgKChoaTJjLT5JbnN0YW5jZS0+Q1IxICYgSTJDX0NSMV9UWERNQUVOKSA9PSBJMkNfQ1IxX1RYRE1BRU4pCisgICAgICB7CisgICAgICAgIC8qIEFib3J0IERNQSBYZmVyIGlmIGFueSAqLworICAgICAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgICAgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJMkNfRE1BQWJvcnQ7CisKKyAgICAgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaTJjLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IFhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgIGhpMmMtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaGkyYy0+aGRtYXR4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYX0xJU1RFTikKKyAgICB7CisgICAgICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgICAgICAgIC8qIEFib3J0IERNQSBYZmVyIGlmIGFueSAqLworICAgICAgICBpZiAoaGkyYy0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJMkNfRE1BQWJvcnQ7CisKKyAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaTJjLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IFhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaGkyYy0+aGRtYXJ4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICBoaTJjLT5TdGF0ZSAgICAgPSBIQUxfSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOOworICAgIGhpMmMtPk1vZGUgICAgICA9IEhBTF9JMkNfTU9ERV9TTEFWRTsKKyAgICBoaTJjLT5FcnJvckNvZGUgPSBIQUxfSTJDX0VSUk9SX05PTkU7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgJj0gfkkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhpMmMtPnBCdWZmUHRyICAgID0gcERhdGE7CisgICAgaGkyYy0+WGZlckNvdW50ICAgPSBTaXplOworICAgIGhpMmMtPlhmZXJTaXplICAgID0gaGkyYy0+WGZlckNvdW50OworICAgIGhpMmMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisgICAgaGkyYy0+WGZlcklTUiAgICAgPSBJMkNfU2xhdmVfSVNSX0RNQTsKKworICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IEkyQ19ETUFTbGF2ZVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IEkyQ19ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSB1bnVzZWQgRE1BIGNhbGxiYWNrcyB0byBOVUxMICovCisgICAgICBoaTJjLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gTlVMTDsKKyAgICAgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBkbWF4ZmVyc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdClwRGF0YSwgaGkyYy0+WGZlclNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUFfUEFSQU07CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZG1heGZlcnN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogVXBkYXRlIFhmZXJDb3VudCB2YWx1ZSAqLworICAgICAgaGkyYy0+WGZlckNvdW50IC09IGhpMmMtPlhmZXJTaXplOworCisgICAgICAvKiBSZXNldCBYZmVyU2l6ZSAqLworICAgICAgaGkyYy0+WGZlclNpemUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVXBkYXRlIEkyQyBzdGF0ZSAqLworICAgICAgaGkyYy0+U3RhdGUgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgICBoaTJjLT5Nb2RlICAgICAgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogVXBkYXRlIEkyQyBlcnJvciBjb2RlICovCisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoSTJDX0dFVF9ESVIoaGkyYykgPT0gSTJDX0RJUkVDVElPTl9UUkFOU01JVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgYWZ0ZXIgcHJlcGFyZSB0aGUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgTWFzdGVyICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogTm90ZSA6IFRoZSBJMkMgaW50ZXJydXB0cyBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEkyQyBpbnRlcnJ1cHQgaGFuZGxlIGV4ZWN1dGlvbiBiZWZvcmUgY3VycmVudAorICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUIHwgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9SWERNQUVOOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBBZGRyZXNzIGxpc3RlbiBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDX0VuYWJsZUxpc3Rlbl9JVChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgIGhpMmMtPlhmZXJJU1IgPSBJMkNfU2xhdmVfSVNSX0lUOworCisgICAgLyogRW5hYmxlIHRoZSBBZGRyZXNzIE1hdGNoIGludGVycnVwdCAqLworICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX0xJU1RFTl9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19EaXNhYmxlTGlzdGVuX0lUKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBEZWNsYXJhdGlvbiBvZiB0bXAgdG8gcHJldmVudCB1bmRlZmluZWQgYmVoYXZpb3Igb2Ygdm9sYXRpbGUgdXNhZ2UgKi8KKyAgdWludDMyX3QgdG1wOworCisgIC8qIERpc2FibGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBvbmx5IGlmIGEgdHJhbnNmZXIgaXMgbm90IG9uZ29pbmcgKi8KKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfTElTVEVOKQorICB7CisgICAgdG1wID0gKHVpbnQzMl90KShoaTJjLT5TdGF0ZSkgJiBJMkNfU1RBVEVfTVNLOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSB0bXAgfCAodWludDMyX3QpKGhpMmMtPk1vZGUpOworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisgICAgaGkyYy0+WGZlcklTUiA9IE5VTEw7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBBZGRyZXNzIE1hdGNoIGludGVycnVwdCAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBhIG1hc3RlciBJMkMgSVQgb3IgRE1BIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0kyQ19NYXN0ZXJfQWJvcnRfSVQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQxNl90IERldkFkZHJlc3MpCit7CisgIGlmIChoaTJjLT5Nb2RlID09IEhBTF9JMkNfTU9ERV9NQVNURVIpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGkyYyk7CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQpOworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBTZXQgU3RhdGUgYXQgSEFMX0kyQ19TVEFURV9BQk9SVCAqLworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9BQk9SVDsKKworICAgIC8qIFNldCBOQllURVMgdG8gMSB0byBnZW5lcmF0ZSBhIGR1bW15IHJlYWQgb24gSTJDIHBlcmlwaGVyYWwgKi8KKyAgICAvKiBTZXQgQVVUT0VORCBtb2RlLCB0aGlzIHdpbGwgZ2VuZXJhdGUgYSBOQUNLIHRoZW4gU1RPUCBjb25kaXRpb24gdG8gYWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNmZXIgKi8KKyAgICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgMSwgSTJDX0FVVE9FTkRfTU9ERSwgSTJDX0dFTkVSQVRFX1NUT1ApOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIC8qIE5vdGUgOiBUaGUgSTJDIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfQ1BMVF9JVCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFdyb25nIHVzYWdlIG9mIGFib3J0IGZ1bmN0aW9uICovCisgICAgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBvbmx5IGluIGNhc2Ugb2YgYWJvcnQgbW9uaXRvcmVkIGJ5IG1hc3RlciBkZXZpY2UgKi8KKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDX0lSUV9IYW5kbGVyX2FuZF9DYWxsYmFja3MgSVJRIEhhbmRsZXIgYW5kIENhbGxiYWNrcworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgZXZlbnQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ19FVl9JUlFIYW5kbGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBHZXQgY3VycmVudCBJVCBGbGFncyBhbmQgSVQgc291cmNlcyB2YWx1ZSAqLworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgaXRzb3VyY2VzID0gUkVBRF9SRUcoaGkyYy0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogSTJDIGV2ZW50cyB0cmVhdG1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChoaTJjLT5YZmVySVNSICE9IE5VTEwpCisgIHsKKyAgICBoaTJjLT5YZmVySVNSKGhpMmMsIGl0ZmxhZ3MsIGl0c291cmNlcyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJDIGVycm9yIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JMkNfRVJfSVJRSGFuZGxlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgdWludDMyX3QgaXRmbGFncyAgID0gUkVBRF9SRUcoaGkyYy0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGl0c291cmNlcyA9IFJFQURfUkVHKGhpMmMtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCB0bXBlcnJvcjsKKworICAvKiBJMkMgQnVzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKEkyQ19DSEVDS19GTEFHKGl0ZmxhZ3MsIEkyQ19GTEFHX0JFUlIpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZXMsIEkyQ19JVF9FUlJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9CRVJSOworCisgICAgLyogQ2xlYXIgQkVSUiBmbGFnICovCisgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQkVSUik7CisgIH0KKworICAvKiBJMkMgT3Zlci1SdW4vVW5kZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyhpdGZsYWdzLCBJMkNfRkxBR19PVlIpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZXMsIEkyQ19JVF9FUlJJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9PVlI7CisKKyAgICAvKiBDbGVhciBPVlIgZmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX09WUik7CisgIH0KKworICAvKiBJMkMgQXJiaXRyYXRpb24gTG9zcyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcoaXRmbGFncywgSTJDX0ZMQUdfQVJMTykgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlcywgSTJDX0lUX0VSUkkpICE9IFJFU0VUKSkKKyAgeworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FSTE87CisKKyAgICAvKiBDbGVhciBBUkxPIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BUkxPKTsKKyAgfQorCisgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaGkyYy0+RXJyb3JDb2RlLCBtaXNyYSBydWxlICovCisgIHRtcGVycm9yID0gaGkyYy0+RXJyb3JDb2RlOworCisgIC8qIENhbGwgdGhlIEVycm9yIENhbGxiYWNrIGluIGNhc2Ugb2YgRXJyb3IgZGV0ZWN0ZWQgKi8KKyAgaWYgKCh0bXBlcnJvciAmIChIQUxfSTJDX0VSUk9SX0JFUlIgfCBIQUxfSTJDX0VSUk9SX09WUiB8IEhBTF9JMkNfRVJST1JfQVJMTykpICE9ICBIQUxfSTJDX0VSUk9SX05PTkUpCisgIHsKKyAgICBJMkNfSVRFcnJvcihoaTJjLCB0bXBlcnJvcik7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKiBAYnJpZWYgIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX1NsYXZlUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUcmFuc2ZlckRpcmVjdGlvbiBNYXN0ZXIgcmVxdWVzdCBUcmFuc2ZlciBEaXJlY3Rpb24gKFdyaXRlL1JlYWQpLCB2YWx1ZSBvZiBAcmVmIEkyQ19YRkVSRElSRUNUSU9OCisgICogQHBhcmFtICBBZGRyTWF0Y2hDb2RlIEFkZHJlc3MgTWF0Y2ggQ29kZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19BZGRyQ2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworICBVTlVTRUQoVHJhbnNmZXJEaXJlY3Rpb24pOworICBVTlVTRUQoQWRkck1hdGNoQ29kZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfQWRkckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTGlzdGVuQ3BsdENhbGxiYWNrKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaTJjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIE1lbW9yeSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfTWVtVHhDcGx0Q2FsbGJhY2soSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpMmMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSTJDX01lbVR4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWVtb3J5IFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfTWVtUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBhYm9ydCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0kyQ19BYm9ydENwbHRDYWxsYmFjayhJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGkyYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlLCBNb2RlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXQgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIEkyQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX0kyQ19TdGF0ZVR5cGVEZWYgSEFMX0kyQ19HZXRTdGF0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYykKK3sKKyAgLyogUmV0dXJuIEkyQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhpMmMtPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgdGhlIEkyQyBNYXN0ZXIsIFNsYXZlLCBNZW1vcnkgb3Igbm8gbW9kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgSTJDIG1vZHVsZQorICAqIEByZXR2YWwgSEFMIG1vZGUKKyAgKi8KK0hBTF9JMkNfTW9kZVR5cGVEZWYgSEFMX0kyQ19HZXRNb2RlKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICByZXR1cm4gaGkyYy0+TW9kZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSBJMkMgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyogQHJldHZhbCBJMkMgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9JMkNfR2V0RXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIHJldHVybiBoaTJjLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEludGVycnVwdCBTdWItUm91dGluZSB3aGljaCBoYW5kbGUgdGhlIEludGVycnVwdCBGbGFncyBNYXN0ZXIgTW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEBwYXJhbSAgSVRTb3VyY2VzIEludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX01hc3Rlcl9JU1JfSVQoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDE2X3QgZGV2YWRkcmVzczsKKyAgdWludDMyX3QgdG1wSVRGbGFncyA9IElURmxhZ3M7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICAvKiBObyBuZWVkIHRvIGdlbmVyYXRlIFNUT1AsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZG9uZSAqLworICAgIC8qIEVycm9yIGNhbGxiYWNrIHdpbGwgYmUgc2VuZCBkdXJpbmcgc3RvcCBmbGFnIHRyZWF0bWVudCAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworCisgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1JYSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogUmVtb3ZlIFJYTkUgZmxhZyBvbiB0ZW1wb3JhcnkgdmFyaWFibGUgYXMgcmVhZCBkb25lICovCisgICAgdG1wSVRGbGFncyAmPSB+STJDX0ZMQUdfUlhORTsKKworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgIGhpMmMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19UWElTKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVFhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9ICpoaTJjLT5wQnVmZlB0cjsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyKys7CisKKyAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgIGhpMmMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19UQ1IpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9UQ0kpICE9IFJFU0VUKSkKKyAgeworICAgIGlmICgoaGkyYy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaGkyYy0+WGZlclNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIGRldmFkZHJlc3MgPSAodWludDE2X3QpKGhpMmMtPkluc3RhbmNlLT5DUjIgJiBJMkNfQ1IyX1NBREQpOworCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBoaTJjLT5YZmVyT3B0aW9ucywgSTJDX05PX1NUQVJUU1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgSTJDX1RyYW5zZmVyQ29uZmlnKGhpMmMsIGRldmFkZHJlc3MsICh1aW50OF90KWhpMmMtPlhmZXJTaXplLCBJMkNfQVVUT0VORF9NT0RFLCBJMkNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVE1hc3RlclNlcUNwbHQoaGkyYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFdyb25nIHNpemUgU3RhdHVzIHJlZ2FyZGluZyBUQ1IgZmxhZyBldmVudCAqLworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9TSVpFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1RDKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGluIGNhc2Ugb2Ygbm8gdHJhbnNmZXIgb3B0aW9uICovCisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICBJMkNfSVRNYXN0ZXJTZXFDcGx0KGhpMmMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcm9uZyBzaXplIFN0YXR1cyByZWdhcmRpbmcgVEMgZmxhZyBldmVudCAqLworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX1NJWkUpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICBpZiAoKEkyQ19DSEVDS19GTEFHKHRtcElURmxhZ3MsIEkyQ19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfU1RPUEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENhbGwgSTJDIE1hc3RlciBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUTWFzdGVyQ3BsdChoaTJjLCB0bXBJVEZsYWdzKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19TbGF2ZV9JU1JfSVQoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDMyX3QgdG1wb3B0aW9ucyA9IGhpMmMtPlhmZXJPcHRpb25zOworICB1aW50MzJfdCB0bXBJVEZsYWdzID0gSVRGbGFnczsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpMmMpOworCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfQUYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9OQUNLSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2hlY2sgdGhhdCBJMkMgdHJhbnNmZXIgZmluaXNoZWQgKi8KKyAgICAvKiBpZiB5ZXMsIG5vcm1hbCB1c2UgY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIE1BU1RFUiB3aGVuIFRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisgICAgLyogTWVhbiBYZmVyQ291bnQgPT0gMCovCisgICAgLyogU28gY2xlYXIgRmxhZyBOQUNLRiBvbmx5ICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfTElTVEVOKSAmJiAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUUpKSAvKiBTYW1lIGFjdGlvbiBtdXN0IGJlIGRvbmUgZm9yICh0bXBvcHRpb25zID09IEkyQ19MQVNUX0ZSQU1FKSB3aGljaCByZW1vdmVkIGZvciBXYXJuaW5nW1BhMTM0XTogbGVmdCBhbmQgcmlnaHQgb3BlcmFuZHMgYXJlIGlkZW50aWNhbCAqLworICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICBJMkNfSVRMaXN0ZW5DcGx0KGhpMmMsIHRtcElURmxhZ3MpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pICYmICh0bXBvcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogaWYgbm8sIGVycm9yIHVzZSBjYXNlLCBhIE5vbi1BY2tub3dsZWRnZSBvZiBsYXN0IERhdGEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBNQVNURVIqLworICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisKKyAgICAgIGlmICgodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpIHx8ICh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIEkyQ19JVEVycm9yKGhpMmMsIGhpMmMtPkVycm9yQ29kZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfUlhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogUmVtb3ZlIFJYTkUgZmxhZyBvbiB0ZW1wb3JhcnkgdmFyaWFibGUgYXMgcmVhZCBkb25lICovCisgICAgICB0bXBJVEZsYWdzICY9IH5JMkNfRkxBR19SWE5FOworCisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAqaGkyYy0+cEJ1ZmZQdHIgPSAodWludDhfdCloaTJjLT5JbnN0YW5jZS0+UlhEUjsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgfQorCisgICAgaWYgKChoaTJjLT5YZmVyQ291bnQgPT0gMFUpICYmIFwKKyAgICAgICAgKHRtcG9wdGlvbnMgIT0gSTJDX05PX09QVElPTl9GUkFNRSkpCisgICAgeworICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19BRERSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfQUREUkkpICE9IFJFU0VUKSkKKyAgeworICAgIEkyQ19JVEFkZHJDcGx0KGhpMmMsIHRtcElURmxhZ3MpOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19UWElTKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVFhJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgb25seSBpZiBYZmVyQ291bnQgbm90IHJlYWNoICIwIiAqLworICAgIC8qIEEgVFhJUyBmbGFnIGNhbiBiZSBzZXQsIGR1cmluZyBTVE9QIHRyZWF0bWVudCAgICAgICovCisgICAgLyogQ2hlY2sgaWYgYWxsIERhdGFzIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgKi8KKyAgICAvKiBJZiBpdCBpcyB0aGUgY2FzZSwgdGhpcyBsYXN0IHdyaXRlIGluIFRYRFIgaXMgbm90IHNlbnQsIGNvcnJlc3BvbmQgdG8gYSBkdW1teSBUWElTIGV2ZW50ICovCisgICAgaWYgKGhpMmMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAqaGkyYy0+cEJ1ZmZQdHI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpKQorICAgICAgeworICAgICAgICAvKiBMYXN0IEJ5dGUgaXMgVHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgLyogQ2FsbCBJMkMgU2xhdmUgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogQ2hlY2sgaWYgU1RPUEYgaXMgc2V0ICovCisgIGlmICgoSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgU2xhdmUgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVFNsYXZlQ3BsdChoaTJjLCB0bXBJVEZsYWdzKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIE1hc3RlciBNb2RlIHdpdGggRE1BLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBJVEZsYWdzIEludGVycnVwdCBmbGFncyB0byBoYW5kbGUuCisgICogQHBhcmFtICBJVFNvdXJjZXMgSW50ZXJydXB0IHNvdXJjZXMgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfTWFzdGVyX0lTUl9ETUEoc3RydWN0IF9fSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MsIHVpbnQzMl90IElUU291cmNlcykKK3sKKyAgdWludDE2X3QgZGV2YWRkcmVzczsKKyAgdWludDMyX3QgeGZlcm1vZGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgIC8qIE5vIG5lZWQgdG8gZ2VuZXJhdGUgU1RPUCwgaXQgaXMgYXV0b21hdGljYWxseSBkb25lICovCisgICAgLyogQnV0IGVuYWJsZSBTVE9QIGludGVycnVwdCwgdG8gdHJlYXQgaXQgKi8KKyAgICAvKiBFcnJvciBjYWxsYmFjayB3aWxsIGJlIHNlbmQgZHVyaW5nIHN0b3AgZmxhZyB0cmVhdG1lbnQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKworICAgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyICovCisgICAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1RDUikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1RDSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogRGlzYWJsZSBUQyBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9JMkNfRElTQUJMRV9JVChoaTJjLCBJMkNfSVRfVENJKTsKKworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgIT0gMFUpCisgICAgeworICAgICAgLyogUmVjb3ZlciBTbGF2ZSBhZGRyZXNzICovCisgICAgICBkZXZhZGRyZXNzID0gKHVpbnQxNl90KShoaTJjLT5JbnN0YW5jZS0+Q1IyICYgSTJDX0NSMl9TQUREKTsKKworICAgICAgLyogUHJlcGFyZSB0aGUgbmV3IFhmZXJTaXplIHRvIHRyYW5zZmVyICovCisgICAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgICB7CisgICAgICAgIGhpMmMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIHhmZXJtb2RlID0gSTJDX1JFTE9BRF9NT0RFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaTJjLT5YZmVyU2l6ZSA9IGhpMmMtPlhmZXJDb3VudDsKKyAgICAgICAgaWYgKGhpMmMtPlhmZXJPcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpCisgICAgICAgIHsKKyAgICAgICAgICB4ZmVybW9kZSA9IGhpMmMtPlhmZXJPcHRpb25zOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHhmZXJtb2RlID0gSTJDX0FVVE9FTkRfTU9ERTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIG5ldyBYZmVyU2l6ZSBpbiBOYnl0ZXMgcmVnaXN0ZXIgKi8KKyAgICAgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBkZXZhZGRyZXNzLCAodWludDhfdCloaTJjLT5YZmVyU2l6ZSwgeGZlcm1vZGUsIEkyQ19OT19TVEFSVFNUT1ApOworCisgICAgICAvKiBVcGRhdGUgWGZlckNvdW50IHZhbHVlICovCisgICAgICBoaTJjLT5YZmVyQ291bnQgLT0gaGkyYy0+WGZlclNpemU7CisKKyAgICAgIC8qIEVuYWJsZSBETUEgUmVxdWVzdCAqLworICAgICAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1JYRE1BRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9UWERNQUVOOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIEkyQyBNYXN0ZXIgU2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgICAgIEkyQ19JVE1hc3RlclNlcUNwbHQoaGkyYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFdyb25nIHNpemUgU3RhdHVzIHJlZ2FyZGluZyBUQ1IgZmxhZyBldmVudCAqLworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9TSVpFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1RDKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfVENJKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIGlmIChJMkNfR0VUX1NUT1BfTU9ERShoaTJjKSAhPSBJMkNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGluIGNhc2Ugb2Ygbm8gdHJhbnNmZXIgb3B0aW9uICovCisgICAgICAgIGlmIChoaTJjLT5YZmVyT3B0aW9ucyA9PSBJMkNfTk9fT1BUSU9OX0ZSQU1FKQorICAgICAgICB7CisgICAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICAgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIENhbGwgSTJDIE1hc3RlciBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICBJMkNfSVRNYXN0ZXJTZXFDcGx0KGhpMmMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBXcm9uZyBzaXplIFN0YXR1cyByZWdhcmRpbmcgVEMgZmxhZyBldmVudCAqLworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX1NJWkUpOworICAgIH0KKyAgfQorICBlbHNlIGlmICgoSTJDX0NIRUNLX0ZMQUcoSVRGbGFncywgSTJDX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSAmJiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19JVF9TVE9QSSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogQ2FsbCBJMkMgTWFzdGVyIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRNYXN0ZXJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW50ZXJydXB0IFN1Yi1Sb3V0aW5lIHdoaWNoIGhhbmRsZSB0aGUgSW50ZXJydXB0IEZsYWdzIFNsYXZlIE1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElUU291cmNlcyBJbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19TbGF2ZV9JU1JfRE1BKHN0cnVjdCBfX0kyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBJVEZsYWdzLCB1aW50MzJfdCBJVFNvdXJjZXMpCit7CisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKyAgdWludDMyX3QgdHJlYXRkbWFuYWNrID0gMFU7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoaTJjKTsKKworICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENoZWNrIHRoYXQgSTJDIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlIGNhc2UsIGEgTkFDSyBpcyBzZW50IGJ5IHRoZSBNQVNURVIgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAgKi8KKyAgICAvKiBTbyBjbGVhciBGbGFnIE5BQ0tGIG9ubHkgKi8KKyAgICBpZiAoKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfQ1IxX1RYRE1BRU4pICE9IFJFU0VUKSB8fAorICAgICAgICAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpKQorICAgIHsKKyAgICAgIC8qIFNwbGl0IGNoZWNrIG9mIGhkbWFyeCwgZm9yIE1JU1JBIGNvbXBsaWFuY2UgKi8KKyAgICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfQ1IxX1JYRE1BRU4pICE9IFJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRyZWF0ZG1hbmFjayA9IDFVOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBTcGxpdCBjaGVjayBvZiBoZG1hdHgsIGZvciBNSVNSQSBjb21wbGlhbmNlICAqLworICAgICAgaWYgKGhpMmMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoSTJDX0NIRUNLX0lUX1NPVVJDRShJVFNvdXJjZXMsIEkyQ19DUjFfVFhETUFFTikgIT0gUkVTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhpMmMtPmhkbWF0eCkgPT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgdHJlYXRkbWFuYWNrID0gMVU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0cmVhdGRtYW5hY2sgPT0gMVUpCisgICAgICB7CisgICAgICAgIGlmICgoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICYmICh0bXBvcHRpb25zID09IEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSkpIC8qIFNhbWUgYWN0aW9uIG11c3QgYmUgZG9uZSBmb3IgKHRtcG9wdGlvbnMgPT0gSTJDX0xBU1RfRlJBTUUpIHdoaWNoIHJlbW92ZWQgZm9yIFdhcm5pbmdbUGExMzRdOiBsZWZ0IGFuZCByaWdodCBvcGVyYW5kcyBhcmUgaWRlbnRpY2FsICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIEkyQyBMaXN0ZW4gY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVExpc3RlbkNwbHQoaGkyYywgSVRGbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pICYmICh0bXBvcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgICAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgICAgICAgICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAgICAgICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgICAgICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgICAgICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogaWYgbm8sIGVycm9yIHVzZSBjYXNlLCBhIE5vbi1BY2tub3dsZWRnZSBvZiBsYXN0IERhdGEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBNQVNURVIqLworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfQUYpOworCisgICAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9BRjsKKworICAgICAgICBpZiAoKHRtcG9wdGlvbnMgPT0gSTJDX0ZJUlNUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfTkVYVF9GUkFNRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgICBJMkNfSVRFcnJvcihoaTJjLCBoaTJjLT5FcnJvckNvZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBPbmx5IENsZWFyIE5BQ0sgRmxhZywgbm8gRE1BIHRyZWF0bWVudCBpcyBwZW5kaW5nICovCisgICAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisgICAgfQorICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19BRERSKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfQUREUkkpICE9IFJFU0VUKSkKKyAgeworICAgIEkyQ19JVEFkZHJDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIElURmxhZ3MpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIHNlbmRzIHRhcmdldCBkZXZpY2UgYWRkcmVzcyBmb2xsb3dlZCBieSBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzcyBmb3Igd3JpdGUgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlXcml0ZShJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDE2X3QgTWVtQWRkcmVzcywgdWludDE2X3QgTWVtQWRkU2l6ZSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICBJMkNfVHJhbnNmZXJDb25maWcoaGkyYywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpTWVtQWRkU2l6ZSwgSTJDX1JFTE9BRF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgOEJpdCAqLworICBpZiAoTWVtQWRkU2l6ZSA9PSBJMkNfTUVNQUREX1NJWkVfOEJJVCkKKyAgeworICAgIC8qIFNlbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDE2Qml0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFNlbmQgTVNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9NU0IoTWVtQWRkcmVzcyk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2VuZCBMU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVENSIGZsYWcgaXMgc2V0ICovCisgIGlmIChJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaTJjLCBJMkNfRkxBR19UQ1IsIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBzZW5kcyB0YXJnZXQgZGV2aWNlIGFkZHJlc3MgZm9sbG93ZWQgYnkgaW50ZXJuYWwgbWVtb3J5IGFkZHJlc3MgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgTWVtQWRkcmVzcyBJbnRlcm5hbCBtZW1vcnkgYWRkcmVzcworICAqIEBwYXJhbSAgTWVtQWRkU2l6ZSBTaXplIG9mIGludGVybmFsIG1lbW9yeSBhZGRyZXNzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1JlcXVlc3RNZW1vcnlSZWFkKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRyZXNzLCB1aW50MTZfdCBNZW1BZGRTaXplLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIEkyQ19UcmFuc2ZlckNvbmZpZyhoaTJjLCBEZXZBZGRyZXNzLCAodWludDhfdClNZW1BZGRTaXplLCBJMkNfU09GVEVORF9NT0RFLCBJMkNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworCisgIC8qIFdhaXQgdW50aWwgVFhJUyBmbGFnIGlzIHNldCAqLworICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIElmIE1lbW9yeSBhZGRyZXNzIHNpemUgaXMgOEJpdCAqLworICBpZiAoTWVtQWRkU2l6ZSA9PSBJMkNfTUVNQUREX1NJWkVfOEJJVCkKKyAgeworICAgIC8qIFNlbmQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorICAvKiBJZiBNZW1vcnkgYWRkcmVzcyBzaXplIGlzIDE2Qml0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFNlbmQgTVNCIG9mIE1lbW9yeSBBZGRyZXNzICovCisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSBJMkNfTUVNX0FERF9NU0IoTWVtQWRkcmVzcyk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRYSVMgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2VuZCBMU0Igb2YgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+VFhEUiA9IEkyQ19NRU1fQUREX0xTQihNZW1BZGRyZXNzKTsKKyAgfQorCisgIC8qIFdhaXQgdW50aWwgVEMgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKEkyQ19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhpMmMsIEkyQ19GTEFHX1RDLCBSRVNFVCwgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJMkMgQWRkcmVzcyBjb21wbGV0ZSBwcm9jZXNzIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUQWRkckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIHVpbnQ4X3QgdHJhbnNmZXJkaXJlY3Rpb247CisgIHVpbnQxNl90IHNsYXZlYWRkcmNvZGU7CisgIHVpbnQxNl90IG93bmFkZDFjb2RlOworICB1aW50MTZfdCBvd25hZGQyY29kZTsKKworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChJVEZsYWdzKTsKKworICAvKiBJbiBjYXNlIG9mIExpc3RlbiBzdGF0ZSwgbmVlZCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgYWRkcmVzcyBtYXRjaCBjb2RlIGV2ZW50ICovCisgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSA9PSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgIHsKKyAgICB0cmFuc2ZlcmRpcmVjdGlvbiA9IEkyQ19HRVRfRElSKGhpMmMpOworICAgIHNsYXZlYWRkcmNvZGUgICAgID0gSTJDX0dFVF9BRERSX01BVENIKGhpMmMpOworICAgIG93bmFkZDFjb2RlICAgICAgID0gSTJDX0dFVF9PV05fQUREUkVTUzEoaGkyYyk7CisgICAgb3duYWRkMmNvZGUgICAgICAgPSBJMkNfR0VUX09XTl9BRERSRVNTMihoaTJjKTsKKworICAgIC8qIElmIDEwYml0cyBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQgKi8KKyAgICBpZiAoaGkyYy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBJMkNfQUREUkVTU0lOR01PREVfMTBCSVQpCisgICAgeworICAgICAgaWYgKChzbGF2ZWFkZHJjb2RlICYgU2xhdmVBZGRyX01TSykgPT0gKChvd25hZGQxY29kZSA+PiBTbGF2ZUFkZHJfU0hJRlQpICYgU2xhdmVBZGRyX01TSykpCisgICAgICB7CisgICAgICAgIHNsYXZlYWRkcmNvZGUgPSBvd25hZGQxY29kZTsKKyAgICAgICAgaGkyYy0+QWRkckV2ZW50Q291bnQrKzsKKyAgICAgICAgaWYgKGhpMmMtPkFkZHJFdmVudENvdW50ID09IDJVKQorICAgICAgICB7CisgICAgICAgICAgLyogUmVzZXQgQWRkcmVzcyBFdmVudCBjb3VudGVyICovCisgICAgICAgICAgaGkyYy0+QWRkckV2ZW50Q291bnQgPSAwVTsKKworICAgICAgICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgICAgICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FERFIpOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoaTJjLT5BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2Vsc2UKKyAgICAgICAgICBIQUxfSTJDX0FkZHJDYWxsYmFjayhoaTJjLCB0cmFuc2ZlcmRpcmVjdGlvbiwgc2xhdmVhZGRyY29kZSk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2xhdmVhZGRyY29kZSA9IG93bmFkZDJjb2RlOworCisgICAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHRzICovCisgICAgICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQpOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgIC8qIENhbGwgU2xhdmUgQWRkciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaGkyYy0+QWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbHNlCisgICAgICAgIEhBTF9JMkNfQWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICB9CisgICAgLyogZWxzZSA3IGJpdHMgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHRzICovCisgICAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIFNsYXZlIEFkZHIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5BZGRyQ2FsbGJhY2soaGkyYywgdHJhbnNmZXJkaXJlY3Rpb24sIHNsYXZlYWRkcmNvZGUpOworI2Vsc2UKKyAgICAgIEhBTF9JMkNfQWRkckNhbGxiYWNrKGhpMmMsIHRyYW5zZmVyZGlyZWN0aW9uLCBzbGF2ZWFkZHJjb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgLyogRWxzZSBjbGVhciBhZGRyZXNzIGZsYWcgb25seSAqLworICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRERSKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgTWFzdGVyIHNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlclNlcUNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMpCit7CisgIC8qIFJlc2V0IEkyQyBoYW5kbGUgbW9kZSAqLworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgLyogTm8gR2VuZXJhdGUgU3RvcCwgdG8gcGVybWl0IHJlc3RhcnQgbW9kZSAqLworICAvKiBUaGUgc3RvcCB3aWxsIGJlIGRvbmUgYXQgdGhlIGVuZCBvZiB0cmFuc2Zlciwgd2hlbiBJMkNfQVVUT0VORF9NT0RFIGVuYWJsZSAqLworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYKQorICB7CisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIC8qIGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCAqLworICBlbHNlCisgIHsKKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgU2xhdmUgc2VxdWVudGlhbCBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUU2xhdmVTZXFDcGx0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBSZXNldCBJMkMgaGFuZGxlIG1vZGUgKi8KKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKQorICB7CisgICAgLyogUmVtb3ZlIEhBTF9JMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCwga2VlcCBvbmx5IEhBTF9JMkNfU1RBVEVfTElTVEVOICovCisgICAgaGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9JMkNfU1RBVEVfTElTVEVOOworICAgIGhpMmMtPlByZXZpb3VzU3RhdGUgPSBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWDsKKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPlNsYXZlVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfU2xhdmVUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pCisgIHsKKyAgICAvKiBSZW1vdmUgSEFMX0kyQ19TVEFURV9TTEFWRV9CVVNZX1JYLCBrZWVwIG9ubHkgSEFMX0kyQ19TVEFURV9MSVNURU4gKi8KKyAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9MSVNURU47CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9TTEFWRV9CVVNZX1JYOworCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgICAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JYX0lUKTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEkyQyBNYXN0ZXIgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVE1hc3RlckNwbHQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IElURmxhZ3MpCit7CisgIHVpbnQzMl90IHRtcGVycm9yOworCisgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgLyogUmVzZXQgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICBoaTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKKyAgaGkyYy0+WGZlck9wdGlvbnMgICA9IEkyQ19OT19PUFRJT05fRlJBTUU7CisKKyAgaWYgKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAgIC8qIFNldCBhY2tub3dsZWRnZSBlcnJvciBjb2RlICovCisgICAgaGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9JMkNfRVJST1JfQUY7CisgIH0KKworICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICBJMkNfRmx1c2hfVFhEUihoaTJjKTsKKworICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKyAgSTJDX0Rpc2FibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1RYX0lUIHwgSTJDX1hGRVJfUlhfSVQpOworCisgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaGkyYy0+RXJyb3JDb2RlLCBtaXNyYSBydWxlICovCisgIHRtcGVycm9yID0gaGkyYy0+RXJyb3JDb2RlOworCisgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICBpZiAoKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpIHx8ICh0bXBlcnJvciAhPSBIQUxfSTJDX0VSUk9SX05PTkUpKQorICB7CisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgSTJDX0lURXJyb3IoaGkyYywgaGkyYy0+RXJyb3JDb2RlKTsKKyAgfQorICAvKiBoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFggKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1RYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01FTSkKKyAgICB7CisgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGkyYy0+TWVtVHhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgICAgSEFMX0kyQ19NZW1UeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01hc3RlclR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfUlggKi8KKyAgZWxzZSBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9CVVNZX1JYKQorICB7CisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgaWYgKGhpMmMtPk1vZGUgPT0gSEFMX0kyQ19NT0RFX01FTSkKKyAgICB7CisgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGkyYy0+TWVtUnhDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgICAgSEFMX0kyQ19NZW1SeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoaTJjLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgICBIQUxfSTJDX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgU2xhdmUgY29tcGxldGUgcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIElURmxhZ3MgSW50ZXJydXB0IGZsYWdzIHRvIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19JVFNsYXZlQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncykKK3sKKyAgdWludDMyX3QgdG1wY3IxdmFsdWUgPSBSRUFEX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgdG1wSVRGbGFncyA9IElURmxhZ3M7CisKKyAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX1NUT1BGKTsKKworICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9UWF9JVCB8IEkyQ19YRkVSX1JYX0lUKTsKKworICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMiB8PSBJMkNfQ1IyX05BQ0s7CisKKyAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgIEkyQ19SRVNFVF9DUjIoaGkyYyk7CisKKyAgLyogRmx1c2ggVFggcmVnaXN0ZXIgKi8KKyAgSTJDX0ZsdXNoX1RYRFIoaGkyYyk7CisKKyAgLyogSWYgYSBETUEgaXMgb25nb2luZywgVXBkYXRlIGhhbmRsZSBzaXplIGNvbnRleHQgKi8KKyAgaWYgKEkyQ19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIEkyQ19DUjFfVFhETUFFTikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoaGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgaGkyYy0+WGZlckNvdW50ID0gKHVpbnQxNl90KV9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hdHgpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBJMkNfQ1IxX1JYRE1BRU4pICE9IFJFU0VUKQorICB7CisgICAgaWYgKGhpMmMtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJDb3VudCA9ICh1aW50MTZfdClfX0hBTF9ETUFfR0VUX0NPVU5URVIoaGkyYy0+aGRtYXJ4KTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRG8gbm90aGluZyAqLworICB9CisKKyAgLyogU3RvcmUgTGFzdCByZWNlaXZlIGRhdGEgaWYgYW55ICovCisgIGlmIChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFJlbW92ZSBSWE5FIGZsYWcgb24gdGVtcG9yYXJ5IHZhcmlhYmxlIGFzIHJlYWQgZG9uZSAqLworICAgIHRtcElURmxhZ3MgJj0gfkkyQ19GTEFHX1JYTkU7CisKKyAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgKmhpMmMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpaGkyYy0+SW5zdGFuY2UtPlJYRFI7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0cisrOworCisgICAgaWYgKChoaTJjLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZS0tOworICAgICAgaGkyYy0+WGZlckNvdW50LS07CisgICAgfQorICB9CisKKyAgLyogQWxsIGRhdGEgYXJlIG5vdCB0cmFuc2ZlcnJlZCwgc28gc2V0IGVycm9yIGNvZGUgYWNjb3JkaW5nbHkgKi8KKyAgaWYgKGhpMmMtPlhmZXJDb3VudCAhPSAwVSkKKyAgeworICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICB9CisKKyAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJJU1IgPSBOVUxMOworCisgIGlmIChoaTJjLT5FcnJvckNvZGUgIT0gSEFMX0kyQ19FUlJPUl9OT05FKQorICB7CisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgSTJDX0lURXJyb3IoaGkyYywgaGkyYy0+RXJyb3JDb2RlKTsKKworICAgIC8qIENhbGwgdGhlIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjaywgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIHRoZSBlbmQgb2YgTGlzdGVuIHVzZWNhc2UgKi8KKyAgICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogQ2FsbCBJMkMgTGlzdGVuIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICAgIEkyQ19JVExpc3RlbkNwbHQoaGkyYywgdG1wSVRGbGFncyk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhpMmMtPlhmZXJPcHRpb25zICE9IEkyQ19OT19PUFRJT05fRlJBTUUpCisgIHsKKyAgICAvKiBDYWxsIHRoZSBTZXF1ZW50aWFsIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBUcmFuZmVyICovCisgICAgSTJDX0lUU2xhdmVTZXFDcGx0KGhpMmMpOworCisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPkxpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19MaXN0ZW5DcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+U2xhdmVSeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+U2xhdmVUeENwbHRDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19TbGF2ZVR4Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIExpc3RlbiBjb21wbGV0ZSBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgSVRGbGFncyBJbnRlcnJ1cHQgZmxhZ3MgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lUTGlzdGVuQ3BsdChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgSVRGbGFncykKK3sKKyAgLyogUmVzZXQgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworICBoaTJjLT5YZmVySVNSID0gTlVMTDsKKworICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgaWYgKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1JYTkUpICE9IFJFU0VUKQorICB7CisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaGkyYy0+cEJ1ZmZQdHIrKzsKKworICAgIGlmICgoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUtLTsKKyAgICAgIGhpMmMtPlhmZXJDb3VudC0tOworCisgICAgICAvKiBTZXQgRXJyb3JDb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBOb24tQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgYWxsIEludGVycnVwdHMqLworICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfTElTVEVOX0lUIHwgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgIF9fSEFMX0kyQ19DTEVBUl9GTEFHKGhpMmMsIEkyQ19GTEFHX0FGKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoaTJjLT5MaXN0ZW5DcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICBIQUxfSTJDX0xpc3RlbkNwbHRDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJMkMgaW50ZXJydXB0cyBlcnJvciBwcm9jZXNzLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEBwYXJhbSAgRXJyb3JDb2RlIEVycm9yIGNvZGUgdG8gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0lURXJyb3IoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IEVycm9yQ29kZSkKK3sKKyAgSEFMX0kyQ19TdGF0ZVR5cGVEZWYgdG1wc3RhdGUgPSBoaTJjLT5TdGF0ZTsKKworICAvKiBSZXNldCBoYW5kbGUgcGFyYW1ldGVycyAqLworICBoaTJjLT5Nb2RlICAgICAgICAgID0gSEFMX0kyQ19NT0RFX05PTkU7CisgIGhpMmMtPlhmZXJPcHRpb25zICAgPSBJMkNfTk9fT1BUSU9OX0ZSQU1FOworICBoaTJjLT5YZmVyQ291bnQgICAgID0gMFU7CisKKyAgLyogU2V0IG5ldyBlcnJvciBjb2RlICovCisgIGhpMmMtPkVycm9yQ29kZSB8PSBFcnJvckNvZGU7CisKKyAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisgIGlmICgodG1wc3RhdGUgPT0gSEFMX0kyQ19TVEFURV9MSVNURU4pICAgICAgICAgfHwKKyAgICAgICh0bXBzdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKSB8fAorICAgICAgKHRtcHN0YXRlID09IEhBTF9JMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pKQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgZXhjZXB0IGludGVycnVwdHMgcmVsYXRlZCB0byBMSVNURU4gc3RhdGUgKi8KKyAgICBJMkNfRGlzYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfUlhfSVQgfCBJMkNfWEZFUl9UWF9JVCk7CisKKyAgICAvKiBrZWVwIEhBTF9JMkNfU1RBVEVfTElTVEVOIGlmIHNldCAqLworICAgIGhpMmMtPlN0YXRlICAgICAgICAgPSBIQUxfSTJDX1NUQVRFX0xJU1RFTjsKKyAgICBoaTJjLT5QcmV2aW91c1N0YXRlID0gSTJDX1NUQVRFX05PTkU7CisgICAgaGkyYy0+WGZlcklTUiAgICAgICA9IEkyQ19TbGF2ZV9JU1JfSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICAgIEkyQ19EaXNhYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9MSVNURU5fSVQgfCBJMkNfWEZFUl9SWF9JVCB8IEkyQ19YRkVSX1RYX0lUKTsKKworICAgIC8qIElmIHN0YXRlIGlzIGFuIGFib3J0IHRyZWF0bWVudCBvbiBnb2luZCwgZG9uJ3QgY2hhbmdlIHN0YXRlICovCisgICAgLyogVGhpcyBjaGFuZ2Ugd2lsbCBiZSBkbyBsYXRlciAqLworICAgIGlmIChoaTJjLT5TdGF0ZSAhPSBIQUxfSTJDX1NUQVRFX0FCT1JUKQorICAgIHsKKyAgICAgIC8qIFNldCBIQUxfSTJDX1NUQVRFX1JFQURZICovCisgICAgICBoaTJjLT5TdGF0ZSAgICAgICAgID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICB9CisgICAgaGkyYy0+UHJldmlvdXNTdGF0ZSA9IEkyQ19TVEFURV9OT05FOworICAgIGhpMmMtPlhmZXJJU1IgICAgICAgPSBOVUxMOworICB9CisKKyAgLyogQWJvcnQgRE1BIFRYIHRyYW5zZmVyIGlmIGFueSAqLworICBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1RYRE1BRU4pID09IEkyQ19DUjFfVFhETUFFTikKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgIGlmIChoaTJjLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JMkNfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSTJDX0RNQUFib3J0OworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaGkyYy0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgWGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaTJjLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWF0eCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIEFib3J0IERNQSBSWCB0cmFuc2ZlciBpZiBhbnkgKi8KKyAgZWxzZSBpZiAoKGhpMmMtPkluc3RhbmNlLT5DUjEgJiBJMkNfQ1IxX1JYRE1BRU4pID09IEkyQ19DUjFfUlhETUFFTikKKyAgeworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfUlhETUFFTjsKKworICAgIGlmIChoaTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIEkyQyBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSTJDX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IEkyQ19ETUFBYm9ydDsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpMmMtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaTJjLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGhpMmMtPmhkbWFyeCk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPkFib3J0Q3BsdENhbGxiYWNrKGhpMmMpOworI2Vsc2UKKyAgICBIQUxfSTJDX0Fib3J0Q3BsdENhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+RXJyb3JDYWxsYmFjayhoaTJjKTsKKyNlbHNlCisgICAgSEFMX0kyQ19FcnJvckNhbGxiYWNrKGhpMmMpOworI2VuZGlmIC8qIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgSTJDIFR4IGRhdGEgcmVnaXN0ZXIgZmx1c2ggcHJvY2Vzcy4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19GbHVzaF9UWERSKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBJZiBhIHBlbmRpbmcgVFhJUyBmbGFnIGlzIHNldCAqLworICAvKiBXcml0ZSBhIGR1bW15IGRhdGEgaW4gVFhEUiB0byBjbGVhciBpdCAqLworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1RYSVMpICE9IFJFU0VUKQorICB7CisgICAgaGkyYy0+SW5zdGFuY2UtPlRYRFIgPSAweDAwVTsKKyAgfQorCisgIC8qIEZsdXNoIFRYIHJlZ2lzdGVyIGlmIG5vdCBlbXB0eSAqLworICBpZiAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1RYRSkgPT0gUkVTRVQpCisgIHsKKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19UWEUpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyQyBtYXN0ZXIgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQU1hc3RlclRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1RYRE1BRU47CisKKyAgLyogSWYgbGFzdCB0cmFuc2ZlciwgZW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgIGlmIChoaTJjLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9DUExUX0lUKTsKKyAgfQorICAvKiBlbHNlIHByZXBhcmUgYSBuZXcgRE1BIHRyYW5zZmVyIGFuZCBlbmFibGUgVENSZWxvYWQgaW50ZXJydXB0ICovCisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSBCdWZmZXIgcG9pbnRlciAqLworICAgIGhpMmMtPnBCdWZmUHRyICs9IGhpMmMtPlhmZXJTaXplOworCisgICAgLyogU2V0IHRoZSBYZmVyU2l6ZSB0byB0cmFuc2ZlciAqLworICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoaTJjLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBoaTJjLT5YZmVyQ291bnQ7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhpMmMtPmhkbWF0eCwgKHVpbnQzMl90KWhpMmMtPnBCdWZmUHRyLCAodWludDMyX3QpJmhpMmMtPkluc3RhbmNlLT5UWERSLCBoaTJjLT5YZmVyU2l6ZSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgSTJDX0lURXJyb3IoaGkyYywgSEFMX0kyQ19FUlJPUl9ETUEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIFRDIGludGVycnVwdHMgKi8KKyAgICAgIEkyQ19FbmFibGVfSVJRKGhpMmMsIEkyQ19YRkVSX1JFTE9BRF9JVCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIEkyQyBzbGF2ZSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworICB1aW50MzJfdCB0bXBvcHRpb25zID0gaGkyYy0+WGZlck9wdGlvbnM7CisKKyAgaWYgKCh0bXBvcHRpb25zID09IEkyQ19ORVhUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBJMkNfRklSU1RfRlJBTUUpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkkyQ19DUjFfVFhETUFFTjsKKworICAgIC8qIExhc3QgQnl0ZSBpcyBUcmFuc21pdHRlZCAqLworICAgIC8qIENhbGwgSTJDIFNsYXZlIFNlcXVlbnRpYWwgY29tcGxldGUgcHJvY2VzcyAqLworICAgIEkyQ19JVFNsYXZlU2VxQ3BsdChoaTJjKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBObyBzcGVjaWZpYyBhY3Rpb24sIE1hc3RlciBmdWxseSBtYW5hZ2UgdGhlIGdlbmVyYXRpb24gb2YgU1RPUCBjb25kaXRpb24gKi8KKyAgICAvKiBNZWFuIHRoYXQgdGhpcyBnZW5lcmF0aW9uIGNhbiBhcnJpdmUgYXQgYW55IHRpbWUsIGF0IHRoZSBlbmQgb3IgZHVyaW5nIERNQSBwcm9jZXNzICovCisgICAgLyogU28gU1RPUCBjb25kaXRpb24gc2hvdWxkIGJlIG1hbmFnZSB0aHJvdWdoIEludGVycnVwdCB0cmVhdG1lbnQgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIEkyQyBtYXN0ZXIgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BTWFzdGVyUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjID0gKEkyQ19IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgRE1BIFJlcXVlc3QgKi8KKyAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9SWERNQUVOOworCisgIC8qIElmIGxhc3QgdHJhbnNmZXIsIGVuYWJsZSBTVE9QIGludGVycnVwdCAqLworICBpZiAoaGkyYy0+WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0ICovCisgICAgSTJDX0VuYWJsZV9JUlEoaGkyYywgSTJDX1hGRVJfQ1BMVF9JVCk7CisgIH0KKyAgLyogZWxzZSBwcmVwYXJlIGEgbmV3IERNQSB0cmFuc2ZlciBhbmQgZW5hYmxlIFRDUmVsb2FkIGludGVycnVwdCAqLworICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoaTJjLT5wQnVmZlB0ciArPSBoaTJjLT5YZmVyU2l6ZTsKKworICAgIC8qIFNldCB0aGUgWGZlclNpemUgdG8gdHJhbnNmZXIgKi8KKyAgICBpZiAoaGkyYy0+WGZlckNvdW50ID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGkyYy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpMmMtPlhmZXJTaXplID0gaGkyYy0+WGZlckNvdW50OworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoaTJjLT5oZG1hcngsICh1aW50MzJfdCkmaGkyYy0+SW5zdGFuY2UtPlJYRFIsICh1aW50MzJfdCloaTJjLT5wQnVmZlB0ciwgaGkyYy0+WGZlclNpemUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgIEkyQ19JVEVycm9yKGhpMmMsIEhBTF9JMkNfRVJST1JfRE1BKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgICBJMkNfRW5hYmxlX0lSUShoaTJjLCBJMkNfWEZFUl9SRUxPQURfSVQpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJMkMgc2xhdmUgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJMkNfRE1BU2xhdmVSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoaTJjLT5YZmVyT3B0aW9uczsKKworICBpZiAoKF9fSEFMX0RNQV9HRVRfQ09VTlRFUihoaTJjLT5oZG1hcngpID09IDBVKSAmJiBcCisgICAgICAodG1wb3B0aW9ucyAhPSBJMkNfTk9fT1BUSU9OX0ZSQU1FKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFJlcXVlc3QgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5JMkNfQ1IxX1JYRE1BRU47CisKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBTZXF1ZW50aWFsIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRTbGF2ZVNlcUNwbHQoaGkyYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm8gc3BlY2lmaWMgYWN0aW9uLCBNYXN0ZXIgZnVsbHkgbWFuYWdlIHRoZSBnZW5lcmF0aW9uIG9mIFNUT1AgY29uZGl0aW9uICovCisgICAgLyogTWVhbiB0aGF0IHRoaXMgZ2VuZXJhdGlvbiBjYW4gYXJyaXZlIGF0IGFueSB0aW1lLCBhdCB0aGUgZW5kIG9yIGR1cmluZyBETUEgcHJvY2VzcyAqLworICAgIC8qIFNvIFNUT1AgY29uZGl0aW9uIHNob3VsZCBiZSBtYW5hZ2UgdGhyb3VnaCBJbnRlcnJ1cHQgdHJlYXRtZW50ICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSTJDIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJMkNfSGFuZGxlVHlwZURlZiAqaGkyYyA9IChJMkNfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBEaXNhYmxlIEFja25vd2xlZGdlICovCisgIGhpMmMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9OQUNLOworCisgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICBJMkNfSVRFcnJvcihoaTJjLCBIQUxfSTJDX0VSUk9SX0RNQSk7Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgSTJDIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2sKKyAgKiAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSkuCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19ETUFBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMgPSAoSTJDX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogUmVzZXQgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgIGhpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGNvbWUgZnJvbSBhYm9ydCBmcm9tIHVzZXIgKi8KKyAgaWYgKGhpMmMtPlN0YXRlID09IEhBTF9JMkNfU1RBVEVfQUJPUlQpCisgIHsKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfQWJvcnRDcGx0Q2FsbGJhY2soaGkyYyk7CisjZW5kaWYgLyogVVNFX0hBTF9JMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhpMmMtPkVycm9yQ2FsbGJhY2soaGkyYyk7CisjZWxzZQorICAgIEhBTF9JMkNfRXJyb3JDYWxsYmFjayhoaTJjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgSTJDIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgVGhlIG5ldyBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBGbGFnKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgSTJDIENvbW11bmljYXRpb24gVGltZW91dCBmb3Igc3BlY2lmaWMgdXNhZ2Ugb2YgVFhJUyBmbGFnLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX1dhaXRPblRYSVNGbGFnVW50aWxUaW1lb3V0KEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfVFhJUykgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBhIE5BQ0sgaXMgZGV0ZWN0ZWQgKi8KKyAgICBpZiAoSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpMmMtPk1vZGUgPSBIQUxfSTJDX01PREVfTk9ORTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJMkMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0IGZvciBzcGVjaWZpYyB1c2FnZSBvZiBTVE9QIGZsYWcuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJMkNfV2FpdE9uU1RPUEZsYWdVbnRpbFRpbWVvdXQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgd2hpbGUgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRikgPT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBhIE5BQ0sgaXMgZGV0ZWN0ZWQgKi8KKyAgICBpZiAoSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoaGkyYywgVGltZW91dCwgVGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgaGkyYy0+TW9kZSA9IEhBTF9JMkNfTU9ERV9OT05FOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEkyQyBDb21tdW5pY2F0aW9uIFRpbWVvdXQgZm9yIHNwZWNpZmljIHVzYWdlIG9mIFJYTkUgZmxhZy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dChJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoX19IQUxfSTJDX0dFVF9GTEFHKGhpMmMsIEkyQ19GTEFHX1JYTkUpID09IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgaWYgYSBOQUNLIGlzIGRldGVjdGVkICovCisgICAgaWYgKEkyQ19Jc0Fja25vd2xlZGdlRmFpbGVkKGhpMmMsIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgYSBTVE9QRiBpcyBkZXRlY3RlZCAqLworICAgIGlmIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFNFVCkKKyAgICB7CisgICAgICAvKiBDaGVjayBpZiBhbiBSWE5FIGlzIHBlbmRpbmcgKi8KKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfUlhORSkgPT0gU0VUKSAmJiAoaGkyYy0+WGZlclNpemUgPiAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFJldHVybiBIQUxfT0sgKi8KKyAgICAgICAgLyogVGhlIFJlYWRpbmcgb2YgZGF0YSBmcm9tIFJYRFIgd2lsbCBiZSBkb25lIGluIGNhbGxlciBmdW5jdGlvbiAqLworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfSTJDX0NMRUFSX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgICBJMkNfUkVTRVRfQ1IyKGhpMmMpOworCisgICAgICAgIGhpMmMtPkVycm9yQ29kZSA9IEhBTF9JMkNfRVJST1JfTk9ORTsKKyAgICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICB7CisgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEFja25vd2xlZGdlIGZhaWxlZCBkZXRlY3Rpb24gZHVyaW5nIGFuIEkyQyBDb21tdW5pY2F0aW9uLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSTJDX0lzQWNrbm93bGVkZ2VGYWlsZWQoSTJDX0hhbmRsZVR5cGVEZWYgKmhpMmMsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgaWYgKF9fSEFMX0kyQ19HRVRfRkxBRyhoaTJjLCBJMkNfRkxBR19BRikgPT0gU0VUKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBTVE9QIEZsYWcgaXMgcmVzZXQgKi8KKyAgICAvKiBBdXRvRW5kIHNob3VsZCBiZSBpbml0aWF0ZSBhZnRlciBBRiAqLworICAgIHdoaWxlIChfX0hBTF9JMkNfR0VUX0ZMQUcoaGkyYywgSTJDX0ZMQUdfU1RPUEYpID09IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoaTJjLT5FcnJvckNvZGUgfD0gSEFMX0kyQ19FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICAgICAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIE5BQ0tGIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19BRik7CisKKyAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICBfX0hBTF9JMkNfQ0xFQVJfRkxBRyhoaTJjLCBJMkNfRkxBR19TVE9QRik7CisKKyAgICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLworICAgIEkyQ19GbHVzaF9UWERSKGhpMmMpOworCisgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgSTJDX1JFU0VUX0NSMihoaTJjKTsKKworICAgIGhpMmMtPkVycm9yQ29kZSB8PSBIQUxfSTJDX0VSUk9SX0FGOworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKyAgICBoaTJjLT5Nb2RlID0gSEFMX0kyQ19NT0RFX05PTkU7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgSTJDeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcGFyYW0gIGhpMmMgSTJDIGhhbmRsZS4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgU3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBTaXplIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQuCisgICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICogQHBhcmFtICBNb2RlIE5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19SRUxPQURfTU9ERSBFbmFibGUgUmVsb2FkIG1vZGUgLgorICAqICAgICBAYXJnIEByZWYgSTJDX0FVVE9FTkRfTU9ERSBFbmFibGUgQXV0b21hdGljIGVuZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgSTJDX1NPRlRFTkRfTU9ERSBFbmFibGUgU29mdHdhcmUgZW5kIG1vZGUuCisgICogQHBhcmFtICBSZXF1ZXN0IE5ldyBzdGF0ZSBvZiB0aGUgSTJDIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uLgorICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19OT19TVEFSVFNUT1AgRG9uJ3QgR2VuZXJhdGUgc3RvcCBhbmQgc3RhcnQgY29uZGl0aW9uLgorICAqICAgICBAYXJnIEByZWYgSTJDX0dFTkVSQVRFX1NUT1AgR2VuZXJhdGUgc3RvcCBjb25kaXRpb24gKFNpemUgc2hvdWxkIGJlIHNldCB0byAwKS4KKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19HRU5FUkFURV9TVEFSVF9SRUFEIEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdC4KKyAgKiAgICAgQGFyZyBAcmVmIEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX1RyYW5zZmVyQ29uZmlnKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90IFNpemUsIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IFJlcXVlc3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UUkFOU0ZFUl9NT0RFKE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RSQU5TRkVSX1JFUVVFU1QoUmVxdWVzdCkpOworCisgIC8qIHVwZGF0ZSBDUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhoaTJjLT5JbnN0YW5jZS0+Q1IyLCAoKEkyQ19DUjJfU0FERCB8IEkyQ19DUjJfTkJZVEVTIHwgSTJDX0NSMl9SRUxPQUQgfCBJMkNfQ1IyX0FVVE9FTkQgfCAoSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEkyQ19DUjJfU1RBUlQgfCBJMkNfQ1IyX1NUT1ApKSwgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50MzJfdClEZXZBZGRyZXNzICYgSTJDX0NSMl9TQUREKSB8ICgoKHVpbnQzMl90KVNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSAmIEkyQ19DUjJfTkJZVEVTKSB8ICh1aW50MzJfdClNb2RlIHwgKHVpbnQzMl90KVJlcXVlc3QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGVuYWJsaW5nIG9mIEludGVycnVwdHMuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQy4KKyAgKiBAcGFyYW0gIEludGVycnVwdFJlcXVlc3QgVmFsdWUgb2YgQHJlZiBJMkNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEkyQ19FbmFibGVfSVJRKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVTsKKworICBpZiAoKGhpMmMtPlhmZXJJU1IgPT0gSTJDX01hc3Rlcl9JU1JfRE1BKSB8fCBcCisgICAgICAoaGkyYy0+WGZlcklTUiA9PSBJMkNfU2xhdmVfSVNSX0RNQSkpCisgIHsKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9MSVNURU5fSVQpID09IEkyQ19YRkVSX0xJU1RFTl9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBTVE9QLCBOQUNLIGFuZCBBRERSIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfQUREUkkgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9FUlJPUl9JVCkgPT0gSTJDX1hGRVJfRVJST1JfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX0VSUkkgfCBJMkNfSVRfTkFDS0k7CisgICAgfQorCisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfQ1BMVF9JVCkgPT0gSTJDX1hGRVJfQ1BMVF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JFTE9BRF9JVCkgPT0gSTJDX1hGRVJfUkVMT0FEX0lUKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBUQyBpbnRlcnJ1cHRzICovCisgICAgICB0bXBpc3IgfD0gSTJDX0lUX1RDSTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfTElTVEVOX0lUKSA9PSBJMkNfWEZFUl9MSVNURU5fSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIEVSUiwgU1RPUCwgTkFDSywgYW5kIEFERFIgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1RYX0lUKSA9PSBJMkNfWEZFUl9UWF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSyBhbmQgUlhJIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0kgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfVFhJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX1JYX0lUKSA9PSBJMkNfWEZFUl9SWF9JVCkKKyAgICB7CisgICAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSyBhbmQgVFhJIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfRVJSSSB8IEkyQ19JVF9UQ0kgfCBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfUlhJOworICAgIH0KKworICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEkyQ19YRkVSX0NQTFRfSVQpID09IEkyQ19YRkVSX0NQTFRfSVQpCisgICAgeworICAgICAgLyogRW5hYmxlIFNUT1AgaW50ZXJydXB0cyAqLworICAgICAgdG1waXNyIHw9IEkyQ19JVF9TVE9QSTsKKyAgICB9CisgIH0KKworICAvKiBFbmFibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgdGhlIHJpc2sgb2YgSTJDIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSAqLworICAvKiBhbGwgaW50ZXJydXB0cyByZXF1ZXN0ZWQgZG9uZSAqLworICBfX0hBTF9JMkNfRU5BQkxFX0lUKGhpMmMsIHRtcGlzcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBkaXNhYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIEkyQ19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0Rpc2FibGVfSVJRKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVTsKKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9UWF9JVCkgPT0gSTJDX1hGRVJfVFhfSVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDIGFuZCBUWEkgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJIHwgSTJDX0lUX1RYSTsKKworICAgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSAhPSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBOQUNLIGFuZCBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9SWF9JVCkgPT0gSTJDX1hGRVJfUlhfSVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDIGFuZCBSWEkgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJIHwgSTJDX0lUX1JYSTsKKworICAgIGlmICgoKHVpbnQzMl90KWhpMmMtPlN0YXRlICYgKHVpbnQzMl90KUhBTF9JMkNfU1RBVEVfTElTVEVOKSAhPSAodWludDMyX3QpSEFMX0kyQ19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBOQUNLIGFuZCBTVE9QIGludGVycnVwdHMgKi8KKyAgICAgIHRtcGlzciB8PSBJMkNfSVRfU1RPUEkgfCBJMkNfSVRfTkFDS0kgfCBJMkNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBJMkNfWEZFUl9MSVNURU5fSVQpID09IEkyQ19YRkVSX0xJU1RFTl9JVCkKKyAgeworICAgIC8qIERpc2FibGUgQUREUiwgTkFDSyBhbmQgU1RPUCBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9BRERSSSB8IEkyQ19JVF9TVE9QSSB8IEkyQ19JVF9OQUNLSSB8IEkyQ19JVF9FUlJJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfRVJST1JfSVQpID09IEkyQ19YRkVSX0VSUk9SX0lUKQorICB7CisgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCisgICAgdG1waXNyIHw9IEkyQ19JVF9FUlJJIHwgSTJDX0lUX05BQ0tJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfQ1BMVF9JVCkgPT0gSTJDX1hGRVJfQ1BMVF9JVCkKKyAgeworICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KKyAgICB0bXBpc3IgfD0gSTJDX0lUX1NUT1BJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgSTJDX1hGRVJfUkVMT0FEX0lUKSA9PSBJMkNfWEZFUl9SRUxPQURfSVQpCisgIHsKKyAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLworICAgIHRtcGlzciB8PSBJMkNfSVRfVENJOworICB9CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYXQgdGhlIGVuZCAqLworICAvKiB0byBhdm9pZCBhIGJyZWFraW5nIHNpdHVhdGlvbiBsaWtlIGF0ICJ0IiB0aW1lICovCisgIC8qIGFsbCBkaXNhYmxlIGludGVycnVwdHMgcmVxdWVzdCBhcmUgbm90IGRvbmUgKi8KKyAgX19IQUxfSTJDX0RJU0FCTEVfSVQoaGkyYywgdG1waXNyKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IEkyQ3ggT1RIRVJfeHh4IFhmZXJPcHRpb25zIHRvIGZ1bmN0aW9ubmFsIFhmZXJPcHRpb25zLgorICAqIEBwYXJhbSAgaGkyYyBJMkMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBJMkNfT1RIRVJfRlJBTUUgICAgICAgICAgICAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gSTJDX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX09USEVSX0ZSQU1FKQorICB7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfRklSU1RfRlJBTUU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBJMkNfT1RIRVJfQU5EX0xBU1RfRlJBTUUgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgKi8KKyAgLyogdGhlbiBnZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIEkyQ19GSVJTVF9BTkRfTEFTVF9GUkFNRSAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaGkyYy0+WGZlck9wdGlvbnMgPT0gSTJDX09USEVSX0FORF9MQVNUX0ZSQU1FKQorICB7CisgICAgaGkyYy0+WGZlck9wdGlvbnMgPSBJMkNfRklSU1RfQU5EX0xBU1RfRlJBTUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSTJDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfaTJjX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9pMmNfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTExNmIxCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfaTJjX2V4LmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2kyY19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJMkMgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBJMkMgRXh0ZW5kZWQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAjIyMjIyBJMkMgcGVyaXBoZXJhbCBFeHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXSBDb21wYXJpbmcgdG8gb3RoZXIgcHJldmlvdXMgZGV2aWNlcywgdGhlIEkyQyBpbnRlcmZhY2UgZm9yIFNUTTMyV0J4eAorICAgICAgIGRldmljZXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzCisKKyAgICAgICAoKykgUG9zc2liaWxpdHkgdG8gZGlzYWJsZSBvciBlbmFibGUgQW5hbG9nIE5vaXNlIEZpbHRlcgorICAgICAgICgrKSBVc2Ugb2YgYSBjb25maWd1cmVkIERpZ2l0YWwgTm9pc2UgRmlsdGVyCisgICAgICAgKCspIERpc2FibGUgb3IgZW5hYmxlIHdha2V1cCBmcm9tIFN0b3AgbW9kZShzKQorICAgICAgICgrKSBEaXNhYmxlIG9yIGVuYWJsZSBGYXN0IE1vZGUgUGx1cworCisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgTm9pc2UgRmlsdGVyIGFuZCBXYWtlIFVwIEZlYXR1cmUKKyAgICAoIykgQ29uZmlndXJlIEkyQyBBbmFsb2cgbm9pc2UgZmlsdGVyIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyKCkKKyAgICAoIykgQ29uZmlndXJlIEkyQyBEaWdpdGFsIG5vaXNlIGZpbHRlciB1c2luZyB0aGUgZnVuY3Rpb24gSEFMX0kyQ0V4X0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoKQorICAgICgjKSBDb25maWd1cmUgdGhlIGVuYWJsZSBvciBkaXNhYmxlIG9mIEkyQyBXYWtlIFVwIE1vZGUgdXNpbmcgdGhlIGZ1bmN0aW9ucyA6CisgICAgICAgICAgKCsrKSBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKCkKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKCkKKyAgICAoIykgQ29uZmlndXJlIHRoZSBlbmFibGUgb3IgZGlzYWJsZSBvZiBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgdXNpbmcgdGhlIGZ1bmN0aW9ucyA6CisgICAgICAgICAgKCsrKSBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKCkKKyAgICAgICAgICAoKyspIEhBTF9JMkNFeF9EaXNhYmxlRmFzdE1vZGVQbHVzKCkKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSTJDRXggSTJDRXgKKyAgKiBAYnJpZWYgSTJDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9JMkNfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEkyQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBJMkMgRXh0ZW5kZWQgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJMkNFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgTm9pc2UgRmlsdGVycworICAgICAgKCspIENvbmZpZ3VyZSBXYWtlIFVwIEZlYXR1cmUKKyAgICAgICgrKSBDb25maWd1cmUgRmFzdCBNb2RlIFBsdXMKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgSTJDIEFuYWxvZyBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBOZXcgc3RhdGUgb2YgdGhlIEFuYWxvZyBmaWx0ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnQW5hbG9nRmlsdGVyKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjLCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfQU5BTE9HX0ZJTFRFUihBbmFsb2dGaWx0ZXIpKTsKKworICBpZiAoaGkyYy0+U3RhdGUgPT0gSEFMX0kyQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9JMkNfRElTQUJMRShoaTJjKTsKKworICAgIC8qIFJlc2V0IEkyQ3ggQU5PRkYgYml0ICovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+KEkyQ19DUjFfQU5GT0ZGKTsKKworICAgIC8qIFNldCBhbmFsb2cgZmlsdGVyIGJpdCovCisgICAgaGkyYy0+SW5zdGFuY2UtPkNSMSB8PSBBbmFsb2dGaWx0ZXI7CisKKyAgICBfX0hBTF9JMkNfRU5BQkxFKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoaTJjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEkyQyBEaWdpdGFsIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhpMmMgUG9pbnRlciB0byBhIEkyQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDeCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgRGlnaXRhbEZpbHRlciBDb2VmZmljaWVudCBvZiBkaWdpdGFsIG5vaXNlIGZpbHRlciBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4MEYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfQ29uZmlnRGlnaXRhbEZpbHRlcihJMkNfSGFuZGxlVHlwZURlZiAqaGkyYywgdWludDMyX3QgRGlnaXRhbEZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKGhpMmMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JMkNfRElHSVRBTF9GSUxURVIoRGlnaXRhbEZpbHRlcikpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBoaTJjLT5JbnN0YW5jZS0+Q1IxOworCisgICAgLyogUmVzZXQgSTJDeCBETkYgYml0cyBbMTE6OF0gKi8KKyAgICB0bXByZWcgJj0gfihJMkNfQ1IxX0RORik7CisKKyAgICAvKiBTZXQgSTJDeCBETkYgY29lZmZpY2llbnQgKi8KKyAgICB0bXByZWcgfD0gRGlnaXRhbEZpbHRlciA8PCA4VTsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICBoaTJjLT5JbnN0YW5jZS0+Q1IxID0gdG1wcmVnOworCisgICAgX19IQUxfSTJDX0VOQUJMRShoaTJjKTsKKworICAgIGhpMmMtPlN0YXRlID0gSEFMX0kyQ19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGkyYyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBJMkMgd2FrZXVwIGZyb20gU3RvcCBtb2RlKHMpLgorICAqIEBwYXJhbSAgaGkyYyBQb2ludGVyIHRvIGEgSTJDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJMkN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSTJDRXhfRW5hYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9XVVBFTjsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEkyQyB3YWtldXAgZnJvbSBTdG9wIG1vZGUocykuCisgICogQHBhcmFtICBoaTJjIFBvaW50ZXIgdG8gYSBJMkNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEkyQ3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMkNFeF9EaXNhYmxlV2FrZVVwKEkyQ19IYW5kbGVUeXBlRGVmICpoaTJjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShoaTJjLT5JbnN0YW5jZSkpOworCisgIGlmIChoaTJjLT5TdGF0ZSA9PSBIQUxfSTJDX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpMmMpOworCisgICAgaGkyYy0+U3RhdGUgPSBIQUxfSTJDX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0kyQ19ESVNBQkxFKGhpMmMpOworCisgICAgLyogRW5hYmxlIHdha2V1cCBmcm9tIHN0b3AgbW9kZSAqLworICAgIGhpMmMtPkluc3RhbmNlLT5DUjEgJj0gfihJMkNfQ1IxX1dVUEVOKTsKKworICAgIF9fSEFMX0kyQ19FTkFCTEUoaGkyYyk7CisKKyAgICBoaTJjLT5TdGF0ZSA9IEhBTF9JMkNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpMmMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgSTJDIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eS4KKyAgKiBAcGFyYW0gQ29uZmlnRmFzdE1vZGVQbHVzIFNlbGVjdHMgdGhlIHBpbi4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIEByZWYgSTJDRXhfRmFzdE1vZGVQbHVzIHZhbHVlcworICAqIEBub3RlICBGb3IgSTJDMSwgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGNhbiBiZSBlbmFibGVkIG9uIGFsbCBzZWxlY3RlZAorICAqICAgICAgICBJMkMxIHBpbnMgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMxIHBhcmFtZXRlciBvciBpbmRlcGVuZGVudGx5CisgICogICAgICAgIG9uIGVhY2ggb25lIG9mIHRoZSBmb2xsb3dpbmcgcGlucyBQQjYsIFBCNywgUEI4IGFuZCBQQjkuCisgICogQG5vdGUgIEZvciByZW1haW5pbmcgSTJDMSBwaW5zIChQQTE0LCBQQTE1Li4uKSBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkKKyAgKiAgICAgICAgY2FuIGJlIGVuYWJsZWQgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzMgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzMgcGFyYW1ldGVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSTJDRXhfRW5hYmxlRmFzdE1vZGVQbHVzKHVpbnQzMl90IENvbmZpZ0Zhc3RNb2RlUGx1cykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfSTJDX0ZBU1RNT0RFUExVUyhDb25maWdGYXN0TW9kZVBsdXMpKTsKKworICAvKiBFbmFibGUgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGZvciBzZWxlY3RlZCBwaW4gKi8KKyAgU0VUX0JJVChTWVNDRkctPkNGR1IxLCAodWludDMyX3QpQ29uZmlnRmFzdE1vZGVQbHVzKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIEkyQyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkuCisgICogQHBhcmFtIENvbmZpZ0Zhc3RNb2RlUGx1cyBTZWxlY3RzIHRoZSBwaW4uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBAcmVmIEkyQ0V4X0Zhc3RNb2RlUGx1cyB2YWx1ZXMKKyAgKiBAbm90ZSAgRm9yIEkyQzEsIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eSBjYW4gYmUgZGlzYWJsZWQgb24gYWxsIHNlbGVjdGVkCisgICogICAgICAgIEkyQzEgcGlucyB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyIG9yIGluZGVwZW5kZW50bHkKKyAgKiAgICAgICAgb24gZWFjaCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwaW5zIFBCNiwgUEI3LCBQQjggYW5kIFBCOS4KKyAgKiBAbm90ZSAgRm9yIHJlbWFpbmluZyBJMkMxIHBpbnMgKFBBMTQsIFBBMTUuLi4pIGZhc3QgbW9kZSBwbHVzIGRyaXZpbmcgY2FwYWJpbGl0eQorICAqICAgICAgICBjYW4gYmUgZGlzYWJsZWQgb25seSBieSB1c2luZyBJMkNfRkFTVE1PREVQTFVTX0kyQzEgcGFyYW1ldGVyLgorICAqIEBub3RlICBGb3IgYWxsIEkyQzMgcGlucyBmYXN0IG1vZGUgcGx1cyBkcml2aW5nIGNhcGFiaWxpdHkgY2FuIGJlIGRpc2FibGVkCisgICogICAgICAgIG9ubHkgYnkgdXNpbmcgSTJDX0ZBU1RNT0RFUExVU19JMkMzIHBhcmFtZXRlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXModWludDMyX3QgQ29uZmlnRmFzdE1vZGVQbHVzKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfRkFTVE1PREVQTFVTKENvbmZpZ0Zhc3RNb2RlUGx1cykpOworCisgIC8qIERpc2FibGUgZmFzdCBtb2RlIHBsdXMgZHJpdmluZyBjYXBhYmlsaXR5IGZvciBzZWxlY3RlZCBwaW4gKi8KKyAgQ0xFQVJfQklUKFNZU0NGRy0+Q0ZHUjEsICh1aW50MzJfdClDb25maWdGYXN0TW9kZVBsdXMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0kyQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2lwY2MuYyBiL1NyYy9zdG0zMndieHhfaGFsX2lwY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk5MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfaXBjYy5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9pcGNjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIElQQ0MgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSW50ZXItUHJvY2Vzc29yIGNvbW11bmljYXRpb24gY29udHJvbGxlcgorICAqICAgICAgICAgIHBlcmlwaGVyYWxzIChJUENDKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgQ29uZmlndXJhdGlvbiwgbm90aWZpY2F0aW9uIGFuZCBpbnRlcnJ1cHRzIGhhbmRsaW5nCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIElQQ0MgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgICAoIykgRGVjbGFyZSBhIElQQ0NfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZTogSVBDQ19IYW5kbGVUeXBlRGVmIGhpcGNjOworICAgICAgKCMpIEluaXRpYWxpemUgdGhlIElQQ0MgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9JUENDX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBJUENDIGludGVyZmFjZSBjbG9jaworICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgSVBDQyBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBJUENDIElSUQorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgSVBDQyByZWdpc3RlcnMgYnkgY2FsbGluZyB0aGUgSEFMX0lQQ0NfSW5pdCgpIEFQSSB3aGljaCB0cmlnCisgICAgICAgICAgSEFMX0lQQ0NfTXNwSW5pdCgpLgorCisgICAgICAoIykgSW1wbGVtZW50IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2tzIGZvciB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiB0byB1c2UgdGhlIGRyaXZlciBpbiBpbnRlcnJ1cHQgbW9kZQorCisgICAgICAoIykgQXNzb2NpYXRlIHRob3NlIGNhbGxiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgYW5kIGRpcmVjdGlvbiB1c2luZyBIQUxfSVBDQ19Db25maWdDaGFubmVsKCkuCisgICAgICAgICAgVGhpcyBpcyB0aGUgaW50ZXJydXB0IG1vZGUuCisgICAgICAgICAgSWYgbm8gY2FsbGJhY2sgYXJlIGNvbmZpZ3VyZWQgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBhbmQgZGlyZWN0aW9uLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBwb2xsIHRoZQorICAgICAgICAgIHN0YXR1cyBvZiB0aGUgY29tbXVuaWNhdGlvbiAocG9sbGluZyBtb2RlKS4KKworICAgICAgKCMpIE5vdGlmeSB0aGUgb3RoZXIgTUNVIHdoZW4gYSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBpbiBhIGNob3NlbiBjaGFubmVsCisgICAgICAgICAgb3Igd2hlbiBhIG1lc3NhZ2UgaGFzIGJlZW4gcmV0cmlldmVkIGZyb20gYSBjaG9zZW4gY2hhbm5lbCBieSBjYWxsaW5nCisgICAgICAgICAgdGhlIEhBTF9JUENDX05vdGlmeUNQVSgpIEFQSS4KKworQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElQQ0MKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0lQQ0NfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElQQ0NfUHJpdmF0ZV9Db25zdGFudHMgSVBDQyBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIElQQ0NfQUxMX1JYX0JVRiAweDAwMDAwMDNGVSAvKiE8IE1hc2sgZm9yIGFsbCBSWCBidWZmZXJzLiAqLworI2RlZmluZSBJUENDX0FMTF9UWF9CVUYgMHgwMDNGMDAwMFUgLyohPCBNYXNrIGZvciBhbGwgVFggYnVmZmVycy4gKi8KKyNkZWZpbmUgQ0hBTk5FTF9JTkRFWF9Nc2sgMHgwMDAwMDAwRlUgLyohPCBNYXNrIHRoZSBjaGFubmVsIGluZGV4IHRvIGF2b2lkIG92ZXJmbG93ICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElQQ0NfUHJpdmF0ZV9GdW5jdGlvbnMgSVBDQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCit2b2lkIElQQ0NfTWFza0ludGVycnVwdCh1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcik7Cit2b2lkIElQQ0NfVW5tYXNrSW50ZXJydXB0KHVpbnQzMl90IENoYW5uZWxJbmRleCwgSVBDQ19DSEFOTkVMRGlyVHlwZURlZiBDaGFubmVsRGlyKTsKK3ZvaWQgSVBDQ19TZXREZWZhdWx0Q2FsbGJhY2tzKElQQ0NfSGFuZGxlVHlwZURlZiAqaGlwY2MpOwordm9pZCBJUENDX1Jlc2V0X1JlZ2lzdGVyKElQQ0NfQ29tbW9uVHlwZURlZiAqSW5zdGFuY2UpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElQQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIElQQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSBhbmQKKyAgICAgICAgICBkZWluaXRpYWxpemUgdGhlIElQQ0MgcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBJbXBsZW1lbnQgSEFMX0lQQ0NfTXNwSW5pdCgpIGZ1bmN0aW9uIGluIHdoaWNoIGhlIGNvbmZpZ3VyZXMKKyAgICAgICAgICBhbGwgcmVsYXRlZCBwZXJpcGhlcmFscyByZXNvdXJjZXMgKENMT0NLIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfSVBDQ19Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBJUENDIHJlZ2lzdGVyLgorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1BLQV9EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgSVBDQyBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIElQQ0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhpcGNjIElQQ0MgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVBDQ19Jbml0KElQQ0NfSGFuZGxlVHlwZURlZiAqaGlwY2MpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVyciA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgSVBDQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGlwY2MgIT0gTlVMTCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0lQQ0NfQUxMX0lOU1RBTkNFKGhpcGNjLT5JbnN0YW5jZSkpOworCisgICAgSVBDQ19Db21tb25UeXBlRGVmICpjdXJyZW50SW5zdGFuY2UgPSBJUENDX0MxOworCisgICAgaWYgKGhpcGNjLT5TdGF0ZSA9PSBIQUxfSVBDQ19TVEFURV9SRVNFVCkKKyAgICB7CisgICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBDTE9DSywgTlZJQyAqLworICAgICAgSEFMX0lQQ0NfTXNwSW5pdChoaXBjYyk7CisgICAgfQorCisgICAgLyogUmVzZXQgYWxsIHJlZ2lzdGVycyBvZiB0aGUgY3VycmVudCBjcHUgdG8gZGVmYXVsdCBzdGF0ZSAqLworICAgIElQQ0NfUmVzZXRfUmVnaXN0ZXIoY3VycmVudEluc3RhbmNlKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbnRlcnJ1cHRzICovCisgICAgY3VycmVudEluc3RhbmNlLT5DUiB8PSAoSVBDQ19DUl9SWE9JRSB8IElQQ0NfQ1JfVFhGSUUpOworCisgICAgLyogQ2xlYXIgY2FsbGJhY2sgcG9pbnRlcnMgKi8KKyAgICBJUENDX1NldERlZmF1bHRDYWxsYmFja3MoaGlwY2MpOworCisgICAgLyogUmVzZXQgYWxsIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiByZXF1ZXN0ICovCisgICAgaGlwY2MtPmNhbGxiYWNrUmVxdWVzdCA9IDA7CisKKyAgICBoaXBjYy0+U3RhdGUgPSBIQUxfSVBDQ19TVEFURV9SRUFEWTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlcnIgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgSVBDQyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaGlwY2MgSVBDQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUENDX0RlSW5pdChJUENDX0hhbmRsZVR5cGVEZWYgKmhpcGNjKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnIgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIElQQ0MgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhpcGNjICE9IE5VTEwpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfSVBDQ19BTExfSU5TVEFOQ0UoaGlwY2MtPkluc3RhbmNlKSk7CisgICAgSVBDQ19Db21tb25UeXBlRGVmICpjdXJyZW50SW5zdGFuY2UgPSBJUENDX0MxOworCisgICAgLyogU2V0IHRoZSBzdGF0ZSB0byBidXN5ICovCisgICAgaGlwY2MtPlN0YXRlID0gSEFMX0lQQ0NfU1RBVEVfQlVTWTsKKworICAgIC8qIFJlc2V0IGFsbCByZWdpc3RlcnMgb2YgdGhlIGN1cnJlbnQgY3B1IHRvIGRlZmF1bHQgc3RhdGUgKi8KKyAgICBJUENDX1Jlc2V0X1JlZ2lzdGVyKGN1cnJlbnRJbnN0YW5jZSk7CisKKyAgICAvKiBDbGVhciBjYWxsYmFjayBwb2ludGVycyAqLworICAgIElQQ0NfU2V0RGVmYXVsdENhbGxiYWNrcyhoaXBjYyk7CisKKyAgICAvKiBSZXNldCBhbGwgY2FsbGJhY2sgbm90aWZpY2F0aW9uIHJlcXVlc3QgKi8KKyAgICBoaXBjYy0+Y2FsbGJhY2tSZXF1ZXN0ID0gMDsKKworICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfSVBDQ19Nc3BEZUluaXQoaGlwY2MpOworCisgICAgaGlwY2MtPlN0YXRlID0gSEFMX0lQQ0NfU1RBVEVfUkVTRVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXJyID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElQQ0MgTVNQLgorICAqIEBwYXJhbSAgaGlwY2MgSVBDQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUENDX01zcEluaXQoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlwY2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZAorICAgICAgICAgICAgdGhlIEhBTF9JUENDX01zcEluaXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBJUENDIE1TUCBEZUluaXQKKyAgKiBAcGFyYW0gIGhpcGNjIElQQ0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfSVBDQ19Nc3BEZUluaXQoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlwY2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZAorICAgICAgICAgICAgdGhlIEhBTF9JUENDX01zcERlSW5pdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgSVBDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgIENvbmZpZ3VyYXRpb24sIG5vdGlmaWNhdGlvbiBhbmQgSXJxIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBhbGxvdyB0d28gTUNVIHRvIGNvbW11bmljYXRlLgorCisgICAgKCMpIEZvciBhIGdpdmVuIGNoYW5uZWwgKGZyb20gMCB0byBJUENDX0NIQU5ORUxfTlVNQkVSKSwgZm9yIGEgZ2l2ZW4gZGlyZWN0aW9uCisgICAgICAgIElQQ0NfQ0hBTk5FTF9ESVJfVFggb3IgSVBDQ19DSEFOTkVMX0RJUl9SWCwgeW91IGNhbiBjaG9vc2UgdG8gY29tbXVuaWNhdGUKKyAgICAgICAgaW4gcG9sbGluZyBtb2RlIG9yIGluIGludGVycnVwdCBtb2RlIHVzaW5nIElQQ0MuCisgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBJUENDIEhBTCBkcml2ZXIgaGFuZGxlIHRoZSBjb21tdW5pY2F0aW9uIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgQnkgc2V0dGluZyBhIGNhbGxiYWNrIGZvciBhIGNoYW5uZWwvZGlyZWN0aW9uLCB0aGlzIGNvbW11bmljYXRpb24gdXNlCisgICAgICAgIHRoZSBpbnRlcnJ1cHQgbW9kZS4KKworICAgICgjKSBQb2xsaW5nIG1vZGU6CisgICAgICAgKCsrKSBUbyB0cmFuc21pdCBpbmZvcm1hdGlvbiwgdXNlIEhBTF9JUENDX05vdGlmeUNQVSgpIHdpdGgKKyAgICAgICAgICAgIElQQ0NfQ0hBTk5FTF9ESVJfVFguIFRvIGtub3cgd2hlbiB0aGUgb3RoZXIgcHJvY2Vzc29yIGhhcyBoYW5kbGVkCisgICAgICAgICAgICB0aGUgbm90aWZpY2F0aW9uLCBwb2xsIHRoZSBjb21tdW5pY2F0aW9uIHVzaW5nIEhBTF9JUENDX05vdGlmeUNQVQorICAgICAgICAgICAgd2l0aCBJUENDX0NIQU5ORUxfRElSX1RYLgorCisgICAgICAgKCsrKSBUbyByZWNlaXZlIGluZm9ybWF0aW9uLCBwb2xsIHRoZSBzdGF0dXMgb2YgdGhlIGNvbW11bmljYXRpb24gd2l0aAorICAgICAgICAgICAgSEFMX0lQQ0NfR2V0Q2hhbm5lbFN0YXR1cyB3aXRoIElQQ0NfQ0hBTk5FTF9ESVJfUlguIFRvIG5vdGlmeSB0aGUgb3RoZXIKKyAgICAgICAgICAgIHByb2Nlc3NvciB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNlaXZlZCwgdXNlIEhBTF9JUENDX05vdGlmeUNQVQorICAgICAgICAgICAgd2l0aCBJUENDX0NIQU5ORUxfRElSX1JYLgorCisgICAgKCMpIEludGVycnVwdCBtb2RlOgorICAgICAgICgrKykgQ29uZmlndXJlIGEgY2FsbGJhY2sgZm9yIHRoZSBjaGFubmVsIGFuZCB0aGUgZGlyZWN0aW9uIHVzaW5nIEhBTF9JUENDX0NvbmZpZ0NoYW5uZWwoKS4KKyAgICAgICAgICAgIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSB0cmlnZ2VyZWQgdW5kZXIgaW50ZXJydXB0LgorCisgICAgICAgKCsrKSBUbyB0cmFuc21pdCBpbmZvcm1hdGlvbiwgdXNlIEhBTF9JUENDX05vdGlmeUNQVSgpIHdpdGgKKyAgICAgICAgICAgIElQQ0NfQ0hBTk5FTF9ESVJfVFguIFRoZSBjYWxsYmFjayBjb25maWd1cmVkIHdpdGggSEFMX0lQQ0NfQ29uZmlnQ2hhbm5lbCgpIGFuZAorICAgICAgICAgICAgSVBDQ19DSEFOTkVMX0RJUl9UWCB3aWxsIGJlIHRyaWdnZXJlZCBvbmNlIHRoZSBjb21tdW5pY2F0aW9uIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGhlCisgICAgICAgICAgICBvdGhlciBwcm9jZXNzb3IuCisKKyAgICAgICAoKyspIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24sIHRoZSBjYWxsYmFjayBjb25maWd1cmVkIHdpdGggSEFMX0lQQ0NfQ29uZmlnQ2hhbm5lbCgpIGFuZAorICAgICAgICAgICAgSVBDQ19DSEFOTkVMX0RJUl9SWCB3aWxsIGJlIHRyaWdnZXJlZCBvbiByZWNlcHRpb24gb2YgYSBjb21tdW5pY2F0aW9uLlRvIG5vdGlmeSB0aGUgb3RoZXIKKyAgICAgICAgICAgIHByb2Nlc3NvciB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNlaXZlZCwgdXNlIEhBTF9JUENDX05vdGlmeUNQVQorICAgICAgICAgICAgd2l0aCBJUENDX0NIQU5ORUxfRElSX1JYLgorCisgICAgICAgKCsrKSBIQUxfSVBDQ19UWF9JUlFIYW5kbGVyIG11c3QgYmUgYWRkZWQgdG8gdGhlIElQQ0MgVFggSVJRSGFuZGxlcgorCisgICAgICAgKCsrKSBIQUxfSVBDQ19SWF9JUlFIYW5kbGVyIG11c3QgYmUgYWRkZWQgdG8gdGhlIElQQ0MgUlggSVJRSGFuZGxlcgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSB0aGUgY2FsbGJhY2sgbm90aWZpY2F0aW9uIG9uIHJlY2VpdmUvdHJhbnNtaXQgaW50ZXJydXB0CisgICogQHBhcmFtICBoaXBjYyBJUENDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbEluZGV4IENoYW5uZWwgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzE6IElQQ0MgQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8yOiBJUENDIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMzogSVBDQyBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzQ6IElQQ0MgQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF81OiBJUENDIENoYW5uZWwgNQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNjogSVBDQyBDaGFubmVsIDYKKyAgKiBAcGFyYW0gIENoYW5uZWxEaXIgQ2hhbm5lbCBkaXJlY3Rpb24KKyAgKiBAcGFyYW0gIGNiIEludGVycnVwdCBjYWxsYmFjaworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lQQ0NfQWN0aXZhdGVOb3RpZmljYXRpb24oSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYywgdWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIsIENoYW5uZWxDYiBjYikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBJUENDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaXBjYyAhPSBOVUxMKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfSVBDQ19BTExfSU5TVEFOQ0UoaGlwY2MtPkluc3RhbmNlKSk7CisKKyAgICAvKiBDaGVjayBJUENDIHN0YXRlICovCisgICAgaWYgKGhpcGNjLT5TdGF0ZSA9PSBIQUxfSVBDQ19TVEFURV9SRUFEWSkKKyAgICB7CisgICAgICAvKiBTZXQgY2FsbGJhY2sgYW5kIHJlZ2lzdGVyIG1hc2tpbmcgaW5mb3JtYXRpb24gKi8KKyAgICAgIGlmIChDaGFubmVsRGlyID09IElQQ0NfQ0hBTk5FTF9ESVJfVFgpCisgICAgICB7CisgICAgICAgIGhpcGNjLT5DaGFubmVsQ2FsbGJhY2tUeFtDaGFubmVsSW5kZXhdID0gY2I7CisgICAgICAgIGhpcGNjLT5jYWxsYmFja1JlcXVlc3QgfD0gKElQQ0NfTVJfQ0gxRk1fTXNrIDw8IChDaGFubmVsSW5kZXggJiBDSEFOTkVMX0lOREVYX01zaykpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoaXBjYy0+Q2hhbm5lbENhbGxiYWNrUnhbQ2hhbm5lbEluZGV4XSA9IGNiOworICAgICAgICBoaXBjYy0+Y2FsbGJhY2tSZXF1ZXN0IHw9IChJUENDX01SX0NIMU9NX01zayA8PCAoQ2hhbm5lbEluZGV4ICYgQ0hBTk5FTF9JTkRFWF9Nc2spKTsKKyAgICAgIH0KKworICAgICAgLyogVW5tYXNrIG9ubHkgdGhlIGNoYW5uZWxzIGluIHJlY2VwdGlvbiAoVHJhbnNtaXNzaW9uIGNoYW5uZWwgbWFzay91bm1hc2sgaXMgZG9uZSBpbiBIQUxfSVBDQ19Ob3RpZnlDUFUpICovCisgICAgICBpZiAoQ2hhbm5lbERpciA9PSBJUENDX0NIQU5ORUxfRElSX1JYKQorICAgICAgeworICAgICAgICBJUENDX1VubWFza0ludGVycnVwdChDaGFubmVsSW5kZXgsIENoYW5uZWxEaXIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZXJyID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBlcnIgPSBIQUxfRVJST1I7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgICogQGJyaWVmICBSZW1vdmUgdGhlIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBvbiByZWNlaXZlL3RyYW5zbWl0IGludGVycnVwdAorICAqIEBwYXJhbSAgaGlwY2MgSVBDQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWxJbmRleCBDaGFubmVsIG51bWJlcgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8xOiBJUENDIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMjogSVBDQyBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzM6IElQQ0MgQ2hhbm5lbCAzCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF80OiBJUENDIENoYW5uZWwgNAorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNTogSVBDQyBDaGFubmVsIDUKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzY6IElQQ0MgQ2hhbm5lbCA2CisgICogQHBhcmFtICBDaGFubmVsRGlyIENoYW5uZWwgZGlyZWN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVBDQ19EZUFjdGl2YXRlTm90aWZpY2F0aW9uKElQQ0NfSGFuZGxlVHlwZURlZiAqaGlwY2MsIHVpbnQzMl90IENoYW5uZWxJbmRleCwgSVBDQ19DSEFOTkVMRGlyVHlwZURlZiBDaGFubmVsRGlyKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnIgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIElQQ0MgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhpcGNjICE9IE5VTEwpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19JUENDX0FMTF9JTlNUQU5DRShoaXBjYy0+SW5zdGFuY2UpKTsKKworICAgIC8qIENoZWNrIElQQ0Mgc3RhdGUgKi8KKyAgICBpZiAoaGlwY2MtPlN0YXRlID09IEhBTF9JUENDX1NUQVRFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFNldCBkZWZhdWx0IGNhbGxiYWNrIGFuZCByZWdpc3RlciBtYXNraW5nIGluZm9ybWF0aW9uICovCisgICAgICBpZiAoQ2hhbm5lbERpciA9PSBJUENDX0NIQU5ORUxfRElSX1RYKQorICAgICAgeworICAgICAgICBoaXBjYy0+Q2hhbm5lbENhbGxiYWNrVHhbQ2hhbm5lbEluZGV4XSA9IEhBTF9JUENDX1R4Q2FsbGJhY2s7CisgICAgICAgIGhpcGNjLT5jYWxsYmFja1JlcXVlc3QgJj0gfihJUENDX01SX0NIMUZNX01zayA8PCAoQ2hhbm5lbEluZGV4ICYgQ0hBTk5FTF9JTkRFWF9Nc2spKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaGlwY2MtPkNoYW5uZWxDYWxsYmFja1J4W0NoYW5uZWxJbmRleF0gPSBIQUxfSVBDQ19SeENhbGxiYWNrOworICAgICAgICBoaXBjYy0+Y2FsbGJhY2tSZXF1ZXN0ICY9IH4oSVBDQ19NUl9DSDFPTV9Nc2sgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSk7CisgICAgICB9CisKKyAgICAgIC8qIE1hc2sgdGhlIGludGVycnVwdCAqLworICAgICAgSVBDQ19NYXNrSW50ZXJydXB0KENoYW5uZWxJbmRleCwgQ2hhbm5lbERpcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlcnIgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGVyciA9IEhBTF9FUlJPUjsKKyAgfQorICByZXR1cm4gZXJyOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBzdGF0ZSBvZiBJUENDIGNoYW5uZWwKKyAgKiBAcGFyYW0gIGhpcGNjIElQQ0MgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsSW5kZXggQ2hhbm5lbCBudW1iZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMTogSVBDQyBDaGFubmVsIDEKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzI6IElQQ0MgQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8zOiBJUENDIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNDogSVBDQyBDaGFubmVsIDQKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzU6IElQQ0MgQ2hhbm5lbCA1CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF82OiBJUENDIENoYW5uZWwgNgorICAqIEBwYXJhbSAgQ2hhbm5lbERpciBDaGFubmVsIGRpcmVjdGlvbgorICAqIEByZXR2YWwgQ2hhbm5lbCBzdGF0dXMKKyAgKi8KK0lQQ0NfQ0hBTk5FTFN0YXR1c1R5cGVEZWYgSEFMX0lQQ0NfR2V0Q2hhbm5lbFN0YXR1cyhJUENDX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcikKK3sKKyAgdWludDMyX3QgY2hhbm5lbF9zdGF0ZTsKKyAgSVBDQ19Db21tb25UeXBlRGVmICpjdXJyZW50SW5zdGFuY2UgPSBJUENDX0MxOworICBJUENDX0NvbW1vblR5cGVEZWYgKm90aGVySW5zdGFuY2UgPSBJUENDX0MyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JUENDX0FMTF9JTlNUQU5DRShoaXBjYy0+SW5zdGFuY2UpKTsKKworICAvKiBSZWFkIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBkZXBlbmRpbmcgb2YgdGhlIE1DVSBhbmQgdGhlIGRpcmVjdGlvbiAqLworICBpZiAoQ2hhbm5lbERpciA9PSBJUENDX0NIQU5ORUxfRElSX1RYKQorICB7CisgICAgY2hhbm5lbF9zdGF0ZSA9IChjdXJyZW50SW5zdGFuY2UtPlNSKSAmIChJUENDX1NSX0NIMUZfTXNrIDw8IChDaGFubmVsSW5kZXggJiBDSEFOTkVMX0lOREVYX01zaykpOworICB9CisgIGVsc2UKKyAgeworICAgIGNoYW5uZWxfc3RhdGUgPSAob3RoZXJJbnN0YW5jZS0+U1IpICYgKElQQ0NfU1JfQ0gxRl9Nc2sgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSk7CisgIH0KKworICByZXR1cm4gKGNoYW5uZWxfc3RhdGUgPT0gMFVMKSA/IElQQ0NfQ0hBTk5FTF9TVEFUVVNfRlJFRSA6IElQQ0NfQ0hBTk5FTF9TVEFUVVNfT0NDVVBJRUQgOworfQorCisvKioKKyAgKiBAYnJpZWYgIE5vdGlmeSByZW1vdGUgcHJvY2Vzc29yCisgICogQHBhcmFtICBoaXBjYyBJUENDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbEluZGV4IENoYW5uZWwgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzE6IElQQ0MgQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8yOiBJUENDIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMzogSVBDQyBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzQ6IElQQ0MgQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF81OiBJUENDIENoYW5uZWwgNQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNjogSVBDQyBDaGFubmVsIDYKKyAgKiBAcGFyYW0gIENoYW5uZWxEaXIgQ2hhbm5lbCBkaXJlY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUENDX05vdGlmeUNQVShJUENDX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyID0gSEFMX09LOworICB1aW50MzJfdCBtYXNrOworICBJUENDX0NvbW1vblR5cGVEZWYgKmN1cnJlbnRJbnN0YW5jZSA9IElQQ0NfQzE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0lQQ0NfQUxMX0lOU1RBTkNFKGhpcGNjLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIGlmIElQQ0MgaXMgaW5pdGlsaWFzZWQgKi8KKyAgaWYgKGhpcGNjLT5TdGF0ZSA9PSBIQUxfSVBDQ19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIEZvciBJUENDX0NIQU5ORUxfRElSX1RYLCBzZXQgdGhlIHN0YXR1cy4gRm9yIElQQ0NfQ0hBTk5FTF9ESVJfUlgsIGNsZWFyIHRoZSBzdGF0dXMgKi8KKyAgICBjdXJyZW50SW5zdGFuY2UtPlNDUiB8PSAoKENoYW5uZWxEaXIgPT0gSVBDQ19DSEFOTkVMX0RJUl9UWCkgPyBJUENDX1NDUl9DSDFTIDogSVBDQ19TQ1JfQ0gxQykgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSA7CisKKyAgICAvKiBVbm1hc2sgaW50ZXJydXB0IGlmIHRoZSBjYWxsYmFjayBpcyByZXF1ZXN0ZWQgKi8KKyAgICBtYXNrID0gKChDaGFubmVsRGlyID09IElQQ0NfQ0hBTk5FTF9ESVJfVFgpID8gSVBDQ19NUl9DSDFGTV9Nc2sgOiBJUENDX01SX0NIMU9NX01zaykgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSA7CisgICAgaWYgKChoaXBjYy0+Y2FsbGJhY2tSZXF1ZXN0ICYgbWFzaykgPT0gbWFzaykKKyAgICB7CisgICAgICBJUENDX1VubWFza0ludGVycnVwdChDaGFubmVsSW5kZXgsIENoYW5uZWxEaXIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBlcnIgPSBIQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVBDQ19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIElQQ0MgVHggRnJlZSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhpcGNjIElQQ0MgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JUENDX1RYX0lSUUhhbmRsZXIoSVBDQ19IYW5kbGVUeXBlRGVmICpjb25zdCBoaXBjYykKK3sKKyAgdWludDMyX3QgaXJxbWFzazsKKyAgdWludDMyX3QgYml0X3BvczsKKyAgdWludDMyX3QgY2hfY291bnQgPSAwVTsKKyAgSVBDQ19Db21tb25UeXBlRGVmICpjdXJyZW50SW5zdGFuY2UgPSBJUENDX0MxOworCisgIC8qIGNoZWNrIHRoZSBUeCBmcmVlIGNoYW5uZWxzIHdoaWNoIGFyZSBub3QgbWFza2VkICovCisgIGlycW1hc2sgPSB+KGN1cnJlbnRJbnN0YW5jZS0+TVIpICYgSVBDQ19BTExfVFhfQlVGOworICBpcnFtYXNrID0gaXJxbWFzayAmIH4oY3VycmVudEluc3RhbmNlLT5TUiA8PCBJUENDX01SX0NIMUZNX1Bvcyk7CisKKyAgd2hpbGUgKGlycW1hc2sgIT0gMFVMKSAgLyogaWYgc2V2ZXJhbCBiaXRzIGFyZSBzZXQsIGl0IGxvb3BzIHRvIHNlcnZlIGFsbCBvZiB0aGVtICovCisgIHsKKyAgICBiaXRfcG9zID0gMVVMIDw8IChJUENDX01SX0NIMUZNX1BvcyArIChjaF9jb3VudCAmIENIQU5ORUxfSU5ERVhfTXNrKSk7CisKKyAgICBpZiAoKGlycW1hc2sgJiBiaXRfcG9zKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBtYXNrIHRoZSBjaGFubmVsIEZyZWUgaW50ZXJydXB0ICAqLworICAgICAgY3VycmVudEluc3RhbmNlLT5NUiB8PSBiaXRfcG9zOworICAgICAgaWYgKGhpcGNjLT5DaGFubmVsQ2FsbGJhY2tUeFtjaF9jb3VudF0gIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaGlwY2MtPkNoYW5uZWxDYWxsYmFja1R4W2NoX2NvdW50XShoaXBjYywgY2hfY291bnQsIElQQ0NfQ0hBTk5FTF9ESVJfVFgpOworICAgICAgfQorICAgICAgaXJxbWFzayA9ICBpcnFtYXNrICYgfihiaXRfcG9zKTsKKyAgICB9CisgICAgY2hfY291bnQrKzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBJUENDIFJ4IE9jY3VwaWVkIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGlwY2MgOiBJUENDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfSVBDQ19SWF9JUlFIYW5kbGVyKElQQ0NfSGFuZGxlVHlwZURlZiAqY29uc3QgaGlwY2MpCit7CisgIHVpbnQzMl90IGlycW1hc2s7CisgIHVpbnQzMl90IGJpdF9wb3M7CisgIHVpbnQzMl90IGNoX2NvdW50ID0gMFU7CisgIElQQ0NfQ29tbW9uVHlwZURlZiAqY3VycmVudEluc3RhbmNlID0gSVBDQ19DMTsKKyAgSVBDQ19Db21tb25UeXBlRGVmICpvdGhlckluc3RhbmNlID0gSVBDQ19DMjsKKworICAvKiBjaGVjayB0aGUgUnggb2NjdXBpZWQgY2hhbm5lbHMgd2hpY2ggYXJlIG5vdCBtYXNrZWQgKi8KKyAgaXJxbWFzayA9IH4oY3VycmVudEluc3RhbmNlLT5NUikgJiBJUENDX0FMTF9SWF9CVUY7CisgIGlycW1hc2sgPSBpcnFtYXNrICYgb3RoZXJJbnN0YW5jZS0+U1I7CisKKyAgd2hpbGUgKGlycW1hc2sgIT0gMFVMKSAgLyogaWYgc2V2ZXJhbCBiaXRzIGFyZSBzZXQsIGl0IGxvb3BzIHRvIHNlcnZlIGFsbCBvZiB0aGVtICovCisgIHsKKyAgICBiaXRfcG9zID0gMVVMIDw8IChjaF9jb3VudCAmIENIQU5ORUxfSU5ERVhfTXNrKTsKKworICAgIGlmICgoaXJxbWFzayAmIGJpdF9wb3MpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIG1hc2sgdGhlIGNoYW5uZWwgb2NjdXBpZWQgaW50ZXJydXB0ICovCisgICAgICBjdXJyZW50SW5zdGFuY2UtPk1SIHw9IGJpdF9wb3M7CisgICAgICBpZiAoaGlwY2MtPkNoYW5uZWxDYWxsYmFja1J4W2NoX2NvdW50XSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBoaXBjYy0+Q2hhbm5lbENhbGxiYWNrUnhbY2hfY291bnRdKGhpcGNjLCBjaF9jb3VudCwgSVBDQ19DSEFOTkVMX0RJUl9SWCk7CisgICAgICB9CisgICAgICBpcnFtYXNrID0gaXJxbWFzayAmIH4oYml0X3Bvcyk7CisgICAgfQorICAgIGNoX2NvdW50Kys7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJ4IG9jY3VwaWVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhpcGNjIElQQ0MgaGFuZGxlCisgICogQHBhcmFtIENoYW5uZWxJbmRleCBDaGFubmVsIG51bWJlcgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8xOiBJUENDIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMjogSVBDQyBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzM6IElQQ0MgQ2hhbm5lbCAzCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF80OiBJUENDIENoYW5uZWwgNAorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNTogSVBDQyBDaGFubmVsIDUKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzY6IElQQ0MgQ2hhbm5lbCA2CisgICogQHBhcmFtIENoYW5uZWxEaXIgQ2hhbm5lbCBkaXJlY3Rpb24KKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUENDX1J4Q2FsbGJhY2soSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYywgdWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcGNjKTsKKyAgVU5VU0VEKENoYW5uZWxJbmRleCk7CisgIFVOVVNFRChDaGFubmVsRGlyKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lQQ0NfUnhDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFR4IGZyZWUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gaGlwY2MgSVBDQyBoYW5kbGUKKyAgKiBAcGFyYW0gQ2hhbm5lbEluZGV4IENoYW5uZWwgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzE6IElQQ0MgQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8yOiBJUENDIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMzogSVBDQyBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzQ6IElQQ0MgQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF81OiBJUENDIENoYW5uZWwgNQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNjogSVBDQyBDaGFubmVsIDYKKyAgKiBAcGFyYW0gQ2hhbm5lbERpciBDaGFubmVsIGRpcmVjdGlvbgorICAqLworX193ZWFrIHZvaWQgSEFMX0lQQ0NfVHhDYWxsYmFjayhJUENDX0hhbmRsZVR5cGVEZWYgKmhpcGNjLCB1aW50MzJfdCBDaGFubmVsSW5kZXgsIElQQ0NfQ0hBTk5FTERpclR5cGVEZWYgQ2hhbm5lbERpcikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlwY2MpOworICBVTlVTRUQoQ2hhbm5lbEluZGV4KTsKKyAgVU5VU0VEKENoYW5uZWxEaXIpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVBDQ19UeENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVBDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiAgQGJyaWVmICAgSVBDQyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXQgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgSVBDQyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoaXBjYyBJUENDIGhhbmRsZQorICAqIEByZXR2YWwgSVBDQyBoYW5kbGUgc3RhdGUKKyAgKi8KK0hBTF9JUENDX1N0YXRlVHlwZURlZiBIQUxfSVBDQ19HZXRTdGF0ZShJUENDX0hhbmRsZVR5cGVEZWYgY29uc3QgKmNvbnN0IGhpcGNjKQoreworICByZXR1cm4gaGlwY2MtPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVBDQ19Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTWFzayBJUENDIGludGVycnVwdHMuCisgICogQHBhcmFtICBDaGFubmVsSW5kZXggQ2hhbm5lbCBudW1iZXIKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMTogSVBDQyBDaGFubmVsIDEKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzI6IElQQ0MgQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8zOiBJUENDIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNDogSVBDQyBDaGFubmVsIDQKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzU6IElQQ0MgQ2hhbm5lbCA1CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF82OiBJUENDIENoYW5uZWwgNgorICAqIEBwYXJhbSAgQ2hhbm5lbERpciBDaGFubmVsIGRpcmVjdGlvbgorICAqLwordm9pZCBJUENDX01hc2tJbnRlcnJ1cHQodWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpCit7CisgIElQQ0NfQ29tbW9uVHlwZURlZiAqY3VycmVudEluc3RhbmNlID0gSVBDQ19DMTsKKyAgaWYgKENoYW5uZWxEaXIgPT0gSVBDQ19DSEFOTkVMX0RJUl9UWCkKKyAgeworICAgIC8qIE1hc2sgaW50ZXJydXB0ICovCisgICAgY3VycmVudEluc3RhbmNlLT5NUiB8PSAoSVBDQ19NUl9DSDFGTV9Nc2sgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTWFzayBpbnRlcnJ1cHQgKi8KKyAgICBjdXJyZW50SW5zdGFuY2UtPk1SIHw9IChJUENDX01SX0NIMU9NX01zayA8PCAoQ2hhbm5lbEluZGV4ICYgQ0hBTk5FTF9JTkRFWF9Nc2spKTsKKyAgfQorfQorLyoqCisgICogQGJyaWVmICBVbm1hc2sgSVBDQyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgQ2hhbm5lbEluZGV4IENoYW5uZWwgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzE6IElQQ0MgQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF8yOiBJUENDIENoYW5uZWwgMgorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfMzogSVBDQyBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgSVBDQ19DSEFOTkVMXzQ6IElQQ0MgQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIElQQ0NfQ0hBTk5FTF81OiBJUENDIENoYW5uZWwgNQorICAqICAgICAgICAgICAgQGFyZyBJUENDX0NIQU5ORUxfNjogSVBDQyBDaGFubmVsIDYKKyAgKiBAcGFyYW0gIENoYW5uZWxEaXIgQ2hhbm5lbCBkaXJlY3Rpb24KKyAgKi8KK3ZvaWQgSVBDQ19Vbm1hc2tJbnRlcnJ1cHQodWludDMyX3QgQ2hhbm5lbEluZGV4LCBJUENDX0NIQU5ORUxEaXJUeXBlRGVmIENoYW5uZWxEaXIpCit7CisgIElQQ0NfQ29tbW9uVHlwZURlZiAqY3VycmVudEluc3RhbmNlID0gSVBDQ19DMTsKKyAgaWYgKENoYW5uZWxEaXIgPT0gSVBDQ19DSEFOTkVMX0RJUl9UWCkKKyAgeworICAgIC8qIFVubWFzayBpbnRlcnJ1cHQgKi8KKyAgICBjdXJyZW50SW5zdGFuY2UtPk1SICY9IH4oSVBDQ19NUl9DSDFGTV9Nc2sgPDwgKENoYW5uZWxJbmRleCAmIENIQU5ORUxfSU5ERVhfTXNrKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVW5tYXNrIGludGVycnVwdCAqLworICAgIGN1cnJlbnRJbnN0YW5jZS0+TVIgJj0gfihJUENDX01SX0NIMU9NX01zayA8PCAoQ2hhbm5lbEluZGV4ICYgQ0hBTk5FTF9JTkRFWF9Nc2spKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVzZXQgYWxsIGNhbGxiYWNrcyBvZiB0aGUgaGFuZGxlIHRvIE5VTEwuCisgICogQHBhcmFtICBoaXBjYyBJUENDIGhhbmRsZQorICAqLwordm9pZCBJUENDX1NldERlZmF1bHRDYWxsYmFja3MoSVBDQ19IYW5kbGVUeXBlRGVmICpoaXBjYykKK3sKKyAgdWludDMyX3QgaTsKKyAgLyogU2V0IGFsbCBjYWxsYmFja3MgdG8gZGVmYXVsdCAqLworICBmb3IgKGkgPSAwOyBpIDwgSVBDQ19DSEFOTkVMX05VTUJFUjsgaSsrKQorICB7CisgICAgaGlwY2MtPkNoYW5uZWxDYWxsYmFja1J4W2ldID0gSEFMX0lQQ0NfUnhDYWxsYmFjazsKKyAgICBoaXBjYy0+Q2hhbm5lbENhbGxiYWNrVHhbaV0gPSBIQUxfSVBDQ19UeENhbGxiYWNrOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZXNldCBJUENDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb25jZXJuZWQgaW5zdGFuY2UuCisgICogQHBhcmFtICBJbnN0YW5jZSBwb2ludGVyIHRvIHJlZ2lzdGVyCisgICovCit2b2lkIElQQ0NfUmVzZXRfUmVnaXN0ZXIoSVBDQ19Db21tb25UeXBlRGVmICpJbnN0YW5jZSkKK3sKKyAgLyogRGlzYWJsZSBSWCBhbmQgVFggaW50ZXJydXB0cyAqLworICBJbnN0YW5jZS0+Q1IgID0gMHgwMDAwMDAwMFU7CisKKyAgLyogTWFzayBSWCBhbmQgVFggaW50ZXJydXB0cyAqLworICBJbnN0YW5jZS0+TVIgID0gKElQQ0NfQUxMX1RYX0JVRiB8IElQQ0NfQUxMX1JYX0JVRik7CisKKyAgLyogQ2xlYXIgUlggc3RhdHVzICovCisgIEluc3RhbmNlLT5TQ1IgPSBJUENDX0FMTF9SWF9CVUY7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfSVBDQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfaXJkYS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfaXJkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTMzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9pcmRhLmMKQEAgLTAsMCArMSwyODU3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9pcmRhLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIElSREEgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgSXJEQSAoSW5mcmFyZWQgRGF0YSBBc3NvY2lhdGlvbikgUGVyaXBoZXJhbAorICAqICAgICAgICAgIChJUkRBKQorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhlIElSREEgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgKCMpIERlY2xhcmUgYSBJUkRBX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIElSREFfSGFuZGxlVHlwZURlZiBoaXJkYSkuCisgICAgKCMpIEluaXRpYWxpemUgdGhlIElSREEgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9JUkRBX01zcEluaXQoKSBBUEkKKyAgICAgICAgaW4gc2V0dGluZyB0aGUgYXNzb2NpYXRlZCBVU0FSVCBvciBVQVJUIGluIElSREEgbW9kZToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeC9VQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVVNBUlR4L1VBUlR4IHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0FSVHgvVUFSVHggR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgVVNBUlR4L1VBUlR4IHBpbnMgKFRYIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLCBSWCBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gSW5wdXQpLgorICAgICAgICAoKyspIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9JUkRBX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICBhbmQgSEFMX0lSREFfUmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVHgvVUFSVHggaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUeC9VQVJUeCBJUlEgaGFuZGxlLgorICAgICAgICAgICAgKCsrKykgVGhlIHNwZWNpZmljIElSREEgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgICAgICAgICAgICAgX19IQUxfSVJEQV9FTkFCTEVfSVQoKSBhbmQgX19IQUxfSVJEQV9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzLgorCisgICAgICAgICgrKykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfSVJEQV9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgIGFuZCBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBJUkRBIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgKCMpIFByb2dyYW0gdGhlIEJhdWQgUmF0ZSwgV29yZCBMZW5ndGggYW5kIFBhcml0eSBhbmQgTW9kZShSZWNlaXZlci9UcmFuc21pdHRlciksCisgICAgICAgIHRoZSBub3JtYWwgb3IgbG93IHBvd2VyIG1vZGUgYW5kIHRoZSBjbG9jayBwcmVzY2FsZXIgaW4gdGhlIGhpcmRhIGhhbmRsZSBJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJbml0aWFsaXplIHRoZSBJUkRBIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfSVJEQV9Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoaXMgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfSVJEQV9Nc3BJbml0KCkgQVBJLgorCisgICAgICAgICAtQEAtIFRoZSBzcGVjaWZpYyBJUkRBIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQgYW5kIEVycm9yIEludGVycnVwdHMpIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zCisgICAgICAgICAgICAgX19IQUxfSVJEQV9FTkFCTEVfSVQoKSBhbmQgX19IQUxfSVJEQV9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzLgorCisgICAgKCMpIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisKKyAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdCgpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlKCkKKworICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0lSREFfVHJhbnNtaXRfSVQoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSVJEQV9UcmFuc21pdF9ETUEoKQorICAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gaGFsZiBvZiB0cmFuc2ZlciBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBoYWxmIG9mIHRyYW5zZmVyIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogSVJEQSBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSVJEQSBIQUwgZHJpdmVyLgorCisgICAgICAgKCspIF9fSEFMX0lSREFfRU5BQkxFOiBFbmFibGUgdGhlIElSREEgcGVyaXBoZXJhbAorICAgICAgICgrKSBfX0hBTF9JUkRBX0RJU0FCTEU6IERpc2FibGUgdGhlIElSREEgcGVyaXBoZXJhbAorICAgICAgICgrKSBfX0hBTF9JUkRBX0dFVF9GTEFHIDogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgZmxhZyBpcyBzZXQgb3Igbm90CisgICAgICAgKCspIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyA6IENsZWFyIHRoZSBzcGVjaWZpZWQgSVJEQSBwZW5kaW5nIGZsYWcKKyAgICAgICAoKykgX19IQUxfSVJEQV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX0lSREFfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0CisgICAgICAgKCspIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRTogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBJUkRBIGludGVycnVwdCBpcyBlbmFibGVkCisKKyAgICAgWy4uXQorICAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBJUkRBIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgICAgIyMjIyMgQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICMjIyMjCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKworICAgIFsuLl0KKyAgICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFR4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgIDogUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA6IEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IElSREEgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IElSREEgTXNwRGVJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9JUkRBX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4KKyAgICBAcmVmIEhBTF9JUkRBX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogVHggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgOiBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgICAgIDogUnggQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICA6IEFib3J0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIDogQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgOiBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogSVJEQSBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogSVJEQSBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX0lSREFfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfSVJEQV9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfSVJEQV9UeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9JUkRBX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9JUkRBX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfSVJEQV9Jbml0KCkgYW5kIEByZWYgSEFMX0lSREFfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX0lSREFfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgIGluIEhBTF9JUkRBX1NUQVRFX1JFQURZIG9yIEhBTF9JUkRBX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0lSREFfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9JUkRBX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBIElSREEKKyAgKiBAYnJpZWYgSEFMIElSREEgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfSVJEQV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgSVJEQV9Qcml2YXRlX0NvbnN0YW50cyBJUkRBIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVJEQV9URUFDS19SRUFDS19USU1FT1VUICAgICAgICAgICAgMTAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVJEQSBUWCBvciBSWCBlbmFibGUgYWNrbm93bGVkZ2UgdGltZS1vdXQgdmFsdWUgICovCisKKyNkZWZpbmUgSVJEQV9DUjFfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBJUkRBX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUlOICAgIDB4MTBVICAgICAgICAvKiE8IFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworI2RlZmluZSBVU0FSVF9CUlJfTUFYICAgIDB4MDAwMEZGRkZVICAvKiE8IFVTQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElSREFfUHJpdmF0ZV9NYWNyb3MgSVJEQSBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKiogQGJyaWVmICBCUlIgZGl2aXNpb24gb3BlcmF0aW9uIHRvIHNldCBCUlIgcmVnaXN0ZXIgaW4gMTYtYml0IG92ZXJzYW1wbGluZyBtb2RlLgorICAqIEBwYXJhbSAgX19QQ0xLX18gSVJEQSBjbG9jayBzb3VyY2UuCisgICogQHBhcmFtICBfX0JBVURfXyBCYXVkIHJhdGUgc2V0IGJ5IHRoZSB1c2VyLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBJUkRBIGNsb2NrIHByZXNjYWxlciB2YWx1ZS4KKyAgKiBAcmV0dmFsIERpdmlzaW9uIHJlc3VsdAorICAqLworI2RlZmluZSBJUkRBX0RJVl9TQU1QTElORzE2KF9fUENMS19fLCBfX0JBVURfXywgX19QUkVTQ0FMRVJfXykgICgoKChfX1BDTEtfXykvSVJEQVByZXNjVGFibGVbKF9fUFJFU0NBTEVSX18pXSkgKyAoKF9fQkFVRF9fKS8yVSkpIC8gKF9fQkFVRF9fKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIElSREFfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIElSREFfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9TZXRDb25maWcoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9DaGVja0lkbGVTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFR4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0VuZFJ4VHJhbnNmZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKK3N0YXRpYyB2b2lkIElSREFfRW5kVHJhbnNtaXRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CitzdGF0aWMgdm9pZCBJUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfRnVuY3Rpb25zIElSREEgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGluIGFzeW5jaHJvbm91cyBJUkRBIG1vZGUuCisgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAoKyspIFdvcmQgTGVuZ3RoCisgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgaW4gdGhlIGRhdGEgcmVnaXN0ZXIgaXMgdHJhbnNtaXR0ZWQgYnV0IGlzIGNoYW5nZWQgYnkgdGhlIHBhcml0eSBiaXQuCisgICAgICAoKyspIFBvd2VyIG1vZGUKKyAgICAgICgrKykgUHJlc2NhbGVyIHNldHRpbmcKKyAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKworICBbLi5dCisgIFRoZSBIQUxfSVJEQV9Jbml0KCkgQVBJIGZvbGxvd3MgdGhlIFVTQVJUIGFzeW5jaHJvbm91cyBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMKKyAgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzIGFyZSBhdmFpbGFibGUgaW4gcmVmZXJlbmNlIG1hbnVhbCkuCisKK0BlbmR2ZXJiYXRpbQorCisgIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbGVuZ3RoIGRlZmluZWQgYnkgdGhlIE0xIGFuZCBNMCBiaXRzICg3LWJpdCwKKyAgOC1iaXQgb3IgOS1iaXQpLCB0aGUgcG9zc2libGUgSVJEQSBmcmFtZSBmb3JtYXRzIGFyZSBsaXN0ZWQgaW4gdGhlCisgIGZvbGxvd2luZyB0YWJsZS4KKworICAgIFRhYmxlIDEuIElSREEgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgSVJEQSBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBJUkRBX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9Jbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIENoZWNrIHRoZSBJUkRBIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoaXJkYSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVC9VQVJUIGFzc29jaWF0ZWQgdG8gdGhlIElSREEgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0lOU1RBTkNFKGhpcmRhLT5JbnN0YW5jZSkpOworCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhpcmRhLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgSVJEQV9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGhpcmRhKTsKKworICAgIGlmIChoaXJkYS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX0lSREFfTXNwSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgLyogU2V0IHRoZSBJUkRBIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoSVJEQV9TZXRDb25maWcoaGlyZGEpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBJUkRBIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiwgU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOworCisgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBJUkRBIG1vZGUgKi8KKyAgaGlyZGEtPkluc3RhbmNlLT5DUjMgfD0gVVNBUlRfQ1IzX0lSRU47CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRU5BQkxFKGhpcmRhKTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKElSREFfQ2hlY2tJZGxlU3RhdGUoaGlyZGEpKTsKK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RlSW5pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBDaGVjayB0aGUgSVJEQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGlyZGEgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgVVNBUlQvVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9JTlNUQU5DRShoaXJkYS0+SW5zdGFuY2UpKTsKKworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworI2lmIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQorICBpZiAoaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfSVJEQV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIEhBTF9JUkRBX01zcERlSW5pdChoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0lSREFfRElTQUJMRShoaXJkYSk7CisKKyAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgIGhpcmRhLT5nU3RhdGUgICAgPSBIQUxfSVJEQV9TVEFURV9SRVNFVDsKKyAgaGlyZGEtPlJ4U3RhdGUgICA9IEhBTF9JUkRBX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgVW5sb2NrICovCisgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIElSREEgTVNQLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX01zcEluaXQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX0lSREFfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgSVJEQSBNU1AuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfTXNwRGVJbml0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9JUkRBX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBJUkRBIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSVJEQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBJUkRBIGNhbGxiYWNrCisgICogICAgICAgICBJUkRBIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGlyZGEgaXJkYSBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCBUeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfSVJEQV9BQk9SVF9SRUNFSVZFX0NPTVBMRVRFX0NCX0lEIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfVW5SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoSEFMX0lSREFfU1RBVEVfUkVBRFkgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5UeENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfRVJST1JfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayA9IEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfSVJEQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9JUkRBX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhpcmRhLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9JUkRBX01zcERlSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX0lSREFfU1RBVEVfUkVTRVQgPT0gaGlyZGEtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9JUkRBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoaXJkYS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0lSREFfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGlyZGEtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0lSREFfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBJUkRBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBJUkRBIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBJUkRBIGRhdGEgdHJhbnNmZXJzLgorCisgIFsuLl0KKyAgICBJckRBIGlzIGEgaGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiBwcm90b2NvbC4gSWYgdGhlIFRyYW5zbWl0dGVyIGlzIGJ1c3ksIGFueSBkYXRhCisgICAgb24gdGhlIElyREEgcmVjZWl2ZSBsaW5lIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgSXJEQSBkZWNvZGVyIGFuZCBpZiB0aGUgUmVjZWl2ZXIKKyAgICBpcyBidXN5LCBkYXRhIG9uIHRoZSBUWCBmcm9tIHRoZSBVU0FSVCB0byBJckRBIHdpbGwgbm90IGJlIGVuY29kZWQgYnkgSXJEQS4KKyAgICBXaGlsZSByZWNlaXZpbmcgZGF0YSwgdHJhbnNtaXNzaW9uIHNob3VsZCBiZSBhdm9pZGVkIGFzIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkCisgICAgY291bGQgYmUgY29ycnVwdGVkLgorCisgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogdGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiB0aGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgIG9yIERNQSwgdGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgIGRlZGljYXRlZCBJUkRBIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrcworICAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIFRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgIFRoZSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQmxvY2tpbmcgbW9kZSBBUElzIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXQoKQorICAgICAgICAoKyspIEhBTF9JUkRBX1JlY2VpdmUoKQorCisgICAgKCMpIE5vbiBCbG9ja2luZyBtb2RlIEFQSXMgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfSVJRSGFuZGxlcigpCisKKyAgICAoIykgTm9uIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggRE1BIGFyZSA6CisgICAgICAgICgrKykgSEFMX0lSREFfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SZWNlaXZlX0RNQSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BUGF1c2UoKQorICAgICAgICAoKyspIEhBTF9JUkRBX0RNQVJlc3VtZSgpCisgICAgICAgICgrKykgSEFMX0lSREFfRE1BU3RvcCgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb24gQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9UeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9JUkRBX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gSVJEQSBzaWRlLgorICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnBkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwZGF0YTE2Yml0czsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBoaXJkYS0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwRGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcERhdGE7IC8qIERlcm9nYXRpb24gUi4xMS4zICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIHdoaWxlIChoaXJkYS0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBoaXJkYS0+VHhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgSVJEQV9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBoaXJkYS0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnBkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpcmRhLT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwZGF0YThiaXRzICYgMHhGRlUpOworICAgICAgICBwZGF0YThiaXRzKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgSVJEQV9GTEFHX1RDLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHBhcmFtIFRpbWVvdXQgU3BlY2lmeSB0aW1lb3V0IHZhbHVlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnBkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwZGF0YTE2Yml0czsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGlyZGEpOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaGlyZGEtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiB0aGUgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIKKyAgICAgICBvZiB0aGUgVUFSVCBhc3NvY2lhdGVkIHRvIHRoZSBJUkRBICovCisgICAgSVJEQV9NQVNLX0NPTVBVVEFUSU9OKGhpcmRhKTsKKyAgICB1aE1hc2sgPSBoaXJkYS0+TWFzazsKKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwUnhEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChoaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgJiYgKGhpcmRhLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSkKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwRGF0YTsgLyogRGVyb2dhdGlvbiBSLjExLjMgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gcERhdGE7CisgICAgICBwZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2hlY2sgZGF0YSByZW1haW5pbmcgdG8gYmUgcmVjZWl2ZWQgKi8KKyAgICB3aGlsZSAoaGlyZGEtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaGlyZGEtPlJ4WGZlckNvdW50LS07CisKKyAgICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIElSREFfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwZGF0YThiaXRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgICpwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaGlyZGEtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICBwZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcGRhdGE4Yml0cyA9ICh1aW50OF90KShoaXJkYS0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KXVoTWFzayk7CisgICAgICAgIHBkYXRhOGJpdHMrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5wVHhCdWZmUHRyID0gcERhdGE7CisgICAgaGlyZGEtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWNlaXZlX0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaGlyZGEtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiB0aGUgbWFzayB0byBhcHBseSB0byB0aGUgUkRSIHJlZ2lzdGVyCisgICAgICAgb2YgdGhlIFVBUlQgYXNzb2NpYXRlZCB0byB0aGUgSVJEQSAqLworICAgIElSREFfTUFTS19DT01QVVRBVElPTihoaXJkYSk7CisKKyAgICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBQYXJpdHkgRXJyb3IgYW5kIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIElSREEgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoaXJkYSk7CisKKyAgICBoaXJkYS0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhpcmRhLT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBTZXQgdGhlIElSREEgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IElSREFfRE1BVHJhbnNtaXRDcGx0OworCisgICAgLyogU2V0IHRoZSBJUkRBIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gSVJEQV9ETUFFcnJvcjsKKworICAgIC8qIFNldCB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGlyZGEtPmhkbWF0eCwgKHVpbnQzMl90KWhpcmRhLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhpcmRhLT5JbnN0YW5jZS0+VERSLCBTaXplKSA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX1RDRik7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoaXJkYSk7CisKKyAgICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byByZWFkeSAqLworICAgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBJUkRBIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfRE1BKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICAgIGhpcmRhLT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaGlyZGEtPlJ4WGZlclNpemUgPSBTaXplOworCisgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX05PTkU7CisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYOworCisgICAgLyogU2V0IHRoZSBJUkRBIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBJUkRBX0RNQVJlY2VpdmVDcGx0OworCisgICAgLyogU2V0IHRoZSBJUkRBIERNQSBoYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBJUkRBX0RNQVJlY2VpdmVIYWxmQ3BsdDsKKworICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgaGlyZGEtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBJUkRBX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGlyZGEtPmhkbWFyeCwgKHVpbnQzMl90KSZoaXJkYS0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWhpcmRhLT5wUnhCdWZmUHRyLCBTaXplKSA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhpcmRhKTsKKworICAgICAgLyogUmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byByZWFkeSAqLworICAgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKworLyoqCisgICogQGJyaWVmIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFQYXVzZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgICAgfQorICB9CisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgICAgfQorICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0RNQVJlc3VtZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhpcmRhKTsKKworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogQ2xlYXIgdGhlIE92ZXJydW4gZmxhZyBiZWZvcmUgcmVzdW1pbmcgdGhlIFJ4IHRyYW5zZmVyKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX09SRUZMQUcoaGlyZGEpOworCisgICAgLyogUmVlbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9ETUFTdG9wKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgSVJEQSBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKCkgLyBIQUxfSVJEQV9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrIC8gSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrOgorICAgICBpbmRlZWQsIHdoZW4gSEFMX0RNQV9BYm9ydCgpIEFQSSBpcyBjYWxsZWQsIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgb3IgSGFsZiBUcmFuc2ZlciBjb21wbGV0ZQorICAgICBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YKKyAgICAgdGhlIHN0cmVhbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAqLworCisgIC8qIFN0b3AgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+Z1N0YXRlID09IEhBTF9JUkRBX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgSVJEQV9FbmRUeFRyYW5zZmVyKGhpcmRhKTsKKyAgICB9CisgIH0KKworICAvKiBTdG9wIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgIHsKKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCAqLworICAgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaGlyZGEtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBJUkRBX0VuZFJ4VHJhbnNmZXIoaGlyZGEpOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0IChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgYW5kIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRUcmFuc21pdChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhpcmRhLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaGlyZGEtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ29kZSA9IEhBTF9JUkRBX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5nU3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhpcmRhLT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBSeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX0lSREFfQ0xFQVJfRkxBRyhoaXJkYSwgSVJEQV9DTEVBUl9PUkVGIHwgSVJEQV9DTEVBUl9ORUYgfCBJUkRBX0NMRUFSX1BFRiB8IElSREFfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHggYW5kIFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgYWJvcnRjcGx0ID0gMVU7CisKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gSVJEQSBIYW5kbGUsIERNQSBBYm9ydCBjb21wbGV0ZSBjYWxsYmFja3Mgc2hvdWxkIGJlIGluaXRpYWxpc2VkCisgICAgIGJlZm9yZSBhbnkgY2FsbCB0byBETUEgQWJvcnQgZnVuY3Rpb25zICovCisgIC8qIERNQSBUeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IElSREFfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGlyZGEtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorICAvKiBETUEgUnggSGFuZGxlIGlzIHZhbGlkICovCisgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVQVJUIGxldmVsICovCisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJUkRBIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJUkRBIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgYW5kIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPmdTdGF0ZSAgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaGlyZGEtPkFib3J0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIElSREEgSW50ZXJydXB0cyAoVHgpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSVJEQSBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgSVJEQSBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gSVJEQV9ETUFUeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhpcmRhLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhpcmRhLT5oZG1hdHgpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIFJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaGlyZGEtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBSZWNlaXZlIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVQVJUIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgSVJEQSBJbnRlcnJ1cHRzIChSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIElSREEgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIElSREEgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoaXJkYS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBJUkRBIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IElSREFfRE1BUnhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaXJkYS0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgICAvKiBSZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgICAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoaXJkYS0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGhpcmRhLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSBJUkRBIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSBoaXJkYSAgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9JUkRBX0lSUUhhbmRsZXIoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgaXNyZmxhZ3MgICA9IFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IxKTsKKyAgdWludDMyX3QgY3IzaXRzOworICB1aW50MzJfdCBlcnJvcmZsYWdzOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogSVJEQSBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkpCisgICAgeworICAgICAgSVJEQV9SZWNlaXZlX0lUKGhpcmRhKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBJZiBzb21lIGVycm9ycyBvY2N1ciAqLworICBjcjNpdHMgPSBSRUFEX1JFRyhoaXJkYS0+SW5zdGFuY2UtPkNSMyk7CisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSkgIT0gMFUpKSkKKyAgeworICAgIC8qIElSREEgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9JUkRBX0NMRUFSX0lUKGhpcmRhLCBJUkRBX0NMRUFSX1BFRik7CisKKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfUEU7CisgICAgfQorCisgICAgLyogSVJEQSBmcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX0ZFKSAhPSAwVSkgJiYgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfSVJEQV9DTEVBUl9JVChoaXJkYSwgSVJEQV9DTEVBUl9GRUYpOworCisgICAgICBoaXJkYS0+RXJyb3JDb2RlIHw9IEhBTF9JUkRBX0VSUk9SX0ZFOworICAgIH0KKworICAgIC8qIElSREEgbm9pc2UgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9ORSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfTkVGKTsKKworICAgICAgaGlyZGEtPkVycm9yQ29kZSB8PSBIQUxfSVJEQV9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBJUkRBIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkgJiYKKyAgICAgICAgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIF9fSEFMX0lSREFfQ0xFQVJfSVQoaGlyZGEsIElSREFfQ0xFQVJfT1JFRik7CisKKyAgICAgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIENhbGwgSVJEQSBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGhpcmRhLT5FcnJvckNvZGUgIT0gSEFMX0lSREFfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBJUkRBIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICBJUkRBX1JlY2VpdmVfSVQoaGlyZGEpOworICAgICAgfQorCisgICAgICAvKiBJZiBPdmVycnVuIGVycm9yIG9jY3Vycywgb3IgaWYgYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24sCisgICAgICAgICBjb25zaWRlciBlcnJvciBhcyBibG9ja2luZyAqLworICAgICAgaWYgKChIQUxfSVNfQklUX1NFVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB8fAorICAgICAgICAgICgoaGlyZGEtPkVycm9yQ29kZSAmIEhBTF9JUkRBX0VSUk9SX09SRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBJUkRBIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgSVJEQV9FbmRSeFRyYW5zZmVyKGhpcmRhKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBJUkRBIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBJUkRBIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIElSREEgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBJUkRBX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoaXJkYS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaGlyZGEtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgICBoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoaXJkYS0+aGRtYXJ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGhpcmRhLT5FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgaGlyZGEtPkVycm9yQ2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4KKyAgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBoaXJkYS0+RXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisKKyAgfSAvKiBFbmQgaWYgc29tZSBlcnJvciBvY2N1cnMgKi8KKworICAvKiBJUkRBIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFX1RYRk5GKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpKQorICB7CisgICAgSVJEQV9UcmFuc21pdF9JVChoaXJkYSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogSVJEQSBpbiBtb2RlIFRyYW5zbWl0dGVyICh0cmFuc21pc3Npb24gZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RDKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVENJRSkgIT0gMFUpKQorICB7CisgICAgSVJEQV9FbmRUcmFuc21pdF9JVChoaXJkYSk7CisgICAgcmV0dXJuOworICB9CisKK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX1R4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSVJEQSBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0lSREFfRXJyb3JDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIElSREEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhpcmRhKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIElSREEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGlyZGEpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJUkRBIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoaXJkYSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBJUkRBIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gcmV0dXJuIHRoZSBTdGF0ZSBvZiBJckRBCisgICAgY29tbXVuaWNhdGlvbiBwcm9jZXNzIGFuZCBhbHNvIHJldHVybiBQZXJpcGhlcmFsIEVycm9ycyBvY2N1cnJlZCBkdXJpbmcgY29tbXVuaWNhdGlvbiBwcm9jZXNzCisgICAgICgrKSBIQUxfSVJEQV9HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUKKyAgICAgICAgIG9mIHRoZSBJUkRBIHBlcmlwaGVyYWwgaGFuZGxlLgorICAgICAoKykgSEFMX0lSREFfR2V0RXJyb3IoKSBjaGVja3MgaW4gcnVuLXRpbWUgZXJyb3JzIHRoYXQgY291bGQgb2NjdXIgZHVyaW5nCisgICAgICAgICBjb21tdW5pY2F0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBJUkRBIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfSVJEQV9TdGF0ZVR5cGVEZWYgSEFMX0lSREFfR2V0U3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogUmV0dXJuIElSREEgaGFuZGxlIHN0YXRlICovCisgIHVpbnQzMl90IHRlbXAxLCB0ZW1wMjsKKyAgdGVtcDEgPSAodWludDMyX3QpaGlyZGEtPmdTdGF0ZTsKKyAgdGVtcDIgPSAodWludDMyX3QpaGlyZGEtPlJ4U3RhdGU7CisKKyAgcmV0dXJuIChIQUxfSVJEQV9TdGF0ZVR5cGVEZWYpKHRlbXAxIHwgdGVtcDIpOworfQorCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBJUkRBIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIElSREEgRXJyb3IgQ29kZQorICAqLwordWludDMyX3QgSEFMX0lSREFfR2V0RXJyb3IoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgcmV0dXJuIGhpcmRhLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSVJEQV9Qcml2YXRlX0Z1bmN0aW9ucyBJUkRBIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGhpcmRhIElSREEgaGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLwordm9pZCBJUkRBX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgLyogSW5pdCB0aGUgSVJEQSBDYWxsYmFjayBzZXR0aW5ncyAqLworICBoaXJkYS0+VHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9JUkRBX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgaGlyZGEtPlR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfSVJEQV9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGhpcmRhLT5SeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX0lSREFfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaGlyZGEtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfSVJEQV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgIGhpcmRhLT5BYm9ydENwbHRDYWxsYmFjayAgICAgICAgID0gSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgaGlyZGEtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgPSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgICovCisKK30KKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIElSREEgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9TZXRDb25maWcoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICBJUkRBX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ICAgICAgICAgICAgICAgPSBIQUxfT0s7CisgIGNvbnN0IHVpbnQxNl90IElSREFQcmVzY1RhYmxlWzEyXSA9IHsxVSwgMlUsIDRVLCA2VSwgOFUsIDEwVSwgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsKKworICAvKiBDaGVjayB0aGUgY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19JUkRBX0JBVURSQVRFKGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX1dPUkRfTEVOR1RIKGhpcmRhLT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfUEFSSVRZKGhpcmRhLT5Jbml0LlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9UWF9SWF9NT0RFKGhpcmRhLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lSREFfUFJFU0NBTEVSKGhpcmRhLT5Jbml0LlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9QT1dFUk1PREUoaGlyZGEtPkluaXQuUG93ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19JUkRBX0NMT0NLUFJFU0NBTEVSKGhpcmRhLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSB0aGUgSVJEQSBXb3JkIExlbmd0aCwgUGFyaXR5IGFuZCB0cmFuc2ZlciBNb2RlOgorICAgICBTZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaGlyZGEtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAgICBTZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgICAgU2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5Nb2RlIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCloaXJkYS0+SW5pdC5Xb3JkTGVuZ3RoIHwgaGlyZGEtPkluaXQuUGFyaXR5IHwgaGlyZGEtPkluaXQuTW9kZSA7CisKKyAgTU9ESUZZX1JFRyhoaXJkYS0+SW5zdGFuY2UtPkNSMSwgSVJEQV9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSVJMUCwgaGlyZGEtPkluaXQuUG93ZXJNb2RlKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBjbG9jayBQUkVTQyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUKKyAgKiAtIElSREEgQ2xvY2sgUHJlc2NhbGVyOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBoaXJkYS0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwgaGlyZGEtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+R1RQUiwgVVNBUlRfR1RQUl9QU0MsIGhpcmRhLT5Jbml0LlByZXNjYWxlcik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIElSREFfR0VUQ0xPQ0tTT1VSQ0UoaGlyZGEsIGNsb2Nrc291cmNlKTsKKyAgdG1wcmVnID0gICAwVTsKKyAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgeworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMjoKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihIQUxfUkNDX0dldFBDTEsyRnJlcSgpLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSwgaGlyZGEtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9IU0k6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKElSREFfRElWX1NBTVBMSU5HMTYoSFNJX1ZBTFVFLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSwgaGlyZGEtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJEQV9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKElSREFfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaGlyZGEtPkluaXQuQmF1ZFJhdGUsIGhpcmRhLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KCh1aW50MzJfdClMU0VfVkFMVUUsIGhpcmRhLT5Jbml0LkJhdWRSYXRlLCBoaXJkYS0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogVVNBUlRESVYgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMGQxNiAqLworICBpZiAoKHRtcHJlZyA+PSBVU0FSVF9CUlJfTUlOKSAmJiAodG1wcmVnIDw9IFVTQVJUX0JSUl9NQVgpKQorICB7CisgICAgaGlyZGEtPkluc3RhbmNlLT5CUlIgPSB0bXByZWc7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0ID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBJUkRBIElkbGUgU3RhdGUuCisgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfQ2hlY2tJZGxlU3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIElSREEgRXJyb3JDb2RlICovCisgIGhpcmRhLT5FcnJvckNvZGUgPSBIQUxfSVJEQV9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChoaXJkYS0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChJUkRBX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGlyZGEsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSVJEQV9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGhpcmRhLT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1JFKSA9PSBVU0FSVF9DUjFfUkUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaXJkYSwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBJUkRBX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgSVJEQSBzdGF0ZSovCisgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGlyZGEpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIElSREEgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgSVJEQSBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChfX0hBTF9JUkRBX0dFVF9GTEFHKGhpcmRhLCBGbGFnKSA/IFNFVCA6IFJFU0VUKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICAgICAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAgIGhpcmRhLT5nU3RhdGUgID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisgICAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGlyZGEpOworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBUeCB0cmFuc2ZlciBvbiBJUkRBIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgVHJhbnNtaXQgY29tcGxldGlvbikuCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRW5kVHhUcmFuc2ZlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworCisgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgUnggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9FbmRSeFRyYW5zZmVyKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogRE1BIE5vcm1hbCBtb2RlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKQorICB7CisgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgIGluIHRoZSBJUkRBIENSMyByZWdpc3RlciAqLworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogRW5hYmxlIHRoZSBJUkRBIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgfQorICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLworICBlbHNlCisgIHsKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhpcmRhLT5UeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfSVJEQV9UeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVRyYW5zbWl0SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaXJkYS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfVHhIYWxmQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogRE1BIE5vcm1hbCBtb2RlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKQorICB7CisgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiB0aGUgSVJEQSBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGhpcmRhLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKyAgfQorCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhpcmRhLT5SeENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgSVJEQSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BUmVjZWl2ZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIGhpcmRhLT5SeEhhbGZDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9JUkRBX1J4SGFsZkNwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgSVJEQSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIFBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBTdG9wIElSREEgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoaGlyZGEtPmdTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgICAgeworICAgICAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgICAgICBJUkRBX0VuZFR4VHJhbnNmZXIoaGlyZGEpOworICAgIH0KKyAgfQorCisgIC8qIFN0b3AgSVJEQSBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmIChoaXJkYS0+UnhTdGF0ZSA9PSBIQUxfSVJEQV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgICBJUkRBX0VuZFJ4VHJhbnNmZXIoaGlyZGEpOworICAgIH0KKyAgfQorCisgIGhpcmRhLT5FcnJvckNvZGUgfD0gSEFMX0lSREFfRVJST1JfRE1BOworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIGhpcmRhLT5FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIGhpcmRhLT5FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBIQUxfSVJEQV9FcnJvckNhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhpcmRhLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChoaXJkYS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhID0gKElSREFfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhpcmRhLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChoaXJkYS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPlR4WGZlckNvdW50ID0gMFU7CisgIGhpcmRhLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBoaXJkYS0+RXJyb3JDb2RlID0gSEFMX0lSREFfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9JUkRBX0NMRUFSX0ZMQUcoaGlyZGEsIElSREFfQ0xFQVJfT1JFRiB8IElSREFfQ0xFQVJfTkVGIHwgSVJEQV9DTEVBUl9QRUYgfCBJUkRBX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoaXJkYS0+Z1N0YXRlIGFuZCBoaXJkYS0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlICA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworICBoaXJkYS0+UnhTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjayhoaXJkYSk7CisjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgSVJEQSBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVCBBUEkgKEFib3J0IG9ubHkgVHggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFR4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgVHggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSA9IChJUkRBX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoaXJkYS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXN0b3JlIGhpcmRhLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPmdTdGF0ZSA9IEhBTF9JUkRBX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhoaXJkYSk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBJUkRBIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfSVJEQV9BYm9ydFJlY2VpdmVfSVQgQVBJIChBYm9ydCBvbmx5IFJ4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFJ4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0RNQVJ4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEgPSAoSVJEQV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaGlyZGEtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfSVJEQV9DTEVBUl9GTEFHKGhpcmRhLCBJUkRBX0NMRUFSX09SRUYgfCBJUkRBX0NMRUFSX05FRiB8IElSREFfQ0xFQVJfUEVGIHwgSVJEQV9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaGlyZGEtPlJ4U3RhdGUgPSBIQUxfSVJEQV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBoaXJkYS0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX0lSREFfVHJhbnNtaXRfSVQoKS4KKyAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgSVJEQV9UcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MTZfdCAqdG1wOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGhpcmRhLT5nU3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChoaXJkYS0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgSVJEQSBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaGlyZGEtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBoaXJkYS0+cFR4QnVmZlB0cjsgLyogRGVyb2dhdGlvbiBSLjExLjMgKi8KKyAgICAgICAgaGlyZGEtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCp0bXAgJiAweDAxRkZVKTsKKyAgICAgICAgaGlyZGEtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhpcmRhLT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpoaXJkYS0+cFR4QnVmZlB0ciAmIDB4RkZVKTsKKyAgICAgICAgaGlyZGEtPnBUeEJ1ZmZQdHIrKzsKKyAgICAgIH0KKyAgICAgIGhpcmRhLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdyYXAgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBJUkRBX0VuZFRyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCit7CisgIC8qIERpc2FibGUgdGhlIElSREEgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaGlyZGEtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoaXJkYS0+Z1N0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaGlyZGEtPlR4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgSEFMX0lSREFfVHhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2VuZGlmIC8qIFVTRV9IQUxfSVJEQV9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX0lSREFfUmVjZWl2ZV9JVCgpCisgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIElSREFfUmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQoreworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCAgdWhNYXNrID0gaGlyZGEtPk1hc2s7CisgIHVpbnQxNl90ICB1aGRhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaGlyZGEtPlJ4U3RhdGUgPT0gSEFMX0lSREFfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIHVoZGF0YSA9ICh1aW50MTZfdCkgUkVBRF9SRUcoaGlyZGEtPkluc3RhbmNlLT5SRFIpOworICAgIGlmICgoaGlyZGEtPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOUIpICYmIChoaXJkYS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgdG1wID0gKHVpbnQxNl90ICopIGhpcmRhLT5wUnhCdWZmUHRyOyAvKiBEZXJvZ2F0aW9uIFIuMTEuMyAqLworICAgICAgKnRtcCA9ICh1aW50MTZfdCkodWhkYXRhICYgdWhNYXNrKTsKKyAgICAgIGhpcmRhLT5wUnhCdWZmUHRyICArPSAyVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICpoaXJkYS0+cFJ4QnVmZlB0ciA9ICh1aW50OF90KSh1aGRhdGEgJiAodWludDhfdCl1aE1hc2spOworICAgICAgaGlyZGEtPnBSeEJ1ZmZQdHIrKzsKKyAgICB9CisKKyAgICBoaXJkYS0+UnhYZmVyQ291bnQtLTsKKyAgICBpZiAoaGlyZGEtPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgUGFyaXR5IEVycm9yIEludGVycnVwdCBhbmQgUlhORSBpbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoaXJkYS0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIElSREEgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgQ0xFQVJfQklUKGhpcmRhLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaGlyZGEtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhpcmRhLT5SeFN0YXRlID0gSEFMX0lSREFfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBoaXJkYS0+UnhDcGx0Q2FsbGJhY2soaGlyZGEpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9JUkRBX1J4Q3BsdENhbGxiYWNrKGhpcmRhKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9JUkRBX1NFTkRfUkVRKGhpcmRhLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX0lSREFfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9pd2RnLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9pd2RnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzODYwMQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX2l3ZGcuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfaXdkZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBJV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIEluZGVwZW5kZW50IFdhdGNoZG9nIChJV0RHKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBJV0RHIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgVGhlIElXREcgY2FuIGJlIHN0YXJ0ZWQgYnkgZWl0aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlIChjb25maWd1cmFibGUKKyAgICAgICAgdGhyb3VnaCBvcHRpb24gYnl0ZSkuCisKKyAgICAoKykgVGhlIElXREcgaXMgY2xvY2tlZCBieSBMb3ctU3BlZWQgY2xvY2sgKExTSSkgYW5kIHRodXMgc3RheXMgYWN0aXZlIGV2ZW4KKyAgICAgICAgaWYgdGhlIG1haW4gY2xvY2sgZmFpbHMuCisKKyAgICAoKykgT25jZSB0aGUgSVdERyBpcyBzdGFydGVkLCB0aGUgTFNJIGlzIGZvcmNlZCBPTiBhbmQgYm90aCBjYW4gbm90IGJlCisgICAgICAgIGRpc2FibGVkLiBUaGUgY291bnRlciBzdGFydHMgY291bnRpbmcgZG93biBmcm9tIHRoZSByZXNldCB2YWx1ZSAoMHhGRkYpLgorICAgICAgICBXaGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiBjb3VudCB2YWx1ZSAoMHgwMDApIGEgcmVzZXQgc2lnbmFsIGlzCisgICAgICAgIGdlbmVyYXRlZCAoSVdERyByZXNldCkuCisKKyAgICAoKykgV2hlbmV2ZXIgdGhlIGtleSB2YWx1ZSAweDAwMDAgQUFBQSBpcyB3cml0dGVuIGluIHRoZSBJV0RHX0tSIHJlZ2lzdGVyLAorICAgICAgICB0aGUgSVdER19STFIgdmFsdWUgaXMgcmVsb2FkZWQgaW4gdGhlIGNvdW50ZXIgYW5kIHRoZSB3YXRjaGRvZyByZXNldCBpcworICAgICAgICBwcmV2ZW50ZWQuCisKKyAgICAoKykgVGhlIElXREcgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIFZERCB2b2x0YWdlIGRvbWFpbiB0aGF0IGlzIHN0aWxsIGZ1bmN0aW9uYWwKKyAgICAgICAgaW4gU1RPUCBhbmQgU1RBTkRCWSBtb2RlIChJV0RHIHJlc2V0IGNhbiB3YWtlLXVwIGZyb20gU1RBTkRCWSkuCisgICAgICAgIElXREdSU1QgZmxhZyBpbiBSQ0NfQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGFuIElXREcKKyAgICAgICAgcmVzZXQgb2NjdXJzLgorCisgICAgKCspIERlYnVnIG1vZGUgOiBXaGVuIHRoZSBtaWNyb2NvbnRyb2xsZXIgZW50ZXJzIGRlYnVnIG1vZGUgKGNvcmUgaGFsdGVkKSwKKyAgICAgICAgdGhlIElXREcgY291bnRlciBlaXRoZXIgY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkgb3Igc3RvcHMsIGRlcGVuZGluZworICAgICAgICBvbiBEQkdfSVdER19TVE9QIGNvbmZpZ3VyYXRpb24gYml0IGluIERCRyBtb2R1bGUsIGFjY2Vzc2libGUgdGhyb3VnaAorICAgICAgICBfX0hBTF9EQkdNQ1VfRlJFRVpFX0lXREcoKSBhbmQgX19IQUxfREJHTUNVX1VORlJFRVpFX0lXREcoKSBtYWNyb3MKKworICAgIFsuLl0gTWluLW1heCB0aW1lb3V0IHZhbHVlIEAzMktIeiAoTFNJKTogfjEyNXVzIC8gfjMyLjdzCisgICAgICAgICBUaGUgSVdERyB0aW1lb3V0IG1heSB2YXJ5IGR1ZSB0byBMU0kgZnJlcXVlbmN5IGRpc3BlcnNpb24uIFNUTTMyV0J4eAorICAgICAgICAgZGV2aWNlcyBwcm92aWRlIHRoZSBjYXBhYmlsaXR5IHRvIG1lYXN1cmUgdGhlIExTSSBmcmVxdWVuY3kgKExTSSBjbG9jaworICAgICAgICAgY29ubmVjdGVkIGludGVybmFsbHkgdG8gVElNMTYgQ0gxIGlucHV0IGNhcHR1cmUpLiBUaGUgbWVhc3VyZWQgdmFsdWUKKyAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGhhdmUgYW4gSVdERyB0aW1lb3V0IHdpdGggYW4gYWNjZXB0YWJsZSBhY2N1cmFjeS4KKworICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgjKSBVc2UgSVdERyB1c2luZyBIQUxfSVdER19Jbml0KCkgZnVuY3Rpb24gdG8gOgorICAgICAgKCsrKSBFbmFibGUgaW5zdGFuY2UgYnkgd3JpdGluZyBTdGFydCBrZXl3b3JkIGluIElXREdfS0VZIHJlZ2lzdGVyLiBMU0kKKyAgICAgICAgICAgY2xvY2sgaXMgZm9yY2VkIE9OIGFuZCBJV0RHIGNvdW50ZXIgc3RhcnRzIGRvd25jb3VudGluZy4KKyAgICAgICgrKykgRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOiBJV0RHX1BSLCBJV0RHX1JMUiAmCisgICAgICAgICAgIElXREdfV0lOUi4KKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBJV0RHIHByZXNjYWxlciBhbmQgY291bnRlciByZWxvYWQgdmFsdWUuIFRoaXMgcmVsb2FkCisgICAgICAgICAgIHZhbHVlIHdpbGwgYmUgbG9hZGVkIGluIHRoZSBJV0RHIGNvdW50ZXIgZWFjaCB0aW1lIHRoZSB3YXRjaGRvZyBpcworICAgICAgICAgICByZWxvYWRlZCwgdGhlbiB0aGUgSVdERyB3aWxsIHN0YXJ0IGNvdW50aW5nIGRvd24gZnJvbSB0aGlzIHZhbHVlLgorICAgICAgKCsrKSB3YWl0IGZvciBzdGF0dXMgZmxhZ3MgdG8gYmUgcmVzZXQKKyAgICAgICgrKykgRGVwZW5kaW5nIG9uIHdpbmRvdyBwYXJhbWV0ZXI6CisgICAgICAgICgrKyspIElmIFdpbmRvdyBJbml0IHBhcmFtZXRlciBpcyBzYW1lIGFzIFdpbmRvdyByZWdpc3RlciB2YWx1ZSwKKyAgICAgICAgICAgICBub3RoaW5nIG1vcmUgaXMgZG9uZSBidXQgcmVsb2FkIGNvdW50ZXIgdmFsdWUgaW4gb3JkZXIgdG8gZXhpdAorICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGh5IGV4YWN0IHRpbWUgYmFzZS4KKyAgICAgICAgKCsrKykgRWxzZSBtb2RpZnkgV2luZG93IHJlZ2lzdGVyLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSByZWxvYWQKKyAgICAgICAgICAgICB3YXRjaGRvZyBjb3VudGVyLgorCisgICAgKCMpIFRoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gbXVzdCByZWZyZXNoIHRoZSBJV0RHIGNvdW50ZXIgYXQgcmVndWxhcgorICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nCisgICAgICAgIEhBTF9JV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4KKworICAgICAqKiogSVdERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gSVdERyBIQUwgZHJpdmVyOgorICAgICAgKCspIF9fSEFMX0lXREdfU1RBUlQ6IEVuYWJsZSB0aGUgSVdERyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfSVdER19SRUxPQURfQ09VTlRFUjogUmVsb2FkcyBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluCisgICAgICAgICAgdGhlIHJlbG9hZCByZWdpc3RlcgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0lXREdfTU9EVUxFX0VOQUJMRUQKKy8qKiBAYWRkdG9ncm91cCBJV0RHCisgICogQGJyaWVmIElXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIElXREdfUHJpdmF0ZV9EZWZpbmVzIElXREcgUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKy8qIFN0YXR1cyByZWdpc3RlciBuZWVkIDUgUkMgTFNJIGRpdmlkZWQgYnkgcHJlc2NhbGVyIGNsb2NrIHRvIGJlIHVwZGF0ZWQuIFdpdGgKKyAgIGhpZ2hlciBwcmVzY2FsZXIgKDI1NiksIGFuZCBhY2NvcmRpbmcgdG8gTFNJIHZhcmlhdGlvbiwgd2UgbmVlZCB0byB3YWl0IGF0CisgICBsZWFzdCA2IGN5Y2xlcyBzbyA0OCBtcy4gKi8KKyNkZWZpbmUgSEFMX0lXREdfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAgNDh1CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBTdGFydCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICAgICAgSVdER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgICAgICgrKSBNYW5hZ2UgV2luZG93IG9wdGlvbi4KKyAgICAgICgrKSBPbmNlIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBpbiBIQUxfSVdER19Jbml0IGZ1bmN0aW9uLCBXYXRjaGRvZworICAgICAgICAgIGlzIHJlbG9hZGVkIGluIG9yZGVyIHRvIGV4aXQgZnVuY3Rpb24gd2l0aCBjb3JyZWN0IHRpbWUgYmFzZS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBJV0RHIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICogICAgICAgICBJV0RHX0luaXRUeXBlRGVmIGFuZCBzdGFydCB3YXRjaGRvZy4gQmVmb3JlIGV4aXRpbmcgZnVuY3Rpb24sCisgICogICAgICAgICB3YXRjaGRvZyBpcyByZWZyZXNoZWQgaW4gb3JkZXIgdG8gaGF2ZSBjb3JyZWN0IHRpbWUgYmFzZS4KKyAgKiBAcGFyYW0gIGhpd2RnICBwb2ludGVyIHRvIGEgSVdER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVdERyBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVdER19Jbml0KElXREdfSGFuZGxlVHlwZURlZiAqaGl3ZGcpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgSVdERyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGl3ZGcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfSVdER19BTExfSU5TVEFOQ0UoaGl3ZGctPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19JV0RHX1BSRVNDQUxFUihoaXdkZy0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0lXREdfUkVMT0FEKGhpd2RnLT5Jbml0LlJlbG9hZCkpOworICBhc3NlcnRfcGFyYW0oSVNfSVdER19XSU5ET1coaGl3ZGctPkluaXQuV2luZG93KSk7CisKKyAgLyogRW5hYmxlIElXREcuIExTSSBpcyB0dXJuZWQgb24gYXV0b21hdGljYWx5ICovCisgIF9fSEFMX0lXREdfU1RBUlQoaGl3ZGcpOworCisgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gSVdER19QUiwgSVdER19STFIgYW5kIElXREdfV0lOUiByZWdpc3RlcnMgYnkgd3JpdGluZworICAweDU1NTUgaW4gS1IgKi8KKyAgSVdER19FTkFCTEVfV1JJVEVfQUNDRVNTKGhpd2RnKTsKKworICAvKiBXcml0ZSB0byBJV0RHIHJlZ2lzdGVycyB0aGUgUHJlc2NhbGVyICYgUmVsb2FkIHZhbHVlcyB0byB3b3JrIHdpdGggKi8KKyAgaGl3ZGctPkluc3RhbmNlLT5QUiA9IGhpd2RnLT5Jbml0LlByZXNjYWxlcjsKKyAgaGl3ZGctPkluc3RhbmNlLT5STFIgPSBoaXdkZy0+SW5pdC5SZWxvYWQ7CisKKyAgLyogQ2hlY2sgcGVuZGluZyBmbGFnLCBpZiBwcmV2aW91cyB1cGRhdGUgbm90IGRvbmUsIHJldHVybiB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBmb3IgcmVnaXN0ZXIgdG8gYmUgdXBkYXRlZCAqLworICB3aGlsZSAoaGl3ZGctPkluc3RhbmNlLT5TUiAhPSAweDAwdSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIQUxfSVdER19ERUZBVUxUX1RJTUVPVVQpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIElmIHdpbmRvdyBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50IHRoYW4gY3VycmVudCB2YWx1ZSwgbW9kaWZ5IHdpbmRvdworICByZWdpc3RlciAqLworICBpZiAoaGl3ZGctPkluc3RhbmNlLT5XSU5SICE9IGhpd2RnLT5Jbml0LldpbmRvdykKKyAgeworICAgIC8qIFdyaXRlIHRvIElXREcgV0lOUiB0aGUgSVdER19XaW5kb3cgdmFsdWUgdG8gY29tcGFyZSB3aXRoLiBJbiBhbnkgY2FzZSwKKyAgICBldmVuIGlmIHdpbmRvdyBmZWF0dXJlIGlzIGRpc2FibGVkLCBXYXRjaGRvZyB3aWxsIGJlIHJlbG9hZGVkIGJ5IHdyaXRpbmcKKyAgICB3aW5kb3dzIHJlZ2lzdGVyICovCisgICAgaGl3ZGctPkluc3RhbmNlLT5XSU5SID0gaGl3ZGctPkluaXQuV2luZG93OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlbG9hZCBJV0RHIGNvdW50ZXIgd2l0aCB2YWx1ZSBkZWZpbmVkIGluIHRoZSByZWxvYWQgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9JV0RHX1JFTE9BRF9DT1VOVEVSKGhpd2RnKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgSVdER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUmVmcmVzaCB0aGUgSVdERy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIFJlZnJlc2ggdGhlIElXREcuCisgICogQHBhcmFtICBoaXdkZyAgcG9pbnRlciB0byBhIElXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElXREcgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lXREdfUmVmcmVzaChJV0RHX0hhbmRsZVR5cGVEZWYgKmhpd2RnKQoreworICAvKiBSZWxvYWQgSVdERyBjb3VudGVyIHdpdGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0lXREdfUkVMT0FEX0NPVU5URVIoaGl3ZGcpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9JV0RHX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfbGNkLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE1MmVhCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfbGNkLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX2xjZC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBMQ0QgQ29udHJvbGxlciBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBMQ0QgQ29udHJvbGxlciAoTENEKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIG1ldGhvZHMKKyAgKiAgICAgICAgICAgKyBJL08gb3BlcmF0aW9uIG1ldGhvZHMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIG1ldGhvZHMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgWy4uXSBUaGUgTENEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIERlY2xhcmUgYSBMQ0RfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLgorCisgICAgICAtQC0gVGhlIGZyZXF1ZW5jeSBnZW5lcmF0b3IgYWxsb3dzIHlvdSB0byBhY2hpZXZlIHZhcmlvdXMgTENEIGZyYW1lIHJhdGVzCisgICAgICAgICAgc3RhcnRpbmcgZnJvbSBhbiBMQ0QgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IChMQ0RDTEspIHdoaWNoIGNhbiB2YXJ5CisgICAgICAgICAgZnJvbSAzMiBrSHogdXAgdG8gMSBNSHouCisKKyAgICAgICgjKSBJbml0aWFsaXplIHRoZSBMQ0QgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9MQ0RfTXNwSW5pdCgpIEFQSToKKworICAgICAgICAgICgrKykgRW5hYmxlIHRoZSBMQ0RDTEsgKHNhbWUgYXMgUlRDQ0xLKTogdG8gY29uZmlndXJlIHRoZSBSVENDTEsvTENEQ0xLLCBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAoKysrKSBVc2UgUkNDIGZ1bmN0aW9uIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcgaW4gaW5kaWNhdGluZyBSQ0NfUEVSSVBIQ0xLX0xDRCBhbmQKKyAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNsb2NrIHNvdXJjZSAoSFNFLCBMU0kgb3IgTFNFKQorCisgICAgICAgICAgKCsrKSBMQ0QgcGlucyBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgTENEIEdQSU9zLgorICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgTENEIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIG5vLXB1bGwuCisgICAgICAgICAgKCsrKSBFbmFibGUgdGhlIExDRCBpbnRlcmZhY2UgY2xvY2suCisKKworICAgICAgKCMpIFByb2dyYW0gdGhlIFByZXNjYWxlciwgRGl2aWRlciwgQmxpbmsgbW9kZSwgQmxpbmsgRnJlcXVlbmN5IER1dHksIEJpYXMsCisgICAgICAgICAgVm9sdGFnZSBTb3VyY2UsIERlYWQgVGltZSwgUHVsc2UgT24gRHVyYXRpb24sIENvbnRyYXN0LCBIaWdoIGRyaXZlIGFuZCBNdWx0aXBsZXhlcgorICAgICAgICAgIFNlZ21lbnQgaW4gdGhlIEluaXQgc3RydWN0dXJlIG9mIHRoZSBMQ0QgaGFuZGxlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgTENEIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfTENEX0luaXQoKSBBUEkuCisKKyAgICAgIC1ALSBUaGUgSEFMX0xDRF9Jbml0KCkgQVBJIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCAuLi5ldGMpCisgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBIQUxfTENEX01zcEluaXQoKSBBUEkuCisgICAgICAtQC0gQWZ0ZXIgY2FsbGluZyB0aGUgSEFMX0xDRF9Jbml0KCkgdGhlIExDRCBSQU0gbWVtb3J5IGlzIGNsZWFyZWQKKworICAgICAgKCMpIE9wdGlvbmFsbHkgeW91IGNhbiB1cGRhdGUgdGhlIExDRCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZXNlIG1hY3JvczoKKyAgICAgICAgICAgICAgKCsrKSBMQ0QgSGlnaCBEcml2ZSB1c2luZyB0aGUgX19IQUxfTENEX0hJR0hEUklWRVJfRU5BQkxFKCkgYW5kIF9fSEFMX0xDRF9ISUdIRFJJVkVSX0RJU0FCTEUoKSBtYWNyb3MKKyAgICAgICAgICAgICAgKCsrKSBWb2x0YWdlIG91dHB1dCBidWZmZXIgdXNpbmcgX19IQUxfTENEX1ZPTFRBR0VfQlVGRkVSX0VOQUJMRSgpIGFuZCBfX0hBTF9MQ0RfVk9MVEFHRV9CVUZGRVJfRElTQUJMRSgpIG1hY3JvcworICAgICAgICAgICAgICAoKyspIExDRCBQdWxzZSBPTiBEdXJhdGlvbiB1c2luZyB0aGUgX19IQUxfTENEX1BVTFNFT05EVVJBVElPTl9DT05GSUcoKSBtYWNybworICAgICAgICAgICAgICAoKyspIExDRCBEZWFkIFRpbWUgdXNpbmcgdGhlIF9fSEFMX0xDRF9ERUFEVElNRV9DT05GSUcoKSBtYWNybworICAgICAgICAgICAgICAoKyspIFRoZSBMQ0QgQmxpbmsgbW9kZSBhbmQgZnJlcXVlbmN5IHVzaW5nIHRoZSBfX0hBTF9MQ0RfQkxJTktfQ09ORklHKCkgbWFjcm8KKyAgICAgICAgICAgICAgKCsrKSBUaGUgTENEIENvbnRyYXN0IHVzaW5nIHRoZSBfX0hBTF9MQ0RfQ09OVFJBU1RfQ09ORklHKCkgbWFjcm8KKworICAgICAgKCMpIFdyaXRlIHRvIHRoZSBMQ0QgUkFNIG1lbW9yeSB1c2luZyB0aGUgSEFMX0xDRF9Xcml0ZSgpIEFQSSwgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZAorICAgICAgICAgIG1vcmUgdGltZSB0byB1cGRhdGUgdGhlIGRpZmZlcmVudCBMQ0QgUkFNIHJlZ2lzdGVycyBiZWZvcmUgY2FsbGluZworICAgICAgICAgIEhBTF9MQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoKSBBUEkuCisKKyAgICAgICgjKSBUaGUgSEFMX0xDRF9DbGVhcigpIEFQSSBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgTENEIFJBTSBtZW1vcnkuCisKKyAgICAgICgjKSBXaGVuIExDRCBSQU0gbWVtb3J5IGlzIHVwZGF0ZWQgZW5hYmxlIHRoZSB1cGRhdGUgZGlzcGxheSByZXF1ZXN0IHVzaW5nCisgICAgICAgICAgdGhlIEhBTF9MQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoKSBBUEkuCisKKyAgICAgIFsuLl0gTENEIGFuZCBsb3cgcG93ZXIgbW9kZXM6CisgICAgICAgICAgICgjKSBUaGUgTENEIHJlbWFpbiBhY3RpdmUgZHVyaW5nIFNsZWVwLCBMb3cgUG93ZXIgcnVuLCBMb3cgUG93ZXIgU2xlZXAgYW5kCisgICAgICAgICAgICAgICBTVE9QIG1vZGVzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9MQ0RfTU9EVUxFX0VOQUJMRUQKKworLyoqIEBkZWZncm91cCBMQ0QgTENECisgICogQGJyaWVmIExDRCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMQ0RfUHJpdmF0ZV9EZWZpbmVzIExDRCBQcml2YXRlIERlZmluZXMKKyAgKiBAeworICAqLworCisjZGVmaW5lIExDRF9USU1FT1VUX1ZBTFVFICAgICAgICAgICAgIDEwMDBVCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTENEX0V4cG9ydGVkX0Z1bmN0aW9ucyBMQ0QgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBtZXRob2RzCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIExDRCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBMQ0RfSW5pdFN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgTENEIGlzIGRpc2FibGVkLgorICAqIEBwYXJhbSBobGNkIExDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MQ0RfSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCBjb3VudGVyOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisKKyAgLyogQ2hlY2sgdGhlIExDRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGxjZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9BTExfSU5TVEFOQ0UoaGxjZC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9QUkVTQ0FMRVIoaGxjZC0+SW5pdC5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9ESVZJREVSKGhsY2QtPkluaXQuRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0RVVFkoaGxjZC0+SW5pdC5EdXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MQ0RfQklBUyhobGNkLT5Jbml0LkJpYXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9WT0xUQUdFX1NPVVJDRShobGNkLT5Jbml0LlZvbHRhZ2VTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9QVUxTRV9PTl9EVVJBVElPTihobGNkLT5Jbml0LlB1bHNlT25EdXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0hJR0hfRFJJVkUoaGxjZC0+SW5pdC5IaWdoRHJpdmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9ERUFEX1RJTUUoaGxjZC0+SW5pdC5EZWFkVGltZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0NPTlRSQVNUKGhsY2QtPkluaXQuQ29udHJhc3QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9CTElOS19GUkVRVUVOQ1koaGxjZC0+SW5pdC5CbGlua0ZyZXF1ZW5jeSkpOworICBhc3NlcnRfcGFyYW0oSVNfTENEX0JMSU5LX01PREUoaGxjZC0+SW5pdC5CbGlua01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xDRF9NVVhfU0VHTUVOVChobGNkLT5Jbml0Lk11eFNlZ21lbnQpKTsKKworICBpZiAoaGxjZC0+U3RhdGUgPT0gSEFMX0xDRF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBobGNkLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlIChNU1ApICovCisgICAgSEFMX0xDRF9Nc3BJbml0KGhsY2QpOworICB9CisKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICBfX0hBTF9MQ0RfRElTQUJMRShobGNkKTsKKworICAvKiBDbGVhciB0aGUgTENEX1JBTSByZWdpc3RlcnMgYW5kIGVuYWJsZSB0aGUgZGlzcGxheSByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFVEUiBiaXQKKyAgICAgaW4gdGhlIExDRF9TUiByZWdpc3RlciAqLworICBmb3IgKGNvdW50ZXIgPSBMQ0RfUkFNX1JFR0lTVEVSMDsgY291bnRlciA8PSBMQ0RfUkFNX1JFR0lTVEVSNzsgY291bnRlcisrKQorICB7CisgICAgaGxjZC0+SW5zdGFuY2UtPlJBTVtjb3VudGVyXSA9IDA7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBkaXNwbGF5IHJlcXVlc3QgKi8KKyAgLyogaGxjZC0+SW5zdGFuY2UtPlNSIHw9IExDRF9TUl9VRFIgKi8KKyAgLyogQ29uZmlndXJlIHRoZSBMQ0QgUHJlc2NhbGVyLCBEaXZpZGVyLCBCbGluayBtb2RlIGFuZCBCbGluayBGcmVxdWVuY3k6CisgICAgIFNldCBQU1szOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuUHJlc2NhbGVyIHZhbHVlCisgICAgIFNldCBESVZbMzowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkRpdmlkZXIgdmFsdWUKKyAgICAgU2V0IEJMSU5LWzE6MF0gYml0cyBhY2NvcmRpbmcgdG8gaGxjZC0+SW5pdC5CbGlua01vZGUgdmFsdWUKKyAgICAgU2V0IEJMSU5LRlsyOjBdIGJpdHMgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuQmxpbmtGcmVxdWVuY3kgdmFsdWUKKyAgICAgU2V0IERFQURbMjowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkRlYWRUaW1lIHZhbHVlCisgICAgIFNldCBQT05bMjowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LlB1bHNlT25EdXJhdGlvbiB2YWx1ZQorICAgICBTZXQgQ0NbMjowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkNvbnRyYXN0IHZhbHVlCisgICAgIFNldCBIRCBiaXQgYWNjb3JkaW5nIHRvIGhsY2QtPkluaXQuSGlnaERyaXZlIHZhbHVlICovCisgIE1PRElGWV9SRUcoaGxjZC0+SW5zdGFuY2UtPkZDUiwgXAorICAgICAgICAgICAgIChMQ0RfRkNSX1BTIHwgTENEX0ZDUl9ESVYgfCBMQ0RfRkNSX0JMSU5LIHwgTENEX0ZDUl9CTElOS0YgfCBcCisgICAgICAgICAgICAgIExDRF9GQ1JfREVBRCB8IExDRF9GQ1JfUE9OIHwgTENEX0ZDUl9DQyB8IExDRF9GQ1JfSEQpLCBcCisgICAgICAgICAgICAgKGhsY2QtPkluaXQuUHJlc2NhbGVyIHwgaGxjZC0+SW5pdC5EaXZpZGVyIHwgaGxjZC0+SW5pdC5CbGlua01vZGUgfCBobGNkLT5Jbml0LkJsaW5rRnJlcXVlbmN5IHwgXAorICAgICAgICAgICAgICBobGNkLT5Jbml0LkRlYWRUaW1lIHwgaGxjZC0+SW5pdC5QdWxzZU9uRHVyYXRpb24gfCBobGNkLT5Jbml0LkNvbnRyYXN0IHwgaGxjZC0+SW5pdC5IaWdoRHJpdmUpKTsKKworICAvKiBXYWl0IHVudGlsIExDRCBGcmFtZSBDb250cm9sIFJlZ2lzdGVyIFN5bmNocm9uaXphdGlvbiBmbGFnIChGQ1JTRikgaXMgc2V0IGluIHRoZSBMQ0RfU1IgcmVnaXN0ZXIKKyAgICAgVGhpcyBiaXQgaXMgc2V0IGJ5IGhhcmR3YXJlIGVhY2ggdGltZSB0aGUgTENEX0ZDUiByZWdpc3RlciBpcyB1cGRhdGVkIGluIHRoZSBMQ0RDTEsKKyAgICAgZG9tYWluLiBJdCBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gd3JpdGluZyB0byB0aGUgTENEX0ZDUiByZWdpc3Rlci4qLworICBzdGF0dXMgPSBMQ0RfV2FpdEZvclN5bmNocm8oaGxjZCk7CisgIGlmIChzdGF0dXMgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgTENEIER1dHksIEJpYXMsIFZvbHRhZ2UgU291cmNlLCBEZWFkIFRpbWUsIFB1bHNlIE9uIER1cmF0aW9uIGFuZCBDb250cmFzdDoKKyAgICAgU2V0IERVVFlbMjowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkR1dHkgdmFsdWUKKyAgICAgU2V0IEJJQVNbMTowXSBiaXRzIGFjY29yZGluZyB0byBobGNkLT5Jbml0LkJpYXMgdmFsdWUKKyAgICAgU2V0IFZTRUwgYml0IGFjY29yZGluZyB0byBobGNkLT5Jbml0LlZvbHRhZ2VTb3VyY2UgdmFsdWUKKyAgICAgU2V0IE1VWF9TRUcgYml0IGFjY29yZGluZyB0byBobGNkLT5Jbml0Lk11eFNlZ21lbnQgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhobGNkLT5JbnN0YW5jZS0+Q1IsIFwKKyAgICAgICAgICAgICAoTENEX0NSX0RVVFkgfCBMQ0RfQ1JfQklBUyB8IExDRF9DUl9WU0VMIHwgTENEX0NSX01VWF9TRUcpLCBcCisgICAgICAgICAgICAgKGhsY2QtPkluaXQuRHV0eSB8IGhsY2QtPkluaXQuQmlhcyB8IGhsY2QtPkluaXQuVm9sdGFnZVNvdXJjZSB8IGhsY2QtPkluaXQuTXV4U2VnbWVudCkpOworCisgIC8qIEVuYWJsZSB0aGUgcGVyaXBoZXJhbCAqLworICBfX0hBTF9MQ0RfRU5BQkxFKGhsY2QpOworCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCBVbnRpbCB0aGUgTENEIGlzIGVuYWJsZWQgKi8KKyAgd2hpbGUgKF9fSEFMX0xDRF9HRVRfRkxBRyhobGNkLCBMQ0RfRkxBR19FTlMpID09IFJFU0VUKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExDRF9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIGhsY2QtPkVycm9yQ29kZSA9IEhBTF9MQ0RfRVJST1JfRU5TOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyohPCBXYWl0IFVudGlsIHRoZSBMQ0QgQm9vc3RlciBpcyByZWFkeSAqLworICB3aGlsZSAoX19IQUxfTENEX0dFVF9GTEFHKGhsY2QsIExDRF9GTEFHX1JEWSkgPT0gUkVTRVQpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTENEX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgaGxjZC0+RXJyb3JDb2RlID0gSEFMX0xDRF9FUlJPUl9SRFk7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgTENEIHN0YXRlICovCisgIGhsY2QtPkVycm9yQ29kZSA9IEhBTF9MQ0RfRVJST1JfTk9ORTsKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX1JFQURZOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBMQ0QgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaGxjZCBMQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTENEX0RlSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgLyogQ2hlY2sgdGhlIExDRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGxjZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MQ0RfQUxMX0lOU1RBTkNFKGhsY2QtPkluc3RhbmNlKSk7CisKKyAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX0xDRF9Nc3BEZUluaXQoaGxjZCk7CisKKyAgaGxjZC0+RXJyb3JDb2RlID0gSEFMX0xDRF9FUlJPUl9OT05FOworICBobGNkLT5TdGF0ZSA9IEhBTF9MQ0RfU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobGNkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgTENEIE1TUC4KKyAgKiBAcGFyYW0gaGxjZCBMQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTENEX01zcERlSW5pdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxjZCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfTENEX01zcERlSW5pdCBpdCB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIExDRCBNU1AuCisgICogQHBhcmFtIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xDRF9Nc3BJbml0KExDRF9IYW5kbGVUeXBlRGVmICpobGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobGNkKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9MQ0RfTXNwSW5pdCBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBtZXRob2RzCisgICogIEBicmllZiBMQ0QgUkFNIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dIFVzaW5nIGl0cyBkb3VibGUgYnVmZmVyIG1lbW9yeSB0aGUgTENEIGNvbnRyb2xsZXIgZW5zdXJlcyB0aGUgY29oZXJlbmN5IG9mIHRoZQorIGRpc3BsYXllZCBpbmZvcm1hdGlvbiB3aXRob3V0IGhhdmluZyB0byB1c2UgaW50ZXJydXB0cyB0byBjb250cm9sIExDRF9SQU0KKyBtb2RpZmljYXRpb24uCisgVGhlIGFwcGxpY2F0aW9uIHNvZnR3YXJlIGNhbiBhY2Nlc3MgdGhlIGZpcnN0IGJ1ZmZlciBsZXZlbCAoTENEX1JBTSkgdGhyb3VnaAorIHRoZSBBUEIgaW50ZXJmYWNlLiBPbmNlIGl0IGhhcyBtb2RpZmllZCB0aGUgTENEX1JBTSB1c2luZyB0aGUgSEFMX0xDRF9Xcml0ZSgpIEFQSSwKKyBpdCBzZXRzIHRoZSBVRFIgZmxhZyBpbiB0aGUgTENEX1NSIHJlZ2lzdGVyIHVzaW5nIHRoZSBIQUxfTENEX1VwZGF0ZURpc3BsYXlSZXF1ZXN0KCkgQVBJLgorIFRoaXMgVURSIGZsYWcgKHVwZGF0ZSBkaXNwbGF5IHJlcXVlc3QpIHJlcXVlc3RzIHRoZSB1cGRhdGVkIGluZm9ybWF0aW9uIHRvIGJlCisgbW92ZWQgaW50byB0aGUgc2Vjb25kIGJ1ZmZlciBsZXZlbCAoTENEX0RJU1BMQVkpLgorIFRoaXMgb3BlcmF0aW9uIGlzIGRvbmUgc3luY2hyb25vdXNseSB3aXRoIHRoZSBmcmFtZSAoYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyBuZXh0IGZyYW1lKSwgdW50aWwgdGhlIHVwZGF0ZSBpcyBjb21wbGV0ZWQsIHRoZSBMQ0RfUkFNIGlzIHdyaXRlIHByb3RlY3RlZCBhbmQKKyB0aGUgVURSIGZsYWcgc3RheXMgaGlnaC4KKyBPbmNlIHRoZSB1cGRhdGUgaXMgY29tcGxldGVkIGFub3RoZXIgZmxhZyAoVUREIC0gVXBkYXRlIERpc3BsYXkgRG9uZSkgaXMgc2V0IGFuZAorIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgaWYgdGhlIFVERElFIGJpdCBpbiB0aGUgTENEX0ZDUiByZWdpc3RlciBpcyBzZXQuCisgVGhlIHRpbWUgaXQgdGFrZXMgdG8gdXBkYXRlIExDRF9ESVNQTEFZIGlzLCBpbiB0aGUgd29yc3QgY2FzZSwgb25lIG9kZCBhbmQgb25lCisgZXZlbiBmcmFtZS4KKyBUaGUgdXBkYXRlIHdpbGwgbm90IG9jY3VyIChVRFIgPSAxIGFuZCBVREQgPSAwKSB1bnRpbCB0aGUgZGlzcGxheSBpcworIGVuYWJsZWQgKExDREVOID0gMSkuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV3JpdGUgYSB3b3JkIGluIHRoZSBzcGVjaWZpYyBMQ0QgUkFNLgorICAqIEBwYXJhbSBobGNkIExDRCBoYW5kbGUKKyAgKiBAcGFyYW0gUkFNUmVnaXN0ZXJJbmRleCBzcGVjaWZpZXMgdGhlIExDRCBSQU0gUmVnaXN0ZXIuCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVIwOiBMQ0QgUkFNIFJlZ2lzdGVyIDAKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTogTENEIFJBTSBSZWdpc3RlciAxCisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjI6IExDRCBSQU0gUmVnaXN0ZXIgMgorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVIzOiBMQ0QgUkFNIFJlZ2lzdGVyIDMKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSNDogTENEIFJBTSBSZWdpc3RlciA0CisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjU6IExDRCBSQU0gUmVnaXN0ZXIgNQorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVI2OiBMQ0QgUkFNIFJlZ2lzdGVyIDYKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSNzogTENEIFJBTSBSZWdpc3RlciA3CisgICogICAgIEBhcmcgTENEX1JBTV9SRUdJU1RFUjg6IExDRCBSQU0gUmVnaXN0ZXIgOAorICAqICAgICBAYXJnIExDRF9SQU1fUkVHSVNURVI5OiBMQ0QgUkFNIFJlZ2lzdGVyIDkKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTA6IExDRCBSQU0gUmVnaXN0ZXIgMTAKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTE6IExDRCBSQU0gUmVnaXN0ZXIgMTEKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTI6IExDRCBSQU0gUmVnaXN0ZXIgMTIKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTM6IExDRCBSQU0gUmVnaXN0ZXIgMTMKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTQ6IExDRCBSQU0gUmVnaXN0ZXIgMTQKKyAgKiAgICAgQGFyZyBMQ0RfUkFNX1JFR0lTVEVSMTU6IExDRCBSQU0gUmVnaXN0ZXIgMTUKKyAgKiBAcGFyYW0gUkFNUmVnaXN0ZXJNYXNrIHNwZWNpZmllcyB0aGUgTENEIFJBTSBSZWdpc3RlciBEYXRhIE1hc2suCisgICogQHBhcmFtIERhdGEgc3BlY2lmaWVzIExDRCBEYXRhIFZhbHVlIHRvIGJlIHdyaXR0ZW4uCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTENEX1dyaXRlKExDRF9IYW5kbGVUeXBlRGVmICpobGNkLCB1aW50MzJfdCBSQU1SZWdpc3RlckluZGV4LCB1aW50MzJfdCBSQU1SZWdpc3Rlck1hc2ssIHVpbnQzMl90IERhdGEpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgSEFMX0xDRF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBobGNkLT5TdGF0ZTsKKyAgCisgIGlmICgoc3RhdGUgPT0gSEFMX0xDRF9TVEFURV9SRUFEWSkgfHwgKHN0YXRlID09IEhBTF9MQ0RfU1RBVEVfQlVTWSkpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19MQ0RfUkFNX1JFR0lTVEVSKFJBTVJlZ2lzdGVySW5kZXgpKTsKKworICAgIGlmIChobGNkLT5TdGF0ZSA9PSBIQUxfTENEX1NUQVRFX1JFQURZKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgICBfX0hBTF9MT0NLKGhsY2QpOworICAgICAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisKKyAgICAgIC8qIEdldCB0aW1lb3V0ICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiE8IFdhaXQgVW50aWwgdGhlIExDRCBpcyByZWFkeSAqLworICAgICAgd2hpbGUgKF9fSEFMX0xDRF9HRVRfRkxBRyhobGNkLCBMQ0RfRkxBR19VRFIpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTENEX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX1VEUjsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGxjZCk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb3B5IHRoZSBuZXcgRGF0YSBieXRlcyB0byBMQ0QgUkFNIHJlZ2lzdGVyICovCisgICAgTU9ESUZZX1JFRyhobGNkLT5JbnN0YW5jZS0+UkFNW1JBTVJlZ2lzdGVySW5kZXhdLCB+KFJBTVJlZ2lzdGVyTWFzayksIERhdGEpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDbGVhciB0aGUgTENEIFJBTSByZWdpc3RlcnMuCisgICogQHBhcmFtIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xDRF9DbGVhcihMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCBjb3VudGVyOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisgIEhBTF9MQ0RfU3RhdGVUeXBlRGVmIHN0YXRlID0gaGxjZC0+U3RhdGU7CisgIAorICBpZiAoKHN0YXRlID09IEhBTF9MQ0RfU1RBVEVfUkVBRFkpIHx8IChzdGF0ZSA9PSBIQUxfTENEX1NUQVRFX0JVU1kpKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhsY2QpOworCisgICAgaGxjZC0+U3RhdGUgPSBIQUxfTENEX1NUQVRFX0JVU1k7CisKKyAgICAvKiBHZXQgdGltZW91dCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiE8IFdhaXQgVW50aWwgdGhlIExDRCBpcyByZWFkeSAqLworICAgIHdoaWxlIChfX0hBTF9MQ0RfR0VUX0ZMQUcoaGxjZCwgTENEX0ZMQUdfVURSKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTENEX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIGhsY2QtPkVycm9yQ29kZSA9IEhBTF9MQ0RfRVJST1JfVURSOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhsY2QpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ2xlYXIgdGhlIExDRF9SQU0gcmVnaXN0ZXJzICovCisgICAgZm9yIChjb3VudGVyID0gTENEX1JBTV9SRUdJU1RFUjA7IGNvdW50ZXIgPD0gTENEX1JBTV9SRUdJU1RFUjE1OyBjb3VudGVyKyspCisgICAgeworICAgICAgaGxjZC0+SW5zdGFuY2UtPlJBTVtjb3VudGVyXSA9IDA7CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBMQ0QgZGlzcGxheSAqLworICAgIHN0YXR1cyA9IEhBTF9MQ0RfVXBkYXRlRGlzcGxheVJlcXVlc3QoaGxjZCk7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFVwZGF0ZSBEaXNwbGF5IFJlcXVlc3QuCisgICogQHBhcmFtIGhsY2QgTENEIGhhbmRsZQorICAqIEBub3RlICAgRWFjaCB0aW1lIHNvZnR3YXJlIG1vZGlmaWVzIHRoZSBMQ0RfUkFNIGl0IG11c3Qgc2V0IHRoZSBVRFIgYml0IHRvCisgICogICAgICAgICB0cmFuc2ZlciB0aGUgdXBkYXRlZCBkYXRhIHRvIHRoZSBzZWNvbmQgbGV2ZWwgYnVmZmVyLgorICAqICAgICAgICAgVGhlIFVEUiBiaXQgc3RheXMgc2V0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHVwZGF0ZSBhbmQgZHVyaW5nIHRoaXMKKyAgKiAgICAgICAgIHRpbWUgdGhlIExDRF9SQU0gaXMgd3JpdGUgcHJvdGVjdGVkLgorICAqIEBub3RlICAgV2hlbiB0aGUgZGlzcGxheSBpcyBkaXNhYmxlZCwgdGhlIHVwZGF0ZSBpcyBwZXJmb3JtZWQgZm9yIGFsbAorICAqICAgICAgICAgTENEX0RJU1BMQVkgbG9jYXRpb25zLgorICAqICAgICAgICAgV2hlbiB0aGUgZGlzcGxheSBpcyBlbmFibGVkLCB0aGUgdXBkYXRlIGlzIHBlcmZvcm1lZCBvbmx5IGZvciBsb2NhdGlvbnMKKyAgKiAgICAgICAgIGZvciB3aGljaCBjb21tb25zIGFyZSBhY3RpdmUgKGRlcGVuZGluZyBvbiBEVVRZKS4gRm9yIGV4YW1wbGUgaWYKKyAgKiAgICAgICAgIERVVFkgPSAxLzIsIG9ubHkgdGhlIExDRF9ESVNQTEFZIG9mIENPTTAgYW5kIENPTTEgd2lsbCBiZSB1cGRhdGVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xDRF9VcGRhdGVEaXNwbGF5UmVxdWVzdChMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENsZWFyIHRoZSBVcGRhdGUgRGlzcGxheSBEb25lIGZsYWcgYmVmb3JlIHN0YXJ0aW5nIHRoZSB1cGRhdGUgZGlzcGxheSByZXF1ZXN0ICovCisgIF9fSEFMX0xDRF9DTEVBUl9GTEFHKGhsY2QsIExDRF9GTEFHX1VERCk7CisKKyAgLyogRW5hYmxlIHRoZSBkaXNwbGF5IHJlcXVlc3QgKi8KKyAgaGxjZC0+SW5zdGFuY2UtPlNSIHw9IExDRF9TUl9VRFI7CisKKyAgLyogR2V0IHRpbWVvdXQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiE8IFdhaXQgVW50aWwgdGhlIExDRCBkaXNwbGF5IGlzIGRvbmUgKi8KKyAgd2hpbGUgKF9fSEFMX0xDRF9HRVRfRkxBRyhobGNkLCBMQ0RfRkxBR19VREQpID09IFJFU0VUKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExDRF9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIGhsY2QtPkVycm9yQ29kZSA9IEhBTF9MQ0RfRVJST1JfVUREOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGxjZCk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICBobGNkLT5TdGF0ZSA9IEhBTF9MQ0RfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGxjZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIG1ldGhvZHMKKyAgKiAgQGJyaWVmICAgTENEIFN0YXRlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIExDRDoKKyAgICAgICgrKSBIQUxfTENEX0dldFN0YXRlKCkgQVBJIGNhbiBiZSBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgTENEIHBlcmlwaGVyYWwgU3RhdGUuCisgICAgICAoKykgSEFMX0xDRF9HZXRFcnJvcigpIEFQSSB0byByZXR1cm4gdGhlIExDRCBlcnJvciBjb2RlLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgTENEIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gaGxjZCBMQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9MQ0RfU3RhdGVUeXBlRGVmIEhBTF9MQ0RfR2V0U3RhdGUoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIC8qIFJldHVybiBMQ0QgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBobGNkLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgTENEIGVycm9yIGNvZGUuCisgICogQHBhcmFtIGhsY2QgTENEIGhhbmRsZQorICAqIEByZXR2YWwgTENEIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9MQ0RfR2V0RXJyb3IoTENEX0hhbmRsZVR5cGVEZWYgKmhsY2QpCit7CisgIHJldHVybiBobGNkLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTENEX1ByaXZhdGVfRnVuY3Rpb25zIExDRCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgV2FpdCB1bnRpbCB0aGUgTENEIEZDUiByZWdpc3RlciBpcyBzeW5jaHJvbml6ZWQgaW4gdGhlIExDRENMSyBkb21haW4uCisgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFueSB3cml0ZSBvcGVyYXRpb24gdG8gTENEX0ZDUiByZWdpc3Rlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIExDRF9XYWl0Rm9yU3luY2hybyhMQ0RfSGFuZGxlVHlwZURlZiAqaGxjZCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEdldCB0aW1lb3V0ICovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogTG9vcCB1bnRpbCBGQ1JTRiBmbGFnIGlzIHNldCAqLworICB3aGlsZSAoX19IQUxfTENEX0dFVF9GTEFHKGhsY2QsIExDRF9GTEFHX0ZDUlNGKSA9PSBSRVNFVCkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMQ0RfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICBobGNkLT5FcnJvckNvZGUgPSBIQUxfTENEX0VSUk9SX0ZDUlNGOworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfTENEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX2xwdGltLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9scHRpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTE4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9scHRpbS5jCkBAIC0wLDAgKzEsMjEyNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfbHB0aW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTFBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgTG93IFBvd2VyIFRpbWVyIChMUFRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBwb2xsaW5nIG1vZGUuCisgICogICAgICAgICAgICsgU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zIGluIGludGVycnVwdCBtb2RlLgorICAqICAgICAgICAgICArIFJlYWRpbmcgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4KKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBMUFRJTSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIExQVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZQorICAgICAgICBIQUxfTFBUSU1fTXNwSW5pdCgpOgorICAgICAgICAgKCsrKSBFbmFibGUgdGhlIExQVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfTFBUSU14X0NMS19FTkFCTEUoKS4KKyAgICAgICAgICgrKykgSW4gY2FzZSBvZiB1c2luZyBpbnRlcnJ1cHRzIChlLmcuIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoKSk6CisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBMUFRJTSBpbnRlcnJ1cHQgcHJpb3JpdHkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKS4KKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIExQVElNIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpLgorICAgICAgICAgICAgICgrKyspIEluIExQVElNIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9MUFRJTV9JUlFIYW5kbGVyKCkuCisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIExQVElNIEhBTCB1c2luZyBIQUxfTFBUSU1fSW5pdCgpLiBUaGlzIGZ1bmN0aW9uCisgICAgICAgICBjb25maWd1cmVzIG1haW5seToKKyAgICAgICAgICgrKykgVGhlIGluc3RhbmNlOiBMUFRJTTEgb3IgTFBUSU0yLgorICAgICAgICAgKCsrKSBDbG9jazogdGhlIGNvdW50ZXIgY2xvY2suCisgICAgICAgICAgICAgKCsrKykgU291cmNlICAgOiBpdCBjYW4gYmUgZWl0aGVyIHRoZSBVTFBUSU0gaW5wdXQgKElOMSkgb3Igb25lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJuYWwgY2xvY2s7IChBUEIsIExTRSwgTFNJIG9yIE1TSSkuCisgICAgICAgICAgICAgKCsrKykgUHJlc2NhbGVyOiBzZWxlY3QgdGhlIGNsb2NrIGRpdmlkZXIuCisgICAgICAgICAoKyspICBVbHRyYUxvd1Bvd2VyQ2xvY2sgOiBUbyBiZSB1c2VkIG9ubHkgaWYgdGhlIFVMUFRJTSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgYXMgY291bnRlciBjbG9jayBzb3VyY2UuCisgICAgICAgICAgICAgKCsrKykgUG9sYXJpdHk6ICAgcG9sYXJpdHkgb2YgdGhlIGFjdGl2ZSBlZGdlIGZvciB0aGUgY291bnRlciB1bml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIFVMUFRJTSBpbnB1dCBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAoKysrKSBTYW1wbGVUaW1lOiBjbG9jayBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgY2xvY2sgZ2xpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLgorICAgICAgICAgKCsrKSBUcmlnZ2VyOiBIb3cgdGhlIGNvdW50ZXIgc3RhcnQuCisgICAgICAgICAgICAgKCsrKykgU291cmNlOiB0cmlnZ2VyIGNhbiBiZSBzb2Z0d2FyZSBvciBvbmUgb2YgdGhlIGhhcmR3YXJlIHRyaWdnZXJzLgorICAgICAgICAgICAgICgrKyspIEFjdGl2ZUVkZ2UgOiBvbmx5IGZvciBoYXJkd2FyZSB0cmlnZ2VyLgorICAgICAgICAgICAgICgrKyspIFNhbXBsZVRpbWUgOiB0cmlnZ2VyIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsaXRjaCBmaWx0ZXIuCisgICAgICAgICAoKyspIE91dHB1dFBvbGFyaXR5IDogMiBvcHBvc2l0ZSBwb2xhcml0aWVzIGFyZSBwb3NzaWJsZS4KKyAgICAgICAgICgrKykgVXBkYXRlTW9kZTogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBvZiB0aGUgYXV0b3JlbG9hZCBhbmQKKyAgICAgICAgICAgICAgdGhlIGNvbXBhcmUgdmFsdWVzIGlzIGRvbmUgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgdGhlIGVuZCBvZiBjdXJyZW50CisgICAgICAgICAgICAgIHBlcmlvZC4KKyAgICAgICAgICgrKykgSW5wdXQxU291cmNlOiBTb3VyY2Ugc2VsZWN0ZWQgZm9yIGlucHV0MSAoR1BJTyBvciBjb21wYXJhdG9yIG91dHB1dCkuCisgICAgICAgICAoKyspIElucHV0MlNvdXJjZTogU291cmNlIHNlbGVjdGVkIGZvciBpbnB1dDIgKEdQSU8gb3IgY29tcGFyYXRvciBvdXRwdXQpLgorICAgICAgICAgICAgICBJbnB1dDIgaXMgdXNlZCBvbmx5IGZvciBlbmNvZGVyIGZlYXR1cmUgc28gaXMgdXNlZCBvbmx5IGZvciBMUFRJTTEgaW5zdGFuY2UuCisKKyAgICAgICgjKVNpeCBtb2RlcyBhcmUgYXZhaWxhYmxlOgorCisgICAgICAgICAoKyspIFBXTSBNb2RlOiBUbyBnZW5lcmF0ZSBhIFBXTSBzaWduYWwgd2l0aCBzcGVjaWZpZWQgcGVyaW9kIGFuZCBwdWxzZSwKKyAgICAgICAgIGNhbGwgSEFMX0xQVElNX1BXTV9TdGFydCgpIG9yIEhBTF9MUFRJTV9QV01fU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uCisgICAgICAgICBtb2RlLgorCisgICAgICAgICAoKyspIE9uZSBQdWxzZSBNb2RlOiBUbyBnZW5lcmF0ZSBwdWxzZSB3aXRoIHNwZWNpZmllZCB3aWR0aCBpbiByZXNwb25zZQorICAgICAgICAgdG8gYSBzdGltdWx1cywgY2FsbCBIQUxfTFBUSU1fT25lUHVsc2VfU3RhcnQoKSBvcgorICAgICAgICAgSEFMX0xQVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLgorCisgICAgICAgICAoKyspIFNldCBvbmNlIE1vZGU6IEluIHRoaXMgbW9kZSwgdGhlIG91dHB1dCBjaGFuZ2VzIHRoZSBsZXZlbCAoZnJvbQorICAgICAgICAgbG93IGxldmVsIHRvIGhpZ2ggbGV2ZWwgaWYgdGhlIG91dHB1dCBwb2xhcml0eSBpcyBjb25maWd1cmVkIGhpZ2gsIGVsc2UKKyAgICAgICAgIHRoZSBvcHBvc2l0ZSkgd2hlbiBhIGNvbXBhcmUgbWF0Y2ggb2NjdXJzLiBUbyBzdGFydCB0aGlzIG1vZGUsIGNhbGwKKyAgICAgICAgIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0KCkgb3IgSEFMX0xQVElNX1NldE9uY2VfU3RhcnRfSVQoKSBmb3IKKyAgICAgICAgIGludGVycnVwdGlvbiBtb2RlLgorCisgICAgICAgICAoKyspIEVuY29kZXIgTW9kZTogVG8gdXNlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjYWxsCisgICAgICAgICBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydCgpIG9yIEhBTF9MUFRJTV9FbmNvZGVyX1N0YXJ0X0lUKCkgZm9yCisgICAgICAgICBpbnRlcnJ1cHRpb24gbW9kZS4gT25seSBhdmFpbGFibGUgZm9yIExQVElNMSBpbnN0YW5jZS4KKworICAgICAgICAgKCsrKSBUaW1lIG91dCBNb2RlOiBhbiBhY3RpdmUgZWRnZSBvbiBvbmUgc2VsZWN0ZWQgdHJpZ2dlciBpbnB1dCByZXN0cworICAgICAgICAgdGhlIGNvdW50ZXIuIFRoZSBmaXJzdCB0cmlnZ2VyIGV2ZW50IHdpbGwgc3RhcnQgdGhlIHRpbWVyLCBhbnkKKyAgICAgICAgIHN1Y2Nlc3NpdmUgdHJpZ2dlciBldmVudCB3aWxsIHJlc2V0IHRoZSBjb3VudGVyIGFuZCB0aGUgdGltZXIgd2lsbAorICAgICAgICAgcmVzdGFydC4gVG8gc3RhcnQgdGhpcyBtb2RlIGNhbGwgSEFMX0xQVElNX1RpbWVPdXRfU3RhcnRfSVQoKSBvcgorICAgICAgICAgSEFMX0xQVElNX1RpbWVPdXRfU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uIG1vZGUuCisKKyAgICAgICAgICgrKykgQ291bnRlciBNb2RlOiBjb3VudGVyIGNhbiBiZSB1c2VkIHRvIGNvdW50IGV4dGVybmFsIGV2ZW50cyBvbgorICAgICAgICAgdGhlIExQVElNIElucHV0MSBvciBpdCBjYW4gYmUgdXNlZCB0byBjb3VudCBpbnRlcm5hbCBjbG9jayBjeWNsZXMuCisgICAgICAgICBUbyBzdGFydCB0aGlzIG1vZGUsIGNhbGwgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnQoKSBvcgorICAgICAgICAgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uIG1vZGUuCisKKworICAgICAgKCMpIFVzZXIgY2FuIHN0b3AgYW55IHByb2Nlc3MgYnkgY2FsbGluZyB0aGUgY29ycmVzcG9uZGluZyBBUEk6CisgICAgICAgICAgSEFMX0xQVElNX1h4eF9TdG9wKCkgb3IgSEFMX0xQVElNX1h4eF9TdG9wX0lUKCkgaWYgdGhlIHByb2Nlc3MgaXMKKyAgICAgICAgICBhbHJlYWR5IHN0YXJ0ZWQgaW4gaW50ZXJydXB0aW9uIG1vZGUuCisKKyAgICAgICgjKSBEZS1pbml0aWFsaXplIHRoZSBMUFRJTSBwZXJpcGhlcmFsIHVzaW5nIEhBTF9MUFRJTV9EZUluaXQoKS4KKworICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgWy4uXQorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfTFBUSU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2suCisgIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIHRoZSBDYWxsYmFjayBJRCBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICBbLi5dCisgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZQorICBkZWZhdWx0IHdlYWsgZnVuY3Rpb24uCisgIEByZWYgSEFMX0xQVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgIFsuLl0KKyAgVGhlc2UgZnVuY3Rpb25zIGFsbG93IHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKworICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgIDogTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBDb21wYXJlTWF0Y2hDYWxsYmFjayAgICA6IENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIEF1dG9SZWxvYWRNYXRjaENhbGxiYWNrIDogQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICAgIDogRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2suCisgICAgKCspIENvbXBhcmVXcml0ZUNhbGxiYWNrICAgIDogQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgOiBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRGlyZWN0aW9uVXBDYWxsYmFjayAgICAgOiBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrLgorICAgICgrKSBEaXJlY3Rpb25Eb3duQ2FsbGJhY2sgICA6IERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjay4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfTFBUSU1fU1RBVEVfUkVTRVQKKyAgYWxsIGludGVycnVwdCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKKyAgZXhhbXBsZXMgQHJlZiBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKCksIEByZWYgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKCkuCisKKyAgWy4uXQorICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsKKyAgZnVuY3Rpb25hbGl0aWVzIGluIHRoZSBJbml0L0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCisgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBJbml0L0RlSW5pdAorICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisKKyAgWy4uXQorICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEhBTF9MUFRJTV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICBpbiBIQUxfTFBUSU1fU1RBVEVfUkVBRFkgb3IgSEFMX0xQVElNX1NUQVRFX1JFU0VUIHN0YXRlLAorICB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgIHVzaW5nIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBEZUluaXQgb3IgSW5pdCBmdW5jdGlvbi4KKworICBbLi5dCisgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTSBMUFRJTQorICAqIEBicmllZiBMUFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX0xQVElNX01PRFVMRV9FTkFCTEVECisKKyNpZiBkZWZpbmVkIChMUFRJTTEpIHx8IGRlZmluZWQgKExQVElNMikKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUSU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDBVTCAvKiBUaW1lb3V0IGlzIDFzICovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3N0YXRpYyB2b2lkIExQVElNX1Jlc2V0Q2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIExQVElNIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgorICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgdGhlIExQVElNIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCisgICAgICAgICAgTFBUSU1fSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUKKyAgKiAgICAgICAgIExQVElNX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Jbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgdWludDMyX3QgdG1wY2ZncjsKKworICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhscHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1NPVVJDRShobHB0aW0tPkluaXQuQ2xvY2suU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVIoaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlcikpOworICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QT0xBUklUWShobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suU2FtcGxlVGltZSkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUkdfU09VUkNFKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkpOworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNhbXBsZVRpbWUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRVhUX1RSR19QT0xBUklUWShobHB0aW0tPkluaXQuVHJpZ2dlci5BY3RpdmVFZGdlKSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX09VVFBVVF9QT0xBUklUWShobHB0aW0tPkluaXQuT3V0cHV0UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1VQREFURV9NT0RFKGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSkpOworCisgIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBobHB0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIExQVElNX1Jlc2V0Q2FsbGJhY2soaGxwdGltKTsKKworICAgIGlmIChobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIEhBTF9MUFRJTV9Nc3BJbml0KGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIEdldCB0aGUgTFBUSU14IENGR1IgdmFsdWUgKi8KKyAgdG1wY2ZnciA9IGhscHRpbS0+SW5zdGFuY2UtPkNGR1I7CisKKyAgaWYgKCgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSkgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCAoKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tQT0wgfCBMUFRJTV9DRkdSX0NLRkxUKSk7CisgIH0KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICB0bXBjZmdyICY9ICh1aW50MzJfdCkofihMUFRJTV9DRkdSX1RSR0ZMVCB8IExQVElNX0NGR1JfVFJJR1NFTCkpOworICB9CisKKyAgLyogQ2xlYXIgQ0tTRUwsIENLUE9MLCBQUkVTQywgVFJJR0VOLCBUUkdGTFQsIFdBVlBPTCwgUFJFTE9BRCAmIENPVU5UTU9ERSBiaXRzICovCisgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tTRUwgfCBMUFRJTV9DRkdSX0NLUE9MIHwgTFBUSU1fQ0ZHUl9UUklHRU4gfCBMUFRJTV9DRkdSX1BSRUxPQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1dBVlBPTCB8IExQVElNX0NGR1JfUFJFU0MgfCBMUFRJTV9DRkdSX0NPVU5UTU9ERSkpOworCisgIC8qIFNldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisgIHRtcGNmZ3IgfD0gKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgICAgfAorICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyIHwKKyAgICAgICAgICAgICAgaGxwdGltLT5Jbml0Lk91dHB1dFBvbGFyaXR5ICB8CisgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlICAgICAgfAorICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSk7CisKKyAgaWYgKCgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSkgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSB8fCAoKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIHRtcGNmZ3IgfD0gKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkgfAorICAgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suU2FtcGxlVGltZSk7CisgIH0KKworICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIC8qIEVuYWJsZSBFeHRlcm5hbCB0cmlnZ2VyIGFuZCBzZXQgdGhlIHRyaWdnZXIgc291cmNlICovCisgICAgdG1wY2ZnciB8PSAoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlICAgICB8CisgICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuQWN0aXZlRWRnZSB8CisgICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuU2FtcGxlVGltZSk7CisgIH0KKworICAvKiBXcml0ZSB0byBMUFRJTXggQ0ZHUiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wY2ZncjsKKworICAvKiBDb25maWd1cmUgTFBUSU0gaW5wdXQgc291cmNlcyAqLworICBpZiAoaGxwdGltLT5JbnN0YW5jZSA9PSBMUFRJTTEpCisgIHsKKyAgICAvKiBDaGVjayBMUFRJTSBJbnB1dDEgYW5kIElucHV0MiBzb3VyY2VzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOUFVUMV9TT1VSQ0UoaGxwdGltLT5JbnN0YW5jZSwgaGxwdGltLT5Jbml0LklucHV0MVNvdXJjZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlBVVDJfU09VUkNFKGhscHRpbS0+SW5zdGFuY2UsIGhscHRpbS0+SW5pdC5JbnB1dDJTb3VyY2UpKTsKKworICAgIC8qIENvbmZpZ3VyZSBMUFRJTSBJbnB1dDEgYW5kIElucHV0MiBzb3VyY2VzICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+T1IgPSAoaGxwdGltLT5Jbml0LklucHV0MVNvdXJjZSB8IGhscHRpbS0+SW5pdC5JbnB1dDJTb3VyY2UpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIExQVElNMiBJbnB1dDEgc291cmNlICovCisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOUFVUMV9TT1VSQ0UoaGxwdGltLT5JbnN0YW5jZSwgaGxwdGltLT5Jbml0LklucHV0MVNvdXJjZSkpOworCisgICAgLyogQ29uZmlndXJlIExQVElNMiBJbnB1dDEgc291cmNlICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+T1IgPSBobHB0aW0tPkluaXQuSW5wdXQxU291cmNlOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIExQVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRGVJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIExQVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChobHB0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBMUFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BEZUluaXQ7CisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCisgIEhBTF9MUFRJTV9Nc3BEZUluaXQoaGxwdGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhscHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIExQVElNIE1TUC4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9Nc3BJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgTFBUSU0gTVNQLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX01zcERlSW5pdChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIExQVElNIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgTFBUSU0gU3RhcnQgU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgU3RhcnQgdGhlIFBXTSBtb2RlLgorICAgICAgKCspIFN0b3AgdGhlIFBXTSBtb2RlLgorICAgICAgKCspIFN0YXJ0IHRoZSBPbmUgcHVsc2UgbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBPbmUgcHVsc2UgbW9kZS4KKyAgICAgICgrKSBTdGFydCB0aGUgU2V0IG9uY2UgbW9kZS4KKyAgICAgICgrKSBTdG9wIHRoZSBTZXQgb25jZSBtb2RlLgorICAgICAgKCspIFN0YXJ0IHRoZSBFbmNvZGVyIG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgRW5jb2RlciBtb2RlLgorICAgICAgKCspIFN0YXJ0IHRoZSBUaW1lb3V0IG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgVGltZW91dCBtb2RlLgorICAgICAgKCspIFN0YXJ0IHRoZSBDb3VudGVyIG1vZGUuCisgICAgICAoKykgU3RvcCB0aGUgQ291bnRlciBtb2RlLgorCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIFBXTSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgUHVsc2UgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0YXJ0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kLCB1aW50MzJfdCBQdWxzZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogUmVzZXQgV0FWRSBiaXQgdG8gc2V0IFBXTSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfV0FWRTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKKworICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIFBXTSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1BXTV9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBQV00gbW9kZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOworCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBFbmFibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBFbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworCisgIC8qIERpc2FibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGRpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgUHVsc2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBvbmUgcHVsc2UgbW9kZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogTG9hZCB0aGUgcHVsc2UgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBQdWxzZSk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIExQVElNIE9uZSBwdWxzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX09uZVB1bHNlX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIE9uZSBwdWxzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEBwYXJhbSAgUHVsc2UgU3BlY2lmaWVzIHRoZSBjb21wYXJlIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgb25lIHB1bHNlIG1vZGUgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOworCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisKKyAgLyogRW5hYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKworICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKKworICAvKiBTdGFydCB0aW1lciBpbiBzaW5nbGUgKG9uZSBzaG90KSBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOworCisgIC8qIERpc2FibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGRpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIHsKKyAgICAvKiBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOworICB9CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gaW4gU2V0IG9uY2UgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgV0FWRSBiaXQgdG8gZW5hYmxlIHRoZSBzZXQgb25jZSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9XQVZFOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIHNpbmdsZSAob25lIHNob3QpIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBTZXQgb25jZSBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RvcChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RhcnRfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QsIHVpbnQzMl90IFB1bHNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUFVMU0UoUHVsc2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgV0FWRSBiaXQgdG8gZW5hYmxlIHRoZSBzZXQgb25jZSBtb2RlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9XQVZFOworCisgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7CisKKyAgLyogRW5hYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKKworICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisKKyAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOworCisgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKKworICAvKiBTdGFydCB0aW1lciBpbiBzaW5nbGUgKG9uZSBzaG90KSBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9TZXRPbmNlX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIERpc2FibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBEaXNhYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisKKyAgLyogRGlzYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICB7CisgICAgLyogRGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLworICAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKTsKKyAgfQorCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnQgdGhlIEVuY29kZXIgaW50ZXJmYWNlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0VuY29kZXJfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpCit7CisgIHVpbnQzMl90ICAgICAgICAgIHRtcGNmZ3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MpOworICBhc3NlcnRfcGFyYW0oaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlciA9PSBMUFRJTV9QUkVTQ0FMRVJfRElWMSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QT0xBUklUWShobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5KSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLworICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKKworICAvKiBDbGVhciBDS1BPTCBiaXRzICovCisgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+TFBUSU1fQ0ZHUl9DS1BPTCk7CisKKyAgLyogU2V0IElucHV0IHBvbGFyaXR5ICovCisgIHRtcGNmZ3IgfD0gIGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHk7CisKKyAgLyogV3JpdGUgdG8gTFBUSU14IENGR1IgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiA9IHRtcGNmZ3I7CisKKyAgLyogU2V0IEVOQyBiaXQgdG8gZW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfRU5DOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBFbmNvZGVyIGludGVyZmFjZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9FbmNvZGVyX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIFJlc2V0IEVOQyBiaXQgdG8gZGlzYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9FTkM7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgRW5jb2RlciBpbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgdWludDMyX3QgICAgICAgICAgdG1wY2ZncjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOworICBhc3NlcnRfcGFyYW0oaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQyk7CisgIGFzc2VydF9wYXJhbShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyID09IExQVElNX1BSRVNDQUxFUl9ESVYxKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBDb25maWd1cmUgZWRnZSBzZW5zaXRpdml0eSBmb3IgZW5jb2RlciBtb2RlICovCisgIC8qIEdldCB0aGUgTFBUSU14IENGR1IgdmFsdWUgKi8KKyAgdG1wY2ZnciA9IGhscHRpbS0+SW5zdGFuY2UtPkNGR1I7CisKKyAgLyogQ2xlYXIgQ0tQT0wgYml0cyAqLworICB0bXBjZmdyICY9ICh1aW50MzJfdCkofkxQVElNX0NGR1JfQ0tQT0wpOworCisgIC8qIFNldCBJbnB1dCBwb2xhcml0eSAqLworICB0bXBjZmdyIHw9ICBobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5OworCisgIC8qIFdyaXRlIHRvIExQVElNeCBDRkdSICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgPSB0bXBjZmdyOworCisgIC8qIFNldCBFTkMgYml0IHRvIGVuYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX0VOQzsKKworICAvKiBFbmFibGUgInN3aXRjaCB0byBkb3duIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0RPV04pOworCisgIC8qIEVuYWJsZSAic3dpdGNoIHRvIHVwIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX1VQKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KKyAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgRW5jb2RlciBpbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBSZXNldCBFTkMgYml0IHRvIGRpc2FibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfRU5DOworCisgIC8qIERpc2FibGUgInN3aXRjaCB0byBkb3duIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9ET1dOKTsKKworICAvKiBEaXNhYmxlICJzd2l0Y2ggdG8gdXAgZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX1VQKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBUaW1lb3V0IGZ1bmN0aW9uLgorICAqIEBub3RlICAgVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlCisgICogICAgICAgICB0cmlnZ2VyIGV2ZW50IHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIgYW5kIHRoZSB0aW1lciByZXN0YXJ0cy4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmaWVzIHRoZSBUaW1lT3V0IHZhbHVlIHRvIHJlc2V0IHRoZSBjb3VudGVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFRpbWVvdXQpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgVElNT1VUIGJpdCB0byBlbmFibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24gKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1RJTU9VVDsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBMb2FkIHRoZSBUaW1lb3V0IHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgVGltZW91dCk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIFRpbWVvdXQgZnVuY3Rpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBSZXNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1RJTU9VVDsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBUaW1lb3V0IGZ1bmN0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlCisgICogICAgICAgICB0cmlnZ2VyIGV2ZW50IHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIgYW5kIHRoZSB0aW1lciByZXN0YXJ0cy4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmaWVzIHRoZSBUaW1lT3V0IHZhbHVlIHRvIHJlc2V0IHRoZSBjb3VudGVyLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFRpbWVvdXQpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBTZXQgVElNT1VUIGJpdCB0byBlbmFibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24gKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1RJTU9VVDsKKworICAvKiBFbmFibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogTG9hZCB0aGUgVGltZW91dCB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFRpbWVvdXQpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBUaW1lb3V0IGZ1bmN0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1RpbWVPdXRfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgLyogUmVzZXQgVElNT1VUIGJpdCB0byBlbmFibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24gKi8KKyAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9USU1PVVQ7CisKKyAgLyogRGlzYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgQ291bnRlciBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBQZXJpb2QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CisKKyAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSWYgY2xvY2sgc291cmNlIGlzIG5vdCBVTFBUSU0gY2xvY2sgYW5kIGNvdW50ZXIgc291cmNlIGlzIGV4dGVybmFsLCB0aGVuIGl0IG11c3Qgbm90IGJlIHByZXNjYWxlZCAqLworICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgIT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSAmJiAoaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjbG9jayBpcyBwcmVzY2FsZWQgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7CisgICAgLyogU2V0IGNsb2NrIHByZXNjYWxlciB0byAwICovCisgICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9QUkVTQzsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBDb3VudGVyIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBDb3VudGVyIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdGFydF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKKworICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKworICAvKiBJZiBjbG9jayBzb3VyY2UgaXMgbm90IFVMUFRJTSBjbG9jayBhbmQgY291bnRlciBzb3VyY2UgaXMgZXh0ZXJuYWwsIHRoZW4gaXQgbXVzdCBub3QgYmUgcHJlc2NhbGVkICovCisgIGlmICgoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSAhPSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pICYmIChobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgeworICAgIC8qIENoZWNrIGlmIGNsb2NrIGlzIHByZXNjYWxlZCAqLworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVJESVYxKGhscHRpbS0+SW5pdC5DbG9jay5QcmVzY2FsZXIpKTsKKyAgICAvKiBTZXQgY2xvY2sgcHJlc2NhbGVyIHRvIDAgKi8KKyAgICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1BSRVNDOworICB9CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCisgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7CisKKyAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIENvdW50ZXIgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIC8qIERpc2FibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgTFBUSU0gUmVhZCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICBSZWFkIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgIyMjIyMgTFBUSU0gUmVhZCBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIExQVElNIFJlYWRpbmcgZnVuY3Rpb25zLgorICAgICAgKCspIFJlYWQgdGhlIGNvdW50ZXIgdmFsdWUuCisgICAgICAoKykgUmVhZCB0aGUgcGVyaW9kIChBdXRvLXJlbG9hZCkgdmFsdWUuCisgICAgICAoKykgUmVhZCB0aGUgcHVsc2UgKENvbXBhcmUpdmFsdWUuCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgQ291bnRlciB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQ291bnRlcihMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgcmV0dXJuIChobHB0aW0tPkluc3RhbmNlLT5DTlQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBBdXRvcmVsb2FkIChQZXJpb2QpIHZhbHVlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKi8KK3VpbnQzMl90IEhBTF9MUFRJTV9SZWFkQXV0b1JlbG9hZChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CisKKyAgcmV0dXJuIChobHB0aW0tPkluc3RhbmNlLT5BUlIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBDb21wYXJlIChQdWxzZSkgdmFsdWUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBDb21wYXJlIHZhbHVlLgorICAqLwordWludDMyX3QgSEFMX0xQVElNX1JlYWRDb21wYXJlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKKworICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkNNUCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBMUFRJTSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzCisgKiAgQGJyaWVmICBMUFRJTSAgSVJRIGhhbmRsZXIuCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIExQVElNIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFja3MgICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIExQVElNIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMgY2FsbGVkIHdpdGhpbgorICAgICAgdGhlIElSUSBoYW5kbGVyOgorICAgKCspIExQVElNIGludGVycnVwdCByZXF1ZXN0IGhhbmRsZXIKKyAgICgrKSBDb21wYXJlIG1hdGNoIENhbGxiYWNrCisgICAoKykgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sKKyAgICgrKSBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjaworICAgKCspIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sKKyAgICgrKSBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjaworICAgKCspIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sKKyAgICgrKSBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgTFBUSU0gaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9MUFRJTV9JUlFIYW5kbGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBNKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQ01QTSkgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQ29tcGFyZSBtYXRjaCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBNKTsKKworICAgICAgLyogQ29tcGFyZSBtYXRjaCBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJSTSkgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgQXV0b3JlbG9hZCBtYXRjaCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKTsKKworICAgICAgLyogQXV0b3JlbG9hZCBtYXRjaCBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogVHJpZ2dlciBkZXRlY3RlZCBpbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19FWFRUUklHKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRykgIT0gUkVTRVQpCisgICAgeworICAgICAgLyogQ2xlYXIgVHJpZ2dlciBkZXRlY3RlZCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19FWFRUUklHKTsKKworICAgICAgLyogVHJpZ2dlciBkZXRlY3RlZCBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBDb21wYXJlIHdyaXRlIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIENvbXBhcmUgd3JpdGUgZmxhZyAqLworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworCisgICAgICAvKiBDb21wYXJlIHdyaXRlIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0NvbXBhcmVXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBBdXRvcmVsb2FkIHdyaXRlIGludGVycnVwdCAqLworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJST0spICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIEF1dG9yZWxvYWQgd3JpdGUgZmxhZyAqLworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworCisgICAgICAvKiBBdXRvcmVsb2FkIHdyaXRlIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZWxzZQorICAgICAgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBpbnRlcnJ1cHQgKi8KKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19VUCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX1VQKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICAvKiBDbGVhciBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBmbGFnICovCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19VUCk7CisKKyAgICAgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBEb3duIHRvIFVwIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjayhobHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisKKyAgLyogRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIFVwIHRvIERvd24gaW50ZXJydXB0ICovCisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfRE9XTikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX0RPV04pICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBVcCB0byBEb3duIGZsYWcgKi8KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0RPV04pOworCisgICAgICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2soaGxwdGltKTsKKyNlbHNlCisgICAgICBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrKGhscHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb21wYXJlIG1hdGNoIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQXV0b3JlbG9hZCBtYXRjaCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyaWdnZXIgZGV0ZWN0ZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmUgd3JpdGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChobHB0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBBdXRvcmVsb2FkIHdyaXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIERvd24gdG8gVXAgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhscHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIFVwIHRvIERvd24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGxwdGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBMUFRJTSBjYWxsYmFjayB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgTFBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEICAgICAgICBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCAgICAgICAgICBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCAgICBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgICAgIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUmVnaXN0ZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICAgICAgICAqaGxwdGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFBUSU1fQ2FsbGJhY2tUeXBlRGVmICAgICAgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGxwdGltKTsKKworICBpZiAoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkNvbXBhcmVNYXRjaENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX0RPV05fQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobHB0aW0pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIExQVElNIGNhbGxiYWNrCisgICogICAgICAgICBMTFBUSU0gY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEICAgICAgICAgIExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEICAgIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9XUklURV9DQl9JRCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEICAgICBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCAgIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgICAgICAgICpobHB0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhobHB0aW0pOworCisgIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tcGFyZSBtYXRjaCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayA9IEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrID0gSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrID0gSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhobHB0aW0pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9Hcm91cDUgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgTFBUSU0gaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfTFBUSU1fU3RhdGVUeXBlRGVmIEhBTF9MUFRJTV9HZXRTdGF0ZShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCit7CisgIC8qIFJldHVybiBMUFRJTSBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhscHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBMUFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBMUFRJTSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcy4KKyAgKiBAcGFyYW0gIGxwdGltIHBvaW50ZXIgdG8gYSBMUFRJTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIExQVElNIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIExQVElNX1Jlc2V0Q2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pCit7CisgIC8qIFJlc2V0IHRoZSBMUFRJTSBjYWxsYmFjayB0byB0aGUgbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgIGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayAgICA9IEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjazsgICAgLyogQ29tcGFyZSBtYXRjaCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgbHB0aW0tPkF1dG9SZWxvYWRNYXRjaENhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrOyAvKiBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayAgICAgICAgICAgICAgICAgICAqLworICBscHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgPSBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrOyAgICAgICAgIC8qIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrICAgICovCisgIGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayAgICA9IEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjazsgICAgLyogQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAgICAgKi8KKyAgbHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrOyAvKiBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAqLworICBscHRpbS0+RGlyZWN0aW9uVXBDYWxsYmFjayAgICAgPSBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjazsgICAgIC8qIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgICAgICAgICovCisgIGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2sgICA9IEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2s7ICAgLyogRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgKi8KK30KKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTFBUSU0gSFcgaW5zdGFuY2UuCisgICogQHBhcmFtICBscHRpbSBwb2ludGVyIHRvIGEgTFBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBMUFRJTSBtb2R1bGUuCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExQVElNX0Rpc2FibGUoTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pCit7CisgIHVpbnQzMl90IHRtcGNsa3NvdXJjZSA9IDA7CisgIHVpbnQzMl90IHRtcElFUjsKKyAgdWludDMyX3QgdG1wQ0ZHUjsKKyAgdWludDMyX3QgdG1wQ01QOworICB1aW50MzJfdCB0bXBBUlI7CisgIHVpbnQzMl90IHRtcE9SOworCisgIF9fZGlzYWJsZV9pcnEoKTsKKworICAvKioqKioqKioqKiogU2F2ZSBMUFRJTSBDb25maWcgKioqKioqKioqKiovCisgIC8qIFNhdmUgTFBUSU0gc291cmNlIGNsb2NrICovCisgIHN3aXRjaCAoKHVpbnQzMl90KWxwdGltLT5JbnN0YW5jZSkKKyAgeworICAgICBjYXNlIExQVElNMV9CQVNFOgorICAgICAgIHRtcGNsa3NvdXJjZSA9IF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpOworICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoTFBUSU0yKQorICAgICBjYXNlIExQVElNMl9CQVNFOgorICAgICAgIHRtcGNsa3NvdXJjZSA9IF9fSEFMX1JDQ19HRVRfTFBUSU0yX1NPVVJDRSgpOworICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICBkZWZhdWx0OgorICAgICAgIGJyZWFrOworICB9CisKKyAgLyogU2F2ZSBMUFRJTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworICB0bXBJRVIgPSBscHRpbS0+SW5zdGFuY2UtPklFUjsKKyAgdG1wQ0ZHUiA9IGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKKyAgdG1wQ01QID0gbHB0aW0tPkluc3RhbmNlLT5DTVA7CisgIHRtcEFSUiA9IGxwdGltLT5JbnN0YW5jZS0+QVJSOworICB0bXBPUiA9IGxwdGltLT5JbnN0YW5jZS0+T1I7CisKKyAgLyoqKioqKioqKioqIFJlc2V0IExQVElNICoqKioqKioqKioqLworICBzd2l0Y2ggKCh1aW50MzJfdClscHRpbS0+SW5zdGFuY2UpCisgIHsKKyAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCk7CisgICAgICAgX19IQUxfUkNDX0xQVElNMV9SRUxFQVNFX1JFU0VUKCk7CisgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgX19IQUxfUkNDX0xQVElNMl9GT1JDRV9SRVNFVCgpOworICAgICAgIF9fSEFMX1JDQ19MUFRJTTJfUkVMRUFTRV9SRVNFVCgpOworICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICBkZWZhdWx0OgorICAgICAgIGJyZWFrOworICB9CisKKyAgLyoqKioqKioqKioqIFJlc3RvcmUgTFBUSU0gQ29uZmlnICoqKioqKioqKioqLworICB1aW50MzJfdCBSZWZfVGltZTsKKyAgdWludDMyX3QgVGltZV9FbGFwc2VkOworCisgIGlmICgodG1wQ01QICE9IDBVTCkgfHwgKHRtcEFSUiAhPSAwVUwpKQorICB7CisgICAgLyogRm9yY2UgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayBmcm9tIEFQQiAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KWxwdGltLT5JbnN0YW5jZSkKKyAgICB7CisgICAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICAgIF9fSEFMX1JDQ19MUFRJTTFfQ09ORklHKFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSzEpOworICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgICAgY2FzZSBMUFRJTTJfQkFTRToKKyAgICAgICAgIF9fSEFMX1JDQ19MUFRJTTJfQ09ORklHKFJDQ19MUFRJTTJDTEtTT1VSQ0VfUENMSzEpOworICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFBUSU0yICovCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0bXBDTVAgIT0gMFVMKQorICAgIHsKKyAgICAgIC8qIFJlc3RvcmUgQ01QIHJlZ2lzdGVyIChMUFRJTSBzaG91bGQgYmUgZW5hYmxlZCBmaXJzdCkgKi8KKyAgICAgIGxwdGltLT5JbnN0YW5jZS0+Q1IgfD0gTFBUSU1fQ1JfRU5BQkxFOworICAgICAgbHB0aW0tPkluc3RhbmNlLT5DTVAgPSB0bXBDTVA7CisgICAgICAvKiBQb2xsaW5nIG9uIENNUCB3cml0ZSBvayBzdGF0dXMgYWZ0ZXIgYWJvdmUgcmVzdG9yZSBvcGVyYXRpb24gKi8KKyAgICAgIFJlZl9UaW1lID0gSEFMX0dldFRpY2soKTsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIFRpbWVfRWxhcHNlZCA9IEhBTF9HZXRUaWNrKCkgLSBSZWZfVGltZTsKKyAgICAgIH0gd2hpbGUgKCghKF9fSEFMX0xQVElNX0dFVF9GTEFHKGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSkpICYmIChUaW1lX0VsYXBzZWQgPD0gVElNRU9VVCkpOworCisgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKTsKKyAgICB9CisKKyAgICBpZiAodG1wQVJSICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIEFSUiByZWdpc3RlciAoTFBUSU0gc2hvdWxkIGJlIGVuYWJsZWQgZmlyc3QpICovCisgICAgICBscHRpbS0+SW5zdGFuY2UtPkNSIHw9IExQVElNX0NSX0VOQUJMRTsKKyAgICAgIGxwdGltLT5JbnN0YW5jZS0+QVJSID0gdG1wQVJSOworICAgICAgLyogUG9sbGluZyBvbiBBUlIgd3JpdGUgb2sgc3RhdHVzIGFmdGVyIGFib3ZlIHJlc3RvcmUgb3BlcmF0aW9uICovCisgICAgICBSZWZfVGltZSA9IEhBTF9HZXRUaWNrKCk7CisgICAgICBkbworICAgICAgeworICAgICAgICBUaW1lX0VsYXBzZWQgPSBIQUxfR2V0VGljaygpIC0gUmVmX1RpbWU7CisgICAgICB9IHdoaWxlICgoIShfX0hBTF9MUFRJTV9HRVRfRkxBRyhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykpKSAmJiAoVGltZV9FbGFwc2VkIDw9IFRJTUVPVVQpKTsKKworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisgICAgfQorCisgICAgLyogUmVzdG9yZSBMUFRJTSBzb3VyY2Uga2VybmVsIGNsb2NrICovCisgICAgc3dpdGNoICgodWludDMyX3QpbHB0aW0tPkluc3RhbmNlKQorICAgIHsKKyAgICAgICBjYXNlIExQVElNMV9CQVNFOgorICAgICAgICAgX19IQUxfUkNDX0xQVElNMV9DT05GSUcodG1wY2xrc291cmNlKTsKKyAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoTFBUSU0yKQorICAgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgICBfX0hBTF9SQ0NfTFBUSU0yX0NPTkZJRyh0bXBjbGtzb3VyY2UpOworICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogTFBUSU0yICovCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIFJlc3RvcmUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKExQVElNIHNob3VsZCBiZSBkaXNhYmxlZCBmaXJzdCkgKi8KKyAgbHB0aW0tPkluc3RhbmNlLT5DUiAmPSB+KExQVElNX0NSX0VOQUJMRSk7CisgIGxwdGltLT5JbnN0YW5jZS0+SUVSID0gdG1wSUVSOworICBscHRpbS0+SW5zdGFuY2UtPkNGR1IgPSB0bXBDRkdSOworICBscHRpbS0+SW5zdGFuY2UtPk9SID0gdG1wT1I7CisKKyAgX19lbmFibGVfaXJxKCk7Cit9CisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIExQVElNMSB8fCBMUFRJTTIgKi8KKworI2VuZGlmIC8qIEhBTF9MUFRJTV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX21zcF90ZW1wbGF0ZS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfbXNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4NjNjMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX21zcF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9tc3BfdGVtcGxhdGUuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBIQUwgU3lzdGVtIGFuZCBQZXJpcGhlcmFsIChQUFApIE1TUCBpbml0aWFsaXphdGlvbgorICAqICAgICAgICAgIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgICogICAgICAgICAgSXQgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCByZW5hbWVkIGludG8gJ3N0bTMyd2J4eF9oYWxfbXNwLmMnLiAgICAgICAgICAgCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLyAKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX01TUCBIQUwgTVNQCisgICogQGJyaWVmIEhBTCBNU1AgbW9kdWxlLgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBIQUxfTVNQX1ByaXZhdGVfRnVuY3Rpb25zIEhBTCBNU1AgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBHbG9iYWwgTVNQLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBIQUxfSW5pdCgpIGZ1bmN0aW9uIHRvIHBlcmZvcm0gc3lzdGVtCisgICogICAgICAgICBsZXZlbCBpbml0aWFsaXphdGlvbiAoR1BJT3MsIGNsb2NrLCBETUEsIGludGVycnVwdCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9Nc3BJbml0KHZvaWQpCit7CisKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBHbG9iYWwgTVNQLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbmEgaXMgY2FsbGVkIGZyb20gSEFMX0RlSW5pdCgpIGZ1bmN0aW9uIHRvIHBlcmZvcm0gc3lzdGVtCisgICogICAgICAgICBsZXZlbCBkZS1pbml0aWFsaXphdGlvbiAoR1BJT3MsIGNsb2NrLCBETUEsIGludGVycnVwdCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9Nc3BEZUluaXQodm9pZCkKK3sKKworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBQUFAgTVNQLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbmEgaXMgY2FsbGVkIGZyb20gSEFMX1BQUF9Jbml0KCkgZnVuY3Rpb24gdG8gcGVyZm9ybSAKKyAgKiAgICAgICAgIHBlcmlwaGVyYWwoUFBQKSBzeXN0ZW0gbGV2ZWwgaW5pdGlhbGl6YXRpb24gKEdQSU9zLCBjbG9jaywgRE1BLCBpbnRlcnJ1cHQpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QUFBfTXNwSW5pdCh2b2lkKQoreworCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgUFBQIE1TUC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb25hIGlzIGNhbGxlZCBmcm9tIEhBTF9QUFBfRGVJbml0KCkgZnVuY3Rpb24gdG8gcGVyZm9ybSAKKyAgKiAgICAgICAgIHBlcmlwaGVyYWwoUFBQKSBzeXN0ZW0gbGV2ZWwgZGUtaW5pdGlhbGl6YXRpb24gKEdQSU9zLCBjbG9jaywgRE1BLCBpbnRlcnJ1cHQpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QUFBfTXNwRGVJbml0KHZvaWQpCit7CisKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3BjZC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfcGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMTZhZQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3BjZC5jCkBAIC0wLDAgKzEsMTg2MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcGNkLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBDRCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBQQ0QgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorCisgICAgICgjKSBEZWNsYXJlIGEgUENEX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICBQQ0RfSGFuZGxlVHlwZURlZiAgaHBjZDsKKworICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIEhDRCBoYW5kbGUKKworICAgICAoIykgQ2FsbCBIQUxfUENEX0luaXQoKSBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgUENEIHBlcmlwaGVyYWwgKENvcmUsIERldmljZSBjb3JlLCAuLi4pCisKKyAgICAgKCMpIEluaXRpYWxpemUgdGhlIFBDRCBsb3cgbGV2ZWwgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEhBTF9QQ0RfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgICgjIykgRW5hYmxlIHRoZSBQQ0QvVVNCIExvdyBMZXZlbCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcKKyAgICAgICAgICAgICAgKCsrKykgX19IQUxfUkNDX1VTQl9DTEtfRU5BQkxFKCk7IEZvciBVU0IgRGV2aWNlIG9ubHkgRlMgcGVyaXBoZXJhbAorCisgICAgICAgICAoIyMpIEluaXRpYWxpemUgdGhlIHJlbGF0ZWQgR1BJTyBjbG9ja3MKKyAgICAgICAgICgjIykgQ29uZmlndXJlIFBDRCBwaW4tb3V0CisgICAgICAgICAoIyMpIENvbmZpZ3VyZSBQQ0QgTlZJQyBpbnRlcnJ1cHQKKworICAgICAoIylBc3NvY2lhdGUgdGhlIFVwcGVyIFVTQiBkZXZpY2Ugc3RhY2sgdG8gdGhlIEhBTCBQQ0QgRHJpdmVyOgorICAgICAgICAgKCMjKSBocGNkLnBEYXRhID0gcGRldjsKKworICAgICAoIylFbmFibGUgUENEIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uOgorICAgICAgICAgKCMjKSBIQUxfUENEX1N0YXJ0KCk7CisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEIFBDRAorICAqIEBicmllZiBQQ0QgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1BDRF9NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZCAoVVNCKQorCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9NYWNyb3MgUENEIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUENEX01JTihhLCBiKSAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBQQ0RfTUFYKGEsIGIpICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQQ0RfUHJpdmF0ZV9GdW5jdGlvbnMgUENEIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFBDRF9FUF9JU1JfSGFuZGxlcihQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBDRF9FeHBvcnRlZF9GdW5jdGlvbnMgUENEIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFBDRCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgUENEX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9Jbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICB1aW50OF90IGk7CisKKyAgLyogQ2hlY2sgdGhlIFBDRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHBjZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QQ0RfQUxMX0lOU1RBTkNFKGhwY2QtPkluc3RhbmNlKSk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHBjZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+U09GQ2FsbGJhY2sgPSBIQUxfUENEX1NPRkNhbGxiYWNrOworICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOworICAgIGhwY2QtPlJlc2V0Q2FsbGJhY2sgPSBIQUxfUENEX1Jlc2V0Q2FsbGJhY2s7CisgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrID0gSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2s7CisgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOworICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfQ29ubmVjdENhbGxiYWNrOworICAgIGhwY2QtPkRpc2Nvbm5lY3RDYWxsYmFjayA9IEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrOworICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjazsKKyAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrOworICAgIGhwY2QtPklTT09VVEluY29tcGxldGVDYWxsYmFjayA9IEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrOworICAgIGhwY2QtPklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrID0gSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjazsKKyAgICBocGNkLT5MUE1DYWxsYmFjayA9IEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2s7CisgICAgaHBjZC0+QkNEQ2FsbGJhY2sgPSBIQUxfUENERXhfQkNEX0NhbGxiYWNrOworCisgICAgaWYgKGhwY2QtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsKKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2soaHBjZCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgICAgSEFMX1BDRF9Nc3BJbml0KGhwY2QpOworI2VuZGlmIC8qIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnRlcnJ1cHRzICovCisgIF9fSEFMX1BDRF9ESVNBQkxFKGhwY2QpOworCisgIC8qIEluaXQgZW5kcG9pbnRzIHN0cnVjdHVyZXMgKi8KKyAgZm9yIChpID0gMFU7IGkgPCBocGNkLT5Jbml0LmRldl9lbmRwb2ludHM7IGkrKykKKyAgeworICAgIC8qIEluaXQgZXAgc3RydWN0dXJlICovCisgICAgaHBjZC0+SU5fZXBbaV0uaXNfaW4gPSAxVTsKKyAgICBocGNkLT5JTl9lcFtpXS5udW0gPSBpOworICAgIGhwY2QtPklOX2VwW2ldLnR4X2ZpZm9fbnVtID0gaTsKKyAgICAvKiBDb250cm9sIHVudGlsIGVwIGlzIGFjdGl2YXRlZCAqLworICAgIGhwY2QtPklOX2VwW2ldLnR5cGUgPSBFUF9UWVBFX0NUUkw7CisgICAgaHBjZC0+SU5fZXBbaV0ubWF4cGFja2V0ID0gMFU7CisgICAgaHBjZC0+SU5fZXBbaV0ueGZlcl9idWZmID0gMFU7CisgICAgaHBjZC0+SU5fZXBbaV0ueGZlcl9sZW4gPSAwVTsKKyAgfQorCisgIGZvciAoaSA9IDBVOyBpIDwgaHBjZC0+SW5pdC5kZXZfZW5kcG9pbnRzOyBpKyspCisgIHsKKyAgICBocGNkLT5PVVRfZXBbaV0uaXNfaW4gPSAwVTsKKyAgICBocGNkLT5PVVRfZXBbaV0ubnVtID0gaTsKKyAgICAvKiBDb250cm9sIHVudGlsIGVwIGlzIGFjdGl2YXRlZCAqLworICAgIGhwY2QtPk9VVF9lcFtpXS50eXBlID0gRVBfVFlQRV9DVFJMOworICAgIGhwY2QtPk9VVF9lcFtpXS5tYXhwYWNrZXQgPSAwVTsKKyAgICBocGNkLT5PVVRfZXBbaV0ueGZlcl9idWZmID0gMFU7CisgICAgaHBjZC0+T1VUX2VwW2ldLnhmZXJfbGVuID0gMFU7CisgIH0KKworICAvKiBJbml0IERldmljZSAqLworICAodm9pZClVU0JfRGV2SW5pdChocGNkLT5JbnN0YW5jZSwgaHBjZC0+SW5pdCk7CisKKyAgaHBjZC0+VVNCX0FkZHJlc3MgPSAwVTsKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX1JFQURZOworICAKKyAgLyogQWN0aXZhdGUgTFBNICovCisgIGlmIChocGNkLT5Jbml0LmxwbV9lbmFibGUgPT0gMVUpCisgIHsKKyAgICAodm9pZClIQUxfUENERXhfQWN0aXZhdGVMUE0oaHBjZCk7CisgIH0KKyAgCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgUENEIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGVJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChocGNkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CisKKyAgLyogU3RvcCBEZXZpY2UgKi8KKyAgKHZvaWQpSEFMX1BDRF9TdG9wKGhwY2QpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaWYgKGhwY2QtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLworICBIQUxfUENEX01zcERlSW5pdChocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBocGNkLT5TdGF0ZSA9IEhBTF9QQ0RfU1RBVEVfUkVTRVQ7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUENEIE1TUC4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9Nc3BJbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBQQ0QgTVNQLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX01zcERlSW5pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVVNCIFBDRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU09GX0NCX0lEIFVTQiBQQ0QgU09GIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCBVU0IgUENEIFNldHVwIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgVVNCIFBDRCBSZXNldCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgVVNCIFBDRCBTdXNwZW5kIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIFVTQiBQQ0QgUmVzdW1lIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCBVU0IgUENEIENvbm5lY3QgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIE9URyBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX01TUElOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIEhBTF9QQ0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFBDRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX1NPRl9DQl9JRCA6CisgICAgICAgIGhwY2QtPlNPRkNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NFVFVQU1RBR0VfQ0JfSUQgOgorICAgICAgICBocGNkLT5TZXR1cFN0YWdlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTRVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5SZXNldENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgOgorICAgICAgICBocGNkLT5TdXNwZW5kQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCA6CisgICAgICAgIGhwY2QtPkNvbm5lY3RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gVVNCIFBDRCBDYWxsYmFjaworICAqICAgICAgICAgVVNCIFBDRCBjYWxsYWJjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgVVNCIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TT0ZfQ0JfSUQgVVNCIFBDRCBTT0YgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9TRVRVUFNUQUdFX0NCX0lEIFVTQiBQQ0QgU2V0dXAgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNFVF9DQl9JRCBVU0IgUENEIFJlc2V0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCBVU0IgUENEIFN1c3BlbmQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9SRVNVTUVfQ0JfSUQgVVNCIFBDRCBSZXN1bWUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9DT05ORUNUX0NCX0lEIFVTQiBQQ0QgQ29ubmVjdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgT1RHIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgSEFMX1BDRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICAvKiBTZXR1cCBMZWdhY3kgd2VhayBDYWxsYmFja3MgICovCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1BDRF9TT0ZfQ0JfSUQgOgorICAgICAgICBocGNkLT5TT0ZDYWxsYmFjayA9IEhBTF9QQ0RfU09GQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfU0VUVVBTVEFHRV9DQl9JRCA6CisgICAgICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayA9IEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX1JFU0VUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzZXRDYWxsYmFjayA9IEhBTF9QQ0RfUmVzZXRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9TVVNQRU5EX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrID0gSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfUkVTVU1FX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2sgPSBIQUxfUENEX1Jlc3VtZUNhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQgOgorICAgICAgICBocGNkLT5Db25uZWN0Q2FsbGJhY2sgPSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+RGlzY29ubmVjdENhbGxiYWNrID0gSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhwY2QtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9QQ0RfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUENEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QQ0RfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBjZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUENEX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgRGF0YSBPVVQgU3RhZ2UgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjaworICAqICAgICAgICAgVVNCIFBDRCBEYXRhIE9VVCBTdGFnZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckRhdGFPdXRTdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrID0gSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgRGF0YU91dFN0YWdlQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgRGF0YSBJTiBTdGFnZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckRhdGFJblN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfRGF0YUluU3RhZ2VDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhwY2QpOworCisgIGlmIChocGNkLT5TdGF0ZSA9PSBIQUxfUENEX1NUQVRFX1JFQURZKQorICB7CisgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBEYXRhIElOIFN0YWdlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIERhdGEgT1VUIFN0YWdlIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJEYXRhSW5TdGFnZUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2sgPSBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIERhdGFJblN0YWdlQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3Rlcklzb091dEluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb091dEluY3BsdENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVuUmVnaXN0ZXIgdGhlIFVTQiBQQ0QgSXNvIE9VVCBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIElzbyBPVVQgaW5jb21wbGV0ZSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RfSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJJc29PdXRJbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2sgPSBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgSVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgSXNvIElOIGluY29tcGxldGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfUmVnaXN0ZXJJc29JbkluY3BsdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0lzb0luSW5jcGx0Q2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPklTT0lOSW5jb21wbGV0ZUNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrCisgICogICAgICAgICBVU0IgUENEIElzbyBJTiBpbmNvbXBsZXRlIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1BDRF9JU09JTkluY29tcGxldGVDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9VblJlZ2lzdGVySXNvSW5JbmNwbHRDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5JU09JTkluY29tcGxldGVDYWxsYmFjayA9IEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIElTT0lOSW5jb21wbGV0ZUNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBVU0IgUENEIEJDRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBVU0IgUENEIEJDRCBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9SZWdpc3RlckJjZENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCBwUENEX0JjZENhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgVVNCIFBDRCBCQ0QgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFVTQiBCQ0QgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUENERXhfQkNEX0NhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1VuUmVnaXN0ZXJCY2RDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocGNkLT5CQ0RDYWxsYmFjayA9IEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2sgICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBjZC0+RXJyb3JDb2RlIHw9IEhBTF9QQ0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIFVTQiBQQ0QgTFBNIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIFVTQiBQQ0QgTFBNIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1JlZ2lzdGVyTHBtQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHBQQ0RfTHBtQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkxQTUNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwY2QtPkVycm9yQ29kZSB8PSBIQUxfUENEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBVU0IgUENEIExQTSBDYWxsYmFjaworICAqICAgICAgICAgVVNCIExQTSBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfVW5SZWdpc3RlckxwbUNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocGNkKTsKKworICBpZiAoaHBjZC0+U3RhdGUgPT0gSEFMX1BDRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGhwY2QtPkxQTUNhbGxiYWNrID0gSEFMX1BDREV4X0xQTV9DYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgSEFMX1BDREV4X0xQTV9DYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocGNkLT5FcnJvckNvZGUgfD0gSEFMX1BDRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBQQ0QgZGF0YQorICAgIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgVVNCIGRldmljZQorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0YXJ0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGV2Q29ubmVjdChocGNkLT5JbnN0YW5jZSk7CisgIF9fSEFMX1BDRF9FTkFCTEUoaHBjZCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBVU0IgZGV2aWNlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX1N0b3AoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIF9fSEFMX0xPQ0soaHBjZCk7CisgIF9fSEFMX1BDRF9ESVNBQkxFKGhwY2QpOworCisgICh2b2lkKVVTQl9TdG9wRGV2aWNlKGhwY2QtPkluc3RhbmNlKTsKKworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0QgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BDRF9JUlFIYW5kbGVyKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX0NUUikpCisgIHsKKyAgICAvKiBzZXJ2aWNpbmcgb2YgdGhlIGVuZHBvaW50IGNvcnJlY3QgdHJhbnNmZXIgaW50ZXJydXB0ICovCisgICAgLyogY2xlYXIgb2YgdGhlIENUUiBmbGFnIGludG8gdGhlIHN1YiAqLworICAgICh2b2lkKVBDRF9FUF9JU1JfSGFuZGxlcihocGNkKTsKKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUkVTRVQpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUkVTRVQpOworCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5SZXNldENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICBIQUxfUENEX1Jlc2V0Q2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAodm9pZClIQUxfUENEX1NldEFkZHJlc3MoaHBjZCwgMFUpOworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9QTUFPVlIpKQorICB7CisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfUE1BT1ZSKTsKKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfRVJSKSkKKyAgeworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX0VSUik7CisgIH0KKworICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX1dLVVApKQorICB7CisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj0gKHVpbnQxNl90KSB+KFVTQl9DTlRSX0xQTU9ERSk7CisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgJj0gKHVpbnQxNl90KSB+KFVTQl9DTlRSX0ZTVVNQKTsKKworICAgIGlmIChocGNkLT5MUE1fU3RhdGUgPT0gTFBNX0wxKQorICAgIHsKKyAgICAgIGhwY2QtPkxQTV9TdGF0ZSA9IExQTV9MMDsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+TFBNQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMF9BQ1RJVkUpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9MUE1fQ2FsbGJhY2soaHBjZCwgUENEX0xQTV9MMF9BQ1RJVkUpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+UmVzdW1lQ2FsbGJhY2soaHBjZCk7CisjZWxzZQorICAgIEhBTF9QQ0RfUmVzdW1lQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfSVNUUl9XS1VQKTsKKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfU1VTUCkpCisgIHsKKyAgICAvKiBGb3JjZSBsb3ctcG93ZXIgbW9kZSBpbiB0aGUgbWFjcm9jZWxsICovCisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfRlNVU1A7CisKKyAgICAvKiBjbGVhciBvZiB0aGUgSVNUUiBiaXQgbXVzdCBiZSBkb25lIGFmdGVyIHNldHRpbmcgb2YgQ05UUl9GU1VTUCAqLworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1NVU1ApOworCisgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfTFBNT0RFOworCisgICAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9XS1VQKSA9PSAwVSkKKyAgICB7CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPlN1c3BlbmRDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgICBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayhocGNkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBIYW5kbGUgTFBNIEludGVycnVwdCAqLworICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9JU1RSX0wxUkVRKSkKKyAgeworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX0wxUkVRKTsKKyAgICBpZiAoaHBjZC0+TFBNX1N0YXRlID09IExQTV9MMCkKKyAgICB7CisgICAgICAvKiBGb3JjZSBzdXNwZW5kIGFuZCBsb3ctcG93ZXIgbW9kZSBiZWZvcmUgZ29pbmcgdG8gTDEgc3RhdGUqLworICAgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfTFBNT0RFOworICAgICAgaHBjZC0+SW5zdGFuY2UtPkNOVFIgfD0gVVNCX0NOVFJfRlNVU1A7CisKKyAgICAgIGhwY2QtPkxQTV9TdGF0ZSA9IExQTV9MMTsKKyAgICAgIGhwY2QtPkJFU0wgPSAoKHVpbnQzMl90KWhwY2QtPkluc3RhbmNlLT5MUE1DU1IgJiBVU0JfTFBNQ1NSX0JFU0wpID4+IDI7CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkxQTUNhbGxiYWNrKGhwY2QsIFBDRF9MUE1fTDFfQUNUSVZFKTsKKyNlbHNlCisgICAgICBIQUxfUENERXhfTFBNX0NhbGxiYWNrKGhwY2QsIFBDRF9MUE1fTDFfQUNUSVZFKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHBjZC0+U3VzcGVuZENhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RfU3VzcGVuZENhbGxiYWNrKGhwY2QpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX0lTVFJfU09GKSkKKyAgeworICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9JU1RSX1NPRik7CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhwY2QtPlNPRkNhbGxiYWNrKGhwY2QpOworI2Vsc2UKKyAgICBIQUxfUENEX1NPRkNhbGxiYWNrKGhwY2QpOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfSVNUUl9FU09GKSkKKyAgeworICAgIC8qIGNsZWFyIEVTT0YgZmxhZyBpbiBJU1RSICovCisgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX0lTVFJfRVNPRik7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgIERhdGEgT1VUIHN0YWdlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQoZXBudW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGF0YSBJTiBzdGFnZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcG51bSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorLyoqCisgICogQGJyaWVmICBTZXR1cCBzdGFnZSBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1NldHVwU3RhZ2VDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVVNCIFN0YXJ0IE9mIEZyYW1lIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUENEX1NPRkNhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9TT0ZDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQiBSZXNldCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9SZXNldENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9SZXNldENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBldmVudCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9TdXNwZW5kQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX1N1c3BlbmRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSBldmVudCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9SZXN1bWVDYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9QQ0RfUmVzdW1lQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJbmNvbXBsZXRlIElTTyBPVVQgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwbnVtIGVuZHBvaW50IG51bWJlcgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9JU09PVVRJbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQoZXBudW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0lTT09VVEluY29tcGxldGVDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEluY29tcGxldGUgSVNPIElOIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcG51bSBlbmRwb2ludCBudW1iZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfSVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBudW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQoZXBudW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0lTT0lOSW5jb21wbGV0ZUNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29ubmVjdGlvbiBldmVudCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BDRF9Db25uZWN0Q2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENEX0Nvbm5lY3RDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2Nvbm5lY3Rpb24gZXZlbnQgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RfRGlzY29ubmVjdENhbGxiYWNrKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGNkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDRF9EaXNjb25uZWN0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBQQ0QgZGF0YQorICAgIHRyYW5zZmVycy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25uZWN0IHRoZSBVU0IgZGV2aWNlCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRGV2Q29ubmVjdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgKHZvaWQpVVNCX0RldkNvbm5lY3QoaHBjZC0+SW5zdGFuY2UpOworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzY29ubmVjdCB0aGUgVVNCIGRldmljZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZXZEaXNjb25uZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGV2RGlzY29ubmVjdChocGNkLT5JbnN0YW5jZSk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFVTQiBEZXZpY2UgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEBwYXJhbSAgYWRkcmVzcyBuZXcgZGV2aWNlIGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfU2V0QWRkcmVzcyhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBhZGRyZXNzKQoreworICBfX0hBTF9MT0NLKGhwY2QpOworICBocGNkLT5VU0JfQWRkcmVzcyA9IGFkZHJlc3M7CisgICh2b2lkKVVTQl9TZXREZXZBZGRyZXNzKGhwY2QtPkluc3RhbmNlLCBhZGRyZXNzKTsKKyAgX19IQUxfVU5MT0NLKGhwY2QpOworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBPcGVuIGFuZCBjb25maWd1cmUgYW4gZW5kcG9pbnQuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEBwYXJhbSAgZXBfbXBzIGVuZHBvaW50IG1heCBwYWNrZXQgc2l6ZQorICAqIEBwYXJhbSAgZXBfdHlwZSBlbmRwb2ludCB0eXBlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0VQX09wZW4oUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkciwgdWludDE2X3QgZXBfbXBzLCB1aW50OF90IGVwX3R5cGUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmICByZXQgPSBIQUxfT0s7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIGlmICgoZXBfYWRkciAmIDB4ODBVKSA9PSAweDgwVSkKKyAgeworICAgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXAgPSAmaHBjZC0+T1VUX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisgICAgZXAtPmlzX2luID0gMFU7CisgIH0KKworICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOworICBlcC0+bWF4cGFja2V0ID0gZXBfbXBzOworICBlcC0+dHlwZSA9IGVwX3R5cGU7CisKKyAgaWYgKGVwLT5pc19pbiAhPSAwVSkKKyAgeworICAgIC8qIEFzc2lnbiBhIFR4IEZJRk8gKi8KKyAgICBlcC0+dHhfZmlmb19udW0gPSBlcC0+bnVtOworICB9CisgIC8qIFNldCBpbml0aWFsIGRhdGEgUElELiAqLworICBpZiAoZXBfdHlwZSA9PSBFUF9UWVBFX0JVTEspCisgIHsKKyAgICBlcC0+ZGF0YV9waWRfc3RhcnQgPSAwVTsKKyAgfQorCisgIF9fSEFMX0xPQ0soaHBjZCk7CisgICh2b2lkKVVTQl9BY3RpdmF0ZUVuZHBvaW50KGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgYW4gZW5kcG9pbnQuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9DbG9zZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyKQoreworICBQQ0RfRVBUeXBlRGVmICplcDsKKworICBpZiAoKGVwX2FkZHIgJiAweDgwVSkgPT0gMHg4MFUpCisgIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDFVOworICB9CisgIGVsc2UKKyAgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDBVOworICB9CisgIGVwLT5udW0gICA9IGVwX2FkZHIgJiBFUF9BRERSX01TSzsKKworICBfX0hBTF9MT0NLKGhwY2QpOworICAodm9pZClVU0JfRGVhY3RpdmF0ZUVuZHBvaW50KGhwY2QtPkluc3RhbmNlLCBlcCk7CisgIF9fSEFMX1VOTE9DSyhocGNkKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEBwYXJhbSAgcEJ1ZiBwb2ludGVyIHRvIHRoZSByZWNlcHRpb24gYnVmZmVyCisgICogQHBhcmFtICBsZW4gYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfUmVjZWl2ZShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworCisgIC8qc2V0dXAgYW5kIHN0YXJ0IHRoZSBYZmVyICovCisgIGVwLT54ZmVyX2J1ZmYgPSBwQnVmOworICBlcC0+eGZlcl9sZW4gPSBsZW47CisgIGVwLT54ZmVyX2NvdW50ID0gMFU7CisgIGVwLT5pc19pbiA9IDBVOworICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOworCisgIGlmICgoZXBfYWRkciAmIEVQX0FERFJfTVNLKSA9PSAwVSkKKyAgeworICAgICh2b2lkKVVTQl9FUDBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAodm9pZClVU0JfRVBTdGFydFhmZXIoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJlY2VpdmVkIERhdGEgU2l6ZQorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcmV0dmFsIERhdGEgU2l6ZQorICAqLwordWludDMyX3QgSEFMX1BDRF9FUF9HZXRSeENvdW50KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkLCB1aW50OF90IGVwX2FkZHIpCit7CisgIHJldHVybiBocGNkLT5PVVRfZXBbZXBfYWRkciAmIEVQX0FERFJfTVNLXS54ZmVyX2NvdW50OworfQorLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGVwX2FkZHIgZW5kcG9pbnQgYWRkcmVzcworICAqIEBwYXJhbSAgcEJ1ZiBwb2ludGVyIHRvIHRoZSB0cmFuc21pc3Npb24gYnVmZmVyCisgICogQHBhcmFtICBsZW4gYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9FUF9UcmFuc21pdChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgdWludDhfdCBlcF9hZGRyLCB1aW50OF90ICpwQnVmLCB1aW50MzJfdCBsZW4pCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworCisgIGVwID0gJmhwY2QtPklOX2VwW2VwX2FkZHIgJiBFUF9BRERSX01TS107CisKKyAgLypzZXR1cCBhbmQgc3RhcnQgdGhlIFhmZXIgKi8KKyAgZXAtPnhmZXJfYnVmZiA9IHBCdWY7CisgIGVwLT54ZmVyX2xlbiA9IGxlbjsKKyAgZXAtPnhmZXJfY291bnQgPSAwVTsKKyAgZXAtPmlzX2luID0gMVU7CisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisKKyAgaWYgKChlcF9hZGRyICYgRVBfQUREUl9NU0spID09IDBVKQorICB7CisgICAgKHZvaWQpVVNCX0VQMFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworICB9CisgIGVsc2UKKyAgeworICAgICh2b2lkKVVTQl9FUFN0YXJ0WGZlcihocGNkLT5JbnN0YW5jZSwgZXApOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgYSBTVEFMTCBjb25kaXRpb24gb3ZlciBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfU2V0U3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKCgodWludDMyX3QpZXBfYWRkciAmIEVQX0FERFJfTVNLKSA+IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoKDB4ODBVICYgZXBfYWRkcikgPT0gMHg4MFUpCisgIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDFVOworICB9CisgIGVsc2UKKyAgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyXTsKKyAgICBlcC0+aXNfaW4gPSAwVTsKKyAgfQorCisgIGVwLT5pc19zdGFsbCA9IDFVOworICBlcC0+bnVtID0gZXBfYWRkciAmIEVQX0FERFJfTVNLOworCisgIF9fSEFMX0xPQ0soaHBjZCk7CisKKyAgKHZvaWQpVVNCX0VQU2V0U3RhbGwoaHBjZC0+SW5zdGFuY2UsIGVwKTsKKyAgaWYgKChlcF9hZGRyICYgRVBfQUREUl9NU0spID09IDBVKQorICB7CisgICAgKHZvaWQpVVNCX0VQMF9PdXRTdGFydChocGNkLT5JbnN0YW5jZSwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCk7CisgIH0KKyAgX19IQUxfVU5MT0NLKGhwY2QpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgYSBTVEFMTCBjb25kaXRpb24gb3ZlciBpbiBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfQ2xyU3RhbGwoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgaWYgKCgodWludDMyX3QpZXBfYWRkciAmIDB4MEZVKSA+IGhwY2QtPkluaXQuZGV2X2VuZHBvaW50cykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoKDB4ODBVICYgZXBfYWRkcikgPT0gMHg4MFUpCisgIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDFVOworICB9CisgIGVsc2UKKyAgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICAgIGVwLT5pc19pbiA9IDBVOworICB9CisKKyAgZXAtPmlzX3N0YWxsID0gMFU7CisgIGVwLT5udW0gPSBlcF9hZGRyICYgRVBfQUREUl9NU0s7CisKKyAgX19IQUxfTE9DSyhocGNkKTsKKyAgKHZvaWQpVVNCX0VQQ2xlYXJTdGFsbChocGNkLT5JbnN0YW5jZSwgZXApOworICBfX0hBTF9VTkxPQ0soaHBjZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBGbHVzaCBhbiBlbmRwb2ludAorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBlcF9hZGRyIGVuZHBvaW50IGFkZHJlc3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RfRVBfRmx1c2goUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIHVpbnQ4X3QgZXBfYWRkcikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChlcF9hZGRyKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFjdGl2YXRlIHJlbW90ZSB3YWtldXAgc2lnbmFsbGluZworICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENEX0FjdGl2YXRlUmVtb3RlV2FrZXVwKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICByZXR1cm4gKFVTQl9BY3RpdmF0ZVJlbW90ZVdha2V1cChocGNkLT5JbnN0YW5jZSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWFjdGl2YXRlIHJlbW90ZSB3YWtldXAgc2lnbmFsbGluZy4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICByZXR1cm4gKFVTQl9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwKGhwY2QtPkluc3RhbmNlKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFBDRCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworUENEX1N0YXRlVHlwZURlZiBIQUxfUENEX0dldFN0YXRlKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICByZXR1cm4gaHBjZC0+U3RhdGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUENEX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQQ0QgRW5kcG9pbnQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBQQ0RfRVBfSVNSX0hhbmRsZXIoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QpCit7CisgIFBDRF9FUFR5cGVEZWYgKmVwOworICB1aW50MTZfdCBjb3VudDsKKyAgdWludDE2X3Qgd0lzdHI7CisgIHVpbnQxNl90IHdFUFZhbDsKKyAgdWludDhfdCBlcGluZGV4OworCisgIC8qIHN0YXkgaW4gbG9vcCB3aGlsZSBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgd2hpbGUgKChocGNkLT5JbnN0YW5jZS0+SVNUUiAmIFVTQl9JU1RSX0NUUikgIT0gMFUpCisgIHsKKyAgICB3SXN0ciA9IGhwY2QtPkluc3RhbmNlLT5JU1RSOworICAgIC8qIGV4dHJhY3QgaGlnaGVzdCBwcmlvcml0eSBlbmRwb2ludCBudW1iZXIgKi8KKyAgICBlcGluZGV4ID0gKHVpbnQ4X3QpKHdJc3RyICYgVVNCX0lTVFJfRVBfSUQpOworCisgICAgaWYgKGVwaW5kZXggPT0gMFUpCisgICAgeworICAgICAgLyogRGVjb2RlIGFuZCBzZXJ2aWNlIGNvbnRyb2wgZW5kcG9pbnQgaW50ZXJydXB0ICovCisKKyAgICAgIC8qIERJUiBiaXQgPSBvcmlnaW4gb2YgdGhlIGludGVycnVwdCAqLworICAgICAgaWYgKCh3SXN0ciAmIFVTQl9JU1RSX0RJUikgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERJUiA9IDAgKi8KKworICAgICAgICAvKiBESVIgPSAwICAgICAgPT4gSU4gIGludCAqLworICAgICAgICAvKiBESVIgPSAwIGltcGxpZXMgdGhhdCAoRVBfQ1RSX1RYID0gMSkgYWx3YXlzICAqLworICAgICAgICBQQ0RfQ0xFQVJfVFhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworICAgICAgICBlcCA9ICZocGNkLT5JTl9lcFswXTsKKworICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfVFhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgICAgZXAtPnhmZXJfYnVmZiArPSBlcC0+eGZlcl9jb3VudDsKKworICAgICAgICAvKiBUWCBDT01QTEVURSAqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2Vsc2UKKyAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIDBVKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgICBpZiAoKGhwY2QtPlVTQl9BZGRyZXNzID4gMFUpICYmIChlcC0+eGZlcl9sZW4gPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgaHBjZC0+SW5zdGFuY2UtPkRBRERSID0gKCh1aW50MTZfdClocGNkLT5VU0JfQWRkcmVzcyB8IFVTQl9EQUREUl9FRik7CisgICAgICAgICAgaHBjZC0+VVNCX0FkZHJlc3MgPSAwVTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBESVIgPSAxICovCisKKyAgICAgICAgLyogRElSID0gMSAmIENUUl9SWCAgICAgICA9PiBTRVRVUCBvciBPVVQgaW50ICovCisgICAgICAgIC8qIERJUiA9IDEgJiAoQ1RSX1RYIHwgQ1RSX1JYKSA9PiAyIGludCBwZW5kaW5nICovCisgICAgICAgIGVwID0gJmhwY2QtPk9VVF9lcFswXTsKKyAgICAgICAgd0VQVmFsID0gUENEX0dFVF9FTkRQT0lOVChocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsKKworICAgICAgICBpZiAoKHdFUFZhbCAmIFVTQl9FUF9TRVRVUCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZXQgU0VUVVAgUGFja2V0Ki8KKyAgICAgICAgICBlcC0+eGZlcl9jb3VudCA9IFBDRF9HRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtKTsKKyAgICAgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCwgZXAtPnBtYWFkcmVzcywgKHVpbnQxNl90KWVwLT54ZmVyX2NvdW50KTsKKyAgICAgICAgICAvKiBTRVRVUCBiaXQga2VwdCBmcm96ZW4gd2hpbGUgQ1RSX1JYID0gMSovCisgICAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgUENEX0VORFAwKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgU0VUVVAgUGFja2V0Ki8KKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIGhwY2QtPlNldHVwU3RhZ2VDYWxsYmFjayhocGNkKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2soaHBjZCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmICgod0VQVmFsICYgVVNCX0VQX0NUUl9SWCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBQQ0RfQ0xFQVJfUlhfRVBfQ1RSKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDApOworICAgICAgICAgIC8qIEdldCBDb250cm9sIERhdGEgT1VUIFBhY2tldCovCisgICAgICAgICAgZXAtPnhmZXJfY291bnQgPSBQQ0RfR0VUX0VQX1JYX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisKKyAgICAgICAgICBpZiAoZXAtPnhmZXJfY291bnQgIT0gMFUpCisgICAgICAgICAgeworICAgICAgICAgICAgVVNCX1JlYWRQTUEoaHBjZC0+SW5zdGFuY2UsIGVwLT54ZmVyX2J1ZmYsIGVwLT5wbWFhZHJlc3MsICh1aW50MTZfdCllcC0+eGZlcl9jb3VudCk7CisgICAgICAgICAgICBlcC0+eGZlcl9idWZmICs9IGVwLT54ZmVyX2NvdW50OworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFByb2Nlc3MgQ29udHJvbCBEYXRhIE9VVCBQYWNrZXQqLworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgMFUpOworI2Vsc2UKKyAgICAgICAgICBIQUxfUENEX0RhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsIDBVKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDAsIGVwLT5tYXhwYWNrZXQpOworICAgICAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKGhwY2QtPkluc3RhbmNlLCBQQ0RfRU5EUDAsIFVTQl9FUF9SWF9WQUxJRCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERlY29kZSBhbmQgc2VydmljZSBub24gY29udHJvbCBlbmRwb2ludHMgaW50ZXJydXB0ICAqLworCisgICAgICAvKiBwcm9jZXNzIHJlbGF0ZWQgZW5kcG9pbnQgcmVnaXN0ZXIgKi8KKyAgICAgIHdFUFZhbCA9IFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIGVwaW5kZXgpOworICAgICAgaWYgKCh3RVBWYWwgJiBVU0JfRVBfQ1RSX1JYKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogY2xlYXIgaW50IGZsYWcgKi8KKyAgICAgICAgUENEX0NMRUFSX1JYX0VQX0NUUihocGNkLT5JbnN0YW5jZSwgZXBpbmRleCk7CisgICAgICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcGluZGV4XTsKKworICAgICAgICAvKiBPVVQgZG91YmxlIEJ1ZmZlcmluZyovCisgICAgICAgIGlmIChlcC0+ZG91YmxlYnVmZmVyID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgY291bnQgPSAodWludDE2X3QpUENEX0dFVF9FUF9SWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICAgIGlmIChjb3VudCAhPSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBVU0JfUmVhZFBNQShocGNkLT5JbnN0YW5jZSwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgY291bnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKFBDRF9HRVRfRU5EUE9JTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pICYgVVNCX0VQX0RUT0dfUlgpICE9IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qcmVhZCBmcm9tIGVuZHBvaW50IEJVRjBBZGRyIGJ1ZmZlciovCisgICAgICAgICAgICBjb3VudCA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYwX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMFUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjAsIGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qcmVhZCBmcm9tIGVuZHBvaW50IEJVRjFBZGRyIGJ1ZmZlciovCisgICAgICAgICAgICBjb3VudCA9ICh1aW50MTZfdClQQ0RfR0VUX0VQX0RCVUYxX0NOVChocGNkLT5JbnN0YW5jZSwgZXAtPm51bSk7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMFUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFVTQl9SZWFkUE1BKGhwY2QtPkluc3RhbmNlLCBlcC0+eGZlcl9idWZmLCBlcC0+cG1hYWRkcjEsIGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLyogZnJlZSBFUCBPVVQgQnVmZmVyICovCisgICAgICAgICAgUENEX0ZyZWVVc2VyQnVmZmVyKGhwY2QtPkluc3RhbmNlLCBlcC0+bnVtLCAwVSk7CisgICAgICAgIH0KKyAgICAgICAgLyptdWx0aS1wYWNrZXQgb24gdGhlIE5PTiBjb250cm9sIE9VVCBlbmRwb2ludCovCisgICAgICAgIGVwLT54ZmVyX2NvdW50ICs9IGNvdW50OworICAgICAgICBlcC0+eGZlcl9idWZmICs9IGNvdW50OworCisgICAgICAgIGlmICgoZXAtPnhmZXJfbGVuID09IDBVKSB8fCAoY291bnQgPCBlcC0+bWF4cGFja2V0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJYIENPTVBMRVRFICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCBlcC0+bnVtKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAodm9pZClIQUxfUENEX0VQX1JlY2VpdmUoaHBjZCwgZXAtPm51bSwgZXAtPnhmZXJfYnVmZiwgZXAtPnhmZXJfbGVuKTsKKyAgICAgICAgfQorCisgICAgICB9IC8qIGlmKCh3RVBWYWwgJiBFUF9DVFJfUlgpICovCisKKyAgICAgIGlmICgod0VQVmFsICYgVVNCX0VQX0NUUl9UWCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGVwID0gJmhwY2QtPklOX2VwW2VwaW5kZXhdOworCisgICAgICAgIC8qIGNsZWFyIGludCBmbGFnICovCisgICAgICAgIFBDRF9DTEVBUl9UWF9FUF9DVFIoaHBjZC0+SW5zdGFuY2UsIGVwaW5kZXgpOworCisgICAgICAgIC8qbXVsdGktcGFja2V0IG9uIHRoZSBOT04gY29udHJvbCBJTiBlbmRwb2ludCovCisgICAgICAgIGVwLT54ZmVyX2NvdW50ID0gUENEX0dFVF9FUF9UWF9DTlQoaHBjZC0+SW5zdGFuY2UsIGVwLT5udW0pOworICAgICAgICBlcC0+eGZlcl9idWZmICs9IGVwLT54ZmVyX2NvdW50OworCisgICAgICAgIC8qIFplcm8gTGVuZ3RoIFBhY2tldD8gKi8KKyAgICAgICAgaWYgKGVwLT54ZmVyX2xlbiA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRYIENPTVBMRVRFICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsIGVwLT5udW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgZXAtPm51bSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKHZvaWQpSEFMX1BDRF9FUF9UcmFuc21pdChocGNkLCBlcC0+bnVtLCBlcC0+eGZlcl9idWZmLCBlcC0+eGZlcl9sZW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChVU0IpICovCisjZW5kaWYgLyogSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfcGNkX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9wY2RfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZlNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfcGNkX2V4LmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3BjZF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQQ0QgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFBDREV4IFBDREV4CisgICogQGJyaWVmIFBDRCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUENEX01PRFVMRV9FTkFCTEVECisKKyNpZiBkZWZpbmVkIChVU0IpCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUENERXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBDREV4IEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUENERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFBDREV4IGNvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBmZWF0dXJlcyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBVcGRhdGUgRklGTyBjb25maWd1cmF0aW9uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIFBNQSBmb3IgRVAKKyAgKiBAcGFyYW0gIGhwY2QgIERldmljZSBpbnN0YW5jZQorICAqIEBwYXJhbSAgZXBfYWRkciBlbmRwb2ludCBhZGRyZXNzCisgICogQHBhcmFtICBlcF9raW5kIGVuZHBvaW50IEtpbmQKKyAgKiAgICAgICAgICAgICAgICAgIFVTQl9TTkdfQlVGOiBTaW5nbGUgQnVmZmVyIHVzZWQKKyAgKiAgICAgICAgICAgICAgICAgIFVTQl9EQkxfQlVGOiBEb3VibGUgQnVmZmVyIHVzZWQKKyAgKiBAcGFyYW0gIHBtYWFkcmVzczogRVAgYWRkcmVzcyBpbiBUaGUgUE1BOiBJbiBjYXNlIG9mIHNpbmdsZSBidWZmZXIgZW5kcG9pbnQKKyAgKiAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyAxNi1iaXQgdmFsdWUgcHJvdmlkaW5nIHRoZSBhZGRyZXNzCisgICogICAgICAgICAgICAgICAgICAgaW4gUE1BIGFsbG9jYXRlZCB0byBlbmRwb2ludC4KKyAgKiAgICAgICAgICAgICAgICAgICBJbiBjYXNlIG9mIGRvdWJsZSBidWZmZXIgZW5kcG9pbnQgdGhpcyBwYXJhbWV0ZXIKKyAgKiAgICAgICAgICAgICAgICAgICBpcyBhIDMyLWJpdCB2YWx1ZSBwcm92aWRpbmcgdGhlIGVuZHBvaW50IGJ1ZmZlciAwIGFkZHJlc3MKKyAgKiAgICAgICAgICAgICAgICAgICBpbiB0aGUgTFNCIHBhcnQgb2YgMzItYml0IHZhbHVlIGFuZCBlbmRwb2ludCBidWZmZXIgMSBhZGRyZXNzCisgICogICAgICAgICAgICAgICAgICAgaW4gdGhlIE1TQiBwYXJ0IG9mIDMyLWJpdCB2YWx1ZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgIEhBTF9QQ0RFeF9QTUFDb25maWcoUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBlcF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZXBfa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBtYWFkcmVzcykKK3sKKyAgUENEX0VQVHlwZURlZiAqZXA7CisKKyAgLyogaW5pdGlhbGl6ZSBlcCBzdHJ1Y3R1cmUqLworICBpZiAoKDB4ODBVICYgZXBfYWRkcikgPT0gMHg4MFUpCisgIHsKKyAgICBlcCA9ICZocGNkLT5JTl9lcFtlcF9hZGRyICYgRVBfQUREUl9NU0tdOworICB9CisgIGVsc2UKKyAgeworICAgIGVwID0gJmhwY2QtPk9VVF9lcFtlcF9hZGRyXTsKKyAgfQorCisgIC8qIEhlcmUgd2UgY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIHNpbmdsZSBvciBkb3VibGUgQnVmZmVyKi8KKyAgaWYgKGVwX2tpbmQgPT0gUENEX1NOR19CVUYpCisgIHsKKyAgICAvKiBTaW5nbGUgQnVmZmVyICovCisgICAgZXAtPmRvdWJsZWJ1ZmZlciA9IDBVOworICAgIC8qIENvbmZpZ3VyZSB0aGUgUE1BICovCisgICAgZXAtPnBtYWFkcmVzcyA9ICh1aW50MTZfdClwbWFhZHJlc3M7CisgIH0KKyAgZWxzZSAvKiBVU0JfREJMX0JVRiAqLworICB7CisgICAgLyogRG91YmxlIEJ1ZmZlciBFbmRwb2ludCAqLworICAgIGVwLT5kb3VibGVidWZmZXIgPSAxVTsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBNQSAqLworICAgIGVwLT5wbWFhZGRyMCA9ICh1aW50MTZfdCkocG1hYWRyZXNzICYgMHhGRkZGVSk7CisgICAgZXAtPnBtYWFkZHIxID0gKHVpbnQxNl90KSgocG1hYWRyZXNzICYgMHhGRkZGMDAwMFUpID4+IDE2KTsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWN0aXZhdGUgQmF0dGVyeUNoYXJnaW5nIGZlYXR1cmUuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9BY3RpdmF0ZUJDRChQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKyAgaHBjZC0+YmF0dGVyeV9jaGFyZ2luZ19hY3RpdmUgPSAxVTsKKworICAvKiBFbmFibGUgRENEIDogRGF0YSBDb250YWN0IERldGVjdCAqLworICBVU0J4LT5CQ0RSICY9IH4oVVNCX0JDRFJfUERFTik7CisgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9TREVOKTsKKyAgVVNCeC0+QkNEUiB8PSBVU0JfQkNEUl9EQ0RFTjsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgQmF0dGVyeUNoYXJnaW5nIGZlYXR1cmUuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBVU0JfVHlwZURlZiAqVVNCeCA9IGhwY2QtPkluc3RhbmNlOworICBocGNkLT5iYXR0ZXJ5X2NoYXJnaW5nX2FjdGl2ZSA9IDBVOworCisgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9CQ0RFTik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgQmF0dGVyeUNoYXJnaW5nIFByb2Nlc3MuCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BDREV4X0JDRF9WQlVTRGV0ZWN0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworICBVU0JfVHlwZURlZiAqVVNCeCA9IGhwY2QtPkluc3RhbmNlOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgRGV0ZWN0IGZsYWcgb3IgYSB0aW1lb3V0IGlzIGhhcHBlbiovCisgIHdoaWxlICgoVVNCeC0+QkNEUiAmIFVTQl9CQ0RSX0RDREVUKSA9PSAwVSkKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiAxMDAwVSkKKyAgICB7CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRVJST1IpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9FUlJPUik7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBIQUxfRGVsYXkoMjAwVSk7CisKKyAgLyogRGF0YSBQaW4gQ29udGFjdCA/IENoZWNrIERldGVjdCBmbGFnICovCisgIGlmICgoVVNCeC0+QkNEUiAmIFVTQl9CQ0RSX0RDREVUKSA9PSBVU0JfQkNEUl9EQ0RFVCkKKyAgeworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHBjZC0+QkNEQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9DT05UQUNUX0RFVEVDVElPTik7CisjZWxzZQorICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9DT05UQUNUX0RFVEVDVElPTik7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgLyogUHJpbWFyeSBkZXRlY3Rpb246IGNoZWNrcyBpZiBjb25uZWN0ZWQgdG8gU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0CisgICh3aXRob3V0IGNoYXJnaW5nIGNhcGFiaWxpdHkpICovCisgIFVTQngtPkJDRFIgJj0gfihVU0JfQkNEUl9EQ0RFTik7CisgIEhBTF9EZWxheSg1MFUpOworICBVU0J4LT5CQ0RSIHw9IChVU0JfQkNEUl9QREVOKTsKKyAgSEFMX0RlbGF5KDUwVSk7CisKKyAgLyogSWYgQ2hhcmdlciBkZXRlY3QgPyAqLworICBpZiAoKFVTQngtPkJDRFIgJiBVU0JfQkNEUl9QREVUKSA9PSBVU0JfQkNEUl9QREVUKQorICB7CisgICAgLyogU3RhcnQgc2Vjb25kYXJ5IGRldGVjdGlvbiB0byBjaGVjayBjb25uZWN0aW9uIHRvIENoYXJnaW5nIERvd25zdHJlYW0KKyAgICBQb3J0IG9yIERlZGljYXRlZCBDaGFyZ2luZyBQb3J0ICovCisgICAgVVNCeC0+QkNEUiAmPSB+KFVTQl9CQ0RSX1BERU4pOworICAgIEhBTF9EZWxheSg1MFUpOworICAgIFVTQngtPkJDRFIgfD0gKFVTQl9CQ0RSX1NERU4pOworICAgIEhBTF9EZWxheSg1MFUpOworCisgICAgLyogSWYgQ0RQID8gKi8KKyAgICBpZiAoKFVTQngtPkJDRFIgJiBVU0JfQkNEUl9TREVUKSA9PSBVU0JfQkNEUl9TREVUKQorICAgIHsKKyAgICAgIC8qIERlZGljYXRlZCBEb3duc3RyZWFtIFBvcnQgRENQICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfREVESUNBVEVEX0NIQVJHSU5HX1BPUlQpOworI2Vsc2UKKyAgICAgIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soaHBjZCwgUENEX0JDRF9ERURJQ0FURURfQ0hBUkdJTkdfUE9SVCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGFyZ2luZyBEb3duc3RyZWFtIFBvcnQgQ0RQICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ0hBUkdJTkdfRE9XTlNUUkVBTV9QT1JUKTsKKyNlbHNlCisgICAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfQ0hBUkdJTkdfRE9XTlNUUkVBTV9QT1JUKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZSAvKiBOTyAqLworICB7CisgICAgLyogU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0ICovCisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBocGNkLT5CQ0RDYWxsYmFjayhocGNkLCBQQ0RfQkNEX1NURF9ET1dOU1RSRUFNX1BPUlQpOworI2Vsc2UKKyAgICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfU1REX0RPV05TVFJFQU1fUE9SVCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBCYXR0ZXJ5IENoYXJnaW5nIGNhcGFiaWxpdHkgZGlzY292ZXJ5IGZpbmlzaGVkIFN0YXJ0IEVudW1lcmF0aW9uICovCisgICh2b2lkKUhBTF9QQ0RFeF9EZUFjdGl2YXRlQkNEKGhwY2QpOworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhwY2QtPkJDRENhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCk7CisjZWxzZQorICBIQUxfUENERXhfQkNEX0NhbGxiYWNrKGhwY2QsIFBDRF9CQ0RfRElTQ09WRVJZX0NPTVBMRVRFRCk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSBMUE0gZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGhwY2QgUENEIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDREV4X0FjdGl2YXRlTFBNKFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQoreworCisgIFVTQl9UeXBlRGVmICpVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisgIGhwY2QtPmxwbV9hY3RpdmUgPSAxVTsKKyAgaHBjZC0+TFBNX1N0YXRlID0gTFBNX0wwOworCisgIFVTQngtPkxQTUNTUiB8PSBVU0JfTFBNQ1NSX0xNUEVOOworICBVU0J4LT5MUE1DU1IgfD0gVVNCX0xQTUNTUl9MUE1BQ0s7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIExQTSBmZWF0dXJlLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUENERXhfRGVBY3RpdmF0ZUxQTShQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCkKK3sKKyAgVVNCX1R5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKKworICBocGNkLT5scG1fYWN0aXZlID0gMFU7CisKKyAgVVNCeC0+TFBNQ1NSICY9IH4oVVNCX0xQTUNTUl9MTVBFTik7CisgIFVTQngtPkxQTUNTUiAmPSB+KFVTQl9MUE1DU1JfTFBNQUNLKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisKKworLyoqCisgICogQGJyaWVmICBTZW5kIExQTSBtZXNzYWdlIHRvIHVzZXIgbGF5ZXIgY2FsbGJhY2suCisgICogQHBhcmFtICBocGNkIFBDRCBoYW5kbGUKKyAgKiBAcGFyYW0gIG1zZyBMUE0gbWVzc2FnZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworX193ZWFrIHZvaWQgSEFMX1BDREV4X0xQTV9DYWxsYmFjayhQQ0RfSGFuZGxlVHlwZURlZiAqaHBjZCwgUENEX0xQTV9Nc2dUeXBlRGVmIG1zZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHBjZCk7CisgIFVOVVNFRChtc2cpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUENERXhfTFBNX0NhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBCYXR0ZXJ5Q2hhcmdpbmcgbWVzc2FnZSB0byB1c2VyIGxheWVyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBjZCBQQ0QgaGFuZGxlCisgICogQHBhcmFtICBtc2cgTFBNIG1lc3NhZ2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QQ0RFeF9CQ0RfQ2FsbGJhY2soUENEX0hhbmRsZVR5cGVEZWYgKmhwY2QsIFBDRF9CQ0RfTXNnVHlwZURlZiBtc2cpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwY2QpOworICBVTlVTRUQobXNnKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BDREV4X0JDRF9DYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKyNlbmRpZiAvKiBIQUxfUENEX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9wa2EuYyBiL1NyYy9zdG0zMndieHhfaGFsX3BrYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWQyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9wa2EuYwpAQCAtMCwwICsxLDI0MzIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3BrYS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQS0EgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBwdWJsaWMga2V5IGFjY2VsZXJhdG9yKFBLQSk6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFN0YXJ0IGFuIG9wZXJhdGlvbgorICAqICAgICAgICAgICArIFJldHJpZXZlIHRoZSBvcGVyYXRpb24gcmVzdWx0CisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIFBLQSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFBLQV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlOiBQS0FfSGFuZGxlVHlwZURlZiAgaHBrYTsKKworICAgICgjKSBJbml0aWFsaXplIHRoZSBQS0EgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9QS0FfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIFBLQSBpbnRlcmZhY2UgY2xvY2sKKyAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFBLQSBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBQS0EgSVJRIENoYW5uZWwKKworICAgICgjKSBJbml0aWFsaXplIHRoZSBQS0EgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9QS0FfSW5pdCgpIEFQSSB3aGljaCB0cmlnCisgICAgICAgIEhBTF9QS0FfTXNwSW5pdCgpLgorCisgICAgKCMpIEZpbGwgZW50aXJlbHkgdGhlIGlucHV0IHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHlvdXIgb3BlcmF0aW9uOgorICAgICAgICBGb3IgaW5zdGFuY2U6IFBLQV9Nb2RFeHBJblR5cGVEZWYgZm9yIEhBTF9QS0FfTW9kRXhwKCkuCisKKyAgICAoIykgRXhlY3V0ZSB0aGUgb3BlcmF0aW9uIChpbiBwb2xsaW5nIG9yIGludGVycnVwdCkgYW5kIGNoZWNrIHRoZSByZXR1cm5lZCB2YWx1ZS4KKworICAgICgjKSBSZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKEZvciBpbnN0YW5jZSwgSEFMX1BLQV9Nb2RFeHBfR2V0UmVzdWx0IGZvcgorICAgICAgICBIQUxfUEtBX01vZEV4cCBvcGVyYXRpb24pLiBUaGUgZnVuY3Rpb24gdG8gZ2F0aGVyIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IGZvciBlYWNoCisgICAgICAgIGtpbmQgb2Ygb3BlcmF0aW9uLiBUaGUgY29ycmVzcG9uZGVuY2UgY2FuIGJlIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4KKworICAgICgjKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfUEtBX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aGljaCB0cmlnCisgICAgICAgIEhBTF9QS0FfTXNwRGVJbml0KCkuCisKKyAgICAqKiogSGlnaCBsZXZlbCBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIElucHV0IHN0cnVjdHVyZSByZXF1aXJlcyBidWZmZXJzIGFzIHVpbnQ4X3QgYXJyYXkuCisKKyAgICAgICgrKSBPdXRwdXQgc3RydWN0dXJlIHJlcXVpcmVzIGJ1ZmZlcnMgYXMgdWludDhfdCBhcnJheS4KKworICAgICAgKCspIE1vZHVsYXIgZXhwb25lbnRpYXRpb24gdXNpbmc6CisgICAgICAoKyspIEhBTF9QS0FfTW9kRXhwKCkuCisgICAgICAoKyspIEhBTF9QS0FfTW9kRXhwX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfTW9kRXhwRmFzdE1vZGUoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Nb2RFeHBGYXN0TW9kZV9JVCgpLgorICAgICAgKCsrKSBIQUxfUEtBX01vZEV4cF9HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAgICgrKSBSU0EgQ2hpbmVzZSBSZW1haW5kZXIgVGhlb3JlbSAoQ1JUKSB1c2luZzoKKyAgICAgICgrKykgSEFMX1BLQV9SU0FDUlRFeHAoKS4KKyAgICAgICgrKykgSEFMX1BLQV9SU0FDUlRFeHBfSVQoKS4KKyAgICAgICgrKykgSEFMX1BLQV9SU0FDUlRFeHBfR2V0UmVzdWx0KCkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorCisgICAgICAoKykgRUNDIFBvaW50IENoZWNrIHVzaW5nOgorICAgICAgKCsrKSBIQUxfUEtBX1BvaW50Q2hlY2soKS4KKyAgICAgICgrKykgSEFMX1BLQV9Qb2ludENoZWNrX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfUG9pbnRDaGVja19Jc09uQ3VydmUoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAgICgrKSBFQ0RTQSBTaWduCisgICAgICAoKyspIEhBTF9QS0FfRUNEU0FTaWduKCkuCisgICAgICAoKyspIEhBTF9QS0FfRUNEU0FTaWduX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfRUNEU0FTaWduX0dldFJlc3VsdCgpIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKworICAgICAgKCspIEVDRFNBIFZlcmlmeQorICAgICAgKCsrKSBIQUxfUEtBX0VDRFNBVmVyaWYoKS4KKyAgICAgICgrKykgSEFMX1BLQV9FQ0RTQVZlcmlmX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfRUNEU0FWZXJpZl9Jc1ZhbGlkU2lnbmF0dXJlKCkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorCisgICAgICAoKykgRUNDIFNjYWxhciBNdWx0aXBsaWNhdGlvbiB1c2luZzoKKyAgICAgICgrKykgSEFMX1BLQV9FQ0NNdWwoKS4KKyAgICAgICgrKykgSEFMX1BLQV9FQ0NNdWxfSVQoKS4KKyAgICAgICgrKykgSEFMX1BLQV9FQ0NNdWxGYXN0TW9kZSgpLgorICAgICAgKCsrKSBIQUxfUEtBX0VDQ011bEZhc3RNb2RlX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfRUNDTXVsX0dldFJlc3VsdCgpIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKworICAgICoqKiBMb3cgbGV2ZWwgb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBJbnB1dCBzdHJ1Y3R1cmUgcmVxdWlyZXMgYnVmZmVycyBhcyB1aW50MzJfdCBhcnJheS4KKworICAgICAgKCspIE91dHB1dCBzdHJ1Y3R1cmUgcmVxdWlyZXMgYnVmZmVycyBhcyB1aW50MzJfdCBhcnJheS4KKworICAgICAgKCspIEFyaXRobWV0aWMgYWRkaXRpb24gdXNpbmc6CisgICAgICAoKyspIEhBTF9QS0FfQWRkKCkuCisgICAgICAoKyspIEhBTF9QS0FfQWRkX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAgICBUaGUgcmVzdWx0aW5nIHNpemUgY2FuIGJlIHRoZSBpbnB1dCBwYXJhbWV0ZXIgb3IgdGhlIGlucHV0IHBhcmFtZXRlciBzaXplICsgMSAob3ZlcmZsb3cpLgorCisgICAgICAoKykgQXJpdGhtZXRpYyBzdWJzdHJhY3Rpb24gdXNpbmc6CisgICAgICAoKyspIEhBTF9QS0FfU3ViKCkuCisgICAgICAoKyspIEhBTF9QS0FfU3ViX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAgICgrKSBBcml0aG1ldGljIG11bHRpcGxpY2F0aW9uIHVzaW5nOgorICAgICAgKCsrKSBIQUxfUEtBX011bCgpLgorICAgICAgKCsrKSBIQUxfUEtBX011bF9JVCgpLgorICAgICAgKCsrKSBIQUxfUEtBX0FyaXRobWV0aWNfR2V0UmVzdWx0KCkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorCisgICAgICAoKykgQ29tcGFyaXNvbiB1c2luZzoKKyAgICAgICgrKykgSEFMX1BLQV9DbXAoKS4KKyAgICAgICgrKykgSEFMX1BLQV9DbXBfSVQoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Bcml0aG1ldGljX0dldFJlc3VsdCgpIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKworICAgICAgKCspIE1vZHVsYXIgYWRkaXRpb24gdXNpbmc6CisgICAgICAoKyspIEhBTF9QS0FfTW9kQWRkKCkuCisgICAgICAoKyspIEhBTF9QS0FfTW9kQWRkX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAgICgrKSBNb2R1bGFyIHN1YnN0cmFjdGlvbiB1c2luZzoKKyAgICAgICgrKykgSEFMX1BLQV9Nb2RTdWIoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Nb2RTdWJfSVQoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Bcml0aG1ldGljX0dldFJlc3VsdCgpIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKworICAgICAgKCspIE1vZHVsYXIgaW52ZXJzaW9uIHVzaW5nOgorICAgICAgKCsrKSBIQUxfUEtBX01vZEludigpLgorICAgICAgKCsrKSBIQUxfUEtBX01vZEludl9JVCgpLgorICAgICAgKCsrKSBIQUxfUEtBX0FyaXRobWV0aWNfR2V0UmVzdWx0KCkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorCisgICAgICAoKykgTW9kdWxhciByZWR1Y3Rpb24gdXNpbmc6CisgICAgICAoKyspIEhBTF9QS0FfTW9kUmVkKCkuCisgICAgICAoKyspIEhBTF9QS0FfTW9kUmVkX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAgICgrKSBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIHVzaW5nOgorICAgICAgKCsrKSBIQUxfUEtBX01vbnRnb21lcnlNdWwoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5TXVsX0lUKCkuCisgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKSB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisKKyAgICAqKiogTW9udGdvbWVyeSBwYXJhbWV0ZXIgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAoKykgRm9yIHNvbWUgb3BlcmF0aW9uLCB0aGUgY29tcHV0YXRpb24gb2YgdGhlIE1vbnRnb21lcnkgcGFyYW1ldGVyIGlzIGEgcHJlcmVxdWlzaXRlLgorICAgICAgKCspIElucHV0IHN0cnVjdHVyZSByZXF1aXJlcyBidWZmZXJzIGFzIHVpbnQ4X3QgYXJyYXkuCisgICAgICAoKykgT3V0cHV0IHN0cnVjdHVyZSByZXF1aXJlcyBidWZmZXJzIGFzIHVpbnQzMl90IGFycmF5LihPbmx5IHVzZWQgaW5zaWRlIFBLQSkuCisgICAgICAoKykgWW91IGNhbiBjb21wdXRlIHRoZSBNb250Z29tZXJ5IHBhcmFtZXRlciB1c2luZzoKKyAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW0oKS4KKyAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fSVQoKS4KKyAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fR2V0UmVzdWx0KCkgdG8gcmV0cmlldmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAgKCspIFlvdSBjYW4gc2F2ZSBjb21wdXRhdGlvbiB0aW1lIGJ5IHN0b3JpbmcgdGhpcyBwYXJhbWV0ZXIgZm9yIGEgbGF0ZXIgdXNhZ2UuCisgICAgICAgICAgVXNlIGl0IGFnYWluIHdpdGggSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fU2V0KCk7CisKKyAgICAqKiogUG9sbGluZyBtb2RlIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBXaGVuIGFuIG9wZXJhdGlvbiBpcyBzdGFydGVkIGluIHBvbGxpbmcgbW9kZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgd2hlbjoKKyAgICAgICgrKykgQSB0aW1lb3V0IGlzIGVuY291bnRlci4KKyAgICAgICgrKykgVGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuCisKKyAgICAqKiogSW50ZXJydXB0IG1vZGUgb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIEFkZCBIQUxfUEtBX0lSUUhhbmRsZXIgdG8gdGhlIElSUUhhbmRsZXIgb2YgUEtBLgorICAgICAgKCspIEVuYWJsZSB0aGUgSVJRIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpLgorICAgICAgKCspIFdoZW4gYW4gb3BlcmF0aW9uIGlzIHN0YXJ0ZWQgaW4gaW50ZXJydXB0IG1vZGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0bHkuCisgICAgICAoKykgV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIGNhbGxiYWNrIEhBTF9QS0FfT3BlcmF0aW9uQ3BsdENhbGxiYWNrIGlzIGNhbGxlZC4KKyAgICAgICgrKSBXaGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLCB0aGUgY2FsbGJhY2sgSEFMX1BLQV9FcnJvckNhbGxiYWNrIGlzIGNhbGxlZC4KKyAgICAgICgrKSBUbyBzdG9wIGFueSBvcGVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUsIHVzZSBIQUxfUEtBX0Fib3J0KCkuCisKKyAgICAqKiogVXRpbGl0aWVzICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFRvIGNsZWFyIHRoZSBQS0EgUkFNLCB1c2UgSEFMX1BLQV9SQU1SZXNldCgpLgorICAgICAgKCspIFRvIGdldCBjdXJyZW50IHN0YXRlLCB1c2UgSEFMX1BLQV9HZXRTdGF0ZSgpLgorICAgICAgKCspIFRvIGdldCBjdXJyZW50IGVycm9yLCB1c2UgSEFMX1BLQV9HZXRFcnJvcigpLgorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTLCB3aGVuIHNldCB0byAxLAorICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICBVc2UgRnVuY3Rpb25zIEByZWYgSEFMX1BLQV9SZWdpc3RlckNhbGxiYWNrKCkKKyAgICAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAgIFsuLl0KKworICAgICBGdW5jdGlvbiBAcmVmIEhBTF9QS0FfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBPcGVyYXRpb25DcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgRW5kIG9mIG9wZXJhdGlvbi4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFsuLl0KKworICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfUEtBX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgIHdlYWsgZnVuY3Rpb24uCisgICAgWy4uXQorCisgICAgIEByZWYgSEFMX1BLQV9VblJlZ2lzdGVyQ2FsbGJhY2sgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBPcGVyYXRpb25DcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgRW5kIG9mIG9wZXJhdGlvbi4KKyAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBjYWxsYmFjayBmb3IgTXNwIERlSW5pdC4KKyAgICAgWy4uXQorCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9QS0FfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBAcmVmIEhBTF9QS0FfU1RBVEVfUkVTRVQKKyAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICBleGFtcGxlcyBAcmVmIEhBTF9QS0FfT3BlcmF0aW9uQ3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1BLQV9FcnJvckNhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1BLQV9Jbml0KCkvIEByZWYgSEFMX1BLQV9EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBbLi5dCisKKyAgICAgSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfUEtBX0luaXQoKS8gQHJlZiBIQUxfUEtBX0RlSW5pdCgpCisgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorICAgICBbLi5dCisKKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9QS0FfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgIGluIEByZWYgSEFMX1BLQV9TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9QS0FfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgWy4uXQorCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfUEtBX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9QS0FfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfUEtBX0luaXQoKSBmdW5jdGlvbi4KKyAgICAgWy4uXQorCisgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQS0EpICYmIGRlZmluZWQoSEFMX1BLQV9NT0RVTEVfRU5BQkxFRCkKKworLyoqIEBkZWZncm91cCBQS0EgUEtBCisgICogQGJyaWVmIFBLQSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUEtBX1ByaXZhdGVfRGVmaW5lIFBLQSBQcml2YXRlIERlZmluZQorICAqIEB7CisgICovCisjZGVmaW5lIFBLQV9SQU1fU0laRSA4OTRVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFBLQV9Qcml2YXRlX0Z1bmN0aW9ucyBQS0EgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLwordWludDMyX3QgUEtBX0dldE1vZGUoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpOworSEFMX1N0YXR1c1R5cGVEZWYgUEtBX1BvbGxFbmRPZk9wZXJhdGlvbihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3VpbnQzMl90IFBLQV9DaGVja0Vycm9yKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCB1aW50MzJfdCBtb2RlKTsKK3VpbnQzMl90IFBLQV9HZXRCaXRTaXplX3U4KHVpbnQzMl90IGJ5dGVOdW1iZXIpOwordWludDMyX3QgUEtBX0dldE9wdEJpdFNpemVfdTgodWludDMyX3QgYnl0ZU51bWJlciwgdWludDhfdCBtc2IpOwordWludDMyX3QgUEtBX0dldEJpdFNpemVfdTMyKHVpbnQzMl90IHdvcmROdW1iZXIpOwordWludDMyX3QgUEtBX0dldEFycmF5U2l6ZV91OCh1aW50MzJfdCBiaXRTaXplKTsKK3ZvaWQgUEtBX01lbWNweV91MzJfdG9fdTgodWludDhfdCBkc3RbXSwgX19JTyBjb25zdCB1aW50MzJfdCBzcmNbXSwgc2l6ZV90IG4pOwordm9pZCBQS0FfTWVtY3B5X3U4X3RvX3UzMihfX0lPIHVpbnQzMl90IGRzdFtdLCBjb25zdCB1aW50OF90IHNyY1tdLCBzaXplX3Qgbik7Cit2b2lkIFBLQV9NZW1jcHlfdTMyX3RvX3UzMihfX0lPIHVpbnQzMl90IGRzdFtdLCBfX0lPIGNvbnN0IHVpbnQzMl90IHNyY1tdLCBzaXplX3Qgbik7CitIQUxfU3RhdHVzVHlwZURlZiBQS0FfUHJvY2VzcyhQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgbW9kZSwgdWludDMyX3QgVGltZW91dCk7CitIQUxfU3RhdHVzVHlwZURlZiBQS0FfUHJvY2Vzc19JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgbW9kZSk7Cit2b2lkIFBLQV9Nb2RFeHBfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kRXhwSW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9Nb2RFeHBGYXN0TW9kZV9TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RFeHBGYXN0TW9kZUluVHlwZURlZiAqaW4pOwordm9pZCBQS0FfRUNEU0FTaWduX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBU2lnbkluVHlwZURlZiAqaW4pOwordm9pZCBQS0FfRUNEU0FWZXJpZl9TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0RTQVZlcmlmSW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9SU0FDUlRFeHBfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfUlNBQ1JURXhwSW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9Qb2ludENoZWNrX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1BvaW50Q2hlY2tJblR5cGVEZWYgKmluKTsKK3ZvaWQgUEtBX0VDQ011bF9TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0NNdWxJblR5cGVEZWYgKmluKTsKK3ZvaWQgUEtBX0VDQ011bEZhc3RNb2RlX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDQ011bEZhc3RNb2RlSW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9Nb2RSZWRfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kUmVkSW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9Nb2RJbnZfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kSW52SW5UeXBlRGVmICppbik7Cit2b2lkIFBLQV9Nb250Z29tZXJ5UGFyYW1fU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBjb25zdCB1aW50MzJfdCBzaXplLCBjb25zdCB1aW50OF90ICpwT3AxKTsKK3ZvaWQgUEtBX0FSSV9TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIGNvbnN0IHVpbnQzMl90IHNpemUsIGNvbnN0IHVpbnQzMl90ICpwT3AxLCBjb25zdCB1aW50MzJfdCAqcE9wMiwgY29uc3QgdWludDhfdCAqcE9wMyk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFBLQV9FeHBvcnRlZF9GdW5jdGlvbnMgUEtBIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUEtBX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlaW5pdGlhbGl6ZSB0aGUgUEtBeCBwZXJpcGhlcmFsOgorCisgICAgICAoKykgVXNlciBtdXN0IGltcGxlbWVudCBIQUxfUEtBX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9QS0FfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBTZWN1cml0eSBsZXZlbAorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1BLQV9EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgUEtBeCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFBLQSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgUEtBX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Jbml0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnIgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIFBLQSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHBrYSAhPSBOVUxMKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUEtBX0FMTF9JTlNUQU5DRShocGthLT5JbnN0YW5jZSkpOworCisgICAgaWYgKGhwa2EtPlN0YXRlID09IEhBTF9QS0FfU1RBVEVfUkVTRVQpCisgICAgeworCisjaWYgKFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogSW5pdCB0aGUgUEtBIENhbGxiYWNrIHNldHRpbmdzICovCisgICAgICBocGthLT5PcGVyYXRpb25DcGx0Q2FsbGJhY2sgPSBIQUxfUEtBX09wZXJhdGlvbkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgT3BlcmF0aW9uQ3BsdENhbGxiYWNrICovCisgICAgICBocGthLT5FcnJvckNhbGxiYWNrICAgICAgICAgPSBIQUxfUEtBX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICovCisKKyAgICAgIGlmIChocGthLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHBrYS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1BLQV9Nc3BJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgICAgfQorCisgICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICAgIGhwa2EtPk1zcEluaXRDYWxsYmFjayhocGthKTsKKyNlbHNlCisgICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICAgIEhBTF9QS0FfTXNwSW5pdChocGthKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHN0YXRlIHRvIGJ1c3kgKi8KKyAgICBocGthLT5TdGF0ZSA9IEhBTF9QS0FfU1RBVEVfQlVTWTsKKworICAgIC8qIFJlc2V0IHRoZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBlbmFibGUgdGhlIFBLQSAqLworICAgIGhwa2EtPkluc3RhbmNlLT5DUiA9IFBLQV9DUl9FTjsKKworICAgIC8qIFJlc2V0IGFueSBwZW5kaW5nIGZsYWcgKi8KKyAgICBTRVRfQklUKGhwa2EtPkluc3RhbmNlLT5DTFJGUiwgUEtBX0NMUkZSX1BST0NFTkRGQyB8IFBLQV9DTFJGUl9SQU1FUlJGQyB8IFBLQV9DTFJGUl9BRERSRVJSRkMpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwa2EtPkVycm9yQ29kZSA9IEhBTF9QS0FfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCB0aGUgc3RhdGUgdG8gcmVhZHkgKi8KKyAgICBocGthLT5TdGF0ZSA9IEhBTF9QS0FfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXJyID0gSEFMX0VSUk9SOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFBLQSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0RlSW5pdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyID0gSEFMX09LOworCisgIC8qIENoZWNrIHRoZSBQS0EgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhwa2EgIT0gTlVMTCkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1BLQV9BTExfSU5TVEFOQ0UoaHBrYS0+SW5zdGFuY2UpKTsKKworICAgIC8qIFNldCB0aGUgc3RhdGUgdG8gYnVzeSAqLworICAgIGhwa2EtPlN0YXRlID0gSEFMX1BLQV9TVEFURV9CVVNZOworCisgICAgLyogUmVzZXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAvKiBUaGlzIGFib3J0IGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKFBLQSBSQU0gY29udGVudCBpcyBub3QgZ3VhcmFudGVkIGluIHRoaXMgY2FzZSkgKi8KKyAgICBocGthLT5JbnN0YW5jZS0+Q1IgPSAwOworCisgICAgLyogUmVzZXQgYW55IHBlbmRpbmcgZmxhZyAqLworICAgIFNFVF9CSVQoaHBrYS0+SW5zdGFuY2UtPkNMUkZSLCBQS0FfQ0xSRlJfUFJPQ0VOREZDIHwgUEtBX0NMUkZSX1JBTUVSUkZDIHwgUEtBX0NMUkZSX0FERFJFUlJGQyk7CisKKyNpZiAoVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaWYgKGhwa2EtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHBrYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUEtBX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICAgIH0KKworICAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGhwa2EtPk1zcERlSW5pdENhbGxiYWNrKGhwa2EpOworI2Vsc2UKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfUEtBX01zcERlSW5pdChocGthKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgIC8qIFJlc2V0IHRoZSBlcnJvciBjb2RlICovCisgICAgaHBrYS0+RXJyb3JDb2RlID0gSEFMX1BLQV9FUlJPUl9OT05FOworCisgICAgLyogUmVzZXQgdGhlIHN0YXRlICovCisgICAgaHBrYS0+U3RhdGUgPSBIQUxfUEtBX1NUQVRFX1JFU0VUOworICB9CisgIGVsc2UKKyAgeworICAgIGVyciA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUEtBIE1TUC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BLQV9Nc3BJbml0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocGthKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BLQV9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUEtBIE1TUC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BLQV9Nc3BEZUluaXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwa2EpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUEtBX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFBLQSBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhwa2EgUG9pbnRlciB0byBhIFBLQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgUEtBLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BLQV9PUEVSQVRJT05fQ09NUExFVEVfQ0JfSUQgRW5kIG9mIG9wZXJhdGlvbiBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUEtBX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QS0FfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QS0FfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1JlZ2lzdGVyQ2FsbGJhY2soUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIEhBTF9QS0FfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFBLQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHBrYS0+RXJyb3JDb2RlIHw9IEhBTF9QS0FfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoSEFMX1BLQV9TVEFURV9SRUFEWSA9PSBocGthLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9QS0FfT1BFUkFUSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+T3BlcmF0aW9uQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUEtBX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BLQV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUEtBX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhwa2EtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocGthLT5FcnJvckNvZGUgfD0gSEFMX1BLQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1BLQV9TVEFURV9SRVNFVCA9PSBocGthLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9QS0FfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhwa2EtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1BLQV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBocGthLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHBrYS0+RXJyb3JDb2RlIHw9IEhBTF9QS0FfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwa2EtPkVycm9yQ29kZSB8PSBIQUxfUEtBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFBLQSBDYWxsYmFjaworICAqICAgICAgICAgUEtBIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHBrYSBQb2ludGVyIHRvIGEgUEtBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBQS0EuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9QS0FfT1BFUkFUSU9OX0NPTVBMRVRFX0NCX0lEIEVuZCBvZiBvcGVyYXRpb24gY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1BLQV9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUEtBX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUEtBX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfVW5SZWdpc3RlckNhbGxiYWNrKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBIQUxfUEtBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoSEFMX1BLQV9TVEFURV9SRUFEWSA9PSBocGthLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9QS0FfT1BFUkFUSU9OX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+T3BlcmF0aW9uQ3BsdENhbGxiYWNrID0gSEFMX1BLQV9PcGVyYXRpb25DcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE9wZXJhdGlvbkNwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUEtBX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+RXJyb3JDYWxsYmFjayA9IEhBTF9QS0FfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QS0FfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhwa2EtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9QS0FfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfUEtBX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhwa2EtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1BLQV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocGthLT5FcnJvckNvZGUgfD0gSEFMX1BLQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9QS0FfU1RBVEVfUkVTRVQgPT0gaHBrYS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfUEtBX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBocGthLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUEtBX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9QS0FfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHBrYS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUEtBX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBocGthLT5FcnJvckNvZGUgfD0gSEFMX1BLQV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhwa2EtPkVycm9yQ29kZSB8PSBIQUxfUEtBX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQS0FfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgUEtBIG9wZXJhdGlvbnMuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiBvcGVyYXRpb246CisKKyAgICAgICAoKyspIEJsb2NraW5nIG1vZGUgOiBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB3aGVuIGRhdGEgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgICAoKyspIE5vLUJsb2NraW5nIG1vZGUgOiBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzLgorICAgICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiBpbW1lZGlhdGx5LgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uIGlzIGluZGljYXRlZCBieSBIQUxfUEtBX0Vycm9yQ2FsbGJhY2sgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgSEFMX1BLQV9PcGVyYXRpb25DcGx0Q2FsbGJhY2sgaW4gY2FzZSBvZiBzdWNjZXNzLgorICAgICAgICAgICAgVG8gc3RvcCBhbnkgb3BlcmF0aW9uIGluIGludGVycnVwdCBtb2RlLCB1c2UgSEFMX1BLQV9BYm9ydCgpLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIGFyZSA6CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZEV4cCgpCisgICAgICAgICgrKykgSEFMX1BLQV9Nb2RFeHBGYXN0TW9kZSgpCisgICAgICAgICgrKykgSEFMX1BLQV9Nb2RFeHBfR2V0UmVzdWx0KCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDRFNBU2lnbigpCisgICAgICAgICgrKykgSEFMX1BLQV9FQ0RTQVNpZ25fR2V0UmVzdWx0KCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDRFNBVmVyaWYoKQorICAgICAgICAoKyspIEhBTF9QS0FfRUNEU0FWZXJpZl9Jc1ZhbGlkU2lnbmF0dXJlKCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX1JTQUNSVEV4cCgpCisgICAgICAgICgrKykgSEFMX1BLQV9SU0FDUlRFeHBfR2V0UmVzdWx0KCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX1BvaW50Q2hlY2soKQorICAgICAgICAoKyspIEhBTF9QS0FfUG9pbnRDaGVja19Jc09uQ3VydmUoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfRUNDTXVsKCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDQ011bEZhc3RNb2RlKCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDQ011bF9HZXRSZXN1bHQoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfQWRkKCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX1N1YigpCisgICAgICAgICgrKykgSEFMX1BLQV9DbXAoKQorICAgICAgICAoKyspIEhBTF9QS0FfTXVsKCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZEFkZCgpCisgICAgICAgICgrKykgSEFMX1BLQV9Nb2RTdWIoKQorICAgICAgICAoKyspIEhBTF9QS0FfTW9kSW52KCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZFJlZCgpCisgICAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5TXVsKCkKKyAgICAgICAgKCsrKSBIQUxfUEtBX0FyaXRobWV0aWNfR2V0UmVzdWx0KFApOworCisgICAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW0oKQorICAgICAgICAoKyspIEhBTF9QS0FfTW9udGdvbWVyeVBhcmFtX0dldFJlc3VsdCgpOworCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZEV4cF9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfTW9kRXhwRmFzdE1vZGVfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZEV4cF9HZXRSZXN1bHQoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfRUNEU0FTaWduX0lUKCk7CisgICAgICAgICgrKykgSEFMX1BLQV9FQ0RTQVNpZ25fR2V0UmVzdWx0KCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDRFNBVmVyaWZfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX0VDRFNBVmVyaWZfSXNWYWxpZFNpZ25hdHVyZSgpOworCisgICAgICAgICgrKykgSEFMX1BLQV9SU0FDUlRFeHBfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX1JTQUNSVEV4cF9HZXRSZXN1bHQoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfUG9pbnRDaGVja19JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfUG9pbnRDaGVja19Jc09uQ3VydmUoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfRUNDTXVsX0lUKCk7CisgICAgICAgICgrKykgSEFMX1BLQV9FQ0NNdWxGYXN0TW9kZV9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfRUNDTXVsX0dldFJlc3VsdCgpOworCisgICAgICAgICgrKykgSEFMX1BLQV9BZGRfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX1N1Yl9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfQ21wX0lUKCk7CisgICAgICAgICgrKykgSEFMX1BLQV9NdWxfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZEFkZF9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfTW9kU3ViX0lUKCk7CisgICAgICAgICgrKykgSEFMX1BLQV9Nb2RJbnZfSVQoKTsKKyAgICAgICAgKCsrKSBIQUxfUEtBX01vZFJlZF9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfTW9udGdvbWVyeU11bF9JVCgpOworICAgICAgICAoKyspIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoKTsKKworICAgICAgICAoKyspIEhBTF9QS0FfTW9udGdvbWVyeVBhcmFtX0lUKCk7CisgICAgICAgICgrKykgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fR2V0UmVzdWx0KCk7CisKKyAgICAgICAgKCsrKSBIQUxfUEtBX0Fib3J0KCk7CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciBleHBvbmVudGlhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vZEV4cChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEV4cEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfTW9kRXhwX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3MoaHBrYSwgUEtBX01PREVfTU9EVUxBUl9FWFAsIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1vZHVsYXIgZXhwb25lbnRpYXRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vZEV4cF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEV4cEluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfTW9kRXhwX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3NfSVQoaHBrYSwgUEtBX01PREVfTU9EVUxBUl9FWFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1vZHVsYXIgZXhwb25lbnRpYXRpb24gaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RFeHBGYXN0TW9kZShQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZEV4cEZhc3RNb2RlSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9Nb2RFeHBGYXN0TW9kZV9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX01PRFVMQVJfRVhQX0ZBU1RfTU9ERSwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciBleHBvbmVudGlhdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kRXhwRmFzdE1vZGVfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RFeHBGYXN0TW9kZUluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfTW9kRXhwRmFzdE1vZGVfU2V0KGhwa2EsIGluKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT0RVTEFSX0VYUF9GQVNUX01PREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIG9wZXJhdGlvbiByZXN1bHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBSZXMgT3V0cHV0IGJ1ZmZlcgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordm9pZCBIQUxfUEtBX01vZEV4cF9HZXRSZXN1bHQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIHVpbnQ4X3QgKnBSZXMpCit7CisgIHVpbnQzMl90IHNpemU7CisKKyAgLyogSW5kaWNhdGUgdG8gdGhlIHVzZXIgdGhlIGZpbmFsIHNpemUgKi8KKyAgc2l6ZSA9IChocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX0VYUF9JTl9PUF9OQl9CSVRTXSArIDdVTCkgLyA4VUw7CisKKyAgLyogTW92ZSB0aGUgcmVzdWx0IHRvIGFwcHJvcHJpYXRlIGxvY2F0aW9uIChpbmRpY2F0ZWQgaW4gb3V0IHBhcmFtZXRlcikgKi8KKyAgUEtBX01lbWNweV91MzJfdG9fdTgocFJlcywgJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX09VVF9TTV9BTEdPX0FDQzFdLCBzaXplKTsKK30KKworLyoqCisgICogQGJyaWVmICBTaWduIGEgbWVzc2FnZSB1c2luZyBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBwcmltZSBmaWVsZHMgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0RTQVNpZ24oUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0RTQVNpZ25JblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDRFNBU2lnbl9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX0VDRFNBX1NJR05BVFVSRSwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgZWxsaXB0aWMgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0RTQVNpZ25fSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0RTQVNpZ25JblR5cGVEZWYgKmluKQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDRFNBU2lnbl9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzX0lUKGhwa2EsIFBLQV9NT0RFX0VDRFNBX1NJR05BVFVSRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0cmlldmUgb3BlcmF0aW9uIHJlc3VsdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgb3V0IE91dHB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgb3V0RXh0IEFkZGl0aW9ubmFsIE91dHB1dCBpbmZvcm1hdGlvbiAoZmFjdWx0YXRpdmUpCisgICovCit2b2lkIEhBTF9QS0FfRUNEU0FTaWduX0dldFJlc3VsdChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBU2lnbk91dFR5cGVEZWYgKm91dCwgUEtBX0VDRFNBU2lnbk91dEV4dFBhcmFtVHlwZURlZiAqb3V0RXh0KQoreworICB1aW50MzJfdCBzaXplOworCisgIHNpemUgPSAoaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9NT0RfTkJfQklUU10gKyA3VUwpIC8gOFVMOworCisgIGlmIChvdXQgIT0gTlVMTCkKKyAgeworICAgIFBLQV9NZW1jcHlfdTMyX3RvX3U4KG91dC0+UlNpZ24sICZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX09VVF9TSUdOQVRVUkVfUl0sIHNpemUpOworICAgIFBLQV9NZW1jcHlfdTMyX3RvX3U4KG91dC0+U1NpZ24sICZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX09VVF9TSUdOQVRVUkVfU10sIHNpemUpOworICB9CisKKyAgLyogSWYgdXNlciByZXF1aXJlcyB0aGUgYWRkaXRpb25uYWwgaW5mb3JtYXRpb24gKi8KKyAgaWYgKG91dEV4dCAhPSBOVUxMKQorICB7CisgICAgLyogTW92ZSB0aGUgcmVzdWx0IHRvIGFwcHJvcHJpYXRlIGxvY2F0aW9uIChpbmRpY2F0ZWQgaW4gb3V0RXh0IHBhcmFtZXRlcikgKi8KKyAgICBQS0FfTWVtY3B5X3UzMl90b191OChvdXRFeHQtPnB0WCwgJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fT1VUX0ZJTkFMX1BPSU5UX1hdLCBzaXplKTsKKyAgICBQS0FfTWVtY3B5X3UzMl90b191OChvdXRFeHQtPnB0WSwgJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fT1VUX0ZJTkFMX1BPSU5UX1ldLCBzaXplKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgYSBzaWduYXR1cmUgdXNpbmcgZWxsaXB0aWMgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfRUNEU0FWZXJpZihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDRFNBVmVyaWZJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDRFNBVmVyaWZfU2V0KGhwa2EsIGluKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9FQ0RTQV9WRVJJRklDQVRJT04sIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgYSBzaWduYXR1cmUgdXNpbmcgZWxsaXB0aWMgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0RTQVZlcmlmX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNEU0FWZXJpZkluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfRUNEU0FWZXJpZl9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzX0lUKGhwa2EsIFBLQV9NT0RFX0VDRFNBX1ZFUklGSUNBVElPTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIEVDRFNBIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24uCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcmV0dmFsIDEgaWYgc2lnbmF0dXJlIGlzIHZlcmlmaWVkLCAwIGluIG90aGVyIGNhc2UKKyAgKi8KK3VpbnQzMl90IEhBTF9QS0FfRUNEU0FWZXJpZl9Jc1ZhbGlkU2lnbmF0dXJlKFBLQV9IYW5kbGVUeXBlRGVmIGNvbnN0ICpjb25zdCBocGthKQoreworICAvKiBJbnZlcnQgdGhlIHN0YXRlIG9mIHRoZSBQS0EgUkFNIGJpdCBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gKGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX09VVF9SRVNVTFRdID09IDBVTCkgPyAxVUwgOiAwVUw7Cit9CisKKy8qKgorICAqIEBicmllZiAgUlNBIENSVCBleHBvbmVudGlhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1JTQUNSVEV4cChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1JTQUNSVEV4cEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfUlNBQ1JURXhwX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3MoaHBrYSwgUEtBX01PREVfUlNBX0NSVF9FWFAsIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJTQSBDUlQgZXhwb25lbnRpYXRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1JTQUNSVEV4cF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1JTQUNSVEV4cEluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfUlNBQ1JURXhwX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3NfSVQoaHBrYSwgUEtBX01PREVfUlNBX0NSVF9FWFApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIG9wZXJhdGlvbiByZXN1bHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBSZXMgUG9pbnRlciB0byBtZW1vcnkgbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BLQV9SU0FDUlRFeHBfR2V0UmVzdWx0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCB1aW50OF90ICpwUmVzKQoreworICB1aW50MzJfdCBzaXplOworCisgIC8qIE1vdmUgdGhlIHJlc3VsdCB0byBhcHByb3ByaWF0ZSBsb2NhdGlvbiAoaW5kaWNhdGVkIGluIG91dCBwYXJhbWV0ZXIpICovCisgIHNpemUgPSAoaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fTU9EX05CX0JJVFNdICsgN1VMKSAvIDhVTDsKKworICBQS0FfTWVtY3B5X3UzMl90b191OChwUmVzLCAmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfT1VUX1JFU1VMVF0sIHNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBvaW50IG9uIGVsbGlwdGljIGN1cnZlIGNoZWNrIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfUG9pbnRDaGVjayhQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1BvaW50Q2hlY2tJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX1BvaW50Q2hlY2tfU2V0KGhwa2EsIGluKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9QT0lOVF9DSEVDSywgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUG9pbnQgb24gZWxsaXB0aWMgY3VydmUgY2hlY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1BvaW50Q2hlY2tfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Qb2ludENoZWNrSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9Qb2ludENoZWNrX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3NfSVQoaHBrYSwgUEtBX01PREVfUE9JTlRfQ0hFQ0spOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBwb2ludCBjaGVjayBvcGVyYXRpb24uCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcmV0dmFsIDEgaWYgcG9pbnQgaXMgb24gY3VydmUsIDAgaW4gb3RoZXIgY2FzZQorICAqLwordWludDMyX3QgSEFMX1BLQV9Qb2ludENoZWNrX0lzT25DdXJ2ZShQS0FfSGFuZGxlVHlwZURlZiBjb25zdCAqY29uc3QgaHBrYSkKK3sKKyAgLyogSW52ZXJ0IHRoZSB2YWx1ZSBvZiB0aGUgUEtBIFJBTSBjb250YWluaWcgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiAoaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfT1VUX0VSUk9SXSA9PSAwVUwpID8gMVVMIDogMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVDQyBzY2FsYXIgbXVsdGlwbGljYXRpb24gaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9FQ0NNdWwoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0NNdWxJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDQ011bF9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX0VDQ19NVUwsIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVDQyBzY2FsYXIgbXVsdGlwbGljYXRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0VDQ011bF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0VDQ011bEluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfRUNDTXVsX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3NfSVQoaHBrYSwgUEtBX01PREVfRUNDX01VTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRUNDIHNjYWxhciBtdWx0aXBsaWNhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0VDQ011bEZhc3RNb2RlKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNDTXVsRmFzdE1vZGVJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDQ011bEZhc3RNb2RlX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3MoaHBrYSwgUEtBX01PREVfRUNDX01VTF9GQVNUX01PREUsIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVDQyBzY2FsYXIgbXVsdGlwbGljYXRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0VDQ011bEZhc3RNb2RlX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNDTXVsRmFzdE1vZGVJblR5cGVEZWYgKmluKQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0VDQ011bEZhc3RNb2RlX1NldChocGthLCBpbik7CisKKyAgLyogU3RhcnQgdGhlIG9wZXJhdGlvbiAqLworICByZXR1cm4gUEtBX1Byb2Nlc3NfSVQoaHBrYSwgUEtBX01PREVfRUNDX01VTF9GQVNUX01PREUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHJpZXZlIG9wZXJhdGlvbiByZXN1bHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIG91dCBPdXRwdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BLQV9FQ0NNdWxfR2V0UmVzdWx0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNDTXVsT3V0VHlwZURlZiAqb3V0KQoreworICB1aW50MzJfdCBzaXplOworCisgIC8qIFJldHJpZXZlIHRoZSBzaXplIG9mIHRoZSBhcnJheSBmcm9tIHRoZSBQS0EgUkFNICovCisgIHNpemUgPSAoaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fT1BfTkJfQklUU10gKyA3VUwpIC8gOFVMOworCisgIC8qIElmIGEgZGVzdGluYXRpb24gYnVmZmVyIGlzIHByb3ZpZGVkICovCisgIGlmIChvdXQgIT0gTlVMTCkKKyAgeworICAgIC8qIE1vdmUgdGhlIHJlc3VsdCB0byBhcHByb3ByaWF0ZSBsb2NhdGlvbiAoaW5kaWNhdGVkIGluIG91dCBwYXJhbWV0ZXIpICovCisgICAgUEtBX01lbWNweV91MzJfdG9fdTgob3V0LT5wdFgsICZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9PVVRfUkVTVUxUX1hdLCBzaXplKTsKKyAgICBQS0FfTWVtY3B5X3UzMl90b191OChvdXQtPnB0WSwgJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX09VVF9SRVNVTFRfWV0sIHNpemUpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQXJpdGhtZXRpYyBhZGRpdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0FkZChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0FkZEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfQVJJX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEsIGluLT5wT3AyLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9BUklUSE1FVElDX0FERCwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQXJpdGhtZXRpYyBhZGRpdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfQWRkX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfQWRkSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIE5VTEwpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzX0lUKGhwa2EsIFBLQV9NT0RFX0FSSVRITUVUSUNfQUREKTsKK30KKworLyoqCisgICogQGJyaWVmICBBcml0aG1ldGljIHN1YnN0cmFjdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1N1YihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1N1YkluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfQVJJX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEsIGluLT5wT3AyLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9BUklUSE1FVElDX1NVQiwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQXJpdGhtZXRpYyBzdWJzdHJhY3Rpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX1N1Yl9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1N1YkluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfQVJJX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEsIGluLT5wT3AyLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9BUklUSE1FVElDX1NVQik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQXJpdGhtZXRpYyBtdWx0aXBsaWNhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX011bChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX011bEluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfQVJJX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEsIGluLT5wT3AyLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9BUklUSE1FVElDX01VTCwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQXJpdGhtZXRpYyBtdWx0aXBsaWNhdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTXVsX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTXVsSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIE5VTEwpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzX0lUKGhwa2EsIFBLQV9NT0RFX0FSSVRITUVUSUNfTVVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb21wYXJpc29uIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfQ21wKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfQ21wSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIE5VTEwpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX0NPTVBBUklTT04sIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbXBhcmlzb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX0NtcF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX0NtcEluVHlwZURlZiAqaW4pCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfQVJJX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEsIGluLT5wT3AyLCBOVUxMKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9DT01QQVJJU09OKTsKK30KKworLyoqCisgICogQGJyaWVmICBNb2R1bGFyIGFkZGl0aW9uIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kQWRkKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kQWRkSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIGluLT5wT3AzKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9NT0RVTEFSX0FERCwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciBhZGRpdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kQWRkX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kQWRkSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIGluLT5wT3AzKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT0RVTEFSX0FERCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciBpbnZlcnNpb24gaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RJbnYoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RJbnZJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX01vZEludl9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX01PRFVMQVJfSU5WLCBUaW1lb3V0KTsKK30KKworLyoqCisgICogQGJyaWVmICBNb2R1bGFyIGludmVyc2lvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kSW52X0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kSW52SW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9Nb2RJbnZfU2V0KGhwa2EsIGluKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT0RVTEFSX0lOVik7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciBzdWJzdHJhY3Rpb24gaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RTdWIoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RTdWJJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0FSSV9TZXQoaHBrYSwgaW4tPnNpemUsIGluLT5wT3AxLCBpbi0+cE9wMiwgaW4tPnBPcDMpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX01PRFVMQVJfU1VCLCBUaW1lb3V0KTsKK30KKworLyoqCisgICogQGJyaWVmICBNb2R1bGFyIHN1YnN0cmFjdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kU3ViX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kU3ViSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIGluLT5wT3AzKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT0RVTEFSX1NVQik7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9kdWxhciByZWR1Y3Rpb24gaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb2RSZWQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb2RSZWRJblR5cGVEZWYgKmluLCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX01vZFJlZF9TZXQoaHBrYSwgaW4pOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX01PRFVMQVJfUkVELCBUaW1lb3V0KTsKK30KKworLyoqCisgICogQGJyaWVmICBNb2R1bGFyIHJlZHVjdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9kUmVkX0lUKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kUmVkSW5UeXBlRGVmICppbikKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9Nb2RSZWRfU2V0KGhwa2EsIGluKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT0RVTEFSX1JFRCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vbnRnb21lcnlNdWwoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb250Z29tZXJ5TXVsSW5UeXBlRGVmICppbiwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogU2V0IGlucHV0IHBhcmFtZXRlciBpbiBQS0EgUkFNICovCisgIFBLQV9BUklfU2V0KGhwa2EsIGluLT5zaXplLCBpbi0+cE9wMSwgaW4tPnBPcDIsIGluLT5wT3AzKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2VzcyhocGthLCBQS0FfTU9ERV9NT05UR09NRVJZX01VTCwgVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgaW4gSW5wdXQgaW5mb3JtYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QS0FfTW9udGdvbWVyeU11bF9JVChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vbnRnb21lcnlNdWxJblR5cGVEZWYgKmluKQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX0FSSV9TZXQoaHBrYSwgaW4tPnNpemUsIGluLT5wT3AxLCBpbi0+cE9wMiwgaW4tPnBPcDMpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzX0lUKGhwa2EsIFBLQV9NT0RFX01PTlRHT01FUllfTVVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBvcGVyYXRpb24gcmVzdWx0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBwUmVzIFBvaW50ZXIgdG8gbWVtb3J5IGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgICovCit2b2lkIEhBTF9QS0FfQXJpdGhtZXRpY19HZXRSZXN1bHQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIHVpbnQzMl90ICpwUmVzKQoreworICB1aW50MzJfdCBtb2RlID0gKGhwa2EtPkluc3RhbmNlLT5DUiAmIFBLQV9DUl9NT0RFX01zaykgPj4gUEtBX0NSX01PREVfUG9zOworICB1aW50MzJfdCBzaXplID0gMDsKKworICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgbG9jYXRpb24gKGluZGljYXRlZCBpbiBwUmVzIHBhcmFtZXRlcikgKi8KKyAgc3dpdGNoIChtb2RlKQorICB7CisgICAgY2FzZSBQS0FfTU9ERV9BUklUSE1FVElDX1NVQjoKKyAgICBjYXNlIFBLQV9NT0RFX01PRFVMQVJfQUREOgorICAgIGNhc2UgUEtBX01PREVfTU9EVUxBUl9SRUQ6CisgICAgY2FzZSBQS0FfTU9ERV9NT0RVTEFSX0lOVjoKKyAgICBjYXNlIFBLQV9NT0RFX01PRFVMQVJfU1VCOgorICAgIGNhc2UgUEtBX01PREVfTU9OVEdPTUVSWV9NVUw6CisgICAgICBzaXplID0gaHBrYS0+SW5zdGFuY2UtPlJBTVsxXSAvIDMyVUw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBLQV9NT0RFX0FSSVRITUVUSUNfQUREOgorICAgICAgc2l6ZSA9IGhwa2EtPkluc3RhbmNlLT5SQU1bMV0gLyAzMlVMOworCisgICAgICAvKiBNYW5hZ2UgdGhlIG92ZXJmbG93IG9mIHRoZSBhZGRpdGlvbiAqLworICAgICAgaWYgKGhwa2EtPkluc3RhbmNlLT5SQU1bNTAwVSArIHNpemVdICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZSArPSAxVUw7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEtBX01PREVfQ09NUEFSSVNPTjoKKyAgICAgIHNpemUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQS0FfTU9ERV9BUklUSE1FVElDX01VTDoKKyAgICAgIHNpemUgPSBocGthLT5JbnN0YW5jZS0+UkFNWzFdIC8gMzJVTCAqIDJVTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwUmVzICE9IE5VTEwpCisgIHsKKyAgICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgICAgY2FzZSBQS0FfTU9ERV9BUklUSE1FVElDX1NVQjoKKyAgICAgIGNhc2UgUEtBX01PREVfTU9EVUxBUl9BREQ6CisgICAgICBjYXNlIFBLQV9NT0RFX01PRFVMQVJfUkVEOgorICAgICAgY2FzZSBQS0FfTU9ERV9NT0RVTEFSX0lOVjoKKyAgICAgIGNhc2UgUEtBX01PREVfTU9EVUxBUl9TVUI6CisgICAgICBjYXNlIFBLQV9NT0RFX01PTlRHT01FUllfTVVMOgorICAgICAgY2FzZSBQS0FfTU9ERV9BUklUSE1FVElDX0FERDoKKyAgICAgIGNhc2UgUEtBX01PREVfQ09NUEFSSVNPTjoKKyAgICAgIGNhc2UgUEtBX01PREVfQVJJVEhNRVRJQ19NVUw6CisgICAgICAgIFBLQV9NZW1jcHlfdTMyX3RvX3UzMihwUmVzLCAmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfQVJJVEhNRVRJQ19BTExfT1BTX09VVF9SRVNVTFRdLCBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBNb250Z29tZXJ5IHBhcmFtZXRlciBjb21wdXRhdGlvbiBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUEtBX01vbnRnb21lcnlQYXJhbShQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vbnRnb21lcnlQYXJhbUluVHlwZURlZiAqaW4sIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFNldCBpbnB1dCBwYXJhbWV0ZXIgaW4gUEtBIFJBTSAqLworICBQS0FfTW9udGdvbWVyeVBhcmFtX1NldChocGthLCBpbi0+c2l6ZSwgaW4tPnBPcDEpOworCisgIC8qIFN0YXJ0IHRoZSBvcGVyYXRpb24gKi8KKyAgcmV0dXJuIFBLQV9Qcm9jZXNzKGhwa2EsIFBLQV9NT0RFX01PTlRHT01FUllfUEFSQU0sIFRpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1vbnRnb21lcnkgcGFyYW1ldGVyIGNvbXB1dGF0aW9uIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Nb250Z29tZXJ5UGFyYW1JblR5cGVEZWYgKmluKQoreworICAvKiBTZXQgaW5wdXQgcGFyYW1ldGVyIGluIFBLQSBSQU0gKi8KKyAgUEtBX01vbnRnb21lcnlQYXJhbV9TZXQoaHBrYSwgaW4tPnNpemUsIGluLT5wT3AxKTsKKworICAvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisgIHJldHVybiBQS0FfUHJvY2Vzc19JVChocGthLCBQS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXRyaWV2ZSBvcGVyYXRpb24gcmVzdWx0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBwUmVzIHBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBjb3BpZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3ZvaWQgSEFMX1BLQV9Nb250Z29tZXJ5UGFyYW1fR2V0UmVzdWx0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCB1aW50MzJfdCAqcFJlcykKK3sKKyAgdWludDMyX3Qgc2l6ZTsKKworICAvKiBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGZyb20gdGhlIFBLQSBSQU0gKi8KKyAgc2l6ZSA9IChocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT05UR09NRVJZX1BBUkFNX0lOX01PRF9OQl9CSVRTXSArIDMxVUwpIC8gMzJVTDsKKworICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gYXBwcm9wcmlhdGUgbG9jYXRpb24gKGluZGljYXRlZCBpbiBvdXQgcGFyYW1ldGVyKSAqLworICBQS0FfTWVtY3B5X3UzMl90b191MzIocFJlcywgJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PTlRHT01FUllfUEFSQU1fT1VUX1BBUkFNRVRFUl0sIHNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IGFueSBvbmdvaW5nIG9wZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BLQV9BYm9ydChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyID0gSEFMX09LOworCisgIC8qIENsZWFyIEVOIGJpdCAqLworICAvKiBUaGlzIGFib3J0IGFueSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKFBLQSBSQU0gY29udGVudCBpcyBub3QgZ3VhcmFudGVkIGluIHRoaXMgY2FzZSkgKi8KKyAgQ0xFQVJfQklUKGhwa2EtPkluc3RhbmNlLT5DUiwgUEtBX0NSX0VOKTsKKyAgU0VUX0JJVChocGthLT5JbnN0YW5jZS0+Q1IsIFBLQV9DUl9FTik7CisKKyAgLyogUmVzZXQgYW55IHBlbmRpbmcgZmxhZyAqLworICBTRVRfQklUKGhwa2EtPkluc3RhbmNlLT5DTFJGUiwgUEtBX0NMUkZSX1BST0NFTkRGQyB8IFBLQV9DTFJGUl9SQU1FUlJGQyB8IFBLQV9DTFJGUl9BRERSRVJSRkMpOworCisgIC8qIFJlc2V0IHRoZSBlcnJvciBjb2RlICovCisgIGhwa2EtPkVycm9yQ29kZSA9IEhBTF9QS0FfRVJST1JfTk9ORTsKKworICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KKyAgaHBrYS0+U3RhdGUgPSBIQUxfUEtBX1NUQVRFX1JFQURZOworCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFBLQSBSQU0uCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BLQV9SQU1SZXNldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSkKK3sKKyAgdWludDMyX3QgaW5kZXg7CisKKyAgLyogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgUEtBIFJBTSAqLworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQS0FfUkFNX1NJWkU7IGluZGV4KyspCisgIHsKKyAgICAvKiBDbGVhciB0aGUgY29udGVudCAqLworICAgIGhwa2EtPkluc3RhbmNlLT5SQU1baW5kZXhdID0gMFVMOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBLQSBldmVudCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUEtBX0lSUUhhbmRsZXIoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIHVpbnQzMl90IG1vZGUgPSBQS0FfR2V0TW9kZShocGthKTsKKyAgRmxhZ1N0YXR1cyBhZGRFcnJGbGFnID0gX19IQUxfUEtBX0dFVF9GTEFHKGhwa2EsIFBLQV9GTEFHX0FERFJFUlIpOworICBGbGFnU3RhdHVzIHJhbUVyckZsYWcgPSBfX0hBTF9QS0FfR0VUX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfUkFNRVJSKTsKKyAgRmxhZ1N0YXR1cyBwcm9jRW5kRmxhZyA9IF9fSEFMX1BLQV9HRVRfRkxBRyhocGthLCBQS0FfRkxBR19QUk9DRU5EKTsKKworICAvKiBBZGRyZXNzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAqLworICBpZiAoKF9fSEFMX1BLQV9HRVRfSVRfU09VUkNFKGhwa2EsIFBLQV9JVF9BRERSRVJSKSA9PSBTRVQpICYmIChhZGRFcnJGbGFnID09IFNFVCkpCisgIHsKKyAgICBocGthLT5FcnJvckNvZGUgfD0gSEFMX1BLQV9FUlJPUl9BRERSRVJSOworCisgICAgLyogQ2xlYXIgQUREUkVSUiBmbGFnICovCisgICAgX19IQUxfUEtBX0NMRUFSX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfQUREUkVSUik7CisgIH0KKworICAvKiBSQU0gYWNjZXNzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAqLworICBpZiAoKF9fSEFMX1BLQV9HRVRfSVRfU09VUkNFKGhwa2EsIFBLQV9JVF9SQU1FUlIpID09IFNFVCkgJiYgKHJhbUVyckZsYWcgPT0gU0VUKSkKKyAgeworICAgIGhwa2EtPkVycm9yQ29kZSB8PSBIQUxfUEtBX0VSUk9SX1JBTUVSUjsKKworICAgIC8qIENsZWFyIFJBTUVSUiBmbGFnICovCisgICAgX19IQUxfUEtBX0NMRUFSX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfUkFNRVJSKTsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBvcGVyYXRpb24gc3VjY2VzcyBpbiBjYXNlIG9mIEVDRFNBIHNpZ25hdHVyZSAqLworICBpZiAobW9kZSA9PSBQS0FfTU9ERV9FQ0RTQV9TSUdOQVRVUkUpCisgIHsKKyAgICAvKiBJZiBlcnJvciBvdXRwdXQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIDAsIGVjZHNhIHNpZ24gb3BlcmF0aW9uIG5lZWQgdG8gYmUgcmVwZWF0ZWQgKi8KKyAgICBpZiAoaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9PVVRfRVJST1JdICE9IDBVTCkKKyAgICB7CisgICAgICBocGthLT5FcnJvckNvZGUgfD0gSEFMX1BLQV9FUlJPUl9PUEVSQVRJT047CisgICAgfQorICB9CisKKyAgLyogVHJpZ2dlciB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgYW4gZXJyb3IgaXMgcHJlc2VudCAqLworICBpZiAoaHBrYS0+RXJyb3JDb2RlICE9IEhBTF9QS0FfRVJST1JfTk9ORSkKKyAgeworI2lmIChVU0VfSEFMX1BLQV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBocGthLT5FcnJvckNhbGxiYWNrKGhwa2EpOworI2Vsc2UKKyAgICBIQUxfUEtBX0Vycm9yQ2FsbGJhY2soaHBrYSk7CisjZW5kaWYgLyogVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICAvKiBFbmQgT2YgT3BlcmF0aW9uIGludGVycnVwdCBvY2N1cnJlZCAqLworICBpZiAoKF9fSEFMX1BLQV9HRVRfSVRfU09VUkNFKGhwa2EsIFBLQV9JVF9QUk9DRU5EKSA9PSBTRVQpICYmIChwcm9jRW5kRmxhZyA9PSBTRVQpKQorICB7CisgICAgLyogQ2xlYXIgUFJPQ0VORCBmbGFnICovCisgICAgX19IQUxfUEtBX0NMRUFSX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfUFJPQ0VORCk7CisKKyAgICAvKiBTZXQgdGhlIHN0YXRlIHRvIHJlYWR5ICovCisgICAgaHBrYS0+U3RhdGUgPSBIQUxfUEtBX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfUEtBX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhwa2EtPk9wZXJhdGlvbkNwbHRDYWxsYmFjayhocGthKTsKKyNlbHNlCisgICAgSEFMX1BLQV9PcGVyYXRpb25DcGx0Q2FsbGJhY2soaHBrYSk7CisjZW5kaWYgLyogVVNFX0hBTF9QS0FfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBQcm9jZXNzIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BLQV9PcGVyYXRpb25DcGx0Q2FsbGJhY2soUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwa2EpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUEtBX09wZXJhdGlvbkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUEtBX0Vycm9yQ2FsbGJhY2soUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhwa2EpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUEtBX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBQS0FfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdCB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFBLQSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9QS0FfU3RhdGVUeXBlRGVmIEhBTF9QS0FfR2V0U3RhdGUoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIC8qIFJldHVybiBQS0EgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBocGthLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFBLQSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHJldHZhbCBQS0EgZXJyb3IgY29kZQorKi8KK3VpbnQzMl90IEhBTF9QS0FfR2V0RXJyb3IoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EpCit7CisgIC8qIFJldHVybiBQS0EgaGFuZGxlIGVycm9yIGNvZGUgKi8KKyAgcmV0dXJuIGhwa2EtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBLQV9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2V0IFBLQSBvcGVyYXRpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEByZXR2YWwgUmV0dXJuIHRoZSBjdXJyZW50IG1vZGUKKyAgKi8KK3VpbnQzMl90IFBLQV9HZXRNb2RlKFBLQV9IYW5kbGVUeXBlRGVmICpocGthKQoreworICAvKiByZXR1cm4gdGhlIHNoaWZ0ZWQgUEtBX0NSX01PREUgdmFsdWUgKi8KKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoaHBrYS0+SW5zdGFuY2UtPkNSLCBQS0FfQ1JfTU9ERSkgPj4gUEtBX0NSX01PREVfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBXYWl0IGZvciBvcGVyYXRpb24gY29tcGxldGlvbiBvciB0aW1lb3V0LgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmQuCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUEtBX1BvbGxFbmRPZk9wZXJhdGlvbihQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICAvKiBXYWl0IGZvciB0aGUgZW5kIG9mIG9wZXJhdGlvbiBvciB0aW1lb3V0ICovCisgIHdoaWxlICgoaHBrYS0+SW5zdGFuY2UtPlNSICYgUEtBX1NSX1BST0NFTkRGKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aW1lb3V0IGlzIGRpc2FibGVkIChzZXQgdG8gaW5maW5pdGUgd2FpdCkgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBhIGhhbCBlcnJvciBjb2RlIGJhc2VkIG9uIFBLQSBlcnJvciBmbGFncy4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgbW9kZSBQS0Egb3BlcmF0aW5nIG1vZGUKKyAgKiBAcmV0dmFsIGVycm9yIGNvZGUKKyAgKi8KK3VpbnQzMl90IFBLQV9DaGVja0Vycm9yKFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCB1aW50MzJfdCBtb2RlKQoreworICB1aW50MzJfdCBlcnIgPSBIQUxfUEtBX0VSUk9SX05PTkU7CisKKyAgLyogQ2hlY2sgUkFNRVJSIGVycm9yICovCisgIGlmIChfX0hBTF9QS0FfR0VUX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfUkFNRVJSKSA9PSBTRVQpCisgIHsKKyAgICBlcnIgfD0gSEFMX1BLQV9FUlJPUl9SQU1FUlI7CisgIH0KKworICAvKiBDaGVjayBBRERSRVJSIGVycm9yICovCisgIGlmIChfX0hBTF9QS0FfR0VUX0ZMQUcoaHBrYSwgUEtBX0ZMQUdfQUREUkVSUikgPT0gU0VUKQorICB7CisgICAgZXJyIHw9IEhBTF9QS0FfRVJST1JfQUREUkVSUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBvcGVyYXRpb24gc3VjY2VzcyBpbiBjYXNlIG9mIEVDRFNBIHNpZ25hdHVyZSAqLworICBpZiAobW9kZSA9PSBQS0FfTU9ERV9FQ0RTQV9TSUdOQVRVUkUpCisgIHsKKyAgICAvKiBJZiBlcnJvciBvdXRwdXQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIDAsIGVjc2Egc2lnbiBvcGVyYXRpb24gbmVlZCB0byBiZSByZXBlYXRlZCAqLworICAgIGlmIChocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX09VVF9FUlJPUl0gIT0gMFVMKQorICAgIHsKKyAgICAgIGVyciB8PSBIQUxfUEtBX0VSUk9SX09QRVJBVElPTjsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCBudW1iZXIgb2YgYml0cyBpbnNpZGUgYW4gYXJyYXkgb2YgdTguCisgICogQHBhcmFtICBieXRlTnVtYmVyIE51bWJlciBvZiB1OCBpbnNpZGUgdGhlIGFycmF5CisgICovCit1aW50MzJfdCBQS0FfR2V0Qml0U2l6ZV91OCh1aW50MzJfdCBieXRlTnVtYmVyKQoreworICAvKiBDb252ZXJ0IGZyb20gbnVtYmVyIG9mIHVpbnQ4X3QgaW4gYW4gYXJyYXkgdG8gdGhlIGFzc29jaWF0ZWQgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBhcnJheSAqLworICByZXR1cm4gYnl0ZU51bWJlciAqIDhVTDsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgb3B0aW1hbCBudW1iZXIgb2YgYml0cyBpbnNpZGUgYW4gYXJyYXkgb2YgdTguCisgICogQHBhcmFtICBieXRlTnVtYmVyIE51bWJlciBvZiB1OCBpbnNpZGUgdGhlIGFycmF5CisgICogQHBhcmFtICBtc2IgTW9zdCBzaWduaWZpY2FudCB1aW50OF90IG9mIHRoZSBhcnJheQorICAqLwordWludDMyX3QgUEtBX0dldE9wdEJpdFNpemVfdTgodWludDMyX3QgYnl0ZU51bWJlciwgdWludDhfdCBtc2IpCit7CisgIHVpbnQzMl90IHBvc2l0aW9uOworCisgIHBvc2l0aW9uID0gMzJVTCAtIF9fQ0xaKG1zYik7CisKKyAgcmV0dXJuICgoKGJ5dGVOdW1iZXIgLSAxVUwpICogOFVMKSArIHBvc2l0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgbnVtYmVyIG9mIGJpdHMgaW5zaWRlIGFuIGFycmF5IG9mIHUzMi4KKyAgKiBAcGFyYW0gIHdvcmROdW1iZXIgTnVtYmVyIG9mIHUzMiBpbnNpZGUgdGhlIGFycmF5CisgICovCit1aW50MzJfdCBQS0FfR2V0Qml0U2l6ZV91MzIodWludDMyX3Qgd29yZE51bWJlcikKK3sKKyAgLyogQ29udmVydCBmcm9tIG51bWJlciBvZiB1aW50MzJfdCBpbiBhbiBhcnJheSB0byB0aGUgYXNzb2NpYXRlZCBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGFycmF5ICovCisgIHJldHVybiB3b3JkTnVtYmVyICogMzJVTDsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgbnVtYmVyIG9mIHVpbnQ4X3QgZWxlbWVudCBpbiBhbiBhcnJheSBvZiBiaXRTaXplIGJpdHMuCisgICogQHBhcmFtICBiaXRTaXplIE51bWJlciBvZiBiaXRzIGluIGFuIGFycmF5CisgICovCit1aW50MzJfdCBQS0FfR2V0QXJyYXlTaXplX3U4KHVpbnQzMl90IGJpdFNpemUpCit7CisgIC8qIE1hbmFnZSB0aGUgbm9uIGFsaWduZWQgb24gdWludDhfdCBiaXRzaXplOiAqLworICAvKiAgIDUxMiBiaXRzIHJlcXVpcmVzIDY0IHVpbnQ4X3QgICAgICAgICAgICAgKi8KKyAgLyogICA1MjEgYml0cyByZXF1aXJlcyA2NiB1aW50OF90ICAgICAgICAgICAgICovCisgIHJldHVybiAoKGJpdFNpemUgKyA3VUwpIC8gOFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb3B5IHVpbnQzMl90IGFycmF5IHRvIHVpbnQ4X3QgYXJyYXkgdG8gZml0IFBLQSBudW1iZXIgcmVwcmVzZW50YXRpb24uCisgICogQHBhcmFtICBkc3QgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAqIEBwYXJhbSAgc3JjIFBvaW50ZXIgdG8gc291cmNlCisgICogQHBhcmFtICBuIE51bWJlciBvZiB1aW50OF90IHRvIGNvcHkKKyAgKiBAcmV0dmFsIGRzdAorICAqLwordm9pZCBQS0FfTWVtY3B5X3UzMl90b191OCh1aW50OF90IGRzdFtdLCBfX0lPIGNvbnN0IHVpbnQzMl90IHNyY1tdLCBzaXplX3QgbikKK3sKKyAgaWYgKGRzdCAhPSBOVUxMKQorICB7CisgICAgaWYgKHNyYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVpbnQzMl90IGluZGV4X3VpbnQzMl90ID0gMFVMOyAvKiBUaGlzIGluZGV4IGlzIHVzZWQgb3V0c2lkZSBvZiB0aGUgbG9vcCAqLworCisgICAgICBmb3IgKDsgaW5kZXhfdWludDMyX3QgPCAobiAvIDRVTCk7IGluZGV4X3VpbnQzMl90KyspCisgICAgICB7CisgICAgICAgIC8qIEF2b2lkIGNhc3RpbmcgZnJvbSB1aW50OF90KiB0byB1aW50MzJfdCogYnkgY29weWluZyA0IHVpbnQ4X3QgaW4gYSByb3cgKi8KKyAgICAgICAgLyogQXBwbHkgX19SRVYgZXF1aXZhbGVudCAqLworICAgICAgICB1aW50MzJfdCBpbmRleF91aW50OF90ID0gbiAtIDRVTCAtIChpbmRleF91aW50MzJfdCAqIDRVTCk7CisgICAgICAgIGRzdFtpbmRleF91aW50OF90ICsgM1VMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4MDAwMDAwRkZVKSk7CisgICAgICAgIGRzdFtpbmRleF91aW50OF90ICsgMlVMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4MDAwMEZGMDBVKSA+PiA4VUwpOworICAgICAgICBkc3RbaW5kZXhfdWludDhfdCArIDFVTF0gPSAodWludDhfdCkoKHNyY1tpbmRleF91aW50MzJfdF0gJiAweDAwRkYwMDAwVSkgPj4gMTZVTCk7CisgICAgICAgIGRzdFtpbmRleF91aW50OF90ICsgMFVMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4RkYwMDAwMDBVKSA+PiAyNFVMKTsKKyAgICAgIH0KKworICAgICAgLyogTWFuYWdlIHRoZSBidWZmZXJzIG5vdCBhbGlnbmVkIG9uIHVpbnQzMl90ICovCisgICAgICBpZiAoKG4gJSA0VUwpID09IDFVTCkKKyAgICAgIHsKKyAgICAgICAgZHN0WzBVTF0gPSAodWludDhfdCkoKHNyY1tpbmRleF91aW50MzJfdF0gJiAweDAwMDAwMEZGVSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKG4gJSA0VUwpID09IDJVTCkKKyAgICAgIHsKKyAgICAgICAgZHN0WzFVTF0gPSAodWludDhfdCkoKHNyY1tpbmRleF91aW50MzJfdF0gJiAweDAwMDAwMEZGVSkpOworICAgICAgICBkc3RbMFVMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4MDAwMEZGMDBVKSA+PiA4VUwpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKG4gJSA0VUwpID09IDNVTCkKKyAgICAgIHsKKyAgICAgICAgZHN0WzJVTF0gPSAodWludDhfdCkoKHNyY1tpbmRleF91aW50MzJfdF0gJiAweDAwMDAwMEZGVSkpOworICAgICAgICBkc3RbMVVMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4MDAwMEZGMDBVKSA+PiA4VUwpOworICAgICAgICBkc3RbMFVMXSA9ICh1aW50OF90KSgoc3JjW2luZGV4X3VpbnQzMl90XSAmIDB4MDBGRjAwMDBVKSA+PiAxNlVMKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGhlIGxhc3QgZWxlbWVudCBpcyBhbHJlYWR5IGhhbmRsZSBpbiB0aGUgbG9vcCAqLworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIENvcHkgdWludDhfdCBhcnJheSB0byB1aW50MzJfdCBhcnJheSB0byBmaXQgUEtBIG51bWJlciByZXByZXNlbnRhdGlvbi4KKyAgKiBAcGFyYW0gIGRzdCBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICogQHBhcmFtICBzcmMgUG9pbnRlciB0byBzb3VyY2UKKyAgKiBAcGFyYW0gIG4gTnVtYmVyIG9mIHVpbnQ4X3QgdG8gY29weSAobXVzdCBiZSBtdWx0aXBsZSBvZiA0KQorICAqIEByZXR2YWwgZHN0CisgICovCit2b2lkIFBLQV9NZW1jcHlfdThfdG9fdTMyKF9fSU8gdWludDMyX3QgZHN0W10sIGNvbnN0IHVpbnQ4X3Qgc3JjW10sIHNpemVfdCBuKQoreworICBpZiAoZHN0ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoc3JjICE9IE5VTEwpCisgICAgeworICAgICAgdWludDMyX3QgaW5kZXggPSAwVUw7IC8qIFRoaXMgaW5kZXggaXMgdXNlZCBvdXRzaWRlIG9mIHRoZSBsb29wICovCisKKyAgICAgIGZvciAoOyBpbmRleCA8IChuIC8gNFVMKTsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgLyogQXBwbHkgdGhlIGVxdWl2YWxlbnQgb2YgX19SRVYgZnJvbSB1aW50OF90IHRvIHVpbnQzMl90ICovCisgICAgICAgIGRzdFtpbmRleF0gPSAoKHVpbnQzMl90KXNyY1sobiAtIChpbmRleCAqIDRVTCkgLSAxVUwpXSkgXAorICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQzMl90KXNyY1sobiAtIChpbmRleCAqIDRVTCkgLSAyVUwpXSA8PCA4VUwpIFwKKyAgICAgICAgICAgICAgICAgICAgIHwgKCh1aW50MzJfdClzcmNbKG4gLSAoaW5kZXggKiA0VUwpIC0gM1VMKV0gPDwgMTZVTCkgXAorICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQzMl90KXNyY1sobiAtIChpbmRleCAqIDRVTCkgLSA0VUwpXSA8PCAyNFVMKTsKKyAgICAgIH0KKworICAgICAgLyogTWFuYWdlIHRoZSBidWZmZXJzIG5vdCBhbGlnbmVkIG9uIHVpbnQzMl90ICovCisgICAgICBpZiAoKG4gJSA0VUwpID09IDFVTCkKKyAgICAgIHsKKyAgICAgICAgZHN0W2luZGV4XSA9ICh1aW50MzJfdClzcmNbKG4gLSAoaW5kZXggKiA0VUwpIC0gMVVMKV07CisgICAgICB9CisgICAgICBlbHNlIGlmICgobiAlIDRVTCkgPT0gMlVMKQorICAgICAgeworICAgICAgICBkc3RbaW5kZXhdID0gKCh1aW50MzJfdClzcmNbKG4gLSAoaW5kZXggKiA0VUwpIC0gMVVMKV0pIFwKKyAgICAgICAgICAgICAgICAgICAgIHwgKCh1aW50MzJfdClzcmNbKG4gLSAoaW5kZXggKiA0VUwpIC0gMlVMKV0gPDwgOFVMKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChuICUgNFVMKSA9PSAzVUwpCisgICAgICB7CisgICAgICAgIGRzdFtpbmRleF0gPSAoKHVpbnQzMl90KXNyY1sobiAtIChpbmRleCAqIDRVTCkgLSAxVUwpXSkgXAorICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQzMl90KXNyY1sobiAtIChpbmRleCAqIDRVTCkgLSAyVUwpXSA8PCA4VUwpIFwKKyAgICAgICAgICAgICAgICAgICAgIHwgKCh1aW50MzJfdClzcmNbKG4gLSAoaW5kZXggKiA0VUwpIC0gM1VMKV0gPDwgMTZVTCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRoZSBsYXN0IGVsZW1lbnQgaXMgYWxyZWFkeSBoYW5kbGUgaW4gdGhlIGxvb3AgKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb3B5IHVpbnQzMl90IGFycmF5IHRvIHVpbnQzMl90IGFycmF5LgorICAqIEBwYXJhbSAgZHN0IFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgKiBAcGFyYW0gIHNyYyBQb2ludGVyIHRvIHNvdXJjZQorICAqIEBwYXJhbSAgbiBOdW1iZXIgb2YgdTMyIHRvIGJlIGhhbmRsZWQKKyAgKiBAcmV0dmFsIGRzdAorICAqLwordm9pZCBQS0FfTWVtY3B5X3UzMl90b191MzIoX19JTyB1aW50MzJfdCBkc3RbXSwgX19JTyBjb25zdCB1aW50MzJfdCBzcmNbXSwgc2l6ZV90IG4pCit7CisgIC8qIElmIGEgZGVzdGluYXRpb24gYnVmZmVyIGlzIHByb3ZpZGVkICovCisgIGlmIChkc3QgIT0gTlVMTCkKKyAgeworICAgIC8qIElmIGEgc291cmNlIGJ1ZmZlciBpcyBwcm92aWRlZCAqLworICAgIGlmIChzcmMgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSAqLworICAgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDBVTDsgaW5kZXggPCBuOyBpbmRleCsrKQorICAgICAgeworICAgICAgICAvKiBDb3B5IHRoZSBjb250ZW50ICovCisgICAgICAgIGRzdFtpbmRleF0gPSBzcmNbaW5kZXhdOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyaWMgZnVuY3Rpb24gdG8gc3RhcnQgYSBQS0Egb3BlcmF0aW9uIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIG1vZGUgUEtBIG9wZXJhdGlvbgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBQS0FfUHJvY2VzcyhQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgdWludDMyX3QgbW9kZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgaWYgKGhwa2EtPlN0YXRlID09IEhBTF9QS0FfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBTZXQgdGhlIHN0YXRlIHRvIGJ1c3kgKi8KKyAgICBocGthLT5TdGF0ZSA9IEhBTF9QS0FfU1RBVEVfQlVTWTsKKworICAgIC8qIENsZWFyIGFueSBwZW5kaW5nIGVycm9yICovCisgICAgaHBrYS0+RXJyb3JDb2RlID0gSEFMX1BLQV9FUlJPUl9OT05FOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIFNldCB0aGUgbW9kZSBhbmQgZGVhY3RpdmF0ZSB0aGUgaW50ZXJydXB0cyAqLworICAgIE1PRElGWV9SRUcoaHBrYS0+SW5zdGFuY2UtPkNSLCBQS0FfQ1JfTU9ERSB8IFBLQV9DUl9QUk9DRU5ESUUgfCBQS0FfQ1JfUkFNRVJSSUUgfCBQS0FfQ1JfQUREUkVSUklFLCBtb2RlIDw8IFBLQV9DUl9NT0RFX1Bvcyk7CisKKyAgICAvKiBTdGFydCB0aGUgY29tcHV0YXRpb24gKi8KKyAgICBocGthLT5JbnN0YW5jZS0+Q1IgfD0gUEtBX0NSX1NUQVJUOworCisgICAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiBvcGVyYXRpb24gb3IgdGltZW91dCAqLworICAgIGlmIChQS0FfUG9sbEVuZE9mT3BlcmF0aW9uKGhwa2EsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIEFib3J0IGFueSBvbmdvaW5nIG9wZXJhdGlvbiAqLworICAgICAgQ0xFQVJfQklUKGhwa2EtPkluc3RhbmNlLT5DUiwgUEtBX0NSX0VOKTsKKworICAgICAgaHBrYS0+RXJyb3JDb2RlIHw9IEhBTF9QS0FfRVJST1JfVElNRU9VVDsKKworICAgICAgLyogTWFrZSByZWFkeSBmb3IgdGhlIG5leHQgb3BlcmF0aW9uICovCisgICAgICBTRVRfQklUKGhwa2EtPkluc3RhbmNlLT5DUiwgUEtBX0NSX0VOKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBlcnJvciAqLworICAgIGhwa2EtPkVycm9yQ29kZSB8PSBQS0FfQ2hlY2tFcnJvcihocGthLCBtb2RlKTsKKworICAgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICAgIGhwa2EtPkluc3RhbmNlLT5DTFJGUiB8PSAoUEtBX0NMUkZSX1BST0NFTkRGQyB8IFBLQV9DTFJGUl9SQU1FUlJGQyB8IFBLQV9DTFJGUl9BRERSRVJSRkMpOworCisgICAgLyogU2V0IHRoZSBzdGF0ZSB0byByZWFkeSAqLworICAgIGhwa2EtPlN0YXRlID0gSEFMX1BLQV9TVEFURV9SRUFEWTsKKworICAgIC8qIE1hbmFnZSB0aGUgcmVzdWx0IGJhc2VkIG9uIGVuY291bnRlcmVkIGVycm9ycyAqLworICAgIGlmIChocGthLT5FcnJvckNvZGUgIT0gSEFMX1BLQV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIGVyciA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgZXJyID0gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJpYyBmdW5jdGlvbiB0byBzdGFydCBhIFBLQSBvcGVyYXRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIG1vZGUgUEtBIG9wZXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUEtBX1Byb2Nlc3NfSVQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIHVpbnQzMl90IG1vZGUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIGVyciA9IEhBTF9PSzsKKworICBpZiAoaHBrYS0+U3RhdGUgPT0gSEFMX1BLQV9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFNldCB0aGUgc3RhdGUgdG8gYnVzeSAqLworICAgIGhwa2EtPlN0YXRlID0gSEFMX1BLQV9TVEFURV9CVVNZOworCisgICAgLyogQ2xlYXIgYW55IHBlbmRpbmcgZXJyb3IgKi8KKyAgICBocGthLT5FcnJvckNvZGUgPSBIQUxfUEtBX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgdGhlIG1vZGUgYW5kIGFjdGl2YXRlIGludGVycnVwdHMgKi8KKyAgICBNT0RJRllfUkVHKGhwa2EtPkluc3RhbmNlLT5DUiwgUEtBX0NSX01PREUgfCBQS0FfQ1JfUFJPQ0VORElFIHwgUEtBX0NSX1JBTUVSUklFIHwgUEtBX0NSX0FERFJFUlJJRSwgKG1vZGUgPDwgUEtBX0NSX01PREVfUG9zKSB8IFBLQV9DUl9QUk9DRU5ESUUgfCBQS0FfQ1JfUkFNRVJSSUUgfCBQS0FfQ1JfQUREUkVSUklFKTsKKworICAgIC8qIFN0YXJ0IHRoZSBjb21wdXRhdGlvbiAqLworICAgIGhwa2EtPkluc3RhbmNlLT5DUiB8PSBQS0FfQ1JfU1RBUlQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgZXJyID0gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGlucHV0IHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICovCit2b2lkIFBLQV9Nb2RFeHBfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kRXhwSW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBudW1iZXIgb2YgYml0IHBlciBvcGVyYW5kICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX09QX05CX0JJVFNdID0gUEtBX0dldEJpdFNpemVfdTgoaW4tPk9wU2l6ZSk7CisKKyAgLyogR2V0IHRoZSBudW1iZXIgb2YgYml0IG9mIHRoZSBleHBvbmVudCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX0VYUF9JTl9FWFBfTkJfQklUU10gPSBQS0FfR2V0Qml0U2l6ZV91OChpbi0+ZXhwU2l6ZSk7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBwT3AxIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX0VYUE9ORU5UX0JBU0VdLCBpbi0+cE9wMSwgaW4tPk9wU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX0VYUE9ORU5UX0JBU0UgKyAoaW4tPk9wU2l6ZSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGV4cG9uZW50IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX0VYUE9ORU5UXSwgaW4tPnBFeHAsIGluLT5leHBTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fRVhQT05FTlQgKyAoaW4tPmV4cFNpemUgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBtb2R1bHVzIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX01PRFVMVVNdLCBpbi0+cE1vZCwgaW4tPk9wU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX01PRFVMVVMgKyAoaW4tPk9wU2l6ZSAvIDRVTCldID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfTW9kRXhwRmFzdE1vZGVfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kRXhwRmFzdE1vZGVJblR5cGVEZWYgKmluKQoreworICAvKiBHZXQgdGhlIG51bWJlciBvZiBiaXQgcGVyIG9wZXJhbmQgKi8KKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fT1BfTkJfQklUU10gPSBQS0FfR2V0Qml0U2l6ZV91OChpbi0+T3BTaXplKTsKKworICAvKiBHZXQgdGhlIG51bWJlciBvZiBiaXQgb2YgdGhlIGV4cG9uZW50ICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX0VYUF9OQl9CSVRTXSA9IFBLQV9HZXRCaXRTaXplX3U4KGluLT5leHBTaXplKTsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBPcDEgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fRVhQT05FTlRfQkFTRV0sIGluLT5wT3AxLCBpbi0+T3BTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fRVhQT05FTlRfQkFTRSArIChpbi0+T3BTaXplIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgZXhwb25lbnQgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fRVhQT05FTlRdLCBpbi0+cEV4cCwgaW4tPmV4cFNpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX0VYUF9JTl9FWFBPTkVOVCArIChpbi0+ZXhwU2l6ZSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIG1vZHVsdXMgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fTU9EVUxVU10sIGluLT5wTW9kLCBpbi0+T3BTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9FWFBfSU5fTU9EVUxVUyArIChpbi0+T3BTaXplIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgTW9udGdvbWVyeSBwYXJhbWV0ZXIgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3UzMl90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfRVhQX0lOX01PTlRHT01FUllfUEFSQU1dLCBpbi0+cE1vbnRnb21lcnlQYXJhbSwgaW4tPmV4cFNpemUgLyA0VUwpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX0VYUF9JTl9NT05UR09NRVJZX1BBUkFNICsgKGluLT5leHBTaXplIC8gNFVMKV0gPSAwVUw7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGlucHV0IHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICovCit2b2lkIFBLQV9FQ0RTQVNpZ25fU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNEU0FTaWduSW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBwcmltZSBvcmRlciBuIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX09SREVSX05CX0JJVFNdID0gUEtBX0dldE9wdEJpdFNpemVfdTgoaW4tPnByaW1lT3JkZXJTaXplLCAqKGluLT5wcmltZU9yZGVyKSk7CisKKyAgLyogR2V0IHRoZSBtb2R1bHVzIHAgbGVuZ3RoICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fTU9EX05CX0JJVFNdID0gUEtBX0dldE9wdEJpdFNpemVfdTgoaW4tPm1vZHVsdXNTaXplLCAqKGluLT5tb2R1bHVzKSk7CisKKyAgLyogR2V0IHRoZSBjb2VmZmljaWVudCBhIHNpZ24gKi8KKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9BX0NPRUZGX1NJR05dID0gaW4tPmNvZWZTaWduOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgY29lZmZpY2llbnQgfGF8IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fQV9DT0VGRl0sIGluLT5jb2VmLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX0FfQ09FRkYgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG1vZHVsdXMgdmFsdWUgcCB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX01PRF9HRl0sIGluLT5tb2R1bHVzLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX01PRF9HRiArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgaW50ZWdlciBrIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fS10sIGluLT5pbnRlZ2VyLCBpbi0+cHJpbWVPcmRlclNpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX0sgKyAoKGluLT5wcmltZU9yZGVyU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGJhc2UgcG9pbnQgRyBjb29yZGluYXRlIHggdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9JTklUSUFMX1BPSU5UX1hdLCBpbi0+YmFzZVBvaW50WCwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9JTklUSUFMX1BPSU5UX1ggKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGJhc2UgcG9pbnQgRyBjb29yZGluYXRlIHkgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9JTklUSUFMX1BPSU5UX1ldLCBpbi0+YmFzZVBvaW50WSwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9JTklUSUFMX1BPSU5UX1kgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGhhc2ggb2YgbWVzc2FnZSB6IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fSEFTSF9FXSwgaW4tPmhhc2gsIGluLT5wcmltZU9yZGVyU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fSEFTSF9FICsgKChpbi0+cHJpbWVPcmRlclNpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBwcml2YXRlIGtleSBkIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fUFJJVkFURV9LRVlfRF0sIGluLT5wcml2YXRlS2V5LCBpbi0+cHJpbWVPcmRlclNpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9TSUdOX0lOX1BSSVZBVEVfS0VZX0QgKyAoKGluLT5wcmltZU9yZGVyU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHByaW1lIG9yZGVyIG4gdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfU0lHTl9JTl9PUkRFUl9OXSwgaW4tPnByaW1lT3JkZXIsIGluLT5wcmltZU9yZGVyU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1NJR05fSU5fT1JERVJfTiArICgoaW4tPnByaW1lT3JkZXJTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfRUNEU0FWZXJpZl9TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9FQ0RTQVZlcmlmSW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBwcmltZSBvcmRlciBuIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9PUkRFUl9OQl9CSVRTXSA9IFBLQV9HZXRPcHRCaXRTaXplX3U4KGluLT5wcmltZU9yZGVyU2l6ZSwgKihpbi0+cHJpbWVPcmRlcikpOworCisgIC8qIEdldCB0aGUgbW9kdWx1cyBwIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9NT0RfTkJfQklUU10gPSBQS0FfR2V0T3B0Qml0U2l6ZV91OChpbi0+bW9kdWx1c1NpemUsICooaW4tPm1vZHVsdXMpKTsKKworICAvKiBHZXQgdGhlIGNvZWZmaWNpZW50IGEgc2lnbiAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9BX0NPRUZGX1NJR05dID0gaW4tPmNvZWZTaWduOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgY29lZmZpY2llbnQgfGF8IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX0FfQ09FRkZdLCBpbi0+Y29lZiwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fQV9DT0VGRiArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgbW9kdWx1cyB2YWx1ZSBwIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX01PRF9HRl0sIGluLT5tb2R1bHVzLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9NT0RfR0YgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGJhc2UgcG9pbnQgRyBjb29yZGluYXRlIHggdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fSU5JVElBTF9QT0lOVF9YXSwgaW4tPmJhc2VQb2ludFgsIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX0lOSVRJQUxfUE9JTlRfWCArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgYmFzZSBwb2ludCBHIGNvb3JkaW5hdGUgeSB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9JTklUSUFMX1BPSU5UX1ldLCBpbi0+YmFzZVBvaW50WSwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fSU5JVElBTF9QT0lOVF9ZICsgKChpbi0+bW9kdWx1c1NpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBwdWJsaWMta2V5IGN1cnZlIHBvaW50IFEgY29vcmRpbmF0ZSB4USB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9QVUJMSUNfS0VZX1BPSU5UX1hdLCBpbi0+cFB1YktleUN1cnZlUHRYLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9QVUJMSUNfS0VZX1BPSU5UX1ggKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHB1YmxpYy1rZXkgY3VydmUgcG9pbnQgUSBjb29yZGluYXRlIHhRIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX1BVQkxJQ19LRVlfUE9JTlRfWV0sIGluLT5wUHViS2V5Q3VydmVQdFksIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX1BVQkxJQ19LRVlfUE9JTlRfWSArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgc2lnbmF0dXJlIHBhcnQgciB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9TSUdOQVRVUkVfUl0sIGluLT5SU2lnbiwgaW4tPnByaW1lT3JkZXJTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fU0lHTkFUVVJFX1IgKyAoKGluLT5wcmltZU9yZGVyU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHNpZ25hdHVyZSBwYXJ0IHMgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fU0lHTkFUVVJFX1NdLCBpbi0+U1NpZ24sIGluLT5wcmltZU9yZGVyU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX1NJR05BVFVSRV9TICsgKChpbi0+cHJpbWVPcmRlclNpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBoYXNoIG9mIG1lc3NhZ2UgeiB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0RTQV9WRVJJRl9JTl9IQVNIX0VdLCBpbi0+aGFzaCwgaW4tPnByaW1lT3JkZXJTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fSEFTSF9FICsgKChpbi0+cHJpbWVPcmRlclNpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBjdXJ2ZSBwcmltZSBvcmRlciBuIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDRFNBX1ZFUklGX0lOX09SREVSX05dLCBpbi0+cHJpbWVPcmRlciwgaW4tPnByaW1lT3JkZXJTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNEU0FfVkVSSUZfSU5fT1JERVJfTiArICgoaW4tPnByaW1lT3JkZXJTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfUlNBQ1JURXhwX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX1JTQUNSVEV4cEluVHlwZURlZiAqaW4pCit7CisgIC8qIEdldCB0aGUgb3BlcmFuZCBsZW5ndGggTSAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9SU0FfQ1JUX0VYUF9JTl9NT0RfTkJfQklUU10gPSBQS0FfR2V0Qml0U2l6ZV91OChpbi0+c2l6ZSk7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBvcGVyYW5kIGRQIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1JTQV9DUlRfRVhQX0lOX0RQX0NSVF0sIGluLT5wT3BEcCwgaW4tPnNpemUgLyAyVUwpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9SU0FfQ1JUX0VYUF9JTl9EUF9DUlQgKyAoaW4tPnNpemUgLyA4VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9wZXJhbmQgZFEgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fRFFfQ1JUXSwgaW4tPnBPcERxLCBpbi0+c2l6ZSAvIDJVTCk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1JTQV9DUlRfRVhQX0lOX0RRX0NSVCArIChpbi0+c2l6ZSAvIDhVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgb3BlcmFuZCBxaW52IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1JTQV9DUlRfRVhQX0lOX1FJTlZfQ1JUXSwgaW4tPnBPcFFpbnYsIGluLT5zaXplIC8gMlVMKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fUUlOVl9DUlQgKyAoaW4tPnNpemUgLyA4VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHByaW1lIHAgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fUFJJTUVfUF0sIGluLT5wUHJpbWVQLCBpbi0+c2l6ZSAvIDJVTCk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1JTQV9DUlRfRVhQX0lOX1BSSU1FX1AgKyAoaW4tPnNpemUgLyA4VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHByaW1lIHEgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fUFJJTUVfUV0sIGluLT5wUHJpbWVRLCBpbi0+c2l6ZSAvIDJVTCk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1JTQV9DUlRfRVhQX0lOX1BSSU1FX1EgKyAoaW4tPnNpemUgLyA4VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9wZXJhbmQgQSB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9SU0FfQ1JUX0VYUF9JTl9FWFBPTkVOVF9CQVNFXSwgaW4tPnBvcEEsIGluLT5zaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUlNBX0NSVF9FWFBfSU5fRVhQT05FTlRfQkFTRSArIChpbi0+c2l6ZSAvIDRVTCldID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfUG9pbnRDaGVja19TZXQoUEtBX0hhbmRsZVR5cGVEZWYgKmhwa2EsIFBLQV9Qb2ludENoZWNrSW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBtb2R1bHVzIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9QT0lOVF9DSEVDS19JTl9NT0RfTkJfQklUU10gPSBQS0FfR2V0T3B0Qml0U2l6ZV91OChpbi0+bW9kdWx1c1NpemUsICooaW4tPm1vZHVsdXMpKTsKKworICAvKiBHZXQgdGhlIGNvZWZmaWNpZW50IGEgc2lnbiAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9QT0lOVF9DSEVDS19JTl9BX0NPRUZGX1NJR05dID0gaW4tPmNvZWZTaWduOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgY29lZmZpY2llbnQgfGF8IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0FfQ09FRkZdLCBpbi0+Y29lZkEsIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0FfQ09FRkYgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGNvZWZmaWNpZW50IGIgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fQl9DT0VGRl0sIGluLT5jb2VmQiwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fQl9DT0VGRiArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgbW9kdWx1cyB2YWx1ZSBwIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX01PRF9HRl0sIGluLT5tb2R1bHVzLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9QT0lOVF9DSEVDS19JTl9NT0RfR0YgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIFBvaW50IFAgY29vcmRpbmF0ZSB4IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWF0sIGluLT5wb2ludFgsIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWCArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgUG9pbnQgUCBjb29yZGluYXRlIHkgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fSU5JVElBTF9QT0lOVF9ZXSwgaW4tPnBvaW50WSwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fSU5JVElBTF9QT0lOVF9ZICsgKChpbi0+bW9kdWx1c1NpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGlucHV0IHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICovCit2b2lkIFBLQV9FQ0NNdWxfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNDTXVsSW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBzY2FsYXIgbXVsdGlwbGllciBrIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9FWFBfTkJfQklUU10gPSBQS0FfR2V0T3B0Qml0U2l6ZV91OChpbi0+c2NhbGFyTXVsU2l6ZSwgKihpbi0+c2NhbGFyTXVsKSk7CisKKyAgLyogR2V0IHRoZSBtb2R1bHVzIGxlbmd0aCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9PUF9OQl9CSVRTXSA9IFBLQV9HZXRPcHRCaXRTaXplX3U4KGluLT5tb2R1bHVzU2l6ZSwgKihpbi0+bW9kdWx1cykpOworCisgIC8qIEdldCB0aGUgY29lZmZpY2llbnQgYSBzaWduICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX0FfQ09FRkZfU0lHTl0gPSBpbi0+Y29lZlNpZ247CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBjb2VmZmljaWVudCB8YXwgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fQV9DT0VGRl0sIGluLT5jb2VmQSwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fQV9DT0VGRiArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgbW9kdWx1cyB2YWx1ZSBwIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX01PRF9HRl0sIGluLT5tb2R1bHVzLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9NT0RfR0YgKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHNjYWxhciBtdWx0aXBsaWVyIGsgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fS10sIGluLT5zY2FsYXJNdWwsIGluLT5zY2FsYXJNdWxTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fSyArICgoaW4tPnNjYWxhck11bFNpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBQb2ludCBQIGNvb3JkaW5hdGUgeCB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9QT0lOVF9DSEVDS19JTl9JTklUSUFMX1BPSU5UX1hdLCBpbi0+cG9pbnRYLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9QT0lOVF9DSEVDS19JTl9JTklUSUFMX1BPSU5UX1ggKyAoKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIFBvaW50IFAgY29vcmRpbmF0ZSB5IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWV0sIGluLT5wb2ludFksIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWSArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfRUNDTXVsRmFzdE1vZGVfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfRUNDTXVsRmFzdE1vZGVJblR5cGVEZWYgKmluKQoreworICAvKiBHZXQgdGhlIHNjYWxhciBtdWx0aXBsaWVyIGsgbGVuZ3RoICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX0VYUF9OQl9CSVRTXSA9IFBLQV9HZXRPcHRCaXRTaXplX3U4KGluLT5zY2FsYXJNdWxTaXplLCAqKGluLT5zY2FsYXJNdWwpKTsKKworICAvKiBHZXQgdGhlIG1vZHVsdXMgbGVuZ3RoICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX09QX05CX0JJVFNdID0gUEtBX0dldE9wdEJpdFNpemVfdTgoaW4tPm1vZHVsdXNTaXplLCAqKGluLT5tb2R1bHVzKSk7CisKKyAgLyogR2V0IHRoZSBjb2VmZmljaWVudCBhIHNpZ24gKi8KKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fQV9DT0VGRl9TSUdOXSA9IGluLT5jb2VmU2lnbjsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGNvZWZmaWNpZW50IHxhfCB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9BX0NPRUZGXSwgaW4tPmNvZWZBLCBpbi0+bW9kdWx1c1NpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9BX0NPRUZGICsgKChpbi0+bW9kdWx1c1NpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBtb2R1bHVzIHZhbHVlIHAgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfRUNDX1NDQUxBUl9NVUxfSU5fTU9EX0dGXSwgaW4tPm1vZHVsdXMsIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX01PRF9HRiArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgc2NhbGFyIG11bHRpcGxpZXIgayB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdThfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9LXSwgaW4tPnNjYWxhck11bCwgaW4tPnNjYWxhck11bFNpemUpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9LICsgKChpbi0+c2NhbGFyTXVsU2l6ZSArIDNVTCkgLyA0VUwpXSA9IDBVTDsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIFBvaW50IFAgY29vcmRpbmF0ZSB4IHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWF0sIGluLT5wb2ludFgsIGluLT5tb2R1bHVzU2l6ZSk7CisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX1BPSU5UX0NIRUNLX0lOX0lOSVRJQUxfUE9JTlRfWCArICgoaW4tPm1vZHVsdXNTaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgUG9pbnQgUCBjb29yZGluYXRlIHkgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fSU5JVElBTF9QT0lOVF9ZXSwgaW4tPnBvaW50WSwgaW4tPm1vZHVsdXNTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfUE9JTlRfQ0hFQ0tfSU5fSU5JVElBTF9QT0lOVF9ZICsgKChpbi0+bW9kdWx1c1NpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgTW9udGdvbWVyeSBwYXJhbWV0ZXIgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3UzMl90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0VDQ19TQ0FMQVJfTVVMX0lOX01PTlRHT01FUllfUEFSQU1dLCBpbi0+cE1vbnRnb21lcnlQYXJhbSwgKGluLT5tb2R1bHVzU2l6ZSArIDNVTCkgLyA0VUwpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9FQ0NfU0NBTEFSX01VTF9JTl9NT05UR09NRVJZX1BBUkFNICsgKChpbi0+bW9kdWx1c1NpemUgKyAzVUwpIC8gNFVMKV0gPSAwVUw7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGlucHV0IHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGluIElucHV0IGluZm9ybWF0aW9uCisgICovCit2b2lkIFBLQV9Nb2RJbnZfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBQS0FfTW9kSW52SW5UeXBlRGVmICppbikKK3sKKyAgLyogR2V0IHRoZSBudW1iZXIgb2YgYml0IHBlciBvcGVyYW5kICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfSU5WX05CX0JJVFNdID0gUEtBX0dldEJpdFNpemVfdTMyKGluLT5zaXplKTsKKworICAvKiBNb3ZlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG9wZXJhbmQgQSB0byBQS0EgUkFNICovCisgIFBLQV9NZW1jcHlfdTMyX3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9JTlZfSU5fT1AxXSwgaW4tPnBPcDEsIGluLT5zaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9JTlZfSU5fT1AxICsgaW4tPnNpemVdID0gMFVMOworCisgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgbW9kdWx1cyB2YWx1ZSBuIHRvIFBLQSBSQU0gKi8KKyAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfSU5WX0lOX09QMl9NT0RdLCBpbi0+cE1vZCwgaW4tPnNpemUgKiA0VUwpOworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX0lOVl9JTl9PUDJfTU9EICsgaW4tPnNpemVdID0gMFVMOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBpbnB1dCBwYXJhbWV0ZXJzLgorICAqIEBwYXJhbSAgaHBrYSBQS0EgaGFuZGxlCisgICogQHBhcmFtICBpbiBJbnB1dCBpbmZvcm1hdGlvbgorICAqLwordm9pZCBQS0FfTW9kUmVkX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgUEtBX01vZFJlZEluVHlwZURlZiAqaW4pCit7CisgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJpdCBwZXIgb3BlcmFuZCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9NT0RVTEFSX1JFRFVDX0lOX09QX0xFTkdUSF0gPSBQS0FfR2V0Qml0U2l6ZV91MzIoaW4tPk9wU2l6ZSk7CisKKyAgLyogR2V0IHRoZSBudW1iZXIgb2YgYml0IHBlciBtb2R1bHVzICovCisgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfUkVEVUNfSU5fTU9EX0xFTkdUSF0gPSBQS0FfR2V0Qml0U2l6ZV91OChpbi0+bW9kU2l6ZSk7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBvcGVyYW5kIEEgdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3UzMl90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PRFVMQVJfUkVEVUNfSU5fT1BFUkFORF0sIGluLT5wT3AxLCBpbi0+T3BTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9SRURVQ19JTl9PUEVSQU5EICsgaW4tPk9wU2l6ZV0gPSAwVUw7CisKKyAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBtb2R1bHVzIHZhbHVlIG4gdG8gUEtBIFJBTSAqLworICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9SRURVQ19JTl9NT0RVTFVTXSwgaW4tPnBNb2QsIGluLT5tb2RTaXplKTsKKyAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9EVUxBUl9SRURVQ19JTl9NT0RVTFVTICsgKGluLT5tb2RTaXplIC8gNFVMKV0gPSAwVUw7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGlucHV0IHBhcmFtZXRlcnMuCisgICogQHBhcmFtICBocGthIFBLQSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNpemUgU2l6ZSBvZiB0aGUgb3BlcmFuZAorICAqIEBwYXJhbSAgcE9wMSBHZW5lcmljIHBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICAqLwordm9pZCBQS0FfTW9udGdvbWVyeVBhcmFtX1NldChQS0FfSGFuZGxlVHlwZURlZiAqaHBrYSwgY29uc3QgdWludDMyX3Qgc2l6ZSwgY29uc3QgdWludDhfdCAqcE9wMSkKK3sKKyAgaWYgKHBPcDEgIT0gTlVMTCkKKyAgeworICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJpdCBwZXIgb3BlcmFuZCAqLworICAgIGhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX01PTlRHT01FUllfUEFSQU1fSU5fTU9EX05CX0JJVFNdID0gUEtBX0dldE9wdEJpdFNpemVfdTgoc2l6ZSwgKnBPcDEpOworCisgICAgLyogTW92ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBwT3AxIHRvIFBLQSBSQU0gKi8KKyAgICBQS0FfTWVtY3B5X3U4X3RvX3UzMigmaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9OVEdPTUVSWV9QQVJBTV9JTl9NT0RVTFVTXSwgcE9wMSwgc2l6ZSk7CisgICAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfTU9OVEdPTUVSWV9QQVJBTV9JTl9NT0RVTFVTICsgKChzaXplICsgM1VMKSAvIDRVTCldID0gMFVMOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJpYyBmdW5jdGlvbiB0byBzZXQgaW5wdXQgcGFyYW1ldGVycy4KKyAgKiBAcGFyYW0gIGhwa2EgUEtBIGhhbmRsZQorICAqIEBwYXJhbSAgc2l6ZSBTaXplIG9mIHRoZSBvcGVyYW5kCisgICogQHBhcmFtICBwT3AxIEdlbmVyaWMgcG9pbnRlciB0byBpbnB1dCBkYXRhCisgICogQHBhcmFtICBwT3AyIEdlbmVyaWMgcG9pbnRlciB0byBpbnB1dCBkYXRhCisgICogQHBhcmFtICBwT3AzIEdlbmVyaWMgcG9pbnRlciB0byBpbnB1dCBkYXRhCisgICovCit2b2lkIFBLQV9BUklfU2V0KFBLQV9IYW5kbGVUeXBlRGVmICpocGthLCBjb25zdCB1aW50MzJfdCBzaXplLCBjb25zdCB1aW50MzJfdCAqcE9wMSwgY29uc3QgdWludDMyX3QgKnBPcDIsIGNvbnN0IHVpbnQ4X3QgKnBPcDMpCit7CisgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJpdCBwZXIgb3BlcmFuZCAqLworICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9BUklUSE1FVElDX0FMTF9PUFNfTkJfQklUU10gPSBQS0FfR2V0Qml0U2l6ZV91MzIoc2l6ZSk7CisKKyAgaWYgKHBPcDEgIT0gTlVMTCkKKyAgeworICAgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgcE9wMSB0byBQS0EgUkFNICovCisgICAgUEtBX01lbWNweV91MzJfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9BUklUSE1FVElDX0FMTF9PUFNfSU5fT1AxXSwgcE9wMSwgc2l6ZSk7CisgICAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfQVJJVEhNRVRJQ19BTExfT1BTX0lOX09QMSArIHNpemVdID0gMFVMOworICB9CisKKyAgaWYgKHBPcDIgIT0gTlVMTCkKKyAgeworICAgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgcE9wMiB0byBQS0EgUkFNICovCisgICAgUEtBX01lbWNweV91MzJfdG9fdTMyKCZocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9BUklUSE1FVElDX0FMTF9PUFNfSU5fT1AyXSwgcE9wMiwgc2l6ZSk7CisgICAgaHBrYS0+SW5zdGFuY2UtPlJBTVtQS0FfQVJJVEhNRVRJQ19BTExfT1BTX0lOX09QMiArIHNpemVdID0gMFVMOworICB9CisKKyAgaWYgKHBPcDMgIT0gTlVMTCkKKyAgeworICAgIC8qIE1vdmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgcE9wMyB0byBQS0EgUkFNICovCisgICAgUEtBX01lbWNweV91OF90b191MzIoJmhwa2EtPkluc3RhbmNlLT5SQU1bUEtBX0FSSVRITUVUSUNfQUxMX09QU19JTl9PUDNdLCBwT3AzLCBzaXplICogNFVMKTsKKyAgICBocGthLT5JbnN0YW5jZS0+UkFNW1BLQV9BUklUSE1FVElDX0FMTF9PUFNfSU5fT1AzICsgc2l6ZV0gPSAwVUw7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUEtBKSAmJiBkZWZpbmVkKEhBTF9QS0FfTU9EVUxFX0VOQUJMRUQpICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9wd3IuYyBiL1NyYy9zdG0zMndieHhfaGFsX3B3ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWRkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9wd3IuYwpAQCAtMCwwICsxLDcxMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcHdyLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQV1JfUHJpdmF0ZV9EZWZpbmVzCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBQV1JfUmVnaXN0ZXJfUmVzZXRfVmFsdWVzICBQV1IgUmVnaXN0ZXIgUmVzZXQgVmFsdWVzCisgICogQHsKKyAgKi8KKy8qIERlZmluaXRpb25zIG9mIFBXUiByZWdpc3RlcnMgcmVzZXQgdmFsdWUgKi8KKyNkZWZpbmUgUFdSX0NSMV9SRVNFVF9WQUxVRSAgICgweDAwMDAwMjAwVSkKKyNkZWZpbmUgUFdSX0NSMl9SRVNFVF9WQUxVRSAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX0NSM19SRVNFVF9WQUxVRSAgICgweDAwMDA4MDAwVSkKKyNkZWZpbmUgUFdSX0NSNF9SRVNFVF9WQUxVRSAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX0NSNV9SRVNFVF9WQUxVRSAgICgweDAwMDA0MjA0VSkKKyNkZWZpbmUgUFdSX1BVQ1JBX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JBX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BVQ1JCX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JCX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BVQ1JDX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JDX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BVQ1JEX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JEX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BVQ1JFX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JFX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BVQ1JIX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX1BEQ1JIX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX0MyQ1IxX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgUFdSX0MyQ1IzX1JFU0VUX1ZBTFVFICgweDAwMDA4MDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKyAvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zICBQV1IgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFBXUl9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGVpbml0aWFsaXplIHRoZSBIQUwgUFdSIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0RlSW5pdCh2b2lkKQoreworICAvKiBBcHBseSByZXNldCB2YWx1ZXMgdG8gYWxsIFBXUiByZWdpc3RlcnMgKi8KKyAgLyogTm90ZTogVXBkYXRlIG9mIGVhY2ggcmVnaXN0ZXIgcmVxdWlyZWQgc2luY2UgUFdSIGdsb2JhbCByZXNldCBpcyBub3QgICAgICovCisgIC8qICAgICAgIGF2YWlsYWJsZSBhdCBSQ0MgbGV2ZWwgb24gdGhpcyBTVE0zMiBzZXJpZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICBMTF9QV1JfV3JpdGVSZWcoQ1IxLCBQV1JfQ1IxX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKENSMiwgUFdSX0NSMl9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhDUjMsIFBXUl9DUjNfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoQ1I0LCBQV1JfQ1I0X1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKENSNSwgUFdSX0NSNV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQVUNSQSwgUFdSX1BVQ1JBX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBEQ1JBLCBQV1JfUERDUkFfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUFVDUkIsIFBXUl9QVUNSQl9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQRENSQiwgUFdSX1BEQ1JCX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBVQ1JDLCBQV1JfUFVDUkNfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUERDUkMsIFBXUl9QRENSQ19SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQVUNSRCwgUFdSX1BVQ1JEX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBEQ1JELCBQV1JfUERDUkRfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUFVDUkUsIFBXUl9QVUNSRV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQRENSRSwgUFdSX1BEQ1JFX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBVQ1JILCBQV1JfUFVDUkhfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUERDUkgsIFBXUl9QRENSSF9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhDMkNSMSwgUFdSX0MyQ1IxX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKEMyQ1IzLCBQV1JfQzJDUjNfUkVTRVRfVkFMVUUpOworICAKKyAgLyogQ2xlYXIgYWxsIGZsYWdzICovCisgIExMX1BXUl9Xcml0ZVJlZyhTQ1IsCisgICAgICAgICAgICAgICAgICAgIExMX1BXUl9TQ1JfQ0MySEYgCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQzgwMkFGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQ0JMRUFGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQ0NSUEVGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQzgwMldVRgorICAgICAgICAgICAgICAgICAgfCBMTF9QV1JfU0NSX0NCTEVXVUYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX1NDUl9DQk9SSEYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX1NDUl9DU01QU0ZCRgorICAgICAgICAgICAgICAgICAgfCBMTF9QV1JfU0NSX0NXVUYKKyAgICAgICAgICAgICAgICAgKTsKKyAgCisgIExMX1BXUl9Xcml0ZVJlZyhFWFRTQ1IsCisgICAgICAgICAgICAgICAgICAgIExMX1BXUl9FWFRTQ1JfQ0NSUEYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX0VYVFNDUl9DMkNTU0YKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX0VYVFNDUl9DMUNTU0YKKyAgICAgICAgICAgICAgICAgKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIGJhY2t1cCBkb21haW4gCisgICogICAgICAgICAoUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCBkYXRhIHJlZ2lzdGVycykuCisgICogQG5vdGUgICBBZnRlciByZXNldCwgdGhlIGJhY2t1cCBkb21haW4gaXMgcHJvdGVjdGVkIGFnYWluc3QgCisgICogICAgICAgICBwb3NzaWJsZSB1bndhbnRlZCB3cml0ZSBhY2Nlc3Nlcy4KKyAgKiBAbm90ZSAgIFJUQ1NFTCB0aGF0IHNldHMgdGhlIFJUQyBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uIGlzIGluIHRoZSBSVEMgYmFjay11cCBkb21haW4uCisgICogICAgICAgICBJbiBvcmRlciB0byBzZXQgb3IgbW9kaWZ5IHRoZSBSVEMgY2xvY2ssIHRoZSBiYWNrdXAgZG9tYWluIGFjY2VzcyBtdXN0IGJlCisgICogICAgICAgICBkaXNhYmxlZC4gCisgICogQG5vdGUgICBMU0VPTiBiaXQgdGhhdCBzd2l0Y2hlcyBvbiBhbmQgb2ZmIHRoZSBMU0UgY3J5c3RhbCBiZWxvbmdzIGFzIHdlbGwgdG8gdGhlCisgICogICAgICAgICBiYWNrLXVwIGRvbWFpbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfREJQKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGFjY2VzcyB0byB0aGUgYmFja3VwIGRvbWFpbgorICAqICAgICAgICAgKFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgZGF0YSByZWdpc3RlcnMpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0Rpc2FibGVCa1VwQWNjZXNzKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9EQlApOworfQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICBAYnJpZWYgTG93IFBvd2VyIG1vZGVzIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgWy4uXQorICAgICAqKiogUFZEIGNvbmZpZ3VyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUaGUgUFZEIGlzIHVzZWQgdG8gbW9uaXRvciB0aGUgVkREIHBvd2VyIHN1cHBseSBieSBjb21wYXJpbmcgaXQgdG8gYQorICAgICAgICAgIHRocmVzaG9sZCBzZWxlY3RlZCBieSB0aGUgUFZEIExldmVsIChQTFNbMjowXSBiaXRzIGluIFBXUl9DUjIgcmVnaXN0ZXIpLgorICAgICAgKCspIFBWRE8gZmxhZyBpcyBhdmFpbGFibGUgdG8gaW5kaWNhdGUgaWYgVkREL1ZEREEgaXMgaGlnaGVyIG9yIGxvd2VyCisgICAgICAgICAgdGhhbiB0aGUgUFZEIHRocmVzaG9sZC4gVGhpcyBldmVudCBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgRVhUSQorICAgICAgICAgIGxpbmUxNiBhbmQgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCBpZiBlbmFibGVkLiBUaGlzIGlzIGRvbmUgdGhyb3VnaAorICAgICAgICAgIF9fSEFMX1BWRF9FWFRJX0VOQUJMRV9JVCgpIG1hY3JvLgorICAgICAgKCspIFRoZSBQVkQgaXMgc3RvcHBlZCBpbiBTdGFuZGJ5IG1vZGUuCisKKyAgICAqKiogV2FrZVVwIHBpbiBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFdha2VVcCBwaW5zIGFyZSB1c2VkIHRvIHdha2V1cCB0aGUgc3lzdGVtIGZyb20gU3RhbmRieSBtb2RlIG9yIFNodXRkb3duIG1vZGUuIAorICAgICAgICAgIFRoZSBwb2xhcml0eSBvZiB0aGVzZSBwaW5zIGNhbiBiZSBzZXQgdG8gY29uZmlndXJlIGV2ZW50IGRldGVjdGlvbiBvbiBoaWdoIAorICAgICAgICAgIGxldmVsIChyaXNpbmcgZWRnZSkgb3IgbG93IGxldmVsIChmYWxsaW5nIGVkZ2UpLgorCisgICAgKioqIExvdyBQb3dlciBtb2RlcyBjb25maWd1cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGUgZGV2aWNlcyBmZWF0dXJlIDggbG93LXBvd2VyIG1vZGVzOgorCisgICAgICAoKykgTG93LXBvd2VyIFJ1biBtb2RlOiBjb3JlIGFuZCBwZXJpcGhlcmFscyBhcmUgcnVubmluZywgbWFpbiByZWd1bGF0b3Igb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLgorCisgICAgICAoKykgU2xlZXAgbW9kZTogQ29ydGV4LU00IGNvcmUgc3RvcHBlZCwgcGVyaXBoZXJhbHMga2VwdCBydW5uaW5nLCBtYWluIGFuZCBsb3cgcG93ZXIgcmVndWxhdG9ycyBvbi4KKyAgICAgICgrKSBMb3ctcG93ZXIgU2xlZXAgbW9kZTogQ29ydGV4LU00IGNvcmUgc3RvcHBlZCwgcGVyaXBoZXJhbHMga2VwdCBydW5uaW5nLCBtYWluIHJlZ3VsYXRvciBvZmYsIGxvdyBwb3dlciByZWd1bGF0b3Igb24uCisKKyAgICAgICgrKSBTdG9wIDAgbW9kZTogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCBleGNlcHQgTFNJIGFuZCBMU0UsIG1haW4gYW5kIGxvdyBwb3dlciByZWd1bGF0b3JzIG9uLgorICAgICAgKCspIFN0b3AgMSBtb2RlOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwgbWFpbiByZWd1bGF0b3Igb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLgorICAgICAgKCspIFN0b3AgMiBtb2RlOiBhbGwgY2xvY2tzIGFyZSBzdG9wcGVkIGV4Y2VwdCBMU0kgYW5kIExTRSwgbWFpbiByZWd1bGF0b3Igb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLCByZWR1Y2VkIHNldCBvZiB3YWtpbmcgdXAgSVBzIGNvbXBhcmVkIHRvIFN0b3AgMSBtb2RlLgorCisgICAgICAoKykgU3RhbmRieSBtb2RlIHdpdGggU1JBTTI6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTSSBhbmQgTFNFLCBTUkFNMiBjb250ZW50IHByZXNlcnZlZCwgbWFpbiByZWd1bGF0b3Igb2ZmLCBsb3cgcG93ZXIgcmVndWxhdG9yIG9uLiAKKyAgICAgICgrKSBTdGFuZGJ5IG1vZGUgd2l0aG91dCBTUkFNMjogYWxsIGNsb2NrcyBhcmUgc3RvcHBlZCBleGNlcHQgTFNJIGFuZCBMU0UsIG1haW4gYW5kIGxvdyBwb3dlciByZWd1bGF0b3JzIG9mZi4KKworICAgICAgKCspIFNodXRkb3duIG1vZGU6IGFsbCBjbG9ja3MgYXJlIHN0b3BwZWQgZXhjZXB0IExTRSwgbWFpbiBhbmQgbG93IHBvd2VyIHJlZ3VsYXRvcnMgb2ZmLgorCisKKyAgICoqKiBMb3ctcG93ZXIgcnVuIG1vZGUgKioqCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBFbnRyeTogKGZyb20gbWFpbiBydW4gbW9kZSkKKyAgICAgICAgICAoKyspIHNldCBMUFIgYml0IHdpdGggSEFMX1BXUkV4X0VuYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIEFQSSBhZnRlciBoYXZpbmcgZGVjcmVhc2VkIHRoZSBzeXN0ZW0gY2xvY2sgYmVsb3cgMiBNSHouIAorICAgICAgKCspIEV4aXQ6CisgICAgICAgICAgKCsrKSBjbGVhciBMUFIgYml0IHRoZW4gd2FpdCBmb3IgUkVHTFAgYml0IHRvIGJlIHJlc2V0IHdpdGggSEFMX1BXUkV4X0Rpc2FibGVMb3dQb3dlclJ1bk1vZGUoKSBBUEkuIE9ubHkKKyAgICAgICAgICAgICAgIHRoZW4gY2FuIHRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGJlIGluY3JlYXNlZCBhYm92ZSAyIE1Iei4KKworICAgKioqIFNsZWVwIG1vZGUgLyBMb3ctcG93ZXIgc2xlZXAgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTbGVlcCBtb2RlIC8gTG93LXBvd2VyIFNsZWVwIG1vZGUgaXMgZW50ZXJlZCB0aHJ1IEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSBBUEkKKyAgICAgICAgICBpbiBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRoZSByZWd1bGF0b3IgaXMgZm9yY2VkIHRvIGxvdy1wb3dlciBtb2RlIGFuZCBpZiBleGl0IGlzIGludGVycnVwdCBvciBldmVudC10cmlnZ2VyZWQuIAorICAgICAgICAgICgrKykgUFdSX01BSU5SRUdVTEFUT1JfT046IFNsZWVwIG1vZGUgKHJlZ3VsYXRvciBpbiBtYWluIG1vZGUpLgorICAgICAgICAgICgrKykgUFdSX0xPV1BPV0VSUkVHVUxBVE9SX09OOiBMb3ctcG93ZXIgc2xlZXAgKHJlZ3VsYXRvciBpbiBsb3cgcG93ZXIgbW9kZSkuCisgICAgICAgICAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGhhdmUgYmVlbiBkZWNyZWFzZWQgYmVsb3cgMiBNSHogYmVmb3JlaGFuZC4KKyAgICAgICAgICAoKyspIFBXUl9TTEVFUEVOVFJZX1dGSTogZW50ZXIgU0xFRVAgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAgICAgICAgICgrKykgUFdSX1NMRUVQRU5UUllfV0ZFOiBlbnRlciBTTEVFUCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uCisKKyAgICAgICgrKSBXRkkgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VkIGJ5IHRoZSBuZXN0ZWQgdmVjdG9yZWQgaW50ZXJydXB0CisgICAgICAgICAgICAgY29udHJvbGxlciAoTlZJQykgb3IgYW55IHdha2UtdXAgZXZlbnQuCisKKyAgICAgICgrKSBXRkUgRXhpdDoKKyAgICAgICAgKCsrKSBBbnkgd2FrZS11cCBldmVudCBzdWNoIGFzIGFuIEVYVEkgbGluZSBjb25maWd1cmVkIGluIGV2ZW50IG1vZGUuCisKKyAgICBbLi5dICBXaGVuIGV4aXRpbmcgdGhlIExvdy1wb3dlciBzbGVlcCBtb2RlIGJ5IGlzc3VpbmcgYW4gaW50ZXJydXB0IG9yIGEgd2FrZXVwIGV2ZW50LCAKKyAgICAgICAgICB0aGUgTUNVIGlzIGluIExvdy1wb3dlciBSdW4gbW9kZS4gCisKKyAgICoqKiBTdG9wIDAsIFN0b3AgMSBhbmQgU3RvcCAyIG1vZGVzICoqKgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBFbnRyeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgVGhlIFN0b3AgMCwgU3RvcCAxIG9yIFN0b3AgMiBtb2RlcyBhcmUgZW50ZXJlZCB0aHJ1IHRoZSBmb2xsb3dpbmcgQVBJJ3M6CisgICAgICAgICAgKCsrKSBIQUxfUFdSRXhfRW50ZXJTVE9QME1vZGUoKSBmb3IgbW9kZSAwLCBIQUxfUFdSRXhfRW50ZXJTVE9QMU1vZGUoKSBmb3IgbW9kZSAxLCBIQUxfUFdSRXhfRW50ZXJTVE9QMk1vZGUoKSBmb3IgbW9kZSAyCisgICAgICAgICAgICAgICBvciBmb3IgcG9ydGluZyByZWFzb25zIEhBTF9QV1JfRW50ZXJTVE9QTW9kZSgpLgorCisgICAgICAoKykgUmVndWxhdG9yIHNldHRpbmcgKGFwcGxpY2FibGUgdG8gSEFMX1BXUl9FbnRlclNUT1BNb2RlKCkgb25seSk6CisgICAgICAgICAgKCsrKSBQV1JfTUFJTlJFR1VMQVRPUl9PTjogUmVndWxhdG9yIGluIG1haW4gbW9kZSAoU1RPUDAgbW9kZSkKKyAgICAgICAgICAoKyspIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTjogUmVndWxhdG9yIGluIGxvdy1wb3dlciBtb2RlIChTVE9QMSBtb2RlKQorICAgICAgKCspIEV4aXQgKGludGVycnVwdCBvciBldmVudC10cmlnZ2VyZWQsIHNwZWNpZmllZCB3aGVuIGVudGVyaW5nIFNUT1AgbW9kZSk6CisgICAgICAgICAgKCsrKSBQV1JfU1RPUEVOVFJZX1dGSTogZW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZJIGluc3RydWN0aW9uCisgICAgICAgICAgKCsrKSBQV1JfU1RPUEVOVFJZX1dGRTogZW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uCisgICAgICAoKykgV0ZJIEV4aXQ6CisgICAgICAgICAgKCsrKSBBbnkgRVhUSSBMaW5lIChJbnRlcm5hbCBvciBFeHRlcm5hbCkgY29uZmlndXJlZCBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgICAgICAgICAoKyspIFNvbWUgc3BlY2lmaWMgY29tbXVuaWNhdGlvbiBwZXJpcGhlcmFscyAoVVNBUlQsIExQVUFSVCwgSTJDKSBpbnRlcnJ1cHRzIAorICAgICAgICAgICAgICAgd2hlbiBwcm9ncmFtbWVkIGluIHdha2V1cCBtb2RlLiAKKyAgICAgICgrKSBXRkUgRXhpdDoKKyAgICAgICAgICAoKyspIEFueSBFWFRJIExpbmUgKEludGVybmFsIG9yIEV4dGVybmFsKSBjb25maWd1cmVkIGluIEV2ZW50IG1vZGUuCisgICAgICAgCisgICAgICAgWy4uXSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBXaGVuIGV4aXRpbmcgU3RvcCAwIGFuZCBTdG9wIDEgbW9kZXMsIHRoZSBNQ1UgaXMgZWl0aGVyIGluIFJ1biBtb2RlIG9yIGluIExvdy1wb3dlciBSdW4gbW9kZQorICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgTFBSIGJpdCBzZXR0aW5nLiAKKyAgICAgICAgICBXaGVuIGV4aXRpbmcgU3RvcCAyIG1vZGUsIHRoZSBNQ1UgaXMgaW4gUnVuIG1vZGUuIAorCisgICAqKiogU3RhbmRieSBtb2RlICoqKgorICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dIFRoZSBTdGFuZGJ5IG1vZGUgb2ZmZXJzIHR3byBvcHRpb25zOiAKKyAgICAgICgrKSBvcHRpb24gYSkgYWxsIGNsb2NrcyBvZmYgZXhjZXB0IExTSSBhbmQgTFNFLCBSUlMgYml0IHNldCAoa2VlcHMgdm9sdGFnZSByZWd1bGF0b3IgaW4gbG93IHBvd2VyIG1vZGUpLgorICAgICAgICAgIFNSQU0gYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yIHRoZSBTUkFNMiBjb250ZW50LCB0aGUgUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCByZWdpc3RlcnMgCisgICAgICAgICAgYW5kIFN0YW5kYnkgY2lyY3VpdHJ5LiAgICAgIAorICAgICAgKCspIG9wdGlvbiBiKSBhbGwgY2xvY2tzIG9mZiBleGNlcHQgTFNJIGFuZCBMU0UsIFJSUyBiaXQgY2xlYXJlZCAodm9sdGFnZSByZWd1bGF0b3IgdGhlbiBkaXNhYmxlZCkuCisgICAgICAgICAgU1JBTSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciB0aGUgUlRDIHJlZ2lzdGVycywgUlRDIGJhY2t1cCByZWdpc3RlcnMgCisgICAgICAgICAgYW5kIFN0YW5kYnkgY2lyY3VpdHJ5LgorCisgICAgICAoKyspIEVudHJ5OgorICAgICAgICAgICgrKyspIFRoZSBTdGFuZGJ5IG1vZGUgaXMgZW50ZXJlZCB0aHJ1IEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSgpIEFQSS4gCisgICAgICAgICAgICAgICAgU1JBTTEgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBsb3N0IGV4Y2VwdCBmb3IgcmVnaXN0ZXJzIGluIHRoZSBCYWNrdXAgZG9tYWluIGFuZCAKKyAgICAgICAgICAgICAgICBTdGFuZGJ5IGNpcmN1aXRyeS4gU1JBTTIgY29udGVudCBjYW4gYmUgcHJlc2VydmVkIGlmIHRoZSBiaXQgUlJTIGlzIHNldCBpbiBQV1JfQ1IzIHJlZ2lzdGVyLiAKKyAgICAgICAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgdXNlciBjYW4gcmVzb3J0IHRvIEhBTF9QV1JFeF9FbmFibGVCS1JBTUNvbnRlbnRSZXRlbnRpb24oKSBBUEkKKyAgICAgICAgICAgICAgICB0byBzZXQgUlJTIGJpdC4KKyAgICAgICgrKykgRXhpdDoKKyAgICAgICAgICAoKysrKSBXS1VQIHBpbiByaXNpbmcgZWRnZSwgUlRDIGFsYXJtIG9yIHdha2V1cCwgdGFtcGVyIGV2ZW50LCB0aW1lLXN0YW1wIGV2ZW50LCAKKyAgICAgICAgICAgICAgICBleHRlcm5hbCByZXNldCBpbiBOUlNUIHBpbiwgSVdERyByZXNldC4KKyAgICBbLi5dIEFmdGVyIHdha2luZyB1cCBmcm9tIFN0YW5kYnkgbW9kZSwgcHJvZ3JhbSBleGVjdXRpb24gcmVzdGFydHMgaW4gdGhlIHNhbWUgd2F5IGFzIGFmdGVyIGEgUmVzZXQuCisgICAgICAgICAgCisKKyAgICAqKiogU2h1dGRvd24gbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBJbiBTaHV0ZG93biBtb2RlLCAKKyAgICAgICAgdm9sdGFnZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQsIGFsbCBjbG9ja3MgYXJlIG9mZiBleGNlcHQgTFNFLCBSUlMgYml0IGlzIGNsZWFyZWQuCisgICAgICAgIFNSQU0gYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yIGJhY2t1cCBkb21haW4gcmVnaXN0ZXJzLgorICAgICAgKCspIEVudHJ5OgorICAgICAgICAgIFRoZSBTaHV0ZG93biBtb2RlIGlzIGVudGVyZWQgdGhydSBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUoKSBBUEkuCisgICAgICAoKykgRXhpdDoKKyAgICAgICAgICAoKyspIFdLVVAgcGluIHJpc2luZyBlZGdlLCBSVEMgYWxhcm0gb3Igd2FrZXVwLCB0YW1wZXIgZXZlbnQsIHRpbWUtc3RhbXAgZXZlbnQsIAorICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVzZXQgaW4gTlJTVCBwaW4uCisgICAgWy4uXSBBZnRlciB3YWtpbmcgdXAgZnJvbSBTaHV0ZG93biBtb2RlLCBwcm9ncmFtIGV4ZWN1dGlvbiByZXN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkgYXMgYWZ0ZXIgYSBSZXNldC4KKworCisgICAqKiogQXV0by13YWtldXAgKEFXVSkgZnJvbSBsb3ctcG93ZXIgbW9kZSAqKioKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBNQ1UgY2FuIGJlIHdva2VuIHVwIGZyb20gbG93LXBvd2VyIG1vZGUgYnkgYW4gUlRDIEFsYXJtIGV2ZW50LCBhbiBSVEMKKyAgICAgIFdha2V1cCBldmVudCwgYSB0YW1wZXIgZXZlbnQgb3IgYSB0aW1lLXN0YW1wIGV2ZW50LCB3aXRob3V0IGRlcGVuZGluZyBvbgorICAgICAgYW4gZXh0ZXJuYWwgaW50ZXJydXB0IChBdXRvLXdha2V1cCBtb2RlKS4KKworICAgICAgKCspIFJUQyBhdXRvLXdha2V1cCAoQVdVKSBmcm9tIHRoZSBTdG9wLCBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2RlcworICAKKworICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIGFsYXJtIGV2ZW50LCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAgICAgICAgICBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSB0aGUgUlRDIGFsYXJtIHVzaW5nIHRoZSBIQUxfUlRDX1NldEFsYXJtX0lUKCkgZnVuY3Rpb24uCisKKyAgICAgICAgKCsrKSBUbyB3YWtlIHVwIGZyb20gdGhlIFN0b3AgbW9kZSB3aXRoIGFuIFJUQyBUYW1wZXIgb3IgdGltZSBzdGFtcCBldmVudCwgaXQKKyAgICAgICAgICAgICBpcyBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBSVEMgdG8gZGV0ZWN0IHRoZSB0YW1wZXIgb3IgdGltZSBzdGFtcCBldmVudCB1c2luZyB0aGUKKyAgICAgICAgICAgICBIQUxfUlRDRXhfU2V0VGltZVN0YW1wX0lUKCkgb3IgSEFMX1JUQ0V4X1NldFRhbXBlcl9JVCgpIGZ1bmN0aW9ucy4KKworICAgICAgICAoKyspIFRvIHdha2UgdXAgZnJvbSB0aGUgU3RvcCBtb2RlIHdpdGggYW4gUlRDIFdha2VVcCBldmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgUlRDIHRvIGdlbmVyYXRlIHRoZSBSVEMgV2FrZVVwIGV2ZW50IHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXJfSVQoKSBmdW5jdGlvbi4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHZvbHRhZ2UgdGhyZXNob2xkIGRldGVjdGVkIGJ5IHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yIChQVkQpLgorICAqIEBwYXJhbSBzQ29uZmlnUFZEIHBvaW50ZXIgdG8gYSBQV1JfUFZEVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgUFZEIAorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAbm90ZSAgIFJlZmVyIHRvIHRoZSBlbGVjdHJpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIGRldmljZSBkYXRhc2hlZXQgZm9yCisgICogICAgICAgICBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHZvbHRhZ2UgdGhyZXNob2xkcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gKKyAgKiAgICAgICAgIGRldGVjdGlvbiBsZXZlbC4KKyAgKiBAbm90ZSAgIElmICJzQ29uZmlnUFZELT5Nb2RlIiBpcyBzZXQgdG8gUFZEX01PREVfSVQsCisgICogICAgICAgICB3YWtlLXVwIHRhcmdldCBpcyBzZXQgYnkgZGVmYXVsdCB0byB3YWtlLXVwIHRhcmdldCBDUFUxLgorICAqICAgICAgICAgVG8gc2VsZWN0IHdha2UtdXAgdGFyZ2V0IHRvIENQVTIsIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBtdXN0IGJlCisgICogICAgICAgICBwZXJmb3JtZWQgdXNpbmcgbWFjcm8gIl9fSEFMX1BXUl9QVkRfRVhUSUMyX0VOQUJMRV9JVCgpIgorICAqICAgICAgICAgKGFuZCBvcHRpb25hbGx5LCB0byBzZWxlY3QgQ1BVMiBvbmx5IChub3QgYm90aCBDUFUxIGFuZCBDUFUyKToKKyAgKiAgICAgICAgICJfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9JVCgpIikuCisgICogQHJldHZhbCBOb25lCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSX0NvbmZpZ1BWRChQV1JfUFZEVHlwZURlZiAqc0NvbmZpZ1BWRCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTEVWRUwoc0NvbmZpZ1BWRC0+UFZETGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVkRfTU9ERShzQ29uZmlnUFZELT5Nb2RlKSk7CisKKyAgLyogU2V0IFBMUyBiaXRzIGFjY29yZGluZyB0byBQVkRMZXZlbCB2YWx1ZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IyLCBQV1JfQ1IyX1BMUywgc0NvbmZpZ1BWRC0+UFZETGV2ZWwpOworICAKKyAgLyogQ2xlYXIgYW55IHByZXZpb3VzIGNvbmZpZy4gS2VlcCBpdCBjbGVhciBpZiBubyBldmVudCBvciBJVCBtb2RlIGlzIHNlbGVjdGVkICovCisgIAorICAvKiBOb3RlOiBPbiBTVE0zMldCIHNlcmllLCBwb3dlciBQVkQgZXZlbnQgaXMgbm90IGF2YWlsYWJsZSBvbiBBSUVDIGxpbmVzICAgKi8KKyAgLyogICAgICAgKG9ubHkgaW50ZXJydXB0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIEFJRUMgbGluZSAxNikuICAgICAgICAgICAgICovCisgIF9fSEFMX1BXUl9QVkRfRVhUSV9ESVNBQkxFX0lUKCk7ICAgICAgLypDUFUxKi8KKyAgX19IQUxfUFdSX1BWRF9FWFRJQzJfRElTQUJMRV9JVCgpOyAgICAvKkNQVTIqLworICAgIAorICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOworICBfX0hBTF9QV1JfUFZEX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgCisKKyAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX01PREVfSVQpID09IFBWRF9NT0RFX0lUKQorICB7CisgICAgLyogU2V0IENQVTEgYXMgd2FrZXVwIHRhcmdldCAqLworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfSVQoKTsKKyAgfQorICAKKyAgLyogQ29uZmlndXJlIHRoZSBlZGdlICovCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX1JJU0lOR19FREdFKSA9PSBQVkRfUklTSU5HX0VER0UpCisgIHsKKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgIH0KKyAgCisgIGlmKChzQ29uZmlnUFZELT5Nb2RlICYgUFZEX0ZBTExJTkdfRURHRSkgPT0gUFZEX0ZBTExJTkdfRURHRSkKKyAgeworICAgIF9fSEFMX1BXUl9QVkRfRVhUSV9FTkFCTEVfRkFMTElOR19FREdFKCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlcyB0aGUgUG93ZXIgVm9sdGFnZSBEZXRlY3RvcihQVkQpLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVBWRCh2b2lkKQoreworICAvKiBFbmFibGUgdGhlIHBvd2VyIHZvbHRhZ2UgZGV0ZWN0b3IgKi8KKyAgU0VUX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGVzIHRoZSBQb3dlciBWb2x0YWdlIERldGVjdG9yKFBWRCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVBWRCh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSBwb3dlciB2b2x0YWdlIGRldGVjdG9yICovCisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9QVkRFKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBXYWtlVXAgUElOeCBmdW5jdGlvbmFsaXR5LgorICAqIEBwYXJhbSBXYWtlVXBQaW5Qb2xhcml0eSBTcGVjaWZpZXMgd2hpY2ggV2FrZS1VcCBwaW4gdG8gZW5hYmxlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxlZ2FjeSB2YWx1ZXMgd2hpY2ggc2V0IHRoZSBkZWZhdWx0IHBvbGFyaXR5IAorICAqICAgICAgICAgaS5lLiBkZXRlY3Rpb24gb24gaGlnaCBsZXZlbCAocmlzaW5nIGVkZ2UpOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xLCBQV1JfV0FLRVVQX1BJTjIsIFBXUl9XQUtFVVBfUElOMywgUFdSX1dBS0VVUF9QSU40LCBQV1JfV0FLRVVQX1BJTjUKKyAgKiAgICAgICAgICAgICAKKyAgKiAgICAgICAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlIHdoZXJlIHRoZSB1c2VyIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGVuYWJsZWQgcGluIGFuZAorICAqICAgICAgICAgdGhlIGNob3NlbiBwb2xhcml0eTogIAorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4xX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4xX0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4yX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4yX0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU4zX0hJR0ggb3IgUFdSX1dBS0VVUF9QSU4zX0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU40X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU40X0xPVworICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX1dBS0VVUF9QSU41X0hJR0ggb3IgUFdSX1dBS0VVUF9QSU41X0xPVworICAqIEBub3RlICBQV1JfV0FLRVVQX1BJTnggYW5kIFBXUl9XQUtFVVBfUElOeF9ISUdIIGFyZSBlcXVpdmFsZW50LiAgICAgICAgICAgICAgIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9XQUtFVVBfUElOKFdha2VVcFBpblBvbGFyaXR5KSk7IAorICAKKyAgLyogU3BlY2lmaWVzIHRoZSBXYWtlLVVwIHBpbiBwb2xhcml0eSBmb3IgdGhlIGV2ZW50IGRldGVjdGlvbiAKKyAgICAocmlzaW5nIG9yIGZhbGxpbmcgZWRnZSkgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSNCwgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSwgKFdha2VVcFBpblBvbGFyaXR5ID4+IFBXUl9XVVBfUE9MQVJJVFlfU0hJRlQpKTsgCisgIAorICAvKiBFbmFibGUgd2FrZS11cCBwaW4gKi8KKyAgU0VUX0JJVChQV1ItPkNSMywgKFBXUl9DUjNfRVdVUCAmIFdha2VVcFBpblBvbGFyaXR5KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgV2FrZVVwIFBJTnggZnVuY3Rpb25hbGl0eS4KKyAgKiBAcGFyYW0gV2FrZVVwUGlueCBTcGVjaWZpZXMgdGhlIFBvd2VyIFdha2UtVXAgcGluIHRvIGRpc2FibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElOMTogQW4gZXZlbnQgb24gUEEwICAgUElOIHdha2VzLXVwIHRoZSBzeXN0ZW0gZnJvbSBTdGFuZGJ5IG1vZGUuCisgICogICAgICAgICAgIEBhcmcgUFdSX1dBS0VVUF9QSU4yOiBBbiBldmVudCBvbiBQQzEzICBQSU4gd2FrZXMtdXAgdGhlIHN5c3RlbSBmcm9tIFN0YW5kYnkgbW9kZS4KKyAgKiAgICAgICAgICAgQGFyZyBQV1JfV0FLRVVQX1BJTjM6IEFuIGV2ZW50IG9uIFBDMTIgIFBJTiB3YWtlcy11cCB0aGUgc3lzdGVtIGZyb20gU3RhbmRieSBtb2RlLgorICAqICAgICAgICAgICBAYXJnIFBXUl9XQUtFVVBfUElONDogQW4gZXZlbnQgb24gUEEyICAgUElOIHdha2VzLXVwIHRoZSBzeXN0ZW0gZnJvbSBTdGFuZGJ5IG1vZGUuCisgICogICAgICAgICAgIEBhcmcgUFdSX1dBS0VVUF9QSU41OiBBbiBldmVudCBvbiBQQzUgICBQSU4gd2FrZXMtdXAgdGhlIHN5c3RlbSBmcm9tIFN0YW5kYnkgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlV2FrZVVwUGluKHVpbnQzMl90IFdha2VVcFBpbngpCit7CisgIGFzc2VydF9wYXJhbShJU19QV1JfV0FLRVVQX1BJTihXYWtlVXBQaW54KSk7CisKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCAoUFdSX0NSM19FV1VQICYgV2FrZVVwUGlueCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgRW50ZXIgU2xlZXAgb3IgTG93LXBvd2VyIFNsZWVwIG1vZGUuCisgICogQG5vdGUgIEluIFNsZWVwL0xvdy1wb3dlciBTbGVlcCBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAcGFyYW0gUmVndWxhdG9yIFNwZWNpZmllcyB0aGUgcmVndWxhdG9yIHN0YXRlIGluIFNsZWVwL0xvdy1wb3dlciBTbGVlcCBtb2RlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX01BSU5SRUdVTEFUT1JfT04gU2xlZXAgbW9kZSAocmVndWxhdG9yIGluIG1haW4gbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04gTG93LXBvd2VyIFNsZWVwIG1vZGUgKHJlZ3VsYXRvciBpbiBsb3ctcG93ZXIgbW9kZSkgCisgICogQG5vdGUgIExvdy1wb3dlciBTbGVlcCBtb2RlIGlzIGVudGVyZWQgZnJvbSBMb3ctcG93ZXIgUnVuIG1vZGUuIFRoZXJlZm9yZSwgaWYgbm90IHlldCAKKyAgKiAgICAgICAgaW4gTG93LXBvd2VyIFJ1biBtb2RlIGJlZm9yZSBjYWxsaW5nIEhBTF9QV1JfRW50ZXJTTEVFUE1vZGUoKSB3aXRoIFJlZ3VsYXRvciBzZXQgCisgICogICAgICAgIHRvIFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTiwgdGhlIHVzZXIgY2FuIG9wdGlvbmFsbHkgY29uZmlndXJlIHRoZQorICAqICAgICAgICBGbGFzaCBpbiBwb3dlci1kb3duIG1vZGUgaW4gc2V0dGluZyB0aGUgU0xFRVBfUEQgYml0IGluIEZMQVNIX0FDUiByZWdpc3Rlci4KKyAgKiAgICAgICAgQWRkaXRpb25hbGx5LCB0aGUgY2xvY2sgZnJlcXVlbmN5IG11c3QgYmUgcmVkdWNlZCBiZWxvdyAyIE1Iei4KKyAgKiAgICAgICAgU2V0dGluZyBTTEVFUF9QRCBpbiBGTEFTSF9BQ1IgdGhlbiBhcHByb3ByaWF0ZWx5IHJlZHVjaW5nIHRoZSBjbG9jayBmcmVxdWVuY3kgbXVzdCAKKyAgKiAgICAgICAgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBIQUxfUFdSX0VudGVyU0xFRVBNb2RlKCkgQVBJLiAKKyAgKiBAbm90ZSAgV2hlbiBleGl0aW5nIExvdy1wb3dlciBTbGVlcCBtb2RlLCB0aGUgTUNVIGlzIGluIExvdy1wb3dlciBSdW4gbW9kZS4gVG8gbW92ZSBpbiAKKyAgKiAgICAgICAgUnVuIG1vZGUsIHRoZSB1c2VyIG11c3QgcmVzb3J0IHRvIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCkgQVBJLgorICAqIEBwYXJhbSBTTEVFUEVudHJ5IFNwZWNpZmllcyBpZiBTbGVlcCBtb2RlIGlzIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFIGluc3RydWN0aW9uLgorICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TTEVFUEVOVFJZX1dGSSBlbnRlciBTbGVlcCBvciBMb3ctcG93ZXIgU2xlZXAgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TTEVFUEVOVFJZX1dGRSBlbnRlciBTbGVlcCBvciBMb3ctcG93ZXIgU2xlZXAgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbgorICAqIEBub3RlICBXaGVuIFdGSSBlbnRyeSBpcyB1c2VkLCB0aWNrIGludGVycnVwdCBoYXZlIHRvIGJlIGRpc2FibGVkIGlmIG5vdCBkZXNpcmVkIGFzIAorICAqICAgICAgICB0aGUgaW50ZXJydXB0IHdha2UgdXAgc291cmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSX0VudGVyU0xFRVBNb2RlKHVpbnQzMl90IFJlZ3VsYXRvciwgdWludDhfdCBTTEVFUEVudHJ5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1JFR1VMQVRPUihSZWd1bGF0b3IpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9TTEVFUF9FTlRSWShTTEVFUEVudHJ5KSk7CisKKyAgLyogU2V0IFJlZ3VsYXRvciBwYXJhbWV0ZXIgKi8KKyAgaWYgKFJlZ3VsYXRvciA9PSBQV1JfTUFJTlJFR1VMQVRPUl9PTikKKyAgeworICAgIC8qIElmIGluIGxvdy1wb3dlciBydW4gbW9kZSBhdCB0aGlzIHBvaW50LCBleGl0IGl0ICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKFBXUi0+U1IyLCBQV1JfU1IyX1JFR0xQRikpCisgICAgeworICAgICAgaWYgKEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gOworICAgICAgfQorICAgIH0gCisgICAgLyogUmVndWxhdG9yIG5vdyBpbiBtYWluIG1vZGUuICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSWYgaW4gcnVuIG1vZGUsIGZpcnN0IG1vdmUgdG8gbG93LXBvd2VyIHJ1biBtb2RlLgorICAgICAgIFRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IG11c3QgYmUgYmVsb3cgMiBNSHogYXQgdGhpcyBwb2ludC4gKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKCk7ICAKKyAgICB9IAorICB9IAorICAgIAorICAvKiBDbGVhciBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKyAgLyogU2VsZWN0IFNMRUVQIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNMRUVQRW50cnkgPT0gUFdSX1NMRUVQRU5UUllfV0ZJKQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgICBfX1dGSSgpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgRXZlbnQgKi8KKyAgICBfX1NFVigpOworICAgIF9fV0ZFKCk7CisgICAgX19XRkUoKTsKKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiBFbnRlciBTdG9wIG1vZGUKKyAgKiBAbm90ZSAgVGhpcyBBUEkgaXMgbmFtZWQgSEFMX1BXUl9FbnRlclNUT1BNb2RlIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvZGUgcnVubmluZworICAqICAgICAgICBvbiBkZXZpY2VzIHdoZXJlIG9ubHkgIlN0b3AgbW9kZSIgaXMgbWVudGlvbmVkIHdpdGggbWFpbiBvciBsb3cgcG93ZXIgcmVndWxhdG9yIE9OLgorICAqIEBub3RlICBJbiBTdG9wIG1vZGUsIGFsbCBJL08gcGlucyBrZWVwIHRoZSBzYW1lIHN0YXRlIGFzIGluIFJ1biBtb2RlLgorICAqIEBub3RlICBBbGwgY2xvY2tzIGluIHRoZSBWQ09SRSBkb21haW4gYXJlIHN0b3BwZWQ7IHRoZSBQTEwsIHRoZSBNU0ksIAorICAqICAgICAgICB0aGUgSFNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBkaXNhYmxlZC4gU29tZSBwZXJpcGhlcmFscyB3aXRoIHRoZSB3YWtldXAgY2FwYWJpbGl0eSAKKyAgKiAgICAgICAgKEkyQ3gsIFVTQVJUeCBhbmQgTFBVQVJUKSBjYW4gc3dpdGNoIG9uIHRoZSBIU0kgdG8gcmVjZWl2ZSBhIGZyYW1lLCBhbmQgc3dpdGNoIG9mZiB0aGUgSFNJIAorICAqICAgICAgICBhZnRlciByZWNlaXZpbmcgdGhlIGZyYW1lIGlmIGl0IGlzIG5vdCBhIHdha2V1cCBmcmFtZS4gSW4gdGhpcyBjYXNlLCB0aGUgSFNJIGNsb2NrIGlzIHByb3BhZ2F0ZWQgCisgICogICAgICAgIG9ubHkgdG8gdGhlIHBlcmlwaGVyYWwgcmVxdWVzdGluZyBpdC4KKyAgKiAgICAgICAgU1JBTTEsIFNSQU0yIGFuZCByZWdpc3RlciBjb250ZW50cyBhcmUgcHJlc2VydmVkLgorICAqICAgICAgICBUaGUgQk9SIGlzIGF2YWlsYWJsZS4KKyAgKiAgICAgICAgVGhlIHZvbHRhZ2UgcmVndWxhdG9yIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciBpbiBub3JtYWwgKFN0b3AgMCkgb3IgbG93LXBvd2VyIG1vZGUgKFN0b3AgMSkuICAKKyAgKiBAbm90ZSAgV2hlbiBleGl0aW5nIFN0b3AgMCBvciBTdG9wIDEgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgaWYgU1RPUFdVQ0sgYml0IGluIFJDQ19DRkdSIHJlZ2lzdGVyCisgICogICAgICAgICBpcyBzZXQ7IHRoZSBNU0kgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBpZiBTVE9QV1VDSyBpcyBjbGVhcmVkLiAgCisgICogQG5vdGUgIFdoZW4gdGhlIHZvbHRhZ2UgcmVndWxhdG9yIG9wZXJhdGVzIGluIGxvdyBwb3dlciBtb2RlIChTdG9wIDEpLCBhbiBhZGRpdGlvbmFsCisgICogICAgICAgICBzdGFydHVwIGRlbGF5IGlzIGluY3VycmVkIHdoZW4gd2FraW5nIHVwLgorICAqICAgICAgICAgQnkga2VlcGluZyB0aGUgaW50ZXJuYWwgcmVndWxhdG9yIE9OIGR1cmluZyBTdG9wIG1vZGUgKFN0b3AgMCksIHRoZSBjb25zdW1wdGlvbgorICAqICAgICAgICAgaXMgaGlnaGVyIGFsdGhvdWdoIHRoZSBzdGFydHVwIHRpbWUgaXMgcmVkdWNlZC4KKyAgKiBAbm90ZSAgQWNjb3JkaW5nIHRvIHN5c3RlbSBwb3dlciBwb2xpY3ksIHN5c3RlbSBlbnRlcmluZyBpbiBTdG9wIG1vZGUKKyAgKiAgICAgICAgaXMgZGVwZW5kaW5nIG9uIG90aGVyIENQVSBwb3dlciBtb2RlLgorICAqIEBwYXJhbSBSZWd1bGF0b3IgU3BlY2lmaWVzIHRoZSByZWd1bGF0b3Igc3RhdGUgaW4gU3RvcCBtb2RlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX01BSU5SRUdVTEFUT1JfT04gIFN0b3AgMCBtb2RlIChtYWluIHJlZ3VsYXRvciBPTikKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04gIFN0b3AgMSBtb2RlIChsb3cgcG93ZXIgcmVndWxhdG9yIE9OKSAKKyAgKiBAcGFyYW0gU1RPUEVudHJ5IFNwZWNpZmllcyBTdG9wIDAsIFN0b3AgMSBvciBTdG9wIDIgbW9kZSBpcyBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRSBpbnN0cnVjdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZJICBFbnRlciBTdG9wIDAgb3IgU3RvcCAxIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24uCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NUT1BFTlRSWV9XRkUgIEVudGVyIFN0b3AgMCBvciBTdG9wIDEgbW9kZSB3aXRoIFdGRSBpbnN0cnVjdGlvbi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbnRlclNUT1BNb2RlKHVpbnQzMl90IFJlZ3VsYXRvciwgdWludDhfdCBTVE9QRW50cnkpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfUkVHVUxBVE9SKFJlZ3VsYXRvcikpOworICAKKyAgaWYoUmVndWxhdG9yID09IFBXUl9MT1dQT1dFUlJFR1VMQVRPUl9PTikKKyAgeworICAgIEhBTF9QV1JFeF9FbnRlclNUT1AxTW9kZShTVE9QRW50cnkpOworICB9CisgIGVsc2UKKyAgeworICAgIEhBTF9QV1JFeF9FbnRlclNUT1AwTW9kZShTVE9QRW50cnkpOworICB9Cit9CisKKworLyoqCisgICogQGJyaWVmIEVudGVyIFN0YW5kYnkgbW9kZS4KKyAgKiBAbm90ZSAgSW4gU3RhbmRieSBtb2RlLCB0aGUgUExMLCB0aGUgSFNJLCB0aGUgTVNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBzd2l0Y2hlZCAKKyAgKiAgICAgICAgb2ZmLiBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQsIGV4Y2VwdCB3aGVuIEJLUkFNIGNvbnRlbnQgaXMgcHJlc2VydmVkCisgICogICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIHJlZ3VsYXRvciBpcyBpbiBsb3ctcG93ZXIgbW9kZS4KKyAgKiAgICAgICAgU1JBTSBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIGxvc3QgZXhjZXB0IGZvciByZWdpc3RlcnMgaW4gdGhlIEJhY2t1cCBkb21haW4gYW5kCisgICogICAgICAgIFN0YW5kYnkgY2lyY3VpdHJ5LiBCS1JBTSBjb250ZW50IGNhbiBiZSBwcmVzZXJ2ZWQgaWYgdGhlIGJpdCBSUlMgaXMgc2V0IGluIFBXUl9DUjMgcmVnaXN0ZXIuCisgICogICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8gSEFMX1BXUkV4X0VuYWJsZUJLUkFNQ29udGVudFJldGVudGlvbigpIEFQSQorICAqICAgICAgICB0byBzZXQgUlJTIGJpdC4KKyAgKiAgICAgICAgVGhlIEJPUiBpcyBhdmFpbGFibGUuCisgICogQG5vdGUgIFRoZSBJL09zIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciB3aXRoIGEgcHVsbC11cCBvciBwdWxsLWRvd24gb3IgY2FuIGJlIGtlcHQgaW4gYW5hbG9nIHN0YXRlLgorICAqICAgICAgICBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCgpIGFuZCBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKCkgcmVzcGVjdGl2ZWx5IGVuYWJsZSBQdWxsIFVwIGFuZAorICAqICAgICAgICBQdWxsIERvd24gc3RhdGUsIEhBTF9QV1JFeF9EaXNhYmxlR1BJT1B1bGxVcCgpIGFuZCBIQUxfUFdSRXhfRGlzYWJsZUdQSU9QdWxsRG93bigpIGRpc2FibGUgdGhlCisgICogICAgICAgIHNhbWUuCisgICogICAgICAgIFRoZXNlIHN0YXRlcyBhcmUgZWZmZWN0aXZlIGluIFN0YW5kYnkgbW9kZSBvbmx5IGlmIEFQQyBiaXQgaXMgc2V0IHRocm91Z2gKKyAgKiAgICAgICAgSEFMX1BXUkV4X0VuYWJsZVB1bGxVcFB1bGxEb3duQ29uZmlnKCkgQVBJLgorICAqIEBub3RlICBBY2NvcmRpbmcgdG8gc3lzdGVtIHBvd2VyIHBvbGljeSwgc3lzdGVtIGVudGVyaW5nIGluIFN0YW5kYnkgbW9kZQorICAqICAgICAgICBpcyBkZXBlbmRpbmcgb24gb3RoZXIgQ1BVIHBvd2VyIG1vZGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW50ZXJTVEFOREJZTW9kZSh2b2lkKQoreworICAvKiBTZXQgU3RhbmQtYnkgbW9kZSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9MT1dQT1dFUk1PREVfU1RBTkRCWSk7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKy8qIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgc3RvcmUgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkICovCisjaWYgZGVmaW5lZCAoIF9fQ0NfQVJNKQorICBfX2ZvcmNlX3N0b3JlcygpOworI2VuZGlmCisKKyAgLyogUmVxdWVzdCBXYWl0IEZvciBJbnRlcnJ1cHQgKi8KKyAgX19XRkkoKTsKKworICAvKiBGb2xsb3dpbmcgY29kZSBpcyBleGVjdXRlZCBhZnRlciB3YWtlIHVwIGlmIHN5c3RlbSBkaWQgbm90IGdvIHRvIFNUQU5EQlkKKyAgICAgbW9kZSBhY2NvcmRpbmcgdG8gc3lzdGVtIHBvd2VyIHBvbGljeSAqLworCisgIC8qIFJlc2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIENMRUFSX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQREVFUF9Nc2spKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBTbGVlcC1Pbi1FeGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gSGFuZGxlciBtb2RlIHRvIFRocmVhZCBtb2RlLiAKKyAgKiBAbm90ZSAgIFNldCBTTEVFUE9ORVhJVCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhlIHByb2Nlc3NvciAKKyAgKiAgICAgICAgIHJlLWVudGVycyBTTEVFUCBtb2RlIHdoZW4gYW4gaW50ZXJydXB0aW9uIGhhbmRsaW5nIGlzIG92ZXIuCisgICogICAgICAgICBTZXR0aW5nIHRoaXMgYml0IGlzIHVzZWZ1bCB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgZXhwZWN0ZWQgdG8gcnVuIG9ubHkgb24KKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGFuZGxpbmcuICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRW5hYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogU2V0IFNMRUVQT05FWElUIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChTQ0ItPlNDUiwgKCh1aW50MzJfdClTQ0JfU0NSX1NMRUVQT05FWElUX01zaykpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU2xlZXAtT24tRXhpdCBmZWF0dXJlIHdoZW4gcmV0dXJuaW5nIGZyb20gSGFuZGxlciBtb2RlIHRvIFRocmVhZCBtb2RlLiAKKyAgKiBAbm90ZSAgIENsZWFyIFNMRUVQT05FWElUIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGUgcHJvY2Vzc29yIAorICAqICAgICAgICAgcmUtZW50ZXJzIFNMRUVQIG1vZGUgd2hlbiBhbiBpbnRlcnJ1cHRpb24gaGFuZGxpbmcgaXMgb3Zlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9EaXNhYmxlU2xlZXBPbkV4aXQodm9pZCkKK3sKKyAgLyogQ2xlYXIgU0xFRVBPTkVYSVQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUE9ORVhJVF9Nc2spKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIENPUlRFWCBNNCBTRVZPTlBFTkQgYml0LiAKKyAgKiBAbm90ZSBTZXQgU0VWT05QRU5EIGJpdCBvZiBTQ1IgcmVnaXN0ZXIuIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCB0aGlzIGNhdXNlcyAKKyAgKiAgICAgICBXRkUgdG8gd2FrZSB1cCB3aGVuIGFuIGludGVycnVwdCBtb3ZlcyBmcm9tIGluYWN0aXZlIHRvIHBlbmRlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUl9FbmFibGVTRVZPblBlbmQodm9pZCkKK3sKKyAgLyogU2V0IFNFVk9OUEVORCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIERpc2FibGUgQ09SVEVYIE00IFNFVk9OUEVORCBiaXQuIAorICAqIEBub3RlIENsZWFyIFNFVk9OUEVORCBiaXQgb2YgU0NSIHJlZ2lzdGVyLiBXaGVuIHRoaXMgYml0IGlzIHNldCwgdGhpcyBjYXVzZXMgCisgICogICAgICAgV0ZFIHRvIHdha2UgdXAgd2hlbiBhbiBpbnRlcnJ1cHQgbW92ZXMgZnJvbSBpbmFjdGl2ZSB0byBwZW5kZWQuICAgICAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JfRGlzYWJsZVNFVk9uUGVuZCh2b2lkKQoreworICAvKiBDbGVhciBTRVZPTlBFTkQgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TRVZPTlBFTkRfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBQV1IgUFZEIGludGVycnVwdCBjYWxsYmFjaworICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1BXUl9QVkRDYWxsYmFjayh2b2lkKQoreworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1BXUl9QVkRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3B3cl9leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfcHdyX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MmVkYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3B3cl9leC5jCkBAIC0wLDAgKzEsMTMzNSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcHdyX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFBXUiBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQb3dlciBDb250cm9sbGVyIChQV1IpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgIAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JFeAorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUFdSX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQV1JfRXh0ZW5kZWRfUHJpdmF0ZV9EZWZpbmVzIFBXUiBFeHRlbmRlZCBQcml2YXRlIERlZmluZXMKKyAgKiBAeworICAqLworI2RlZmluZSBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMgICAoUFdSX0dQSU9fQklUXzQgfCBQV1JfR1BJT19CSVRfMyB8IFBXUl9HUElPX0JJVF8yIHwgUFdSX0dQSU9fQklUXzEgfCBQV1JfR1BJT19CSVRfMCkKKyNkZWZpbmUgUFdSX1BPUlRIX0FWQUlMQUJMRV9QSU5TICAgKFBXUl9HUElPX0JJVF8zIHwgUFdSX0dQSU9fQklUXzEgfCBQV1JfR1BJT19CSVRfMCkKKworLyoqIEBkZWZncm91cCBQV1JFeF9UaW1lT3V0X1ZhbHVlIFBXUiBFeHRlbmRlZCBGbGFnIFNldHRpbmcgVGltZSBPdXQgVmFsdWUKKyAgKiBAeworICAqLyAKKyNkZWZpbmUgUFdSX0ZMQUdfU0VUVElOR19ERUxBWV9VUyAgICAgICAgICAgICAgICAgICAgICA1MFUgICAvKiE8IFRpbWUgb3V0IHZhbHVlIGZvciBSRUdMUEYgYW5kIFZPU0YgZmxhZ3Mgc2V0dGluZyAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUFdSRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFBXUiBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworICAKKy8qKiBAYWRkdG9ncm91cCBQV1JFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisgIAorCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIFZvbHRhZ2UgU2NhbGluZyBSYW5nZS4KKyAgKiBAcmV0dmFsIFZPUyBiaXQgZmllbGQgKFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9SQU5HRTEgb3IgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1JBTkdFMikKKyAgKi8gIAordWludDMyX3QgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSh2b2lkKQoreworICByZXR1cm4gIChQV1ItPkNSMSAmIFBXUl9DUjFfVk9TKTsKK30KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgbWFpbiBpbnRlcm5hbCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UuCisgICogQHBhcmFtIFZvbHRhZ2VTY2FsaW5nIHNwZWNpZmllcyB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIHRvIGFjaGlldmUKKyAgKiAgICAgICAgIGEgdHJhZGVvZmYgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQgcG93ZXIgY29uc3VtcHRpb24uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxIFJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCByYW5nZSAxIG1vZGUsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBpY2FsIG91dHB1dCB2b2x0YWdlIGF0IDEuMiBWLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGZyZXF1ZW5jeSB1cCB0byA2NCBNSHouCisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMiBSZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgcmFuZ2UgMiBtb2RlLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwaWNhbCBvdXRwdXQgdm9sdGFnZSBhdCAxLjAgViwKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBmcmVxdWVuY3kgdXAgdG8gMTYgTUh6LgorICAqIEBub3RlICBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDEgdG8gUmFuZ2UgMiwgdGhlIHN5c3RlbSBmcmVxdWVuY3kgbXVzdCBiZSBkZWNyZWFzZWQgdG8KKyAgKiAgICAgICAgYSB2YWx1ZSBiZWxvdyAxNiBNSHogYmVmb3JlIGNhbGxpbmcgSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpIEFQSS4KKyAgKiAgICAgICAgV2hlbiBtb3ZpbmcgZnJvbSBSYW5nZSAyIHRvIFJhbmdlIDEsIHRoZSBzeXN0ZW0gZnJlcXVlbmN5IGNhbiBiZSBpbmNyZWFzZWQgdG8KKyAgKiAgICAgICAgYSB2YWx1ZSB1cCB0byA2NCBNSHogYWZ0ZXIgY2FsbGluZyBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKCkgQVBJLgorICAqIEBub3RlICBXaGVuIG1vdmluZyBmcm9tIFJhbmdlIDIgdG8gUmFuZ2UgMSwgdGhlIEFQSSB3YWl0cyBmb3IgVk9TRiBmbGFnIHRvIGJlCisgICogICAgICAgIGNsZWFyZWQgYmVmb3JlIHJldHVybmluZyB0aGUgc3RhdHVzLiBJZiB0aGUgZmxhZyBpcyBub3QgY2xlYXJlZCB3aXRoaW4KKyAgKiAgICAgICAgNTAgbWljcm9zZWNvbmRzLCBIQUxfVElNRU9VVCBzdGF0dXMgaXMgcmVwb3J0ZWQuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ29udHJvbFZvbHRhZ2VTY2FsaW5nKHVpbnQzMl90IFZvbHRhZ2VTY2FsaW5nKQoreworICB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXg7CisKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9WT0xUQUdFX1NDQUxJTkdfUkFOR0UoVm9sdGFnZVNjYWxpbmcpKTsKKyAgCisgIC8qIElmIFNldCBSYW5nZSAxICovCisgIGlmIChWb2x0YWdlU2NhbGluZyA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxKQorICB7CisgICAgaWYgKFJFQURfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUykgIT0gUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSkKKyAgICB7CisgICAgICAvKiBTZXQgUmFuZ2UgMSAqLworICAgICAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9WT1MsIFBXUl9SRUdVTEFUT1JfVk9MVEFHRV9TQ0FMRTEpOworICAgICAgCisgICAgICAvKiBXYWl0IHVudGlsIFZPU0YgaXMgY2xlYXJlZCAqLworICAgICAgd2FpdF9sb29wX2luZGV4ID0gKFBXUl9GTEFHX1NFVFRJTkdfREVMQVlfVVMgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMTAwMDAwMFUpKTsKKyAgICAgIHdoaWxlICgoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfVk9TRikpICYmICh3YWl0X2xvb3BfaW5kZXggIT0gMFUpKQorICAgICAgeworICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgICAgIH0KKyAgICAgIGlmIChIQUxfSVNfQklUX1NFVChQV1ItPlNSMiwgUFdSX1NSMl9WT1NGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoUkVBRF9CSVQoUFdSLT5DUjEsIFBXUl9DUjFfVk9TKSAhPSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyKQorICAgIHsKKyAgICAgIC8qIFNldCBSYW5nZSAyICovCisgICAgICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX1ZPUywgUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMik7CisgICAgICAvKiBObyBuZWVkIHRvIHdhaXQgZm9yIFZPU0YgdG8gYmUgY2xlYXJlZCBmb3IgdGhpcyB0cmFuc2l0aW9uICovCisgICAgfQorICB9CisgIAorICByZXR1cm4gSEFMX09LOworfSAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIGJhdHRlcnkgY2hhcmdpbmcuCisgICogICAgICAgIFdoZW4gVkREIGlzIHByZXNlbnQsIGNoYXJnZSB0aGUgZXh0ZXJuYWwgYmF0dGVyeSBvbiBWQkFUIHRocnUgYW4gaW50ZXJuYWwgcmVzaXN0b3IuCisgICogQHBhcmFtIFJlc2lzdG9yU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgcmVzaXN0b3IgaW1wZWRhbmNlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX0JBVFRFUllfQ0hBUkdJTkdfUkVTSVNUT1JfNSAgICAgNSBrT2htcyByZXNpc3RvcgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9CQVRURVJZX0NIQVJHSU5HX1JFU0lTVE9SXzFfNSAxLjUga09obXMgcmVzaXN0b3IKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUJhdHRlcnlDaGFyZ2luZyh1aW50MzJfdCBSZXNpc3RvclNlbGVjdGlvbikKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9CQVRURVJZX1JFU0lTVE9SX1NFTEVDVChSZXNpc3RvclNlbGVjdGlvbikpOworICAKKyAgLyogU3BlY2lmeSByZXNpc3RvciBzZWxlY3Rpb24gKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSNCwgUFdSX0NSNF9WQlJTLCBSZXNpc3RvclNlbGVjdGlvbik7CisgIAorICAvKiBFbmFibGUgYmF0dGVyeSBjaGFyZ2luZyAqLworICBTRVRfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIGJhdHRlcnkgY2hhcmdpbmcuICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVCYXR0ZXJ5Q2hhcmdpbmcodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1I0LCBQV1JfQ1I0X1ZCRSk7IAorfSAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIFZERFVTQiBzdXBwbHkuCisgICogQG5vdGUgIFJlbW92ZSBWRERVU0IgZWxlY3RyaWNhbCBhbmQgbG9naWNhbCBpc29sYXRpb24sIG9uY2UgVkREVVNCIHN1cHBseSBpcyBwcmVzZW50LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlVmRkVVNCKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9DUjJfVVNWKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgVkREVVNCIHN1cHBseS4gCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlVmRkVVNCKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMiwgUFdSX0NSMl9VU1YpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBJbnRlcm5hbCBXYWtlLXVwIExpbmUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVJbnRlcm5hbFdha2VVcExpbmUodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FSVdVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIEludGVybmFsIFdha2UtdXAgTGluZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVJbnRlcm5hbFdha2VVcExpbmUodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VJV1VMKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEJPUkggYW5kIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlciBmb3JjZWQgaW4gYnlwYXNzIG1vZGUKKyAgKiAgICAgICAgaW50ZXJydXB0IGZvciBDUFUxCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVCT1JIX1NNUFNCeXBhc3NJVCh2b2lkKQoreworICBTRVRfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VCT1JIU01QU0ZCKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgQk9SSCBhbmQgU01QUyBzdGVwIGRvd24gY29udmVydGVyIGZvcmNlZCBpbiBieXBhc3MgbW9kZQorICAqICAgICAgICBpbnRlcnJ1cHQgZm9yIENQVTEKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVCT1JIX1NNUFNCeXBhc3NJVCh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUJPUkhTTVBTRkIpOworfQorCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgUkYgUGhhc2UgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlUkZQaGFzZUlUKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUNSUEVfTXNrKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgUkYgUGhhc2UgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZVJGUGhhc2VJVCh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUNSUEVfTXNrKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEJMRSBBY3Rpdml0eSBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVCTEVBY3Rpdml0eUlUKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUJMRUEpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBCTEUgQWN0aXZpdHkgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUJMRUFjdGl2aXR5SVQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VCTEVBKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIDgwMi4xNS40IEFjdGl2aXR5IGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZTgwMkFjdGl2aXR5SVQodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19FODAyQSk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIDgwMi4xNS40IEFjdGl2aXR5IGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGU4MDJBY3Rpdml0eUlUKHZvaWQpCit7CisgIENMRUFSX0JJVChQV1ItPkNSMywgUFdSX0NSM19FODAyQSk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbmFibGUgQ1BVMiBvbi1Ib2xkIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZUhPTERDMklUKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfRUMySCk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIENQVTIgb24tSG9sZCBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlSE9MREMySVQodm9pZCkKK3sKKyAgQ0xFQVJfQklUKFBXUi0+Q1IzLCBQV1JfQ1IzX0VDMkgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgIFNldCB0aGUgcmVsZXZhbnQgUFV5IGJpdHMgb2YgUFdSX1BVQ1J4IHJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgSS9PIGluIAorICAqICAgICAgICBwdWxsLXVwIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLiAKKyAgKiBAbm90ZSAgVGhpcyBzdGF0ZSBpcyBlZmZlY3RpdmUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMgb25seSBpZiBBUEMgYml0IAorICAqICAgICAgICBpcyBzZXQgdGhyb3VnaCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcoKSBBUEkuCisgICogQG5vdGUgIFRoZSBjb25maWd1cmF0aW9uIGlzIGxvc3Qgd2hlbiBleGl0aW5nIHRoZSBTaHV0ZG93biBtb2RlIGR1ZSB0byB0aGUgCisgICogICAgICAgIHBvd2VyLW9uIHJlc2V0LCBtYWludGFpbmVkIHdoZW4gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlLiAKKyAgKiBAbm90ZSAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUgY29ycmVzcG9uZGluZworICAqICAgICAgICBQRHkgYml0IG9mIFBXUl9QRENSeCByZWdpc3RlciBpcyBjbGVhcmVkIHVubGVzcyBpdCBpcyByZXNlcnZlZC4gCisgICogQG5vdGUgIEV2ZW4gaWYgYSBQVXkgYml0IHRvIHNldCBpcyByZXNlcnZlZCwgdGhlIG90aGVyIFBVeSBiaXRzIGVudGVyZWQgYXMgaW5wdXQgCisgICogICAgICAgIHBhcmFtZXRlciBhdCB0aGUgc2FtZSB0aW1lIGFyZSBzZXQuICAgICAKKyAgKiBAcGFyYW0gR1BJTyBTcGVjaWZ5IHRoZSBJTyBwb3J0LiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgUFdSX0dQSU9fQSwgLi4uLCBQV1JfR1BJT19IIAorICAqICAgICAgICAgdG8gc2VsZWN0IHRoZSBHUElPIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIEdQSU9OdW1iZXIgU3BlY2lmeSB0aGUgSS9PIHBpbnMgbnVtYmVycy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBQV1JfR1BJT19CSVRfMCwgLi4uLCBQV1JfR1BJT19CSVRfMTUgKGV4Y2VwdCBmb3IgUE9SVEggd2hlcmUgbGVzcyAgCisgICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gc2V0IAorICAqICAgICAgICAgc2V2ZXJhbCBiaXRzIGZvciBhIGdpdmVuIHBvcnQgaW4gYSBzaW5nbGUgQVBJIGNhbGwuCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxVcCh1aW50MzJfdCBHUElPLCB1aW50MzJfdCBHUElPTnVtYmVyKQoreyAgCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU8oR1BJTykpOworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0dQSU9fQklUX05VTUJFUihHUElPTnVtYmVyKSk7CisKKyAgc3dpdGNoIChHUElPKQorICB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQSwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkEsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fQjoKKyAgICAgICBTRVRfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JCLCBHUElPTnVtYmVyKTsKKyAgICAgICBicmVhazsgCisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSQywgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkMsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOyAKKyAgICBjYXNlIFBXUl9HUElPX0Q6CisgICAgICAgU0VUX0JJVChQV1ItPlBVQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRCwgR1BJT051bWJlcik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19FOgorICAgICAgIFNFVF9CSVQoUFdSLT5QVUNSRSwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSRSwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0g6CisgICAgICAgU0VUX0JJVChQV1ItPlBVQ1JILCAoR1BJT051bWJlciAmIFBXUl9QT1JUSF9BVkFJTEFCTEVfUElOUykpOworICAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JILCAoR1BJT051bWJlciAmIFBXUl9QT1JUSF9BVkFJTEFCTEVfUElOUykpOworICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorICAgICAgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBHUElPIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBtb2RlIGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAgKiBAbm90ZSAgUmVzZXQgdGhlIHJlbGV2YW50IFBVeSBiaXRzIG9mIFBXUl9QVUNSeCByZWdpc3RlciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgSS9PCisgICogICAgICAgIGluIHB1bGwtdXAgc3RhdGUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuCisgICogQG5vdGUgIEV2ZW4gaWYgYSBQVXkgYml0IHRvIHJlc2V0IGlzIHJlc2VydmVkLCB0aGUgb3RoZXIgUFV5IGJpdHMgZW50ZXJlZCBhcyBpbnB1dCAKKyAgKiAgICAgICAgcGFyYW1ldGVyIGF0IHRoZSBzYW1lIHRpbWUgYXJlIHJlc2V0LgorICAqIEBwYXJhbSBHUElPIFNwZWNpZmllcyB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFBXUl9HUElPX0EsIC4uLiwgUFdSX0dQSU9fSCAKKyAgKiAgICAgICAgIHRvIHNlbGVjdCB0aGUgR1BJTyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBHUElPTnVtYmVyIFNwZWNpZnkgdGhlIEkvTyBwaW5zIG51bWJlcnMuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgUFdSX0dQSU9fQklUXzAsIC4uLiwgUFdSX0dQSU9fQklUXzE1IChleGNlcHQgZm9yIFBPUlRIIHdoZXJlIGxlc3MKKyAgKiAgICAgICAgIEkvTyBwaW5zIGFyZSBhdmFpbGFibGUpIG9yIHRoZSBsb2dpY2FsIE9SIG9mIHNldmVyYWwgb2YgdGhlbSB0byByZXNldCAKKyAgKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLyAgIAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbFVwKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7ICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPX0JJVF9OVU1CRVIoR1BJT051bWJlcikpOworICAKKyAgc3dpdGNoIChHUElPKQorICB7CisgICAgY2FzZSBQV1JfR1BJT19BOgorICAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JBLCBHUElPTnVtYmVyKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0I6CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOyAKKyAgICBjYXNlIFBXUl9HUElPX0M6CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkMsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOyAKKyAgICBjYXNlIFBXUl9HUElPX0Q6CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkQsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOworICAgIGNhc2UgUFdSX0dQSU9fRToKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRSwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0g6CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkgsIChHUElPTnVtYmVyICYgUFdSX1BPUlRIX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgYnJlYWs7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEdQSU8gcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLgorICAqIEBub3RlICBTZXQgdGhlIHJlbGV2YW50IFBEeSBiaXRzIG9mIFBXUl9QRENSeCByZWdpc3RlciB0byBjb25maWd1cmUgdGhlIEkvTyBpbiAKKyAgKiAgICAgICAgcHVsbC1kb3duIHN0YXRlIGluIFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzLiAKKyAgKiBAbm90ZSAgVGhpcyBzdGF0ZSBpcyBlZmZlY3RpdmUgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMgb25seSBpZiBBUEMgYml0CisgICogICAgICAgIGlzIHNldCB0aHJvdWdoIEhBTF9QV1JFeF9FbmFibGVQdWxsVXBQdWxsRG93bkNvbmZpZygpIEFQSS4gCisgICogQG5vdGUgIFRoZSBjb25maWd1cmF0aW9uIGlzIGxvc3Qgd2hlbiBleGl0aW5nIHRoZSBTaHV0ZG93biBtb2RlIGR1ZSB0byB0aGUgCisgICogICAgICAgIHBvd2VyLW9uIHJlc2V0LCBtYWludGFpbmVkIHdoZW4gZXhpdGluZyB0aGUgU3RhbmRieSBtb2RlLiAKKyAgKiBAbm90ZSAgVG8gYXZvaWQgYW55IGNvbmZsaWN0IGF0IFN0YW5kYnkgYW5kIFNodXRkb3duIG1vZGVzIGV4aXRzLCB0aGUgY29ycmVzcG9uZGluZworICAqICAgICAgICBQVXkgYml0IG9mIFBXUl9QVUNSeCByZWdpc3RlciBpcyBjbGVhcmVkIHVubGVzcyBpdCBpcyByZXNlcnZlZC4gCisgICogQG5vdGUgIEV2ZW4gaWYgYSBQRHkgYml0IHRvIHNldCBpcyByZXNlcnZlZCwgdGhlIG90aGVyIFBEeSBiaXRzIGVudGVyZWQgYXMgaW5wdXQgCisgICogICAgICAgIHBhcmFtZXRlciBhdCB0aGUgc2FtZSB0aW1lIGFyZSBzZXQuICAgICAgICAgCisgICogQHBhcmFtIEdQSU8gU3BlY2lmeSB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFBXUl9HUElPX0EuLlBXUl9HUElPX0ggCisgICogICAgICAgICB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gR1BJT051bWJlciBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciBQT1JUSCB3aGVyZSBsZXNzICAKKyAgKiAgICAgICAgIEkvTyBwaW5zIGFyZSBhdmFpbGFibGUpIG9yIHRoZSBsb2dpY2FsIE9SIG9mIHNldmVyYWwgb2YgdGhlbSB0byBzZXQgCisgICogICAgICAgICBzZXZlcmFsIGJpdHMgZm9yIGEgZ2l2ZW4gcG9ydCBpbiBhIHNpbmdsZSBBUEkgY2FsbC4gCisgICogQHJldHZhbCBIQUwgU3RhdHVzCisgICovICAgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfRW5hYmxlR1BJT1B1bGxEb3duKHVpbnQzMl90IEdQSU8sIHVpbnQzMl90IEdQSU9OdW1iZXIpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJTyhHUElPKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfR1BJT19CSVRfTlVNQkVSKEdQSU9OdW1iZXIpKTsKKyAgCisgIHN3aXRjaCAoR1BJTykKKyAgeyAKKyAgICBjYXNlIFBXUl9HUElPX0E6CisgICAgICAgU0VUX0JJVChQV1ItPlBEQ1JBLCBHUElPTnVtYmVyKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQSwgR1BJT051bWJlcik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSQiwgR1BJT051bWJlcik7CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UFVDUkIsIEdQSU9OdW1iZXIpOworICAgICAgIGJyZWFrOyAKKyAgICBjYXNlIFBXUl9HUElPX0M6CisgICAgICAgU0VUX0JJVChQV1ItPlBEQ1JDLCBHUElPTnVtYmVyKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSQywgR1BJT051bWJlcik7CisgICAgICAgYnJlYWs7IAorICBjYXNlIFBXUl9HUElPX0Q6CisgICAgICAgU0VUX0JJVChQV1ItPlBEQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRCwgR1BJT051bWJlcik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19FOgorICAgICAgIFNFVF9CSVQoUFdSLT5QRENSRSwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QVUNSRSwgKEdQSU9OdW1iZXIgJiBQV1JfUE9SVEVfQVZBSUxBQkxFX1BJTlMpKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0g6CisgICAgICAgU0VUX0JJVChQV1ItPlBEQ1JILCAoR1BJT051bWJlciAmIFBXUl9QT1JUSF9BVkFJTEFCTEVfUElOUykpOworICAgICAgIENMRUFSX0JJVChQV1ItPlBVQ1JILCAoR1BJT051bWJlciAmIFBXUl9QT1JUSF9BVkFJTEFCTEVfUElOUykpOworICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorICAgICAgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBHUElPIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4KKyAgKiBAbm90ZSAgUmVzZXQgdGhlIHJlbGV2YW50IFBEeSBiaXRzIG9mIFBXUl9QRENSeCByZWdpc3RlciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgSS9PCisgICogICAgICAgIGluIHB1bGwtZG93biBzdGF0ZSBpbiBTdGFuZGJ5IGFuZCBTaHV0ZG93biBtb2Rlcy4gCisgICogQG5vdGUgIEV2ZW4gaWYgYSBQRHkgYml0IHRvIHJlc2V0IGlzIHJlc2VydmVkLCB0aGUgb3RoZXIgUER5IGJpdHMgZW50ZXJlZCBhcyBpbnB1dCAKKyAgKiAgICAgICAgcGFyYW1ldGVyIGF0IHRoZSBzYW1lIHRpbWUgYXJlIHJlc2V0LgorICAqIEBwYXJhbSBHUElPIFNwZWNpZmllcyB0aGUgSU8gcG9ydC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIFBXUl9HUElPX0EuLlBXUl9HUElPX0ggCisgICogICAgICAgICB0byBzZWxlY3QgdGhlIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gR1BJT051bWJlciBTcGVjaWZ5IHRoZSBJL08gcGlucyBudW1iZXJzLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIFBXUl9HUElPX0JJVF8wLCAuLi4sIFBXUl9HUElPX0JJVF8xNSAoZXhjZXB0IGZvciBQT1JUSCB3aGVyZSBsZXNzCisgICogICAgICAgICBJL08gcGlucyBhcmUgYXZhaWxhYmxlKSBvciB0aGUgbG9naWNhbCBPUiBvZiBzZXZlcmFsIG9mIHRoZW0gdG8gcmVzZXQKKyAgKiAgICAgICAgIHNldmVyYWwgYml0cyBmb3IgYSBnaXZlbiBwb3J0IGluIGEgc2luZ2xlIEFQSSBjYWxsLgorICAqIEByZXR2YWwgSEFMIFN0YXR1cworICAqLyAgIAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BXUkV4X0Rpc2FibGVHUElPUHVsbERvd24odWludDMyX3QgR1BJTywgdWludDMyX3QgR1BJT051bWJlcikKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPKEdQSU8pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9HUElPX0JJVF9OVU1CRVIoR1BJT051bWJlcikpOworICAgCisgIHN3aXRjaCAoR1BJTykKKyAgeworICAgIGNhc2UgUFdSX0dQSU9fQToKKyAgICAgICBDTEVBUl9CSVQoUFdSLT5QRENSQSwgR1BJT051bWJlcik7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19COgorICAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JCLCBHUElPTnVtYmVyKTsKKyAgICAgICBicmVhazsgCisgICAgY2FzZSBQV1JfR1BJT19DOgorICAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JDLCBHUElPTnVtYmVyKTsKKyAgICAgICBicmVhazsgCisgICAgY2FzZSBQV1JfR1BJT19EOgorICAgICAgIENMRUFSX0JJVChQV1ItPlBEQ1JELCBHUElPTnVtYmVyKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIFBXUl9HUElPX0U6CisgICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkUsIChHUElPTnVtYmVyICYgUFdSX1BPUlRFX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBQV1JfR1BJT19IOgorICAgICAgQ0xFQVJfQklUKFBXUi0+UERDUkgsIChHUElPTnVtYmVyICYgUFdSX1BPUlRIX0FWQUlMQUJMRV9QSU5TKSk7CisgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9uLgorICAqIEBub3RlICBXaGVuIEFQQyBiaXQgaXMgc2V0LCB0aGUgSS9PIHB1bGwtdXAgYW5kIHB1bGwtZG93biBjb25maWd1cmF0aW9ucyBkZWZpbmVkIGluIAorICAqICAgICAgICBQV1JfUFVDUnggYW5kIFBXUl9QRENSeCByZWdpc3RlcnMgYXJlIGFwcGxpZWQgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuICAgIAorICAqIEBub3RlICBQdWxsLXVwIHNldCBieSBQVXkgYml0IG9mIFBXUl9QVUNSeCByZWdpc3RlciBpcyBub3QgYWN0aXZhdGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgICogICAgICAgIFBEeSBiaXQgb2YgUFdSX1BEQ1J4IHJlZ2lzdGVyIGlzIGFsc28gc2V0IChwdWxsLWRvd24gY29uZmlndXJhdGlvbiBwcmlvcml0eSBpcyBoaWdoZXIpLiAKKyAgKiAgICAgICAgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsVXAoKSBhbmQgSEFMX1BXUkV4X0VuYWJsZUdQSU9QdWxsRG93bigpIEFQSSdzIGVuc3VyZSB0aGVyZSAKKyAgKiAgICAgICAgaXMgbm8gY29uZmxpY3Qgd2hlbiBzZXR0aW5nIFBVeSBvciBQRHkgYml0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlUHVsbFVwUHVsbERvd25Db25maWcodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMywgUFdSX0NSM19BUEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBwdWxsLXVwIGFuZCBwdWxsLWRvd24gY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgV2hlbiBBUEMgYml0IGlzIGNsZWFyZWQsIHRoZSBJL08gcHVsbC11cCBhbmQgcHVsbC1kb3duIGNvbmZpZ3VyYXRpb25zIGRlZmluZWQgaW4gCisgICogICAgICAgIFBXUl9QVUNSeCBhbmQgUFdSX1BEQ1J4IHJlZ2lzdGVycyBhcmUgbm90IGFwcGxpZWQgaW4gU3RhbmRieSBhbmQgU2h1dGRvd24gbW9kZXMuICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0Rpc2FibGVQdWxsVXBQdWxsRG93bkNvbmZpZyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjMsIFBXUl9DUjNfQVBDKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEBicmllZiAgU2V0IEJPUiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBCT1JDb25maWd1cmF0aW9uIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgUFdSX0JPUl9TWVNURU1fUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBQV1JfQk9SX1NNUFNfRk9SQ0VfQllQQVNTCisgICovCit2b2lkIEhBTF9QV1JFeF9TZXRCT1JDb25maWcodWludDMyX3QgQk9SQ29uZmlndXJhdGlvbikKK3sKKyAgTExfUFdSX1NldEJPUkNvbmZpZyhCT1JDb25maWd1cmF0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgQk9SIGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgUFdSX0JPUl9TWVNURU1fUkVTRVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBQV1JfQk9SX1NNUFNfRk9SQ0VfQllQQVNTCisgICovCit1aW50MzJfdCBIQUxfUFdSRXhfR2V0Qk9SQ29uZmlnKHZvaWQpCit7CisgIHJldHVybiBMTF9QV1JfR2V0Qk9SQ29uZmlnKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogQGJyaWVmICBIb2xkIHRoZSBDUFUgYW5kIHRoZWlyIGFsbG9jYXRlZCBwZXJpcGhlcmFscyBhZnRlciByZXNldCBvciB3YWtldXAgZnJvbSBzdG9wIG9yIHN0YW5kYnkuCisgICogQHBhcmFtICBDUFU6IFNwZWNpZmllcyB0aGUgY29yZSB0byBiZSBoZWxkLgorICAqICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUFdSX0NPUkVfQ1BVMjogSG9sZCBDUFUyIGFuZCBzZXQgQ1BVMSBhcyBtYXN0ZXIuCisgICogQG5vdGUgICBIb2xkIENQVTIgd2l0aCBDUFUxIGFzIG1hc3RlciBieSBkZWZhdWx0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfSG9sZENvcmUodWludDMyX3QgQ1BVKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0NPUkVfSE9MRF9SRUxFQVNFKENQVSkpOworICAKKyAgTExfUFdSX0Rpc2FibGVCb290QzIoKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWxlYXNlIENvcnRleCBDUFUyIGFuZCBhbGxvY2F0ZWQgcGVyaXBoZXJhbHMgYWZ0ZXIgcmVzZXQgb3Igd2FrZXVwIGZyb20gc3RvcCBvciBzdGFuZGJ5LgorICAqIEBwYXJhbSAgQ1BVOiBTcGVjaWZpZXMgdGhlIGNvcmUgdG8gYmUgcmVsZWFzZWQuCisgICogICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBQV1JfQ09SRV9DUFUyOiBSZWxlYXNlIHRoZSBDUFUyIGZyb20gaG9sZGluZy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X1JlbGVhc2VDb3JlKHVpbnQzMl90IENQVSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9DT1JFX0hPTERfUkVMRUFTRShDUFUpKTsKKyAgCisgIExMX1BXUl9FbmFibGVCb290QzIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIEJLUkFNIGNvbnRlbnQgcmV0ZW50aW9uIGluIFN0YW5kYnkgbW9kZS4KKyAgKiBAbm90ZSAgV2hlbiBSUlMgYml0IGlzIHNldCwgU1JBTSBpcyBwb3dlcmVkIGJ5IHRoZSBsb3ctcG93ZXIgcmVndWxhdG9yIGluCisgICogICAgICAgICBTdGFuZGJ5IG1vZGUgYW5kIGl0cyBjb250ZW50IGlzIGtlcHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVTUkFNUmV0ZW50aW9uKHZvaWQpCit7CisgIExMX1BXUl9FbmFibGVTUkFNMlJldGVudGlvbigpOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBCS1JBTSBjb250ZW50IHJldGVudGlvbiBpbiBTdGFuZGJ5IG1vZGUuCisgICogQG5vdGUgIFdoZW4gUlJTIGJpdCBpcyByZXNldCwgU1JBTSBpcyBwb3dlcmVkIG9mZiBpbiBTdGFuZGJ5IG1vZGUKKyAgKiAgICAgICAgYW5kIGl0cyBjb250ZW50IGlzIGxvc3QuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlU1JBTVJldGVudGlvbih2b2lkKQoreworICBMTF9QV1JfRGlzYWJsZVNSQU0yUmV0ZW50aW9uKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogQGJyaWVmICBFbmFibGUgRmxhc2ggUG93ZXIgRG93bi4KKyAgKiBAbm90ZSAgIFRoaXMgQVBJIGFsbG93cyB0byBlbmFibGUgZmxhc2ggcG93ZXIgZG93biBjYXBhYmlsaXRpZXMgaW4gbG93IHBvd2VyCisgICogICAgICAgICBydW4gYW5kIGxvdyBwb3dlciBzbGVlcCBtb2Rlcy4KKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSB0aGlzIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBU0hQRF9MUFJVTgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQVNIUERfTFBTTEVFUAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW5hYmxlRmxhc2hQb3dlckRvd24odWludDMyX3QgUG93ZXJNb2RlKQoreworICBhc3NlcnRfcGFyYW0oSVNfUFdSX0ZMQVNIX1BPV0VSRE9XTihQb3dlck1vZGUpKTsKKworICBpZigoUG93ZXJNb2RlICYgUFdSX0ZMQVNIUERfTFBSVU4pICE9IDBVKQorICB7CisgICAgLyogVW5sb2NrIGJpdCBGUERSICovCisgICAgV1JJVEVfUkVHKFBXUi0+Q1IxLCAweDAwMDBDMUIwVSk7CisgIH0KKworICAvKiBTZXQgZmxhc2ggcG93ZXIgZG93biBtb2RlICovCisgIFNFVF9CSVQoUFdSLT5DUjEsIFBvd2VyTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBGbGFzaCBQb3dlciBEb3duLgorICAqIEBub3RlICAgVGhpcyBBUEkgYWxsb3dzIHRvIGRpc2FibGUgZmxhc2ggcG93ZXIgZG93biBjYXBhYmlsaXRpZXMgaW4gbG93IHBvd2VyCisgICogICAgICAgICBydW4gYW5kIGxvdyBwb3dlciBzbGVlcCBtb2Rlcy4KKyAgKiBAcGFyYW0gIFBvd2VyTW9kZSB0aGlzIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfRkxBU0hQRF9MUFJVTgorICAqICAgICAgICAgICBAYXJnIEByZWYgUFdSX0ZMQVNIUERfTFBTTEVFUAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRGlzYWJsZUZsYXNoUG93ZXJEb3duKHVpbnQzMl90IFBvd2VyTW9kZSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9GTEFTSF9QT1dFUkRPV04oUG93ZXJNb2RlKSk7CisKKyAgLyogU2V0IGZsYXNoIHBvd2VyIGRvd24gbW9kZSAqLworICBDTEVBUl9CSVQoUFdSLT5DUjEsIFBvd2VyTW9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogQGJyaWVmIEVuYWJsZSB0aGUgUG93ZXIgVm9sdGFnZSBNb25pdG9yaW5nIDE6IFZERFVTQiB2ZXJzdXMgMS4yVi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVBWTTEodm9pZCkKK3sKKyAgU0VUX0JJVChQV1ItPkNSMiwgUFdSX1BWTV8xKTsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFBvd2VyIFZvbHRhZ2UgTW9uaXRvcmluZyAxOiBWRERVU0IgdmVyc3VzIDEuMlYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlUFZNMSh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMSk7Cit9CisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMzogVkREQSB2ZXJzdXMgMS42MlYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVQVk0zKHZvaWQpCit7CisgIFNFVF9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMyk7Cit9CisKKy8qKgorICAqIEBicmllZiBEaXNhYmxlIHRoZSBQb3dlciBWb2x0YWdlIE1vbml0b3JpbmcgMzogVkREQSB2ZXJzdXMgMS42MlYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9EaXNhYmxlUFZNMyh2b2lkKQoreworICBDTEVBUl9CSVQoUFdSLT5DUjIsIFBXUl9QVk1fMyk7Cit9CisKKworCisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIFBlcmlwaGVyYWwgVm9sdGFnZSBNb25pdG9yaW5nIChQVk0pLgorICAqIEBwYXJhbSBzQ29uZmlnUFZNIHBvaW50ZXIgdG8gYSBQV1JfUFZNVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUKKyAgKiAgICAgICAgUFZNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQG5vdGUgVGhlIEFQSSBjb25maWd1cmVzIGEgc2luZ2xlIFBWTSBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCAKKyAgKiAgICAgICBpbiB0aGUgaW5wdXQgc3RydWN0dXJlLiBUbyBjb25maWd1cmUgc2V2ZXJhbCBQVk1zLCB0aGUgQVBJIG11c3QgYmUgc2luZ2x5IAorICAqICAgICAgIGNhbGxlZCBmb3IgZWFjaCBQVk0gdXNlZC4KKyAgKiBAbm90ZSBSZWZlciB0byB0aGUgZWxlY3RyaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBkZXZpY2UgZGF0YXNoZWV0IGZvcgorICAqICAgICAgICAgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB2b2x0YWdlIHRocmVzaG9sZHMgY29ycmVzcG9uZGluZyB0byBlYWNoCisgICogICAgICAgICBkZXRlY3Rpb24gbGV2ZWwgYW5kIHRvIGVhY2ggbW9uaXRvcmVkIHN1cHBseS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9Db25maWdQVk0oUFdSX1BWTVR5cGVEZWYgKnNDb25maWdQVk0pCit7ICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BXUl9QVk1fVFlQRShzQ29uZmlnUFZNLT5QVk1UeXBlKSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfUFZNX01PREUoc0NvbmZpZ1BWTS0+TW9kZSkpOworICAKKyAgLyogQ29uZmlndXJlIEVYVEkgMzEgYW5kIDMzIGludGVycnVwdHMgaWYgc28gcmVxdWlyZWQ6CisgICAgIHNjYW4gdGhydSBQVk1UeXBlIHRvIGRldGVjdCB3aGljaCBQVk14IGlzIHNldCBhbmQKKyAgICAgY29uZmlndXJlIHRoZSBjb3JyZXNwb25kaW5nIEVYVEkgbGluZSBhY2NvcmRpbmdseS4gKi8KKyAgc3dpdGNoIChzQ29uZmlnUFZNLT5QVk1UeXBlKQorICB7CisgICBjYXNlIFBXUl9QVk1fMToKKyAgICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBjb25maWcuIEtlZXAgaXQgY2xlYXIgaWYgbm8gZXZlbnQgb3IgSVQgbW9kZSBpcyBzZWxlY3RlZCAqLworICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9ESVNBQkxFX0VWRU5UKCk7CisgICAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfSVQoKTsKKyAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRElTQUJMRV9GQUxMSU5HX0VER0UoKTsgCisgICAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsKKworICAgICAgLyogQ29uZmlndXJlIGludGVycnVwdCBtb2RlICovCisgICAgICBpZigoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0lUKSA9PSBQVk1fTU9ERV9JVCkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfSVQoKTsKKyAgICAgIH0KKyAgCisgICAgICAvKiBDb25maWd1cmUgZXZlbnQgbW9kZSAqLworICAgICAgaWYoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fTU9ERV9FVlQpID09IFBWTV9NT0RFX0VWVCkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTFfRVhUSV9FTkFCTEVfRVZFTlQoKTsKKyAgICAgIH0KKyAgCisgICAgICAvKiBDb25maWd1cmUgdGhlIGVkZ2UgKi8KKyAgICAgIGlmKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX1JJU0lOR19FREdFKSA9PSBQVk1fUklTSU5HX0VER0UpCisgICAgICB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgICAgICB9CisgIAorICAgICAgaWYoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fRkFMTElOR19FREdFKSA9PSBQVk1fRkFMTElOR19FREdFKQorICAgICAgeworICAgICAgICBfX0hBTF9QV1JfUFZNMV9FWFRJX0VOQUJMRV9GQUxMSU5HX0VER0UoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOyAKKyAgICAgIAorICAgIGNhc2UgUFdSX1BWTV8zOgorICAgICAgLyogQ2xlYXIgYW55IHByZXZpb3VzIGNvbmZpZy4gS2VlcCBpdCBjbGVhciBpZiBubyBldmVudCBvciBJVCBtb2RlIGlzIHNlbGVjdGVkICovCisgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0RJU0FCTEVfRVZFTlQoKTsKKyAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9JVCgpOworICAgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9ESVNBQkxFX0ZBTExJTkdfRURHRSgpOyAKKyAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOworCisgICAgICAvKiBDb25maWd1cmUgaW50ZXJydXB0IG1vZGUgKi8KKyAgICAgIGlmKChzQ29uZmlnUFZNLT5Nb2RlICYgUFZNX01PREVfSVQpID09IFBWTV9NT0RFX0lUKQorICAgICAgeworICAgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9JVCgpOworICAgICAgfQorICAKKyAgICAgIC8qIENvbmZpZ3VyZSBldmVudCBtb2RlICovCisgICAgICBpZigoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9NT0RFX0VWVCkgPT0gUFZNX01PREVfRVZUKQorICAgICAgeworICAgICAgICBfX0hBTF9QV1JfUFZNM19FWFRJX0VOQUJMRV9FVkVOVCgpOworICAgICAgfQorICAKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZWRnZSAqLworICAgICAgaWYoKHNDb25maWdQVk0tPk1vZGUgJiBQVk1fUklTSU5HX0VER0UpID09IFBWTV9SSVNJTkdfRURHRSkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKyAgICAgIH0KKyAgCisgICAgICBpZigoc0NvbmZpZ1BWTS0+TW9kZSAmIFBWTV9GQUxMSU5HX0VER0UpID09IFBWTV9GQUxMSU5HX0VER0UpCisgICAgICB7CisgICAgICAgIF9fSEFMX1BXUl9QVk0zX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgCisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBDb25maWd1cmUgdGhlIFNNUFMgc3RlcCBkb3duIGNvbnZlcnRlci4KKyAgKiBAbm90ZSAgIFNNUFMgb3V0cHV0IHZvbHRhZ2UgaXMgY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uLAorICAqICAgICAgICAgY2FsaWJyYXRpb24gcGFyYW1ldGVycyBhcmUgYXBwbGllZCB0byB0aGUgdm9sdGFnZSBsZXZlbCBwYXJhbWV0ZXIKKyAgKiAgICAgICAgIHRvIHJlYWNoIHRoZSByZXF1ZXN0ZWQgdm9sdGFnZSB2YWx1ZS4KKyAgKiBAcGFyYW0gc0NvbmZpZ1NNUFMgcG9pbnRlciB0byBhIFBXUl9TTVBTVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUKKyAgKiAgICAgICAgU01QUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEBub3RlICBUbyBzZXQgYW5kIGVuYWJsZSBTTVBTIG9wZXJhdGluZyBtb2RlLCByZWZlciB0byBmdW5jdGlvbgorICAqICAgICAgICAiSEFMX1BXUkV4X1NNUFNfU2V0TW9kZSgpIi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9Db25maWdTTVBTKFBXUl9TTVBTVHlwZURlZiAqc0NvbmZpZ1NNUFMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19QV1JfU01QU19TVEFSVFVQX0NVUlJFTlQoc0NvbmZpZ1NNUFMtPlN0YXJ0dXBDdXJyZW50KSk7CisgIGFzc2VydF9wYXJhbShJU19QV1JfU01QU19PVVRQVVRfVk9MVEFHRShzQ29uZmlnU01QUy0+T3V0cHV0Vm9sdGFnZSkpOworICAKKyAgX19JTyBjb25zdCB1aW50MzJfdCBPdXRwdXRWb2x0YWdlTGV2ZWxfY2FsaWJyYXRpb24gPSAoKCgqU01QU19WT0xUQUdFX0NBTF9BRERSKSAmIFNNUFNfVk9MVEFHRV9DQUwpID4+IFNNUFNfVk9MVEFHRV9DQUxfUE9TKTsgIC8qIFNNUFMgb3V0cHV0IHZvbHRhZ2UgbGV2ZWwgY2FsaWJyYXRlZCBpbiBwcm9kdWN0aW9uICovCisgIGludDMyX3QgVHJpbW1pbmdTdGVwczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJpbW1pbmcgc3RlcHMgYmV0d2VlbiB0aGVvcmljYWwgb3V0cHV0IHZvbHRhZ2UgYW5kIGNhbGlicmF0ZWQgb3V0cHV0IHZvbHRhZ2UgKi8KKyAgaW50MzJfdCBPdXRwdXRWb2x0YWdlTGV2ZWxUcmltbWVkOyAgICAgICAgICAgICAvKiBTTVBTIG91dHB1dCB2b2x0YWdlIGxldmVsIGFmdGVyIGNhbGlicmF0aW9uOiB0cmltbWluZyB2YWx1ZSBhZGRlZCB0byByZXF1aXJlZCBsZXZlbCAqLworCisgIGlmKE91dHB1dFZvbHRhZ2VMZXZlbF9jYWxpYnJhdGlvbiA9PSAwVUwpCisgIHsKKyAgICAvKiBEZXZpY2Ugd2l0aCBTTVBTIG91dHB1dCB2b2x0YWdlIG5vdCBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb246IEFwcGx5IG91dHB1dCB2b2x0YWdlIHZhbHVlIGRpcmVjdGx5ICovCisgICAgCisgICAgLyogVXBkYXRlIHJlZ2lzdGVyICovCisgICAgTU9ESUZZX1JFRyhQV1ItPkNSNSwgUFdSX0NSNV9TTVBTVk9TLCAoc0NvbmZpZ1NNUFMtPlN0YXJ0dXBDdXJyZW50IHwgc0NvbmZpZ1NNUFMtPk91dHB1dFZvbHRhZ2UpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEZXZpY2Ugd2l0aCBTTVBTIG91dHB1dCB2b2x0YWdlIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbjogQXBwbHkgb3V0cHV0IHZvbHRhZ2UgdmFsdWUgYWZ0ZXIgY29ycmVjdGlvbiBieSBjYWxpYnJhdGlvbiB2YWx1ZSAqLworICAgIAorICAgIFRyaW1taW5nU3RlcHMgPSAoKGludDMyX3QpT3V0cHV0Vm9sdGFnZUxldmVsX2NhbGlicmF0aW9uIC0gKGludDMyX3QpKExMX1BXUl9TTVBTX09VVFBVVF9WT0xUQUdFXzFWNTAgPj4gUFdSX0NSNV9TTVBTVk9TX1BvcykpOworICAgIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPSAoKGludDMyX3QpKCh1aW50MzJfdCkoc0NvbmZpZ1NNUFMtPk91dHB1dFZvbHRhZ2UgPj4gUFdSX0NSNV9TTVBTVk9TX1BvcykpICsgKGludDMyX3QpVHJpbW1pbmdTdGVwcyk7CisgICAgCisgICAgLyogQ2xhbXAgdmFsdWUgdG8gdm9sdGFnZSB0cmltbWluZyBiaXRmaWVsZCByYW5nZSAqLworICAgIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPCAwKQorICAgIHsKKyAgICAgIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPSAwOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlIGlmKE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQgPiAoaW50MzJfdClQV1JfQ1I1X1NNUFNWT1MpCisgICAgeworICAgICAgT3V0cHV0Vm9sdGFnZUxldmVsVHJpbW1lZCA9IChpbnQzMl90KVBXUl9DUjVfU01QU1ZPUzsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIHJlZ2lzdGVyICovCisgICAgTU9ESUZZX1JFRyhQV1ItPkNSNSwgKFBXUl9DUjVfU01QU1NDIHwgUFdSX0NSNV9TTVBTVk9TKSwgKHNDb25maWdTTVBTLT5TdGFydHVwQ3VycmVudCB8ICgodWludDMyX3QpIE91dHB1dFZvbHRhZ2VMZXZlbFRyaW1tZWQpKSk7CisgIH0KKyAgCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgU01QUyBvcGVyYXRpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIE9wZXJhdGluZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBQV1JfU01QU19CWVBBU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBQV1JfU01QU19TVEVQX0RPV04gKDEpCisgICoKKyAgKiAgICAgICAgICgxKSBTTVBTIG9wZXJhdGluZyBtb2RlIHN0ZXAgZG93biBvciBvcGVuIGRlcGVuZHMgb24gc3lzdGVtIGxvdy1wb3dlciBtb2RlOgorICAqICAgICAgICAgICAgICAtIHN0ZXAgZG93biBtb2RlIGlmIHN5c3RlbSBsb3cgcG93ZXIgbW9kZSBpcyBydW4sIExQIHJ1biBvciBzdG9wLAorICAqICAgICAgICAgICAgICAtIG9wZW4gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgc3RvcDEsIHN0b3AyLCBzdGFuZGJ5IG9yIHNodXRkb3duCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9TTVBTX1NldE1vZGUodWludDMyX3QgT3BlcmF0aW5nTW9kZSkKK3sKKyAgTU9ESUZZX1JFRyhQV1ItPkNSNSwgUFdSX0NSNV9TTVBTRU4sIChPcGVyYXRpbmdNb2RlICYgUFdSX1NSMl9TTVBTRikgPDwgKFBXUl9DUjVfU01QU0VOX1BvcyAtIFBXUl9TUjJfU01QU0ZfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFNNUFMgZWZmZWN0aXZlIG9wZXJhdGluZyBtb2RlCisgICogQG5vdGUgICBTTVBTIG9wZXJhdGluZyBtb2RlIGNhbiBiZSBjaGFuZ2VkIGJ5IGhhcmR3YXJlLCB0aGVyZWZvcmUKKyAgKiAgICAgICAgIHJlcXVlc3RlZCBvcGVyYXRpbmcgbW9kZSBjYW4gZGlmZmVyIGZyb20gZWZmZWN0aXZlIGxvdyBwb3dlciBtb2RlLgorICAqICAgICAgICAgLSBkZXBlbmRlbmN5IG9uIHN5c3RlbSBsb3ctcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgLSBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcCwKKyAgKiAgICAgICAgICAgLSBvcGVuIG1vZGUgaWYgc3lzdGVtIGxvdyBwb3dlciBtb2RlIGlzIHN0b3AxLCBzdG9wMiwgc3RhbmRieSBvciBzaHV0ZG93bgorICAqICAgICAgICAgLSBkZXBlbmRlbmN5IG9uIEJPUiBsZXZlbDoKKyAgKiAgICAgICAgICAgLSBieXBhc3MgbW9kZSBpZiBzdXBwbHkgdm9sdGFnZSBkcm9wcyBiZWxvdyBCT1IgbGV2ZWwKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb25zIGNoZWNrIGZsYWdzIG9mIFNNUFMgb3BlcmF0aW5nIG1vZGVzIHN0ZXAgZG93bgorICAqICAgICAgICAgYW5kIGJ5cGFzcy4gSWYgdGhlIFNNUFMgaXMgbm90IGFtb25nIHRoZXNlIDIgb3BlcmF0aW5nIG1vZGVzLAorICAqICAgICAgICAgdGhlbiBpdCBjYW4gYmUgaW4gbW9kZSBvZmYgb3Igb3Blbi4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgUFdSX1NNUFNfQllQQVNTCisgICogICAgICAgICBAYXJnIEByZWYgUFdSX1NNUFNfU1RFUF9ET1dOICgxKQorICAqCisgICogICAgICAgICAoMSkgU01QUyBvcGVyYXRpbmcgbW9kZSBzdGVwIGRvd24gb3Igb3BlbiBkZXBlbmRzIG9uIHN5c3RlbSBsb3ctcG93ZXIgbW9kZToKKyAgKiAgICAgICAgICAgICAgLSBzdGVwIGRvd24gbW9kZSBpZiBzeXN0ZW0gbG93IHBvd2VyIG1vZGUgaXMgcnVuLCBMUCBydW4gb3Igc3RvcCwKKyAgKiAgICAgICAgICAgICAgLSBvcGVuIG1vZGUgaWYgc3lzdGVtIGxvdyBwb3dlciBtb2RlIGlzIHN0b3AxLCBzdG9wMiwgc3RhbmRieSBvciBzaHV0ZG93bgorICAqLwordWludDMyX3QgSEFMX1BXUkV4X1NNUFNfR2V0RWZmZWN0aXZlTW9kZSh2b2lkKQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChQV1ItPlNSMiwgKFBXUl9TUjJfU01QU0YgfCBQV1JfU1IyX1NNUFNCRikpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEBicmllZiBFbmFibGUgdGhlIFdha2VVcCBQSU54IGZ1bmN0aW9uYWxpdHkuCisgICogQHBhcmFtIFdha2VVcFBpblBvbGFyaXR5IFNwZWNpZmllcyB3aGljaCBXYWtlLVVwIHBpbiB0byBlbmFibGUuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZhbHVlcyB3aGljaCBzZXQgdGhlIGRlZmF1bHQgcG9sYXJpdHkgCisgICogICAgICAgICBpLmUuIGRldGVjdGlvbiBvbiBoaWdoIGxldmVsIChyaXNpbmcgZWRnZSk6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjEsIFBXUl9XQUtFVVBfUElOMiwgUFdSX1dBS0VVUF9QSU4zLCBQV1JfV0FLRVVQX1BJTjQsIFBXUl9XQUtFVVBfUElONQorICAqICAgICAgICAgICAgIAorICAqICAgICAgICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWUgd2hlcmUgdGhlIHVzZXIgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgZW5hYmxlZCBwaW4gYW5kCisgICogICAgICAgICB0aGUgY2hvc2VuIHBvbGFyaXR5OiAgCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjFfSElHSCBvciBQV1JfV0FLRVVQX1BJTjFfTE9XCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjJfSElHSCBvciBQV1JfV0FLRVVQX1BJTjJfTE9XCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjNfSElHSCBvciBQV1JfV0FLRVVQX1BJTjNfTE9XCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjRfSElHSCBvciBQV1JfV0FLRVVQX1BJTjRfTE9XCisgICogICAgICAgICAgIEBhcmcgQHJlZiBQV1JfV0FLRVVQX1BJTjVfSElHSCBvciBQV1JfV0FLRVVQX1BJTjVfTE9XCisgICogQHBhcmFtIHdha2V1cFRhcmdldCBTcGVjaWZpZXMgdGhlIHdha2UtdXAgdGFyZ2V0CisgICogICAgICAgICBAYXJnIEByZWYgUFdSX0NPUkVfQ1BVMQorICAqICAgICAgICAgQGFyZyBAcmVmIFBXUl9DT1JFX0NQVTIKKyAgKiBAbm90ZSAgUFdSX1dBS0VVUF9QSU54IGFuZCBQV1JfV0FLRVVQX1BJTnhfSElHSCBhcmUgZXF1aXZhbGVudC4gICAgICAgICAgICAgICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VuYWJsZVdha2VVcFBpbih1aW50MzJfdCBXYWtlVXBQaW5Qb2xhcml0eSwgdWludDMyX3Qgd2FrZXVwVGFyZ2V0KQoreworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1dBS0VVUF9QSU4oV2FrZVVwUGluUG9sYXJpdHkpKTsgCisgIAorICAvKiBTcGVjaWZpZXMgdGhlIFdha2UtVXAgcGluIHBvbGFyaXR5IGZvciB0aGUgZXZlbnQgZGV0ZWN0aW9uIAorICAgIChyaXNpbmcgb3IgZmFsbGluZyBlZGdlKSAqLworICBNT0RJRllfUkVHKFBXUi0+Q1I0LCAoUFdSX0MyQ1IzX0VXVVAgJiBXYWtlVXBQaW5Qb2xhcml0eSksIChXYWtlVXBQaW5Qb2xhcml0eSA+PiBQV1JfV1VQX1BPTEFSSVRZX1NISUZUKSk7IAorICAKKyAgLyogRW5hYmxlIHdha2UtdXAgcGluICovCisgIGlmKFBXUl9DT1JFX0NQVTIgPT0gd2FrZXVwVGFyZ2V0KQorICB7CisgICAgU0VUX0JJVChQV1ItPkMyQ1IzLCAoUFdSX0MyQ1IzX0VXVVAgJiBXYWtlVXBQaW5Qb2xhcml0eSkpOworICB9CisgIGVsc2UKKyAgeworICAgIFNFVF9CSVQoUFdSLT5DUjMsIChQV1JfQ1IzX0VXVVAgJiBXYWtlVXBQaW5Qb2xhcml0eSkpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBXYWtlLVVwIHBpbiBmbGFnLgorICAqIEBwYXJhbSBXYWtlVXBGbGFnIHNwZWNpZmllcyB0aGUgV2FrZS1VcCBQSU4gZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUYxOiBBIHdha2V1cCBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSBQQTAuCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1dVRjI6IEEgd2FrZXVwIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIFBDMTMuCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1dVRjM6IEEgd2FrZXVwIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIFBDMTIuCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1dVRjQ6IEEgd2FrZXVwIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIFBBMi4KKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGNTogQSB3YWtldXAgZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gUEM1LgorICAqIEByZXR2YWwgVGhlIFdha2UtVXAgcGluIGZsYWcuCisgICovCit1aW50MzJfdCAgSEFMX1BXUkV4X0dldFdha2V1cEZsYWcodWludDMyX3QgV2FrZVVwRmxhZykKK3sKKyAgcmV0dXJuIChQV1ItPlNSMSAmICgxVUwgPDwgKChXYWtlVXBGbGFnKSAmIDMxVSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciB0aGUgV2FrZS1VcCBwaW4gZmxhZy4KKyAgKiBAcGFyYW0gV2FrZVVwRmxhZyBzcGVjaWZpZXMgdGhlIFdha2UtVXAgUElOIGZsYWcgdG8gY2xlYXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUFdSX0ZMQUdfV1VGMTogQSB3YWtldXAgZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gUEEwLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUYyOiBBIHdha2V1cCBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSBQQzEzLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUYzOiBBIHdha2V1cCBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSBQQzEyLgorICAqICAgICAgICAgICAgQGFyZyBQV1JfRkxBR19XVUY0OiBBIHdha2V1cCBldmVudCB3YXMgcmVjZWl2ZWQgZnJvbSBQQTIuCisgICogICAgICAgICAgICBAYXJnIFBXUl9GTEFHX1dVRjU6IEEgd2FrZXVwIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIFBDNS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUFdSRXhfQ2xlYXJXYWtldXBGbGFnKHVpbnQzMl90IFdha2VVcEZsYWcpCit7CisgIFBXUi0+U0NSID0gKDFVTCA8PCAoKFdha2VVcEZsYWcpICYgMzFVKSk7CisKKyAgaWYoKFBXUi0+U1IxICYgKDFVTCA8PCAoKFdha2VVcEZsYWcpICYgMzFVKSkpICE9IDBVKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgICogQGJyaWVmIEVudGVyIExvdy1wb3dlciBSdW4gbW9kZQorICAqIEBub3RlICBJbiBMb3ctcG93ZXIgUnVuIG1vZGUsIGFsbCBJL08gcGlucyBrZWVwIHRoZSBzYW1lIHN0YXRlIGFzIGluIFJ1biBtb2RlLiAgCisgICogQG5vdGUgIFdoZW4gUmVndWxhdG9yIGlzIHNldCB0byBQV1JfTE9XUE9XRVJSRUdVTEFUT1JfT04sIHRoZSB1c2VyIGNhbiBvcHRpb25hbGx5IGNvbmZpZ3VyZSB0aGUKKyAgKiAgICAgICAgRmxhc2ggaW4gcG93ZXItZG93biBtb2RlIGluIHNldHRpbmcgdGhlIFJVTl9QRCBiaXQgaW4gRkxBU0hfQUNSIHJlZ2lzdGVyLgorICAqICAgICAgICBBZGRpdGlvbmFsbHksIHRoZSBjbG9jayBmcmVxdWVuY3kgbXVzdCBiZSByZWR1Y2VkIGJlbG93IDIgTUh6LgorICAqICAgICAgICBTZXR0aW5nIFJVTl9QRCBpbiBGTEFTSF9BQ1IgdGhlbiBhcHByb3ByaWF0ZWx5IHJlZHVjaW5nIHRoZSBjbG9jayBmcmVxdWVuY3kgbXVzdCAKKyAgKiAgICAgICAgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBIQUxfUFdSRXhfRW5hYmxlTG93UG93ZXJSdW5Nb2RlKCkgQVBJLiAgICAgCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbmFibGVMb3dQb3dlclJ1bk1vZGUodm9pZCkKK3sKKyAgLyogU2V0IFJlZ3VsYXRvciBwYXJhbWV0ZXIgKi8KKyAgU0VUX0JJVChQV1ItPkNSMSwgUFdSX0NSMV9MUFIpOyAKK30KKworCisvKioKKyAgKiBAYnJpZWYgRXhpdCBMb3ctcG93ZXIgUnVuIG1vZGUuCisgICogQG5vdGUgIEJlZm9yZSBIQUxfUFdSRXhfRGlzYWJsZUxvd1Bvd2VyUnVuTW9kZSgpIGNvbXBsZXRpb24sIHRoZSBmdW5jdGlvbiBjaGVja3MgdGhhdCAKKyAgKiAgICAgICAgUkVHTFBGIGhhcyBiZWVuIHByb3Blcmx5IHJlc2V0IChvdGhlcndpc2UsIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlIAorICAqICAgICAgICByZXR1cm5zIEhBTF9USU1FT1VUIHN0YXR1cykuIFRoZSBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGNhbiB0aGVuIGJlCisgICogICAgICAgIGluY3JlYXNlZCBhYm92ZSAyIE1Iei4gICAKKyAgKiBAcmV0dmFsIEhBTCBTdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9QV1JFeF9EaXNhYmxlTG93UG93ZXJSdW5Nb2RlKHZvaWQpCit7CisgIHVpbnQzMl90IHdhaXRfbG9vcF9pbmRleDsKKyAgCisgIC8qIENsZWFyIExQUiBiaXQgKi8KKyAgQ0xFQVJfQklUKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQUik7IAorCisgIC8qIFdhaXQgdW50aWwgUkVHTFBGIGlzIHJlc2V0ICovCisgIHdhaXRfbG9vcF9pbmRleCA9IChQV1JfRkxBR19TRVRUSU5HX0RFTEFZX1VTICogKFN5c3RlbUNvcmVDbG9jayAvIDEwMDAwMDBVKSk7CisgIHdoaWxlICgoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkgJiYgKHdhaXRfbG9vcF9pbmRleCAhPSAwVSkpCisgIHsKKyAgICB3YWl0X2xvb3BfaW5kZXgtLTsKKyAgfQorICBpZiAoSEFMX0lTX0JJVF9TRVQoUFdSLT5TUjIsIFBXUl9TUjJfUkVHTFBGKSkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEBicmllZiBFbnRlciBTdG9wIDAgbW9kZS4KKyAgKiBAbm90ZSAgSW4gU3RvcCAwIG1vZGUsIG1haW4gYW5kIGxvdyB2b2x0YWdlIHJlZ3VsYXRvcnMgYXJlIE9OLgorICAqIEBub3RlICBJbiBTdG9wIDAgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgICogQG5vdGUgIEFsbCBjbG9ja3MgaW4gdGhlIFZDT1JFIGRvbWFpbiBhcmUgc3RvcHBlZDsgdGhlIFBMTCwgdGhlIE1TSSwgCisgICogICAgICAgIHRoZSBIU0kgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBTb21lIHBlcmlwaGVyYWxzIHdpdGggdGhlIHdha2V1cCBjYXBhYmlsaXR5IAorICAqICAgICAgICAoSTJDeCwgVVNBUlR4IGFuZCBMUFVBUlQpIGNhbiBzd2l0Y2ggb24gdGhlIEhTSSB0byByZWNlaXZlIGEgZnJhbWUsIGFuZCBzd2l0Y2ggb2ZmIHRoZSBIU0kgCisgICogICAgICAgIGFmdGVyIHJlY2VpdmluZyB0aGUgZnJhbWUgaWYgaXQgaXMgbm90IGEgd2FrZXVwIGZyYW1lLiBJbiB0aGlzIGNhc2UsIHRoZSBIU0kgY2xvY2sgaXMgcHJvcGFnYXRlZCAKKyAgKiAgICAgICAgb25seSB0byB0aGUgcGVyaXBoZXJhbCByZXF1ZXN0aW5nIGl0LgorICAqICAgICAgICBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuCisgICogICAgICAgIFRoZSBCT1IgaXMgYXZhaWxhYmxlLgorICAqIEBub3RlICBXaGVuIGV4aXRpbmcgU3RvcCAwIG1vZGUgYnkgaXNzdWluZyBhbiBpbnRlcnJ1cHQgb3IgYSB3YWtldXAgZXZlbnQsCisgICogICAgICAgICB0aGUgSFNJIFJDIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrIGlmIFNUT1BXVUNLIGJpdCBpbiBSQ0NfQ0ZHUiByZWdpc3RlcgorICAqICAgICAgICAgaXMgc2V0OyB0aGUgTVNJIG9zY2lsbGF0b3IgaXMgc2VsZWN0ZWQgaWYgU1RPUFdVQ0sgaXMgY2xlYXJlZC4gIAorICAqIEBub3RlICBCeSBrZWVwaW5nIHRoZSBpbnRlcm5hbCByZWd1bGF0b3IgT04gZHVyaW5nIFN0b3AgMCBtb2RlLCB0aGUgY29uc3VtcHRpb24KKyAgKiAgICAgICAgIGlzIGhpZ2hlciBhbHRob3VnaCB0aGUgc3RhcnR1cCB0aW1lIGlzIHJlZHVjZWQuCisgICogQG5vdGUgIEFjY29yZGluZyB0byBzeXN0ZW0gcG93ZXIgcG9saWN5LCBzeXN0ZW0gZW50ZXJpbmcgaW4gU3RvcCBtb2RlCisgICogICAgICAgIGlzIGRlcGVuZGluZyBvbiBvdGhlciBDUFUgcG93ZXIgbW9kZS4KKyAgKiBAcGFyYW0gU1RPUEVudHJ5ICBzcGVjaWZpZXMgaWYgU3RvcCBtb2RlIGluIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFIGluc3RydWN0aW9uLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NUT1BFTlRSWV9XRkkgIEVudGVyIFN0b3AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZFICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VudGVyU1RPUDBNb2RlKHVpbnQ4X3QgU1RPUEVudHJ5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1NUT1BfRU5UUlkoU1RPUEVudHJ5KSk7CisKKyAgLyogU3RvcCAwIG1vZGUgd2l0aCBNYWluIFJlZ3VsYXRvciAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9MT1dQT1dFUk1PREVfU1RPUDApOworCisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKyAgLyogU2VsZWN0IFN0b3AgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgICAgX19XRkkoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEV2ZW50ICovCisgICAgX19TRVYoKTsKKyAgICBfX1dGRSgpOworICAgIF9fV0ZFKCk7CisgIH0KKworICAvKiBSZXNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEVudGVyIFN0b3AgMSBtb2RlLgorICAqIEBub3RlICBJbiBTdG9wIDEgbW9kZSwgb25seSBsb3cgcG93ZXIgdm9sdGFnZSByZWd1bGF0b3IgaXMgT04uCisgICogQG5vdGUgIEluIFN0b3AgMSBtb2RlLCBhbGwgSS9PIHBpbnMga2VlcCB0aGUgc2FtZSBzdGF0ZSBhcyBpbiBSdW4gbW9kZS4KKyAgKiBAbm90ZSAgQWxsIGNsb2NrcyBpbiB0aGUgVkNPUkUgZG9tYWluIGFyZSBzdG9wcGVkOyB0aGUgUExMLCB0aGUgTVNJLCAKKyAgKiAgICAgICAgdGhlIEhTSSBhbmQgdGhlIEhTRSBvc2NpbGxhdG9ycyBhcmUgZGlzYWJsZWQuIFNvbWUgcGVyaXBoZXJhbHMgd2l0aCB0aGUgd2FrZXVwIGNhcGFiaWxpdHkgCisgICogICAgICAgIChJMkN4LCBVU0FSVHggYW5kIExQVUFSVCkgY2FuIHN3aXRjaCBvbiB0aGUgSFNJIHRvIHJlY2VpdmUgYSBmcmFtZSwgYW5kIHN3aXRjaCBvZmYgdGhlIEhTSSAKKyAgKiAgICAgICAgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBmcmFtZSBpZiBpdCBpcyBub3QgYSB3YWtldXAgZnJhbWUuIEluIHRoaXMgY2FzZSwgdGhlIEhTSSBjbG9jayBpcyBwcm9wYWdhdGVkIAorICAqICAgICAgICBvbmx5IHRvIHRoZSBwZXJpcGhlcmFsIHJlcXVlc3RpbmcgaXQuCisgICogICAgICAgIFNSQU0xLCBTUkFNMiBhbmQgcmVnaXN0ZXIgY29udGVudHMgYXJlIHByZXNlcnZlZC4KKyAgKiAgICAgICAgVGhlIEJPUiBpcyBhdmFpbGFibGUuCisgICogQG5vdGUgIFdoZW4gZXhpdGluZyBTdG9wIDEgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgaWYgU1RPUFdVQ0sgYml0IGluIFJDQ19DRkdSIHJlZ2lzdGVyCisgICogICAgICAgICBpcyBzZXQ7IHRoZSBNU0kgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBpZiBTVE9QV1VDSyBpcyBjbGVhcmVkLiAgCisgICogQG5vdGUgIER1ZSB0byBsb3cgcG93ZXIgbW9kZSwgYW4gYWRkaXRpb25hbCBzdGFydHVwIGRlbGF5IGlzIGluY3VycmVkIHdoZW4gd2FraW5nIHVwIGZyb20gU3RvcCAxIG1vZGUuCisgICogQG5vdGUgIEFjY29yZGluZyB0byBzeXN0ZW0gcG93ZXIgcG9saWN5LCBzeXN0ZW0gZW50ZXJpbmcgaW4gU3RvcCBtb2RlCisgICogICAgICAgIGlzIGRlcGVuZGluZyBvbiBvdGhlciBDUFUgcG93ZXIgbW9kZS4KKyAgKiBAcGFyYW0gU1RPUEVudHJ5ICBzcGVjaWZpZXMgaWYgU3RvcCBtb2RlIGluIGVudGVyZWQgd2l0aCBXRkkgb3IgV0ZFIGluc3RydWN0aW9uLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUFdSX1NUT1BFTlRSWV9XRkkgIEVudGVyIFN0b3AgbW9kZSB3aXRoIFdGSSBpbnN0cnVjdGlvbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZFICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkUgaW5zdHJ1Y3Rpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1BXUkV4X0VudGVyU1RPUDFNb2RlKHVpbnQ4X3QgU1RPUEVudHJ5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1NUT1BfRU5UUlkoU1RPUEVudHJ5KSk7CisgICAgCisgIC8qIFN0b3AgMSBtb2RlIHdpdGggTG93LVBvd2VyIFJlZ3VsYXRvciAqLworICBNT0RJRllfUkVHKFBXUi0+Q1IxLCBQV1JfQ1IxX0xQTVMsIFBXUl9MT1dQT1dFUk1PREVfU1RPUDEpOworCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisgIC8qIFNlbGVjdCBTdG9wIG1vZGUgZW50cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZihTVE9QRW50cnkgPT0gUFdSX1NUT1BFTlRSWV9XRkkpCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEludGVycnVwdCAqLworICAgIF9fV0ZJKCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVxdWVzdCBXYWl0IEZvciBFdmVudCAqLworICAgIF9fU0VWKCk7CisgICAgX19XRkUoKTsKKyAgICBfX1dGRSgpOworICB9CisKKyAgLyogUmVzZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiBFbnRlciBTdG9wIDIgbW9kZS4KKyAgKiBAbm90ZSAgSW4gU3RvcCAyIG1vZGUsIG9ubHkgbG93IHBvd2VyIHZvbHRhZ2UgcmVndWxhdG9yIGlzIE9OLgorICAqIEBub3RlICBJbiBTdG9wIDIgbW9kZSwgYWxsIEkvTyBwaW5zIGtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgaW4gUnVuIG1vZGUuCisgICogQG5vdGUgIEFsbCBjbG9ja3MgaW4gdGhlIFZDT1JFIGRvbWFpbiBhcmUgc3RvcHBlZCwgdGhlIFBMTCwgdGhlIE1TSSwgCisgICogICAgICAgIHRoZSBIU0kgYW5kIHRoZSBIU0Ugb3NjaWxsYXRvcnMgYXJlIGRpc2FibGVkLiBTb21lIHBlcmlwaGVyYWxzIHdpdGggd2FrZXVwIGNhcGFiaWxpdHkgCisgICogICAgICAgIChMQ0QsIExQVElNMSwgSTJDMyBhbmQgTFBVQVJUKSBjYW4gc3dpdGNoIG9uIHRoZSBIU0kgdG8gcmVjZWl2ZSBhIGZyYW1lLCBhbmQgc3dpdGNoIG9mZiB0aGUgSFNJIGFmdGVyIAorICAqICAgICAgICByZWNlaXZpbmcgdGhlIGZyYW1lIGlmIGl0IGlzIG5vdCBhIHdha2V1cCBmcmFtZS4gSW4gdGhpcyBjYXNlIHRoZSBIU0kgY2xvY2sgaXMgcHJvcGFnYXRlZCBvbmx5IAorICAqICAgICAgICB0byB0aGUgcGVyaXBoZXJhbCByZXF1ZXN0aW5nIGl0LgorICAqICAgICAgICBTUkFNMSwgU1JBTTIgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuCisgICogICAgICAgIFRoZSBCT1IgaXMgYXZhaWxhYmxlLiAgIAorICAqICAgICAgICBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgc2V0IGluIGxvdy1wb3dlciBtb2RlIGJ1dCBMUFIgYml0IG11c3QgYmUgY2xlYXJlZCB0byBlbnRlciBzdG9wIDIgbW9kZS4KKyAgKiAgICAgICAgT3RoZXJ3aXNlLCBTdG9wIDEgbW9kZSBpcyBlbnRlcmVkLiAgCisgICogQG5vdGUgIFdoZW4gZXhpdGluZyBTdG9wIDIgbW9kZSBieSBpc3N1aW5nIGFuIGludGVycnVwdCBvciBhIHdha2V1cCBldmVudCwKKyAgKiAgICAgICAgIHRoZSBIU0kgUkMgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgaWYgU1RPUFdVQ0sgYml0IGluIFJDQ19DRkdSIHJlZ2lzdGVyCisgICogICAgICAgICBpcyBzZXQ7IHRoZSBNU0kgb3NjaWxsYXRvciBpcyBzZWxlY3RlZCBpZiBTVE9QV1VDSyBpcyBjbGVhcmVkLgorICAqIEBub3RlICBBY2NvcmRpbmcgdG8gc3lzdGVtIHBvd2VyIHBvbGljeSwgc3lzdGVtIGVudGVyaW5nIGluIFN0b3AgbW9kZQorICAqICAgICAgICBpcyBkZXBlbmRpbmcgb24gb3RoZXIgQ1BVIHBvd2VyIG1vZGUuCisgICogQHBhcmFtIFNUT1BFbnRyeSAgc3BlY2lmaWVzIGlmIFN0b3AgbW9kZSBpbiBlbnRlcmVkIHdpdGggV0ZJIG9yIFdGRSBpbnN0cnVjdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFBXUl9TVE9QRU5UUllfV0ZJICBFbnRlciBTdG9wIG1vZGUgd2l0aCBXRkkgaW5zdHJ1Y3Rpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBQV1JfU1RPUEVOVFJZX1dGRSAgRW50ZXIgU3RvcCBtb2RlIHdpdGggV0ZFIGluc3RydWN0aW9uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9QV1JFeF9FbnRlclNUT1AyTW9kZSh1aW50OF90IFNUT1BFbnRyeSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUFdSX1NUT1BfRU5UUlkoU1RPUEVudHJ5KSk7CisKKyAgLyogU2V0IFN0b3AgbW9kZSAyICovCisgIE1PRElGWV9SRUcoUFdSLT5DUjEsIFBXUl9DUjFfTFBNUywgUFdSX0xPV1BPV0VSTU9ERV9TVE9QMik7CisKKyAgLyogU2V0IFNMRUVQREVFUCBiaXQgb2YgQ29ydGV4IFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICovCisgIFNFVF9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7CisKKyAgLyogU2VsZWN0IFN0b3AgbW9kZSBlbnRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmKFNUT1BFbnRyeSA9PSBQV1JfU1RPUEVOVFJZX1dGSSkKKyAgeworICAgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgICAgX19XRkkoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXF1ZXN0IFdhaXQgRm9yIEV2ZW50ICovCisgICAgX19TRVYoKTsKKyAgICBfX1dGRSgpOworICAgIF9fV0ZFKCk7CisgIH0KKworICAvKiBSZXNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBDTEVBUl9CSVQoU0NCLT5TQ1IsICgodWludDMyX3QpU0NCX1NDUl9TTEVFUERFRVBfTXNrKSk7Cit9CisKKworCisKKworLyoqCisgICogQGJyaWVmIEVudGVyIFNodXRkb3duIG1vZGUuIAorICAqIEBub3RlICBJbiBTaHV0ZG93biBtb2RlLCB0aGUgUExMLCB0aGUgSFNJLCB0aGUgTVNJLCB0aGUgTFNJIGFuZCB0aGUgSFNFIG9zY2lsbGF0b3JzIGFyZSBzd2l0Y2hlZCAKKyAgKiAgICAgICAgb2ZmLiBUaGUgdm9sdGFnZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQgYW5kIFZjb3JlIGRvbWFpbiBpcyBwb3dlcmVkIG9mZi4gCisgICogICAgICAgIFNSQU0xLCBTUkFNMiwgQktSQU0gYW5kIHJlZ2lzdGVycyBjb250ZW50cyBhcmUgbG9zdCBleGNlcHQgZm9yIHJlZ2lzdGVycyBpbiB0aGUgQmFja3VwIGRvbWFpbi4KKyAgKiAgICAgICAgVGhlIEJPUiBpcyBub3QgYXZhaWxhYmxlLiAgCisgICogQG5vdGUgIFRoZSBJL09zIGNhbiBiZSBjb25maWd1cmVkIGVpdGhlciB3aXRoIGEgcHVsbC11cCBvciBwdWxsLWRvd24gb3IgY2FuIGJlIGtlcHQgaW4gYW5hbG9nIHN0YXRlLgorICAqIEBub3RlICBBY2NvcmRpbmcgdG8gc3lzdGVtIHBvd2VyIHBvbGljeSwgc3lzdGVtIGVudGVyaW5nIGluIFNodXRkb3duIG1vZGUKKyAgKiAgICAgICAgaXMgZGVwZW5kaW5nIG9uIG90aGVyIENQVSBwb3dlciBtb2RlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfRW50ZXJTSFVURE9XTk1vZGUodm9pZCkKK3sKKyAgLyogU2V0IFNodXRkb3duIG1vZGUgKi8KKyAgTU9ESUZZX1JFRyhQV1ItPkNSMSwgUFdSX0NSMV9MUE1TLCBQV1JfTE9XUE9XRVJNT0RFX1NIVVRET1dOKTsKKyAgCisgIC8qIFNldCBTTEVFUERFRVAgYml0IG9mIENvcnRleCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworICBTRVRfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworCisvKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHN0b3JlIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCAqLworI2lmIGRlZmluZWQgKCBfX0NDX0FSTSkKKyAgX19mb3JjZV9zdG9yZXMoKTsKKyNlbmRpZgorCisgIC8qIFJlcXVlc3QgV2FpdCBGb3IgSW50ZXJydXB0ICovCisgIF9fV0ZJKCk7CisKKyAgLyogRm9sbG93aW5nIGNvZGUgaXMgZXhlY3V0ZWQgYWZ0ZXIgd2FrZSB1cCBpZiBzeXN0ZW0gZGlkbid0IGdvIHRvIFNIVVRET1dOCisgICAqIG9yIFNUQU5EQlkgbW9kZSBhY2NvcmRpbmcgdG8gcG93ZXIgcG9saWN5ICovCisKKyAgLyogUmVzZXQgU0xFRVBERUVQIGJpdCBvZiBDb3J0ZXggU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKFNDQi0+U0NSLCAoKHVpbnQzMl90KVNDQl9TQ1JfU0xFRVBERUVQX01zaykpOworfQorCisKKy8qKgorICAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFBXUiBQVkQvUFZNeCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIHRoZSBQVkRfUFZNX0lSUUhhbmRsZXIoKS4gIAorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUFdSRXhfUFZEX1BWTV9JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFBXUiBleHRpIGZsYWcgKi8KKyAgaWYoX19IQUxfUFdSX1BWRF9FWFRJX0dFVF9GTEFHKCkgIT0gMFUpCisgIHsKKyAgICAvKiBQV1IgUFZEIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUl9QVkRDYWxsYmFjaygpOworCisgICAgLyogQ2xlYXIgUFZEIGV4dGkgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9QV1JfUFZEX0VYVElfQ0xFQVJfRkxBRygpOworICB9CisKKworICAvKiBOZXh0LCBzdWNjZXNzaXZlbHkgY2hlY2sgUFZNeCBleHRpIGZsYWdzICovCisgIGlmKF9fSEFMX1BXUl9QVk0xX0VYVElfR0VUX0ZMQUcoKSAhPSAwVSkgCisgIHsKKyAgICAvKiBQV1IgUFZNMSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9QV1JFeF9QVk0xQ2FsbGJhY2soKTsKKyAgIAorICAgIC8qIENsZWFyIFBWTTEgZXh0aSBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1BXUl9QVk0xX0VYVElfQ0xFQVJfRkxBRygpOworICB9CisKKyAgaWYoX19IQUxfUFdSX1BWTTNfRVhUSV9HRVRfRkxBRygpICE9IDBVKSAKKyAgeworICAgIC8qIFBXUiBQVk0zIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1BXUkV4X1BWTTNDYWxsYmFjaygpOworICAgCisgICAgLyogQ2xlYXIgUFZNMyBleHRpIHBlbmRpbmcgYml0ICovCisgICAgX19IQUxfUFdSX1BWTTNfRVhUSV9DTEVBUl9GTEFHKCk7CisgIH0KK30KKworCisvKioKKyAgKiBAYnJpZWYgUFdSIFBWTTEgaW50ZXJydXB0IGNhbGxiYWNrCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUFdSRXhfUFZNMUNhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIEhBTF9QV1JFeF9QVk0xQ2FsbGJhY2soKSBBUEkgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBQV1IgUFZNMyBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9QV1JFeF9QVk0zQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgSEFMX1BXUkV4X1BWTTNDYWxsYmFjaygpIEFQSSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1BXUl9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3FzcGkuYyBiL1NyYy9zdG0zMndieHhfaGFsX3FzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTEwOGMzCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfcXNwaS5jCkBAIC0wLDAgKzEsMjczOCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcXNwaS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBRU1BJIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFF1YWRTUEkgaW50ZXJmYWNlIChRU1BJKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSW5kaXJlY3QgZnVuY3Rpb25hbCBtb2RlIG1hbmFnZW1lbnQKKyAgKiAgICAgICAgICAgKyBNZW1vcnktbWFwcGVkIGZ1bmN0aW9uYWwgbW9kZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgICsgQXV0by1wb2xsaW5nIGZ1bmN0aW9uYWwgbW9kZSBtYW5hZ2VtZW50CisgICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudAorICAqICAgICAgICAgICArIERNQSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZm9yIGluZGlyZWN0IGZ1bmN0aW9uYWwgbW9kZQorICAqICAgICAgICAgICArIEVycm9ycyBtYW5hZ2VtZW50IGFuZCBhYm9ydCBmdW5jdGlvbmFsaXR5CisgICoKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKioqIEluaXRpYWxpemF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoIykgQXMgcHJlcmVxdWlzaXRlLCBmaWxsIGluIHRoZSBIQUxfUVNQSV9Nc3BJbml0KCkgOgorICAgICAgICAoKyspIEVuYWJsZSBRdWFkU1BJIGNsb2NrIGludGVyZmFjZSB3aXRoIF9fSEFMX1JDQ19RVUFEU1BJX0NMS19FTkFCTEUoKS4KKyAgICAgICAgKCsrKSBSZXNldCBRdWFkU1BJIFBlcmlwaGVyYWwgd2l0aCBfX0hBTF9SQ0NfUVVBRFNQSV9GT1JDRV9SRVNFVCgpIGFuZCBfX0hBTF9SQ0NfUVVBRFNQSV9SRUxFQVNFX1JFU0VUKCkuCisgICAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9ja3MgZm9yIHRoZSBRdWFkU1BJIEdQSU9TIHdpdGggX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4KKyAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlc2UgUXVhZFNQSSBwaW5zIGluIGFsdGVybmF0ZSBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KKyAgICAgICAgKCsrKSBJZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCBlbmFibGUgYW5kIGNvbmZpZ3VyZSBRdWFkU1BJIGdsb2JhbAorICAgICAgICAgICAgaW50ZXJydXB0IHdpdGggSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkuCisgICAgICAgICgrKykgSWYgRE1BIG1vZGUgaXMgdXNlZCwgZW5hYmxlIHRoZSBjbG9ja3MgZm9yIHRoZSBRdWFkU1BJIERNQSBjaGFubmVsCisgICAgICAgICAgICB3aXRoIF9fSEFMX1JDQ19ETUF4X0NMS19FTkFCTEUoKSwgY29uZmlndXJlIERNQSB3aXRoIEhBTF9ETUFfSW5pdCgpLAorICAgICAgICAgICAgbGluayBpdCB3aXRoIFF1YWRTUEkgaGFuZGxlIHVzaW5nIF9fSEFMX0xJTktETUEoKSwgZW5hYmxlIGFuZCBjb25maWd1cmUKKyAgICAgICAgICAgIERNQSBjaGFubmVsIGdsb2JhbCBpbnRlcnJ1cHQgd2l0aCBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGFuZCBIQUxfTlZJQ19FbmFibGVJUlEoKS4KKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGZsYXNoIHNpemUsIHRoZSBjbG9jayBwcmVzY2FsZXIsIHRoZSBmaWZvIHRocmVzaG9sZCwgdGhlCisgICAgICAgICAgY2xvY2sgbW9kZSwgdGhlIHNhbXBsZSBzaGlmdGluZyBhbmQgdGhlIENTIGhpZ2ggdGltZSB1c2luZyB0aGUgSEFMX1FTUElfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgKioqIEluZGlyZWN0IGZ1bmN0aW9uYWwgbW9kZSAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgdXNpbmcgdGhlIEhBTF9RU1BJX0NvbW1hbmQoKSBvciBIQUxfUVNQSV9Db21tYW5kX0lUKCkKKyAgICAgICAgICBmdW5jdGlvbnMgOgorICAgICAgICAgKCsrKSBJbnN0cnVjdGlvbiBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KKyAgICAgICAgICgrKykgQWRkcmVzcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhZGRyZXNzIHZhbHVlLgorICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlCisgICAgICAgICAgICAgYnl0ZXMgdmFsdWVzLgorICAgICAgICAgKCsrKSBEdW1teS1jeWNsZXMgcGhhc2UgOiB0aGUgbnVtYmVyIG9mIGR1bW15IGN5Y2xlcyAobW9kZSB1c2VkIGlzIHNhbWUgYXMgZGF0YSBwaGFzZSkuCisgICAgICAgICAoKyspIERhdGEgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBudW1iZXIgb2YgYnl0ZXMuCisgICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5CisgICAgICAgICAgICAgaWYgYWN0aXZhdGVkLgorICAgICAgICAgKCsrKSBTZW5kaW5nIEluc3RydWN0aW9uIE9ubHkgT25jZSAoU0lPTykgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZS4KKyAgICAgICgjKSBJZiBubyBkYXRhIGlzIHJlcXVpcmVkIGZvciB0aGUgY29tbWFuZCwgaXQgaXMgc2VudCBkaXJlY3RseSB0byB0aGUgbWVtb3J5IDoKKyAgICAgICAgICgrKykgSW4gcG9sbGluZyBtb2RlLCB0aGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBpcyBkb25lIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisgICAgICAoIykgRm9yIHRoZSBpbmRpcmVjdCB3cml0ZSBtb2RlLCB1c2UgSEFMX1FTUElfVHJhbnNtaXQoKSwgSEFMX1FTUElfVHJhbnNtaXRfRE1BKCkgb3IKKyAgICAgICAgICBIQUxfUVNQSV9UcmFuc21pdF9JVCgpIGFmdGVyIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gOgorICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisgICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZAorICAgICAgICAgICAgIGlzIHJlYWNoZWQgYW5kIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisgICAgICAgICAoKyspIEluIERNQSBtb2RlLCBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgaGFsZiB0cmFuc2ZlciBhbmQKKyAgICAgICAgICAgICBIQUxfUVNQSV9UeENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorICAgICAgKCMpIEZvciB0aGUgaW5kaXJlY3QgcmVhZCBtb2RlLCB1c2UgSEFMX1FTUElfUmVjZWl2ZSgpLCBIQUxfUVNQSV9SZWNlaXZlX0RNQSgpIG9yCisgICAgICAgICAgSEFMX1FTUElfUmVjZWl2ZV9JVCgpIGFmdGVyIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gOgorICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisgICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZAorICAgICAgICAgICAgIGlzIHJlYWNoZWQgYW5kIEhBTF9RU1BJX1J4Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisgICAgICAgICAoKyspIEluIERNQSBtb2RlLCBIQUxfUVNQSV9SeEhhbGZDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgaGFsZiB0cmFuc2ZlciBhbmQKKyAgICAgICAgICAgICBIQUxfUVNQSV9SeENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorCisgICAgKioqIEF1dG8tcG9sbGluZyBmdW5jdGlvbmFsIG1vZGUgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhbmQgdGhlIGF1dG8tcG9sbGluZyBmdW5jdGlvbmFsIG1vZGUgdXNpbmcgdGhlCisgICAgICAgICAgSEFMX1FTUElfQXV0b1BvbGxpbmcoKSBvciBIQUxfUVNQSV9BdXRvUG9sbGluZ19JVCgpIGZ1bmN0aW9ucyA6CisgICAgICAgICAoKyspIEluc3RydWN0aW9uIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICAgICAgICAgKCsrKSBBZGRyZXNzIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgc2l6ZSBhbmQgdGhlIGFkZHJlc3MgdmFsdWUuCisgICAgICAgICAoKyspIEFsdGVybmF0ZS1ieXRlcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhbHRlcm5hdGUKKyAgICAgICAgICAgICBieXRlcyB2YWx1ZXMuCisgICAgICAgICAoKyspIER1bW15LWN5Y2xlcyBwaGFzZSA6IHRoZSBudW1iZXIgb2YgZHVtbXkgY3ljbGVzIChtb2RlIHVzZWQgaXMgc2FtZSBhcyBkYXRhIHBoYXNlKS4KKyAgICAgICAgICgrKykgRGF0YSBwaGFzZSA6IHRoZSBtb2RlIHVzZWQuCisgICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5CisgICAgICAgICAgICAgaWYgYWN0aXZhdGVkLgorICAgICAgICAgKCsrKSBTZW5kaW5nIEluc3RydWN0aW9uIE9ubHkgT25jZSAoU0lPTykgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZS4KKyAgICAgICAgICgrKykgVGhlIHNpemUgb2YgdGhlIHN0YXR1cyBieXRlcywgdGhlIG1hdGNoIHZhbHVlLCB0aGUgbWFzayB1c2VkLCB0aGUgbWF0Y2ggbW9kZSAoT1IvQU5EKSwKKyAgICAgICAgICAgICB0aGUgcG9sbGluZyBpbnRlcnZhbCBhbmQgdGhlIGF1dG9tYXRpYyBzdG9wIGFjdGl2YXRpb24uCisgICAgICAoIykgQWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gOgorICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgc3RhdHVzIG1hdGNoIGlzIHJlYWNoZWQuIFRoZQorICAgICAgICAgICAgIGF1dG9tYXRpYyBzdG9wIGlzIGFjdGl2YXRlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wLgorICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfU3RhdHVzTWF0Y2hDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgc3RhdHVzIG1hdGNoIGlzIHJlYWNoZWQuCisKKyAgICAqKiogTWVtb3J5LW1hcHBlZCBmdW5jdGlvbmFsIG1vZGUgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgYW5kIHRoZSBtZW1vcnktbWFwcGVkIGZ1bmN0aW9uYWwgbW9kZSB1c2luZyB0aGUKKyAgICAgICAgICBIQUxfUVNQSV9NZW1vcnlNYXBwZWQoKSBmdW5jdGlvbnMgOgorICAgICAgICAgKCsrKSBJbnN0cnVjdGlvbiBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KKyAgICAgICAgICgrKykgQWRkcmVzcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIHRoZSBzaXplLgorICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlCisgICAgICAgICAgICAgYnl0ZXMgdmFsdWVzLgorICAgICAgICAgKCsrKSBEdW1teS1jeWNsZXMgcGhhc2UgOiB0aGUgbnVtYmVyIG9mIGR1bW15IGN5Y2xlcyAobW9kZSB1c2VkIGlzIHNhbWUgYXMgZGF0YSBwaGFzZSkuCisgICAgICAgICAoKyspIERhdGEgcGhhc2UgOiB0aGUgbW9kZSB1c2VkLgorICAgICAgICAgKCsrKSBEb3VibGUgRGF0YSBSYXRlIChERFIpIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUgYW5kIHRoZSBkZWxheQorICAgICAgICAgICAgIGlmIGFjdGl2YXRlZC4KKyAgICAgICAgICgrKykgU2VuZGluZyBJbnN0cnVjdGlvbiBPbmx5IE9uY2UgKFNJT08pIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUuCisgICAgICAgICAoKyspIFRoZSB0aW1lb3V0IGFjdGl2YXRpb24gYW5kIHRoZSB0aW1lb3V0IHBlcmlvZC4KKyAgICAgICgjKSBBZnRlciB0aGUgY29uZmlndXJhdGlvbiwgdGhlIFF1YWRTUEkgd2lsbCBiZSB1c2VkIGFzIHNvb24gYXMgYW4gYWNjZXNzIG9uIHRoZSBBSEIgaXMgZG9uZSBvbgorICAgICAgICAgIHRoZSBhZGRyZXNzIHJhbmdlLiBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMuCisKKyAgICAqKiogRXJyb3JzIG1hbmFnZW1lbnQgYW5kIGFib3J0IGZ1bmN0aW9uYWxpdHkgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBIQUxfUVNQSV9HZXRFcnJvcigpIGZ1bmN0aW9uIGdpdmVzIHRoZSBlcnJvciByYWlzZWQgZHVyaW5nIHRoZSBsYXN0IG9wZXJhdGlvbi4KKyAgICAgICgjKSBIQUxfUVNQSV9BYm9ydCgpIGFuZCBIQUxfUVNQSV9BYm9ydElUKCkgZnVuY3Rpb25zIGFib3J0cyBhbnkgb24tZ29pbmcgb3BlcmF0aW9uIGFuZAorICAgICAgICAgIGZsdXNoZXMgdGhlIGZpZm8gOgorICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIKKyAgICAgICAgICAgICAgY29tcGxldGUgYml0IGlzIHNldCBhbmQgdGhlIGJ1c3kgYml0IGNsZWFyZWQuCisgICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4KKyAgICAgICAgICAgICAgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGJpdCBpcyBzZXQuCisKKyAgICAqKiogQ29udHJvbCBmdW5jdGlvbnMgKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgjKSBIQUxfUVNQSV9HZXRTdGF0ZSgpIGZ1bmN0aW9uIGdpdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBIQUwgUXVhZFNQSSBkcml2ZXIuCisgICAgICAoIykgSEFMX1FTUElfU2V0VGltZW91dCgpIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHRpbWVvdXQgdmFsdWUgdXNlZCBpbiB0aGUgZHJpdmVyLgorICAgICAgKCMpIEhBTF9RU1BJX1NldEZpZm9UaHJlc2hvbGQoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSB0aHJlc2hvbGQgb24gdGhlIEZpZm8gb2YgdGhlIFFTUEkgSVAuCisgICAgICAoIykgSEFMX1FTUElfR2V0Rmlmb1RocmVzaG9sZCgpIGZ1bmN0aW9uIGdpdmVzIHRoZSBjdXJyZW50IG9mIHRoZSBGaWZvJ3MgdGhyZXNob2xkCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKworICAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9RU1BJX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIHVzZXIgY2FsbGJhY2ssCisgICAgICBpdCBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgOiBjYWxsYmFjayB3aGVuIGVycm9yIG9jY3Vycy4KKyAgICAgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhYm9ydCBpcyBjb21wbGV0ZWQuCisgICAgICAgICgrKSBGaWZvVGhyZXNob2xkQ2FsbGJhY2sgOiBjYWxsYmFjayB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZCBpcyByZWFjaGVkLgorICAgICAgICAoKykgQ21kQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhIGNvbW1hbmQgd2l0aG91dCBkYXRhIGlzIGNvbXBsZXRlZC4KKyAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhIHJlY2VwdGlvbiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuCisgICAgICAgICgrKSBUeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc21pc3Npb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBoYWxmIG9mIHRoZSByZWNlcHRpb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBoYWxmIG9mIHRoZSB0cmFuc21pc3Npb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgU3RhdHVzTWF0Y2hDYWxsYmFjayA6IGNhbGxiYWNrIHdoZW4gYSBzdGF0dXMgbWF0Y2ggb2NjdXJzLgorICAgICAgICAoKykgVGltZU91dENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiB0aGUgdGltZW91dCBwZXJpb2VkIGV4cGlyZXMuCisgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBRU1BJIE1zcEluaXQuCisgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBRU1BJIE1zcERlSW5pdC4KKyAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9RU1BJX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLiBJdCBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgOiBjYWxsYmFjayB3aGVuIGVycm9yIG9jY3Vycy4KKyAgICAgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhYm9ydCBpcyBjb21wbGV0ZWQuCisgICAgICAgICgrKSBGaWZvVGhyZXNob2xkQ2FsbGJhY2sgOiBjYWxsYmFjayB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZCBpcyByZWFjaGVkLgorICAgICAgICAoKykgQ21kQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhIGNvbW1hbmQgd2l0aG91dCBkYXRhIGlzIGNvbXBsZXRlZC4KKyAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBhIHJlY2VwdGlvbiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuCisgICAgICAgICgrKSBUeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIHdoZW4gYSB0cmFuc21pc3Npb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBoYWxmIG9mIHRoZSByZWNlcHRpb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiBoYWxmIG9mIHRoZSB0cmFuc21pc3Npb24gdHJhbnNmZXIgaXMgY29tcGxldGVkLgorICAgICAgICAoKykgU3RhdHVzTWF0Y2hDYWxsYmFjayA6IGNhbGxiYWNrIHdoZW4gYSBzdGF0dXMgbWF0Y2ggb2NjdXJzLgorICAgICAgICAoKykgVGltZU91dENhbGxiYWNrIDogY2FsbGJhY2sgd2hlbiB0aGUgdGltZW91dCBwZXJpb2VkIGV4cGlyZXMuCisgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBRU1BJIE1zcEluaXQuCisgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBRU1BJIE1zcERlSW5pdC4KKyAgICAgIFRoaXMgZnVuY3Rpb24pIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgorCisgICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfUVNQSV9Jbml0IGFuZCBpZiB0aGUgc3RhdGUgaXMgSEFMX1FTUElfU1RBVEVfUkVTRVQKKyAgICAgIGFsbCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMuCisgICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKKyAgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9RU1BJX0luaXQKKyAgICAgIGFuZCBAcmVmICBIQUxfUVNQSV9EZUluaXQgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1FTUElfSW5pdCBhbmQgQHJlZiBIQUxfUVNQSV9EZUluaXQKKyAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKKworICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgorICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCisgICAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgorICAgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICAgdXNpbmcgQHJlZiBIQUxfUVNQSV9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1FTUElfRGVJbml0CisgICAgICBvciBAcmVmIEhBTF9RU1BJX0luaXQgZnVuY3Rpb24uCisKKyAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworICAgICoqKiBXb3JrYXJvdW5kcyBsaW5rZWQgdG8gU2lsaWNvbiBMaW1pdGF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoIykgV29ya2Fyb3VuZHMgSW1wbGVtZW50ZWQgaW5zaWRlIEhBTCBEcml2ZXIKKyAgICAgICAgICgrKykgRXh0cmEgZGF0YSB3cml0dGVuIGluIHRoZSBGSUZPIGF0IHRoZSBlbmQgb2YgYSByZWFkIHRyYW5zZmVyCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisjaWYgZGVmaW5lZChRVUFEU1BJKSB8fCBkZWZpbmVkKFFVQURTUEkxKSB8fCBkZWZpbmVkKFFVQURTUEkyKQorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFFTUEkgUVNQSQorICAqIEBicmllZiBRU1BJIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfUVNQSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFFTUEkgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITxJbmRpcmVjdCB3cml0ZSBtb2RlKi8KKyNkZWZpbmUgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9GTU9ERV8wKSAvKiE8SW5kaXJlY3QgcmVhZCBtb2RlKi8KKyNkZWZpbmUgUVNQSV9GVU5DVElPTkFMX01PREVfQVVUT19QT0xMSU5HICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9GTU9ERV8xKSAvKiE8QXV0b21hdGljIHBvbGxpbmcgbW9kZSovCisjZGVmaW5lIFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfRk1PREUpICAgLyohPE1lbW9yeS1tYXBwZWQgbW9kZSovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfTWFjcm9zIFFTUEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19RU1BJX0ZVTkNUSU9OQUxfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9SRUFEKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9BVVRPX1BPTExJTkcpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBRU1BJX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgUVNQSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFFTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgUVNQSV9ETUFBYm9ydENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXRlLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIHZvaWQgUVNQSV9Db25maWcoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kLCB1aW50MzJfdCBGdW5jdGlvbmFsTW9kZSk7CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9GdW5jdGlvbnMgUVNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgUXVhZFNQSS4KKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBRdWFkU1BJLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUVNQSSBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgaW4gdGhlIFFTUElfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9Jbml0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayB0aGUgUVNQSSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihocXNwaSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19RVUFEU1BJX0FMTF9JTlNUQU5DRShocXNwaS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQ0xPQ0tfUFJFU0NBTEVSKGhxc3BpLT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX0ZJRk9fVEhSRVNIT0xEKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU1NISUZUKGhxc3BpLT5Jbml0LlNhbXBsZVNoaWZ0aW5nKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX0ZMQVNIX1NJWkUoaHFzcGktPkluaXQuRmxhc2hTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX0NTX0hJR0hfVElNRShocXNwaS0+SW5pdC5DaGlwU2VsZWN0SGlnaFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQ0xPQ0tfTU9ERShocXNwaS0+SW5pdC5DbG9ja01vZGUpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhxc3BpKTsKKworICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHFzcGktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IENhbGxiYWNrIHBvaW50ZXJzIGluIEhBTF9RU1BJX1NUQVRFX1JFU0VUIG9ubHkgKi8KKyAgICBocXNwaS0+RXJyb3JDYWxsYmFjayAgICAgICAgID0gSEFMX1FTUElfRXJyb3JDYWxsYmFjazsKKyAgICBocXNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1FTUElfQWJvcnRDcGx0Q2FsbGJhY2s7CisgICAgaHFzcGktPkZpZm9UaHJlc2hvbGRDYWxsYmFjayA9IEhBTF9RU1BJX0ZpZm9UaHJlc2hvbGRDYWxsYmFjazsKKyAgICBocXNwaS0+Q21kQ3BsdENhbGxiYWNrICAgICAgID0gSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrOworICAgIGhxc3BpLT5SeENwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfUVNQSV9SeENwbHRDYWxsYmFjazsKKyAgICBocXNwaS0+VHhDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX1FTUElfVHhDcGx0Q2FsbGJhY2s7CisgICAgaHFzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayAgICA9IEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjazsKKyAgICBocXNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrICAgID0gSEFMX1FTUElfVHhIYWxmQ3BsdENhbGxiYWNrOworICAgIGhxc3BpLT5TdGF0dXNNYXRjaENhbGxiYWNrICAgPSBIQUxfUVNQSV9TdGF0dXNNYXRjaENhbGxiYWNrOworICAgIGhxc3BpLT5UaW1lT3V0Q2FsbGJhY2sgICAgICAgPSBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2s7CisKKyAgICBpZihocXNwaS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHFzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9RU1BJX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHFzcGktPk1zcEluaXRDYWxsYmFjayhocXNwaSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1FTUElfTXNwSW5pdChocXNwaSk7CisjZW5kaWYKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgZGVmYXVsdCB0aW1lb3V0IGZvciB0aGUgUVNQSSBtZW1vcnkgYWNjZXNzICovCisgICAgSEFMX1FTUElfU2V0VGltZW91dChocXNwaSwgSEFMX1FQU0lfVElNRU9VVF9ERUZBVUxUX1ZBTFVFKTsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBRU1BJIEZJRk8gVGhyZXNob2xkICovCisgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMsCisgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkIC0gMVUpIDw8IFFVQURTUElfQ1JfRlRIUkVTX1BvcykpOworCisgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KKyAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOworCisgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDb25maWd1cmUgUVNQSSBDbG9jayBQcmVzY2FsZXIgYW5kIFNhbXBsZSBTaGlmdCAqLworICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgKFFVQURTUElfQ1JfUFJFU0NBTEVSIHwgUVVBRFNQSV9DUl9TU0hJRlQpLAorICAgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5DbG9ja1ByZXNjYWxlciA8PCBRVUFEU1BJX0NSX1BSRVNDQUxFUl9Qb3MpIHwKKyAgICAgICAgICAgICAgICBocXNwaS0+SW5pdC5TYW1wbGVTaGlmdGluZykpOworCisgICAgLyogQ29uZmlndXJlIFFTUEkgRmxhc2ggU2l6ZSwgQ1MgSGlnaCBUaW1lIGFuZCBDbG9jayBNb2RlICovCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRDUiwgKFFVQURTUElfRENSX0ZTSVpFIHwgUVVBRFNQSV9EQ1JfQ1NIVCB8IFFVQURTUElfRENSX0NLTU9ERSksCisgICAgICAgICAgICAgICAoKGhxc3BpLT5Jbml0LkZsYXNoU2l6ZSA8PCBRVUFEU1BJX0RDUl9GU0laRV9Qb3MpIHwKKyAgICAgICAgICAgICAgICBocXNwaS0+SW5pdC5DaGlwU2VsZWN0SGlnaFRpbWUgfCBocXNwaS0+SW5pdC5DbG9ja01vZGUpKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfUVNQSV9FTkFCTEUoaHFzcGkpOworCisgICAgLyogU2V0IFFTUEkgZXJyb3IgY29kZSB0byBub25lICovCisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBRU1BJIHN0YXRlICovCisgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBEZS1Jbml0aWFsaXplIHRoZSBRU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0RlSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQoreworICAvKiBDaGVjayB0aGUgUVNQSSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZihocXNwaSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIC8qIERpc2FibGUgdGhlIFFTUEkgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9RU1BJX0RJU0FCTEUoaHFzcGkpOworCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYoaHFzcGktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBocXNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUVNQSV9Nc3BEZUluaXQ7CisgIH0KKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBocXNwaS0+TXNwRGVJbml0Q2FsbGJhY2soaHFzcGkpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgIEhBTF9RU1BJX01zcERlSW5pdChocXNwaSk7CisjZW5kaWYKKworICAvKiBTZXQgUVNQSSBlcnJvciBjb2RlIHRvIG5vbmUgKi8KKyAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgUVNQSSBzdGF0ZSAqLworICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUVNQSSBNU1AuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9RU1BJX01zcEluaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHFzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBRU1BJIE1TUC4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfTXNwRGVJbml0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1FTUElfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIFFTUEkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgorICAgICAgKCspIEhhbmRsZSB0aGUgaW50ZXJydXB0cy4KKyAgICAgICgrKSBIYW5kbGUgdGhlIGNvbW1hbmQgc2VxdWVuY2UuCisgICAgICAoKykgVHJhbnNtaXQgZGF0YSBpbiBibG9ja2luZywgaW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAgICAgKCspIFJlY2VpdmUgZGF0YSBpbiBibG9ja2luZywgaW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAgICAgKCspIE1hbmFnZSB0aGUgYXV0by1wb2xsaW5nIGZ1bmN0aW9uYWwgbW9kZS4KKyAgICAgICgrKSBNYW5hZ2UgdGhlIG1lbW9yeS1tYXBwZWQgZnVuY3Rpb25hbCBtb2RlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIFFTUEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1FTUElfSVJRSGFuZGxlcihRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQoreworICBfX0lPIHVpbnQzMl90ICpkYXRhX3JlZzsKKyAgdWludDMyX3QgZmxhZyA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+U1IpOworICB1aW50MzJfdCBpdHNvdXJjZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IpOworCisgIC8qIFFTUEkgRmlmbyBUaHJlc2hvbGQgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfRlQpICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9GVCkgIT0gMFUpKQorICB7CisgICAgZGF0YV9yZWcgPSAmaHFzcGktPkluc3RhbmNlLT5EUjsKKworICAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYKQorICAgIHsKKyAgICAgIC8qIFRyYW5zbWlzc2lvbiBwcm9jZXNzICovCisgICAgICB3aGlsZShfX0hBTF9RU1BJX0dFVF9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfRlQpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBpZiAoaHFzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGaWxsIHRoZSBGSUZPIHVudGlsIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCAqLworICAgICAgICAgICooKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnKSA9ICpocXNwaS0+cFR4QnVmZlB0cjsKKyAgICAgICAgICBocXNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vIG1vcmUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSB0cmFuc2ZlciAqLworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFFTUEkgRklGTyBUaHJlc2hvbGQgSW50ZXJydXB0ICovCisgICAgICAgICAgX19IQUxfUVNQSV9ESVNBQkxFX0lUKGhxc3BpLCBRU1BJX0lUX0ZUKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1JYKQorICAgIHsKKyAgICAgIC8qIFJlY2VpdmluZyBQcm9jZXNzICovCisgICAgICB3aGlsZShfX0hBTF9RU1BJX0dFVF9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfRlQpICE9IFJFU0VUKQorICAgICAgeworICAgICAgICBpZiAoaHFzcGktPlJ4WGZlckNvdW50ID4gMFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZWFkIHRoZSBGSUZPIHVudGlsIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCAqLworICAgICAgICAgICpocXNwaS0+cFJ4QnVmZlB0ciA9ICooKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnKTsKKyAgICAgICAgICBocXNwaS0+cFJ4QnVmZlB0cisrOworICAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIEFsbCBkYXRhIGhhdmUgYmVlbiByZWNlaXZlZCBmb3IgdGhlIHRyYW5zZmVyICovCisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgUVNQSSBGSUZPIFRocmVzaG9sZCBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBfX0hBTF9RU1BJX0RJU0FCTEVfSVQoaHFzcGksIFFTUElfSVRfRlQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisgICAgLyogRklGTyBUaHJlc2hvbGQgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhxc3BpLT5GaWZvVGhyZXNob2xkQ2FsbGJhY2soaHFzcGkpOworI2Vsc2UKKyAgICBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soaHFzcGkpOworI2VuZGlmCisgIH0KKworICAvKiBRU1BJIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfVEMpICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9UQykgIT0gMFUpKQorICB7CisgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCisgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfVEMpOworCisgICAgLyogRGlzYWJsZSB0aGUgUVNQSSBGSUZPIFRocmVzaG9sZCwgVHJhbnNmZXIgRXJyb3IgYW5kIFRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdHMgKi8KKyAgICBfX0hBTF9RU1BJX0RJU0FCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMgfCBRU1BJX0lUX1RFIHwgUVNQSV9JVF9GVCk7CisKKyAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYKQorICAgIHsKKyAgICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLworICAgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgICAgX19IQUxfRE1BX0RJU0FCTEUoaHFzcGktPmhkbWEpOworICAgICAgfQorCisKKyAgICAgIC8qIENoYW5nZSBzdGF0ZSBvZiBRU1BJICovCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKworICAgICAgLyogVFggQ29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHFzcGktPlR4Q3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICBIQUxfUVNQSV9UeENwbHRDYWxsYmFjayhocXNwaSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWCkKKyAgICB7CisgICAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IGNsZWFyaW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhxc3BpLT5oZG1hKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGF0YV9yZWcgPSAmaHFzcGktPkluc3RhbmNlLT5EUjsKKyAgICAgICAgd2hpbGUoUkVBRF9CSVQoaHFzcGktPkluc3RhbmNlLT5TUiwgUVVBRFNQSV9TUl9GTEVWRUwpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGhxc3BpLT5SeFhmZXJDb3VudCA+IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIGxhc3QgZGF0YSByZWNlaXZlZCBpbiB0aGUgRklGTyB1bnRpbCBpdCBpcyBlbXB0eSAqLworICAgICAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopZGF0YV9yZWcpOworICAgICAgICAgICAgaHFzcGktPnBSeEJ1ZmZQdHIrKzsKKyAgICAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogQWxsIGRhdGEgaGF2ZSBiZWVuIHJlY2VpdmVkIGZvciB0aGUgdHJhbnNmZXIgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIC8qIENoYW5nZSBzdGF0ZSBvZiBRU1BJICovCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKworICAgICAgLyogUlggQ29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHFzcGktPlJ4Q3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICBIQUxfUVNQSV9SeENwbHRDYWxsYmFjayhocXNwaSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWSkKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIENvbW1hbmQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHFzcGktPkNtZENwbHRDYWxsYmFjayhocXNwaSk7CisjZWxzZQorICAgICAgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9BQk9SVCkKKyAgICB7CisgICAgICAvKiBSZXNldCBmdW5jdGlvbmFsIG1vZGUgY29uZmlndXJhdGlvbiB0byBpbmRpcmVjdCB3cml0ZSBtb2RlIGJ5IGRlZmF1bHQgKi8KKyAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUpOworCisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisKKyAgICAgIGlmIChocXNwaS0+RXJyb3JDb2RlID09IEhBTF9RU1BJX0VSUk9SX05PTkUpCisgICAgICB7CisgICAgICAgIC8qIEFib3J0IGNhbGxlZCBieSB0aGUgdXNlciAqLworCisgICAgICAgIC8qIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHFzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBBYm9ydCBkdWUgdG8gYW4gZXJyb3IgKGVnIDogIERNQSBlcnJvcikgKi8KKworICAgICAgICAvKiBFcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9RU1BJX0Vycm9yQ2FsbGJhY2soaHFzcGkpOworI2VuZGlmCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKworICAvKiBRU1BJIFN0YXR1cyBNYXRjaCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfU00pICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9TTSkgIT0gMFUpKQorICB7CisgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCisgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfU00pOworCisgICAgLyogQ2hlY2sgaWYgdGhlIGF1dG9tYXRpYyBwb2xsIG1vZGUgc3RvcCBpcyBhY3RpdmF0ZWQgKi8KKyAgICBpZihSRUFEX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0FQTVMpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFFTUEkgVHJhbnNmZXIgRXJyb3IgYW5kIFN0YXR1cyBNYXRjaCBJbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9RU1BJX0RJU0FCTEVfSVQoaHFzcGksIChRU1BJX0lUX1NNIHwgUVNQSV9JVF9URSkpOworCisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisgICAgfQorCisgICAgLyogU3RhdHVzIG1hdGNoIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBocXNwaS0+U3RhdHVzTWF0Y2hDYWxsYmFjayhocXNwaSk7CisjZWxzZQorICAgIEhBTF9RU1BJX1N0YXR1c01hdGNoQ2FsbGJhY2soaHFzcGkpOworI2VuZGlmCisgIH0KKworICAvKiBRU1BJIFRyYW5zZmVyIEVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfVEUpICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9URSkgIT0gMFUpKQorICB7CisgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCisgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfVEUpOworCisgICAgLyogRGlzYWJsZSBhbGwgdGhlIFFTUEkgSW50ZXJydXB0cyAqLworICAgIF9fSEFMX1FTUElfRElTQUJMRV9JVChocXNwaSwgUVNQSV9JVF9TTSB8IFFTUElfSVRfVEMgfCBRU1BJX0lUX1RFIHwgUVNQSV9JVF9GVCk7CisKKyAgICAvKiBTZXQgZXJyb3IgY29kZSAqLworICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfVFJBTlNGRVI7CisKKyAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLworICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gUVNQSV9ETUFBYm9ydENwbHQ7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChocXNwaS0+aGRtYSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9ETUE7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlIG9mIFFTUEkgKi8KKyAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisgICAgICAgIAorICAgICAgICAvKiBFcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICAgIEhBTF9RU1BJX0Vycm9yQ2FsbGJhY2soaHFzcGkpOworI2VuZGlmCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgICBIQUxfUVNQSV9FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8qIFFTUEkgVGltZW91dCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19UTykgIT0gMFUpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1RPKSAhPSAwVSkpCisgIHsKKyAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5GQ1IsIFFTUElfRkxBR19UTyk7CisKKyAgICAvKiBUaW1lb3V0IGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBocXNwaS0+VGltZU91dENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgSEFMX1FTUElfVGltZU91dENhbGxiYWNrKGhxc3BpKTsKKyNlbmRpZgorICB9CisKKyAgIGVsc2UKKyAgeworICAgLyogTm90aGluZyB0byBkbyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbi4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSBjbWQgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICogQHBhcmFtIFRpbWVvdXQgOiBUaW1lb3V0IGR1cmF0aW9uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBJbmRpcmVjdCBSZWFkIG9yIFdyaXRlIE1vZGVzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9Db21tYW5kKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoY21kLT5JbnN0cnVjdGlvbk1vZGUpKTsKKyAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OKGNtZC0+SW5zdHJ1Y3Rpb24pKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfTU9ERShjbWQtPkFkZHJlc3NNb2RlKSk7CisgIGlmIChjbWQtPkFkZHJlc3NNb2RlICE9IFFTUElfQUREUkVTU19OT05FKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUREUkVTU19TSVpFKGNtZC0+QWRkcmVzc1NpemUpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUpKTsKKyAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EVU1NWV9DWUNMRVMoY21kLT5EdW1teUN5Y2xlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EQVRBX01PREUoY21kLT5EYXRhTW9kZSkpOworCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9NT0RFKGNtZC0+RGRyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TSU9PX01PREUoY21kLT5TSU9PTW9kZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOworCisgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KKyAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZOworCisgICAgLyogV2FpdCB0aWxsIEJVU1kgZmxhZyByZXNldCAqLworICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX0JVU1ksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOworCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2FsbCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqLworICAgICAgUVNQSV9Db25maWcoaHFzcGksIGNtZCwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOworCisgICAgICBpZiAoY21kLT5EYXRhTW9kZSA9PSBRU1BJX0RBVEFfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgLyogV2hlbiB0aGVyZSBpcyBubyBkYXRhIHBoYXNlLCB0aGUgdHJhbnNmZXIgc3RhcnQgYXMgc29vbiBhcyB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lCisgICAgICAgIHNvIHdhaXQgdW50aWwgVEMgZmxhZyBpcyBzZXQgdG8gZ28gYmFjayBpbiBpZGxlIHN0YXRlICovCisgICAgICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX1RDLCBTRVQsIHRpY2tzdGFydCwgVGltZW91dCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UQyk7CisKKyAgICAgICAgICAvKiBVcGRhdGUgUVNQSSBzdGF0ZSAqLworICAgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCisgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSBjbWQgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBJbmRpcmVjdCBSZWFkIG9yIFdyaXRlIE1vZGVzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9Db21tYW5kX0lUKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoY21kLT5JbnN0cnVjdGlvbk1vZGUpKTsKKyAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OKGNtZC0+SW5zdHJ1Y3Rpb24pKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfTU9ERShjbWQtPkFkZHJlc3NNb2RlKSk7CisgIGlmIChjbWQtPkFkZHJlc3NNb2RlICE9IFFTUElfQUREUkVTU19OT05FKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUREUkVTU19TSVpFKGNtZC0+QWRkcmVzc1NpemUpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUpKTsKKyAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EVU1NWV9DWUNMRVMoY21kLT5EdW1teUN5Y2xlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EQVRBX01PREUoY21kLT5EYXRhTW9kZSkpOworCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9NT0RFKGNtZC0+RGRyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TSU9PX01PREUoY21kLT5TSU9PTW9kZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOworCisgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KKyAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZOworCisgICAgLyogV2FpdCB0aWxsIEJVU1kgZmxhZyByZXNldCAqLworICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX0JVU1ksIFJFU0VULCB0aWNrc3RhcnQsIGhxc3BpLT5UaW1lb3V0KTsKKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIGlmIChjbWQtPkRhdGFNb2RlID09IFFTUElfREFUQV9OT05FKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpOworICAgICAgfQorCisgICAgICAvKiBDYWxsIHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uICovCisgICAgICBRU1BJX0NvbmZpZyhocXNwaSwgY21kLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CisKKyAgICAgIGlmIChjbWQtPkRhdGFNb2RlID09IFFTUElfREFUQV9OT05FKQorICAgICAgeworICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgcGhhc2UsIHRoZSB0cmFuc2ZlciBzdGFydCBhcyBzb29uIGFzIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUKKyAgICAgICAgc28gYWN0aXZhdGUgVEMgYW5kIFRFIGludGVycnVwdHMgKi8KKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBUcmFuc2ZlciBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEUgfCBRU1BJX0lUX1RDKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KKyAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gcERhdGEgOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtIFRpbWVvdXQgOiBUaW1lb3V0IGR1cmF0aW9uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBJbmRpcmVjdCBXcml0ZSBNb2RlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9UcmFuc21pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICBfX0lPIHVpbnQzMl90ICpkYXRhX3JlZyA9ICZocXNwaS0+SW5zdGFuY2UtPkRSOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOworCisgICAgaWYocERhdGEgIT0gTlVMTCApCisgICAgeworICAgICAgLyogVXBkYXRlIHN0YXRlICovCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYOworCisgICAgICAvKiBDb25maWd1cmUgY291bnRlcnMgYW5kIHNpemUgb2YgdGhlIGhhbmRsZSAqLworICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+VHhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOworICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKKworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KKyAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CisKKyAgICAgIHdoaWxlKGhxc3BpLT5UeFhmZXJDb3VudCA+IDBVKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIEZUIGZsYWcgaXMgc2V0IHRvIHNlbmQgZGF0YSAqLworICAgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19GVCwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZykgPSAqaHFzcGktPnBUeEJ1ZmZQdHI7CisgICAgICAgIGhxc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgfQorCisgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KKyAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfVEMsIFNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKKworICAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIENsZWFyIFRyYW5zZmVyIENvbXBsZXRlIGJpdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKKworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSBUaW1lb3V0IDogVGltZW91dCBkdXJhdGlvbgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBNb2RlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9SZWNlaXZlKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBUaW1lb3V0KQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIHVpbnQzMl90IGFkZHJfcmVnID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5BUik7CisgIF9fSU8gdWludDMyX3QgKmRhdGFfcmVnID0gJmhxc3BpLT5JbnN0YW5jZS0+RFI7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICBpZihwRGF0YSAhPSBOVUxMICkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KKyAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlg7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCisgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKKyAgICAgIGhxc3BpLT5SeFhmZXJTaXplID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+cFJ4QnVmZlB0ciA9IHBEYXRhOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCisgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCk7CisKKyAgICAgIC8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSByZS13cml0aW5nIHRoZSBhZGRyZXNzIGluIEFSIHJlZ2lzdGVyICovCisgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOworCisgICAgICB3aGlsZShocXNwaS0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBGVCBvciBUQyBmbGFnIGlzIHNldCB0byByZWFkIHJlY2VpdmVkIGRhdGEgKi8KKyAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCAoUVNQSV9GTEFHX0ZUIHwgUVNQSV9GTEFHX1RDKSwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOworCisgICAgICAgIGlmICAoc3RhdHVzICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopZGF0YV9yZWcpOworICAgICAgICBocXNwaS0+cFJ4QnVmZlB0cisrOworICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFdhaXQgdW50aWwgVEMgZmxhZyBpcyBzZXQgdG8gZ28gYmFjayBpbiBpZGxlIHN0YXRlICovCisgICAgICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX1RDLCBTRVQsIHRpY2tzdGFydCwgVGltZW91dCk7CisKKyAgICAgICAgaWYgIChzdGF0dXMgPT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2xlYXIgVHJhbnNmZXIgQ29tcGxldGUgYml0ICovCisgICAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEMpOworCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KKyAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFdyaXRlIE1vZGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1RyYW5zbWl0X0lUKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICBpZihwRGF0YSAhPSBOVUxMICkKKyAgICB7CisgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KKyAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFg7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCisgICAgICBocXNwaS0+VHhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKKyAgICAgIGhxc3BpLT5UeFhmZXJTaXplID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+cFR4QnVmZlB0ciA9IHBEYXRhOworCisgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKTsKKworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KKyAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc2ZlciBlcnJvciwgRklGTyB0aHJlc2hvbGQgYW5kIHRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdHMgKi8KKyAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFIHwgUVNQSV9JVF9GVCB8IFFTUElfSVRfVEMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggaW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGEgOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBJbmRpcmVjdCBSZWFkIE1vZGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1JlY2VpdmVfSVQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgYWRkcl9yZWcgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhxc3BpKTsKKworICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKKworICAgIGlmKHBEYXRhICE9IE5VTEwgKQorICAgIHsKKyAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWDsKKworICAgICAgLyogQ29uZmlndXJlIGNvdW50ZXJzIGFuZCBzaXplIG9mIHRoZSBoYW5kbGUgKi8KKyAgICAgIGhxc3BpLT5SeFhmZXJDb3VudCA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOworICAgICAgaHFzcGktPlJ4WGZlclNpemUgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKKyAgICAgIGhxc3BpLT5wUnhCdWZmUHRyID0gcERhdGE7CisKKyAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLworICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCisgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCk7CisKKyAgICAgIC8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSByZS13cml0aW5nIHRoZSBhZGRyZXNzIGluIEFSIHJlZ2lzdGVyICovCisgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworCisgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNmZXIgZXJyb3IsIEZJRk8gdGhyZXNob2xkIGFuZCB0cmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9URSB8IFFTUElfSVRfRlQgfCBRU1BJX0lUX1RDKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgV3JpdGUgTW9kZQorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIKKyAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBoYWxmd29yZAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIHdvcmQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1RyYW5zbWl0X0RNQShRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50OF90ICpwRGF0YSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICB1aW50MzJfdCBkYXRhX3NpemUgPSAoUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVUpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIENsZWFyIHRoZSBlcnJvciBjb2RlICovCisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICBpZihwRGF0YSAhPSBOVUxMICkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgY291bnRlcnMgb2YgdGhlIGhhbmRsZSAqLworICAgICAgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fQllURSkKKyAgICAgIHsKKyAgICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gZGF0YV9zaXplOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaHFzcGktPmhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCA9PSBETUFfUERBVEFBTElHTl9IQUxGV09SRCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoZGF0YV9zaXplICUgMlUpICE9IDBVKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSAyVSkgIT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiBoYWxmd29yZAorICAgICAgICAgID0+IG5vIHRyYW5zZmVyIHBvc3NpYmxlIHdpdGggRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQgKi8KKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAxVSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoZGF0YV9zaXplICUgNFUpICE9IDBVKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSA0VSkgIT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiB3b3JkCisgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCisgICAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMlUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKworICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYOworCisgICAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLworICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIChRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpKTsKKworICAgICAgICAvKiBDb25maWd1cmUgc2l6ZSBhbmQgcG9pbnRlciBvZiB0aGUgaGFuZGxlICovCisgICAgICAgIGhxc3BpLT5UeFhmZXJTaXplID0gaHFzcGktPlR4WGZlckNvdW50OworICAgICAgICBocXNwaS0+cFR4QnVmZlB0ciA9IHBEYXRhOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIG1vZGUgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFKTsKKworICAgICAgICAvKiBTZXQgdGhlIFFTUEkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gUVNQSV9ETUFUeENwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBRU1BJIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFFTUElfRE1BVHhIYWxmQ3BsdDsKKworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBRU1BJX0RNQUVycm9yOworCisgICAgICAgIC8qIENsZWFyIHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgICAvKiBDb25maWd1cmUgdGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbiA9IERNQV9NRU1PUllfVE9fUEVSSVBIOworICAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5oZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0RJUiwgaHFzcGktPmhkbWEtPkluaXQuRGlyZWN0aW9uKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNtaXQgRE1BIENoYW5uZWwgKi8KKyAgICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHFzcGktPmhkbWEsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZocXNwaS0+SW5zdGFuY2UtPkRSLCBocXNwaS0+VHhYZmVyU2l6ZSkgPT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKyAgICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICB9CisgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFJlYWQgTW9kZQorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIKKyAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBoYWxmd29yZAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIHdvcmQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1JlY2VpdmVfRE1BKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IGFkZHJfcmVnID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5BUik7CisgIHVpbnQzMl90IGRhdGFfc2l6ZSA9IChSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2xlYXIgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKKworICAgIGlmKHBEYXRhICE9IE5VTEwgKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBvZiB0aGUgaGFuZGxlICovCisgICAgICBpZiAoaHFzcGktPmhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCA9PSBETUFfUERBVEFBTElHTl9CWVRFKQorICAgICAgeworICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSBkYXRhX3NpemU7CisgICAgICB9CisgICAgICBlbHNlIGlmIChocXNwaS0+aGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50ID09IERNQV9QREFUQUFMSUdOX0hBTEZXT1JEKQorICAgICAgeworICAgICAgICBpZiAoKChkYXRhX3NpemUgJSAyVSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDJVKSAhPSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIGhhbGZ3b3JkCisgICAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyBoYWxmd29yZCAqLworICAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSAoZGF0YV9zaXplID4+IDFVKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoaHFzcGktPmhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCA9PSBETUFfUERBVEFBTElHTl9XT1JEKQorICAgICAgeworICAgICAgICBpZiAoKChkYXRhX3NpemUgJSA0VSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDRVKSAhPSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIHdvcmQKKyAgICAgICAgICAgICA9PiBubyB0cmFuc2ZlciBwb3NzaWJsZSB3aXRoIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBjb25maWd1cmVkIGFzIHdvcmQgKi8KKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHFzcGktPlJ4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAyVSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorCisgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIHN0YXRlICovCisgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlg7CisKKyAgICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgKFFTUElfRkxBR19URSB8IFFTUElfRkxBR19UQykpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBzaXplIGFuZCBwb2ludGVyIG9mIHRoZSBoYW5kbGUgKi8KKyAgICAgICAgaHFzcGktPlJ4WGZlclNpemUgPSBocXNwaS0+UnhYZmVyQ291bnQ7CisgICAgICAgIGhxc3BpLT5wUnhCdWZmUHRyID0gcERhdGE7CisKKyAgICAgICAgLyogU2V0IHRoZSBRU1BJIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IFFTUElfRE1BUnhDcGx0OworCisgICAgICAgIC8qIFNldCB0aGUgUVNQSSBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBRU1BJX0RNQVJ4SGFsZkNwbHQ7CisKKyAgICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gUVNQSV9ETUFFcnJvcjsKKworICAgICAgICAvKiBDbGVhciB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQSAqLworICAgICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfUEVSSVBIX1RPX01FTU9SWTsKKyAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgQ2hhbm5lbCAqLworICAgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChocXNwaS0+aGRtYSwgKHVpbnQzMl90KSZocXNwaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIGhxc3BpLT5SeFhmZXJTaXplKSA9PSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCisgICAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1JFQUQpOworCisgICAgICAgICAgLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IHJlLXdyaXRpbmcgdGhlIGFkZHJlc3MgaW4gQVIgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKyAgICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9CVVNZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBjbWQgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEBwYXJhbSAgY2ZnIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIHBvbGxpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgOiBUaW1lb3V0IGR1cmF0aW9uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBBdXRvbWF0aWMgUG9sbGluZyBNb2RlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BdXRvUG9sbGluZyhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CisgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTihjbWQtPkluc3RydWN0aW9uKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX01PREUoY21kLT5BZGRyZXNzTW9kZSkpOworICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfU0laRShjbWQtPkFkZHJlc3NTaXplKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfTU9ERShjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlKSk7CisgIGlmIChjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlICE9IFFTUElfQUxURVJOQVRFX0JZVEVTX05PTkUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfU0laRShjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSkpOworICB9CisKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRFVNTVlfQ1lDTEVTKGNtZC0+RHVtbXlDeWNsZXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfREFUQV9NT0RFKGNtZC0+RGF0YU1vZGUpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlRFUlZBTChjZmctPkludGVydmFsKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX1NUQVRVU19CWVRFU19TSVpFKGNmZy0+U3RhdHVzQnl0ZXNTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX01BVENIX01PREUoY2ZnLT5NYXRjaE1vZGUpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhxc3BpKTsKKworICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKKworICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfQVVUT19QT0xMSU5HOworCisgICAgLyogV2FpdCB0aWxsIEJVU1kgZmxhZyByZXNldCAqLworICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX0JVU1ksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOworCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBTTUFSIHJlZ2lzdGVyIHdpdGggdGhlIHN0YXR1cyBtYXRjaCB2YWx1ZSAqLworICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNQVIsIGNmZy0+TWF0Y2gpOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogUFNNS1IgcmVnaXN0ZXIgd2l0aCB0aGUgc3RhdHVzIG1hc2sgdmFsdWUgKi8KKyAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPlBTTUtSLCBjZmctPk1hc2spOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogUElSIHJlZ2lzdGVyIHdpdGggdGhlIGludGVydmFsIHZhbHVlICovCisgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5QSVIsIGNmZy0+SW50ZXJ2YWwpOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ1IgcmVnaXN0ZXIgd2l0aCBNYXRjaCBtb2RlIGFuZCBBdXRvbWF0aWMgc3RvcCBlbmFibGVkCisgICAgICAob3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYW4gaW5maW5pdGUgbG9vcCBpbiBibG9ja2luZyBtb2RlKSAqLworICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCAoUVVBRFNQSV9DUl9QTU0gfCBRVUFEU1BJX0NSX0FQTVMpLAorICAgICAgICAgICAgICAgKGNmZy0+TWF0Y2hNb2RlIHwgUVNQSV9BVVRPTUFUSUNfU1RPUF9FTkFCTEUpKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqLworICAgICAgY21kLT5OYkRhdGEgPSBjZmctPlN0YXR1c0J5dGVzU2l6ZTsKKyAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0FVVE9fUE9MTElORyk7CisKKyAgICAgIC8qIFdhaXQgdW50aWwgU00gZmxhZyBpcyBzZXQgdG8gZ28gYmFjayBpbiBpZGxlIHN0YXRlICovCisgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19TTSwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOworCisgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfU00pOworCisgICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0JVU1k7CisgIH0KKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIGNmZyA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBwb2xsaW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBBdXRvbWF0aWMgUG9sbGluZyBNb2RlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BdXRvUG9sbGluZ19JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CisgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTihjbWQtPkluc3RydWN0aW9uKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX01PREUoY21kLT5BZGRyZXNzTW9kZSkpOworICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfU0laRShjbWQtPkFkZHJlc3NTaXplKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfTU9ERShjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlKSk7CisgIGlmIChjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlICE9IFFTUElfQUxURVJOQVRFX0JZVEVTX05PTkUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfU0laRShjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSkpOworICB9CisKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRFVNTVlfQ1lDTEVTKGNtZC0+RHVtbXlDeWNsZXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfREFUQV9NT0RFKGNtZC0+RGF0YU1vZGUpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlRFUlZBTChjZmctPkludGVydmFsKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX1NUQVRVU19CWVRFU19TSVpFKGNmZy0+U3RhdHVzQnl0ZXNTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX01BVENIX01PREUoY2ZnLT5NYXRjaE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQVVUT01BVElDX1NUT1AoY2ZnLT5BdXRvbWF0aWNTdG9wKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICAvKiBVcGRhdGUgc3RhdGUgKi8KKyAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0FVVE9fUE9MTElORzsKKworICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KKyAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgUVNQSTogUFNNQVIgcmVnaXN0ZXIgd2l0aCB0aGUgc3RhdHVzIG1hdGNoIHZhbHVlICovCisgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5QU01BUiwgY2ZnLT5NYXRjaCk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQU01LUiByZWdpc3RlciB3aXRoIHRoZSBzdGF0dXMgbWFzayB2YWx1ZSAqLworICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNS1IsIGNmZy0+TWFzayk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQSVIgcmVnaXN0ZXIgd2l0aCB0aGUgaW50ZXJ2YWwgdmFsdWUgKi8KKyAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPlBJUiwgY2ZnLT5JbnRlcnZhbCk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIE1hdGNoIG1vZGUgYW5kIEF1dG9tYXRpYyBzdG9wIG1vZGUgKi8KKyAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgKFFVQURTUElfQ1JfUE1NIHwgUVVBRFNQSV9DUl9BUE1TKSwKKyAgICAgICAgICAgICAgIChjZmctPk1hdGNoTW9kZSB8IGNmZy0+QXV0b21hdGljU3RvcCkpOworCisgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1NNKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqLworICAgICAgY21kLT5OYkRhdGEgPSBjZmctPlN0YXR1c0J5dGVzU2l6ZTsKKyAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0FVVE9fUE9MTElORyk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBUcmFuc2ZlciBFcnJvciBhbmQgc3RhdHVzIG1hdGNoIEludGVycnVwdCAqLworICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIChRU1BJX0lUX1NNIHwgUVNQSV9JVF9URSkpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTWVtb3J5IE1hcHBlZCBtb2RlLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIGNmZyA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgbWFwcGVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBNZW1vcnkgbWFwcGVkIE1vZGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX01lbW9yeU1hcHBlZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfTWVtb3J5TWFwcGVkVHlwZURlZiAqY2ZnKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1FTUElfSU5TVFJVQ1RJT05fTU9ERShjbWQtPkluc3RydWN0aW9uTW9kZSkpOworICBpZiAoY21kLT5JbnN0cnVjdGlvbk1vZGUgIT0gUVNQSV9JTlNUUlVDVElPTl9OT05FKQorICB7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OKGNtZC0+SW5zdHJ1Y3Rpb24pKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfTU9ERShjbWQtPkFkZHJlc3NNb2RlKSk7CisgIGlmIChjbWQtPkFkZHJlc3NNb2RlICE9IFFTUElfQUREUkVTU19OT05FKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUREUkVTU19TSVpFKGNtZC0+QWRkcmVzc1NpemUpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUpKTsKKyAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplKSk7CisgIH0KKworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EVU1NWV9DWUNMRVMoY21kLT5EdW1teUN5Y2xlcykpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EQVRBX01PREUoY21kLT5EYXRhTW9kZSkpOworCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9NT0RFKGNtZC0+RGRyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TSU9PX01PREUoY21kLT5TSU9PTW9kZSkpOworCisgIGFzc2VydF9wYXJhbShJU19RU1BJX1RJTUVPVVRfQUNUSVZBVElPTihjZmctPlRpbWVPdXRBY3RpdmF0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKKyAgICAvKiBVcGRhdGUgc3RhdGUgKi8KKyAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX01FTV9NQVBQRUQ7CisKKyAgICAvKiBXYWl0IHRpbGwgQlVTWSBmbGFnIHJlc2V0ICovCisgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOworCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggdGltZW91dCBjb3VudGVyIGVuYWJsZSAqLworICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9UQ0VOLCBjZmctPlRpbWVPdXRBY3RpdmF0aW9uKTsKKworICAgIGlmIChjZmctPlRpbWVPdXRBY3RpdmF0aW9uID09IFFTUElfVElNRU9VVF9DT1VOVEVSX0VOQUJMRSkKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfVElNRU9VVF9QRVJJT0QoY2ZnLT5UaW1lT3V0UGVyaW9kKSk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IExQVFIgcmVnaXN0ZXIgd2l0aCB0aGUgbG93LXBvd2VyIHRpbWVvdXQgdmFsdWUgKi8KKyAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+TFBUUiwgY2ZnLT5UaW1lT3V0UGVyaW9kKTsKKworICAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVE8pOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBUaW1lT3V0IEludGVycnVwdCAqLworICAgICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UTyk7CisgICAgICB9CisKKyAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KKyAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNmZXIgRXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUVNQSV9FcnJvckNhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1FTUElfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29tbWFuZCBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUVNQSV9DbWRDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHFzcGkpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHFzcGkpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUVNQSV9UeENwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocXNwaSk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfUVNQSV9UeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfUnhIYWxmQ3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfVHhIYWxmQ3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEZJRk8gVGhyZXNob2xkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfRmlmb1RocmVzaG9sZENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1FTUElfRklGT1RocmVzaG9sZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhdHVzIE1hdGNoIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfU3RhdHVzTWF0Y2hDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocXNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1N0YXR1c01hdGNoQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lb3V0IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1FTUElfVGltZU91dENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhxc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1FTUElfVGltZU91dENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFFTUEkgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSWQgOiBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9FUlJPUl9DQl9JRCAgICAgICAgICBRU1BJIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX0FCT1JUX0NCX0lEICAgICAgICAgIFFTUEkgQWJvcnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfRklGT19USFJFU0hPTERfQ0JfSUQgUVNQSSBGSUZPIFRocmVzaG9sZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9DTURfQ1BMVF9DQl9JRCAgICAgICBRU1BJIENvbW1hbmQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfUlhfQ1BMVF9DQl9JRCAgICAgICAgUVNQSSBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9UWF9DUExUX0NCX0lEICAgICAgICBRU1BJIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX1JYX0hBTEZfQ1BMVF9DQl9JRCAgIFFTUEkgUnggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9UWF9IQUxGX0NQTFRfQ0JfSUQgICBRU1BJIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfU1RBVFVTX01BVENIX0NCX0lEICAgUVNQSSBTdGF0dXMgTWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfVElNRU9VVF9DQl9JRCAgICAgICAgUVNQSSBUaW1lb3V0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX01TUF9JTklUX0NCX0lEICAgICAgIFFTUEkgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9NU1BfREVJTklUX0NCX0lEICAgICBRU1BJIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSBwQ2FsbGJhY2sgOiBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9SZWdpc3RlckNhbGxiYWNrIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBIQUxfUVNQSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lkLCBwUVNQSV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJZCkKKyAgICB7CisgICAgY2FzZSAgSEFMX1FTUElfRVJST1JfQ0JfSUQgOgorICAgICAgaHFzcGktPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX0FCT1JUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfRklGT19USFJFU0hPTERfQ0JfSUQgOgorICAgICAgaHFzcGktPkZpZm9UaHJlc2hvbGRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfQ01EX0NQTFRfQ0JfSUQgOgorICAgICAgaHFzcGktPkNtZENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfUlhfQ1BMVF9DQl9JRCA6CisgICAgICBocXNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX1RYX0NQTFRfQ0JfSUQgOgorICAgICAgaHFzcGktPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9SWF9IQUxGX0NQTFRfQ0JfSUQgOgorICAgICAgaHFzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfVFhfSEFMRl9DUExUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX1NUQVRVU19NQVRDSF9DQl9JRCA6CisgICAgICBocXNwaS0+U3RhdHVzTWF0Y2hDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfVElNRU9VVF9DQl9JRCA6CisgICAgICBocXNwaS0+VGltZU91dENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9NU1BfSU5JVF9DQl9JRCA6CisgICAgICBocXNwaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9NU1BfREVJTklUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSWQpCisgICAgeworICAgIGNhc2UgSEFMX1FTUElfTVNQX0lOSVRfQ0JfSUQgOgorICAgICAgaHFzcGktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfTVNQX0RFSU5JVF9DQl9JRCA6CisgICAgICBocXNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBVc2VyIFFTUEkgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFFTUEkgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIENhbGxiYWNrSWQgOiBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX0VSUk9SX0NCX0lEICAgICAgICAgIFFTUEkgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfQUJPUlRfQ0JfSUQgICAgICAgICAgUVNQSSBBYm9ydCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9GSUZPX1RIUkVTSE9MRF9DQl9JRCBRU1BJIEZJRk8gVGhyZXNob2xkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX0NNRF9DUExUX0NCX0lEICAgICAgIFFTUEkgQ29tbWFuZCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9SWF9DUExUX0NCX0lEICAgICAgICBRU1BJIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX1RYX0NQTFRfQ0JfSUQgICAgICAgIFFTUEkgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfUlhfSEFMRl9DUExUX0NCX0lEICAgUVNQSSBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX1RYX0hBTEZfQ1BMVF9DQl9JRCAgIFFTUEkgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9TVEFUVVNfTUFUQ0hfQ0JfSUQgICBRU1BJIFN0YXR1cyBNYXRjaCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUVNQSV9USU1FT1VUX0NCX0lEICAgICAgICBRU1BJIFRpbWVvdXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1FTUElfTVNQX0lOSVRfQ0JfSUQgICAgICAgUVNQSSBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9RU1BJX01TUF9ERUlOSVRfQ0JfSUQgICAgIFFTUEkgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgSEFMX1FTUElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJZCkKKyAgICB7CisgICAgY2FzZSAgSEFMX1FTUElfRVJST1JfQ0JfSUQgOgorICAgICAgaHFzcGktPkVycm9yQ2FsbGJhY2sgPSBIQUxfUVNQSV9FcnJvckNhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9BQk9SVF9DQl9JRCA6CisgICAgICBocXNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfRklGT19USFJFU0hPTERfQ0JfSUQgOgorICAgICAgaHFzcGktPkZpZm9UaHJlc2hvbGRDYWxsYmFjayA9IEhBTF9RU1BJX0ZpZm9UaHJlc2hvbGRDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfQ01EX0NQTFRfQ0JfSUQgOgorICAgICAgaHFzcGktPkNtZENwbHRDYWxsYmFjayA9IEhBTF9RU1BJX0NtZENwbHRDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfUlhfQ1BMVF9DQl9JRCA6CisgICAgICBocXNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfUVNQSV9SeENwbHRDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfVFhfQ1BMVF9DQl9JRCA6CisgICAgICBocXNwaS0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfUVNQSV9UeENwbHRDYWxsYmFjazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1FTUElfUlhfSEFMRl9DUExUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfUVNQSV9SeEhhbGZDcGx0Q2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX1RYX0hBTEZfQ1BMVF9DQl9JRCA6CisgICAgICBocXNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1FTUElfVHhIYWxmQ3BsdENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9TVEFUVVNfTUFUQ0hfQ0JfSUQgOgorICAgICAgaHFzcGktPlN0YXR1c01hdGNoQ2FsbGJhY2sgPSBIQUxfUVNQSV9TdGF0dXNNYXRjaENhbGxiYWNrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9USU1FT1VUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5UaW1lT3V0Q2FsbGJhY2sgPSBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX01TUF9JTklUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUVNQSV9Nc3BJbml0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUVNQSV9NU1BfREVJTklUX0NCX0lEIDoKKyAgICAgIGhxc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9RU1BJX01zcERlSW5pdDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSWQpCisgICAgeworICAgIGNhc2UgSEFMX1FTUElfTVNQX0lOSVRfQ0JfSUQgOgorICAgICAgaHFzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9RU1BJX01zcEluaXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9RU1BJX01TUF9ERUlOSVRfQ0JfSUQgOgorICAgICAgaHFzcGktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1FTUElfTXNwRGVJbml0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBRU1BJIGNvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CisgICAgICAoKykgQ2hlY2sgaW4gcnVuLXRpbWUgdGhlIHN0YXRlIG9mIHRoZSBkcml2ZXIuCisgICAgICAoKykgQ2hlY2sgdGhlIGVycm9yIGNvZGUgc2V0IGR1cmluZyBsYXN0IG9wZXJhdGlvbi4KKyAgICAgICgrKSBBYm9ydCBhbnkgb3BlcmF0aW9uLgorCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBRU1BJIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLworSEFMX1FTUElfU3RhdGVUeXBlRGVmIEhBTF9RU1BJX0dldFN0YXRlKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIC8qIFJldHVybiBRU1BJIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHFzcGktPlN0YXRlOworfQorCisvKioKKyogQGJyaWVmICBSZXR1cm4gdGhlIFFTUEkgZXJyb3IgY29kZS4KKyogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisqIEByZXR2YWwgUVNQSSBFcnJvciBDb2RlCisqLwordWludDMyX3QgSEFMX1FTUElfR2V0RXJyb3IoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK3sKKyAgcmV0dXJuIGhxc3BpLT5FcnJvckNvZGU7Cit9CisKKy8qKgorKiBAYnJpZWYgIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zbWlzc2lvbi4KKyogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0Fib3J0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBDaGVjayBpZiB0aGUgc3RhdGUgaXMgaW4gb25lIG9mIHRoZSBidXN5IHN0YXRlcyAqLworICBpZiAoKCh1aW50MzJfdClocXNwaS0+U3RhdGUgJiAweDJVKSAhPSAwVSkKKyAgeworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworCisgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikgIT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IGNsZWFyaW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKKworICAgICAgLyogQWJvcnQgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaHFzcGktPmhkbWEpOworICAgICAgaWYoc3RhdHVzICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9ETUE7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggQWJvcnQgcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9BQk9SVCk7CisKKyAgICAvKiBXYWl0IHVudGlsIFRDIGZsYWcgaXMgc2V0IHRvIGdvIGJhY2sgaW4gaWRsZSBzdGF0ZSAqLworICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX1RDLCBTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOworCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEMpOworCisgICAgICAvKiBXYWl0IHVudGlsIEJVU1kgZmxhZyBpcyByZXNldCAqLworICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGZ1bmN0aW9uYWwgbW9kZSBjb25maWd1cmF0aW9uIHRvIGluZGlyZWN0IHdyaXRlIG1vZGUgYnkgZGVmYXVsdCAqLworICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSk7CisKKyAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisqIEBicmllZiAgQWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNtaXNzaW9uIChub24tYmxvY2tpbmcgZnVuY3Rpb24pCisqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BYm9ydF9JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHN0YXRlIGlzIGluIG9uZSBvZiB0aGUgYnVzeSBzdGF0ZXMgKi8KKyAgaWYgKCgodWludDMyX3QpaHFzcGktPlN0YXRlICYgMHgyVSkgIT0gMFUpCisgIHsKKyAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCisgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQUJPUlQ7CisKKyAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfUVNQSV9ESVNBQkxFX0lUKGhxc3BpLCAoUVNQSV9JVF9UTyB8IFFTUElfSVRfU00gfCBRU1BJX0lUX0ZUIHwgUVNQSV9JVF9UQyB8IFFTUElfSVRfVEUpKTsKKworICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pICE9IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCisgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7CisKKyAgICAgIC8qIEFib3J0IERNQSBjaGFubmVsICovCisgICAgICBocXNwaS0+aGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBRU1BJX0RNQUFib3J0Q3BsdDsKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhxc3BpLT5oZG1hKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSBvZiBRU1BJICovCisgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOworICAgICAgICAKKyAgICAgICAgLyogQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBocXNwaS0+QWJvcnRDcGx0Q2FsbGJhY2soaHFzcGkpOworI2Vsc2UKKyAgICAgICAgSEFMX1FTUElfQWJvcnRDcGx0Q2FsbGJhY2soaHFzcGkpOworI2VuZGlmCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOworCisgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ1IgcmVnaXN0ZXIgd2l0aCBBYm9ydCByZXF1ZXN0ICovCisgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfQUJPUlQpOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKiogQGJyaWVmIFNldCBRU1BJIHRpbWVvdXQuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlLgorICAqIEBwYXJhbSAgVGltZW91dCA6IFRpbWVvdXQgZm9yIHRoZSBRU1BJIG1lbW9yeSBhY2Nlc3MuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9RU1BJX1NldFRpbWVvdXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgaHFzcGktPlRpbWVvdXQgPSBUaW1lb3V0OworfQorCisvKiogQGJyaWVmIFNldCBRU1BJIEZpZm8gdGhyZXNob2xkLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRocmVzaG9sZCA6IFRocmVzaG9sZCBvZiB0aGUgRmlmbyAodmFsdWUgYmV0d2VlbiAxIGFuZCAxNikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9TZXRGaWZvVGhyZXNob2xkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHFzcGkpOworCisgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFN5bmNocm9uaXplIGluaXQgc3RydWN0dXJlIHdpdGggbmV3IEZJRk8gdGhyZXNob2xkIHZhbHVlICovCisgICAgaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCA9IFRocmVzaG9sZDsKKworICAgIC8qIENvbmZpZ3VyZSBRU1BJIEZJRk8gVGhyZXNob2xkICovCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0ZUSFJFUywKKyAgICAgICAgICAgICAgICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAtIDFVKSA8PCBRVUFEU1BJX0NSX0ZUSFJFU19Qb3MpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKiBAYnJpZWYgR2V0IFFTUEkgRmlmbyB0aHJlc2hvbGQuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlLgorICAqIEByZXR2YWwgRmlmbyB0aHJlc2hvbGQgKHZhbHVlIGJldHdlZW4gMSBhbmQgMTYpCisgICovCit1aW50MzJfdCBIQUxfUVNQSV9HZXRGaWZvVGhyZXNob2xkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCit7CisgIHJldHVybiAoKFJFQURfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRlRIUkVTKSA+PiBRVUFEU1BJX0NSX0ZUSFJFU19Qb3MpICsgMVUpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfUHJpdmF0ZV9GdW5jdGlvbnMgUVNQSSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFFTUElfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisgIGhxc3BpLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBRU1BJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgUVNQSV9ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKyAgaHFzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgUVNQSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBocXNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhocXNwaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBETUEgUVNQSSB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgUVNQSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBocXNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhocXNwaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBETUEgUVNQSSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFFTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoIFFTUElfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworCisgIGhxc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBocXNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHFzcGktPkVycm9yQ29kZSAgIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKworICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLworICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7CisKKyAgLyogQWJvcnQgdGhlIFFTUEkgKi8KKyAgKHZvaWQpSEFMX1FTUElfQWJvcnRfSVQoaHFzcGkpOworCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFFTUEkgYWJvcnQgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgUVNQSV9ETUFBYm9ydENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoIFFTUElfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworCisgIGhxc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBocXNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQUJPUlQpCisgIHsKKyAgICAvKiBETUEgQWJvcnQgY2FsbGVkIGJ5IFFTUEkgYWJvcnQgKi8KKyAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UQyk7CisKKyAgICAvKiBFbmFibGUgdGhlIFFTUEkgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOworCisgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggQWJvcnQgcmVxdWVzdCAqLworICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9BQk9SVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogRE1BIEFib3J0IGNhbGxlZCBkdWUgdG8gYSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgKi8KKyAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLworICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOworCisgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbHNlCisgICAgSEFMX1FTUElfRXJyb3JDYWxsYmFjayhocXNwaSk7CisjZW5kaWYKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFdhaXQgZm9yIGEgZmxhZyBzdGF0ZSB1bnRpbCB0aW1lb3V0LgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgRmxhZyA6IEZsYWcgY2hlY2tlZAorICAqIEBwYXJhbSAgU3RhdGUgOiBWYWx1ZSBvZiB0aGUgZmxhZyBleHBlY3RlZAorICAqIEBwYXJhbSAgVGlja3N0YXJ0IDogVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCA6IER1cmF0aW9uIG9mIHRoZSB0aW1lb3V0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdTdGF0dXMgU3RhdGUsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIGluIGV4cGVjdGVkIHN0YXRlICovCisgIHdoaWxlKChfX0hBTF9RU1BJX0dFVF9GTEFHKGhxc3BpLCBGbGFnKSkgIT0gU3RhdGUpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhxc3BpLT5TdGF0ZSAgICAgPSBIQUxfUVNQSV9TVEFURV9FUlJPUjsKKyAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBjb21tdW5pY2F0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIGNtZCA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAgKiBAcGFyYW0gIEZ1bmN0aW9uYWxNb2RlIDogZnVuY3Rpb25hbCBtb2RlIHRvIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEU6IEluZGlyZWN0IHdyaXRlIG1vZGUKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRDogSW5kaXJlY3QgcmVhZCBtb2RlCisgICogICAgICAgICAgICBAYXJnIFFTUElfRlVOQ1RJT05BTF9NT0RFX0FVVE9fUE9MTElORzogQXV0b21hdGljIHBvbGxpbmcgbW9kZQorICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEOiBNZW1vcnktbWFwcGVkIG1vZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFFTUElfQ29uZmlnKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgdWludDMyX3QgRnVuY3Rpb25hbE1vZGUpCit7CisgIGFzc2VydF9wYXJhbShJU19RU1BJX0ZVTkNUSU9OQUxfTU9ERShGdW5jdGlvbmFsTW9kZSkpOworCisgIGlmICgoY21kLT5EYXRhTW9kZSAhPSBRU1BJX0RBVEFfTk9ORSkgJiYgKEZ1bmN0aW9uYWxNb2RlICE9IFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpKQorICB7CisgICAgLyogQ29uZmlndXJlIFFTUEk6IERMUiByZWdpc3RlciB3aXRoIHRoZSBudW1iZXIgb2YgZGF0YSB0byByZWFkIG9yIHdyaXRlICovCisgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSLCAoY21kLT5OYkRhdGEgLSAxVSkpOworICB9CisKKyAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKKyAgeworICAgIGlmIChjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlICE9IFFTUElfQUxURVJOQVRFX0JZVEVTX05PTkUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IEFCUiByZWdpc3RlciB3aXRoIGFsdGVybmF0ZSBieXRlcyB2YWx1ZSAqLworICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+QUJSLCBjbWQtPkFsdGVybmF0ZUJ5dGVzKTsKKworICAgICAgaWYgKGNtZC0+QWRkcmVzc01vZGUgIT0gUVNQSV9BRERSRVNTX05PTkUpCisgICAgICB7CisgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggaW5zdHJ1Y3Rpb24sIGFkZHJlc3MgYW5kIGFsdGVybmF0ZSBieXRlcyAtLS0tKi8KKyAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+U0lPT01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlc1NpemUgfCBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BZGRyZXNzU2l6ZSB8IGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb24gfCBGdW5jdGlvbmFsTW9kZSkpOworCisgICAgICAgIGlmIChGdW5jdGlvbmFsTW9kZSAhPSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEKQorICAgICAgICB7CisgICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IEFSIHJlZ2lzdGVyIHdpdGggYWRkcmVzcyB2YWx1ZSAqLworICAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSLCBjbWQtPkFkZHJlc3MpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggaW5zdHJ1Y3Rpb24gYW5kIGFsdGVybmF0ZSBieXRlcyAtLS0tKi8KKyAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+U0lPT01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlc1NpemUgfCBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbiB8IEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBpbnN0cnVjdGlvbiBhbmQgYWRkcmVzcyAtLS0tKi8KKyAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCisgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+U0lPT01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKKworICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBBUiByZWdpc3RlciB3aXRoIGFkZHJlc3MgdmFsdWUgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgY21kLT5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKi0tLS0gQ29tbWFuZCB3aXRoIG9ubHkgaW5zdHJ1Y3Rpb24gLS0tLSovCisgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPlNJT09Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgUVNQSTogQUJSIHJlZ2lzdGVyIHdpdGggYWx0ZXJuYXRlIGJ5dGVzIHZhbHVlICovCisgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BQlIsIGNtZC0+QWx0ZXJuYXRlQnl0ZXMpOworCisgICAgICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBhZGRyZXNzIGFuZCBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCisgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPlNJT09Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBGdW5jdGlvbmFsTW9kZSkpOworCisgICAgICAgIGlmIChGdW5jdGlvbmFsTW9kZSAhPSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEKQorICAgICAgICB7CisgICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IEFSIHJlZ2lzdGVyIHdpdGggYWRkcmVzcyB2YWx1ZSAqLworICAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSLCBjbWQtPkFkZHJlc3MpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggb25seSBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCisgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPlNJT09Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBvbmx5IGFkZHJlc3MgLS0tLSovCisgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLworICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPlNJT09Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NTaXplIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgRnVuY3Rpb25hbE1vZGUpKTsKKworICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBBUiByZWdpc3RlciB3aXRoIGFkZHJlc3MgdmFsdWUgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgY21kLT5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKi0tLS0gQ29tbWFuZCB3aXRoIG9ubHkgZGF0YSBwaGFzZSAtLS0tKi8KKyAgICAgICAgaWYgKGNtZC0+RGF0YU1vZGUgIT0gUVNQSV9EQVRBX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPlNJT09Nb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBGdW5jdGlvbmFsTW9kZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUVNQSV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQoUVVBRFNQSSkgfHwgZGVmaW5lZChRVUFEU1BJMSkgfHwgZGVmaW5lZChRVUFEU1BJMikgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3JjYy5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlNjhlOAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3JjYy5jCkBAIC0wLDAgKzEsMTc1MSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfcmNjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBSZXNldCBhbmQgQ2xvY2sgQ29udHJvbCAoUkNDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFJDQyBzcGVjaWZpYyBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBBZnRlciByZXNldCB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgZnJvbSBNdWx0aXBsZSBTcGVlZCBJbnRlcm5hbCBvc2NpbGxhdG9yCisgICAgICAoNCBNSHopIHdpdGggRmxhc2ggMCB3YWl0IHN0YXRlLiBGbGFzaCBwcmVmZXRjaCBidWZmZXIsIEQtQ2FjaGUKKyAgICAgIGFuZCBJLUNhY2hlIGFyZSBkaXNhYmxlZCwgYW5kIGFsbCBwZXJpcGhlcmFscyBhcmUgb2ZmIGV4Y2VwdCBpbnRlcm5hbAorICAgICAgU1JBTSwgRmxhc2ggYW5kIEpUQUcuCisKKyAgICAgICgrKSBUaGVyZSBpcyBubyBwcmVzY2FsZXIgb24gSGlnaCBzcGVlZCAoQUhCcykgYW5kIExvdyBzcGVlZCAoQVBCcykgYnVzc2VzOgorICAgICAgICAgIGFsbCBwZXJpcGhlcmFscyBtYXBwZWQgb24gdGhlc2UgYnVzc2VzIGFyZSBydW5uaW5nIGF0IE1TSSBzcGVlZC4KKyAgICAgICgrKSBUaGUgY2xvY2sgZm9yIGFsbCBwZXJpcGhlcmFscyBpcyBzd2l0Y2hlZCBvZmYsIGV4Y2VwdCB0aGUgU1JBTSBhbmQgRkxBU0guCisgICAgICAoKykgQWxsIEdQSU9zIGFyZSBpbiBhbmFsb2cgbW9kZSwgZXhjZXB0IHRoZSBKVEFHIHBpbnMgd2hpY2gKKyAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gYmUgdXNlZCBmb3IgZGVidWcgcHVycG9zZS4KKworICAgIFsuLl0KKyAgICAgIE9uY2UgdGhlIGRldmljZSBzdGFydGVkIGZyb20gcmVzZXQsIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGhhcyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkIHRvIGRyaXZlIHRoZSBTeXN0ZW0gY2xvY2sKKyAgICAgICAgICAoaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGhpZ2hlciBmcmVxdWVuY3kvcGVyZm9ybWFuY2UpCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBTeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGFuZCBGbGFzaCBzZXR0aW5ncworICAgICAgKCspIENvbmZpZ3VyZSB0aGUgQUhCIGFuZCBBUEIgYnVzc2VzIHByZXNjYWxlcnMKKyAgICAgICgrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgcGVyaXBoZXJhbChzKSB0byBiZSB1c2VkCisgICAgICAoKykgQ29uZmlndXJlIHRoZSBjbG9jayBzb3VyY2UocykgZm9yIHBlcmlwaGVyYWxzIHdoaWNoIGNsb2NrcyBhcmUgbm90CisgICAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBTeXN0ZW0gY2xvY2sgKFNBSTEsIFJUQywgQURDLCBVU0IvUk5HLCBVU0FSVDEsIExQVUFSVDEsIExQVElNeCwgSTJDeCwgU01QUykKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQyBSQ0MKKyAgKiBAYnJpZWYgUkNDIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX0NvbnN0YW50cyBSQ0MgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgSFNFX1RJTUVPVVRfVkFMVUUgICAgICAgICAgSFNFX1NUQVJUVVBfVElNRU9VVAorI2RlZmluZSBIU0lfVElNRU9VVF9WQUxVRSAgICAgICAgICAoMlUpICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICAgKi8KKyNkZWZpbmUgTVNJX1RJTUVPVVRfVkFMVUUgICAgICAgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAgICovCisjZGVmaW5lIExTSTFfVElNRU9VVF9WQUxVRSAgICAgICAgICgyVSkgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgICAqLworI2RlZmluZSBMU0kyX1RJTUVPVVRfVkFMVUUgICAgICAgICAoM1UpICAgIC8qIHRvIGJlIGFkanVzdGVkIHdpdGggRFMgICAgKi8KKyNkZWZpbmUgSFNJNDhfVElNRU9VVF9WQUxVRSAgICAgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAgICovCisjZGVmaW5lIFBMTF9USU1FT1VUX1ZBTFVFICAgICAgICAgICgyVSkgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgICAqLworI2RlZmluZSBQTExTQUkxX1RJTUVPVVRfVkFMVUUgICAgICAoMlUpICAgIC8qIDIgbXMgKG1pbmltdW0gVGljayArIDEpICAgKi8KKyNkZWZpbmUgUFJFU0NBTEVSX1RJTUVPVVRfVkFMVUUgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAgICovCisjZGVmaW5lIExBVEVOQ1lfVElNRU9VVF9WQUxVRSAgICAgICgyVSkgICAgLyogMiBtcyAobWluaW11bSBUaWNrICsgMSkgICAqLworI2RlZmluZSBDTE9DS1NXSVRDSF9USU1FT1VUX1ZBTFVFICAoNTAwMFUpIC8qIDUgcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBQTExTT1VSQ0VfTk9ORSAgICAgICAgICAgICAoMFUpCisjZGVmaW5lIE1FR0FfSFogICAgICAgICAgICAgICAgICAgICAxMDAwMDAwVSAvKiBEaXZpc2lvbiBmYWN0b3IgdG8gY29udmVydCBIeiBpbiBNaHogKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX01hY3JvcyBSQ0MgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBfX01DTzFfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBNQ08xX0dQSU9fUE9SVCAgICAgICAgR1BJT0EKKyNkZWZpbmUgTUNPMV9QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzgKKworI2RlZmluZSBfX01DTzJfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9CX0NMS19FTkFCTEUoKQorI2RlZmluZSBNQ08yX0dQSU9fUE9SVCAgICAgICAgR1BJT0IKKyNkZWZpbmUgTUNPMl9QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzYKKworI2RlZmluZSBfX01DTzNfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBNQ08zX0dQSU9fUE9SVCAgICAgICAgR1BJT0EKKyNkZWZpbmUgTUNPM19QSU4gICAgICAgICAgICAgIEdQSU9fUElOXzE1CisKKyNkZWZpbmUgUkNDX1BMTF9PU0NTT1VSQ0VfQ09ORklHKF9fSEFMX1JDQ19QTExTT1VSQ0VfXykgXAorICAgICAgICAgICAgKE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsICh1aW50MzJfdCkoX19IQUxfUkNDX1BMTFNPVVJDRV9fKSkpCisKKyNkZWZpbmUgX19DT1VOVE9GKF9BXykgICAoc2l6ZW9mKF9BXykgLyBzaXplb2YoKihfQV8pKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX1ZhcmlhYmxlcyBSQ0MgUHJpdmF0ZSBWYXJpYWJsZXMKKyAgKiBAeworICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFJDQ19Qcml2YXRlX0Z1bmN0aW9ucyBSQ0MgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ19TZXRGbGFzaExhdGVuY3lGcm9tTVNJUmFuZ2UodWludDMyX3QgTVNJX1JhbmdlKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBSQ0NfU2V0Rmxhc2hMYXRlbmN5KHVpbnQzMl90IEZsYXNoX0Nsa1NyY0ZyZXEsIHVpbnQzMl90IFZDT1JFX1ZvbHRhZ2UpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBSQ0NfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG9zY2lsbGF0b3JzCisgICAgICAoSFNFLCBIU0ksIExTRSwgTVNJLCBMU0kxLCBMU0kyLCBQTEwsIENTUyBhbmQgTUNPKSBhbmQgdGhlIFN5c3RlbSBidXNzZXMgY2xvY2tzIChTWVNDTEssIEhDTEsxLCBIQ0xLMiwgSENMSzQsIFBDTEsxCisgICAgICAgYW5kIFBDTEsyKS4KKworICAgIFsuLl0gSW50ZXJuYWwvZXh0ZXJuYWwgY2xvY2sgYW5kIFBMTCBjb25maWd1cmF0aW9uCisgICAgICAgICAoKykgSFNJIChoaWdoLXNwZWVkIGludGVybmFsKTogMTYgTUh6IGZhY3RvcnktdHJpbW1lZCBSQyB1c2VkIGRpcmVjdGx5IG9yIHRocm91Z2gKKyAgICAgICAgICAgICB0aGUgUExMIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBNU0kgKE11dGlwbGUgU3BlZWQgSW50ZXJuYWwpOiBJdHMgZnJlcXVlbmN5IGlzIHNvZnR3YXJlIHRyaW1tYWJsZSBmcm9tIDEwMEtIWiB0byA0OE1IWi4KKyAgICAgICAgICAgICBJdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0IgRlMgKDQ4IE1IeikuCisgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBmbGFzaCB3YWl0IHN0YXRlcyBpcyBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHdoZW4gTVNJIHJhbmdlIGlzIHVwZGF0ZWQgd2l0aAorICAgICAgICAgICAgIEByZWYgSEFMX1JDQ19Pc2NDb25maWcoKSBhbmQgdGhlIE1TSSBpcyB1c2VkIGFzIFN5c3RlbSBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBMU0kxL0xTSTIgKGxvdy1zcGVlZCBpbnRlcm5hbCk6IDMyIEtIeiBsb3cgY29uc3VtcHRpb24gUkMgdXNlZCBhcyBJV0RHIGFuZC9vciBSVEMKKyAgICAgICAgICAgICBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBIU0UgKGhpZ2gtc3BlZWQgZXh0ZXJuYWwpOiAzMiBNSHogY3J5c3RhbCBvc2NpbGxhdG9yIHVzZWQgZGlyZWN0bHkgb3IKKyAgICAgICAgICAgICB0aHJvdWdoIHRoZSBQTEwgYXMgU3lzdGVtIGNsb2NrIHNvdXJjZS4gQ2FuIGJlIHVzZWQgYWxzbyBvcHRpb25hbGx5IGFzIFJUQyBjbG9jayBzb3VyY2UuCisKKyAgICAgICAgICgrKSBMU0UgKGxvdy1zcGVlZCBleHRlcm5hbCk6IDMyLjc2OCBLSHogb3NjaWxsYXRvciB1c2VkIG9wdGlvbmFsbHkgYXMgUlRDIGNsb2NrIHNvdXJjZQorICAgICAgICAgICAgIG9yIHRoZSBSRiBzeXN0ZW0gQXV0by13YWtldXAgZnJvbSBTdG9wIGFuZCBTdGFuZGJ5IG1vZGVzLgorCisgICAgICAgICAoKykgUExMIChjbG9ja2VkIGJ5IEhTSSwgSFNFIG9yIE1TSSkgcHJvdmlkaW5nIHVwIHRvIHRocmVlIGluZGVwZW5kZW50IG91dHB1dCBjbG9ja3M6CisgICAgICAgICAgICgrKykgVGhlIGZpcnN0IG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoaWdoIHNwZWVkIHN5c3RlbSBjbG9jayAodXAgdG8gNjRNSHopLgorICAgICAgICAgICAoKyspIFRoZSBzZWNvbmQgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgVVNCIEZTICg0OCBNSHopLAorICAgICAgICAgICAgICAgIHRoZSByYW5kb20gYW5hbG9nIGdlbmVyYXRvciAoPD00OCBNSHopCisgICAgICAgICAgICgrKykgVGhlIHRoaXJkIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIGFuIGFjY3VyYXRlIGNsb2NrIHRvIGFjaGlldmUKKyAgICAgICAgICAgICAgICBoaWdoLXF1YWxpdHkgYXVkaW8gcGVyZm9ybWFuY2Ugb24gU0FJIGludGVyZmFjZS4KKworICAgICAgICAgKCspIFBMTFNBSTEgKGNsb2NrZWQgYnkgSFNJLCBIU0Ugb3IgTVNJKSBwcm92aWRpbmcgdXAgdG8gdGhyZWUgaW5kZXBlbmRlbnQgb3V0cHV0IGNsb2NrczoKKyAgICAgICAgICAgKCsrKSBUaGUgZmlyc3Qgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgU0FSIEFEQyBjbG9jay4KKyAgICAgICAgICAgKCsrKSBUaGUgc2Vjb25kIG91dHB1dCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFVTQiBGUyAoNDggTUh6KSwKKyAgICAgICAgICAgICAgICB0aGUgcmFuZG9tIGFuYWxvZyBnZW5lcmF0b3IgKDw9NDggTUh6KS4KKyAgICAgICAgICAgKCsrKSBUaGUgVGhpcmQgb3V0cHV0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYWNjdXJhdGUgY2xvY2sgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgIGhpZ2gtcXVhbGl0eSBhdWRpbyBwZXJmb3JtYW5jZSBvbiBTQUkgaW50ZXJmYWNlLgorCisKKyAgICAgICAgICgrKSBDU1MgKENsb2NrIHNlY3VyaXR5IHN5c3RlbSk6IG9uY2UgZW5hYmxlZCwgaWYgYSBIU0UgY2xvY2sgZmFpbHVyZSBvY2N1cnMKKyAgICAgICAgICAgIChIU0UgdXNlZCBkaXJlY3RseSBvciB0aHJvdWdoIFBMTCBhcyBTeXN0ZW0gY2xvY2sgc291cmNlKSwgdGhlIFN5c3RlbSBjbG9jaworICAgICAgICAgICAgIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gTVNJIG9yIHRoZSBIU0kgb3NjaWxsYXRvciAoZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICAgICAgIFNUT1BXVUNLIGNvbmZpZ3VyYXRpb24pIGFuZCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmIGVuYWJsZWQuCisgICAgICAgICAgICAgVGhlIGludGVycnVwdCBpcyBsaW5rZWQgdG8gdGhlIENQVTEgYW5kIENQVTIgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLgorCisgICAgICAgICAoKykgTFNFQ1NTOiBvbmNlIGVuYWJsZWQsIGlmIGEgTFNFIGNsb2NrIGZhaWx1cmUgb2NjdXJzLCB0aGUgTFNFCisgICAgICAgICAgICAgY2xvY2sgaXMgbm8gbG9uZ2VyIHN1cHBsaWVkIHRvIHRoZSBSVEMgYnV0IG5vIGhhcmR3YXJlIGFjdGlvbiBpcyBtYWRlIHRvIHRoZSByZWdpc3RlcnMuIElmIHRoZQorICAgICAgICAgICAgIE1TSSB3YXMgaW4gUExMLW1vZGUsIHRoaXMgbW9kZSBpcyBkaXNhYmxlZC4KKyAgICAgICAgICAgICBJbiBTdGFuZGJ5IG1vZGUgYSB3YWtldXAgaXMgZ2VuZXJhdGVkLiBJbiBvdGhlciBtb2RlcyBhbiBpbnRlcnJ1cHQgY2FuIGJlIHNlbnQgdG8gd2FrZXVwCisgICAgICAgICAgICAgdGhlIHNvZnR3YXJlCisKKyAgICAgICAgICgrKSBNQ08gKG1pY3JvY29udHJvbGxlciBjbG9jayBvdXRwdXQpOiB1c2VkIHRvIG91dHB1dCBNU0ksIExTSTEsIExTSTIsIEhTSSwgTFNFLCBIU0UgKGJlZm9yZSBhbmQKKyAgICAgICAgICAgICBhZnRlciBzdGFiaWxpemF0aW9uKSwgU1lTQ0xLLCBIU0k0OCBvciBtYWluIFBMTCBjbG9jayAodGhyb3VnaCBhIGNvbmZpZ3VyYWJsZSBwcmVzY2FsZXIpIG9uIFBBOCwgUEI2ICYgUEExNSBwaW5zLgorCisgICAgWy4uXSBTeXN0ZW0sIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgY29uZmlndXJhdGlvbgorICAgICAgICAgKCspIFNldmVyYWwgY2xvY2sgc291cmNlcyBjYW4gYmUgdXNlZCB0byBkcml2ZSB0aGUgU3lzdGVtIGNsb2NrIChTWVNDTEspOiBNU0ksIEhTSSwKKyAgICAgICAgICAgICBIU0UgYW5kIG1haW4gUExMLgorICAgICAgICAgICAgIFRoZSBBSEIgY2xvY2sgKEhDTEsxKSBpcyBkZXJpdmVkIGZyb20gU3lzdGVtIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlCisgICAgICAgICAgICAgcHJlc2NhbGVyIGFuZCB1c2VkIHRvIGNsb2NrIHRoZSBDUFUsIG1lbW9yeSBhbmQgcGVyaXBoZXJhbHMgbWFwcGVkCisgICAgICAgICAgICAgb24gQUhCIGJ1cyAoRE1BLCBHUElPLi4uKS4gQVBCMSAoUENMSzEpIGFuZCBBUEIyIChQQ0xLMikgY2xvY2tzIGFyZSBkZXJpdmVkCisgICAgICAgICAgICAgZnJvbSBBSEIgY2xvY2sgdGhyb3VnaCBjb25maWd1cmFibGUgcHJlc2NhbGVycyBhbmQgdXNlZCB0byBjbG9jaworICAgICAgICAgICAgIHRoZSBwZXJpcGhlcmFscyBtYXBwZWQgb24gdGhlc2UgYnVzc2VzLiBZb3UgY2FuIHVzZQorICAgICAgICAgICAgICJAcmVmIEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCkiIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBmcmVxdWVuY2llcyBvZiB0aGVzZSBjbG9ja3MuCisgICAgICAgICAgICAgVGhlIEFIQjQgY2xvY2sgKEhDTEs0KSBpcyBkZXJpdmVkIGZyb20gU3lzdGVtIGNsb2NrIHRocm91Z2ggY29uZmlndXJhYmxlCisgICAgICAgICAgICAgcHJlc2NhbGVyIGFuZCB1c2VkIHRvIGNsb2NrIHRoZSBGTEFTSAorCisgICAgICAgICAtQC0gQWxsIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBTeXN0ZW0gY2xvY2sgKFNZU0NMSykgZXhjZXB0OgorCisgICAgICAgICAgICgrQCkgU0FJOiB0aGUgU0FJIGNsb2NrIGNhbiBiZSBkZXJpdmVkIGVpdGhlciBmcm9tIGEgc3BlY2lmaWMgUExMIChQTExTQUkxKSBvciAoUExMU1lTKSBvcgorICAgICAgICAgICAgICAgIGZyb20gYW4gZXh0ZXJuYWwgY2xvY2sgbWFwcGVkIG9uIHRoZSBTQUlfQ0tJTiBwaW4uCisgICAgICAgICAgICAgICAgWW91IGhhdmUgdG8gdXNlIEByZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0aGlzIGNsb2NrLgorICAgICAgICAgICAoK0ApIFJUQzogdGhlIFJUQyBjbG9jayBjYW4gYmUgZGVyaXZlZCBlaXRoZXIgZnJvbSB0aGUgTFNJLCBMU0Ugb3IgSFNFIGNsb2NrCisgICAgICAgICAgICAgICAgZGl2aWRlZCBieSAzMi4KKyAgICAgICAgICAgICAgICBZb3UgaGF2ZSB0byB1c2UgQHJlZiBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpIGFuZCBAcmVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHRvIGNvbmZpZ3VyZSB0aGlzIGNsb2NrLgorICAgICAgICAgICAoK0ApIFVTQiBGUyBhbmQgUk5HOiBVU0IgRlMgcmVxdWlyZXMgYSBmcmVxdWVuY3kgZXF1YWwgdG8gNDggTUh6CisgICAgICAgICAgICAgICAgdG8gd29yayBjb3JyZWN0bHksIHdoaWxlIFJORyBwZXJpcGhlcmFscyByZXF1aXJlcyBhIGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgIGVxdWFsIG9yIGxvd2VyIHRoYW4gdG8gNDggTUh6LiBUaGlzIGNsb2NrIGlzIGRlcml2ZWQgb2YgdGhlIG1haW4gUExMIG9yIFBMTFNBSTEKKyAgICAgICAgICAgICAgICB0aHJvdWdoIFBMTFEgZGl2aWRlci4gWW91IGhhdmUgdG8gZW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGFuZCB1c2UKKyAgICAgICAgICAgICAgICBAcmVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBmdW5jdGlvbiB0byBjb25maWd1cmUgdGhpcyBjbG9jay4KKyAgICAgICAgICAgKCtAKSBJV0RHIGNsb2NrIHdoaWNoIGlzIGFsd2F5cyB0aGUgTFNJIGNsb2NrLgorCisKKyAgICAgICAgICgrKSBUaGUgbWF4aW11bSBmcmVxdWVuY3kgb2YgdGhlIFNZU0NMSywgSENMSzEsIEhDTEs0LCBQQ0xLMSBhbmQgUENMSzIgaXMgNjQgTUh6LgorICAgICAgICAgICAgIFRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBvZiB0aGUgSENMSzIgaXMgMzIgTUh6LgorICAgICAgICAgICAgIFRoZSBjbG9jayBzb3VyY2UgZnJlcXVlbmN5IHNob3VsZCBiZSBhZGFwdGVkIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHZvbHRhZ2UgcmFuZ2UKKyAgICAgICAgICAgICBhcyBsaXN0ZWQgaW4gdGhlIFJlZmVyZW5jZSBNYW51YWwgIkNsb2NrIHNvdXJjZSBmcmVxdWVuY3kgdmVyc3VzIHZvbHRhZ2Ugc2NhbGluZyIgY2hhcHRlci4KKworICBAZW5kdmVyYmF0aW0KKworICAgICAgICAgICBUYWJsZSAxLiBIQ0xLNCBjbG9jayBmcmVxdWVuY3kuCisgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICB8IExhdGVuY3kgICAgICAgICB8ICAgIEhDTEs0IGNsb2NrIGZyZXF1ZW5jeSAoTUh6KSAgICAgIHwKKyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgdm9sdGFnZSByYW5nZSAxICB8IHZvbHRhZ2UgcmFuZ2UgMiAgfAorICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgMS4yIFYgICAgICAgfCAgICAgMS4wIFYgICAgICAgIHwKKyAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgIHwwV1MoMSBDUFUgY3ljbGVzKXwgICBIQ0xLNCA8PSAxOCAgICB8ICAgSENMSzQgPD0gNiAgICAgfAorICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgfDFXUygyIENQVSBjeWNsZXMpfCAgIEhDTEs0IDw9IDM2ICAgIHwgICBIQ0xLNCA8PSAxMiAgICB8CisgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICB8MldTKDMgQ1BVIGN5Y2xlcyl8ICAgSENMSzQgPD0gNTQgICAgfCAgIEhDTEs0IDw9IDE2ICAgIHwKKyAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgIHwzV1MoNCBDUFUgY3ljbGVzKXwgICBIQ0xLNCA8PSA2NCAgICB8ICAgSENMSzQgPD0gbi5hLiAgfAorICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmVzZXQgdGhlIFJDQyBjbG9jayBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlLgorICAqIEBub3RlICAgVGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUgb2YgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYmVsb3c6CisgICogICAgICAgICAgICAtIE1TSSBPTiBhbmQgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogICAgICAgICAgICAtIEhTRSwgSFNJLCBQTEwsIFBMTFNBSTEKKyAgKiAgICAgICAgICAgIC0gSENMSzEsIEhDTEsyLCBIQ0xLNCwgUENMSzEgYW5kIFBDTEsyIHByZXNjYWxlcnMgc2V0IHRvIDEuCisgICogICAgICAgICAgICAtIENTUywgTUNPIE9GRgorICAqICAgICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgKiAgICAgICAgICAgIC0gUGVyaXBoZXJhbCBjbG9ja3MKKyAgKiAgICAgICAgICAgIC0gTFNJLCBMU0UgYW5kIFJUQyBjbG9ja3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NfRGVJbml0KHZvaWQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogU2V0IE1TSU9OIGJpdCAqLworICBMTF9SQ0NfTVNJX0VuYWJsZSgpOworCisgIC8qIFdhaXQgdGlsbCBNU0kgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKExMX1JDQ19NU0lfSXNSZWFkeSgpID09IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IE1TSV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBTZXQgTVNJUkFOR0UgZGVmYXVsdCB2YWx1ZSAqLworICBMTF9SQ0NfTVNJX1NldFJhbmdlKExMX1JDQ19NU0lSQU5HRV82KTsKKworICAvKiBTZXQgTVNJVFJJTSBiaXRzIHRvIHRoZSByZXNldCB2YWx1ZSovCisgIExMX1JDQ19NU0lfU2V0Q2FsaWJUcmltbWluZygwKTsKKworICAvKiBTZXQgSFNJVFJJTSBiaXRzIHRvIHRoZSByZXNldCB2YWx1ZSovCisgIExMX1JDQ19IU0lfU2V0Q2FsaWJUcmltbWluZygweDQwVSk7CisKKyAgLyogR2V0IFN0YXJ0IFRpY2sqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFJlc2V0IENGR1IgcmVnaXN0ZXIgKE1TSSBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlKSAqLworICBDTEVBUl9SRUcoUkNDLT5DRkdSKTsKKworICAvKiBXYWl0IHRpbGwgTVNJIGlzIHJlYWR5ICovCisgIHdoaWxlIChSRUFEX0JJVChSQ0MtPkNGR1IsIFJDQ19DRkdSX1NXUykgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgSFNJT04sIEhTSUtFUk9OLCBIU0lBU0ZTLCBIU0VPTiwgUExMT04sIFBMTFNBSTExT04sIEhTRVBSRSBiaXRzICovCisgIENMRUFSX0JJVChSQ0MtPkNSLCBSQ0NfQ1JfSFNJT04gfCBSQ0NfQ1JfSFNJS0VST04gfCBSQ0NfQ1JfSFNJQVNGUyB8IFJDQ19DUl9IU0VPTiB8IFJDQ19DUl9IU0VQUkUgfCBSQ0NfQ1JfUExMT04gfCBSQ0NfQ1JfUExMU0FJMU9OKTsKKworICAvKiBSZXNldCBIU0VCWVAgYml0IG9uY2UgSFNFIGlzIE9GRiAqLworICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5ICovCisgIHdoaWxlIChMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogb25jZSBQTEwgaXMgT0ZGLCByZXNldCBQTExDRkdSIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKyAgV1JJVEVfUkVHKFJDQy0+UExMQ0ZHUiwgUkNDX1BMTENGR1JfUExMUl8wIHwgUkNDX1BMTENGR1JfUExMUV8wIHwgUkNDX1BMTENGR1JfUExMUF8xIHwgUkNDX1BMTENGR1JfUExMTl8wKTsKKworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5ICovCisgIHdoaWxlIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJMV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogb25jZSBQTExTQUkxIGlzIE9GRiwgcmVzZXQgUExMU0FJMUNGR1IgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworICBXUklURV9SRUcoUkNDLT5QTExTQUkxQ0ZHUiwgUkNDX1BMTFNBSTFDRkdSX1BMTFJfMCB8IFJDQ19QTExTQUkxQ0ZHUl9QTExRXzAgfCBSQ0NfUExMU0FJMUNGR1JfUExMUF8xIHwgUkNDX1BMTFNBSTFDRkdSX1BMTE5fMCk7CisKKyAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICBDTEVBUl9SRUcoUkNDLT5DSUVSKTsKKworICAvKiBDbGVhciBhbGwgaW50ZXJydXB0IGZsYWdzICovCisgIFdSSVRFX1JFRyhSQ0MtPkNJQ1IsIDB4RkZGRkZGRkZVKTsKKworICAvKiBFWFRDRkdSIHJlc2V0Ki8KKyAgTExfUkNDX1dyaXRlUmVnKEVYVENGR1IsIDB4MDAwMzAwMDBVKTsKKworICAvKiBVcGRhdGUgdGhlIFN5c3RlbUNvcmVDbG9jayBnbG9iYWwgdmFyaWFibGUgKi8KKyAgU3lzdGVtQ29yZUNsb2NrID0gTVNJX1ZBTFVFOworCisgIC8qIEFkYXB0IFN5c3RpY2sgaW50ZXJydXB0IHBlcmlvZCAqLworICBpZihIQUxfSW5pdFRpY2soVElDS19JTlRfUFJJT1JJVFkpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJDQyBPc2NpbGxhdG9ycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQorICAqICAgICAgICAgQHJlZiBSQ0NfT3NjSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBSQ0NfT3NjSW5pdFN0cnVjdCAgcG9pbnRlciB0byBhIEByZWYgUkNDX09zY0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJDQyBPc2NpbGxhdG9ycy4KKyAgKiBAbm90ZSAgIFRoZSBQTEwgaXMgbm90IGRpc2FibGVkIHdoZW4gdXNlZCBhcyBzeXN0ZW0gY2xvY2suCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDX09zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENoZWNrIE51bGwgcG9pbnRlciAqLworICBpZihSQ0NfT3NjSW5pdFN0cnVjdCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfT1NDSUxMQVRPUlRZUEUoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNU0kgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTVNJKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX01TSShSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX01TSUNBTElCUkFUSU9OX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDYWxpYnJhdGlvblZhbHVlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NU0lfQ0xPQ0tfUkFOR0UoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UpKTsKKworICAgIC8qIFdoZW4gdGhlIE1TSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBiZSBkaXNhYmxlZCAqLworICAgIGNvbnN0IHVpbnQzMl90IHRlbXBfc3lzY2xrc3JjID0gX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCk7CisgICAgY29uc3QgdWludDMyX3QgdGVtcF9wbGxvc2NzcmMgPSBfX0hBTF9SQ0NfR0VUX1BMTF9PU0NTT1VSQ0UoKTsKKyAgICBpZiAoKHRlbXBfc3lzY2xrc3JjID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX01TSSkgfHwKKyAgICAgICAgKCh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEspICYmICh0ZW1wX3BsbG9zY3NyYyA9PSBSQ0NfUExMU09VUkNFX01TSSkpKQorICAgIHsKKyAgICAgIGlmICgoTExfUkNDX01TSV9Jc1JlYWR5KCkgIT0gMFUpICYmIChSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJU3RhdGUgPT0gUkNDX01TSV9PRkYpKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogT3RoZXJ3aXNlLCBqdXN0IHRoZSBjYWxpYnJhdGlvbiBhbmQgTVNJIHJhbmdlIGNoYW5nZSBhcmUgYWxsb3dlZCAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUbyBjb3JyZWN0bHkgcmVhZCBkYXRhIGZyb20gRkxBU0ggbWVtb3J5LCB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIChMQVRFTkNZKQorICAgICAgICAgICBtdXN0IGJlIGNvcnJlY3RseSBwcm9ncmFtbWVkIGFjY29yZGluZyB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBBSEI0IGNsb2NrCisgICAgICAgICAgIGFuZCB0aGUgc3VwcGx5IHZvbHRhZ2Ugb2YgdGhlIGRldmljZS4gKi8KKyAgICAgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlID4gX19IQUxfUkNDX0dFVF9NU0lfUkFOR0UoKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZpcnN0IGluY3JlYXNlIG51bWJlciBvZiB3YWl0IHN0YXRlcyB1cGRhdGUgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgaWYgKFJDQ19TZXRGbGFzaExhdGVuY3lGcm9tTVNJUmFuZ2UoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFNlbGVjdHMgdGhlIE11bHRpcGxlIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2xvY2sgcmFuZ2UgLiovCisgICAgICAgICAgX19IQUxfUkNDX01TSV9SQU5HRV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UpOworICAgICAgICAgIC8qIEFkanVzdHMgdGhlIE11bHRpcGxlIFNwZWVkIG9zY2lsbGF0b3IgKE1TSSkgY2FsaWJyYXRpb24gdmFsdWUuKi8KKyAgICAgICAgICBfX0hBTF9SQ0NfTVNJX0NBTElCUkFUSU9OVkFMVUVfQURKVVNUKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDYWxpYnJhdGlvblZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFbHNlLCBrZWVwIGN1cnJlbnQgZmxhc2ggbGF0ZW5jeSB3aGlsZSBkZWNyZWFzaW5nIGFwcGxpZXMgKi8KKyAgICAgICAgICAvKiBTZWxlY3RzIHRoZSBNdWx0aXBsZSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNsb2NrIHJhbmdlIC4qLworICAgICAgICAgIF9fSEFMX1JDQ19NU0lfUkFOR0VfQ09ORklHKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlKTsKKyAgICAgICAgICAvKiBBZGp1c3RzIHRoZSBNdWx0aXBsZSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgICAgX19IQUxfUkNDX01TSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2FsaWJyYXRpb25WYWx1ZSk7CisKKyAgICAgICAgICAvKiBEZWNyZWFzZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgIGlmIChSQ0NfU2V0Rmxhc2hMYXRlbmN5RnJvbU1TSVJhbmdlKFJDQ19Pc2NJbml0U3RydWN0LT5NU0lDbG9ja1JhbmdlKSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGhlIFN5c3RlbUNvcmVDbG9jayBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICAgICAgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKCk7ICAKKyAgICAgICAgaWYoSEFMX0luaXRUaWNrKFRJQ0tfSU5UX1BSSU9SSVRZKSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgTVNJIFN0YXRlICovCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSVN0YXRlICE9IFJDQ19NU0lfT0ZGKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoTVNJKS4gKi8KKyAgICAgICAgX19IQUxfUkNDX01TSV9FTkFCTEUoKTsKKworICAgICAgICAvKiBHZXQgdGltZW91dCAqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBNU0kgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19NU0lfSXNSZWFkeSgpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IE1TSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU2VsZWN0cyB0aGUgTXVsdGlwbGUgU3BlZWQgb3NjaWxsYXRvciAoTVNJKSBjbG9jayByYW5nZSAuKi8KKyAgICAgICAgX19IQUxfUkNDX01TSV9SQU5HRV9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UpOworICAgICAgICAvKiBBZGp1c3RzIHRoZSBNdWx0aXBsZSBTcGVlZCBvc2NpbGxhdG9yIChNU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19NU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNhbGlicmF0aW9uVmFsdWUpOworCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoTVNJKS4gKi8KKyAgICAgICAgX19IQUxfUkNDX01TSV9ESVNBQkxFKCk7CisKKyAgICAgICAgLyogR2V0IHRpbWVvdXQgKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgTVNJIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChMTF9SQ0NfTVNJX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBNU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0UoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlKSk7CisKKyAgICAvKiBXaGVuIHRoZSBIU0UgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3IgY2xvY2sgc291cmNlIGZvciBQTEwgaW4gdGhlc2UgY2FzZXMgaXQgaXMgbm90IGFsbG93ZWQgdG8gYmUgZGlzYWJsZWQgKi8KKyAgICBjb25zdCB1aW50MzJfdCB0ZW1wX3N5c2Nsa3NyYyA9IF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpOworICAgIGNvbnN0IHVpbnQzMl90IHRlbXBfcGxsb3Njc3JjID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7CisgICAgaWYgKCh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpIHx8CisgICAgICAgICgodGVtcF9zeXNjbGtzcmMgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSAmJiAodGVtcF9wbGxvc2NzcmMgPT0gUkNDX1BMTFNPVVJDRV9IU0UpKSkKKyAgICB7CisgICAgICBpZiAoKExMX1JDQ19IU0VfSXNSZWFkeSgpICE9IDBVKSAmJiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID09IFJDQ19IU0VfT0ZGKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgbmV3IEhTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUpOworCisgICAgICAvKiBDaGVjayB0aGUgSFNFIFN0YXRlICovCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlICE9IFJDQ19IU0VfT0ZGKQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoTExfUkNDX0hTRV9Jc1JlYWR5KCkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZSAoTExfUkNDX0hTRV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhTSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0kpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNJKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNJX0NBTElCUkFUSU9OX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lDYWxpYnJhdGlvblZhbHVlKSk7CisKKyAgICAvKiBDaGVjayBpZiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgb3IgYXMgUExMIHNvdXJjZSB3aGVuIFBMTCBpcyBzZWxlY3RlZCBhcyBzeXN0ZW0gY2xvY2sgKi8KKyAgICBjb25zdCB1aW50MzJfdCB0ZW1wX3N5c2Nsa3NyYyA9IF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpOworICAgIGNvbnN0IHVpbnQzMl90IHRlbXBfcGxsb3Njc3JjID0gX19IQUxfUkNDX0dFVF9QTExfT1NDU09VUkNFKCk7CisgICAgaWYgKCh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0kpIHx8CisgICAgICAgICgodGVtcF9zeXNjbGtzcmMgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSAmJiAodGVtcF9wbGxvc2NzcmMgPT0gUkNDX1BMTFNPVVJDRV9IU0kpKSkKKyAgICB7CisgICAgICAvKiBXaGVuIEhTSSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBpdCB3aWxsIG5vdCBiZSBkaXNhYmxlZCAqLworICAgICAgaWYgKChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAwVSkgJiYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9PSBSQ0NfSFNJX09GRikpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBPdGhlcndpc2UsIGp1c3QgdGhlIGNhbGlicmF0aW9uIGlzIGFsbG93ZWQgKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgSGlnaCBTcGVlZCBvc2NpbGxhdG9yIChIU0kpIGNhbGlicmF0aW9uIHZhbHVlLiovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSUNhbGlicmF0aW9uVmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIEhTSSBTdGF0ZSAqLworICAgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSAhPSBSQ0NfSFNJX09GRikKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkuICovCisgICAgICAgIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBIU0kgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19IU0lfSXNSZWFkeSgpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZGp1c3RzIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkgY2FsaWJyYXRpb24gdmFsdWUuKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9DQUxJQlJBVElPTlZBTFVFX0FESlVTVChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIEhpZ2ggU3BlZWQgb3NjaWxsYXRvciAoSFNJKS4gKi8KKyAgICAgICAgX19IQUxfUkNDX0hTSV9ESVNBQkxFKCk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBIU0kgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19IU0lfSXNSZWFkeSgpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNJIENvbmZpZ3VyYXRpb24gKExTSTEgb3IgTFNJMikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgaWYgKCgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTEpIHx8IFwKKyAgICAgICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMikgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0xTSShSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUpKTsKKworICAgIC8qIENoZWNrIHRoZSBMU0kgU3RhdGUgKi8KKyAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlICE9IFJDQ19MU0lfT0ZGKQorICAgIHsKKyAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExTSTIgc2VsZWN0ZWQgYnkgZGVmYXVsdCAod2hlbiBTd2l0Y2ggT04pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kyKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMikKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0kyX0NBTElCUkFUSU9OX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0kyQ2FsaWJyYXRpb25WYWx1ZSkpOworCisgICAgICAgIC8qIDEuIENoZWNrIExTSTEgc3RhdGUgYW5kIGVuYWJsZSBpZiByZXF1aXJlZCAqLworICAgICAgICBpZiAoTExfUkNDX0xTSTFfSXNSZWFkeSgpID09IDBVKQorICAgICAgICB7CisgICAgICAgICAvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBMU0kxIGJlZm9yZSBlbmFibGluZyBMU0kyICovCisgICAgICAgICAgX19IQUxfUkNDX0xTSTFfRU5BQkxFKCk7CisKKyAgICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAgIC8qIFdhaXQgdGlsbCBMU0kxIGlzIHJlYWR5ICovCisgICAgICAgICAgd2hpbGUoTExfUkNDX0xTSTFfSXNSZWFkeSgpID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExTSTFfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIDIuIEVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSTIpIGFuZCBzZXQgdHJpbW1pbmcgdmFsdWUgKi8KKyAgICAgICAgX19IQUxfUkNDX0xTSTJfRU5BQkxFKCk7CisKKyAgICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAgIC8qIFdhaXQgdGlsbCBMU0kyIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChMTF9SQ0NfTFNJMl9Jc1JlYWR5KCkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTFNJMl9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWRqdXN0cyB0aGUgSW50ZXJuYWwgTG93IFNwZWUgb3NjaWxsYXRvciAoTFNJMikgY2FsaWJyYXRpb24gdmFsdWUgKi8KKyAgICAgICAgX19IQUxfUkNDX0xTSTJfQ0FMSUJSQVRJT05WQUxVRV9BREpVU1QoUkNDX09zY0luaXRTdHJ1Y3QtPkxTSTJDYWxpYnJhdGlvblZhbHVlKTsKKworICAgICAgICAvKiAzLiBEaXNhYmxlIExTSTEgKi8KKworICAgICAgICAvKiBMU0kxIHdhcyBpbml0aWFsbHkgbm90IGVuYWJsZSwgcmVxdWlyZSB0byBkaXNhYmxlIGl0ICovCisgICAgICAgIF9fSEFMX1JDQ19MU0kxX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTSTEgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19MU0kxX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0kxX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMU0kxIHNlbGVjdGVkIChvbmx5IGlmIExTSTIgT0ZGKS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgICAgIC8qIDEuIEVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSTEpLiAqLworICAgICAgICBfX0hBTF9SQ0NfTFNJMV9FTkFCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTSTEgaXMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19MU0kxX0lzUmVhZHkoKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0kxX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKjIuIFN3aXRjaCBPRkYgTFNJMiovCisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSTIpLiAqLworICAgICAgICBfX0hBTF9SQ0NfTFNJMl9ESVNBQkxFKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIExTSTIgaXMgZGlzYWJsZWQgKi8KKyAgICAgICAgd2hpbGUgKExMX1JDQ19MU0kyX0lzUmVhZHkoKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0kyX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAvKiBEaXNhYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoTFNJMikuICovCisgICAgICBfX0hBTF9SQ0NfTFNJMl9ESVNBQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBMU0kyIGlzIGRpc2FibGVkICovCisgICAgICB3aGlsZSAoTExfUkNDX0xTSTJfSXNSZWFkeSgpICE9IDBVKQorICAgICAgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTFNJMl9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgdGhlIEludGVybmFsIExvdyBTcGVlZCBvc2NpbGxhdG9yIChMU0kxKS4gKi8KKyAgICAgIF9fSEFMX1JDQ19MU0kxX0RJU0FCTEUoKTsKKworICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgLyogV2FpdCB0aWxsIExTSTEgaXMgZGlzYWJsZWQgKi8KKyAgICAgIHdoaWxlIChMTF9SQ0NfTFNJMV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMU0kxX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFNFIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFKQorICB7CisKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOworCisgICAgLyogVXBkYXRlIExTRSBjb25maWd1cmF0aW9uIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAgICAqLworICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KKworICAgIGlmIChIQUxfSVNfQklUX0NMUihQV1ItPkNSMSwgUFdSX0NSMV9EQlApKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiAqLworICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CisKKyAgICAgIC8qIFdhaXQgZm9yIEJhY2t1cCBkb21haW4gV3JpdGUgcHJvdGVjdGlvbiBkaXNhYmxlICovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFJDQ19EQlBfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB0aGUgbmV3IExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBfX0hBTF9SQ0NfTFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUpOworCisgICAgLyogQ2hlY2sgdGhlIExTRSBTdGF0ZSAqLworICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgIT0gUkNDX0xTRV9PRkYpCisgICAgeworICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLworICAgICAgd2hpbGUgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDBVKQorICAgICAgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0xTRV9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIGRpc2FibGVkICovCisgICAgICB3aGlsZSAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIU0k0OCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0k0OCkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSTQ4KQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0hTSTQ4KFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlKSk7CisKKyAgICAvKiBDaGVjayB0aGUgTFNJIFN0YXRlICovCisgICAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0k0OFN0YXRlICE9IFJDQ19IU0k0OF9PRkYpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBMb3cgU3BlZWQgb3NjaWxsYXRvciAoSFNJNDgpLiAqLworICAgICAgX19IQUxfUkNDX0hTSTQ4X0VOQUJMRSgpOworCisgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgICAvKiBXYWl0IHRpbGwgSFNJNDggaXMgcmVhZHkgKi8KKyAgICAgIHdoaWxlIChMTF9SQ0NfSFNJNDhfSXNSZWFkeSgpID09IDBVKQorICAgICAgeworICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNJNDhfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKEhTSTQ4KS4gKi8KKyAgICAgIF9fSEFMX1JDQ19IU0k0OF9ESVNBQkxFKCk7CisKKyAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIC8qIFdhaXQgdGlsbCBIU0k0OCBpcyBkaXNhYmxlZCAqLworICAgICAgd2hpbGUgKExMX1JDQ19IU0k0OF9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICB7CisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0k0OF9USU1FT1VUX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUExMIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSk7CisKKyAgaWYgKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgIT0gUkNDX1BMTF9OT05FKQorICB7CisgICAgLyogQ2hlY2sgaWYgdGhlIFBMTCBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBub3QgKi8KKyAgICBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgIT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKQorICAgIHsKKyAgICAgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlID09IFJDQ19QTExfT04pCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU09VUkNFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlKSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMTV9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0pKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExOX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTikpOworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFBfVkFMVUUoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExQKSk7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUV9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEpKTsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExSX1ZBTFVFKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUikpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIG1haW4gUExMLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgbWFpbiBQTEwgY2xvY2sgc291cmNlLCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZmFjdG9ycy4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTF9DT05GSUcoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExSKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIG1haW4gUExMLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0VOQUJMRSgpOworCisgICAgICAgIC8qIEVuYWJsZSBQTEwgU3lzdGVtIENsb2NrIG91dHB1dC4gKi8KKyAgICAgICAgX19IQUxfUkNDX1BMTENMS09VVF9FTkFCTEUoUkNDX1BMTF9TWVNDTEspOworCisgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgICAvKiBXYWl0IHRpbGwgUExMIGlzIHJlYWR5ICovCisgICAgICAgIHdoaWxlIChMTF9SQ0NfUExMX0lzUmVhZHkoKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIG1haW4gUExMLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMX0RJU0FCTEUoKTsKKworICAgICAgICAvKiBEaXNhYmxlIGFsbCBQTEwgb3V0cHV0cyB0byBzYXZlIHBvd2VyICovCisgICAgICAgIE1PRElGWV9SRUcoUkNDLT5QTExDRkdSLCBSQ0NfUExMQ0ZHUl9QTExTUkMsIFBMTFNPVVJDRV9OT05FKTsKKworICAgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0RJU0FCTEUoUkNDX1BMTF9TWVNDTEsgfCBSQ0NfUExMX1VTQkNMSyB8IFJDQ19QTExfU0FJMUNMSyk7CisKKworICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyBkaXNhYmxlZCAqLworICAgICAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRG8gbm90IHJldHVybiBIQUxfRVJST1IgaWYgcmVxdWVzdCByZXBlYXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIHVpbnQzMl90IHBsbGNmZ3IgPSBSQ0MtPlBMTENGR1I7CisgICAgICAKKyAgICAgIGlmKChSRUFEX0JJVChwbGxjZmdyLCBSQ0NfUExMQ0ZHUl9QTExTUkMpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU291cmNlKSB8fAorICAgICAgICAgKFJFQURfQklUKHBsbGNmZ3IsIFJDQ19QTExDRkdSX1BMTE0pICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTSkgfHwKKyAgICAgICAgICgoUkVBRF9CSVQocGxsY2ZnciwgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3MpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMTikgfHwKKyAgICAgICAgIChSRUFEX0JJVChwbGxjZmdyLCBSQ0NfUExMQ0ZHUl9QTExQKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFApIHx8CisgICAgICAgICAoUkVBRF9CSVQocGxsY2ZnciwgUkNDX1BMTENGR1JfUExMUSkgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExRKSB8fAorICAgICAgICAgKFJFQURfQklUKHBsbGNmZ3IsIFJDQ19QTExDRkdSX1BMTFIpICE9IFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUikpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUFUsIEFIQiBhbmQgQVBCIGJ1c3NlcyBjbG9ja3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFJDQ19DbGtJbml0U3RydWN0LgorICAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgIHBvaW50ZXIgdG8gYSBAcmVmIFJDQ19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSQ0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIEZMYXRlbmN5ICBGTEFTSCBMYXRlbmN5CisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8wICAgRkxBU0ggMCBMYXRlbmN5IGN5Y2xlCisgICogICAgICAgICAgICBAYXJnIEZMQVNIX0xBVEVOQ1lfMSAgIEZMQVNIIDEgTGF0ZW5jeSBjeWNsZQorICAqICAgICAgICAgICAgQGFyZyBGTEFTSF9MQVRFTkNZXzIgICBGTEFTSCAyIExhdGVuY3kgY3ljbGUKKyAgKiAgICAgICAgICAgIEBhcmcgRkxBU0hfTEFURU5DWV8zICAgRkxBU0ggMyBMYXRlbmN5IGN5Y2xlCisgICoKKyAgKiBAbm90ZSAgIFRoZSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5CisgICogICAgICAgICBhbmQgdXBkYXRlZCBieSBAcmVmIEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSBmdW5jdGlvbiBjYWxsZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24KKyAgKgorICAqIEBub3RlICAgVGhlIE1TSSBpcyB1c2VkIGJ5IGRlZmF1bHQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSBhZnRlcgorICAqICAgICAgICAgc3RhcnR1cCBmcm9tIFJlc2V0LCB3YWtlLXVwIGZyb20gU1RBTkRCWSBtb2RlLiBBZnRlciByZXN0YXJ0IGZyb20gUmVzZXQsCisgICogICAgICAgICB0aGUgTVNJIGZyZXF1ZW5jeSBpcyBzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUgNCBNSHouCisgICoKKyAgKiBAbm90ZSAgIFRoZSBIU0kgY2FuIGJlIHNlbGVjdGVkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgYWZ0ZXIKKyAgKiAgICAgICAgIGZyb20gU1RPUCBtb2RlcyBvciBpbiBjYXNlIG9mIGZhaWx1cmUgb2YgdGhlIEhTRSB1c2VkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKKyAgKiAgICAgICAgIGFzIHN5c3RlbSBjbG9jayAoaWYgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBDU1MgaXMgZW5hYmxlZCkuCisgICoKKyAgKiBAbm90ZSAgIEEgc3dpdGNoIGZyb20gb25lIGNsb2NrIHNvdXJjZSB0byBhbm90aGVyIG9jY3VycyBvbmx5IGlmIHRoZSB0YXJnZXQKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBpcyByZWFkeSAoY2xvY2sgc3RhYmxlIGFmdGVyIHN0YXJ0dXAgZGVsYXkgb3IgUExMIGxvY2tlZCkuCisgICogICAgICAgICBJZiBhIGNsb2NrIHNvdXJjZSB3aGljaCBpcyBub3QgeWV0IHJlYWR5IGlzIHNlbGVjdGVkLCB0aGUgc3dpdGNoIHdpbGwKKyAgKiAgICAgICAgIG9jY3VyIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBpcyByZWFkeS4KKyAgKgorICAqIEBub3RlICAgWW91IGNhbiB1c2UgQHJlZiBIQUxfUkNDX0dldENsb2NrQ29uZmlnKCkgZnVuY3Rpb24gdG8ga25vdyB3aGljaCBjbG9jayBpcworICAqICAgICAgICAgY3VycmVudGx5IHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZS4KKyAgKgorICAqIEBub3RlICAgRGVwZW5kaW5nIG9uIHRoZSBkZXZpY2Ugdm9sdGFnZSByYW5nZSwgdGhlIHNvZnR3YXJlIGhhcyB0byBzZXQgY29ycmVjdGx5CisgICogICAgICAgICBIUFJFWzM6MF0gYml0cyB0byBlbnN1cmUgdGhhdCBIQ0xLMSBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJlcXVlbmN5CisgICogICAgICAgICAoZm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBzZWN0aW9uIGFib3ZlICJJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMiKQorICAqIEByZXR2YWwgTm9uZQorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19DbG9ja0NvbmZpZyhSQ0NfQ2xrSW5pdFR5cGVEZWYgICpSQ0NfQ2xrSW5pdFN0cnVjdCwgdWludDMyX3QgRkxhdGVuY3kpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayBOdWxsIHBvaW50ZXIgKi8KKyAgaWYoUkNDX0Nsa0luaXRTdHJ1Y3QgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMT0NLVFlQRShSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTEFTSF9MQVRFTkNZKEZMYXRlbmN5KSk7CisKKyAgLyogVG8gY29ycmVjdGx5IHJlYWQgZGF0YSBmcm9tIEZMQVNIIG1lbW9yeSwgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyAoTEFURU5DWSkKKyAgICBtdXN0IGJlIGNvcnJlY3RseSBwcm9ncmFtbWVkIGFjY29yZGluZyB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBGTEFTSCBjbG9jaworICAgIChIQ0xLNCkgYW5kIHRoZSBzdXBwbHkgdm9sdGFnZSBvZiB0aGUgZGV2aWNlLiAqLworCisgIC8qIEluY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGhpZ2hlciBDUFUgZnJlcXVlbmN5ICovCisgIGlmIChGTGF0ZW5jeSA+IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCisgIHsKKyAgICAvKiBQcm9ncmFtIHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIHRvIHRoZSBMQVRFTkNZIGJpdHMgaW4gdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKEZMYXRlbmN5KTsKKworICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgICAgIG1lbW9yeSBieSByZWFkaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICB3aGlsZSAoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTEFURU5DWV9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIQ0xLMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09IFJDQ19DTE9DS1RZUEVfSENMSykKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSENMS3goUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIpKTsKKyAgICBMTF9SQ0NfU2V0QUhCUHJlc2NhbGVyKFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEtEaXZpZGVyKTsKKworICAgIC8qIEhDTEsxIHByZXNjYWxlciBmbGFnIHdoZW4gdmFsdWUgYXBwbGllZCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgd2hpbGUgKExMX1JDQ19Jc0FjdGl2ZUZsYWdfSFBSRSgpID09IDBVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQUkVTQ0FMRVJfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSENMSzIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9IQ0xLMikgPT0gUkNDX0NMT0NLVFlQRV9IQ0xLMikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSENMS3goUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMSzJEaXZpZGVyKSk7CisgICAgTExfQzJfUkNDX1NldEFIQlByZXNjYWxlcihSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLMkRpdmlkZXIpOworCisgICAgLyogSENMSzIgcHJlc2NhbGVyIGZsYWcgd2hlbiB2YWx1ZSBhcHBsaWVkICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICB3aGlsZSAoTExfUkNDX0lzQWN0aXZlRmxhZ19DMkhQUkUoKSA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUFJFU0NBTEVSX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIQ0xLNCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEs0KSA9PSBSQ0NfQ0xPQ0tUWVBFX0hDTEs0KQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IQ0xLeChSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLNERpdmlkZXIpKTsKKyAgICBMTF9SQ0NfU2V0QUhCNFByZXNjYWxlcihSQ0NfQ2xrSW5pdFN0cnVjdC0+QUhCQ0xLNERpdmlkZXIpOworCisgICAgLyogQUhCIHNoYXJlZCBwcmVzY2FsZXIgZmxhZyB3aGVuIHZhbHVlIGFwcGxpZWQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIHdoaWxlIChMTF9SQ0NfSXNBY3RpdmVGbGFnX1NIREhQUkUoKSA9PSAwVSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUFJFU0NBTEVSX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBDTEsxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLeChSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpKTsKKyAgICBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcihSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpOworCisgICAgLyogQVBCMSBwcmVzY2FsZXIgZmxhZyB3aGVuIHZhbHVlIGFwcGxpZWQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIHdoaWxlIChMTF9SQ0NfSXNBY3RpdmVGbGFnX1BQUkUxKCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBSRVNDQUxFUl9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQQ0xLMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMikgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUENMS3goUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKSk7CisgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIoKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikgPDwgM1UpOworCisgICAgLyogQVBCMiBwcmVzY2FsZXIgZmxhZyB3aGVuIHZhbHVlIGFwcGxpZWQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgIHdoaWxlIChMTF9SQ0NfSXNBY3RpdmVGbGFnX1BQUkUyKCkgPT0gMFUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBSRVNDQUxFUl9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNZU0NMSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9TWVNDTEspID09IFJDQ19DTE9DS1RZUEVfU1lTQ0xLKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19TWVNDTEtTT1VSQ0UoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSkpOworCisgICAgLyogSFNFIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyAgICBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX0hTRSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgSFNFIHJlYWR5IGZsYWcgKi8KKyAgICAgIGlmIChMTF9SQ0NfSFNFX0lzUmVhZHkoKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogUExMIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyAgICBlbHNlIGlmIChSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlID09IFJDQ19TWVNDTEtTT1VSQ0VfUExMQ0xLKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBQTEwgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAvKiBNU0kgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLworICAgIGVsc2UgaWYgKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9NU0kpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIE1TSSByZWFkeSBmbGFnICovCisgICAgICBpZiAoTExfUkNDX01TSV9Jc1JlYWR5KCkgPT0gMFUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIEhTSSBpcyBzZWxlY3RlZCBhcyBTeXN0ZW0gQ2xvY2sgU291cmNlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBIU0kgcmVhZHkgZmxhZyAqLworICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpID09IDBVKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgfQorCisgICAgLyogYXBwbHkgc3lzdGVtIGNsb2NrIHN3aXRjaCAqLworICAgIExMX1JDQ19TZXRTeXNDbGtTb3VyY2UoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSk7CisKKyAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIGNoZWNrIHN5c3RlbSBjbG9jayBzb3VyY2Ugc3dpdGNoIHN0YXR1cyAqLworICAgIHdoaWxlIChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSAhPSAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA8PCBSQ0NfQ0ZHUl9TV1NfUG9zKSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gQ0xPQ0tTV0lUQ0hfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYgKEZMYXRlbmN5IDwgX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSkKKyAgeworICAgIC8qIFByb2dyYW0gdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgdG8gdGhlIExBVEVOQ1kgYml0cyBpbiB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfRkxBU0hfU0VUX0xBVEVOQ1koRkxhdGVuY3kpOworCisgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCisgICAgbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLworICAgIHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpICE9IEZMYXRlbmN5KQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBMQVRFTkNZX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyogVXBkYXRlIHRoZSBTeXN0ZW1Db3JlQ2xvY2sgZ2xvYmFsIHZhcmlhYmxlICovCisgIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSgpOworICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UgY29uc2lkZXJpbmcgbmV3IHN5c3RlbSBjbG9ja3Mgc2V0dGluZ3MqLworICByZXR1cm4gSEFMX0luaXRUaWNrIChIQUxfR2V0VGlja1ByaW8oKSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgIFJDQyBjbG9ja3MgY29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKworICAgICgrKSBPdXB1dCBjbG9jayB0byBNQ08gcGluLgorICAgICgrKSBSZXRyaWV2ZSBjdXJyZW50IGNsb2NrIGZyZXF1ZW5jaWVzLgorICAgICgrKSBFbmFibGUgdGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMSBwaW4oUEE4KSBvciBNQzAyIHBpbiAoUEI2KSBvciBNQ08zIHBpbiAoUEExNSkuCisgICogQG5vdGUgICBQQTgsIFBCNiBvciBQQTE1IHNob3VsZCBiZSBjb25maWd1cmVkIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUkNDX01DT3ggIHNwZWNpZmllcyB0aGUgb3V0cHV0IGRpcmVjdGlvbiBmb3IgdGhlIGNsb2NrIHNvdXJjZS4KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMSAgQ2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBNQ08xIHBpbihQQTgpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzIgIENsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTUNPMiBwaW4oUEI2KQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08zICBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIE1DTzMgcGluKFBBMTUpCisgICogQHBhcmFtICBSQ0NfTUNPU291cmNlICBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9OT0NMT0NLICBNQ08gb3V0cHV0IGRpc2FibGVkLCBubyBjbG9jayBvbiBNQ08KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9TWVNDTEsgIHN5c3RlbSAgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX01TSSAgTVNJIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9IU0kgIEhTSSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNFICBIU0UgY2xvY2sgc2VsZWN0ZWQgYXMgTUNPIHNvdXJjZWUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9QTExDTEsgIG1haW4gUExMIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kxICBMU0kxIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0kyICBMU0kyIGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPMVNPVVJDRV9MU0UgIExTRSBjbG9jayBzZWxlY3RlZCBhcyBNQ08gc291cmNlCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX01DTzFTT1VSQ0VfSFNJNDggIEhTSTQ4IGNsb2NrIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UgZm9yIGRldmljZXMgd2l0aCBIU0k0OAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ08xU09VUkNFX0hTRV9CRUZPUkVfU1RBQiAgSFNFIGNsb2NrIGJlZm9yZSBzdGFiaWxpemF0aW9uIHNlbGVjdGVkIGFzIE1DTyBzb3VyY2UKKyAgKiBAcGFyYW0gIFJDQ19NQ09EaXYgIHNwZWNpZmllcyB0aGUgTUNPIHByZXNjYWxlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19NQ09ESVZfMSAgbm8gZGl2aXNpb24gYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzIgIGRpdmlzaW9uIGJ5IDIgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzQgIGRpdmlzaW9uIGJ5IDQgYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzggIGRpdmlzaW9uIGJ5IDggYXBwbGllZCB0byBNQ08gY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTUNPRElWXzE2ICBkaXZpc2lvbiBieSAxNiBhcHBsaWVkIHRvIE1DTyBjbG9jaworICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX01DT0NvbmZpZyh1aW50MzJfdCBSQ0NfTUNPeCwgdWludDMyX3QgUkNDX01DT1NvdXJjZSwgdWludDMyX3QgUkNDX01DT0RpdikKK3sKKyAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3Q7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08oUkNDX01DT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ09ESVYoUkNDX01DT0RpdikpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX01DTzFTT1VSQ0UoUkNDX01DT1NvdXJjZSkpOworCisgIC8qIENvbW1vbiBHUElPIGluaXQgcGFyYW1ldGVycyAqLworICBHUElPX0luaXRTdHJ1Y3QuTW9kZSAgICAgID0gR1BJT19NT0RFX0FGX1BQOworICBHUElPX0luaXRTdHJ1Y3QuU3BlZWQgICAgID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgR1BJT19Jbml0U3RydWN0LlB1bGwgICAgICA9IEdQSU9fTk9QVUxMOworCisgIC8qIFJDQ19NQ08xICovCisgIGlmKFJDQ19NQ094ID09IFJDQ19NQ08xKQorICB7CisgICAgLyogTUNPMSBDbG9jayBFbmFibGUgKi8KKyAgICBfX01DTzFfQ0xLX0VOQUJMRSgpOworICAgIC8qIENvbmZpZ3VlIHRoZSBNQ08xIHBpbiBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSAqLworICAgIEdQSU9fSW5pdFN0cnVjdC5QaW4gICAgICAgPSBNQ08xX1BJTjsKKyAgICBHUElPX0luaXRTdHJ1Y3QuQWx0ZXJuYXRlID0gR1BJT19BRjBfTUNPOworICAgIEhBTF9HUElPX0luaXQoTUNPMV9HUElPX1BPUlQsICZHUElPX0luaXRTdHJ1Y3QpOworCisgIH0KKyAgZWxzZSBpZiAoUkNDX01DT3ggPT0gUkNDX01DTzIpCisgIHsKKyAgICAvKiBNQ08yIENsb2NrIEVuYWJsZSAqLworICAgIF9fTUNPMl9DTEtfRU5BQkxFKCk7CisgICAgLyogQ29uZmlndWUgdGhlIE1DTzIgcGluIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlICovCisgICAgR1BJT19Jbml0U3RydWN0LlBpbiAgICAgICA9IE1DTzJfUElOOworICAgIEdQSU9fSW5pdFN0cnVjdC5BbHRlcm5hdGUgPSBHUElPX0FGMF9NQ087CisgICAgSEFMX0dQSU9fSW5pdChNQ08yX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdCk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBNQ08zIENsb2NrIEVuYWJsZSAqLworICAgIF9fTUNPM19DTEtfRU5BQkxFKCk7CisgICAgLyogQ29uZmlndWUgdGhlIE1DTzMgcGluIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlICovCisgICAgR1BJT19Jbml0U3RydWN0LlBpbiAgICAgICA9IE1DTzNfUElOOworICAgIEdQSU9fSW5pdFN0cnVjdC5BbHRlcm5hdGUgPSBHUElPX0FGNl9NQ087CisgICAgSEFMX0dQSU9fSW5pdChNQ08zX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdCk7CisgIH0KKworICAgIC8qIE1hc2sgTUNPU0VMW10gYW5kIE1DT1BSRVtdIGJpdHMgdGhlbiBzZXQgTUNPIGNsb2NrIHNvdXJjZSBhbmQgcHJlc2NhbGVyICovCisgICAgTExfUkNDX0NvbmZpZ01DTyhSQ0NfTUNPU291cmNlLCBSQ0NfTUNPRGl2KTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNZU0NMSyBmcmVxdWVuY3kuCisgICoKKyAgKiBAbm90ZSAgIFRoZSBzeXN0ZW0gIGNvbXB1dGVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgbm90IHRoZSByZWFsCisgICogICAgICAgICBmcmVxdWVuY3kgaW4gdGhlIGNoaXAuIEl0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHByZWRlZmluZWQKKyAgKiAgICAgICAgIGNvbnN0YW50IGFuZCB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlOgorICAqIEBub3RlICAgICBJZiBTWVNDTEsgc291cmNlIGlzIE1TSSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gTVNJIHJhbmdlCisgICogQG5vdGUgICAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNJLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0lfVkFMVUUoKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0UsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKikKKyAgKiBAbm90ZSAgICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKiksCisgICogICAgICAgICAgIEhTSV9WQUxVRSgqKSBvciBNU0kgVmFsdWUgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4KKyAgKiBAbm90ZSAgICAgKCopIEhTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gc3RtMzJ3Ynh4X2hhbF9jb25mLmggZmlsZSAoZGVmYXVsdCB2YWx1ZQorICAqICAgICAgICAgICAgICAgMTYgTUh6KSBidXQgdGhlIHJlYWwgdmFsdWUgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYXRpb25zCisgICogICAgICAgICAgICAgICBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4KKyAgKiBAbm90ZSAgICAgKCoqKSBIU0VfVkFMVUUgaXMgYSBjb25zdGFudCBkZWZpbmVkIGluIHN0bTMyd2J4eF9oYWxfY29uZi5oIGZpbGUgKGRlZmF1bHQgdmFsdWUKKyAgKiAgICAgICAgICAgICAgICAzMiBNSHopLCB1c2VyIGhhcyB0byBlbnN1cmUgdGhhdCBIU0VfVkFMVUUgaXMgc2FtZSBhcyB0aGUgcmVhbAorICAqICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCB1c2VkLiBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gbWF5CisgICogICAgICAgICAgICAgICAgaGF2ZSB3cm9uZyByZXN1bHQuCisgICoKKyAgKiBAbm90ZSAgIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBub3QgY29ycmVjdCB3aGVuIHVzaW5nIGZyYWN0aW9uYWwKKyAgKiAgICAgICAgIHZhbHVlIGZvciBIU0UgY3J5c3RhbC4KKyAgKgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjb21wdXRlIHRoZQorICAqICAgICAgICAgYmF1ZHJhdGUgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHBlcmlwaGVyYWxzIG9yIGNvbmZpZ3VyZSBvdGhlciBwYXJhbWV0ZXJzLgorICAqCisgICogQG5vdGUgICBFYWNoIHRpbWUgU1lTQ0xLIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICAqICAgICAgICAgcmlnaHQgU1lTQ0xLIHZhbHVlLiBPdGhlcndpc2UsIGFueSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbmNvcnJlY3QuCisgICoKKyAgKgorICAqIEByZXR2YWwgU1lTQ0xLIGZyZXF1ZW5jeQorICAqLwordWludDMyX3QgSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEodm9pZCkKK3sKKyAgdWludDMyX3QgcGxsc291cmNlOworICB1aW50MzJfdCBzeXNjbG9ja2ZyZXEsIHBsbGlucHV0ZnJlcTsKKyAgY29uc3QgdWludDMyX3QgdGVtcF9zeXNjbGtzcmMgPSBfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKTsKKyAgCisgIGlmICh0ZW1wX3N5c2Nsa3NyYyA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19NU0kpCisgIHsKKyAgICAvKiBSZXRyaWV2ZSBNU0kgZnJlcXVlbmN5IHJhbmdlIGluIEhaKi8KKyAgICAvKiBNU0kgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlICovCisgICAgc3lzY2xvY2tmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICB9CisgIGVsc2UgaWYgKHRlbXBfc3lzY2xrc3JjID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkKKyAgeworICAgIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgICBzeXNjbG9ja2ZyZXEgPSBIU0lfVkFMVUU7CisgIH0KKyAgZWxzZSBpZiAodGVtcF9zeXNjbGtzcmMgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNFKQorICB7CisgICAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLworICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICAgeworICAgICAgIHN5c2Nsb2NrZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgIHN5c2Nsb2NrZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFBMTCB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisgICAgc3dpdGNoIChwbGxzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBSQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSQ0NfUExMU09VUkNFX01TSTogIC8qIE1TSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN5c2Nsb2NrZnJlcSA9IF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwgTExfUkNDX1BMTF9HZXROKCksIExMX1JDQ19QTExfR2V0UigpKTsKKyAgfQorCisgIHJldHVybiBzeXNjbG9ja2ZyZXE7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBIQ0xLIGZyZXF1ZW5jeS4KKyAgKiBAcmV0dmFsIEhDTEsgZnJlcXVlbmN5IGluIEh6CisgICovCit1aW50MzJfdCBIQUxfUkNDX0dldEhDTEtGcmVxKHZvaWQpCit7CisgIC8qIEdldCBTeXNDbG9jayBhbmQgQ29tcHV0ZSBIQ0xLMSBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICgodWludDMyX3QpKF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBIQ0xLMiBmcmVxdWVuY3kuCisgICogQHJldHZhbCBIQ0xLMiBmcmVxdWVuY3kgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0SENMSzJGcmVxKHZvaWQpCit7CisgIC8qIEdldCBTeXNDbG9jayBhbmQgQ29tcHV0ZSBIQ0xLMiBmcmVxdWVuY3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgcmV0dXJuICgodWludDMyX3QpKF9fTExfUkNDX0NBTENfSENMSzJfRlJFUShIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBMTF9DMl9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBIQ0xLNCBmcmVxdWVuY3kuCisgICogQHJldHZhbCBIQ0xLNCBmcmVxdWVuY3kgaW4gSHoKKyAgKi8KK3VpbnQzMl90IEhBTF9SQ0NfR2V0SENMSzRGcmVxKHZvaWQpCit7CisgIC8qIEdldCBTeXNDbG9jayBhbmQgQ29tcHV0ZSBBSEI0IGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKCh1aW50MzJfdCkoX19MTF9SQ0NfQ0FMQ19IQ0xLNF9GUkVRKEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIExMX1JDQ19HZXRBSEI0UHJlc2NhbGVyKCkpKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBQQ0xLMSBmcmVxdWVuY3kuCisgICogQG5vdGUgICBFYWNoIHRpbWUgUENMSzEgY2hhbmdlcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlCisgICogICAgICAgICByaWdodCBQQ0xLMSB2YWx1ZS4gT3RoZXJ3aXNlLCBhbnkgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqIEByZXR2YWwgUENMSzEgZnJlcXVlbmN5IGluIEh6CisgICovCit1aW50MzJfdCBIQUxfUkNDX0dldFBDTEsxRnJlcSh2b2lkKQoreworICAvKiBHZXQgSENMSyBzb3VyY2UgYW5kIENvbXB1dGUgUENMSzEgZnJlcXVlbmN5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIHJldHVybiAoKHVpbnQzMl90KShfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpLCBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcigpKSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUENMSzIgZnJlcXVlbmN5LgorICAqIEBub3RlICAgRWFjaCB0aW1lIFBDTEsyIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZQorICAqICAgICAgICAgcmlnaHQgUENMSzIgdmFsdWUuIE90aGVyd2lzZSwgYW55IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGluY29ycmVjdC4KKyAgKiBAcmV0dmFsIFBDTEsyIGZyZXF1ZW5jeSBpbiBIegorICAqLwordWludDMyX3QgSEFMX1JDQ19HZXRQQ0xLMkZyZXEodm9pZCkKK3sKKyAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsyIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICByZXR1cm4gKCh1aW50MzJfdCkoX19MTF9SQ0NfQ0FMQ19QQ0xLMl9GUkVRKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSwgTExfUkNDX0dldEFQQjJQcmVzY2FsZXIoKSkpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFJDQ19Pc2NJbml0U3RydWN0IGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwKKyAgKiAgICAgICAgIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIFJDQ19Pc2NJbml0U3RydWN0ICBwb2ludGVyIHRvIGFuIFJDQ19Pc2NJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgd2lsbCBiZSBjb25maWd1cmVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX0dldE9zY0NvbmZpZyhSQ0NfT3NjSW5pdFR5cGVEZWYgICpSQ0NfT3NjSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKFJDQ19Pc2NJbml0U3RydWN0ICE9ICh2b2lkICopTlVMTCk7CisKKyAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBPc2NpbGxhdG9yIHR5cGUgcGFyYW1ldGVyIC0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJIHwgUkNDX09TQ0lMTEFUT1JUWVBFX01TSSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSB8IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kxIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJNDg7CisKKworICAvKiBHZXQgdGhlIEhTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChSQ0MtPkNSICYgUkNDX0NSX0hTRUJZUCkgPT0gUkNDX0NSX0hTRUJZUCkKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfQllQQVNTOworICB9CisgIGVsc2UgaWYgKChSQ0MtPkNSICYgUkNDX0NSX0hTRU9OKSA9PSBSQ0NfQ1JfSFNFT04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9IFJDQ19IU0VfT0ZGOworICB9CisKKyAgLyogR2V0IHRoZSBNU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoUkNDLT5DUiAmIFJDQ19DUl9NU0lPTikgPT0gUkNDX0NSX01TSU9OKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPk1TSVN0YXRlID0gUkNDX01TSV9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJU3RhdGUgPSBSQ0NfTVNJX09GRjsKKyAgfQorICBSQ0NfT3NjSW5pdFN0cnVjdC0+TVNJQ2FsaWJyYXRpb25WYWx1ZSAgPSBMTF9SQ0NfTVNJX0dldENhbGliVHJpbW1pbmcoKTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QtPk1TSUNsb2NrUmFuZ2UgICAgICAgID0gTExfUkNDX01TSV9HZXRSYW5nZSgpOworCisgIC8qIEdldCB0aGUgSFNJIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfSFNJT04pID09IFJDQ19DUl9IU0lPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSA9IFJDQ19IU0lfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7CisgIH0KKworICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSA9IExMX1JDQ19IU0lfR2V0Q2FsaWJUcmltbWluZygpOworCisgIC8qIEdldCB0aGUgTFNFIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+QkRDUiAmIFJDQ19CRENSX0xTRUJZUCkgPT0gUkNDX0JEQ1JfTFNFQllQKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9CWVBBU1M7CisgIH0KKyAgZWxzZSBpZiAoKFJDQy0+QkRDUiAmIFJDQ19CRENSX0xTRU9OKSA9PSBSQ0NfQkRDUl9MU0VPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CisgIH0KKyAgZWxzZQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlID0gUkNDX0xTRV9PRkY7CisgIH0KKworICAvKiBHZXQgdGhlIExTSSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kxb24gPSAoUkNDLT5DU1IgJiBSQ0NfQ1NSX0xTSTFPTik7CisgIGNvbnN0IHVpbnQzMl90IHRlbXBfbHNpMm9uID0gKFJDQy0+Q1NSICYgUkNDX0NTUl9MU0kyT04pOworICBpZiAoKHRlbXBfbHNpMW9uID09IFJDQ19DU1JfTFNJMU9OKSB8fCAodGVtcF9sc2kyb24gPT0gUkNDX0NTUl9MU0kyT04pKQorICB7CisgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUgPSBSQ0NfTFNJX09GRjsKKyAgfQorCisgIC8qIEdldCB0aGUgSFNJNDggY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+Q1JSQ1IgJiBSQ0NfQ1JSQ1JfSFNJNDhPTikgPT0gUkNDX0NSUkNSX0hTSTQ4T04pCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJNDhTdGF0ZSA9IFJDQ19IU0k0OF9PTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJNDhTdGF0ZSA9IFJDQ19IU0k0OF9PRkY7CisgIH0KKworCisgIC8qIEdldCB0aGUgUExMIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfUExMT04pID09IFJDQ19DUl9QTExPTikKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09OOworICB9CisgIGVsc2UKKyAgeworICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09GRjsKKyAgfQorICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0gICAgICA9IExMX1JDQ19QTExfR2V0RGl2aWRlcigpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4gICAgICA9IExMX1JDQ19QTExfR2V0TigpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFAgICAgICA9IExMX1JDQ19QTExfR2V0UCgpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFEgICAgICA9IExMX1JDQ19QTExfR2V0USgpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIgICAgICA9IExMX1JDQ19QTExfR2V0UigpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbAorICAqICAgICAgICAgUkNDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgUkNDX0Nsa0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgUkNDX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNvbmZpZ3VyZWQuCisgICogQHBhcmFtICBwRkxhdGVuY3kgICAgICAgICBQb2ludGVyIG9uIHRoZSBGbGFzaCBMYXRlbmN5LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX0dldENsb2NrQ29uZmlnKFJDQ19DbGtJbml0VHlwZURlZiAgKlJDQ19DbGtJbml0U3RydWN0LCB1aW50MzJfdCAqcEZMYXRlbmN5KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oUkNDX0Nsa0luaXRTdHJ1Y3QgIT0gKHZvaWQgKilOVUxMKTsKKyAgYXNzZXJ0X3BhcmFtKHBGTGF0ZW5jeSAhPSAodm9pZCAqKU5VTEwpOworCisgIC8qIFNldCBhbGwgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgQ2xvY2sgdHlwZSBwYXJhbWV0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlID0gKFJDQ19DTE9DS1RZUEVfU1lTQ0xLIHwgUkNDX0NMT0NLVFlQRV9IQ0xLIHwgUkNDX0NMT0NLVFlQRV9QQ0xLMSB8IFJDQ19DTE9DS1RZUEVfUENMSzIgfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19DTE9DS1RZUEVfSENMSzIgfCBSQ0NfQ0xPQ0tUWVBFX0hDTEs0KTsKKworICAvKiBHZXQgdGhlIFNZU0NMSyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9IExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKTsKKworICAvKiBHZXQgdGhlIEhDTEsgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMS0RpdmlkZXIgPSBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCk7CisKKyAgLyogR2V0IHRoZSBBUEIxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlciA9IExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCk7CisKKyAgLyogR2V0IHRoZSBBUEIyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlciA9IExMX1JDQ19HZXRBUEIyUHJlc2NhbGVyKCk7CisKKyAgLyogR2V0IHRoZSBBSEJDTEsyRGl2aWRlciBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFJDQ19DbGtJbml0U3RydWN0LT5BSEJDTEsyRGl2aWRlciA9IExMX0MyX1JDQ19HZXRBSEJQcmVzY2FsZXIoKTsKKworICAvKiBHZXQgdGhlIEFIQkNMSzREaXZpZGVyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFIQkNMSzREaXZpZGVyID0gTExfUkNDX0dldEFIQjRQcmVzY2FsZXIoKTsKKworICAvKiBHZXQgdGhlIEZsYXNoIFdhaXQgU3RhdGUgKExhdGVuY3kpIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgKnBGTGF0ZW5jeSA9IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgICogQG5vdGUgICBJZiBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQgb24gdGhlIEhTRSBvc2NpbGxhdG9yIGNsb2NrLCB0aGlzIG9zY2lsbGF0b3IKKyAgKiAgICAgICAgIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYW5kIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgdG8gaW5mb3JtIHRoZQorICAqICAgICAgICAgc29mdHdhcmUgYWJvdXQgdGhlIGZhaWx1cmUgKENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQsIENTU0kpLAorICAqICAgICAgICAgYWxsb3dpbmcgdGhlIE1DVSB0byBwZXJmb3JtIHJlc2N1ZSBvcGVyYXRpb25zLiBUaGUgQ1NTSSBpcyBsaW5rZWQgdG8KKyAgKiAgICAgICAgIENQVTEgYW5kIENQVTIgTk1JIChOb24tTWFza2FibGUgSW50ZXJydXB0KSBleGNlcHRpb24gdmVjdG9yLgorICAqIEBub3RlICAgVGhlIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBjYW4gb25seSBiZSBjbGVhcmVkIGJ5IHJlc2V0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDX0VuYWJsZUNTUyh2b2lkKQoreworICBMTF9SQ0NfSFNFX0VuYWJsZUNTUygpOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgSFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAbm90ZSAgVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCB1bmRlciB0aGUgTk1JX0hhbmRsZXIoKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ19OTUlfSVJRSGFuZGxlcih2b2lkKQoreworICAvKiBDaGVjayBSQ0MgQ1NTRiBpbnRlcnJ1cHQgZmxhZyAgKi8KKyAgaWYgKF9fSEFMX1JDQ19HRVRfSVQoUkNDX0lUX0hTRUNTUykpCisgIHsKKyAgICAvKiBSQ0MgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ19DU1NDYWxsYmFjaygpOworCisgICAgLyogQ2xlYXIgUkNDIENTUyBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1JDQ19DTEVBUl9JVChSQ0NfSVRfSFNFQ1NTKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgSFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUkNDX0NTU0NhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NfQ1NTQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUkNDX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgIFVwZGF0ZSBudW1iZXIgb2YgRmxhc2ggd2FpdCBzdGF0ZXMgaW4gbGluZSB3aXRoIE1TSSByYW5nZSBhbmQgY3VycmVudAorICAgICAgICAgICAgdm9sdGFnZSByYW5nZS4KKyAgKiBAcGFyYW0gIE1TSV9SYW5nZSAgTVNJIHJhbmdlIHZhbHVlIGZyb20gQHJlZiBSQ0NfTVNJUkFOR0VfMCB0byBAcmVmIFJDQ19NU0lSQU5HRV8xMQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ19TZXRGbGFzaExhdGVuY3lGcm9tTVNJUmFuZ2UodWludDMyX3QgTVNJX1JhbmdlKQoreworICB1aW50MzJfdCBmbGFzaF9jbGtzcmNmcmVxLCBtc2lmcmVxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfTVNJX0NMT0NLX1JBTkdFKE1TSV9SYW5nZSkpOworICAKKyAgLyogTVNJIGZyZXF1ZW5jeSByYW5nZSBpbiBIeiAqLworICBpZihNU0lfUmFuZ2UgPiBSQ0NfTVNJUkFOR0VfMTEpCisgIHsKKyAgICBtc2lmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShSQ0NfTVNJUkFOR0VfMTEpOworICB9CisgIGVsc2UKKyAgeworICAgIG1zaWZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKE1TSV9SYW5nZSk7CisgIH0KKyAgCisgIGZsYXNoX2Nsa3NyY2ZyZXEgPSBfX0xMX1JDQ19DQUxDX0hDTEs0X0ZSRVEobXNpZnJlcSwgTExfUkNDX0dldEFIQjRQcmVzY2FsZXIoKSk7CisKKyAgcmV0dXJuIFJDQ19TZXRGbGFzaExhdGVuY3koKGZsYXNoX2Nsa3NyY2ZyZXEgLyBNRUdBX0haKSwgSEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSgpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFVwZGF0ZSBudW1iZXIgb2YgRmxhc2ggd2FpdCBzdGF0ZXMuCisgICogQHBhcmFtICBGbGFzaF9DbGtTcmNGcmVxICBGbGFzaCBDbG9jayBTb3VyY2UgKGluIE1IeikKKyAgKiBAcGFyYW0gIFZDT1JFX1ZvbHRhZ2UgICAgIEN1cnJlbnQgVmNvcmUgdm9sdGFnZSAoUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMSBvciBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUyKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ19TZXRGbGFzaExhdGVuY3kodWludDMyX3QgRmxhc2hfQ2xrU3JjRnJlcSwgdWludDMyX3QgVkNPUkVfVm9sdGFnZSkKK3sKKyAgLyogRmxhc2ggQ2xvY2sgc291cmNlIChIQ0xLNCkgcmFuZ2UgaW4gTUh6IHdpdGggYSBWQ09SRSBpcyByYW5nZTEgKi8KKyAgY29uc3QgdWludDMyX3QgRkxBU0hfQ0xLX1NSQ19SQU5HRV9WT1MxW10gPSB7MThVTCwgMzZVTCwgNTRVTCwgNjRVTH07CisgIC8qIEZsYXNoIENsb2NrIHNvdXJjZSAoSENMSzQpIHJhbmdlIGluIE1IeiB3aXRoIGEgVkNPUkUgaXMgcmFuZ2UyICovCisgIGNvbnN0IHVpbnQzMl90IEZMQVNIX0NMS19TUkNfUkFOR0VfVk9TMltdID0gezZVTCwgMTJVTCwgMTZVTH07CisgIC8qIEZsYXNoIExhdGVuY3kgcmFuZ2UgKi8KKyAgY29uc3QgdWludDMyX3QgRkxBU0hfTEFURU5DWV9SQU5HRVtdID0ge0ZMQVNIX0xBVEVOQ1lfMCwgRkxBU0hfTEFURU5DWV8xLCBGTEFTSF9MQVRFTkNZXzIsIEZMQVNIX0xBVEVOQ1lfM307CisgIHVpbnQzMl90IGxhdGVuY3kgICA9IEZMQVNIX0xBVEVOQ1lfMDsgIC8qIGRlZmF1bHQgdmFsdWUgMFdTICovCisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBpZiAoVkNPUkVfVm9sdGFnZSA9PSBQV1JfUkVHVUxBVE9SX1ZPTFRBR0VfU0NBTEUxKQorICB7CisgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgX19DT1VOVE9GKEZMQVNIX0NMS19TUkNfUkFOR0VfVk9TMSk7IGluZGV4KyspCisgICAgeworICAgICAgaWYgKEZsYXNoX0Nsa1NyY0ZyZXEgPD0gRkxBU0hfQ0xLX1NSQ19SQU5HRV9WT1MxW2luZGV4XSkKKyAgICAgIHsKKyAgICAgICAgbGF0ZW5jeSA9IEZMQVNIX0xBVEVOQ1lfUkFOR0VbaW5kZXhdOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSAgLyogUFdSX1JFR1VMQVRPUl9WT0xUQUdFX1NDQUxFMiAqLworICB7CisgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgX19DT1VOVE9GKEZMQVNIX0NMS19TUkNfUkFOR0VfVk9TMik7IGluZGV4KyspCisgICAgeworICAgICAgaWYgKEZsYXNoX0Nsa1NyY0ZyZXEgPD0gRkxBU0hfQ0xLX1NSQ19SQU5HRV9WT1MyW2luZGV4XSkKKyAgICAgIHsKKyAgICAgICAgbGF0ZW5jeSA9IEZMQVNIX0xBVEVOQ1lfUkFOR0VbaW5kZXhdOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShsYXRlbmN5KTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgICBtZW1vcnkgYnkgcmVhZGluZyB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCisgIHdoaWxlIChfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpICE9IGxhdGVuY3kpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTEFURU5DWV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfcmNjX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9yY2NfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM2MTFkCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfcmNjX2V4LmMKQEAgLTAsMCArMSwyMjczIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9yY2NfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRXh0ZW5kZWQgUkNDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEV4dGVuZGVkIENsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4IFJDQ0V4CisgICogQGJyaWVmIFJDQyBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUkNDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX0NvbnN0YW50cyBSQ0NFeCBQcml2YXRlIENvbnN0YW50cworICogQHsKKyAqLworI2RlZmluZSBQTExTQUkxX1RJTUVPVVRfVkFMVUUgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLworI2RlZmluZSBQTExfVElNRU9VVF9WQUxVRSAgICAgICAgKDJVKSAgICAvKiAyIG1zIChtaW5pbXVtIFRpY2sgKyAxKSAqLworCisjZGVmaW5lIENMT0NLU01QU19USU1FT1VUX1ZBTFVFICAoNTAwMFUpIC8qIDUgcyAgICAqLworCisjZGVmaW5lIF9fTFNDTzFfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9BX0NMS19FTkFCTEUoKQorI2RlZmluZSBMU0NPMV9HUElPX1BPUlQgICAgICAgIEdQSU9BCisjZGVmaW5lIExTQ08xX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fMgorCisjZGVmaW5lIF9fTFNDTzJfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9IX0NMS19FTkFCTEUoKQorI2RlZmluZSBMU0NPMl9HUElPX1BPUlQgICAgICAgIEdQSU9ICisjZGVmaW5lIExTQ08yX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fMworCisjZGVmaW5lIF9fTFNDTzNfQ0xLX0VOQUJMRSgpICAgX19IQUxfUkNDX0dQSU9DX0NMS19FTkFCTEUoKQorI2RlZmluZSBMU0NPM19HUElPX1BPUlQgICAgICAgIEdQSU9DCisjZGVmaW5lIExTQ08zX1BJTiAgICAgICAgICAgICAgR1BJT19QSU5fMTIKKworI2RlZmluZSBMU0kyX1RJTUVPVVRfVkFMVUUgICAgICAgICAoM1UpICAgIC8qIHRvIGJlIGFkanVzdGVkIHdpdGggRFMgICAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX0Z1bmN0aW9ucyBSQ0NFeCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ0V4X1BMTFNBSTFfQ29uZmlnTlAoUkNDX1BMTFNBSTFJbml0VHlwZURlZiAqUExMU0FJMSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUkNDRXhfUExMU0FJMV9Db25maWdOUShSQ0NfUExMU0FJMUluaXRUeXBlRGVmICpQTExTQUkxKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBSQ0NFeF9QTExTQUkxX0NvbmZpZ05SKFJDQ19QTExTQUkxSW5pdFR5cGVEZWYgKlBMTFNBSTEpOworCitzdGF0aWMgdWludDMyX3QgICAgICAgICAgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1Aodm9pZCk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1Eodm9pZCk7CisKK3N0YXRpYyB1aW50MzJfdCAgICAgICAgICBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluX1Iodm9pZCk7CitzdGF0aWMgdWludDMyX3QgICAgICAgICAgUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9QKHZvaWQpOworc3RhdGljIHVpbnQzMl90ICAgICAgICAgIFJDQ19QTExTQUkxX0dldEZyZXFEb21haW5fUSh2b2lkKTsKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9ucyBSQ0NFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBSQ0MgQ2xvY2tzCisgICAgZnJlcXVlbmNpZXMuCisgICAgWy4uXQorICAgIChAKSBJbXBvcnRhbnQgbm90ZTogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gQHJlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCkgaXMgdXNlZCB0bworICAgICAgICBzZWxlY3QgdGhlIFJUQyBjbG9jayBzb3VyY2U7IGluIHRoaXMgY2FzZSB0aGUgQmFja3VwIGRvbWFpbiB3aWxsIGJlIHJlc2V0IGluCisgICAgICAgIG9yZGVyIHRvIG1vZGlmeSB0aGUgUlRDIENsb2NrIHNvdXJjZSwgYXMgY29uc2VxdWVuY2UgUlRDIHJlZ2lzdGVycyAoaW5jbHVkaW5nCisgICAgICAgIHRoZSBiYWNrdXAgcmVnaXN0ZXJzKSBhbmQgUkNDX0JEQ1IgcmVnaXN0ZXIgYXJlIHNldCB0byB0aGVpciByZXNldCB2YWx1ZXMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUkNDIGV4dGVuZGVkIHBlcmlwaGVyYWxzIGNsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQHJlZiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYuCisgICogQHBhcmFtICBQZXJpcGhDbGtJbml0ICBwb2ludGVyIHRvIGEgQHJlZiBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIGEgZmllbGQgUGVyaXBoQ2xvY2tTZWxlY3Rpb24gd2hpY2ggY2FuIGJlIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgIFVTQVJUMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFVBUlQxICBMUFVBUlQxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzEgICAgIEkyQzEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfSTJDMyAgICAgSTJDMyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19MUFRJTTEgICBMUFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBUSU0yICAgTFBUSU0yIHBlcmlwaGVyYWwgY2xvY2sKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfU0FJMSAgICAgU0FJMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19VU0IgICAgICBVU0IgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfUk5HICAgICAgUk5HIHBlcmlwaGVyYWwgY2xvY2sKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfQURDICAgICAgQURDIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1JUQyAgICAgIFJUQyBwZXJpcGhlcmFsIGNsb2NrCisgICoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1JGV0FLRVVQIFJGV0tQIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NNUFMgICAgIFNNUFMgcGVyaXBoZXJhbCBjbG9jaworICAqCisgICoKKyAgKiBAbm90ZSAgIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIEByZWYgSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8gc2VsZWN0CisgICogICAgICAgICB0aGUgUlRDIGNsb2NrIHNvdXJjZTogaW4gdGhpcyBjYXNlIHRoZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiBpcyBlbmFibGVkLgorICAqCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ICAgICA9IEhBTF9PSzsgICAgICAvKiBJbnRlcm1lZGlhdGUgc3RhdHVzICovCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyAgPSBIQUxfT0s7ICAgLyogRmluYWwgc3RhdHVzICovCisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QRVJJUEhDTE9DSyhQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0FJMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19TQUkxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NBSTFDTEsoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICBzd2l0Y2ggKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbikKKyAgICB7CisgICAgICBjYXNlIFJDQ19TQUkxQ0xLU09VUkNFX1BMTDogICAgICAvKiBQTEwgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIFNBSTEgKi8KKyAgICAgICAgLyogRW5hYmxlIFNBSTEgQ2xvY2sgb3V0cHV0IGdlbmVyYXRlZCBmb3JtIFN5c3RlbSBQTEwgLiAqLworICAgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMX1NBSTFDTEspOworCisgICAgICAgIC8qIFNBSTEgY2xvY2sgc291cmNlIGNvbmZpZyBzZXQgbGF0ZXIgYWZ0ZXIgY2xvY2sgc2VsZWN0aW9uIGNoZWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJDQ19TQUkxQ0xLU09VUkNFX1BMTFNBSTE6IC8qIFBMTFNBSTEgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIFNBSTEgKi8KKyAgICAgICAgLyogUExMU0FJMSBwYXJhbWV0ZXJzIE4gJiBQIGNvbmZpZ3VyYXRpb24gYW5kIGNsb2NrIG91dHB1dCAoUExMU0FJMUNsb2NrT3V0KSAqLworICAgICAgICByZXQgPSBSQ0NFeF9QTExTQUkxX0NvbmZpZ05QKCYoUGVyaXBoQ2xrSW5pdC0+UExMU0FJMSkpOworICAgICAgICAvKiBTQUkxIGNsb2NrIHNvdXJjZSBjb25maWcgc2V0IGxhdGVyIGFmdGVyIGNsb2NrIHNlbGVjdGlvbiBjaGVjayAqLworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIFJDQ19TQUkxQ0xLU09VUkNFX1BJTjogICAgICAvKiBFeHRlcm5hbCBjbG9jayBpcyB1c2VkIGFzIHNvdXJjZSBvZiBTQUkxIGNsb2NrKi8KKyAgICAgICAgLyogU0FJMSBjbG9jayBzb3VyY2UgY29uZmlnIHNldCBsYXRlciBhZnRlciBjbG9jayBzZWxlY3Rpb24gY2hlY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkNDX1NBSTFDTEtTT1VSQ0VfSFNJOgorCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXQgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgc291cmNlIG9mIFNBSTEgY2xvY2sqLworICAgICAgX19IQUxfUkNDX1NBSTFfQ09ORklHKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBzZXQgb3ZlcmFsbCByZXR1cm4gdmFsdWUgKi8KKyAgICAgIHN0YXR1cyA9IHJldDsKKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJUQyBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbiAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSBSQ0NfUEVSSVBIQ0xLX1JUQykKKyAgeworICAgIHVpbnQzMl90IHJ0Y2Nsb2Nrc291cmNlID0gTExfUkNDX0dldFJUQ0Nsb2NrU291cmNlKCk7CisgICAgCisgICAgLyogQ2hlY2sgZm9yIFJUQyBQYXJhbWV0ZXJzIHVzZWQgdG8gb3V0cHV0IFJUQ0NMSyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUlRDQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSBvbmx5IGlmIGEgZGlmZmVyZW50IHNvdXJjZSBpcyBleHBlY3RlZCAqLworICAgIGlmKHJ0Y2Nsb2Nrc291cmNlICE9IFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIGRvbWFpbiAqLworICAgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CisgICAgIAorICAgICAgLyogSWYgYSBjbG9jayBzb3VyY2UgaXMgbm90IHlldCBzZWxlY3RlZCAqLworICAgICAgaWYocnRjY2xvY2tzb3VyY2UgPT0gUkNDX1JUQ0NMS1NPVVJDRV9OT05FKQorICAgICAgeworICAgICAgICAvKiBEaXJlY3RseSBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyAgICAgICAgTExfUkNDX1NldFJUQ0Nsb2NrU291cmNlKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLyogQSBjbG9jayBzb3VyY2UgaXMgYWxyZWFkeSBzZWxlY3RlZCAqLworICAgICAgeworICAgICAgICAvKiBTdG9yZSB0aGUgY29udGVudCBvZiBCRENSIHJlZ2lzdGVyIGJlZm9yZSB0aGUgcmVzZXQgb2YgQmFja3VwIERvbWFpbiAqLworICAgICAgICB1aW50MzJfdCBiZGNyID0gTExfUkNDX1JlYWRSZWcoQkRDUik7CisgICAgICAgIAorICAgICAgICAvKiBSVEMgQ2xvY2sgc2VsZWN0aW9uIGNhbiBiZSBjaGFuZ2VkIG9ubHkgaWYgdGhlIEJhY2t1cCBEb21haW4gaXMgcmVzZXQgKi8KKyAgICAgICAgTExfUkNDX0ZvcmNlQmFja3VwRG9tYWluUmVzZXQoKTsKKyAgICAgICAgTExfUkNDX1JlbGVhc2VCYWNrdXBEb21haW5SZXNldCgpOworICAgICAgICAKKyAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworICAgICAgICBNT0RJRllfUkVHKGJkY3IsIFJDQ19CRENSX1JUQ1NFTCwgUGVyaXBoQ2xrSW5pdC0+UlRDQ2xvY2tTZWxlY3Rpb24pOworICAgICAgICAKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgY29udGVudCBvZiBCRENSIHJlZ2lzdGVyICovCisgICAgICAgIExMX1JDQ19Xcml0ZVJlZyhCRENSLCBiZGNyKTsKKyAgICAgICAgCisgICAgICAgIC8qIFdhaXQgZm9yIExTRSByZWFjdGl2YXRpb24gaWYgTFNFIHdhcyBlbmFibGUgcHJpb3IgdG8gQmFja3VwIERvbWFpbiByZXNldCAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc0VuYWJsZWQoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICAgICAgICAKKyAgICAgICAgICAvKiBXYWl0IHRpbGwgTFNFIGlzIHJlYWR5ICovCisgICAgICAgICAgd2hpbGUgKExMX1JDQ19MU0VfSXNSZWFkeSgpICE9IDFVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldCA9IEhBTF9USU1FT1VUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogc2V0IG92ZXJhbGwgcmV0dXJuIHZhbHVlICovCisgICAgICBzdGF0dXMgPSByZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBzZXQgb3ZlcmFsbCByZXR1cm4gdmFsdWUgKi8KKyAgICAgIHN0YXR1cyA9IHJldDsKKyAgICB9CisKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBVQVJUMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpID09IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MUFVBUlQxQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBMUFVBUjEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0xQVUFSVDFfQ09ORklHKFBlcmlwaENsa0luaXQtPkxwdWFydDFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVElNMSBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MUFRJTTEpID09IChSQ0NfUEVSSVBIQ0xLX0xQVElNMSkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0xQVElNMUNMSyhQZXJpcGhDbGtJbml0LT5McHRpbTFDbG9ja1NlbGVjdGlvbikpOworICAgIF9fSEFMX1JDQ19MUFRJTTFfQ09ORklHKFBlcmlwaENsa0luaXQtPkxwdGltMUNsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBUSU0yIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xQVElNMikgPT0gKFJDQ19QRVJJUEhDTEtfTFBUSU0yKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFBUSU0yQ0xLKFBlcmlwaENsa0luaXQtPkxwdGltMkNsb2NrU2VsZWN0aW9uKSk7CisgICAgX19IQUxfUkNDX0xQVElNMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+THB0aW0yQ2xvY2tTZWxlY3Rpb24pOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMxIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfSTJDMSkgPT0gUkNDX1BFUklQSENMS19JMkMxKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyQzFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIEkyQzEgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0kyQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbik7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzMgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMzKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDM0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMyBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfSTJDM19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjM0Nsb2NrU2VsZWN0aW9uKTsKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNCIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNCKSA9PSAoUkNDX1BFUklQSENMS19VU0IpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0JDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNiQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICBfX0hBTF9SQ0NfVVNCX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbik7CisKKyAgICBpZiAoUGVyaXBoQ2xrSW5pdC0+VXNiQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1VTQkNMS1NPVVJDRV9QTEwpCisgICAgeworICAgICAgLyogRW5hYmxlIFBMTFEgb3V0cHV0ICovCisgICAgICBfX0hBTF9SQ0NfUExMQ0xLT1VUX0VOQUJMRShSQ0NfUExMX1VTQkNMSyk7CisgICAgfQorICAgIAorICAgIGlmIChQZXJpcGhDbGtJbml0LT5Vc2JDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfVVNCQ0xLU09VUkNFX1BMTFNBSTEpCisgICAgeworICAgICAgLyogUExMU0FJMSBwYXJhbWV0ZXJzIE4gJiBRIGNvbmZpZ3VyYXRpb24gYW5kIGNsb2NrIG91dHB1dCAoUExMU0FJMUNsb2NrT3V0KSAqLworICAgICAgcmV0ID0gUkNDRXhfUExMU0FJMV9Db25maWdOUSgmKFBlcmlwaENsa0luaXQtPlBMTFNBSTEpKTsKKworICAgICAgaWYgKHJldCAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIHNldCBvdmVyYWxsIHJldHVybiB2YWx1ZSAqLworICAgICAgICBzdGF0dXMgPSByZXQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSTkcgY2xvY2sgc291cmNlIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfUk5HKSA9PSAoUkNDX1BFUklQSENMS19STkcpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19STkdDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+Um5nQ2xvY2tTZWxlY3Rpb24pKTsKKyAgICBfX0hBTF9SQ0NfUk5HX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5SbmdDbG9ja1NlbGVjdGlvbik7CisKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0FEQykgPT0gUkNDX1BFUklQSENMS19BREMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfQURDQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkFkY0Nsb2NrU2VsZWN0aW9uKSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIEFEQyBpbnRlcmZhY2UgY2xvY2sgc291cmNlICovCisgICAgX19IQUxfUkNDX0FEQ19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+QWRjQ2xvY2tTZWxlY3Rpb24pOworCisgICAgaWYgKFBlcmlwaENsa0luaXQtPkFkY0Nsb2NrU2VsZWN0aW9uID09IFJDQ19BRENDTEtTT1VSQ0VfUExMKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBSQ0NfUExMX1JOR0NMSyBvdXRwdXQgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExDTEtPVVRfRU5BQkxFKFJDQ19QTExfQURDQ0xLKTsKKyAgICB9CisgICAgCisgICAgaWYgKFBlcmlwaENsa0luaXQtPkFkY0Nsb2NrU2VsZWN0aW9uID09IFJDQ19BRENDTEtTT1VSQ0VfUExMU0FJMSkKKyAgICB7CisgICAgICAvKiBQTExTQUkxIHBhcmFtZXRlcnMgTiAmIFIgY29uZmlndXJhdGlvbiBhbmQgY2xvY2sgb3V0cHV0IChQTExTQUkxQ2xvY2tPdXQpICovCisgICAgICByZXQgPSBSQ0NFeF9QTExTQUkxX0NvbmZpZ05SKCYoUGVyaXBoQ2xrSW5pdC0+UExMU0FJMSkpOworCisgICAgICBpZiAocmV0ICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogc2V0IG92ZXJhbGwgcmV0dXJuIHZhbHVlICovCisgICAgICAgIHN0YXR1cyA9IHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJGV0tQIGNsb2NrIHNvdXJjZSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1JGV0FLRVVQKSA9PSBSQ0NfUEVSSVBIQ0xLX1JGV0FLRVVQKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1JGV0tQQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlJGV2FrZVVwQ2xvY2tTZWxlY3Rpb24pKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgUkZXS1AgaW50ZXJmYWNlIGNsb2NrIHNvdXJjZSAqLworICAgIF9fSEFMX1JDQ19SRldBS0VVUF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UkZXYWtlVXBDbG9ja1NlbGVjdGlvbik7CisKKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU01QUyBjbG9jayBzb3VyY2UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19TTVBTKSA9PSBSQ0NfUEVSSVBIQ0xLX1NNUFMpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19SQ0NfU01QU0NMS0RJVihQZXJpcGhDbGtJbml0LT5TbXBzRGl2U2VsZWN0aW9uKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19TTVBTQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlNtcHNDbG9ja1NlbGVjdGlvbikpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBTTVBTIGludGVyZmFjZSBjbG9jayBkaXZpc2lvbiBmYWN0b3IgKi8KKyAgICBfX0hBTF9SQ0NfU01QU19ESVZfQ09ORklHKFBlcmlwaENsa0luaXQtPlNtcHNEaXZTZWxlY3Rpb24pOworCisgICAgLyogQ29uZmlndXJlIHRoZSBTTVBTIGludGVyZmFjZSBjbG9jayBzb3VyY2UgKi8KKyAgICBfX0hBTF9SQ0NfU01QU19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+U21wc0Nsb2NrU2VsZWN0aW9uKTsKKworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUkNDX0Nsa0luaXRTdHJ1Y3QgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcm5hbCBSQ0MgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtICBQZXJpcGhDbGtJbml0ICBwb2ludGVyIHRvIGFuIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgcmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEV4dGVuZGVkIFBlcmlwaGVyYWxzCisgICogICAgICAgICBjbG9ja3MoU0FJMSwgTFBUSU0xLCBMUFRJTTIsIEkyQzEsIEkyQzMsIExQVUFSVDEsCisgICogICAgICAgICBVU0FSVDEsIFJUQywgQURDeCwgVVNCLCBSTkcsIFJGV0tQLCBTTVBTKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0dldFBlcmlwaENMS0NvbmZpZyhSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgICpQZXJpcGhDbGtJbml0KQoreworICAvKiBTZXQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGV4dGVuZGVkIGNsb2NrIHR5cGUgcGFyYW1ldGVyLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSB8IFJDQ19QRVJJUEhDTEtfTFBVQVJUMSB8IFJDQ19QRVJJUEhDTEtfSTJDMSAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfTFBUSU0xIHwgUkNDX1BFUklQSENMS19MUFRJTTIgIHwgUkNDX1BFUklQSENMS19TQUkxICB8IFJDQ19QRVJJUEhDTEtfVVNCICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19STkcgICAgfCBSQ0NfUEVSSVBIQ0xLX0FEQyAgICAgfCBSQ0NfUEVSSVBIQ0xLX1JUQyAgIHwgUkNDX1BFUklQSENMS19SRldBS0VVUCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1NNUFM7CisKKyAgLyogR2V0IHRoZSBQTExTQUkxIENsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5QTExTQUkxLlBMTE4gPSBMTF9SQ0NfUExMU0FJMV9HZXROKCk7CisgIFBlcmlwaENsa0luaXQtPlBMTFNBSTEuUExMUCA9IExMX1JDQ19QTExTQUkxX0dldFAoKTsKKyAgUGVyaXBoQ2xrSW5pdC0+UExMU0FJMS5QTExSID0gTExfUkNDX1BMTFNBSTFfR2V0UigpOworICBQZXJpcGhDbGtJbml0LT5QTExTQUkxLlBMTFEgPSBMTF9SQ0NfUExMU0FJMV9HZXRRKCk7CisKKyAgLyogR2V0IHRoZSBVU0FSVDEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uICAgPSBfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIExQVUFSVDEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+THB1YXJ0MUNsb2NrU2VsZWN0aW9uICA9IF9fSEFMX1JDQ19HRVRfTFBVQVJUMV9TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIEkyQzEgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjMUNsb2NrU2VsZWN0aW9uICAgICA9IF9fSEFMX1JDQ19HRVRfSTJDMV9TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIEkyQzMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+STJjM0Nsb2NrU2VsZWN0aW9uICAgICA9IF9fSEFMX1JDQ19HRVRfSTJDM19TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIExQVElNMSBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+THB0aW0xQ2xvY2tTZWxlY3Rpb24gICA9IF9fSEFMX1JDQ19HRVRfTFBUSU0xX1NPVVJDRSgpOworCisgIC8qIEdldCB0aGUgTFBUSU0yIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5McHRpbTJDbG9ja1NlbGVjdGlvbiAgID0gX19IQUxfUkNDX0dFVF9MUFRJTTJfU09VUkNFKCk7CisKKyAgLyogR2V0IHRoZSBTQUkxIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiAgICAgPSBfX0hBTF9SQ0NfR0VUX1NBSTFfU09VUkNFKCk7CisKKyAgLyogR2V0IHRoZSBSVEMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uICAgICAgPSBfX0hBTF9SQ0NfR0VUX1JUQ19TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIFVTQiBjbG9jayBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+VXNiQ2xvY2tTZWxlY3Rpb24gICAgICA9IF9fSEFMX1JDQ19HRVRfVVNCX1NPVVJDRSgpOworCisgIC8qIEdldCB0aGUgUk5HIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBQZXJpcGhDbGtJbml0LT5SbmdDbG9ja1NlbGVjdGlvbiAgICAgID0gX19IQUxfUkNDX0dFVF9STkdfU09VUkNFKCk7CisKKyAgLyogR2V0IHRoZSBBREMgY2xvY2sgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPkFkY0Nsb2NrU2VsZWN0aW9uICAgICAgPSBfX0hBTF9SQ0NfR0VUX0FEQ19TT1VSQ0UoKTsKKworICAvKiBHZXQgdGhlIFJGV0tQIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgUGVyaXBoQ2xrSW5pdC0+UkZXYWtlVXBDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfUkZXQUtFVVBfU09VUkNFKCk7CisKKyAgLyogR2V0IHRoZSBTTVBTIGNsb2NrIGRpdmlzaW9uIGZhY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlNtcHNEaXZTZWxlY3Rpb24gICAgICAgPSBfX0hBTF9SQ0NfR0VUX1NNUFNfRElWKCk7CisKKyAgLyogR2V0IHRoZSBTTVBTIGNsb2NrIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIFBlcmlwaENsa0luaXQtPlNtcHNDbG9ja1NlbGVjdGlvbiAgICAgPSBfX0hBTF9SQ0NfR0VUX1NNUFNfU09VUkNFKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSBmb3IgcGVyaXBoZXJhbHMgd2l0aCBjbG9jayBzb3VyY2UKKyAgKiBAbm90ZSAgIFJldHVybiAwIGlmIHBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciBub3QgbWFuYWdlZCBieSB0aGlzIEFQSQorICAqIEBwYXJhbSAgUGVyaXBoQ2xrICBQZXJpcGhlcmFsIGNsb2NrIGlkZW50aWZpZXIKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19SVEMgIFJUQyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19BREMgIEFEQyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19JMkMxICBJMkMxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX0kyQzMgIEkyQzMgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBUSU0xICBMUFRJTTEgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBUSU0yICBMUFRJTTIgcGVyaXBoZXJhbCBjbG9jaworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfTFBVQVJUMSAgTFBVQVJUMSBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19STkcgIFJORyBwZXJpcGhlcmFsIGNsb2NrCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1BFUklQSENMS19TQUkxICBTQUkxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSAgVVNBUlQxIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1VTQiAgVVNCIHBlcmlwaGVyYWwgY2xvY2sKKyAgKgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19QRVJJUEhDTEtfUkZXQUtFVVAgIFJGV0tQIHBlcmlwaGVyYWwgY2xvY2sKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfUEVSSVBIQ0xLX1NNUFMgIFNNUFMgcGVyaXBoZXJhbCBjbG9jaworICAqIEByZXR2YWwgRnJlcXVlbmN5IGluIEh6CisgICovCit1aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspCit7CisgIHVpbnQzMl90IGZyZXF1ZW5jeTsKKyAgdWludDMyX3Qgc21wc19wcmVzY2FsZXJfaW5kZXggPSAoKExMX1JDQ19HZXRTTVBTUHJlc2NhbGVyKCkpID4+IFJDQ19TTVBTQ1JfU01QU0RJVl9Qb3MpOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrKSk7CisKKyAgaWYoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfUlRDKQorICB7CisgICAgdWludDMyX3QgcnRjQ2xvY2tTb3VyY2UgPSBMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2UoKTsKKyAgICAKKyAgICBpZihydGNDbG9ja1NvdXJjZSA9PSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9MU0UpIC8qIExTRSBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KKyAgICB7CisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYocnRjQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJKSAvKiBMU0kgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlICovCisgICAgeworICAgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kxcmVhZHkgPSBMTF9SQ0NfTFNJMV9Jc1JlYWR5KCk7CisgICAgICBjb25zdCB1aW50MzJfdCB0ZW1wX2xzaTJyZWFkeSA9IExMX1JDQ19MU0kyX0lzUmVhZHkoKTsKKyAgICAgIGlmICgodGVtcF9sc2kxcmVhZHkgPT0gMVUpIHx8ICh0ZW1wX2xzaTJyZWFkeSA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJ0Y0Nsb2NrU291cmNlID09IExMX1JDQ19SVENfQ0xLU09VUkNFX0hTRV9ESVYzMikgLyogSFNFIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSAqLworICAgIHsKKyAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRSAvIDMyVTsKKyAgICB9CisgICAgZWxzZSAvKiBObyBjbG9jayB1c2VkIGFzIFJUQyBjbG9jayBzb3VyY2UgKi8KKyAgICB7CisgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKyAgfQorICBlbHNlIGlmIChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19TQUkxKQorICB7CisgICAgc3dpdGNoIChMTF9SQ0NfR2V0U0FJQ2xvY2tTb3VyY2UoTExfUkNDX1NBSTFfQ0xLU09VUkNFKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9IU0k6ICAgICAgICAvKiBIU0kgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTFNBSTE6ICAgIC8qIFBMTFNBSTEgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBpZiAoTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9QKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBMTF9SQ0NfU0FJMV9DTEtTT1VSQ0VfUExMOiAgICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1AoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDogLyogRXh0ZXJuYWwgaW5wdXQgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBmcmVxdWVuY3kgPSBFWFRFUk5BTF9TQUkxX0NMT0NLX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19STkcpCisgIHsKKyAgICB1aW50MzJfdCBybmdDbG9ja1NvdXJjZSA9IExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZShMTF9SQ0NfUk5HX0NMS1NPVVJDRSk7CisgICAgCisgICAgaWYocm5nQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNJKSAvKiBMU0kgY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgICAgeworICAgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kxcmVhZHkgPSBMTF9SQ0NfTFNJMV9Jc1JlYWR5KCk7CisgICAgICBjb25zdCB1aW50MzJfdCB0ZW1wX2xzaTJyZWFkeSA9IExMX1JDQ19MU0kyX0lzUmVhZHkoKTsKKyAgICAgIGlmICgodGVtcF9sc2kxcmVhZHkgPT0gMVUpIHx8ICh0ZW1wX2xzaTJyZWFkeSA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYocm5nQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNFKSAvKiBMU0UgY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgICAgeworICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIENMSzQ4IGNsb2NrIHVzZWQgYXMgUk5HIGNsb2NrIHNvdXJjZSAqLworICAgIHsKKyAgICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQkNsb2NrU291cmNlKExMX1JDQ19VU0JfQ0xLU09VUkNFKSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTExTQUkxOiAvKiBQTExTQUkxIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgICAgIGlmIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9RKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEw6IC8qIFBMTCBjbG9jayB1c2VkIGFzIFVTQiBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgICBpZiAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1EoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExMX1JDQ19VU0JfQ0xLU09VUkNFX01TSTogLyogTVNJIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgICAgIGlmIChMTF9SQ0NfTVNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAKKyAgICAgICAgZGVmYXVsdDogLyogSFNJNDggY2xvY2sgdXNlZCBhcyBVU0IgY2xvY2sgc291cmNlICovCisgICAgICAgICAgaWYgKExMX1JDQ19IU0k0OF9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ID0gSFNJNDhfVkFMVUU7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZnJlcXVlbmN5ID0gZnJlcXVlbmN5IC8gM1U7CisgICAgfQorICB9CisgIGVsc2UgaWYgKFBlcmlwaENsayA9PSBSQ0NfUEVSSVBIQ0xLX1VTQikKKyAgeworICAgIHN3aXRjaCAoTExfUkNDX0dldFVTQkNsb2NrU291cmNlKExMX1JDQ19VU0JfQ0xLU09VUkNFKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0JfQ0xLU09VUkNFX1BMTFNBSTE6ICAgICAgIC8qIFBMTFNBSTEgY2xvY2sgdXNlZCBhcyBVU0IgY2xvY2sgc291cmNlICovCisgICAgICAgIGlmIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluX1EoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNCX0NMS1NPVVJDRV9QTEw6ICAgICAgICAgICAvKiBQTEwgY2xvY2sgdXNlZCBhcyBVU0IgY2xvY2sgc291cmNlICovCisgICAgICAgIGlmIChMTF9SQ0NfUExMX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IFJDQ19QTExfR2V0RnJlcURvbWFpbl9RKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQl9DTEtTT1VSQ0VfTVNJOiAgICAgICAgICAgLyogTVNJIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBpZiAoTExfUkNDX01TSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAKKyAgICAgIGRlZmF1bHQ6IC8qIEhTSTQ4IGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBpZiAoTExfUkNDX0hTSTQ4X0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSTQ4X1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19VU0FSVDEpCisgIHsKKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRVU0FSVENsb2NrU291cmNlKExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX1NZU0NMSzogLyogVVNBUlQxIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9IU0k6ICAgIC8qIFVTQVJUMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfTFNFOiAgICAvKiBVU0FSVDEgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAvKiBVU0FSVDEgQ2xvY2sgaXMgUENMSzIgKi8KKyAgICAgICAgZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19QQ0xLMl9GUkVRKF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpLCBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKFBlcmlwaENsayA9PSBSQ0NfUEVSSVBIQ0xLX0xQVUFSVDEpCisgIHsKKyAgICBzd2l0Y2ggKExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZShMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSzogLyogTFBVQVJUMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgZnJlcXVlbmN5ID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0hTSTogICAgLyogTFBVQVJUMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0xTRTogICAgLyogTFBVQVJUMSBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6IC8qIExQVUFSVDEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgICAgZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19QQ0xLMV9GUkVRKF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpLCBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKFBlcmlwaENsayA9PSBSQ0NfUEVSSVBIQ0xLX0FEQykKKyAgeworICAgIHN3aXRjaCAoTExfUkNDX0dldEFEQ0Nsb2NrU291cmNlKExMX1JDQ19BRENfQ0xLU09VUkNFKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTFNBSTE6ICAgICAgIC8qIFBMTFNBSTEgY2xvY2sgdXNlZCBhcyBBREMgY2xvY2sgc291cmNlICovCisgICAgICAgIGlmIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluX1IoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfQURDX0NMS1NPVVJDRV9TWVNDTEs6ICAgICAgICAvKiBTWVNDTEsgY2xvY2sgdXNlZCBhcyBBREMgY2xvY2sgc291cmNlICovCisgICAgICAgIGZyZXF1ZW5jeSA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19BRENfQ0xLU09VUkNFX1BMTDogICAgICAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIFVTQiBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1AoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAKKyAgICAgIGRlZmF1bHQ6IC8qIE5vIGNsb2NrIHVzZWQgYXMgQURDIGNsb2NrIHNvdXJjZSAqLworICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfSTJDMSkKKyAgeworICAgIHN3aXRjaCAoTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKExMX1JDQ19JMkMxX0NMS1NPVVJDRSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMxIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBJMkMxIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDogLyogSTJDMSBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19MTF9SQ0NfQ0FMQ19IQ0xLMV9GUkVRKEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19HZXRBSEJQcmVzY2FsZXIoKSksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfSTJDMykKKyAgeworICAgIHN3aXRjaCAoTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKExMX1JDQ19JMkMzX0NMS1NPVVJDRSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMzIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBmcmVxdWVuY3kgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJOiAvKiBJMkMzIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDogLyogSTJDMyBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19MTF9SQ0NfQ0FMQ19IQ0xLMV9GUkVRKEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19HZXRBSEJQcmVzY2FsZXIoKSksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfTFBUSU0xKQorICB7CisgICAgdWludDMyX3QgbHB0aW1DbG9ja1NvdXJjZSA9IExMX1JDQ19HZXRMUFRJTUNsb2NrU291cmNlKExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFKTsKKyAgICAKKyAgICBpZihscHRpbUNsb2NrU291cmNlID09IExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSSkgLyogTFBUSU0xIENsb2NrIGlzIExTSSBPc2MuICovCisgICAgeworICAgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kxcmVhZHkgPSBMTF9SQ0NfTFNJMV9Jc1JlYWR5KCk7CisgICAgICBjb25zdCB1aW50MzJfdCB0ZW1wX2xzaTJyZWFkeSA9IExMX1JDQ19MU0kyX0lzUmVhZHkoKTsKKyAgICAgIGlmICgodGVtcF9sc2kxcmVhZHkgPT0gMVUpIHx8ICh0ZW1wX2xzaTJyZWFkeSA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGxwdGltQ2xvY2tTb3VyY2UgPT0gTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfSFNJKSAvKiBMUFRJTTEgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICB7CisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYobHB0aW1DbG9ja1NvdXJjZSA9PSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9MU0UpIC8qIExQVElNMSBDbG9jayBpcyBMU0UgT3NjLiAqLworICAgIHsKKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBMUFRJTTEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICB7CisgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX1BDTEsxX0ZSRVEoX19MTF9SQ0NfQ0FMQ19IQ0xLMV9GUkVRKEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIExMX1JDQ19HZXRBSEJQcmVzY2FsZXIoKSksIExMX1JDQ19HZXRBUEIxUHJlc2NhbGVyKCkpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19MUFRJTTIpCisgIHsKKyAgICB1aW50MzJfdCBscHRpbUNsb2NrU291cmNlID0gTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UpOworICAgIAorICAgIGlmKCBscHRpbUNsb2NrU291cmNlID09IExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSSkgLyogTFBUSU0yIENsb2NrIGlzIExTSSBPc2MuICovCisgICAgeworICAgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kxcmVhZHkgPSBMTF9SQ0NfTFNJMV9Jc1JlYWR5KCk7CisgICAgICBjb25zdCB1aW50MzJfdCB0ZW1wX2xzaTJyZWFkeSA9IExMX1JDQ19MU0kyX0lzUmVhZHkoKTsKKyAgICAgIGlmICgodGVtcF9sc2kxcmVhZHkgPT0gMVUpIHx8ICh0ZW1wX2xzaTJyZWFkeSA9PSAxVSkpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGxwdGltQ2xvY2tTb3VyY2UgPT0gTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfSFNJKSAvKiBMUFRJTTIgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICB7CisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGxwdGltQ2xvY2tTb3VyY2UgPT0gTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNFKSAvKiBMUFRJTTIgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICB7CisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogTFBUSU0yIENsb2NrIGlzIFBDTEsxICovCisgICAgeworICAgICAgZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19QQ0xLMV9GUkVRKF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpLCBMTF9SQ0NfR2V0QVBCMVByZXNjYWxlcigpKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoUGVyaXBoQ2xrID09IFJDQ19QRVJJUEhDTEtfUkZXQUtFVVApCisgIHsKKyAgICB1aW50MzJfdCByZndrcENsb2NrU291cmNlID0gTExfUkNDX0dldFJGV0tQQ2xvY2tTb3VyY2UoKTsKKyAgICAKKyAgICBpZiAocmZ3a3BDbG9ja1NvdXJjZSA9PSBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0xTRSkgLyogTFNFIGNsb2NrIHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrIHNvdXJjZSAqLworICAgIHsKKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocmZ3a3BDbG9ja1NvdXJjZSA9PSBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0xTSSkgLyogTFNJIGNsb2NrIHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrIHNvdXJjZSAqLworICAgIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHRlbXBfbHNpMXJlYWR5ID0gTExfUkNDX0xTSTFfSXNSZWFkeSgpOworICAgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kycmVhZHkgPSBMTF9SQ0NfTFNJMl9Jc1JlYWR5KCk7CisgICAgICBpZiAoKHRlbXBfbHNpMXJlYWR5ID09IDFVKSB8fCAodGVtcF9sc2kycmVhZHkgPT0gMVUpKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBMU0lfVkFMVUU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChyZndrcENsb2NrU291cmNlID09IExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfSFNFX0RJVjEwMjQpIC8qIEhTRSBjbG9jayB1c2VkIGFzIFJGIFdha2V1cCBjbG9jayBzb3VyY2UgKi8KKyAgICB7CisgICAgICBmcmVxdWVuY3kgPSBIU0VfVkFMVUUgLyAxMDI0VTsKKyAgICB9CisgICAgZWxzZSAvKiBObyBjbG9jayB1c2VkIGFzIFJGIFdha2V1cCBjbG9jayBzb3VyY2UgKi8KKyAgICB7CisgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKyAgfQorICBlbHNlIGlmIChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19TTVBTKQorICB7CisgICAgdWludDMyX3Qgc21wc0Nsb2NrU291cmNlID0gTExfUkNDX0dldFNNUFNDbG9ja1NvdXJjZSgpOworICAgIAorICAgIGlmKHNtcHNDbG9ja1NvdXJjZSA9PSBMTF9SQ0NfU01QU19DTEtTT1VSQ0VfU1RBVFVTX0hTSSkgLyogU01QUyBDbG9jayBzb3VyY2UgaXMgSFNJIE9zYy4gKi8KKyAgICB7CisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bMF07CisgICAgICAgIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSA+PiAxVTsgLyogU3lzdGVtYXRpYyBEaXYgYnkgMiAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihzbXBzQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0UpIC8qIFNNUFMgQ2xvY2sgc291cmNlIGlzIEhTRSBPc2MuICovCisgICAgeworICAgICAgaWYgKExMX1JDQ19IU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBmcmVxdWVuY3kgPSBIU0VfVkFMVUUgLyBTbXBzUHJlc2NhbGVyVGFibGVbc21wc19wcmVzY2FsZXJfaW5kZXhdWzVdOworICAgICAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3kgPj4gMVU7IC8qIFN5c3RlbWF0aWMgRGl2IGJ5IDIgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoc21wc0Nsb2NrU291cmNlID09IExMX1JDQ19TTVBTX0NMS1NPVVJDRV9TVEFUVVNfTVNJKSAvKiBTTVBTIENsb2NrIHNvdXJjZSBpcyBNU0kgT3NjLiAqLworICAgIHsKKyAgICAgIHN3aXRjaCAoTExfUkNDX01TSV9HZXRSYW5nZSgpKQorICAgICAgeworICAgICAgICBjYXNlIExMX1JDQ19NU0lSQU5HRV84OgorICAgICAgICAgIGZyZXF1ZW5jeSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSVJBTkdFXzgpIC8gU21wc1ByZXNjYWxlclRhYmxlW3NtcHNfcHJlc2NhbGVyX2luZGV4XVs0XTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMTF9SQ0NfTVNJUkFOR0VfOToKKyAgICAgICAgICBmcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lSQU5HRV85KSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bM107CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzEwOgorICAgICAgICAgIGZyZXF1ZW5jeSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSVJBTkdFXzEwKSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bMl07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzExOgorICAgICAgICAgIGZyZXF1ZW5jeSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSVJBTkdFXzExKSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bMV07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZnJlcXVlbmN5ID0gMFU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3kgPj4gMVU7IC8qIFN5c3RlbWF0aWMgRGl2IGJ5IDIgKi8KKyAgICB9CisgICAgZWxzZSAvKiBTTVBTIGhhcyBubyBDbG9jayAqLworICAgIHsKKyAgICAgIGZyZXF1ZW5jeSA9IDBVOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBmcmVxdWVuY3kgPSAwVTsKKyAgfQorICByZXR1cm4gKGZyZXF1ZW5jeSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBDbG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICogIEBicmllZiAgRXh0ZW5kZWQgQ2xvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgY2xvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlCisgICAgYWN0aXZhdGlvbiBvciBkZWFjdGl2YXRpb24gb2YgTVNJIFBMTC1tb2RlLCBQTExTQUkxLCBQTExTQUkxMiwgTFNFIENTUywKKyAgICBMb3cgc3BlZWQgY2xvY2sgb3V0cHV0IGFuZCBjbG9jayBhZnRlciB3YWtlLXVwIGZyb20gU1RPUCBtb2RlLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgUExMU0FJMS4KKyAgKiBAcGFyYW0gIFBMTFNBSTFJbml0ICBwb2ludGVyIHRvIGFuIFJDQ19QTExTQUkxSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMU0FJMQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ0V4X0VuYWJsZVBMTFNBSTEoUkNDX1BMTFNBSTFJbml0VHlwZURlZiAgKlBMTFNBSTFJbml0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBjaGVjayBmb3IgUExMU0FJMSBQYXJhbWV0ZXJzIHVzZWQgdG8gb3V0cHV0IFBMTFNBSTFDTEsgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExOX1ZBTFVFKFBMTFNBSTFJbml0LT5QTExOKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUF9WQUxVRShQTExTQUkxSW5pdC0+UExMUCkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFFfVkFMVUUoUExMU0FJMUluaXQtPlBMTFEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExSX1ZBTFVFKFBMTFNBSTFJbml0LT5QTExSKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU0FJMUNMT0NLT1VUX1ZBTFVFKFBMTFNBSTFJbml0LT5QTExTQUkxQ2xvY2tPdXQpKTsKKworICAvKiBEaXNhYmxlIHRoZSBQTExTQUkxICovCisgIF9fSEFMX1JDQ19QTExTQUkxX0RJU0FCTEUoKTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFBMTFNBSTEgaXMgcmVhZHkgdG8gYmUgdXBkYXRlZCAqLworICB3aGlsZSAoTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpICE9IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTFNBSTFfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIE11bHRpcGxpY2F0aW9uIGZhY3RvciBOICovCisgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIERpdmlzaW9uIGZhY3RvcnMgUCwgUSBhbmQgUiAqLworICAgIF9fSEFMX1JDQ19QTExTQUkxX0NPTkZJRyhQTExTQUkxSW5pdC0+UExMTiwgUExMU0FJMUluaXQtPlBMTFAsIFBMTFNBSTFJbml0LT5QTExRLCBQTExTQUkxSW5pdC0+UExMUik7CisgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIENsb2NrIG91dHB1dChzKSAqLworICAgIF9fSEFMX1JDQ19QTExTQUkxQ0xLT1VUX0VOQUJMRShQTExTQUkxSW5pdC0+UExMU0FJMUNsb2NrT3V0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgUExMU0FJMSBhZ2FpbiBieSBzZXR0aW5nIFBMTFNBSTFPTiB0byAxKi8KKyAgICBfX0hBTF9SQ0NfUExMU0FJMV9FTkFCTEUoKTsKKworICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aWxsIFBMTFNBSTEgaXMgcmVhZHkgKi8KKyAgICB3aGlsZSAoTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpICE9IDFVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExTQUkxX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgUExMU0FJMS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NFeF9EaXNhYmxlUExMU0FJMSh2b2lkKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBEaXNhYmxlIHRoZSBQTExTQUkxICovCisgIF9fSEFMX1JDQ19QTExTQUkxX0RJU0FCTEUoKTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFBMTFNBSTEgaXMgcmVhZHkgKi8KKyAgd2hpbGUgKExMX1JDQ19QTExTQUkxX0lzUmVhZHkoKSAhPSAwVSkKKyAgeworICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExTQUkxX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQTExTQUkxIENsb2NrIG91dHB1dHMgKi8KKyAgX19IQUxfUkNDX1BMTFNBSTFDTEtPVVRfRElTQUJMRShSQ0NfUExMU0FJMV9TQUkxQ0xLIHwgUkNDX1BMTFNBSTFfVVNCQ0xLIHwgUkNDX1BMTFNBSTFfUk5HQ0xLIHwgUkNDX1BMTFNBSTFfQURDQ0xLKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBvc2NpbGxhdG9yIGNsb2NrIHNvdXJjZSBmb3Igd2FrZXVwIGZyb20gU3RvcCBhbmQgQ1NTIGJhY2t1cCBjbG9jay4KKyAgKiBAcGFyYW0gIFdha2VVcENsayAgV2FrZXVwIGNsb2NrCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19TVE9QX1dBS0VVUENMT0NLX01TSSAgTVNJIG9zY2lsbGF0b3Igc2VsZWN0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX1NUT1BfV0FLRVVQQ0xPQ0tfSFNJICBIU0kgb3NjaWxsYXRvciBzZWxlY3Rpb24KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hhbGwgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIG9uIEhTRSBoYXMgYmVlbgorICAqICAgICAgICAgZW5hYmxlZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X1dha2VVcFN0b3BDTEtDb25maWcodWludDMyX3QgV2FrZVVwQ2xrKQoreworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NUT1BfV0FLRVVQQ0xPQ0soV2FrZVVwQ2xrKSk7CisKKyAgX19IQUxfUkNDX1dBS0VVUFNUT1BfQ0xLX0NPTkZJRyhXYWtlVXBDbGspOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbS4KKyAgKiBAbm90ZSAgIFByaW9yIHRvIGVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSwgTFNFIG9zY2lsbGF0b3IgaXMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgd2l0aCBIQUxfUkNDX09zY0NvbmZpZygpIGFuZCB0aGUgTFNFIG9zY2lsbGF0b3IgY2xvY2sgaXMgdG8gYmUgc2VsZWN0ZWQgYXMgUlRDCisgICogICAgICAgICBjbG9jayB3aXRoIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0VuYWJsZUxTRUNTUyh2b2lkKQoreworICBMTF9SQ0NfTFNFX0VuYWJsZUNTUygpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0uCisgICogQG5vdGUgICBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGNhbiBvbmx5IGJlIGRpc2FibGVkIGFmdGVyIGEgTFNFIGZhaWx1cmUgZGV0ZWN0aW9uLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfRGlzYWJsZUxTRUNTUyh2b2lkKQoreworICBMTF9SQ0NfTFNFX0Rpc2FibGVDU1MoKTsKKworICAvKiBEaXNhYmxlIExTRSBDU1MgSVQgaWYgYW55ICovCisgIF9fSEFMX1JDQ19ESVNBQkxFX0lUKFJDQ19JVF9MU0VDU1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBJbnRlcnJ1cHQgJiBjb3JyZXNwb25kaW5nIEVYVEkgbGluZS4KKyAgKiBAbm90ZSAgIExTRSBDbG9jayBTZWN1cml0eSBTeXN0ZW0gSW50ZXJydXB0IGlzIG1hcHBlZCBvbiBSVEMgRVhUSSBsaW5lIDE4CisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9FbmFibGVMU0VDU1NfSVQodm9pZCkKK3sKKyAgLyogRW5hYmxlIExTRSBDU1MgKi8KKyAgTExfUkNDX0xTRV9FbmFibGVDU1MoKTsKKworICAvKiBFbmFibGUgTFNFIENTUyBJVCAqLworICBfX0hBTF9SQ0NfRU5BQkxFX0lUKFJDQ19JVF9MU0VDU1MpOworCisgIC8qIEVuYWJsZSBJVCBvbiBFWFRJIExpbmUgMTggKi8KKyAgX19IQUxfUkNDX0xTRUNTU19FWFRJX0VOQUJMRV9JVCgpOworICBfX0hBTF9SQ0NfTFNFQ1NTX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIHRoZSBSQ0MgTFNFIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0xTRUNTU19JUlFIYW5kbGVyKHZvaWQpCit7CisgIC8qIENoZWNrIFJDQyBMU0UgQ1NTRiBmbGFnICAqLworICBpZiAoX19IQUxfUkNDX0dFVF9JVChSQ0NfSVRfTFNFQ1NTKSkKKyAgeworICAgIC8qIFJDQyBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjaygpOworCisgICAgLyogQ2xlYXIgUkNDIExTRSBDU1MgcGVuZGluZyBiaXQgKi8KKyAgICBfX0hBTF9SQ0NfQ0xFQVJfSVQoUkNDX0lUX0xTRUNTUyk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSQ0NFeCBMU0UgQ2xvY2sgU2VjdXJpdHkgU3lzdGVtIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9MU0VDU1NfQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0xTRUNTU19DYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQgb24gTFNDTzEgcGluKFBBMikgb3IgTFNDMDIgcGluIChQSDMpIG9yIExTQ08zIHBpbiAoUEMxMikuCisgICogQG5vdGUgICBQQTIsIFBIMyBvciBQQzEyIHNob3VsZCBiZSBjb25maWd1cmVkIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlLgorICAqIEBwYXJhbSAgUkNDX0xTQ094ICBzcGVjaWZpZXMgdGhlIG91dHB1dCBkaXJlY3Rpb24gZm9yIHRoZSBjbG9jayBzb3VyY2UuCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTQ08xICBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIExTQ08xIHBpbihQQTIpCisgICogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0xTQ08yICBDbG9jayBzb3VyY2UgdG8gb3V0cHV0IG9uIExTQ08yIHBpbihQSDEzKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0NPMyAgQ2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBMU0NPMyBwaW4oUEMxMikKKyAgKiBAcGFyYW0gIFJDQ19MU0NPU291cmNlICBzcGVjaWZpZXMgdGhlIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNDT1NPVVJDRV9MU0kgIExTSSBjbG9jayBzZWxlY3RlZCBhcyBMU0NPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0NPU09VUkNFX0xTRSAgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIExTQ08gc291cmNlCisgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgICBMU0NPIHNob3VsZCBiZSBkaXNhYmxlIHdpdGggQHJlZiBIQUxfUkNDRXhfRGlzYWJsZUxTQ08KKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0xTQ09Db25maWcodWludDMyX3QgUkNDX0xTQ094LCB1aW50MzJfdCBSQ0NfTFNDT1NvdXJjZSkKK3sKKyAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3Q7CisgIEZsYWdTdGF0dXMgYmFja3VwY2hhbmdlZDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0xTQ08oUkNDX0xTQ094KSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNDT1NPVVJDRShSQ0NfTFNDT1NvdXJjZSkpOworCisgIC8qIENvbW1vbiBHUElPIGluaXQgcGFyYW1ldGVycyAqLworICBHUElPX0luaXRTdHJ1Y3QuTW9kZSAgICAgID0gR1BJT19NT0RFX0FGX1BQOworICBHUElPX0luaXRTdHJ1Y3QuU3BlZWQgICAgID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgR1BJT19Jbml0U3RydWN0LlB1bGwgICAgICA9IEdQSU9fTk9QVUxMOworCisgIC8qIFJDQ19MU0NPMSAqLworICBpZihSQ0NfTFNDT3ggPT0gUkNDX0xTQ08xKQorICB7CisgICAgLyogTFNDTzEgQ2xvY2sgRW5hYmxlICovCisgICAgX19MU0NPMV9DTEtfRU5BQkxFKCk7CisgICAgLyogQ29uZmlndWUgdGhlIExTQ08xIHBpbiBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSAqLworICAgIEdQSU9fSW5pdFN0cnVjdC5QaW4gICAgICAgPSBMU0NPMV9QSU47CisgICAgR1BJT19Jbml0U3RydWN0LkFsdGVybmF0ZSA9IEdQSU9fQUYwX0xTQ087CisgICAgSEFMX0dQSU9fSW5pdChMU0NPMV9HUElPX1BPUlQsICZHUElPX0luaXRTdHJ1Y3QpOworCisgIH0KKyAgZWxzZSBpZiAoUkNDX0xTQ094ID09IFJDQ19MU0NPMikKKyAgeworICAgIC8qIExTQ08yIENsb2NrIEVuYWJsZSAqLworICAgIF9fTFNDTzJfQ0xLX0VOQUJMRSgpOworICAgIC8qIENvbmZpZ3VlIHRoZSBMU0NPMiBwaW4gaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyAgICBHUElPX0luaXRTdHJ1Y3QuUGluICAgICAgID0gTFNDTzJfUElOOworICAgIEdQSU9fSW5pdFN0cnVjdC5BbHRlcm5hdGUgPSBHUElPX0FGMF9MU0NPOworICAgIEhBTF9HUElPX0luaXQoTFNDTzJfR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0KTsKKworICB9CisgIGVsc2UKKyAgeworICAgIC8qIExTQ08zIENsb2NrIEVuYWJsZSAqLworICAgIF9fTFNDTzNfQ0xLX0VOQUJMRSgpOworICAgIC8qIENvbmZpZ3VlIHRoZSBMU0NPMyBwaW4gaW4gYWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgKi8KKyAgICBHUElPX0luaXRTdHJ1Y3QuUGluICAgICAgID0gTFNDTzNfUElOOworICAgIEdQSU9fSW5pdFN0cnVjdC5BbHRlcm5hdGUgPSBHUElPX0FGNl9MU0NPOworICAgIEhBTF9HUElPX0luaXQoTFNDTzNfR1BJT19QT1JULCAmR1BJT19Jbml0U3RydWN0KTsKKyAgfQorCisgICAgLyogVXBkYXRlIExTQ09TRUwgY2xvY2sgc291cmNlIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAqLworICAgIGlmIChIQUxfSVNfQklUX0NMUihQV1ItPkNSMSwgUFdSX0NSMV9EQlApKQorICAgIHsKKyAgICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpOworICAgICAgYmFja3VwY2hhbmdlZCA9IFNFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGJhY2t1cGNoYW5nZWQgPSBSRVNFVDsKKyAgICB9CisKKyAgICBNT0RJRllfUkVHKFJDQy0+QkRDUiwgUkNDX0JEQ1JfTFNDT1NFTCB8IFJDQ19CRENSX0xTQ09FTiwgUkNDX0xTQ09Tb3VyY2UgfCBSQ0NfQkRDUl9MU0NPRU4pOworCisgICAgaWYgKGJhY2t1cGNoYW5nZWQgPT0gU0VUKQorICAgIHsKKyAgICAgIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3MoKTsKKyAgICB9CisKK30KKworCisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0IHRoZSBMb3cgU3BlZWQgY2xvY2sgc291cmNlIHRvIG91dHB1dCBvbiBMU0NPIHBpbiAoUEEyKS4KKyAgKiBAcGFyYW0gIExTQ09Tb3VyY2UgIHNwZWNpZmllcyB0aGUgTG93IFNwZWVkIGNsb2NrIHNvdXJjZSB0byBvdXRwdXQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfTFNDT1NPVVJDRV9MU0kgIExTSSBjbG9jayBzZWxlY3RlZCBhcyBMU0NPIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19MU0NPU09VUkNFX0xTRSAgTFNFIGNsb2NrIHNlbGVjdGVkIGFzIExTQ08gc291cmNlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9FbmFibGVMU0NPKHVpbnQzMl90IExTQ09Tb3VyY2UpCit7CisgIEdQSU9fSW5pdFR5cGVEZWYgR1BJT19Jbml0U3RydWN0OworICBGbGFnU3RhdHVzIGJhY2t1cGNoYW5nZWQ7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MU0NPU09VUkNFKExTQ09Tb3VyY2UpKTsKKworICAvKiBMU0NPIFBpbiBDbG9jayBFbmFibGUgKi8KKyAgX19MU0NPMV9DTEtfRU5BQkxFKCk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBMU0NPIHBpbiBpbiBhbmFsb2cgbW9kZSAqLworICBHUElPX0luaXRTdHJ1Y3QuUGluICAgPSBMU0NPMV9QSU47CisgIEdQSU9fSW5pdFN0cnVjdC5Nb2RlICA9IEdQSU9fTU9ERV9BRl9QUDsKKyAgR1BJT19Jbml0U3RydWN0LlNwZWVkID0gR1BJT19TUEVFRF9GUkVRX1ZFUllfSElHSDsKKyAgR1BJT19Jbml0U3RydWN0LlB1bGwgID0gR1BJT19OT1BVTEw7CisgIEdQSU9fSW5pdFN0cnVjdC5BbHRlcm5hdGUgPSBHUElPX0FGMF9MU0NPOworICBIQUxfR1BJT19Jbml0KExTQ08xX0dQSU9fUE9SVCwgJkdQSU9fSW5pdFN0cnVjdCk7CisKKyAgLyogVXBkYXRlIExTQ09TRUwgY2xvY2sgc291cmNlIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKKyAgeworICAgIEhBTF9QV1JfRW5hYmxlQmtVcEFjY2VzcygpOworICAgIGJhY2t1cGNoYW5nZWQgPSBTRVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgYmFja3VwY2hhbmdlZCA9IFJFU0VUOworICB9CisKKyAgTU9ESUZZX1JFRyhSQ0MtPkJEQ1IsIFJDQ19CRENSX0xTQ09TRUwgfCBSQ0NfQkRDUl9MU0NPRU4sIExTQ09Tb3VyY2UgfCBSQ0NfQkRDUl9MU0NPRU4pOworCisgIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkKKyAgeworICAgIEhBTF9QV1JfRGlzYWJsZUJrVXBBY2Nlc3MoKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIExvdyBTcGVlZCBjbG9jayBvdXRwdXQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9EaXNhYmxlTFNDTyh2b2lkKQoreworICBGbGFnU3RhdHVzIGJhY2t1cGNoYW5nZWQ7CisKKyAgaWYgKEhBTF9JU19CSVRfQ0xSKFBXUi0+Q1IxLCBQV1JfQ1IxX0RCUCkpCisgIHsKKyAgICAvKiBFbmFibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluICovCisgICAgSEFMX1BXUl9FbmFibGVCa1VwQWNjZXNzKCk7CisgICAgYmFja3VwY2hhbmdlZCA9IFNFVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBiYWNrdXBjaGFuZ2VkID0gUkVTRVQ7CisgIH0KKworICBMTF9SQ0NfTFNDT19EaXNhYmxlKCk7CisKKyAgLyogUmVzdG9yZSBwcmV2aW91cyBjb25maWd1cmF0aW9uICovCisgIGlmIChiYWNrdXBjaGFuZ2VkID09IFNFVCkKKyAgeworICAgIC8qIERpc2FibGUgYWNjZXNzIHRvIHRoZSBiYWNrdXAgZG9tYWluICovCisgICAgSEFMX1BXUl9EaXNhYmxlQmtVcEFjY2VzcygpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBQTEwtbW9kZSBvZiB0aGUgTVNJLgorICAqIEBub3RlICAgUHJpb3IgdG8gZW5hYmxlIHRoZSBQTEwtbW9kZSBvZiB0aGUgTVNJIGZvciBhdXRvbWF0aWMgaGFyZHdhcmUKKyAgKiAgICAgICAgIGNhbGlicmF0aW9uIExTRSBvc2NpbGxhdG9yIGlzIHRvIGJlIGVuYWJsZWQgd2l0aCBAcmVmIEhBTF9SQ0NfT3NjQ29uZmlnKCkuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9FbmFibGVNU0lQTExNb2RlKHZvaWQpCit7CisgIExMX1JDQ19NU0lfRW5hYmxlUExMTW9kZSgpIDsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBQTEwtbW9kZSBvZiB0aGUgTVNJLgorICAqIEBub3RlICAgUExMLW1vZGUgb2YgdGhlIE1TSSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHdoZW4gTFNFIG9zY2lsbGF0b3IgaXMgZGlzYWJsZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9EaXNhYmxlTVNJUExMTW9kZSh2b2lkKQoreworICBMTF9SQ0NfTVNJX0Rpc2FibGVQTExNb2RlKCkgOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IHRyaW1taW5nIHZhbHVlCisgICogQHBhcmFtIE9zY2lsbGF0b3JUeXBlIFNwZWNpZmllcyB0aGUgb3NjaWxsYXRvciB0byBiZSB0cmltbWVkCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTIgTFNJMiBvc2NpbGxhdG9yIHNlbGVjdGVkLgorICAqICAgICAgIFdoZW4gZGlzYWJsaW5nIGFuZCByZS1lbmFibGluZyB0aGUgTFNJMiB0aGVyZSBpcyBubyBuZWVkIGZvciByZS10cmltbWluZworICAqICAgICAgIFRyaW1taW5nIGlzIG9ubHkgbmVlZGVkIG9uY2UgYWZ0ZXIgYSBOUlNUIHJlc2V0LgorICAqICAgICAgIFRyaW1taW5nIHZhbHVlcyBjb21lcyBmcm9tIGZhY3RvcnkgdHJpbW1lZCBmbGFzaCBsb2NhdGlvbiAoMHgxRkZGNzU0OCkuCisgICogQG5vdGUgVGhlIExTSTIgb3NjaWxsYXRvciBtdXN0IGJlIGRpc2FibGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgdHJpbW1pbmcgZnVuY3Rpb24gdGhyb3VnaCBAcmVmIEhBTF9SQ0NfT3NjQ29uZmlnCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUkNDRXhfVHJpbU9zYyh1aW50MzJfdCBPc2NpbGxhdG9yVHlwZSkKK3sKKyAgI2RlZmluZSBGVExTSTJUUklNICgweEZVTCkKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGFzc2VydF9wYXJhbShJU19SQ0NfVFJJTU9TQyhPc2NpbGxhdG9yVHlwZSkpOworCisgIGlmKE9zY2lsbGF0b3JUeXBlID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kyKQorICB7CisgICAgaWYgKExMX1JDQ19MU0kyX0lzUmVhZHkoKSA9PSAxVSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBMU0kyIHRyaW1taW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGZhY3RvcnkgdHJpbW1lZCBGbGFzaCBsb2NhdGlvbiAqLworICAgICAgdWludDMyX3QgZmFjdG9yeVRyaW1taW5nID0gKCgqKHVpbnQzMl90ICopKDB4MUZGRjc1NDgpKSAmIEZUTFNJMlRSSU0pOworICAgICAgTExfUkNDX0xTSTJfU2V0VHJpbW1pbmcoZmFjdG9yeVRyaW1taW5nKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGRlZmdyb3VwIFJDQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zCisgKiAgQGJyaWVmICBFeHRlbmRlZCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIENvbnRyb2wgZnVuY3Rpb25zICAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICBGb3IgZGV2aWNlcyB3aXRoIENsb2NrIFJlY292ZXJ5IFN5c3RlbSBmZWF0dXJlIChDUlMpLCBSQ0MgRXh0ZW50aW9uIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIEluIFN5c3RlbSBjbG9jayBjb25maWcsIEhTSTQ4IG5lZWRzIHRvIGJlIGVuYWJsZWQKKworICAgICAgKCMpIEVuYWJsZSBDUlMgY2xvY2sgaW4gSVAgTVNQIGluaXQgd2hpY2ggd2lsbCB1c2UgQ1JTIGZ1bmN0aW9ucworCisgICAgICAoIykgQ2FsbCBDUlMgZnVuY3Rpb25zIGFzIGZvbGxvd3M6CisgICAgICAgICAgKCMjKSBQcmVwYXJlIHN5bmNocm9uaXphdGlvbiBjb25maWd1cmF0aW9uIG5lY2Vzc2FyeSBmb3IgSFNJNDggY2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgKCsrKykgRGVmYXVsdCB2YWx1ZXMgY2FuIGJlIHNldCBmb3IgZnJlcXVlbmN5IEVycm9yIE1lYXN1cmVtZW50IChyZWxvYWQgYW5kIGVycm9yIGxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsc28gSFNJNDggb3NjaWxsYXRvciBzbW9vdGggdHJpbW1pbmcuCisgICAgICAgICAgICAgICgrKyspIE1hY3JvIEByZWYgX19IQUxfUkNDX0NSU19SRUxPQURWQUxVRV9DQUxDVUxBVEUgY2FuIGJlIGFsc28gdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IHJlbG9hZCB2YWx1ZSB3aXRoIHRhcmdldCBhbmQgc3ljaHJvbml6YXRpb24gZnJlcXVlbmNpZXMgdmFsdWVzCisgICAgICAgICAgKCMjKSBDYWxsIGZ1bmN0aW9uIEByZWYgSEFMX1JDQ0V4X0NSU0NvbmZpZyB3aGljaAorICAgICAgICAgICAgICAoKysrKSBSZXNldHMgQ1JTIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlcyBDUlMgcmVnaXN0ZXJzIHdpdGggc3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlcyBhdXRvbWF0aWMgY2FsaWJyYXRpb24gYW5kIGZyZXF1ZW5jeSBlcnJvciBjb3VudGVyIGZlYXR1cmUKKyAgICAgICAgICAgTm90ZTogV2hlbiB1c2luZyBVU0IgTFBNIChMaW5rIFBvd2VyIE1hbmFnZW1lbnQpIGFuZCB0aGUgZGV2aWNlIGlzIGluIFNsZWVwIG1vZGUsIHRoZQorICAgICAgICAgICBwZXJpb2RpYyBVU0IgU09GIHdpbGwgbm90IGJlIGdlbmVyYXRlZCBieSB0aGUgaG9zdC4gTm8gU1lOQyBzaWduYWwgd2lsbCB0aGVyZWZvcmUgYmUKKyAgICAgICAgICAgcHJvdmlkZWQgdG8gdGhlIENSUyB0byBjYWxpYnJhdGUgdGhlIEhTSTQ4IG9uIHRoZSBydW4uIFRvIGd1YXJhbnRlZSB0aGUgcmVxdWlyZWQgY2xvY2sKKyAgICAgICAgICAgcHJlY2lzaW9uIGFmdGVyIHdha2luZyB1cCBmcm9tIFNsZWVwIG1vZGUsIHRoZSBMU0Ugb3IgcmVmZXJlbmNlIGNsb2NrIG9uIHRoZSBHUElPcworICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBhcyBTWU5DIHNpZ25hbC4KKworICAgICAgICAgICgjIykgQSBwb2xsaW5nIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHdhaXQgZm9yIGNvbXBsZXRlIHN5bmNocm9uaXphdGlvbgorICAgICAgICAgICAgICAoKysrKSBDYWxsIGZ1bmN0aW9uIEByZWYgSEFMX1JDQ0V4X0NSU1dhaXRTeW5jaHJvbml6YXRpb24oKQorICAgICAgICAgICAgICAoKysrKSBBY2NvcmRpbmcgdG8gQ1JTIHN0YXR1cywgdXNlciBjYW4gZGVjaWRlIHRvIGFkanVzdCBhZ2FpbiB0aGUgY2FsaWJyYXRpb24gb3IgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGlmIHN5bmNocm9uaXphdGlvbiBpcyBPSworCisgICAgICAoIykgVXNlciBjYW4gcmV0cmlldmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzeW5jaHJvbml6YXRpb24gaW4gY2FsbGluZyBmdW5jdGlvbgorICAgICAgICAgICAgQHJlZiBIQUxfUkNDRXhfQ1JTR2V0U3luY2hyb25pemF0aW9uSW5mbygpCisKKyAgICAgICgjKSBSZWdhcmRpbmcgc3luY2hyb25pemF0aW9uIHN0YXR1cyBhbmQgc3luY2hyb25pemF0aW9uIGluZm9ybWF0aW9uLCB1c2VyIGNhbiB0cnkgYSBuZXcgY2FsaWJyYXRpb24KKyAgICAgICAgICAgaW4gY2hhbmdpbmcgc3luY2hyb25pemF0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGNhbGwgYWdhaW4gSEFMX1JDQ0V4X0NSU0NvbmZpZy4KKyAgICAgICAgICAgTm90ZTogV2hlbiB0aGUgU1lOQyBldmVudCBpcyBkZXRlY3RlZCBkdXJpbmcgdGhlIGRvd25jb3VudGluZyBwaGFzZSAoYmVmb3JlIHJlYWNoaW5nIHRoZSB6ZXJvIHZhbHVlKSwKKyAgICAgICAgICAgaXQgbWVhbnMgdGhhdCB0aGUgYWN0dWFsIGZyZXF1ZW5jeSBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQgKGFuZCBzbywgdGhhdCB0aGUgVFJJTSB2YWx1ZSBzaG91bGQgYmUKKyAgICAgICAgICAgaW5jcmVtZW50ZWQpLCB3aGlsZSB3aGVuIGl0IGlzIGRldGVjdGVkIGR1cmluZyB0aGUgdXBjb3VudGluZyBwaGFzZSBpdCBtZWFucyB0aGF0IHRoZSBhY3R1YWwgZnJlcXVlbmN5CisgICAgICAgICAgIGlzIGhpZ2hlciAoYW5kIHRoYXQgdGhlIFRSSU0gdmFsdWUgc2hvdWxkIGJlIGRlY3JlbWVudGVkKS4KKworICAgICAgKCMpIEluIGludGVycnVwdCBtb2RlLCB1c2VyIGNhbiByZXNvcnQgdG8gdGhlIGF2YWlsYWJsZSBtYWNyb3MgKF9fSEFMX1JDQ19DUlNfWFhYX0lUKS4gSW50ZXJydXB0cyB3aWxsIGdvCisgICAgICAgICAgdGhyb3VnaCBDUlMgSGFuZGxlciAoQ1JTX0lSUW4vQ1JTX0lSUUhhbmRsZXIpCisgICAgICAgICAgICAgICgrKykgQ2FsbCBmdW5jdGlvbiBAcmVmIEhBTF9SQ0NFeF9DUlNDb25maWcoKQorICAgICAgICAgICAgICAoKyspIEVuYWJsZSBDUlNfSVJRbiAodGhhbmtzIHRvIE5WSUMgZnVuY3Rpb25zKQorICAgICAgICAgICAgICAoKyspIEVuYWJsZSBDUlMgaW50ZXJydXB0IChAcmVmIF9fSEFMX1JDQ19DUlNfRU5BQkxFX0lUKQorICAgICAgICAgICAgICAoKyspIEltcGxlbWVudCBDUlMgc3RhdHVzIG1hbmFnZW1lbnQgaW4gdGhlIGZvbGxvd2luZyB1c2VyIGNhbGxiYWNrcyBjYWxsZWQgZnJvbQorICAgICAgICAgICAgICAgICAgIEhBTF9SQ0NFeF9DUlNfSVJRSGFuZGxlcigpOgorICAgICAgICAgICAgICAgICAgICgrKyspIEByZWYgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgICAgKCsrKykgQHJlZiBIQUxfUkNDRXhfQ1JTX1N5bmNXYXJuQ2FsbGJhY2soKQorICAgICAgICAgICAgICAgICAgICgrKyspIEByZWYgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjaygpCisgICAgICAgICAgICAgICAgICAgKCsrKykgQHJlZiBIQUxfUkNDRXhfQ1JTX0Vycm9yQ2FsbGJhY2soKQorCisgICAgICAoIykgVG8gZm9yY2UgYSBTWU5DIEVWRU5ULCB1c2VyIGNhbiB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUoKS4KKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfUkNDRXhfQ1JTQ29uZmlnIChmb3IgaW5zdGFuY2UgaW4gU3lzdGljayBoYW5kbGVyKQorCitAZW5kdmVyYmF0aW0KKyAqIEB7CisgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCBhdXRvbWF0aWMgc3luY2hyb25pemF0aW9uIGZvciBwb2xsaW5nIG1vZGUKKyAgKiBAcGFyYW0gIHBJbml0IFBvaW50ZXIgb24gUkNDX0NSU0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfQ1JTQ29uZmlnKFJDQ19DUlNJbml0VHlwZURlZiAqcEluaXQpCit7CisgIHVpbnQzMl90IHZhbHVlOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX1NZTkNfRElWKHBJbml0LT5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfU1lOQ19TT1VSQ0UocEluaXQtPlNvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19TWU5DX1BPTEFSSVRZKHBJbml0LT5Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NSU19SRUxPQURWQUxVRShwSW5pdC0+UmVsb2FkVmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DUlNfRVJST1JMSU1JVChwSW5pdC0+RXJyb3JMaW1pdFZhbHVlKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfQ1JTX0hTSTQ4Q0FMSUJSQVRJT04ocEluaXQtPkhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSkpOworCisgIC8qIENPTkZJR1VSQVRJT04gKi8KKworICAvKiBCZWZvcmUgY29uZmlndXJhdGlvbiwgcmVzZXQgQ1JTIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcyovCisgIF9fSEFMX1JDQ19DUlNfRk9SQ0VfUkVTRVQoKTsKKyAgX19IQUxfUkNDX0NSU19SRUxFQVNFX1JFU0VUKCk7CisKKyAgLyogU2V0IHRoZSBTWU5DRElWWzI6MF0gYml0cyBhY2NvcmRpbmcgdG8gUHJlc2NhbGVyIHZhbHVlICovCisgIC8qIFNldCB0aGUgU1lOQ1NSQ1sxOjBdIGJpdHMgYWNjb3JkaW5nIHRvIFNvdXJjZSB2YWx1ZSAqLworICAvKiBTZXQgdGhlIFNZTkNTUE9MIGJpdCBhY2NvcmRpbmcgdG8gUG9sYXJpdHkgdmFsdWUgKi8KKyAgdmFsdWUgPSAocEluaXQtPlByZXNjYWxlciB8IHBJbml0LT5Tb3VyY2UgfCBwSW5pdC0+UG9sYXJpdHkpOworICAvKiBTZXQgdGhlIFJFTE9BRFsxNTowXSBiaXRzIGFjY29yZGluZyB0byBSZWxvYWRWYWx1ZSB2YWx1ZSAqLworICB2YWx1ZSB8PSBwSW5pdC0+UmVsb2FkVmFsdWU7CisgIC8qIFNldCB0aGUgRkVMSU1bNzowXSBiaXRzIGFjY29yZGluZyB0byBFcnJvckxpbWl0VmFsdWUgdmFsdWUgKi8KKyAgdmFsdWUgfD0gKHBJbml0LT5FcnJvckxpbWl0VmFsdWUgPDwgQ1JTX0NGR1JfRkVMSU1fUG9zKTsKKyAgV1JJVEVfUkVHKENSUy0+Q0ZHUiwgdmFsdWUpOworCisgIC8qIEFkanVzdCBIU0k0OCBvc2NpbGxhdG9yIHNtb290aCB0cmltbWluZyAqLworICAvKiBTZXQgdGhlIFRSSU1bNTowXSBiaXRzIGFjY29yZGluZyB0byBSQ0NfQ1JTX0hTSTQ4Q2FsaWJyYXRpb25WYWx1ZSB2YWx1ZSAqLworICBNT0RJRllfUkVHKENSUy0+Q1IsIENSU19DUl9UUklNLCAocEluaXQtPkhTSTQ4Q2FsaWJyYXRpb25WYWx1ZSA8PCBDUlNfQ1JfVFJJTV9Qb3MpKTsKKworICAvKiBTVEFSVCBBVVRPTUFUSUMgU1lOQ0hST05JWkFUSU9OKi8KKworICAvKiBFbmFibGUgQXV0b21hdGljIHRyaW1taW5nICYgRnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgKi8KKyAgU0VUX0JJVChDUlMtPkNSLCBDUlNfQ1JfQVVUT1RSSU1FTiB8IENSU19DUl9DRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIHRoZSBzb2Z0d2FyZSBzeW5jaHJvbml6YXRpb24gZXZlbnQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JDQ0V4X0NSU1NvZnR3YXJlU3luY2hyb25pemF0aW9uR2VuZXJhdGUodm9pZCkKK3sKKyAgTExfQ1JTX0dlbmVyYXRlRXZlbnRfU1dTWU5DKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHN5bmNocm9uaXphdGlvbiBpbmZvCisgICogQHBhcmFtICBwU3luY2hyb0luZm8gUG9pbnRlciBvbiBAcmVmIFJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SQ0NFeF9DUlNHZXRTeW5jaHJvbml6YXRpb25JbmZvKFJDQ19DUlNTeW5jaHJvSW5mb1R5cGVEZWYgKnBTeW5jaHJvSW5mbykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0ocFN5bmNocm9JbmZvICE9ICh2b2lkICopTlVMTCk7CisKKyAgLyogR2V0IHRoZSByZWxvYWQgdmFsdWUgKi8KKyAgcFN5bmNocm9JbmZvLT5SZWxvYWRWYWx1ZSA9IExMX0NSU19HZXRSZWxvYWRDb3VudGVyKCk7CisKKyAgLyogR2V0IEhTSTQ4IG9zY2lsbGF0b3Igc21vb3RoIHRyaW1taW5nICovCisgIHBTeW5jaHJvSW5mby0+SFNJNDhDYWxpYnJhdGlvblZhbHVlID0gTExfQ1JTX0dldEhTSTQ4U21vb3RoVHJpbW1pbmcoKTsKKworICAvKiBHZXQgRnJlcXVlbmN5IGVycm9yIGNhcHR1cmUgKi8KKyAgcFN5bmNocm9JbmZvLT5GcmVxRXJyb3JDYXB0dXJlID0gTExfQ1JTX0dldEZyZXFFcnJvckNhcHR1cmUoKTsKKworICAvKiBHZXQgRnJlcXVlbmN5IGVycm9yIGRpcmVjdGlvbiAqLworICBwU3luY2hyb0luZm8tPkZyZXFFcnJvckRpcmVjdGlvbiA9IExMX0NSU19HZXRGcmVxRXJyb3JEaXJlY3Rpb24oKTsKK30KKworLyoqCisqIEBicmllZiAgV2FpdCBmb3IgQ1JTIFN5bmNocm9uaXphdGlvbiBzdGF0dXMuCisqIEBwYXJhbSAgVGltZW91dCAgRHVyYXRpb24gb2YgdGhlIHRpbWVvdXQKKyogQG5vdGUgICBUaW1lb3V0IGlzIGJhc2VkIG9uIHRoZSBtYXhpbXVtIHRpbWUgdG8gcmVjZWl2ZSBhIFNZTkMgZXZlbnQgYmFzZWQgb24gc3luY2hyb25pemF0aW9uCisqICAgICAgICAgZnJlcXVlbmN5LgorKiBAbm90ZSAgIElmIFRpbWVvdXQgc2V0IHRvIEhBTF9NQVhfREVMQVksIEhBTF9USU1FT1VUIHdpbGwgYmUgbmV2ZXIgcmV0dXJuZWQuCisqIEByZXR2YWwgQ29tYmluYXRpb24gb2YgU3luY2hyb25pemF0aW9uIHN0YXR1cworKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19USU1FT1VUCisqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ09LCisqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ1dBUk4KKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DRVJSCisqICAgICAgICAgICAgQGFyZyBAcmVmIFJDQ19DUlNfU1lOQ01JU1MKKyogICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19UUklNT1ZGCisqLwordWludDMyX3QgSEFMX1JDQ0V4X0NSU1dhaXRTeW5jaHJvbml6YXRpb24odWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgY3Jzc3RhdHVzID0gUkNDX0NSU19OT05FOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogR2V0IHRpbWVvdXQgKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IGZvciBDUlMgZmxhZyBvciB0aW1lb3V0IGRldGVjdGlvbiAqLworICBkbworICB7CisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBjcnNzdGF0dXMgPSBSQ0NfQ1JTX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIENSUyBTWU5DT0sgZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ09LKSkKKyAgICB7CisgICAgICAvKiBDUlMgU1lOQyBldmVudCBPSyAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfU1lOQ09LOworCisgICAgICAvKiBDbGVhciBDUlMgU1lOQyBldmVudCBPSyBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ09LKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgU1lOQ1dBUk4gZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pKQorICAgIHsKKyAgICAgIC8qIENSUyBTWU5DIHdhcm5pbmcgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNXQVJOOworCisgICAgICAvKiBDbGVhciBDUlMgU1lOQ1dBUk4gYml0ICovCisgICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNXQVJOKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgVFJJTSBvdmVyZmxvdyBmbGFnICAqLworICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19UUklNT1ZGKSkKKyAgICB7CisgICAgICAvKiBDUlMgU1lOQyBFcnJvciAqLworICAgICAgY3Jzc3RhdHVzIHw9IFJDQ19DUlNfVFJJTU9WRjsKKworICAgICAgLyogQ2xlYXIgQ1JTIEVycm9yIGJpdCAqLworICAgICAgX19IQUxfUkNDX0NSU19DTEVBUl9GTEFHKFJDQ19DUlNfRkxBR19UUklNT1ZGKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgRXJyb3IgZmxhZyAgKi8KKyAgICBpZiAoX19IQUxfUkNDX0NSU19HRVRfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUikpCisgICAgeworICAgICAgLyogQ1JTIFNZTkMgRXJyb3IgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNFUlI7CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBiaXQgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfU1lOQ0VSUik7CisgICAgfQorCisgICAgLyogQ2hlY2sgQ1JTIFNZTkMgTWlzc2VkIGZsYWcgICovCisgICAgaWYgKF9fSEFMX1JDQ19DUlNfR0VUX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNNSVNTKSkKKyAgICB7CisgICAgICAvKiBDUlMgU1lOQyBNaXNzZWQgKi8KKyAgICAgIGNyc3N0YXR1cyB8PSBSQ0NfQ1JTX1NZTkNNSVNTOworCisgICAgICAvKiBDbGVhciBDUlMgU1lOQyBNaXNzZWQgYml0ICovCisgICAgICBfX0hBTF9SQ0NfQ1JTX0NMRUFSX0ZMQUcoUkNDX0NSU19GTEFHX1NZTkNNSVNTKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBDUlMgRXhwZWN0ZWQgU1lOQyBmbGFnICAqLworICAgIGlmIChfX0hBTF9SQ0NfQ1JTX0dFVF9GTEFHKFJDQ19DUlNfRkxBR19FU1lOQykpCisgICAgeworICAgICAgLyogZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgcmVhY2hlZCBhIHplcm8gdmFsdWUgKi8KKyAgICAgIF9fSEFMX1JDQ19DUlNfQ0xFQVJfRkxBRyhSQ0NfQ1JTX0ZMQUdfRVNZTkMpOworICAgIH0KKyAgfQorICB3aGlsZSAoUkNDX0NSU19OT05FID09IGNyc3N0YXR1cyk7CisKKyAgcmV0dXJuIGNyc3N0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIEhhbmRsZSB0aGUgQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIGludGVycnVwdCByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUkNDRXhfQ1JTX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgdWludDMyX3QgY3JzZXJyb3IgPSBSQ0NfQ1JTX05PTkU7CisgIC8qIEdldCBjdXJyZW50IElUIGZsYWdzIGFuZCBJVCBzb3VyY2VzIHZhbHVlcyAqLworICB1aW50MzJfdCBpdGZsYWdzID0gUkVBRF9SRUcoQ1JTLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhDUlMtPkNSKTsKKworICAvKiBDaGVjayBDUlMgU1lOQ09LIGZsYWcgICovCisgIGlmICgoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ09LKSAhPSAwVSkgJiYgKChpdHNvdXJjZXMgJiBSQ0NfQ1JTX0lUX1NZTkNPSykgIT0gMFUpKQorICB7CisgICAgLyogQ2xlYXIgQ1JTIFNZTkMgZXZlbnQgT0sgZmxhZyAqLworICAgIExMX0NSU19DbGVhckZsYWdfU1lOQ09LKCk7CisKKyAgICAvKiB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjaygpOworICB9CisgIC8qIENoZWNrIENSUyBTWU5DV0FSTiBmbGFnICAqLworICBlbHNlIGlmICgoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ1dBUk4pICE9IDBVKSAmJiAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfU1lOQ1dBUk4pICE9IDBVKSkKKyAgeworICAgIC8qIENsZWFyIENSUyBTWU5DV0FSTiBmbGFnICovCisgICAgTExfQ1JTX0NsZWFyRmxhZ19TWU5DV0FSTigpOworCisgICAgLyogdXNlciBjYWxsYmFjayAqLworICAgIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjaygpOworICB9CisgIC8qIENoZWNrIENSUyBFeHBlY3RlZCBTWU5DIGZsYWcgICovCisgIGVsc2UgaWYgKCgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19FU1lOQykgIT0gMFUpICYmICgoaXRzb3VyY2VzICYgUkNDX0NSU19JVF9FU1lOQykgIT0gMFUpKQorICB7CisgICAgLyogZnJlcXVlbmN5IGVycm9yIGNvdW50ZXIgcmVhY2hlZCBhIHplcm8gdmFsdWUgKi8KKyAgICBMTF9DUlNfQ2xlYXJGbGFnX0VTWU5DKCk7CisKKyAgICAvKiB1c2VyIGNhbGxiYWNrICovCisgICAgSEFMX1JDQ0V4X0NSU19FeHBlY3RlZFN5bmNDYWxsYmFjaygpOworICB9CisgIC8qIENoZWNrIENSUyBFcnJvciBmbGFncyAgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKCgoaXRmbGFncyAmIFJDQ19DUlNfRkxBR19FUlIpICE9IDBVKSAmJiAoKGl0c291cmNlcyAmIFJDQ19DUlNfSVRfRVJSKSAhPSAwVSkpCisgICAgeworICAgICAgaWYgKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1NZTkNFUlIpICE9IDBVKQorICAgICAgeworICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1NZTkNFUlI7CisgICAgICB9CisgICAgICBpZiAoKGl0ZmxhZ3MgJiBSQ0NfQ1JTX0ZMQUdfU1lOQ01JU1MpICE9IDBVKQorICAgICAgeworICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1NZTkNNSVNTOworICAgICAgfQorICAgICAgaWYgKChpdGZsYWdzICYgUkNDX0NSU19GTEFHX1RSSU1PVkYpICE9IDBVKQorICAgICAgeworICAgICAgICBjcnNlcnJvciB8PSBSQ0NfQ1JTX1RSSU1PVkY7CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIENSUyBFcnJvciBmbGFncyAqLworICAgICAgTExfQ1JTX0NsZWFyRmxhZ19FUlIoKTsKKworICAgICAgLyogdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgSEFMX1JDQ0V4X0NSU19FcnJvckNhbGxiYWNrKGNyc2Vycm9yKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gU1lOQ09LIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfU3luY09rQ2FsbGJhY2sodm9pZCkKK3sKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEByZWYgSEFMX1JDQ0V4X0NSU19TeW5jT2tDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gU1lOQ1dBUk4gaW50ZXJydXB0IGNhbGxiYWNrLgorICAqIEByZXR2YWwgbm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JDQ0V4X0NSU19TeW5jV2FybkNhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfU3luY1dhcm5DYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSQ0NFeCBDbG9jayBSZWNvdmVyeSBTeXN0ZW0gRXhwZWN0ZWQgU1lOQyBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICogQHJldHZhbCBub25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUkNDRXhfQ1JTX0V4cGVjdGVkU3luY0NhbGxiYWNrKHZvaWQpCit7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfRXhwZWN0ZWRTeW5jQ2FsbGJhY2sgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUkNDRXggQ2xvY2sgUmVjb3ZlcnkgU3lzdGVtIEVycm9yIGludGVycnVwdCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIEVycm9yIENvbWJpbmF0aW9uIG9mIEVycm9yIHN0YXR1cy4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgUkNDX0NSU19TWU5DRVJSCisgICogICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1NZTkNNSVNTCisgICogICAgICAgICAgIEBhcmcgQHJlZiBSQ0NfQ1JTX1RSSU1PVkYKKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayh1aW50MzJfdCBFcnJvcikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoRXJyb3IpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBAcmVmIEhBTF9SQ0NFeF9DUlNfRXJyb3JDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ0V4X1ByaXZhdGVfRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBwYXJhbWV0ZXJzIE4gJiBQIG9mIFBMTFNBSTEgYW5kIGVuYWJsZSBQTExTQUkxIG91dHB1dCBjbG9jayhzKS4KKyAgKiBAcGFyYW0gIFBMTFNBSTEgIHBvaW50ZXIgdG8gYW4gUkNDX1BMTFNBSTFJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBOICYgUCBhcyB3ZWxsIGFzIFBMTFNBSTEgb3V0cHV0IGNsb2NrKHMpCisgICoKKyAgKiBAbm90ZSAgIFBMTFNBSTEgaXMgdGVtcG9yYXJ5IGRpc2FibGUgdG8gYXBwbHkgbmV3IHBhcmFtZXRlcnMKKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ0V4X1BMTFNBSTFfQ29uZmlnTlAoUkNDX1BMTFNBSTFJbml0VHlwZURlZiAqUExMU0FJMSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogY2hlY2sgZm9yIFBMTFNBSTEgUGFyYW1ldGVycyB1c2VkIHRvIG91dHB1dCBQTExTQUkxQ0xLICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMTl9WQUxVRShQTExTQUkxLT5QTExOKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUF9WQUxVRShQTExTQUkxLT5QTExQKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU0FJMUNMT0NLT1VUX1ZBTFVFKFBMTFNBSTEtPlBMTFNBSTFDbG9ja091dCkpOworCisgIC8qIERpc2FibGUgdGhlIFBMTFNBSTEgKi8KKyAgX19IQUxfUkNDX1BMTFNBSTFfRElTQUJMRSgpOworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMU0FJMSBpcyByZWFkeSB0byBiZSB1cGRhdGVkICovCisgIHdoaWxlIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJMV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBMTFNBSTEgTXVsdGlwbGljYXRpb24gZmFjdG9yIE4gKi8KKyAgICBfX0hBTF9SQ0NfUExMU0FJMV9NVUxOX0NPTkZJRyhQTExTQUkxLT5QTExOKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgUExMU0FJMSBEaXZpc2lvbiBmYWN0b3IgUCAqLworICAgIF9fSEFMX1JDQ19QTExTQUkxX0RJVlBfQ09ORklHKFBMTFNBSTEtPlBMTFApOworCisgICAgLyogRW5hYmxlIHRoZSBQTExTQUkxIGFnYWluIGJ5IHNldHRpbmcgUExMU0FJMU9OIHRvIDEqLworICAgIF9fSEFMX1JDQ19QTExTQUkxX0VOQUJMRSgpOworCisgICAgLyogR2V0IFN0YXJ0IFRpY2sqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUExMU0FJMSBpcyByZWFkeSAqLworICAgIHdoaWxlIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTFNBSTFfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUExMU0FJMSBDbG9jayBvdXRwdXQocykgKi8KKyAgICAgIF9fSEFMX1JDQ19QTExTQUkxQ0xLT1VUX0VOQUJMRShQTExTQUkxLT5QTExTQUkxQ2xvY2tPdXQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBwYXJhbWV0ZXJzIE4gJiBRIG9mIFBMTFNBSTEgYW5kIGVuYWJsZSBQTExTQUkxIG91dHB1dCBjbG9jayhzKS4KKyAgKiBAcGFyYW0gIFBMTFNBSTEgIHBvaW50ZXIgdG8gYW4gUkNDX1BMTFNBSTFJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBOICYgUSBhcyB3ZWxsIGFzIFBMTFNBSTEgb3V0cHV0IGNsb2NrKHMpCisgICoKKyAgKiBAbm90ZSAgIFBMTFNBSTEgaXMgdGVtcG9yYXJ5IGRpc2FibGUgdG8gYXBwbHkgbmV3IHBhcmFtZXRlcnMKKyAgKgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFJDQ0V4X1BMTFNBSTFfQ29uZmlnTlEoUkNDX1BMTFNBSTFJbml0VHlwZURlZiAqUExMU0FJMSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogY2hlY2sgZm9yIFBMTFNBSTEgUGFyYW1ldGVycyB1c2VkIHRvIG91dHB1dCBQTExTQUkxQ0xLICovCisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMTl9WQUxVRShQTExTQUkxLT5QTExOKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMUV9WQUxVRShQTExTQUkxLT5QTExRKSk7CisgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU0FJMUNMT0NLT1VUX1ZBTFVFKFBMTFNBSTEtPlBMTFNBSTFDbG9ja091dCkpOworCisgIC8qIERpc2FibGUgdGhlIFBMTFNBSTEgKi8KKyAgX19IQUxfUkNDX1BMTFNBSTFfRElTQUJMRSgpOworCisgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUExMU0FJMSBpcyByZWFkeSB0byBiZSB1cGRhdGVkICovCisgIHdoaWxlIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMFUpCisgIHsKKyAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJMV9USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgIHsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBMTFNBSTEgTXVsdGlwbGljYXRpb24gZmFjdG9yIE4gKi8KKyAgICBfX0hBTF9SQ0NfUExMU0FJMV9NVUxOX0NPTkZJRyhQTExTQUkxLT5QTExOKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIFBMTFNBSTEgRGl2aXNpb24gZmFjdG9yIFEgKi8KKyAgICBfX0hBTF9SQ0NfUExMU0FJMV9ESVZRX0NPTkZJRyhQTExTQUkxLT5QTExRKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUExMU0FJMSBhZ2FpbiBieSBzZXR0aW5nIFBMTFNBSTFPTiB0byAxKi8KKyAgICBfX0hBTF9SQ0NfUExMU0FJMV9FTkFCTEUoKTsKKworICAgIC8qIEdldCBTdGFydCBUaWNrKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aWxsIFBMTFNBSTEgaXMgcmVhZHkgKi8KKyAgICB3aGlsZSAoTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpICE9IDFVKQorICAgIHsKKyAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExTQUkxX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFBMTFNBSTEgQ2xvY2sgb3V0cHV0KHMpICovCisgICAgICBfX0hBTF9SQ0NfUExMU0FJMUNMS09VVF9FTkFCTEUoUExMU0FJMS0+UExMU0FJMUNsb2NrT3V0KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgcGFyYW1ldGVycyBOICYgUiBvZiBQTExTQUkxIGFuZCBlbmFibGUgUExMU0FJMSBvdXRwdXQgY2xvY2socykuCisgICogQHBhcmFtICBQTExTQUkxICBwb2ludGVyIHRvIGFuIFJDQ19QTExTQUkxSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgTiAmIFIgYXMgd2VsbCBhcyBQTExTQUkxIG91dHB1dCBjbG9jayhzKQorICAqCisgICogQG5vdGUgICBQTExTQUkxIGlzIHRlbXBvcmFyeSBkaXNhYmxlIHRvIGFwcGx5IG5ldyBwYXJhbWV0ZXJzCisgICoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBSQ0NFeF9QTExTQUkxX0NvbmZpZ05SKFJDQ19QTExTQUkxSW5pdFR5cGVEZWYgKlBMTFNBSTEpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIGNoZWNrIGZvciBQTExTQUkxIFBhcmFtZXRlcnMgdXNlZCB0byBvdXRwdXQgUExMU0FJMUNMSyAqLworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTE5fVkFMVUUoUExMU0FJMS0+UExMTikpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFJfVkFMVUUoUExMU0FJMS0+UExMUikpOworICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFNBSTFDTE9DS09VVF9WQUxVRShQTExTQUkxLT5QTExTQUkxQ2xvY2tPdXQpKTsKKworICAvKiBEaXNhYmxlIHRoZSBQTExTQUkxICovCisgIF9fSEFMX1JDQ19QTExTQUkxX0RJU0FCTEUoKTsKKworICAvKiBHZXQgU3RhcnQgVGljayovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB0aWxsIFBMTFNBSTEgaXMgcmVhZHkgdG8gYmUgdXBkYXRlZCAqLworICB3aGlsZSAoTExfUkNDX1BMTFNBSTFfSXNSZWFkeSgpICE9IDBVKQorICB7CisgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTFNBSTFfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIE11bHRpcGxpY2F0aW9uIGZhY3RvciBOICovCisgICAgX19IQUxfUkNDX1BMTFNBSTFfTVVMTl9DT05GSUcoUExMU0FJMS0+UExMTik7CisgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIERpdmlzaW9uIGZhY3RvciBSICovCisgICAgX19IQUxfUkNDX1BMTFNBSTFfRElWUl9DT05GSUcoUExMU0FJMS0+UExMUik7CisKKyAgICAvKiBFbmFibGUgdGhlIFBMTFNBSTEgYWdhaW4gYnkgc2V0dGluZyBQTExTQUkxT04gdG8gMSovCisgICAgX19IQUxfUkNDX1BMTFNBSTFfRU5BQkxFKCk7CisKKyAgICAvKiBHZXQgU3RhcnQgVGljayovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIFdhaXQgdGlsbCBQTExTQUkxIGlzIHJlYWR5ICovCisgICAgd2hpbGUgKExMX1JDQ19QTExTQUkxX0lzUmVhZHkoKSAhPSAxVSkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJMV9USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBQTExTQUkxIENsb2NrIG91dHB1dChzKSAqLworICAgICAgX19IQUxfUkNDX1BMTFNBSTFDTEtPVVRfRU5BQkxFKFBMTFNBSTEtPlBMTFNBSTFDbG9ja091dCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIChQTExQQ0xLKSBmcmVxdWVuY3kgdXNlZCBmb3IgU0FJIGRvbWFpbgorICAqIEByZXR2YWwgUExMUENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworc3RhdGljIHVpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9QKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSBvciBNU0kgVmFsdWUgLyBQTExNKSAqIFBMTE4KKyAgICAgU0FJIERvbWFpbiBjbG9jayA9IFBMTF9WQ08gLyBQTExQCisgICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX01TSTogIC8qIE1TSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFIC8gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTENMS19TQUlfRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTF9HZXROKCksIExMX1JDQ19QTExfR2V0UCgpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTEwgY2xvY2sgKFBMTFFDTEspIGZyZXF1ZW5jeSB1c2VkIGZvciA0OCBNSHogZG9tYWluCisgICogQHJldHZhbCBQTExRQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCitzdGF0aWMgdWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1Eodm9pZCkKK3sKKyAgdWludDMyX3QgcGxsaW5wdXRmcmVxLCBwbGxzb3VyY2U7CisKKyAgLyogUExMX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFIG9yIE1TSSBWYWx1ZS8gUExMTSkgKiBQTExOCisgICAgIDQ4TSBEb21haW4gY2xvY2sgPSBQTExfVkNPIC8gUExMUQorICAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9NU0k6ICAvKiBNU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0k6ICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgaWYgKExMX1JDQ19IU0VfSXNFbmFibGVkRGl2MigpID09IDFVKQorICAgIHsKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLXzQ4TV9GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMX0dldE4oKSwgTExfUkNDX1BMTF9HZXRRKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTExTQUkxIGNsb2NrIChQTExTQUkxUkNMSykgZnJlcXVlbmN5IHVzZWQgZm9yIEFEQyBkb21haW4KKyAgKiBAcmV0dmFsIFBMTFNBSTFSQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCitzdGF0aWMgdWludDMyX3QgUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9SKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTFNBSTFfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgb3IgTVNJIFZhbHVlLyBQTExNKSAqIFBMTFNBSTFOICovCisgIC8qIDQ4TSBEb21haW4gY2xvY2sgID0gUExMU0FJMV9WQ08gLyBQTExTQUkxUiAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9NU0k6ICAvKiBNU0kgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExTQUkxX0FEQ19GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFNBSTFfR2V0TigpLCBMTF9SQ0NfUExMU0FJMV9HZXRSKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTExTQUkxIGNsb2NrIChQTExTQUkxUENMSykgZnJlcXVlbmN5IHVzZWQgZm9yIFNBSSBkb21haW4KKyAgKiBAcmV0dmFsIFBMTFNBSTFQQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCitzdGF0aWMgdWludDMyX3QgUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9QKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTFNBSTFfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgb3IgTVNJIFZhbHVlLyBQTExNKSAqIFBMTFNBSTFOICovCisgIC8qIFNBSSBEb21haW4gY2xvY2sgID0gUExMU0FJMV9WQ08gLyBQTExTQUkxUCAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9NU0k6ICAvKiBNU0kgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgaWYgKExMX1JDQ19IU0VfSXNFbmFibGVkRGl2MigpID09IDFVKQorICAgIHsKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTFNBSTFfU0FJX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMU0FJMV9HZXROKCksIExMX1JDQ19QTExTQUkxX0dldFAoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBMTFNBSTEgY2xvY2sgKFBMTFNBSTFRQ0xLKSBmcmVxdWVuY3kgdXNlZCBmb3IgNDhNaHogZG9tYWluCisgICogQHJldHZhbCBQTExTQUkxUUNMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLworc3RhdGljIHVpbnQzMl90IFJDQ19QTExTQUkxX0dldEZyZXFEb21haW5fUSh2b2lkKQoreworICB1aW50MzJfdCBwbGxpbnB1dGZyZXEsIHBsbHNvdXJjZTsKKworICAvKiBQTExTQUkxX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFIG9yIE1TSSBWYWx1ZS8gUExMTSkgKiBQTExTQUkxTiAqLworICAvKiA0OE0gRG9tYWluIGNsb2NrICA9IFBMTFNBSTFfVkNPIC8gUExMU0FJMVEgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfTVNJOiAgLyogTVNJIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICB7CisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUUgLyAyVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExTQUkxXzQ4TV9GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFNBSTFfR2V0TigpLCBMTF9SQ0NfUExMU0FJMV9HZXRRKCkpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1JDQ19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfcm5nLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTdmMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfcm5nLmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3JuZy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSTkcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFJORykgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgICBUaGUgUk5HIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICAgKCMpIEVuYWJsZSB0aGUgUk5HIGNvbnRyb2xsZXIgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1JOR19DTEtfRU5BQkxFKCkgbWFjcm8KKyAgICAgICAgICBpbiBIQUxfUk5HX01zcEluaXQoKS4KKyAgICAgICgjKSBBY3RpdmF0ZSB0aGUgUk5HIHBlcmlwaGVyYWwgdXNpbmcgSEFMX1JOR19Jbml0KCkgZnVuY3Rpb24uCisgICAgICAoIykgV2FpdCB1bnRpbCB0aGUgMzIgYml0IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIGNvbnRhaW5zIGEgdmFsaWQKKyAgICAgICAgICByYW5kb20gZGF0YSB1c2luZyAocG9sbGluZy9pbnRlcnJ1cHQpIG1vZGUuCisgICAgICAoIykgR2V0IHRoZSAzMiBiaXQgcmFuZG9tIG51bWJlciB1c2luZyBIQUxfUk5HX0dlbmVyYXRlUmFuZG9tTnVtYmVyKCkgZnVuY3Rpb24uCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1JOR19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfUk5HX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgOiBSTkcgRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBSTkcgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFJORyBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIFJlYWR5RGF0YUNhbGxiYWNrLCB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrczoKKyAgICByZXNwZWN0aXZlbHkgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKSAsIEByZWYgSEFMX1JOR19VblJlZ2lzdGVyUmVhZHlEYXRhQ2FsbGJhY2soKS4KKworICAgIFsuLl0KKyAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfUk5HX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1JOR19TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZSBAcmVmIEhBTF9STkdfRXJyb3JDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9STkdfSW5pdCgpCisgICAgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1JOR19Jbml0KCkgYW5kIEByZWYgSEFMX1JOR19EZUluaXQoKQorICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisKKyAgICBbLi5dCisgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfUk5HX1NUQVRFX1JFQURZIG9yIEhBTF9STkdfU1RBVEVfUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikKKyAgICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgQHJlZiBIQUxfUk5HX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9STkdfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9STkdfSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoUk5HKQorCisvKiogQGFkZHRvZ3JvdXAgUk5HCisgICogQGJyaWVmIFJORyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1JOR19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBSTkdfUHJpdmF0ZV9Db25zdGFudHMgUk5HIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgUk5HX1RJTUVPVVRfVkFMVUUgICAgIDJVCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIFJOR19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgUk5HIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICBpbiB0aGUgUk5HX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBSTkcgcGVyaXBoZXJhbAorICAgICAgKCspIEluaXRpYWxpemUgdGhlIFJORyBNU1AKKyAgICAgICgrKSBEZUluaXRpYWxpemUgUk5HIE1TUAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBSTkcgcGVyaXBoZXJhbCBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX0luaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIENoZWNrIHRoZSBSTkcgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhybmcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JOR19BTExfSU5TVEFOQ0UoaHJuZy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JOR19DRUQoaHJuZy0+SW5pdC5DbG9ja0Vycm9yRGV0ZWN0aW9uKSk7CisKKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChocm5nLT5TdGF0ZSA9PSBIQUxfUk5HX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhybmctPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICBocm5nLT5SZWFkeURhdGFDYWxsYmFjayAgPSBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgUmVhZHlEYXRhQ2FsbGJhY2sgICovCisgICAgaHJuZy0+RXJyb3JDYWxsYmFjayAgICAgID0gSEFMX1JOR19FcnJvckNhbGxiYWNrOyAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAqLworCisgICAgaWYgKGhybmctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhybmctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2soaHJuZyk7CisgIH0KKyNlbHNlCisgIGlmIChocm5nLT5TdGF0ZSA9PSBIQUxfUk5HX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhybmctPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBIQUxfUk5HX01zcEluaXQoaHJuZyk7CisgIH0KKyNlbmRpZiAvKiBVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX0JVU1k7CisKKyAgLyogQ2xvY2sgRXJyb3IgRGV0ZWN0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhocm5nLT5JbnN0YW5jZS0+Q1IsIFJOR19DUl9DRUQsIGhybmctPkluaXQuQ2xvY2tFcnJvckRldGVjdGlvbik7CisKKyAgLyogRW5hYmxlIHRoZSBSTkcgUGVyaXBoZXJhbCAqLworICBfX0hBTF9STkdfRU5BQkxFKGhybmcpOworCisgIC8qIEluaXRpYWxpemUgdGhlIFJORyBzdGF0ZSAqLworICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgY29kZSAqLworICBocm5nLT5FcnJvckNvZGUgPSBIQUxfUk5HX0VSUk9SX05PTkU7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFJORyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19EZUluaXQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIENoZWNrIHRoZSBSTkcgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhybmcgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDbGVhciBDbG9jayBFcnJvciBEZXRlY3Rpb24gYml0ICovCisgIENMRUFSX0JJVChocm5nLT5JbnN0YW5jZS0+Q1IsIFJOR19DUl9DRUQpOworICAvKiBEaXNhYmxlIHRoZSBSTkcgUGVyaXBoZXJhbCAqLworICBDTEVBUl9CSVQoaHJuZy0+SW5zdGFuY2UtPkNSLCBSTkdfQ1JfSUUgfCBSTkdfQ1JfUk5HRU4pOworCisgIC8qIENsZWFyIFJORyBpbnRlcnJ1cHQgc3RhdHVzIGZsYWdzICovCisgIENMRUFSX0JJVChocm5nLT5JbnN0YW5jZS0+U1IsIFJOR19TUl9DRUlTIHwgUk5HX1NSX1NFSVMpOworCisjaWYgKFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGhybmctPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGhybmctPk1zcERlSW5pdENhbGxiYWNrKGhybmcpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1JOR19Nc3BEZUluaXQoaHJuZyk7CisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogVXBkYXRlIHRoZSBSTkcgc3RhdGUgKi8KKyAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX1JFU0VUOworCisgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIGNvZGUgKi8KKyAgaHJuZy0+RXJyb3JDb2RlID0gSEFMX1JOR19FUlJPUl9OT05FOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisKKyAgLyogUmV0dXJuIHRoZSBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgUk5HIE1TUC4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9STkdfTXNwSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfTXNwSW5pdCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgdGhlIFJORyBNU1AuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUk5HX01zcERlSW5pdChSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfTXNwRGVJbml0IG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBSTkcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBocm5nIFJORyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfUmVnaXN0ZXJDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUk5HX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocm5nKTsKKworICBpZiAoSEFMX1JOR19TVEFURV9SRUFEWSA9PSBocm5nLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfUk5HX0VSUk9SX0NCX0lEIDoKKyAgICAgIGhybmctPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JOR19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUk5HX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1JOR19TVEFURV9SRVNFVCA9PSBocm5nLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfUk5HX01TUElOSVRfQ0JfSUQgOgorICAgICAgaHJuZy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGFuIFJORyBDYWxsYmFjaworICAqICAgICAgICAgUk5HIGNhbGxhYmNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJuZyBSTkcgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9STkdfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1VuUmVnaXN0ZXJDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgSEFMX1JOR19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocm5nKTsKKworICBpZiAoSEFMX1JOR19TVEFURV9SRUFEWSA9PSBocm5nLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgY2FzZSBIQUxfUk5HX0VSUk9SX0NCX0lEIDoKKyAgICAgIGhybmctPkVycm9yQ2FsbGJhY2sgPSBIQUxfUk5HX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JOR19NU1BJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9STkdfTXNwSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JOR19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHJuZy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcERlSW5pdDsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfUk5HX1NUQVRFX1JFU0VUID09IGhybmctPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9STkdfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocm5nLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUk5HX01zcEluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9STkdfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgIGhybmctPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JOR19Nc3BEZUluaXQ7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhybmcpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIERhdGEgUmVhZHkgUk5HIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhybmcgUk5HIGhhbmRsZQorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIERhdGEgUmVhZHkgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfUmVnaXN0ZXJSZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgcFJOR19SZWFkeURhdGFDYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgaWYgKEhBTF9STkdfU1RBVEVfUkVBRFkgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBocm5nLT5SZWFkeURhdGFDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBocm5nLT5FcnJvckNvZGUgfD0gSEFMX1JOR19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocm5nKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBEYXRhIFJlYWR5IFJORyBDYWxsYmFjaworICAqICAgICAgICAgRGF0YSBSZWFkeSBSTkcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrKCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJuZyBSTkcgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUk5HX1VuUmVnaXN0ZXJSZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJuZyk7CisKKyAgaWYgKEhBTF9STkdfU1RBVEVfUkVBRFkgPT0gaHJuZy0+U3RhdGUpCisgIHsKKyAgICBocm5nLT5SZWFkeURhdGFDYWxsYmFjayA9IEhBTF9STkdfUmVhZHlEYXRhQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFJlYWR5RGF0YUNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhybmctPkVycm9yQ29kZSB8PSBIQUxfUk5HX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhybmcpOworICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9STkdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSTkdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEdldCB0aGUgMzIgYml0IFJhbmRvbSBudW1iZXIKKyAgICAgICgrKSBHZXQgdGhlIDMyIGJpdCBSYW5kb20gbnVtYmVyIHdpdGggaW50ZXJydXB0IGVuYWJsZWQKKyAgICAgICgrKSBIYW5kbGUgUk5HIGludGVycnVwdCByZXF1ZXN0CisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGVzIGEgMzItYml0IHJhbmRvbSBudW1iZXIuCisgICogQG5vdGUgICBFYWNoIHRpbWUgdGhlIHJhbmRvbSBudW1iZXIgZGF0YSBpcyByZWFkIHRoZSBSTkdfRkxBR19EUkRZIGZsYWcKKyAgKiAgICAgICAgIGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZC4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcGFyYW0gIHJhbmRvbTMyYml0IHBvaW50ZXIgdG8gZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgdmFyaWFibGUgaWYgc3VjY2Vzc2Z1bC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KKworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JOR19HZW5lcmF0ZVJhbmRvbU51bWJlcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgdWludDMyX3QgKnJhbmRvbTMyYml0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIC8qIENoZWNrIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmIChocm5nLT5TdGF0ZSA9PSBIQUxfUk5HX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX0JVU1k7CisKKyAgICAvKiBHZXQgdGljayAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBDaGVjayBpZiBkYXRhIHJlZ2lzdGVyIGNvbnRhaW5zIHZhbGlkIHJhbmRvbSBkYXRhICovCisgICAgd2hpbGUgKF9fSEFMX1JOR19HRVRfRkxBRyhocm5nLCBSTkdfRkxBR19EUkRZKSA9PSBSRVNFVCkKKyAgICB7CisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUk5HX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRUFEWTsKKyAgICAgICAgaHJuZy0+RXJyb3JDb2RlIHw9IEhBTF9STkdfRVJST1JfVElNRU9VVDsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJuZyk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogR2V0IGEgMzJiaXQgUmFuZG9tIG51bWJlciAqLworICAgIGhybmctPlJhbmRvbU51bWJlciA9IGhybmctPkluc3RhbmNlLT5EUjsKKyAgICAqcmFuZG9tMzJiaXQgPSBocm5nLT5SYW5kb21OdW1iZXI7CisKKyAgICBocm5nLT5TdGF0ZSA9IEhBTF9STkdfU1RBVEVfUkVBRFk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJuZyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBHZW5lcmF0ZXMgYSAzMi1iaXQgcmFuZG9tIG51bWJlciBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9STkdfR2VuZXJhdGVSYW5kb21OdW1iZXJfSVQoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhybmcpOworCisgIC8qIENoZWNrIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmIChocm5nLT5TdGF0ZSA9PSBIQUxfUk5HX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogQ2hhbmdlIFJORyBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgaHJuZy0+U3RhdGUgPSBIQUxfUk5HX1NUQVRFX0JVU1k7CisKKyAgICAvKiBFbmFibGUgdGhlIFJORyBJbnRlcnJ1cHRzOiBEYXRhIFJlYWR5LCBDbG9jayBlcnJvciwgU2VlZCBlcnJvciAqLworICAgIF9fSEFMX1JOR19FTkFCTEVfSVQoaHJuZyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhocm5nKTsKKworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlcyBSTkcgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQG5vdGUgICBJbiB0aGUgY2FzZSBvZiBhIGNsb2NrIGVycm9yLCB0aGUgUk5HIGlzIG5vIG1vcmUgYWJsZSB0byBnZW5lcmF0ZQorICAqICAgICAgICAgcmFuZG9tIG51bWJlcnMgYmVjYXVzZSB0aGUgUExMNDhDTEsgY2xvY2sgaXMgbm90IGNvcnJlY3QuIFVzZXIgaGFzCisgICogICAgICAgICB0byBjaGVjayB0aGF0IHRoZSBjbG9jayBjb250cm9sbGVyIGlzIGNvcnJlY3RseSBjb25maWd1cmVkIHRvIHByb3ZpZGUKKyAgKiAgICAgICAgIHRoZSBSTkcgY2xvY2sgYW5kIGNsZWFyIHRoZSBDRUlTIGJpdCB1c2luZyBfX0hBTF9STkdfQ0xFQVJfSVQoKS4KKyAgKiAgICAgICAgIFRoZSBjbG9jayBlcnJvciBoYXMgbm8gaW1wYWN0IG9uIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZAorICAqICAgICAgICAgcmFuZG9tIG51bWJlcnMsIGFuZCB0aGUgUk5HX0RSIHJlZ2lzdGVyIGNvbnRlbnRzIGNhbiBiZSB1c2VkLgorICAqIEBub3RlICAgSW4gdGhlIGNhc2Ugb2YgYSBzZWVkIGVycm9yLCB0aGUgZ2VuZXJhdGlvbiBvZiByYW5kb20gbnVtYmVycyBpcworICAqICAgICAgICAgaW50ZXJydXB0ZWQgYXMgbG9uZyBhcyB0aGUgU0VDUyBiaXQgaXMgJzEnLiBJZiBhIG51bWJlciBpcworICAqICAgICAgICAgYXZhaWxhYmxlIGluIHRoZSBSTkdfRFIgcmVnaXN0ZXIsIGl0IG11c3Qgbm90IGJlIHVzZWQgYmVjYXVzZSBpdCBtYXkKKyAgKiAgICAgICAgIG5vdCBoYXZlIGVub3VnaCBlbnRyb3B5LiBJbiB0aGlzIGNhc2UsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNsZWFyIHRoZQorICAqICAgICAgICAgU0VJUyBiaXQgdXNpbmcgX19IQUxfUk5HX0NMRUFSX0lUKCksIHRoZW4gZGlzYWJsZSBhbmQgZW5hYmxlCisgICogICAgICAgICB0aGUgUk5HIHBlcmlwaGVyYWwgdG8gcmVpbml0aWFsaXplIGFuZCByZXN0YXJ0IHRoZSBSTkcuCisgICogQG5vdGUgICBVc2VyLXdyaXR0ZW4gSEFMX1JOR19FcnJvckNhbGxiYWNrKCkgQVBJIGlzIGNhbGxlZCBvbmNlIHdoZXRoZXIgU0VJUworICAqICAgICAgICAgb3IgQ0VJUyBhcmUgc2V0LgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgTm9uZQorCisgICovCit2b2lkIEhBTF9STkdfSVJRSGFuZGxlcihSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgdWludDMyX3Qgcm5nY2xvY2tlcnJvciA9IDBVOworCisgIC8qIFJORyBjbG9jayBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1JOR19HRVRfSVQoaHJuZywgUk5HX0lUX0NFSSkgIT0gUkVTRVQpCisgIHsKKyAgICBybmdjbG9ja2Vycm9yID0gMVU7CisgIH0KKyAgZWxzZSBpZiAoX19IQUxfUk5HX0dFVF9JVChocm5nLCBSTkdfSVRfU0VJKSAhPSBSRVNFVCkKKyAgeworICAgIHJuZ2Nsb2NrZXJyb3IgPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICBpZiAocm5nY2xvY2tlcnJvciA9PSAxVSkKKyAgeworICAgIC8qIENoYW5nZSBSTkcgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9FUlJPUjsKKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgY2FsbGJhY2sgKi8KKyAgICBocm5nLT5FcnJvckNhbGxiYWNrKGhybmcpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEVycm9yIGNhbGxiYWNrICovCisgICAgSEFMX1JOR19FcnJvckNhbGxiYWNrKGhybmcpOworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgLyogQ2xlYXIgdGhlIGNsb2NrIGVycm9yIGZsYWcgKi8KKyAgICBfX0hBTF9STkdfQ0xFQVJfSVQoaHJuZywgUk5HX0lUX0NFSSB8IFJOR19JVF9TRUkpOworICB9CisKKyAgLyogQ2hlY2sgUk5HIGRhdGEgcmVhZHkgaW50ZXJydXB0IG9jY3VycmVkICovCisgIGlmIChfX0hBTF9STkdfR0VUX0lUKGhybmcsIFJOR19JVF9EUkRZKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEdlbmVyYXRlIHJhbmRvbSBudW1iZXIgb25jZSwgc28gZGlzYWJsZSB0aGUgSVQgKi8KKyAgICBfX0hBTF9STkdfRElTQUJMRV9JVChocm5nKTsKKworICAgIC8qIEdldCB0aGUgMzJiaXQgUmFuZG9tIG51bWJlciAoRFJEWSBmbGFnIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCkgKi8KKyAgICBocm5nLT5SYW5kb21OdW1iZXIgPSBocm5nLT5JbnN0YW5jZS0+RFI7CisKKyAgICBpZiAoaHJuZy0+U3RhdGUgIT0gSEFMX1JOR19TVEFURV9FUlJPUikKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgUk5HIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgIGhybmctPlN0YXRlID0gSEFMX1JOR19TVEFURV9SRUFEWTsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocm5nKTsKKworI2lmIChVU0VfSEFMX1JOR19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBEYXRhIFJlYWR5IGNhbGxiYWNrICovCisgICAgICBocm5nLT5SZWFkeURhdGFDYWxsYmFjayhocm5nLCBocm5nLT5SYW5kb21OdW1iZXIpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgRGF0YSBSZWFkeSBjYWxsYmFjayAqLworICAgICAgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjayhocm5nLCBocm5nLT5SYW5kb21OdW1iZXIpOworI2VuZGlmIC8qIFVTRV9IQUxfUk5HX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgbGF0ZXN0IGdlbmVyYXRlZCByYW5kb20gbnVtYmVyLgorICAqIEBwYXJhbSAgaHJuZyBwb2ludGVyIHRvIGEgUk5HX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUk5HLgorICAqIEByZXR2YWwgcmFuZG9tIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUk5HX1JlYWRMYXN0UmFuZG9tTnVtYmVyKFJOR19IYW5kbGVUeXBlRGVmICpocm5nKQoreworICByZXR1cm4gKGhybmctPlJhbmRvbU51bWJlcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGF0YSBSZWFkeSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcGFyYW0gIHJhbmRvbTMyYml0IGdlbmVyYXRlZCByYW5kb20gbnVtYmVyLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JOR19SZWFkeURhdGFDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZywgdWludDMyX3QgcmFuZG9tMzJiaXQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhybmcpOworICBVTlVTRUQocmFuZG9tMzJiaXQpOworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBXaGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICBmdW5jdGlvbiBIQUxfUk5HX1JlYWR5RGF0YUNhbGxiYWNrIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUk5HIGVycm9yIGNhbGxiYWNrcy4KKyAgKiBAcGFyYW0gIGhybmcgcG9pbnRlciB0byBhIFJOR19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJORy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9STkdfRXJyb3JDYWxsYmFjayhSTkdfSGFuZGxlVHlwZURlZiAqaHJuZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJuZyk7CisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIFdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIGZ1bmN0aW9uIEhBTF9STkdfRXJyb3JDYWxsYmFjayBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIHRoZSBSTkcgc3RhdGUuCisgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9STkdfU3RhdGVUeXBlRGVmIEhBTF9STkdfR2V0U3RhdGUoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIHJldHVybiBocm5nLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFJORyBoYW5kbGUgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhybmc6IHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBSTkcgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9STkdfR2V0RXJyb3IoUk5HX0hhbmRsZVR5cGVEZWYgKmhybmcpCit7CisgIC8qIFJldHVybiBSTkcgRXJyb3IgQ29kZSAqLworICByZXR1cm4gaHJuZy0+RXJyb3JDb2RlOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisjZW5kaWYgLyogSEFMX1JOR19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFJORyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfcnRjLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU5YzNjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfcnRjLmMKQEAgLTAsMCArMSwxODQ2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9ydGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUlRDIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlYWwtVGltZSBDbG9jayAoUlRDKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgQ2FsZW5kYXIgKFRpbWUgYW5kIERhdGUpIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBBbGFybXMgKEFsYXJtIEEgYW5kIEFsYXJtIEIpIGNvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBXYWtlVXAgVGltZXIgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWVTdGFtcCBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGFtcGVycyBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgQmFja3VwIERhdGEgUmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gIAorICAqICAgICAgICAgICArIFJUQyBUYW1wZXIgYW5kIFRpbWVTdGFtcCBQaW5zIFNlbGVjdGlvbiAKKyAgKiAgICAgICAgICAgKyBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50CisgICogICAgICAgICAKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgT3BlcmF0aW5nIENvbmRpdGlvbiAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgcmVhbC10aW1lIGNsb2NrIChSVEMpIGFuZCB0aGUgUlRDIGJhY2t1cCByZWdpc3RlcnMgY2FuIGJlIHBvd2VyZWQKKyAgICAgICBmcm9tIHRoZSBWQkFUIHZvbHRhZ2Ugd2hlbiB0aGUgbWFpbiBWREQgc3VwcGx5IGlzIHBvd2VyZWQgb2ZmLgorICAgICAgIFRvIHJldGFpbiB0aGUgY29udGVudCBvZiB0aGUgUlRDIGJhY2t1cCByZWdpc3RlcnMgYW5kIHN1cHBseSB0aGUgUlRDIAorICAgICAgIHdoZW4gVkREIGlzIHR1cm5lZCBvZmYsIFZCQVQgcGluIGNhbiBiZSBjb25uZWN0ZWQgdG8gYW4gb3B0aW9uYWwKKyAgICAgICBzdGFuZGJ5IHZvbHRhZ2Ugc3VwcGxpZWQgYnkgYSBiYXR0ZXJ5IG9yIGJ5IGFub3RoZXIgc291cmNlLgorCisgICAgICAgICAgICAgICAgICAgIyMjIyMgQmFja3VwIERvbWFpbiBSZXNldCAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgYmFja3VwIGRvbWFpbiByZXNldCBzZXRzIGFsbCBSVEMgcmVnaXN0ZXJzIGFuZCB0aGUgUkNDX0JEQ1IgcmVnaXN0ZXIKKyAgICAgICB0byB0aGVpciByZXNldCB2YWx1ZXMuIAorICAgICAgIEEgYmFja3VwIGRvbWFpbiByZXNldCBpcyBnZW5lcmF0ZWQgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgb2NjdXJzOgorICAgICgrKSBTb2Z0d2FyZSByZXNldCwgdHJpZ2dlcmVkIGJ5IHNldHRpbmcgdGhlIEJEUlNUIGJpdCBpbiB0aGUgCisgICAgICAgIFJDQyBCYWNrdXAgZG9tYWluIGNvbnRyb2wgcmVnaXN0ZXIgKFJDQ19CRENSKS4KKyAgICAoKykgVkREIG9yIFZCQVQgcG93ZXIgb24sIGlmIGJvdGggc3VwcGxpZXMgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcG93ZXJlZCBvZmYuCisgICAgKCspIFRhbXBlciBkZXRlY3Rpb24gZXZlbnQgcmVzZXRzIGFsbCBkYXRhIGJhY2t1cCByZWdpc3RlcnMuCisKKyAgICAgICAgICAgICAgICAgICAjIyMjIyBCYWNrdXAgRG9tYWluIEFjY2VzcyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBBZnRlciByZXNldCwgdGhlIGJhY2t1cCBkb21haW4gKFJUQyByZWdpc3RlcnMsIFJUQyBiYWNrdXAgZGF0YSAKKyAgICAgICByZWdpc3RlcnMgYW5kIGJhY2t1cCBTUkFNKSBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBwb3NzaWJsZSB1bndhbnRlZCB3cml0ZSAKKyAgICAgICBhY2Nlc3Nlcy4KKworICBbLi5dIFRvIGVuYWJsZSBhY2Nlc3MgdG8gdGhlIFJUQyBEb21haW4gYW5kIFJUQyByZWdpc3RlcnMsIHByb2NlZWQgYXMgZm9sbG93czoKKyAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZyB3aXRoIFJDQ19QRVJJUEhDTEtfUlRDIGZvcgorICAgICAgICBQZXJpcGhDbG9ja1NlbGVjdGlvbiBhbmQgc2VsZWN0IFJUQ0Nsb2NrU2VsZWN0aW9uIChMU0UsIExTSSBvciBIU0VkaXYzMikKKyAgICAoKykgRW5hYmxlIFJUQyBDbG9jayB1c2luZyB0aGUgX19IQUxfUkNDX1JUQ19FTkFCTEUoKSBtYWNyby4KKworICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSBSVEMgRHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIGRvbWFpbiBhY2Nlc3MgKHNlZSBkZXNjcmlwdGlvbiBpbiB0aGUgc2VjdGlvbiBhYm92ZSkuCisgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDIFByZXNjYWxlciAoQXN5bmNocm9ub3VzIGFuZCBTeW5jaHJvbm91cykgYW5kIFJUQyBob3VyCisgICAgICAgIGZvcm1hdCB1c2luZyB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uCisKKyAgKioqIFRpbWUgYW5kIERhdGUgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgQ2FsZW5kYXIgKFRpbWUgYW5kIERhdGUpIHVzZSB0aGUgSEFMX1JUQ19TZXRUaW1lKCkKKyAgICAgICAgYW5kIEhBTF9SVENfU2V0RGF0ZSgpIGZ1bmN0aW9ucy4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIENhbGVuZGFyLCB1c2UgdGhlIEhBTF9SVENfR2V0VGltZSgpIGFuZCBIQUxfUlRDX0dldERhdGUoKSBmdW5jdGlvbnMuCisKKyAgKioqIEFsYXJtIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIFRvIGNvbmZpZ3VyZSB0aGUgUlRDIEFsYXJtIHVzZSB0aGUgSEFMX1JUQ19TZXRBbGFybSgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgWW91IGNhbiBhbHNvIGNvbmZpZ3VyZSB0aGUgUlRDIEFsYXJtIHdpdGggaW50ZXJydXB0IG1vZGUgdXNpbmcgdGhlIAorICAgICAgICAgICAgSEFMX1JUQ19TZXRBbGFybV9JVCgpIGZ1bmN0aW9uLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgQWxhcm0sIHVzZSB0aGUgSEFMX1JUQ19HZXRBbGFybSgpIGZ1bmN0aW9uLgorCisgICAgICAgICAgICAgICAgICAjIyMjIyBSVEMgYW5kIGxvdyBwb3dlciBtb2RlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSBUaGUgTUNVIGNhbiBiZSB3b2tlbiB1cCBmcm9tIGEgbG93IHBvd2VyIG1vZGUgYnkgYW4gUlRDIGFsdGVybmF0ZQorICAgICAgIGZ1bmN0aW9uLgorICBbLi5dIFRoZSBSVEMgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBhcmUgdGhlIFJUQyBhbGFybXMgKEFsYXJtIEEgYW5kIEFsYXJtIEIpLAorICAgICAgIFJUQyB3YWtldXAsIFJUQyB0YW1wZXIgZXZlbnQgZGV0ZWN0aW9uIGFuZCBSVEMgdGltZSBzdGFtcCBldmVudCBkZXRlY3Rpb24uCisgICAgICAgVGhlc2UgUlRDIGFsdGVybmF0ZSBmdW5jdGlvbnMgY2FuIHdha2UgdXAgdGhlIHN5c3RlbSBmcm9tIHRoZSBTdG9wIGFuZCAKKyAgICAgICBTdGFuZGJ5IGxvdyBwb3dlciBtb2Rlcy4KKyAgWy4uXSBUaGUgc3lzdGVtIGNhbiBhbHNvIHdha2UgdXAgZnJvbSBsb3cgcG93ZXIgbW9kZXMgd2l0aG91dCBkZXBlbmRpbmcKKyAgICAgICBvbiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgKEF1dG8td2FrZXVwIG1vZGUpLCBieSB1c2luZyB0aGUgUlRDIGFsYXJtCisgICAgICAgb3IgdGhlIFJUQyB3YWtldXAgZXZlbnRzLgorICBbLi5dIFRoZSBSVEMgcHJvdmlkZXMgYSBwcm9ncmFtbWFibGUgdGltZSBiYXNlIGZvciB3YWtpbmcgdXAgZnJvbSB0aGUKKyAgICAgICBTdG9wIG9yIFN0YW5kYnkgbW9kZSBhdCByZWd1bGFyIGludGVydmFscy4KKyAgICAgICBXYWtldXAgZnJvbSBTVE9QIGFuZCBTVEFOREJZIG1vZGVzIGlzIHBvc3NpYmxlIG9ubHkgd2hlbiB0aGUgUlRDIGNsb2NrIHNvdXJjZQorICAgICAgIGlzIExTRSBvciBMU0kuCisKKyAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXQorICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKworICBbLi5dCisgIEZ1bmN0aW9uIEByZWYgSEFMX1JUQ19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgICAgICAgOiBSVEMgQWxhcm0gQSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgQWxhcm1CRXZlbnRDYWxsYmFjayAgICAgICAgICA6IFJUQyBBbGFybSBCIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgICAgIDogUlRDIFRpbWVTdGFtcCBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgV2FrZVVwVGltZXJFdmVudENhbGxiYWNrICAgICA6IFJUQyBXYWtlVXBUaW1lciBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMSBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMiBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgVGFtcGVyM0V2ZW50Q2FsbGJhY2sgICAgICAgICA6IFJUQyBUYW1wZXIgMyBFdmVudCBjYWxsYmFjay4KKyAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA6IFJUQyBNc3BJbml0IGNhbGxiYWNrLgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogUlRDIE1zcERlSW5pdCBjYWxsYmFjay4KKyAgWy4uXQorICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgWy4uXQorICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfUlRDX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgd2VhayBmdW5jdGlvbi4KKyAgQHJlZiBIQUxfUlRDX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgQWxhcm1BRXZlbnRDYWxsYmFjayAgICAgICAgICA6IFJUQyBBbGFybSBBIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBBbGFybUJFdmVudENhbGxiYWNrICAgICAgICAgIDogUlRDIEFsYXJtIEIgRXZlbnQgY2FsbGJhY2suCisgICAgKCspIFRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgICAgICAgOiBSVEMgVGltZVN0YW1wIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBXYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgICAgIDogUlRDIFdha2VVcFRpbWVyIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIxRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAxIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIyRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAyIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBUYW1wZXIzRXZlbnRDYWxsYmFjayAgICAgICAgIDogUlRDIFRhbXBlciAzIEV2ZW50IGNhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgIDogUlRDIE1zcEluaXQgY2FsbGJhY2suCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgOiBSVEMgTXNwRGVJbml0IGNhbGxiYWNrLgorCisgIFsuLl0KKyAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1JUQ19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9SVENfU1RBVEVfUkVTRVQsCisgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucyA6CisgIGV4YW1wbGVzIEByZWYgQWxhcm1BRXZlbnRDYWxsYmFjaygpLCBAcmVmIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjaygpLgorICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgZnVuY3Rpb24KKyAgaW4gdGhlIEByZWYgSEFMX1JUQ19Jbml0KCkvQHJlZiBIQUxfUlRDX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwKKyAgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgQHJlZiBIQUxfUlRDX0luaXQoKS9AcmVmIEhBTF9SVENfRGVJbml0KCkKKyAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQorCisgIFsuLl0KKyAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfUlRDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgIGluIEhBTF9SVENfU1RBVEVfUkVBRFkgb3IgSEFMX1JUQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICB1c2luZyBAcmVmIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1JUQ19EZUluaXQoKQorICBvciBAcmVmIEhBTF9SVENfSW5pdCgpIGZ1bmN0aW9uLgorCisgIFsuLl0KKyAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICAgQGVuZHZlcmJhdGltCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworCisvKiogQGFkZHRvZ3JvdXAgUlRDCisgICogQGJyaWVmIFJUQyBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfUlRDX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEKKyAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIAorICAgICAgICAgUlRDIFByZXNjYWxlciAoU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyksIFJUQyBIb3VyIGZvcm1hdCwgZGlzYWJsZSAKKyAgICAgICAgIFJUQyByZWdpc3RlcnMgV3JpdGUgcHJvdGVjdGlvbiwgZW50ZXIgYW5kIGV4aXQgdGhlIFJUQyBpbml0aWFsaXphdGlvbiBtb2RlLAorICAgICAgICAgUlRDIHJlZ2lzdGVycyBzeW5jaHJvbml6YXRpb24gY2hlY2sgYW5kIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24gZW5hYmxlLgorICAgICAgICAgKCMpIFRoZSBSVEMgUHJlc2NhbGVyIGlzIHByb2dyYW1tZWQgdG8gZ2VuZXJhdGUgdGhlIFJUQyAxSHogdGltZSBiYXNlLgorICAgICAgICAgICAgIEl0IGlzIHNwbGl0IGludG8gMiBwcm9ncmFtbWFibGUgcHJlc2NhbGVycyB0byBtaW5pbWl6ZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgICAgICAgICAgICAoKyspIEEgNy1iaXQgYXN5bmNocm9ub3VzIHByZXNjYWxlciBhbmQgYSAxNS1iaXQgc3luY2hyb25vdXMgcHJlc2NhbGVyLgorICAgICAgICAgICAgICgrKykgV2hlbiBib3RoIHByZXNjYWxlcnMgYXJlIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNvbmZpZ3VyZSB0aGUgCisgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBwcmVzY2FsZXIgdG8gYSBoaWdoIHZhbHVlIHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgICAgICAgKCMpIEFsbCBSVEMgcmVnaXN0ZXJzIGFyZSBXcml0ZSBwcm90ZWN0ZWQuIFdyaXRpbmcgdG8gdGhlIFJUQyByZWdpc3RlcnMKKyAgICAgICAgICAgICBpcyBlbmFibGVkIGJ5IHdyaXRpbmcgYSBrZXkgaW50byB0aGUgV3JpdGUgUHJvdGVjdGlvbiByZWdpc3RlciwgUlRDX1dQUi4KKyAgICAgICAgICgjKSBUbyBjb25maWd1cmUgdGhlIFJUQyBDYWxlbmRhciwgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgZW50ZXIgCisgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gbW9kZS4gSW4gdGhpcyBtb2RlLCB0aGUgY2FsZW5kYXIgY291bnRlciBpcyBzdG9wcGVkCisgICAgICAgICAgICAgYW5kIGl0cyB2YWx1ZSBjYW4gYmUgdXBkYXRlZC4gV2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgaXMgCisgICAgICAgICAgICAgY29tcGxldGUsIHRoZSBjYWxlbmRhciByZXN0YXJ0cyBjb3VudGluZyBhZnRlciA0IFJUQ0NMSyBjeWNsZXMuCisgICAgICAgICAoIykgVG8gcmVhZCB0aGUgY2FsZW5kYXIgdGhyb3VnaCB0aGUgc2hhZG93IHJlZ2lzdGVycyBhZnRlciBDYWxlbmRhciAKKyAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAgICAgICAgICAgIHRoZSBzb2Z0d2FyZSBtdXN0IGZpcnN0IGNsZWFyIHRoZSBSU0YgZmxhZy4gVGhlIHNvZnR3YXJlIG11c3QgdGhlbgorICAgICAgICAgICAgIHdhaXQgdW50aWwgaXQgaXMgc2V0IGFnYWluIGJlZm9yZSByZWFkaW5nIHRoZSBjYWxlbmRhciwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuIGNvcnJlY3RseSBjb3BpZWQgaW50byB0aGUKKyAgICAgICAgICAgICBSVENfVFIgYW5kIFJUQ19EUiBzaGFkb3cgcmVnaXN0ZXJzLlRoZSBIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKCkgZnVuY3Rpb24gCisgICAgICAgICAgICAgaW1wbGVtZW50cyB0aGUgYWJvdmUgc29mdHdhcmUgc2VxdWVuY2UgKFJTRiBjbGVhciBhbmQgUlNGIGNoZWNrKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBSVEMgcGVyaXBoZXJhbAorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfSW5pdChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogQ2hlY2sgdGhlIFJUQyBwZXJpcGhlcmFsIHN0YXRlICovCisgIGlmKGhydGMgPT0gTlVMTCkKKyAgeworICAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoaHJ0Yy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSX0ZPUk1BVChocnRjLT5Jbml0LkhvdXJGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BU1lOQ0hfUFJFRElWKGhydGMtPkluaXQuQXN5bmNoUHJlZGl2KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfU1lOQ0hfUFJFRElWKGhydGMtPkluaXQuU3luY2hQcmVkaXYpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVQoaHJ0Yy0+SW5pdC5PdXRQdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19PVVRQVVRfUkVNQVAoaHJ0Yy0+SW5pdC5PdXRQdXRSZW1hcCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9QT0woaHJ0Yy0+SW5pdC5PdXRQdXRQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX09VVFBVVF9UWVBFKGhydGMtPkluaXQuT3V0UHV0VHlwZSkpOworCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZihocnRjLT5TdGF0ZSA9PSBIQUxfUlRDX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhydGMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICBocnRjLT5BbGFybUFFdmVudENhbGxiYWNrICAgICAgICAgID0gIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFsYXJtQUV2ZW50Q2FsbGJhY2sgICAgICAqLworICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2sgICAgICAgICAgPSAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgQWxhcm1CRXZlbnRDYWxsYmFjayAgICAgICovCisgICAgaHJ0Yy0+VGltZVN0YW1wRXZlbnRDYWxsYmFjayAgICAgICA9ICBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBUaW1lU3RhbXBFdmVudENhbGxiYWNrICAgKi8KKyAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2sgICAgID0gIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjayAqLworICAgIGhydGMtPlRhbXBlcjFFdmVudENhbGxiYWNrICAgICAgICAgPSAgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyMUV2ZW50Q2FsbGJhY2sgICAgICovCisgICAgaHJ0Yy0+VGFtcGVyMkV2ZW50Q2FsbGJhY2sgICAgICAgICA9ICBIQUxfUlRDRXhfVGFtcGVyMkV2ZW50Q2FsbGJhY2s7ICAgICAvKiBMZWdhY3kgd2VhayBUYW1wZXIyRXZlbnRDYWxsYmFjayAgICAgKi8KKyAgICBocnRjLT5UYW1wZXIzRXZlbnRDYWxsYmFjayAgICAgICAgID0gIEhBTF9SVENFeF9UYW1wZXIzRXZlbnRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFRhbXBlcjNFdmVudENhbGxiYWNrICAgICAqLworCisgICAgaWYoaHJ0Yy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHJ0Yy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2soaHJ0Yyk7CisKKyAgICBpZihocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhydGMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1JUQ19Nc3BEZUluaXQ7CisgICAgfQorICB9CisjZWxzZQorICBpZihocnRjLT5TdGF0ZSA9PSBIQUxfUlRDX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhydGMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyAgICAvKiBJbml0aWFsaXplIFJUQyBNU1AgKi8KKyAgICBIQUxfUlRDX01zcEluaXQoaHJ0Yyk7CisgIH0KKyNlbmRpZiAvKiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlICovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSVENfQ1IgRk1ULCBPU0VMIGFuZCBQT0wgQml0cyAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQzMl90KX4oUlRDX0NSX0ZNVCB8IFJUQ19DUl9PU0VMIHwgUlRDX0NSX1BPTCkpOworICAgIC8qIFNldCBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KShocnRjLT5Jbml0LkhvdXJGb3JtYXQgfCBocnRjLT5Jbml0Lk91dFB1dCB8IGhydGMtPkluaXQuT3V0UHV0UG9sYXJpdHkpOworCisgICAgLyogQ29uZmlndXJlIHRoZSBSVEMgUFJFUiAqLworICAgIGhydGMtPkluc3RhbmNlLT5QUkVSID0gKHVpbnQzMl90KShocnRjLT5Jbml0LlN5bmNoUHJlZGl2KTsKKyAgICBocnRjLT5JbnN0YW5jZS0+UFJFUiB8PSAodWludDMyX3QpKGhydGMtPkluaXQuQXN5bmNoUHJlZGl2IDw8IDE2VSk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSICY9ICgodWludDMyX3QpflJUQ19JU1JfSU5JVCk7CisKKyAgICBocnRjLT5JbnN0YW5jZS0+T1IgJj0gKHVpbnQzMl90KX4oUlRDX09SX0FMQVJNT1VUVFlQRSB8IFJUQ19PUl9PVVRfUk1QKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+T1IgfD0gKHVpbnQzMl90KShocnRjLT5Jbml0Lk91dFB1dFR5cGUgfCBocnRjLT5Jbml0Lk91dFB1dFJlbWFwKTsKKworICAgIC8qIElmIENSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgeworICAgICAgaWYoSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhocnRjKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlICovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgUlRDIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlc2V0IHRoZSBSVEMgQmFja3VwIERhdGEgcmVnaXN0ZXJzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19EZUluaXQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShocnRjLT5JbnN0YW5jZSkpOworCisgIC8qIFNldCBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlICovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUUiwgRFIgYW5kIENSIHJlZ2lzdGVycyAqLworICAgIGhydGMtPkluc3RhbmNlLT5UUiA9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+RFIgPSAoKHVpbnQzMl90KShSVENfRFJfV0RVXzAgfCBSVENfRFJfTVVfMCB8IFJUQ19EUl9EVV8wKSk7CisgICAgLyogUmVzZXQgQWxsIENSIGJpdHMgZXhjZXB0IENSWzI6MF0gKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gUlRDX0NSX1dVQ0tTRUw7CisKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB0aWxsIFdVVFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZSgoKGhydGMtPkluc3RhbmNlLT5JU1IpICYgUlRDX0lTUl9XVVRXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgYWxsIFJUQyBDUiByZWdpc3RlciBiaXRzICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+V1VUUiA9IFJUQ19XVVRSX1dVVDsKKyAgICBocnRjLT5JbnN0YW5jZS0+UFJFUiA9ICgodWludDMyX3QpKFJUQ19QUkVSX1BSRURJVl9BIHwgMHgwMDAwMDBGRlUpKTsKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlIgPSAodWludDMyX3QpMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPlNISUZUUiA9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+Q0FMUiA9ICh1aW50MzJfdCkweDAwMDAwMDAwVTsKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSAodWludDMyX3QpMHgwMDAwMDAwMFU7CisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CU1NSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworCisgICAgLyogUmVzZXQgSVNSIHJlZ2lzdGVyIGFuZCBleGl0IGluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KTB4MDAwMDAwMDBVOworCisgICAgLyogUmVzZXQgVGFtcGVyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VEFNUENSID0gMHgwMDAwMDAwMFU7CisKKyAgICAvKiBSZXNldCBPcHRpb24gcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+T1IgPSAweDAwMDAwMDAwVTsKKworICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9CWVBTSEFEKSA9PSAwVSkKKyAgICB7CisgICAgICBpZihIQUxfUlRDX1dhaXRGb3JTeW5jaHJvKGhydGMpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOyAgCisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGlmKGhydGMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcERlSW5pdDsKKyAgICB9CisKKyAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KKyAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayhocnRjKTsKKworI2Vsc2UKKyAgLyogRGUtSW5pdGlhbGl6ZSBSVEMgTVNQICovCisgIEhBTF9SVENfTXNwRGVJbml0KGhydGMpOworI2VuZGlmIC8qIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MpICovCisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFU0VUOworICAKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgUlRDIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0FMQVJNX0FfRVZFTlRfQ0JfSUQgICAgICAgICAgQWxhcm0gQSBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0FMQVJNX0JfRVZFTlRfQ0JfSUQgICAgICAgICAgQWxhcm0gQiBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RJTUVTVEFNUF9FVkVOVF9DQl9JRCAgICAgICAgVGltZVN0YW1wIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfV0FLRVVQVElNRVJfRVZFTlRfQ0JfSUQgICAgICBXYWtlVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEICAgICAgICAgIFRhbXBlciAxIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVEFNUEVSMl9FVkVOVF9DQl9JRCAgICAgICAgICBUYW1wZXIgMiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjNfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDMgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19NU1BJTklUX0NCX0lEICAgICAgICAgICAgICAgIE1zcCBJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfTVNQREVJTklUX0NCX0lEICAgICAgICAgICAgICBNc3AgRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUmVnaXN0ZXJDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgSEFMX1JUQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwUlRDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGlmKEhBTF9SVENfU1RBVEVfUkVBRFkgPT0gaHJ0Yy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkFsYXJtQUV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9CX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19USU1FU1RBTVBfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+VGltZVN0YW1wRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1dBS0VVUFRJTUVSX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPldha2VVcFRpbWVyRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1RBTVBFUjFfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+VGFtcGVyMUV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRhbXBlcjJFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfVEFNUEVSM19FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5UYW1wZXIzRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgY2FzZSBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihIQUxfUlRDX1NUQVRFX1JFU0VUID09IGhydGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICBicmVhazsKKworICAgY2FzZSBIQUxfUlRDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBSVEMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFJUQyBjYWxsYWJjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0FMQVJNX0FfRVZFTlRfQ0JfSUQgICAgICAgICAgQWxhcm0gQSBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX0FMQVJNX0JfRVZFTlRfQ0JfSUQgICAgICAgICAgQWxhcm0gQiBFdmVudCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RJTUVTVEFNUF9FVkVOVF9DQl9JRCAgICAgICAgVGltZVN0YW1wIEV2ZW50IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfV0FLRVVQVElNRVJfRVZFTlRfQ0JfSUQgICAgICBXYWtlVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19UQU1QRVIxX0VWRU5UX0NCX0lEICAgICAgICAgIFRhbXBlciAxIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfVEFNUEVSMl9FVkVOVF9DQl9JRCAgICAgICAgICBUYW1wZXIgMiBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfUlRDX1RBTVBFUjNfRVZFTlRfQ0JfSUQgICAgICAgICAgVGFtcGVyIDMgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1JUQ19NU1BJTklUX0NCX0lEIE1zcCBJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9SVENfTVNQREVJTklUX0NCX0lEIE1zcCBEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfVW5SZWdpc3RlckNhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBIQUxfUlRDX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGlmKEhBTF9SVENfU1RBVEVfUkVBRFkgPT0gaHJ0Yy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgIGNhc2UgSEFMX1JUQ19BTEFSTV9BX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPkFsYXJtQUV2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWxhcm1BRXZlbnRDYWxsYmFjayAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfQUxBUk1fQl9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5BbGFybUJFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFsYXJtQkV2ZW50Q2FsbGJhY2sgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1RJTUVTVEFNUF9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5UaW1lU3RhbXBFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIFRpbWVTdGFtcEV2ZW50Q2FsbGJhY2sgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1dBS0VVUFRJTUVSX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPldha2VVcFRpbWVyRXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFdha2VVcFRpbWVyRXZlbnRDYWxsYmFjayAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfVEFNUEVSMV9FVkVOVF9DQl9JRCA6CisgICAgICBocnRjLT5UYW1wZXIxRXZlbnRDYWxsYmFjayA9IEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBUYW1wZXIxRXZlbnRDYWxsYmFjayAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19UQU1QRVIyX0VWRU5UX0NCX0lEIDoKKyAgICAgIGhydGMtPlRhbXBlcjJFdmVudENhbGxiYWNrID0gSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRhbXBlcjJFdmVudENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUlRDX1RBTVBFUjNfRVZFTlRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+VGFtcGVyM0V2ZW50Q2FsbGJhY2sgPSBIQUxfUlRDRXhfVGFtcGVyM0V2ZW50Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgVGFtcGVyM0V2ZW50Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcEluaXQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcERlSW5pdDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZihIQUxfUlRDX1NUQVRFX1JFU0VUID09IGhydGMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICBjYXNlIEhBTF9SVENfTVNQSU5JVF9DQl9JRCA6CisgICAgICBocnRjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcEluaXQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1JUQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgaHJ0Yy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfUlRDX01zcERlSW5pdDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgUlRDIE1TUC4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlICAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfTXNwSW5pdChSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLyAKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFJUQyBNU1AuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZSAKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENfTXNwRGVJbml0KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8gCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICogIEBicmllZiAgIFJUQyBUaW1lIGFuZCBEYXRlIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIFRpbWUgYW5kIERhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIAorIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgVGltZSBhbmQgRGF0ZSBmZWF0dXJlcworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBSVEMgY3VycmVudCB0aW1lLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gc1RpbWUgUG9pbnRlciB0byBUaW1lIHN0cnVjdHVyZQorICAqIEBwYXJhbSBGb3JtYXQgU3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhlIGVudGVyZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldFRpbWUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UaW1lVHlwZURlZiAqc1RpbWUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfREFZTElHSFRfU0FWSU5HKHNUaW1lLT5EYXlMaWdodFNhdmluZykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NUT1JFX09QRVJBVElPTihzVGltZS0+U3RvcmVPcGVyYXRpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoc1RpbWUtPkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzVGltZS0+VGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc1RpbWUtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KHNUaW1lLT5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoc1RpbWUtPk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoc1RpbWUtPlNlY29uZHMpKTsKKworICAgIHRtcHJlZyA9ICh1aW50MzJfdCkoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzVGltZS0+SG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNUaW1lLT5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNUaW1lLT5TZWNvbmRzKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdClzVGltZS0+VGltZUZvcm1hdCkgPDwgMTZVKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9GTVQpICE9IDBVKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjEyKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNUaW1lLT5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzVGltZS0+VGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPkhvdXJzKSkpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoUlRDX0JjZDJUb0J5dGUoc1RpbWUtPk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKFJUQ19CY2QyVG9CeXRlKHNUaW1lLT5TZWNvbmRzKSkpOworICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KShzVGltZS0+SG91cnMpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNUaW1lLT5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc1RpbWUtPlNlY29uZHMpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzVGltZS0+VGltZUZvcm1hdCkgPDwgMTZVKSk7CisgIH0KKyAgVU5VU0VEKHRtcHJlZyk7CisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmKFJUQ19FbnRlckluaXRNb2RlKGhydGMpICE9IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogU2V0IFJUQyBzdGF0ZSAqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIFJUQ19UUiByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5UUiA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX1RSX1JFU0VSVkVEX01BU0spOworCisgICAgLyogQ2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICAgIGhydGMtPkluc3RhbmNlLT5DUiAmPSAoKHVpbnQzMl90KX5SVENfQ1JfQktQKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgUlRDX0NSIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoc1RpbWUtPkRheUxpZ2h0U2F2aW5nIHwgc1RpbWUtPlN0b3JlT3BlcmF0aW9uKTsKKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKCh1aW50MzJfdCl+UlRDX0lTUl9JTklUKTsKKworICAgIC8qIElmICBDUl9CWVBTSEFEIGJpdCA9IDAsIHdhaXQgZm9yIHN5bmNocm8gZWxzZSB0aGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgKi8KKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0JZUFNIQUQpID09IDBVKQorICAgIHsKKyAgICAgIGlmKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworICAgIAorICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7IAorCisgICByZXR1cm4gSEFMX09LOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IFJUQyBjdXJyZW50IHRpbWUuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBzVGltZSBQb2ludGVyIHRvIFRpbWUgc3RydWN0dXJlIHdpdGggSG91cnMsIE1pbnV0ZXMgYW5kIFNlY29uZHMgZmllbGRzIHJldHVybmVkIAorICAqICAgICAgICAgICAgICAgIHdpdGggaW5wdXQgZm9ybWF0IChCSU4gb3IgQkNEKSwgYWxzbyBTdWJTZWNvbmRzIGZpZWxkIHJldHVybmluZyB0aGUKKyAgKiAgICAgICAgICAgICAgICBSVENfU1NSIHJlZ2lzdGVyIGNvbnRlbnQgYW5kIFNlY29uZEZyYWN0aW9uIGZpZWxkIHRoZSBTeW5jaHJvbm91cyBwcmUtc2NhbGVyCisgICogICAgICAgICAgICAgICAgZmFjdG9yIHRvIGJlIHVzZWQgZm9yIHNlY29uZCBmcmFjdGlvbiByYXRpbyBjb21wdXRhdGlvbi4KKyAgKiBAcGFyYW0gRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdCAKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEBub3RlICBZb3UgY2FuIHVzZSBTdWJTZWNvbmRzIGFuZCBTZWNvbmRGcmFjdGlvbiAoc1RpbWUgc3RydWN0dXJlIGZpZWxkcyByZXR1cm5lZCkgdG8gY29udmVydCBTdWJTZWNvbmRzCisgICogICAgICAgIHZhbHVlIGluIHNlY29uZCBmcmFjdGlvbiByYXRpbyB3aXRoIHRpbWUgdW5pdCBmb2xsb3dpbmcgZ2VuZXJpYyBmb3JtdWxhOgorICAqICAgICAgICBTZWNvbmQgZnJhY3Rpb24gcmF0aW8gKiB0aW1lX3VuaXQ9IFsoU2Vjb25kRnJhY3Rpb24tU3ViU2Vjb25kcykvKFNlY29uZEZyYWN0aW9uKzEpXSAqIHRpbWVfdW5pdAorICAqICAgICAgICBUaGlzIGNvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBvbmx5IGlmIG5vIHNoaWZ0IG9wZXJhdGlvbiBpcyBwZW5kaW5nIChpZS4gU0hGUD0wKSB3aGVuIFBSRURJVl9TID49IFNTCisgICogQG5vdGUgIFlvdSBtdXN0IGNhbGwgSEFMX1JUQ19HZXREYXRlKCkgYWZ0ZXIgSEFMX1JUQ19HZXRUaW1lKCkgdG8gdW5sb2NrIHRoZSB2YWx1ZXMgCisgICogICAgICAgIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIgc2hhZG93IHJlZ2lzdGVycyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgdGltZSBhbmQgZGF0ZSB2YWx1ZXMuCisgICogICAgICAgIFJlYWRpbmcgUlRDIGN1cnJlbnQgdGltZSBsb2NrcyB0aGUgdmFsdWVzIGluIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgQ3VycmVudCBkYXRlIGlzIHJlYWQKKyAgKiAgICAgICAgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gdGhlIHRpbWUgYW5kIGRhdGUgdmFsdWVzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRUaW1lKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYgKnNUaW1lLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworICAvKiBHZXQgc3Vic2Vjb25kcyBzdHJ1Y3R1cmUgZmllbGQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciovCisgIHNUaW1lLT5TdWJTZWNvbmRzID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+U1NSKTsKKworICAvKiBHZXQgU2Vjb25kRnJhY3Rpb24gc3RydWN0dXJlIGZpZWxkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgZmllbGQqLworICBzVGltZS0+U2Vjb25kRnJhY3Rpb24gPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5QUkVSICYgUlRDX1BSRVJfUFJFRElWX1MpOworICAKKyAgLyogR2V0IHRoZSBUUiByZWdpc3RlciAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UUiAmIFJUQ19UUl9SRVNFUlZFRF9NQVNLKTsKKworICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzVGltZS0+SG91cnMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfSFQgfCBSVENfVFJfSFUpKSA+PiAxNlUpOworICBzVGltZS0+TWludXRlcyA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19UUl9NTlQgfCBSVENfVFJfTU5VKSkgPj44VSk7CisgIHNUaW1lLT5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfVFJfU1QgfCBSVENfVFJfU1UpKTsKKyAgc1RpbWUtPlRpbWVGb3JtYXQgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfVFJfUE0pKSA+PiAxNlUpOworCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICAvKiBDb252ZXJ0IHRoZSB0aW1lIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHRvIEJpbmFyeSBmb3JtYXQgKi8KKyAgICBzVGltZS0+SG91cnMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZS0+SG91cnMpOworICAgIHNUaW1lLT5NaW51dGVzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPk1pbnV0ZXMpOworICAgIHNUaW1lLT5TZWNvbmRzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWUtPlNlY29uZHMpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgUlRDIGN1cnJlbnQgZGF0ZS4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIHNEYXRlIFBvaW50ZXIgdG8gZGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gRm9ybWF0IHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46IEJpbmFyeSBkYXRhIGZvcm1hdCAKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXREYXRlKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfRGF0ZVR5cGVEZWYgKnNEYXRlLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IGRhdGV0bXByZWc7CisKKyAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworIC8qIFByb2Nlc3MgTG9ja2VkICovCisgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZigoRm9ybWF0ID09IFJUQ19GT1JNQVRfQklOKSAmJiAoKHNEYXRlLT5Nb250aCAmIDB4MTBVKSA9PSAweDEwVSkpCisgIHsKKyAgICBzRGF0ZS0+TW9udGggPSAodWludDhfdCkoKHNEYXRlLT5Nb250aCAmICh1aW50OF90KX4oMHgxMFUpKSArICh1aW50OF90KTB4MEFVKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19SVENfV0VFS0RBWShzRGF0ZS0+V2Vla0RheSkpOworCisgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SVENfWUVBUihzRGF0ZS0+WWVhcikpOworICAgIGFzc2VydF9wYXJhbShJU19SVENfTU9OVEgoc0RhdGUtPk1vbnRoKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19EQVRFKHNEYXRlLT5EYXRlKSk7CisKKyAgIGRhdGV0bXByZWcgPSAoKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzRGF0ZS0+WWVhcikgPDwgMTZVKSB8IFwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzRGF0ZS0+TW9udGgpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzRGF0ZS0+RGF0ZSkpIHwgXAorICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXNEYXRlLT5XZWVrRGF5IDw8IDEzVSkpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19SVENfWUVBUihSVENfQmNkMlRvQnl0ZShzRGF0ZS0+WWVhcikpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01PTlRIKFJUQ19CY2QyVG9CeXRlKHNEYXRlLT5Nb250aCkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0RhdGUtPkRhdGUpKSk7CisKKyAgICBkYXRldG1wcmVnID0gKCgoKHVpbnQzMl90KXNEYXRlLT5ZZWFyKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3Qpc0RhdGUtPk1vbnRoKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXNEYXRlLT5EYXRlKSB8IFwKKyAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KXNEYXRlLT5XZWVrRGF5KSA8PCAxM1UpKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmKFJUQ19FbnRlckluaXRNb2RlKGhydGMpICE9IEhBTF9PSykKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogU2V0IFJUQyBzdGF0ZSovCisgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0VSUk9SOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgUlRDX0RSIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkRSID0gKHVpbnQzMl90KShkYXRldG1wcmVnICYgUlRDX0RSX1JFU0VSVkVEX01BU0spOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAoKHVpbnQzMl90KX5SVENfSVNSX0lOSVQpOworCisgICAgLyogSWYgIENSX0JZUFNIQUQgYml0ID0gMCwgd2FpdCBmb3Igc3luY2hybyBlbHNlIHRoaXMgY2hlY2sgaXMgbm90IG5lZWRlZCAqLworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgeworICAgICAgaWYoSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhocnRjKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsgIAorCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWSA7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBHZXQgUlRDIGN1cnJlbnQgZGF0ZS4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIHNEYXRlIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CSU46ICBCaW5hcnkgZGF0YSBmb3JtYXQgCisgICogICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQkNEOiAgQkNEIGRhdGEgZm9ybWF0CisgICogQG5vdGUgIFlvdSBtdXN0IGNhbGwgSEFMX1JUQ19HZXREYXRlKCkgYWZ0ZXIgSEFMX1JUQ19HZXRUaW1lKCkgdG8gdW5sb2NrIHRoZSB2YWx1ZXMgCisgICogICAgICAgIGluIHRoZSBoaWdoZXItb3JkZXIgY2FsZW5kYXIgc2hhZG93IHJlZ2lzdGVycyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgdGltZSBhbmQgZGF0ZSB2YWx1ZXMuCisgICogICAgICAgIFJlYWRpbmcgUlRDIGN1cnJlbnQgdGltZSBsb2NrcyB0aGUgdmFsdWVzIGluIGNhbGVuZGFyIHNoYWRvdyByZWdpc3RlcnMgdW50aWwgQ3VycmVudCBkYXRlIGlzIHJlYWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0dldERhdGUoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19EYXRlVHlwZURlZiAqc0RhdGUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgZGF0ZXRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworICAvKiBHZXQgdGhlIERSIHJlZ2lzdGVyICovCisgIGRhdGV0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5EUiAmIFJUQ19EUl9SRVNFUlZFRF9NQVNLKTsKKworICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgZmllbGRzIHdpdGggdGhlIHJlYWQgcGFyYW1ldGVycyAqLworICBzRGF0ZS0+WWVhciA9ICh1aW50OF90KSgoZGF0ZXRtcHJlZyAmIChSVENfRFJfWVQgfCBSVENfRFJfWVUpKSA+PiAxNlUpOworICBzRGF0ZS0+TW9udGggPSAodWludDhfdCkoKGRhdGV0bXByZWcgJiAoUlRDX0RSX01UIHwgUlRDX0RSX01VKSkgPj4gOFUpOworICBzRGF0ZS0+RGF0ZSA9ICh1aW50OF90KShkYXRldG1wcmVnICYgKFJUQ19EUl9EVCB8IFJUQ19EUl9EVSkpOworICBzRGF0ZS0+V2Vla0RheSA9ICh1aW50OF90KSgoZGF0ZXRtcHJlZyAmIChSVENfRFJfV0RVKSkgPj4gMTNVKTsgCisKKyAgLyogQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9ybWF0ICovCisgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIC8qIENvbnZlcnQgdGhlIGRhdGUgc3RydWN0dXJlIHBhcmFtZXRlcnMgdG8gQmluYXJ5IGZvcm1hdCAqLworICAgIHNEYXRlLT5ZZWFyID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc0RhdGUtPlllYXIpOworICAgIHNEYXRlLT5Nb250aCA9ICh1aW50OF90KVJUQ19CY2QyVG9CeXRlKHNEYXRlLT5Nb250aCk7CisgICAgc0RhdGUtPkRhdGUgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzRGF0ZS0+RGF0ZSk7CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiAgQGJyaWVmICAgUlRDIEFsYXJtIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIEFsYXJtIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorIAorIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb25maWd1cmUgQWxhcm0gZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0uCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBzQWxhcm0gUG9pbnRlciB0byBBbGFybSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gRm9ybWF0IFNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQgCisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX1NldEFsYXJtKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfQWxhcm1UeXBlRGVmICpzQWxhcm0sIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICB1aW50MzJfdCB0bXByZWcsIHN1YnNlY29uZHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTShzQWxhcm0tPkFsYXJtKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fTUFTSyhzQWxhcm0tPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9TRUwoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9WQUxVRShzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fU1VCX1NFQ09ORF9NQVNLKHNBbGFybS0+QWxhcm1TdWJTZWNvbmRNYXNrKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUkZPUk1BVDEyKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfSE9VUjI0KHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19SVENfTUlOVVRFUyhzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKworICAgIGlmKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKworICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSA8PCAyNFUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gMHgwMFU7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIyNChSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX01JTlVURVMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpKTsKKworICAgIGlmKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBSVENfQUxBUk1EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX0RBVEUoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfV0VFS0RBWShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorCisgICAgdG1wcmVnID0gKCgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpIDw8IDI0VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOyAgIAorICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIG9yIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlcnMgKi8KKyAgc3Vic2Vjb25kdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlN1YlNlY29uZHMpIHwgKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYoc0FsYXJtLT5BbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKGhydGMpOworCisgICAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovCisgICAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkEpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgICAgICAgIAorICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQVIgPSAodWludDMyX3QpdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQSBTdWIgU2Vjb25kIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BU1NSID0gc3Vic2Vjb25kdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRU5BQkxFKGhydGMpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEIgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKGhydGMpOworCisgICAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovCisgICAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkIpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkJXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlIgPSAodWludDMyX3QpdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gQiBTdWIgU2Vjb25kIHJlZ2lzdGVyICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1CU1NSID0gc3Vic2Vjb25kdG1wcmVnOworICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRU5BQkxFKGhydGMpOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgUlRDIEFsYXJtIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gc0FsYXJtIFBvaW50ZXIgdG8gQWxhcm0gc3RydWN0dXJlCisgICogQHBhcmFtIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEBub3RlICAgVGhlIEFsYXJtIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBbGFybQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgKFVzZSB0aGUgSEFMX1JUQ19EZWFjdGl2YXRlQWxhcm0oKSkuICAgCisgICogQG5vdGUgICBUaGUgSEFMX1JUQ19TZXRUaW1lKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBBbGFybSBmZWF0dXJlLiAgIAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19TZXRBbGFybV9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBGb3JtYXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgdG1wcmVnLCBzdWJzZWNvbmR0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19GT1JNQVQoRm9ybWF0KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk0oc0FsYXJtLT5BbGFybSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX01BU0soc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfU0VMKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfVkFMVUUoc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX1NVQl9TRUNPTkRfTUFTSyhzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovIAorICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIGlmKEZvcm1hdCA9PSBSVENfRk9STUFUX0JJTikKKyAgeworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfRk1UKSAhPSAwVSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVIxMihzQWxhcm0tPkFsYXJtVGltZS5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSRk9STUFUMTIoc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NFQ09ORFMoc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcykpOworCisgICAgaWYoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfREFURShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19SVENfQUxBUk1fREFURV9XRUVLREFZX1dFRUtEQVkoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICAgIHRtcHJlZyA9ICgoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19CeXRlVG9CY2QyKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpIDw8IDhVKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfQnl0ZVRvQmNkMihzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzKSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpIDw8IDE2VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX0J5dGVUb0JjZDIoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5KSA8PCAyNFUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KXNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybU1hc2spKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX0ZNVCkgIT0gMFUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMTIoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0hPVVJGT1JNQVQxMihzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSk7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19IT1VSMjQoUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgfQorCisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19NSU5VVEVTKFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TRUNPTkRTKFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpKSk7CisgICAgCisgICAgaWYoc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsID09IFJUQ19BTEFSTURBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTV9EQVRFX1dFRUtEQVlfREFURShSVENfQmNkMlRvQnl0ZShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNX0RBVEVfV0VFS0RBWV9XRUVLREFZKFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgICAgdG1wcmVnID0gKCgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzKSA8PCA4VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3QpIHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0KSA8PCAxNlUpIHwgXAorICAgICAgICAgICAgICAoKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkpIDw8IDI0VSkgfCBcCisgICAgICAgICAgICAgICgodWludDMyX3Qpc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsKSB8IFwKKyAgICAgICAgICAgICAgKCh1aW50MzJfdClzQWxhcm0tPkFsYXJtTWFzaykpOyAgICAgCisgIH0KKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIG9yIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlcnMgKi8KKyAgc3Vic2Vjb25kdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3QpKHNBbGFybS0+QWxhcm1UaW1lLlN1YlNlY29uZHMpIHwgKHVpbnQzMl90KShzQWxhcm0tPkFsYXJtU3ViU2Vjb25kTWFzaykpOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gcmVnaXN0ZXIgKi8KKyAgaWYoc0FsYXJtLT5BbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKGhydGMpOworICAgIAorICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOyAKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgaHJ0Yy0+SW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCl0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBBIFN1YiBTZWNvbmQgcmVnaXN0ZXIgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgPSBzdWJzZWNvbmR0bXByZWc7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgX19IQUxfUlRDX0FMQVJNQV9FTkFCTEUoaHJ0Yyk7CisgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKGhydGMsUlRDX0lUX0FMUkEpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEIgaW50ZXJydXB0ICovCisgICAgX19IQUxfUlRDX0FMQVJNQl9ESVNBQkxFKGhydGMpOworICAgIAorICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQiAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJCV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCV0YpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBocnRjLT5JbnN0YW5jZS0+QUxSTUJSID0gKHVpbnQzMl90KXRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIEIgU3ViIFNlY29uZCByZWdpc3RlciAqLworICAgIGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUiA9IHN1YnNlY29uZHRtcHJlZzsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8KKyAgICBfX0hBTF9SVENfQUxBUk1CX0VOQUJMRShocnRjKTsKKyAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoaHJ0YywgUlRDX0lUX0FMUkIpOworICB9CisKKyAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CQorICAKKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisgIAorICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgdGhlIHNwZWNpZmllZCBSVEMgQWxhcm0uCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBBbGFybSBTcGVjaWZpZXMgdGhlIEFsYXJtLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFJUQ19BTEFSTV9BOiAgQWxhcm1BCisgICogICAgICAgICAgICBAYXJnIFJUQ19BTEFSTV9COiAgQWxhcm1CCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDX0RlYWN0aXZhdGVBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQWxhcm0pCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMQVJNKEFsYXJtKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICBpZihBbGFybSA9PSBSVENfQUxBUk1fQSkKKyAgeworICAgIC8qIEFsYXJtQSAqLworICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9BTFJBKTsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUnhXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFXRikgPT0gMFUpCisgICAgeworICAgICAgaWYoIChIQUxfR2V0VGljaygpICAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEFsYXJtQiAqLworICAgIF9fSEFMX1JUQ19BTEFSTUJfRElTQUJMRShocnRjKTsKKworICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLworICAgIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKGhydGMsUlRDX0lUX0FMUkIpOworCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSeFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQldGKSA9PSAwVSkKKyAgICB7CisgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsgCit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBSVEMgQWxhcm0gdmFsdWUgYW5kIG1hc2tzLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gc0FsYXJtIFBvaW50ZXIgdG8gRGF0ZSBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gQWxhcm0gU3BlY2lmaWVzIHRoZSBBbGFybS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0E6IEFsYXJtQQorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0FMQVJNX0I6IEFsYXJtQiAgCisgICogQHBhcmFtIEZvcm1hdCBTcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZW50ZXJlZCBwYXJhbWV0ZXJzLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JJTjogQmluYXJ5IGRhdGEgZm9ybWF0IAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0ZPUk1BVF9CQ0Q6IEJDRCBkYXRhIGZvcm1hdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19HZXRBbGFybShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgUlRDX0FsYXJtVHlwZURlZiAqc0FsYXJtLCB1aW50MzJfdCBBbGFybSwgdWludDMyX3QgRm9ybWF0KQoreworICB1aW50MzJfdCB0bXByZWcsIHN1YnNlY29uZHRtcHJlZzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTEFSTShBbGFybSkpOworCisgIGlmKEFsYXJtID09IFJUQ19BTEFSTV9BKQorICB7CisgICAgLyogQWxhcm1BICovCisgICAgc0FsYXJtLT5BbGFybSA9IFJUQ19BTEFSTV9BOworCisgICAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+QUxSTUFSKTsKKyAgICBzdWJzZWNvbmR0bXByZWcgPSAodWludDMyX3QpKChocnRjLT5JbnN0YW5jZS0+QUxSTUFTU1IgKSAmIFJUQ19BTFJNQVNTUl9TUyk7CisKKy8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc0FsYXJtLT5BbGFybVRpbWUuSG91cnMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfQUxSTUFSX0hUIHwgUlRDX0FMUk1BUl9IVSkpID4+IDE2VSk7CisgIHNBbGFybS0+QWxhcm1UaW1lLk1pbnV0ZXMgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfQUxSTUFSX01OVCB8IFJUQ19BTFJNQVJfTU5VKSkgPj4gOFUpOworICBzQWxhcm0tPkFsYXJtVGltZS5TZWNvbmRzID0gKHVpbnQ4X3QpKHRtcHJlZyAmIChSVENfQUxSTUFSX1NUIHwgUlRDX0FMUk1BUl9TVSkpOworICBzQWxhcm0tPkFsYXJtVGltZS5UaW1lRm9ybWF0ID0gKHVpbnQ4X3QpKCh0bXByZWcgJiBSVENfQUxSTUFSX1BNKSA+PiAxNlUpOworICBzQWxhcm0tPkFsYXJtVGltZS5TdWJTZWNvbmRzID0gKHVpbnQzMl90KSBzdWJzZWNvbmR0bXByZWc7CisgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9ICh1aW50OF90KSgodG1wcmVnICYgKFJUQ19BTFJNQVJfRFQgfCBSVENfQUxSTUFSX0RVKSkgPj4gMjRVKTsKKyAgc0FsYXJtLT5BbGFybURhdGVXZWVrRGF5U2VsID0gKHVpbnQzMl90KSh0bXByZWcgJiBSVENfQUxSTUFSX1dEU0VMKTsKKyAgc0FsYXJtLT5BbGFybU1hc2sgPSAodWludDMyX3QpKHRtcHJlZyAmIFJUQ19BTEFSTU1BU0tfQUxMKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzQWxhcm0tPkFsYXJtID0gUlRDX0FMQVJNX0I7CisKKyAgICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5BTFJNQlIpOworICAgIHN1YnNlY29uZHRtcHJlZyA9ICh1aW50MzJfdCkoKGhydGMtPkluc3RhbmNlLT5BTFJNQlNTUikgJiBSVENfQUxSTUJTU1JfU1MpOworIAorICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVhZCBwYXJhbWV0ZXJzICovCisgIHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1CUl9IVCB8IFJUQ19BTFJNQlJfSFUpKSA+PiAxNlUpOworICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gKHVpbnQ4X3QpKCh0bXByZWcgJiAoUlRDX0FMUk1CUl9NTlQgfCBSVENfQUxSTUJSX01OVSkpID4+IDhVKTsKKyAgc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcyA9ICh1aW50OF90KSh0bXByZWcgJiAoUlRDX0FMUk1CUl9TVCB8IFJUQ19BTFJNQlJfU1UpKTsKKyAgc0FsYXJtLT5BbGFybVRpbWUuVGltZUZvcm1hdCA9ICh1aW50OF90KSgodG1wcmVnICYgUlRDX0FMUk1CUl9QTSkgPj4gMTZVKTsKKyAgc0FsYXJtLT5BbGFybVRpbWUuU3ViU2Vjb25kcyA9ICh1aW50MzJfdCkgc3Vic2Vjb25kdG1wcmVnOworICBzQWxhcm0tPkFsYXJtRGF0ZVdlZWtEYXkgPSAodWludDhfdCkoKHRtcHJlZyAmIChSVENfQUxSTUJSX0RUIHwgUlRDX0FMUk1CUl9EVSkpID4+IDI0VSk7CisgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheVNlbCA9ICh1aW50MzJfdCkodG1wcmVnICYgUlRDX0FMUk1CUl9XRFNFTCk7CisgIHNBbGFybS0+QWxhcm1NYXNrID0gKHVpbnQzMl90KSh0bXByZWcgJiBSVENfQUxBUk1NQVNLX0FMTCk7CisgfQorIAorICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5Ib3VycyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLkhvdXJzKTsKKyAgICBzQWxhcm0tPkFsYXJtVGltZS5NaW51dGVzID0gUlRDX0JjZDJUb0J5dGUoc0FsYXJtLT5BbGFybVRpbWUuTWludXRlcyk7CisgICAgc0FsYXJtLT5BbGFybVRpbWUuU2Vjb25kcyA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1UaW1lLlNlY29uZHMpOworICAgIHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSA9IFJUQ19CY2QyVG9CeXRlKHNBbGFybS0+QWxhcm1EYXRlV2Vla0RheSk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBBbGFybSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBHZXQgdGhlIEFsYXJtQSBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkEpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1BIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgIT0gMFUpCisgICAgeworICAgICAgLyogQWxhcm1BIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHJ0Yy0+QWxhcm1BRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgICBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIENsZWFyIHRoZSBBbGFybUEgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRik7CisgICAgfQorICB9CisKKyAgLyogR2V0IHRoZSBBbGFybUIgaW50ZXJydXB0IHNvdXJjZSBlbmFibGUgc3RhdHVzICovCisgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9BTFJCKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIEFsYXJtQiBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQkYpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIEFsYXJtQiBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPkFsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X0FsYXJtQkV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIENsZWFyIHRoZSBBbGFybUIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRik7CisgICAgfQorICB9CisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgbGluZSBGbGFnIGZvciBSVEMgQWxhcm0gKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VYVElfQ0xFQVJfRkxBRygpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFsYXJtIEEgY2FsbGJhY2suCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEFsYXJtQSBQb2xsaW5nIHJlcXVlc3QuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENfUG9sbEZvckFsYXJtQUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworCisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7ICAgCisgIAorICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfQUxSQUYpID09IDBVKQorICB7CisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgQWxhcm0gaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkFGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBXYWl0IGZvciBSVEMgVGltZSBhbmQgRGF0ZSBTeW5jaHJvbml6YXRpb24KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXYWl0IHVudGlsIHRoZSBSVEMgVGltZSBhbmQgRGF0ZSByZWdpc3RlcnMgKFJUQ19UUiBhbmQgUlRDX0RSKSBhcmUKKyAgKiAgICAgICAgIHN5bmNocm9uaXplZCB3aXRoIFJUQyBBUEIgY2xvY2suCisgICogQG5vdGUgICBUaGUgUlRDIFJlc3luY2hyb25pemF0aW9uIG1vZGUgaXMgd3JpdGUgcHJvdGVjdGVkLCB1c2UgdGhlIAorICAqICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRvIHJlYWQgdGhlIGNhbGVuZGFyIHRocm91Z2ggdGhlIHNoYWRvdyByZWdpc3RlcnMgYWZ0ZXIgQ2FsZW5kYXIgCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAqICAgICAgICAgdGhlIHNvZnR3YXJlIG11c3QgZmlyc3QgY2xlYXIgdGhlIFJTRiBmbGFnLgorICAqICAgICAgICAgVGhlIHNvZnR3YXJlIG11c3QgdGhlbiB3YWl0IHVudGlsIGl0IGlzIHNldCBhZ2FpbiBiZWZvcmUgcmVhZGluZworICAqICAgICAgICAgdGhlIGNhbGVuZGFyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuCisgICogICAgICAgICBjb3JyZWN0bHkgY29waWVkIGludG8gdGhlIFJUQ19UUiBhbmQgUlRDX0RSIHNoYWRvdyByZWdpc3RlcnMuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ19XYWl0Rm9yU3luY2hybyhSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIENsZWFyIFJTRiBmbGFnICovCisgIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KVJUQ19SU0ZfTUFTSzsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdGhlIHJlZ2lzdGVycyB0byBiZSBzeW5jaHJvbmlzZWQgKi8KKyAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX1JTRikgPT0gMFUpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNQorICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zIAorICoKK0B2ZXJiYXRpbSAgIAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBHZXQgUlRDIHN0YXRlCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgUlRDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9SVENTdGF0ZVR5cGVEZWYgSEFMX1JUQ19HZXRTdGF0ZShSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUmV0dXJuIFJUQyBoYW5kbGUgc3RhdGUgKi8KKyAgcmV0dXJuIGhydGMtPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJUQ19Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEVudGVyIHRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyB3cml0ZSBwcm90ZWN0ZWQsIHVzZSB0aGUKKyAgKiAgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgUlRDX0VudGVySW5pdE1vZGUoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAwVSkKKyAgeworICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIGhydGMtPkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKKworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgICAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpICAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgQ29udmVydCBhIDIgZGlnaXQgZGVjaW1hbCB0byBCQ0QgZm9ybWF0LgorICAqIEBwYXJhbSBWYWx1ZSBCeXRlIHRvIGJlIGNvbnZlcnRlZAorICAqIEByZXR2YWwgQ29udmVydGVkIGJ5dGUKKyAgKi8KK3VpbnQ4X3QgUlRDX0J5dGVUb0JjZDIodWludDhfdCBWYWx1ZSkKK3sKKyAgdWludDMyX3QgYmNkaGlnaCA9IDBVOworICB1aW50OF90IFBhcmFtID0gVmFsdWU7CisKKyAgd2hpbGUoUGFyYW0gPj0gMTBVKQorICB7CisgICAgYmNkaGlnaCsrOworICAgIFBhcmFtIC09IDEwVTsKKyAgfQorCisgIHJldHVybiAgKCh1aW50OF90KShiY2RoaWdoIDw8IDRVKSB8IFBhcmFtKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IGZyb20gMiBkaWdpdCBCQ0QgdG8gQmluYXJ5LgorICAqIEBwYXJhbSBWYWx1ZSBCQ0QgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICogQHJldHZhbCBDb252ZXJ0ZWQgd29yZAorICAqLwordWludDhfdCBSVENfQmNkMlRvQnl0ZSh1aW50OF90IFZhbHVlKQoreworICB1aW50MzJfdCB0bXA7CisgIHRtcCA9ICgoKHVpbnQzMl90KVZhbHVlICYgMHhGMFUpID4+IDRVKSAqIDEwVTsKKyAgcmV0dXJuICh1aW50OF90KSh0bXAgKyAoKHVpbnQzMl90KVZhbHVlICYgMHgwRlUpKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9ydGNfZXguYyBiL1NyYy9zdG0zMndieHhfaGFsX3J0Y19leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTkyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9ydGNfZXguYwpAQCAtMCwwICsxLDE5MTIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3J0Y19leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBSVEMgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFJlYWwgVGltZSBDbG9jayAoUlRDKSBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFJUQyBUaW1lIFN0YW1wIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFJUQyBUYW1wZXIgZnVuY3Rpb25zIAorICAqICAgICAgICAgICArIFJUQyBXYWtlLXVwIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIEV4dGVuZGVkIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgUlRDIGZlYXR1cmVzIGZ1bmN0aW9ucyAgICAKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIGRvbWFpbiBhY2Nlc3MuCisgICAgKCspIENvbmZpZ3VyZSB0aGUgUlRDIFByZXNjYWxlciAoQXN5bmNocm9ub3VzIGFuZCBTeW5jaHJvbm91cykgYW5kIFJUQyBob3VyCisgICAgICAgIGZvcm1hdCB1c2luZyB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uCisKKyAgKioqIFJUQyBXYWtldXAgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAKKyAgICAoKykgVG8gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIENsb2NrIHNvdXJjZSBhbmQgQ291bnRlciB1c2UgdGhlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgV2FrZXVwIHRpbWVyIHdpdGggaW50ZXJydXB0IG1vZGUgCisgICAgICAgIHVzaW5nIHRoZSBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXJfSVQoKSBmdW5jdGlvbi4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIFdha2VVcCBDb3VudGVyIHJlZ2lzdGVyLCB1c2UgdGhlIEhBTF9SVENFeF9HZXRXYWtlVXBUaW1lcigpCisgICAgICAgIGZ1bmN0aW9uLgorICAgICAgICAKKyAgKioqIE91dHB1dHMgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXSAgVGhlIFJUQyBoYXMgMiBkaWZmZXJlbnQgb3V0cHV0czoKKyAgICAoKykgUlRDX0FMQVJNOiB0aGlzIG91dHB1dCBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgUlRDIEFsYXJtIEEsIEFsYXJtIEIKKyAgICAgICAgYW5kIFdhS2VVcCBzaWduYWxzLgorICAgICAgICBUbyBvdXRwdXQgdGhlIHNlbGVjdGVkIFJUQyBzaWduYWwsIHVzZSB0aGUgSEFMX1JUQ19Jbml0KCkgZnVuY3Rpb24uICAgICAgICAgICAgIAorICAgICgrKSBSVENfQ0FMSUI6IHRoaXMgb3V0cHV0IGlzIDUxMkh6IHNpZ25hbCBvciAxSHouCisgICAgICAgIFRvIGVuYWJsZSB0aGUgUlRDX0NBTElCLCB1c2UgdGhlIEhBTF9SVENFeF9TZXRDYWxpYnJhdGlvbk91dFB1dCgpIGZ1bmN0aW9uLgorICAgICgrKSBUd28gcGlucyBjYW4gYmUgdXNlZCBhcyBSVENfQUxBUk0gb3IgUlRDX0NBTElCIChQQzEzLCBQQjIpIG1hbmFnZWQgb24gCisgICAgICAgIHRoZSBSVENfT1IgcmVnaXN0ZXIuCisgICAgKCspIFdoZW4gdGhlIFJUQ19DQUxJQiBvciBSVENfQUxBUk0gb3V0cHV0IGlzIHNlbGVjdGVkLCB0aGUgUlRDX09VVCBwaW4gaXMKKyAgICAgICAgYXV0b21hdGljYWxseSBjb25maWd1cmVkIGluIG91dHB1dCBhbHRlcm5hdGUgZnVuY3Rpb24uIAorCisgICoqKiBTbW9vdGggZGlnaXRhbCBDYWxpYnJhdGlvbiBjb25maWd1cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBDb25maWd1cmUgdGhlIFJUQyBPcmlnaW5hbCBEaWdpdGFsIENhbGlicmF0aW9uIFZhbHVlIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBjYWxpYnJhdGlvbiBjeWNsZSBwZXJpb2QgKDMycywxNnMgYW5kIDhzKSB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKCkgCisgICAgICAgIGZ1bmN0aW9uLgorCisgICoqKiBUaW1lU3RhbXAgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIFRpbWVTdGFtcCB1c2luZyB0aGUgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcCgpIGZ1bmN0aW9uLgorICAgICAgICBZb3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBSVEMgVGltZVN0YW1wIHdpdGggaW50ZXJydXB0IG1vZGUgdXNpbmcgdGhlCisgICAgICAgIEhBTF9SVENFeF9TZXRUaW1lU3RhbXBfSVQoKSBmdW5jdGlvbi4KKyAgICAoKykgVG8gcmVhZCB0aGUgUlRDIFRpbWVTdGFtcCBUaW1lIGFuZCBEYXRlIHJlZ2lzdGVyLCB1c2UgdGhlIEhBTF9SVENFeF9HZXRUaW1lU3RhbXAoKQorICAgICAgICBmdW5jdGlvbi4KKworICAqKiogSW50ZXJuYWwgVGltZVN0YW1wIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBFbmFibGUgdGhlIFJUQyBpbnRlcm5hbCBUaW1lU3RhbXAgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRJbnRlcm5hbFRpbWVTdGFtcCgpIGZ1bmN0aW9uLgorICAgICAgICBVc2VyIGhhcyB0byBjaGVjayBpbnRlcm5hbCB0aW1lc3RhbXAgb2NjdXJyZW5jZSB1c2luZyBfX0hBTF9SVENfSU5URVJOQUxfVElNRVNUQU1QX0dFVF9GTEFHLgorICAgICgrKSBUbyByZWFkIHRoZSBSVEMgVGltZVN0YW1wIFRpbWUgYW5kIERhdGUgcmVnaXN0ZXIsIHVzZSB0aGUgSEFMX1JUQ0V4X0dldFRpbWVTdGFtcCgpCisgICAgICAgIGZ1bmN0aW9uLgorCisgICoqKiBUYW1wZXIgY29uZmlndXJhdGlvbiAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgKCspIEVuYWJsZSB0aGUgUlRDIFRhbXBlciBhbmQgY29uZmlndXJlIHRoZSBUYW1wZXIgZmlsdGVyIGNvdW50LCB0cmlnZ2VyIEVkZ2UgCisgICAgICAgIG9yIExldmVsIGFjY29yZGluZyB0byB0aGUgVGFtcGVyIGZpbHRlciAoaWYgZXF1YWwgdG8gMCBFZGdlIGVsc2UgTGV2ZWwpIAorICAgICAgICB2YWx1ZSwgc2FtcGxpbmcgZnJlcXVlbmN5LCBOb0VyYXNlLCBNYXNrRmxhZywgIHByZWNoYXJnZSBvciBkaXNjaGFyZ2UgYW5kCisgICAgICAgIFB1bGwtVVAgdXNpbmcgdGhlIEhBTF9SVENFeF9TZXRUYW1wZXIoKSBmdW5jdGlvbi4gWW91IGNhbiBjb25maWd1cmUgUlRDIFRhbXBlcgorICAgICAgICB3aXRoIGludGVycnVwdCBtb2RlIHVzaW5nIEhBTF9SVENFeF9TZXRUYW1wZXJfSVQoKSBmdW5jdGlvbi4KKyAgICAoKykgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgVGFtcGVyIGVyYXNlcyB0aGUgYmFja3VwIHJlZ2lzdGVycy4gVG8gYXZvaWQKKyAgICAgICAgZXJhc2UsIGVuYWJsZSB0aGUgTm9FcmFzZSBmaWVsZCBvbiB0aGUgUlRDX1RBTVBDUiByZWdpc3Rlci4KKworICAqKiogQmFja3VwIERhdGEgUmVnaXN0ZXJzIGNvbmZpZ3VyYXRpb24gKioqCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBUbyB3cml0ZSB0byB0aGUgUlRDIEJhY2t1cCBEYXRhIHJlZ2lzdGVycywgdXNlIHRoZSBIQUxfUlRDRXhfQktVUFdyaXRlKCkKKyAgICAgICAgZnVuY3Rpb24uCisgICAgKCspIFRvIHJlYWQgdGhlIFJUQyBCYWNrdXAgRGF0YSByZWdpc3RlcnMsIHVzZSB0aGUgSEFMX1JUQ0V4X0JLVVBSZWFkKCkKKyAgICAgICAgZnVuY3Rpb24uCisKKyAgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUlRDRXgKKyAgKiBAYnJpZWYgUlRDIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgUlRDRXhfUHJpdmF0ZV9Db25zdGFudHMgUlRDRXggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkgJiYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorI2RlZmluZSBSVENfVEFNUENSX01BU0sgICAgICAgICAgICAgICAoKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFRTICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRlJFUSAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QRkxUICAgICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QUFJDSCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBVRElTIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxSUUgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxTk9FUkFTRSB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVAxTUYgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMklFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk1GICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNJRSAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNOT0VSQVNFIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNNRikKKyNlbGlmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX1RBTVBDUl9NQVNLICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVBUUyAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZSRVEgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZMVCAgICAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBSQ0ggfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBQVURJUyB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMUlFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMU5PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMU1GICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJJRSAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJOT0VSQVNFIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJNRikKKyNlbGlmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyNkZWZpbmUgUlRDX1RBTVBDUl9NQVNLICAgICAgICAgICAgICAgKCh1aW50MzJfdClSVENfVEFNUENSX1RBTVBUUyAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZSRVEgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUEZMVCAgICAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUFBSQ0ggfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBQVURJUyB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMklFICAgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0UgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QMk1GICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNJRSAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNOT0VSQVNFIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDNNRikKKyNlbHNlCisjZGVmaW5lIFJUQ19UQU1QQ1JfTUFTSyAgICAgICAgICAgICAgICgodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QVFMgICAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBGUkVRICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBGTFQgICAgICB8ICh1aW50MzJfdClSVENfVEFNUENSX1RBTVBQUkNIIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QUFVESVMgfCAodWludDMyX3QpUlRDX1RBTVBDUl9UQU1QSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJJRSAgIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJOT0VSQVNFIHwgKHVpbnQzMl90KVJUQ19UQU1QQ1JfVEFNUDJNRikKKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICYmIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCisgKiAgQGJyaWVmICAgUlRDIFRpbWVTdGFtcCBhbmQgVGFtcGVyIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIFJUQyBUaW1lU3RhbXAgYW5kIFRhbXBlciBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBUaW1lU3RhbXAgZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUaW1lU3RhbXAuCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIFRpbWVTdGFtcCBmZWF0dXJlLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gVGltZVN0YW1wRWRnZSBTcGVjaWZpZXMgdGhlIHBpbiBlZGdlIG9uIHdoaWNoIHRoZSBUaW1lU3RhbXAgaXMKKyAgKiAgICAgICAgIGFjdGl2YXRlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUEVER0VfUklTSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlICAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaXNpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9GQUxMSU5HOiB0aGUgVGltZSBzdGFtcCBldmVudCBvY2N1cnMgb24gdGhlIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsaW5nIGVkZ2Ugb2YgdGhlIHJlbGF0ZWQgcGluLgorICAqIEBwYXJhbSBSVENfVGltZVN0YW1wUGluIHNwZWNpZmllcyB0aGUgUlRDIFRpbWVTdGFtcCBQaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBQSU5fREVGQVVMVDogUEMxMyBpcyBzZWxlY3RlZCBhcyBSVEMgVGltZVN0YW1wIFBpbi4KKyAgKiAgICAgICAgICAgICAgIFRoZSBSVEMgVGltZVN0YW1wIFBpbiBpcyBwZXIgZGVmYXVsdCBQQzEzLCBidXQgZm9yIHJlYXNvbnMgb2YKKyAgKiAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgVGltZVN0YW1wRWRnZSwgdWludDMyX3QgUlRDX1RpbWVTdGFtcFBpbikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1FU1RBTVBfRURHRShUaW1lU3RhbXBFZGdlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVElNRVNUQU1QX1BJTihSVENfVGltZVN0YW1wUGluKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnfD0gVGltZVN0YW1wRWRnZTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAgCisgIC8qIENsZWFyIHRoZSBUaW1lc3RhbXAgRmxhZyAqLworICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKTsKKyAgCisgIC8qIENsZWFyIHRoZSBUaW1lc3RhbXAgb3ZlcnJ1biBGbGFnICovCisgICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNPVkYpOyAKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgU3RhbXAgVFNFREdFIGFuZCBFbmFibGUgYml0cyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodWludDMyX3QpdG1wcmVnOworCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsgCisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IFRpbWVTdGFtcCB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQG5vdGUgICBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIFRpbWVTdGFtcCBmZWF0dXJlLgorICAqIEBwYXJhbSBUaW1lU3RhbXBFZGdlIFNwZWNpZmllcyB0aGUgcGluIGVkZ2Ugb24gd2hpY2ggdGhlIFRpbWVTdGFtcCBpcworICAqICAgICAgICAgYWN0aXZhdGVkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICAgQGFyZyBSVENfVElNRVNUQU1QRURHRV9SSVNJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUgIAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpc2luZyBlZGdlIG9mIHRoZSByZWxhdGVkIHBpbi4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19USU1FU1RBTVBFREdFX0ZBTExJTkc6IHRoZSBUaW1lIHN0YW1wIGV2ZW50IG9jY3VycyBvbiB0aGUgCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxpbmcgZWRnZSBvZiB0aGUgcmVsYXRlZCBwaW4uCisgICogQHBhcmFtIFJUQ19UaW1lU3RhbXBQaW4gU3BlY2lmaWVzIHRoZSBSVEMgVGltZVN0YW1wIFBpbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1RJTUVTVEFNUFBJTl9ERUZBVUxUOiBQQzEzIGlzIHNlbGVjdGVkIGFzIFJUQyBUaW1lU3RhbXAgUGluLgorICAqICAgICAgICAgICAgICAgVGhlIFJUQyBUaW1lU3RhbXAgUGluIGlzIHBlciBkZWZhdWx0IFBDMTMsIGJ1dCBmb3IgcmVhc29ucyBvZgorICAqICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGltZVN0YW1wX0lUKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lU3RhbXBFZGdlLCB1aW50MzJfdCBSVENfVGltZVN0YW1wUGluKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTUVTVEFNUF9FREdFKFRpbWVTdGFtcEVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19USU1FU1RBTVBfUElOKFJUQ19UaW1lU3RhbXBQaW4pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFJUQ19DUiByZWdpc3RlciBhbmQgY2xlYXIgdGhlIGJpdHMgdG8gYmUgY29uZmlndXJlZCAqLworICB0bXByZWcgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmICh1aW50MzJfdCl+KFJUQ19DUl9UU0VER0UgfCBSVENfQ1JfVFNFKSk7CisKKyAgdG1wcmVnIHw9IFRpbWVTdGFtcEVkZ2U7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisgIAorICAvKiBDbGVhciB0aGUgVGltZXN0YW1wIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRik7CisgIAorICAvKiBDbGVhciB0aGUgVGltZXN0YW1wIG92ZXJydW4gRmxhZyAqLworICAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTT1ZGKTsgCisgIAorICAvKiBDb25maWd1cmUgdGhlIFRpbWUgU3RhbXAgVFNFREdFIGFuZCBFbmFibGUgYml0cyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgPSAodWludDMyX3QpdG1wcmVnOworCisgIF9fSEFMX1JUQ19USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSBJVCB0aW1lc3RhbXAgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9FTkFCTEVfSVQoaHJ0YyxSVENfSVRfVFMpOworCisgIC8qIFJUQyB0aW1lc3RhbXAgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLworICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9JVCgpOworCisgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgVGltZVN0YW1wLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlVGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9ESVNBQkxFX0lUKGhydGMsIFJUQ19JVF9UUyk7CisKKyAgLyogR2V0IHRoZSBSVENfQ1IgcmVnaXN0ZXIgYW5kIGNsZWFyIHRoZSBiaXRzIHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+Q1IgJiAodWludDMyX3QpfihSVENfQ1JfVFNFREdFIHwgUlRDX0NSX1RTRSkpOworCisgIC8qIENvbmZpZ3VyZSB0aGUgVGltZSBTdGFtcCBUU0VER0UgYW5kIEVuYWJsZSBiaXRzICovCisgIGhydGMtPkluc3RhbmNlLT5DUiA9ICh1aW50MzJfdCl0bXByZWc7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgZGVmaW5lZChSVENfSU5URVJOQUxUU19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBTZXQgSW50ZXJuYWwgVGltZVN0YW1wLgorICAqIEBub3RlICAgVGhpcyBBUEkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBpbnRlcm5hbCBUaW1lU3RhbXAgZmVhdHVyZS4KKyAgKiBAcGFyYW0gaHJ0YyBwb2ludGVyIHRvIGEgUlRDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUlRDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldEludGVybmFsVGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIENsZWFyIHRoZSBUSU1FU1RBTVAgRmxhZ3MgKi8KKyAgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0lUU0YpOworICAKKyAgLyogQ29uZmlndXJlIHRoZSBpbnRlcm5hbCBUaW1lIFN0YW1wIEVuYWJsZSBiaXRzICovCisgIF9fSEFMX1JUQ19JTlRFUk5BTF9USU1FU1RBTVBfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIEludGVybmFsIFRpbWVTdGFtcC4KKyAgKiBAcGFyYW0gaHJ0YyBwb2ludGVyIHRvIGEgUlRDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUlRDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVJbnRlcm5hbFRpbWVTdGFtcChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBDb25maWd1cmUgdGhlIGludGVybmFsIFRpbWUgU3RhbXAgRW5hYmxlIGJpdHMgKi8KKyAgX19IQUxfUlRDX0lOVEVSTkFMX1RJTUVTVEFNUF9ESVNBQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKyNlbmRpZgorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgUlRDIFRpbWVTdGFtcCB2YWx1ZS4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIHNUaW1lU3RhbXAgUG9pbnRlciB0byBUaW1lIHN0cnVjdHVyZQorICAqIEBwYXJhbSBzVGltZVN0YW1wRGF0ZSBQb2ludGVyIHRvIERhdGUgc3RydWN0dXJlICAKKyAgKiBAcGFyYW0gRm9ybWF0IHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBlbnRlcmVkIHBhcmFtZXRlcnMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19GT1JNQVRfQklOOiBCaW5hcnkgZGF0YSBmb3JtYXQgCisgICogICAgICAgICAgICAgQGFyZyBSVENfRk9STUFUX0JDRDogQkNEIGRhdGEgZm9ybWF0CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfR2V0VGltZVN0YW1wKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGltZVR5cGVEZWYqIHNUaW1lU3RhbXAsIFJUQ19EYXRlVHlwZURlZiogc1RpbWVTdGFtcERhdGUsIHVpbnQzMl90IEZvcm1hdCkKK3sKKyAgdWludDMyX3QgdG1wdGltZSwgdG1wZGF0ZTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0ZPUk1BVChGb3JtYXQpKTsKKworICAvKiBHZXQgdGhlIFRpbWVTdGFtcCB0aW1lIGFuZCBkYXRlIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKyAgdG1wdGltZSA9ICh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPlRTVFIgJiBSVENfVFJfUkVTRVJWRURfTUFTSyk7CisgIHRtcGRhdGUgPSAodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5UU0RSICYgUlRDX0RSX1JFU0VSVkVEX01BU0spOworCisgIC8qIEZpbGwgdGhlIFRpbWUgc3RydWN0dXJlIGZpZWxkcyB3aXRoIHRoZSByZWFkIHBhcmFtZXRlcnMgKi8KKyAgc1RpbWVTdGFtcC0+SG91cnMgPSAodWludDhfdCkoKHRtcHRpbWUgJiAoUlRDX1RSX0hUIHwgUlRDX1RSX0hVKSkgPj4gMTZVKTsKKyAgc1RpbWVTdGFtcC0+TWludXRlcyA9ICh1aW50OF90KSgodG1wdGltZSAmIChSVENfVFJfTU5UIHwgUlRDX1RSX01OVSkpID4+IDhVKTsKKyAgc1RpbWVTdGFtcC0+U2Vjb25kcyA9ICh1aW50OF90KSh0bXB0aW1lICYgKFJUQ19UUl9TVCB8IFJUQ19UUl9TVSkpOworICBzVGltZVN0YW1wLT5UaW1lRm9ybWF0ID0gKHVpbnQ4X3QpKCh0bXB0aW1lICYgKFJUQ19UUl9QTSkpID4+IDE2VSk7CisgIHNUaW1lU3RhbXAtPlN1YlNlY29uZHMgPSAodWludDMyX3QpIGhydGMtPkluc3RhbmNlLT5UU1NTUjsKKworICAvKiBGaWxsIHRoZSBEYXRlIHN0cnVjdHVyZSBmaWVsZHMgd2l0aCB0aGUgcmVhZCBwYXJhbWV0ZXJzICovCisgIHNUaW1lU3RhbXBEYXRlLT5ZZWFyID0gMFU7CisgIHNUaW1lU3RhbXBEYXRlLT5Nb250aCA9ICh1aW50OF90KSgodG1wZGF0ZSAmIChSVENfRFJfTVQgfCBSVENfRFJfTVUpKSA+PiA4VSk7CisgIHNUaW1lU3RhbXBEYXRlLT5EYXRlID0gKHVpbnQ4X3QpKHRtcGRhdGUgJiAoUlRDX0RSX0RUIHwgUlRDX0RSX0RVKSk7CisgIHNUaW1lU3RhbXBEYXRlLT5XZWVrRGF5ID0gKHVpbnQ4X3QpKCh0bXBkYXRlICYgKFJUQ19EUl9XRFUpKSA+PiAxM1UpOworCisgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICBpZihGb3JtYXQgPT0gUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICAvKiBDb252ZXJ0IHRoZSBUaW1lU3RhbXAgc3RydWN0dXJlIHBhcmFtZXRlcnMgdG8gQmluYXJ5IGZvcm1hdCAqLworICAgIHNUaW1lU3RhbXAtPkhvdXJzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcC0+SG91cnMpOworICAgIHNUaW1lU3RhbXAtPk1pbnV0ZXMgPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wLT5NaW51dGVzKTsKKyAgICBzVGltZVN0YW1wLT5TZWNvbmRzID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcC0+U2Vjb25kcyk7CisKKyAgICAvKiBDb252ZXJ0IHRoZSBEYXRlVGltZVN0YW1wIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHRvIEJpbmFyeSBmb3JtYXQgKi8KKyAgICBzVGltZVN0YW1wRGF0ZS0+TW9udGggPSAodWludDhfdClSVENfQmNkMlRvQnl0ZShzVGltZVN0YW1wRGF0ZS0+TW9udGgpOworICAgIHNUaW1lU3RhbXBEYXRlLT5EYXRlID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcERhdGUtPkRhdGUpOworICAgIHNUaW1lU3RhbXBEYXRlLT5XZWVrRGF5ID0gKHVpbnQ4X3QpUlRDX0JjZDJUb0J5dGUoc1RpbWVTdGFtcERhdGUtPldlZWtEYXkpOworICB9CisKKyAgLyogQ2xlYXIgdGhlIFRJTUVTVEFNUCBGbGFncyAqLworICAjaWYgZGVmaW5lZChSVENfSU5URVJOQUxUU19TVVBQT1JUKQorICBfX0hBTF9SVENfSU5URVJOQUxfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfSVRTRik7CisgICNlbmRpZgorICAKKyAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRik7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyCisgICogQG5vdGUgICBCeSBjYWxsaW5nIHRoaXMgQVBJIHdlIGRpc2FibGUgdGhlIHRhbXBlciBpbnRlcnJ1cHQgZm9yIGFsbCB0YW1wZXJzLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gc1RhbXBlciBQb2ludGVyIHRvIFRhbXBlciBTdHJ1Y3R1cmUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0VGFtcGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCBSVENfVGFtcGVyVHlwZURlZiogc1RhbXBlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbSggSVNfUlRDX1RBTVBFUihzVGFtcGVyLT5UYW1wZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKCBJU19SVENfVEFNUEVSX1RSSUdHRVIoc1RhbXBlci0+VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9FUkFTRV9NT0RFKHNUYW1wZXItPk5vRXJhc2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfTUFTS0ZMQUdfU1RBVEUoc1RhbXBlci0+TWFza0ZsYWcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfRklMVEVSKHNUYW1wZXItPkZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9TQU1QTElOR19GUkVRKHNUYW1wZXItPlNhbXBsaW5nRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1BSRUNIQVJHRV9EVVJBVElPTihzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QVUxMVVBfU1RBVEUoc1RhbXBlci0+VGFtcGVyUHVsbFVwKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX1RJTUVTVEFNUE9OVEFNUEVSX0RFVEVDVElPTihzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0YW1wZXIgdHJpZ2dlciAqLworICBpZihzVGFtcGVyLT5UcmlnZ2VyICE9IFJUQ19UQU1QRVJUUklHR0VSX1JJU0lOR0VER0UpCisgIHsgCisgICAgc1RhbXBlci0+VHJpZ2dlciA9ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDFVKTsgCisgIH0KKworICBpZihzVGFtcGVyLT5Ob0VyYXNlICE9IFJUQ19UQU1QRVJfRVJBU0VfQkFDS1VQX0VOQUJMRSkKKyAgeyAKKyAgICBzVGFtcGVyLT5Ob0VyYXNlID0gMFU7CisjaWYgZGVmaW5lZChSVENfVEFNUEVSMV9TVVBQT1JUKQorICAgIGlmKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzEpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk5vRXJhc2UgfD0gUlRDX1RBTVBDUl9UQU1QMU5PRVJBU0U7CisgICAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyAgICBpZigoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8yKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5Ob0VyYXNlIHw9IFJUQ19UQU1QQ1JfVEFNUDJOT0VSQVNFOworICAgIH0KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgICAgaWYoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMykgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+Tm9FcmFzZSB8PSBSVENfVEFNUENSX1RBTVAzTk9FUkFTRTsKKyAgICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworICB9CisKKyAgaWYoc1RhbXBlci0+TWFza0ZsYWcgIT0gUlRDX1RBTVBFUk1BU0tfRkxBR19ESVNBQkxFKQorICB7CisgICAgc1RhbXBlci0+TWFza0ZsYWcgPSAwVTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgaWYoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMSkgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+TWFza0ZsYWcgfD0gUlRDX1RBTVBDUl9UQU1QMU1GOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisgICAgaWYoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMikgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+TWFza0ZsYWcgfD0gUlRDX1RBTVBDUl9UQU1QMk1GOworICAgIH0KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgICAgaWYoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMykgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+TWFza0ZsYWcgfD0gUlRDX1RBTVBDUl9UQU1QM01GOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFJUQ19UQU1QQ1IgcmVnaXN0ZXIgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3Qpc1RhbXBlci0+VGFtcGVyIHwgKHVpbnQzMl90KXNUYW1wZXItPlRyaWdnZXIgIHwgKHVpbnQzMl90KXNUYW1wZXItPk5vRXJhc2UgfFwKKyAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5NYXNrRmxhZyB8ICh1aW50MzJfdClzVGFtcGVyLT5GaWx0ZXIgfCAodWludDMyX3Qpc1RhbXBlci0+U2FtcGxpbmdGcmVxdWVuY3kgfFwKKyAgICAgICAgICAgICh1aW50MzJfdClzVGFtcGVyLT5QcmVjaGFyZ2VEdXJhdGlvbiB8ICh1aW50MzJfdClzVGFtcGVyLT5UYW1wZXJQdWxsVXAgfCAodWludDMyX3Qpc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pOworCisgIGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlciB8ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDEpIHwgUlRDX1RBTVBDUl9NQVNLKTsKKworICBocnRjLT5JbnN0YW5jZS0+VEFNUENSIHw9IHRtcHJlZzsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgVGFtcGVyIHdpdGggaW50ZXJydXB0LgorICAqIEBub3RlICAgQnkgY2FsbGluZyB0aGlzIEFQSSB3ZSBmb3JjZSB0aGUgdGFtcGVyIGludGVycnVwdCBmb3IgYWxsIHRhbXBlcnMuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBzVGFtcGVyIFBvaW50ZXIgdG8gUlRDIFRhbXBlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRUYW1wZXJfSVQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIFJUQ19UYW1wZXJUeXBlRGVmKiBzVGFtcGVyKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKCBJU19SVENfVEFNUEVSKHNUYW1wZXItPlRhbXBlcikpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9JTlRFUlJVUFQoc1RhbXBlci0+SW50ZXJydXB0KSk7CisgIGFzc2VydF9wYXJhbSggSVNfUlRDX1RBTVBFUl9UUklHR0VSKHNUYW1wZXItPlRyaWdnZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfRVJBU0VfTU9ERShzVGFtcGVyLT5Ob0VyYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX01BU0tGTEFHX1NUQVRFKHNUYW1wZXItPk1hc2tGbGFnKSk7CisgIGFzc2VydF9wYXJhbShJU19SVENfVEFNUEVSX0ZJTFRFUihzVGFtcGVyLT5GaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfU0FNUExJTkdfRlJFUShzVGFtcGVyLT5TYW1wbGluZ0ZyZXF1ZW5jeSkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9QUkVDSEFSR0VfRFVSQVRJT04oc1RhbXBlci0+UHJlY2hhcmdlRHVyYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19UQU1QRVJfUFVMTFVQX1NUQVRFKHNUYW1wZXItPlRhbXBlclB1bGxVcCkpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1RBTVBFUl9USU1FU1RBTVBPTlRBTVBFUl9ERVRFQ1RJT04oc1RhbXBlci0+VGltZVN0YW1wT25UYW1wZXJEZXRlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIENvbmZpZ3VyZSB0aGUgdGFtcGVyIHRyaWdnZXIgKi8KKyAgaWYoc1RhbXBlci0+VHJpZ2dlciAhPSBSVENfVEFNUEVSVFJJR0dFUl9SSVNJTkdFREdFKQorICB7CisgICAgc1RhbXBlci0+VHJpZ2dlciA9ICh1aW50MzJfdCkoc1RhbXBlci0+VGFtcGVyIDw8IDFVKTsKKyAgfQorCisgIGlmKHNUYW1wZXItPk5vRXJhc2UgIT0gUlRDX1RBTVBFUl9FUkFTRV9CQUNLVVBfRU5BQkxFKQorICB7IAorICAgIHNUYW1wZXItPk5vRXJhc2UgPSAwVTsKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgICAgaWYoKHNUYW1wZXItPlRhbXBlciAmIFJUQ19UQU1QRVJfMSkgIT0gMFUpCisgICAgeworICAgICAgc1RhbXBlci0+Tm9FcmFzZSB8PSBSVENfVEFNUENSX1RBTVAxTk9FUkFTRTsKKyAgICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworICAgIGlmKChzVGFtcGVyLT5UYW1wZXIgJiBSVENfVEFNUEVSXzIpICE9IDBVKQorICAgIHsKKyAgICAgIHNUYW1wZXItPk5vRXJhc2UgfD0gUlRDX1RBTVBDUl9UQU1QMk5PRVJBU0U7CisgICAgfQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgICBpZigoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8zKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5Ob0VyYXNlIHw9IFJUQ19UQU1QQ1JfVEFNUDNOT0VSQVNFOworICAgIH0KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisgIH0KKworICBpZihzVGFtcGVyLT5NYXNrRmxhZyAhPSBSVENfVEFNUEVSTUFTS19GTEFHX0RJU0FCTEUpCisgIHsKKyAgICBzVGFtcGVyLT5NYXNrRmxhZyA9IDBVOworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyAgICBpZigoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8xKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5NYXNrRmxhZyB8PSBSVENfVEFNUENSX1RBTVAxTUY7CisgICAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyAgICBpZigoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8yKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5NYXNrRmxhZyB8PSBSVENfVEFNUENSX1RBTVAyTUY7CisgICAgfQorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgICBpZigoc1RhbXBlci0+VGFtcGVyICYgUlRDX1RBTVBFUl8zKSAhPSAwVSkKKyAgICB7CisgICAgICBzVGFtcGVyLT5NYXNrRmxhZyB8PSBSVENfVEFNUENSX1RBTVAzTUY7CisgICAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgUlRDX1RBTVBDUiByZWdpc3RlciAqLyAgICAKKyAgdG1wcmVnID0gKHVpbnQzMl90KSgodWludDMyX3Qpc1RhbXBlci0+VGFtcGVyIHwgKHVpbnQzMl90KXNUYW1wZXItPkludGVycnVwdCB8ICh1aW50MzJfdClzVGFtcGVyLT5UcmlnZ2VyICB8ICh1aW50MzJfdClzVGFtcGVyLT5Ob0VyYXNlIHxcCisgICAgICAgICAgICAodWludDMyX3Qpc1RhbXBlci0+TWFza0ZsYWcgfCAodWludDMyX3Qpc1RhbXBlci0+RmlsdGVyIHwgKHVpbnQzMl90KXNUYW1wZXItPlNhbXBsaW5nRnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XAorICAgICAgICAgICAgKHVpbnQzMl90KXNUYW1wZXItPlByZWNoYXJnZUR1cmF0aW9uIHwgKHVpbnQzMl90KXNUYW1wZXItPlRhbXBlclB1bGxVcCB8ICh1aW50MzJfdClzVGFtcGVyLT5UaW1lU3RhbXBPblRhbXBlckRldGVjdGlvbik7CisKKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmPSAodWludDMyX3QpfigodWludDMyX3Qpc1RhbXBlci0+VGFtcGVyIHwgKHVpbnQzMl90KShzVGFtcGVyLT5UYW1wZXIgPDwgMSkgfCBSVENfVEFNUENSX01BU0spOworICAKKyAgaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiB8PSB0bXByZWc7CisKKyAgLyogUlRDIFRhbXBlciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfRU5BQkxFX0lUKCk7CisgIAorICBfX0hBTF9SVENfVEFNUEVSX1RJTUVTVEFNUF9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlYWN0aXZhdGUgVGFtcGVyLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gVGFtcGVyIFNlbGVjdGVkIHRhbXBlciBwaW4uCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBSVENfVEFNUEVSXzEsIFJUQ19UQU1QRVJfMiBhbmQgUlRDX1RBTVBFUl8zLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X0RlYWN0aXZhdGVUYW1wZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRhbXBlcikKK3sKKyAgYXNzZXJ0X3BhcmFtKCBJU19SVENfVEFNUEVSKFRhbXBlcikpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgVGFtcGVyIHBpbiAqLworICBocnRjLT5JbnN0YW5jZS0+VEFNUENSICY9ICgodWludDMyX3QpflRhbXBlcik7CisgIAorI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKyAgaWYgKChUYW1wZXIgJiBSVENfVEFNUEVSXzEpICE9IDBVKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgVGFtcGVyMSBpbnRlcnJ1cHQgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VEFNUENSICY9ICgodWludDMyX3QpfihSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMSkpOworICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjFfU1VQUE9SVCAqLworICBpZiAoKFRhbXBlciAmIFJUQ19UQU1QRVJfMikgIT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBUYW1wZXIyIGludGVycnVwdCAqLworICAgIGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJj0gKCh1aW50MzJfdCl+KFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAyKSk7CisgIH0KKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisgICAgaWYgKChUYW1wZXIgJiBSVENfVEFNUEVSXzMpICE9IDBVKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgVGFtcGVyMyBpbnRlcnJ1cHQgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+VEFNUENSICY9ICgodWludDMyX3QpfihSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMykpOworICB9CisgIAorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKyAgICAKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRpbWVTdGFtcCBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENFeF9UYW1wZXJUaW1lU3RhbXBJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreyAKKyAgLyogR2V0IHRoZSBUaW1lU3RhbXAgaW50ZXJydXB0IHNvdXJjZSBlbmFibGUgc3RhdHVzICovCisgIGlmKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfVFMpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVElNRVNUQU1QIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBUSU1FU1RBTVAgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBocnRjLT5UaW1lU3RhbXBFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIEhBTF9SVENFeF9UaW1lU3RhbXBFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgCisgICAgICAvKiBDbGVhciB0aGUgVElNRVNUQU1QIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX1RJTUVTVEFNUF9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RTRik7CisgICAgfQorICB9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisgIC8qIEdldCB0aGUgVGFtcGVyMSBpbnRlcnJ1cHRzIHNvdXJjZSBlbmFibGUgc3RhdHVzICovCisgIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMSkgIT0gMFUpCisgIHsKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBUYW1wZXIxIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDFGKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBUYW1wZXIxIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHJ0Yy0+VGFtcGVyMUV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZWxzZQorICAgICAgSEFMX1JUQ0V4X1RhbXBlcjFFdmVudENhbGxiYWNrKGhydGMpOworI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgICAgICAvKiBDbGVhciB0aGUgVGFtcGVyMSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19UQU1QRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMUYpOworICAgIH0KKyAgfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKyAgICAKKworICAvKiBHZXQgdGhlIFRhbXBlcjIgaW50ZXJydXB0cyBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX1RBTVAgfCBSVENfSVRfVEFNUDIpICE9IDBVKQorICB7CisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVGFtcGVyMiBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAyRikgIT0gMFUpCisgICAgeworICAgICAgLyogVGFtcGVyMiBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhydGMtPlRhbXBlcjJFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIEhBTF9SVENFeF9UYW1wZXIyRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgLyogQ2xlYXIgdGhlIFRhbXBlcjIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICBfX0hBTF9SVENfVEFNUEVSX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDJGKTsKKyAgICB9CisgIH0KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjNfU1VQUE9SVCkKKyAgLyogR2V0IHRoZSBUYW1wZXIzIGludGVycnVwdHMgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAzKSAhPSAwVSkKKyAgeworICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRhbXBlcjMgSW50ZXJydXB0ICovCisgICAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QM0YpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFRhbXBlcjMgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBocnRjLT5UYW1wZXIzRXZlbnRDYWxsYmFjayhocnRjKTsKKyNlbHNlCisgICAgICBIQUxfUlRDRXhfVGFtcGVyM0V2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgICAgIC8qIENsZWFyIHRoZSBUYW1wZXIzIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgICAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAzRik7CisgICAgfQorICB9CisjZW5kaWYgLyogUlRDX1RBTVBFUjNfU1VQUE9SVCAqLworCisgIC8qIENsZWFyIHRoZSBFWFRJJ3MgRmxhZyBmb3IgUlRDIFRpbWVTdGFtcCBhbmQgVGFtcGVyICovCisgIF9fSEFMX1JUQ19UQU1QRVJfVElNRVNUQU1QX0VYVElfQ0xFQVJfRkxBRygpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVTdGFtcCBjYWxsYmFjay4gCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1RpbWVTdGFtcEV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfVGltZVN0YW1wRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICovCit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIxX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciAxIGNhbGxiYWNrLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9UYW1wZXIxRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIxX1NVUFBPUlQgKi8KKworLyoqCisgICogQGJyaWVmICBUYW1wZXIgMiBjYWxsYmFjay4gCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1RhbXBlcjJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiBkZWZpbmVkKFJUQ19UQU1QRVIzX1NVUFBPUlQpCisvKioKKyAgKiBAYnJpZWYgIFRhbXBlciAzIGNhbGxiYWNrLiAKKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfVGFtcGVyM0V2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhydGMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfUlRDRXhfVGFtcGVyM0V2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSM19TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRpbWVTdGFtcCBwb2xsaW5nIHJlcXVlc3QuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGltZVN0YW1wRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpCit7IAorICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKSA9PSAwVSkKKyAgeworICAgIGlmKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNPVkYpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUSU1FU1RBTVAgT3ZlclJ1biBGbGFnICovCisgICAgICBfX0hBTF9SVENfVElNRVNUQU1QX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNPVkYpOworCisgICAgICAvKiBDaGFuZ2UgVElNRVNUQU1QIHN0YXRlICovCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7IAorCisgICAgICByZXR1cm4gSEFMX0VSUk9SOyAKKyAgICB9CisKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICAgCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2lmIGRlZmluZWQoUlRDX1RBTVBFUjFfU1VQUE9SVCkKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRhbXBlciAxIFBvbGxpbmcuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMUV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMUYpPT0gMFUpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBUYW1wZXIgRmxhZyAqLworICBfX0hBTF9SVENfVEFNUEVSX0NMRUFSX0ZMQUcoaHJ0YyxSVENfRkxBR19UQU1QMUYpOworICAKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisgIAorICByZXR1cm4gSEFMX09LOyAKK30KKyNlbmRpZiAvKiBSVENfVEFNUEVSMV9TVVBQT1JUICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRhbXBlciAyIFBvbGxpbmcuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9Qb2xsRm9yVGFtcGVyMkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMkYpID09IDBVKQorICB7CisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgVGFtcGVyIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsUlRDX0ZMQUdfVEFNUDJGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjaWYgZGVmaW5lZChSVENfVEFNUEVSM19TVVBQT1JUKQorLyoqCisgICogQGJyaWVmICBIYW5kbGUgVGFtcGVyIDMgUG9sbGluZy4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JUYW1wZXIzRXZlbnQoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMsIHVpbnQzMl90IFRpbWVvdXQpCit7ICAKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgSW50ZXJydXB0ICovCisgIHdoaWxlKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YyxSVENfRkxBR19UQU1QM0YpID09IDBVKQorICB7CisgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgVGFtcGVyIEZsYWcgKi8KKyAgX19IQUxfUlRDX1RBTVBFUl9DTEVBUl9GTEFHKGhydGMsUlRDX0ZMQUdfVEFNUDNGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorI2VuZGlmIC8qIFJUQ19UQU1QRVIzX1NVUFBPUlQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKyAgCisvKiogQGFkZHRvZ3JvdXAgUlRDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgorICAqIEBicmllZiAgICBSVEMgV2FrZS11cCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltICAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUlRDIFdha2UtdXAgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgCisgWy4uXSBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBXYWtlLXVwIGZlYXR1cmUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTZXQgd2FrZSB1cCB0aW1lci4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIFdha2VVcENvdW50ZXIgV2FrZSB1cCBjb3VudGVyCisgICogQHBhcmFtIFdha2VVcENsb2NrIFdha2UgdXAgY2xvY2sKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DTE9DSyhXYWtlVXBDbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DT1VOVEVSKFdha2VVcENvdW50ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKyAKKyAgLypDaGVjayBSVEMgV1VUV0YgZmxhZyBpcyByZXNldCBvbmx5IHdoZW4gd2FrZSB1cCB0aW1lciBlbmFibGVkKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19DUl9XVVRFKSAhPSAwVSl7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHJlc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMVUpCisgICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRShocnRjKTsKKworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdGlsbCBSVEMgV1VUV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLworICB3aGlsZShfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQorICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisKKyAgLyogQ2xlYXIgdGhlIFdha2V1cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVdha2VVcENsb2NrOworCisgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZXVwIFRpbWVyIGNvdW50ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPldVVFIgPSAodWludDMyX3QpV2FrZVVwQ291bnRlcjsKKworICAgLyogRW5hYmxlIHRoZSBXYWtldXAgVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHdha2UgdXAgdGltZXIgd2l0aCBpbnRlcnJ1cHQuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBwYXJhbSBXYWtlVXBDb3VudGVyIFdha2UgdXAgY291bnRlcgorICAqIEBwYXJhbSBXYWtlVXBDbG9jayBXYWtlIHVwIGNsb2NrICAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcl9JVChSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgV2FrZVVwQ291bnRlciwgdWludDMyX3QgV2FrZVVwQ2xvY2spCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DTE9DSyhXYWtlVXBDbG9jaykpOworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1dBS0VVUF9DT1VOVEVSKFdha2VVcENvdW50ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKkNoZWNrIFJUQyBXVVRXRiBmbGFnIGlzIHJlc2V0IG9ubHkgd2hlbiB3YWtlIHVwIHRpbWVyIGVuYWJsZWQqLworICBpZigoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0NSX1dVVEUpICE9IDBVKXsKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworIAorICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHJlc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMVUpCisgICB7CisgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogRGlzYWJsZSB0aGUgV2FrZS1VcCB0aW1lciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRShocnRjKTsKKworICAvKiBDbGVhciBmbGFnIFdha2UtVXAgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0NMRUFSX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VURik7CisKKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHRpbGwgUlRDIFdVVFdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8KKyAgd2hpbGUoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVFdGKSA9PSAwVSkKKyAgeworICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsgCisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gCisgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIFdha2V1cCBUaW1lciBjb3VudGVyICovCisgIGhydGMtPkluc3RhbmNlLT5XVVRSID0gKHVpbnQzMl90KVdha2VVcENvdW50ZXI7CisKKyAgLyogQ2xlYXIgdGhlIFdha2V1cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfV1VDS1NFTDsKKworICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVdha2VVcENsb2NrOworCisgIC8qIFJUQyBXYWtlVXBUaW1lciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOworICAKKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKKyAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKGhydGMsUlRDX0lUX1dVVCk7CisgIAorICAvKiBFbmFibGUgdGhlIFdha2V1cCBUaW1lciAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKGhydGMpOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7IAorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVhY3RpdmF0ZSB3YWtlIHVwIHRpbWVyIGNvdW50ZXIuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZSAKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlV2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLyAKKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBEaXNhYmxlIHRoZSBXYWtldXAgVGltZXIgKi8KKyAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogSW4gY2FzZSBvZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCB0aGUgaW50ZXJydXB0IHNvdXJjZSBtdXN0IGRpc2FibGVkICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKGhydGMsUlRDX0lUX1dVVCk7CisKKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRXRikgPT0gMFUpCisgIHsKKyAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUlRDX1RJTUVPVVRfVkFMVUUpCisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgd2FrZSB1cCB0aW1lciBjb3VudGVyLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUgCisgICogQHJldHZhbCBDb3VudGVyIHZhbHVlCisgICovCit1aW50MzJfdCBIQUxfUlRDRXhfR2V0V2FrZVVwVGltZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIC8qIEdldCB0aGUgY291bnRlciB2YWx1ZSAqLworICByZXR1cm4gKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPldVVFIgJiBSVENfV1VUUl9XVVQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgV2FrZSBVcCBUaW1lciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lcklSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7ICAKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBXQUtFVVBUSU1FUiBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfV1VURikgIT0gMFUpCisgICAgeworICAgICAgLyogV0FLRVVQVElNRVIgY2FsbGJhY2sgKi8gCisjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHJ0Yy0+V2FrZVVwVGltZXJFdmVudENhbGxiYWNrKGhydGMpOworI2Vsc2UKKyAgICAgIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soaHJ0Yyk7CisjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAKKyAgICAgIC8qIENsZWFyIHRoZSBXQUtFVVBUSU1FUiBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOworICAgIH0KKworICAvKiBDbGVhciB0aGUgRVhUSSdzIGxpbmUgRmxhZyBmb3IgUlRDIFdha2VVcFRpbWVyICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0NMRUFSX0ZMQUcoKTsKKyAKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7Cit9CisKKy8qKgorICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChocnRjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFdha2UgVXAgVGltZXIgUG9sbGluZy4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1BvbGxGb3JXYWtlVXBUaW1lckV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKSA9PSAwVSkKKyAgeworICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9USU1FT1VUOworICAgICAgCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDbGVhciB0aGUgV0FLRVVQVElNRVIgRmxhZyAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKTsKKyAgCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKworLyoqIEBhZGR0b2dyb3VwIFJUQ0V4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bworICAgICAgKCspIFdyaXRlIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKKyAgICAgICgrKSBSZWFkIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIKKyAgICAgICgrKSBTZXQgdGhlIENvYXJzZSBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgKCspIERlYWN0aXZhdGUgdGhlIENvYXJzZSBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAoKykgU2V0IHRoZSBTbW9vdGggY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIFN5bmNocm9uaXphdGlvbiBTaGlmdCBDb250cm9sIFNldHRpbmdzLgorICAgICAgKCspIENvbmZpZ3VyZSB0aGUgQ2FsaWJyYXRpb24gUGlub3V0IChSVENfQ0FMSUIpIFNlbGVjdGlvbiAoMUh6IG9yIDUxMkh6KS4KKyAgICAgICgrKSBEZWFjdGl2YXRlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAgICAgKCspIEVuYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICAgICAoKykgRGlzYWJsZSB0aGUgUlRDIHJlZmVyZW5jZSBjbG9jayBkZXRlY3Rpb24uCisgICAgICAoKykgRW5hYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICAgICAoKykgRGlzYWJsZSB0aGUgQnlwYXNzIFNoYWRvdyBmZWF0dXJlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGEgZGF0YSBpbiBhIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgcmVnaXN0ZXIuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZSAKKyAgKiBAcGFyYW0gQmFja3VwUmVnaXN0ZXIgUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyIG51bWJlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFJUQ19CS1BfRFJ4IHdoZXJlIHggY2FuIGJlIGZyb20gMCB0byAxOSB0byAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIHJlZ2lzdGVyLgorICAqIEBwYXJhbSBEYXRhIERhdGEgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIFJUQyBCYWNrdXAgZGF0YSByZWdpc3Rlci4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1JUQ0V4X0JLVVBXcml0ZShSVENfSGFuZGxlVHlwZURlZiAqaHJ0YywgdWludDMyX3QgQmFja3VwUmVnaXN0ZXIsIHVpbnQzMl90IERhdGEpCit7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0JLUChCYWNrdXBSZWdpc3RlcikpOworCisgIHRtcCA9ICh1aW50MzJfdCkmKGhydGMtPkluc3RhbmNlLT5CS1AwUik7CisgIHRtcCArPSAoQmFja3VwUmVnaXN0ZXIgKiA0VSk7CisKKyAgLyogV3JpdGUgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLworICAqKF9fSU8gdWludDMyX3QgKil0bXAgPSAodWludDMyX3QpRGF0YTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkcyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBSVEMgQmFja3VwIGRhdGEgUmVnaXN0ZXIuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZSAKKyAgKiBAcGFyYW0gQmFja3VwUmVnaXN0ZXIgUlRDIEJhY2t1cCBkYXRhIFJlZ2lzdGVyIG51bWJlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFJUQ19CS1BfRFJ4IHdoZXJlIHggY2FuIGJlIGZyb20gMCB0byAxOSB0byAKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIHJlZ2lzdGVyLgorICAqIEByZXR2YWwgUmVhZCB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX1JUQ0V4X0JLVVBSZWFkKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBCYWNrdXBSZWdpc3RlcikKK3sKKyAgdWludDMyX3QgdG1wOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQktQKEJhY2t1cFJlZ2lzdGVyKSk7CisKKyAgdG1wID0gKHVpbnQzMl90KSYoaHJ0Yy0+SW5zdGFuY2UtPkJLUDBSKTsKKyAgdG1wICs9IChCYWNrdXBSZWdpc3RlciAqIDRVKTsKKyAgCisgIC8qIFJlYWQgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLworICByZXR1cm4gKCooX19JTyB1aW50MzJfdCAqKXRtcCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBTbW9vdGggY2FsaWJyYXRpb24gcGFyYW1ldGVycy4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlICAKKyAgKiBAcGFyYW0gU21vb3RoQ2FsaWJQZXJpb2QgU2VsZWN0IHRoZSBTbW9vdGggQ2FsaWJyYXRpb24gUGVyaW9kLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIDoKKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMzJTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDMycy4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfMTZTRUM6IFRoZSBzbW9vdGggY2FsaWJyYXRpb24gcGVyaW9kIGlzIDE2cy4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QRVJJT0RfOFNFQzogVGhlIHNtb290aCBjYWxpYnJhdGlvbiBwZXJpb2QgaXMgOHMuCisgICogQHBhcmFtIFNtb290aENhbGliUGx1c1B1bHNlcyBTZWxlY3QgdG8gU2V0IG9yIHJlc2V0IHRoZSBDQUxQIGJpdC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NNT09USENBTElCX1BMVVNQVUxTRVNfU0VUOiBBZGQgb25lIFJUQ0NMSyBwdWxzZSBldmVyeSAyKjExIHB1bHNlcy4KKyAgKiAgICAgICAgICAgICBAYXJnIFJUQ19TTU9PVEhDQUxJQl9QTFVTUFVMU0VTX1JFU0VUOiBObyBSVENDTEsgcHVsc2VzIGFyZSBhZGRlZC4KKyAgKiBAcGFyYW0gU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlIFNlbGVjdCB0aGUgdmFsdWUgb2YgQ0FMTVs4OjBdIGJpdHMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBhbnkgdmFsdWUgZnJvbSAwIHRvIDB4MDAwMDAxRkYuCisgICogQG5vdGUgICBUbyBkZWFjdGl2YXRlIHRoZSBzbW9vdGggY2FsaWJyYXRpb24sIHRoZSBmaWVsZCBTbW9vdGhDYWxpYlBsdXNQdWxzZXMgCisgICogICAgICAgICBtdXN0IGJlIGVxdWFsIHRvIFNNT09USENBTElCX1BMVVNQVUxTRVNfUkVTRVQgYW5kIHRoZSBmaWVsZAorICAqICAgICAgICAgU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlIG11dCBiZSBlcXVhbCB0byAwLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JUQ0V4X1NldFNtb290aENhbGliKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjLCB1aW50MzJfdCBTbW9vdGhDYWxpYlBlcmlvZCwgdWludDMyX3QgU21vb3RoQ2FsaWJQbHVzUHVsc2VzLCB1aW50MzJfdCBTbW9vdGhDYWxpYk1pbnVzUHVsc2VzVmFsdWUpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NNT09USF9DQUxJQl9QRVJJT0QoU21vb3RoQ2FsaWJQZXJpb2QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TTU9PVEhfQ0FMSUJfUExVUyhTbW9vdGhDYWxpYlBsdXNQdWxzZXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TTU9PVEhfQ0FMSUJfTUlOVVMoU21vb3RoQ2FsaWJNaW51c1B1bHNlc1ZhbHVlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8gCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogY2hlY2sgaWYgYSBjYWxpYnJhdGlvbiBpcyBwZW5kaW5nKi8KKyAgaWYoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX1JFQ0FMUEYpICE9IDBVKQorICB7CisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qIGNoZWNrIGlmIGEgY2FsaWJyYXRpb24gaXMgcGVuZGluZyovCisgICAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX1JFQ0FMUEYpICE9IDBVKQorICAgIHsKKyAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSVENfVElNRU9VVF9WQUxVRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgICAgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7IAorICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgU21vb3RoIGNhbGlicmF0aW9uIHNldHRpbmdzICovCisgIGhydGMtPkluc3RhbmNlLT5DQUxSID0gKHVpbnQzMl90KSgodWludDMyX3QpU21vb3RoQ2FsaWJQZXJpb2QgfCAodWludDMyX3QpU21vb3RoQ2FsaWJQbHVzUHVsc2VzIHwgKHVpbnQzMl90KVNtb290aENhbGliTWludXNQdWxzZXNWYWx1ZSk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOyAKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU3luY2hyb25pemF0aW9uIFNoaWZ0IENvbnRyb2wgU2V0dGluZ3MuCisgICogQG5vdGUgICBXaGVuIFJFRkNLT04gaXMgc2V0LCBmaXJtd2FyZSBtdXN0IG5vdCB3cml0ZSB0byBTaGlmdCBjb250cm9sIHJlZ2lzdGVyLiAKKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlICAgIAorICAqIEBwYXJhbSBTaGlmdEFkZDFTIFNlbGVjdCB0byBhZGQgb3Igbm90IDEgc2Vjb25kIHRvIHRoZSB0aW1lIGNhbGVuZGFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NISUZUQUREMVNfU0VUOiBBZGQgb25lIHNlY29uZCB0byB0aGUgY2xvY2sgY2FsZW5kYXIuIAorICAqICAgICAgICAgICAgIEBhcmcgUlRDX1NISUZUQUREMVNfUkVTRVQ6IE5vIGVmZmVjdC4KKyAgKiBAcGFyYW0gU2hpZnRTdWJGUyBTZWxlY3QgdGhlIG51bWJlciBvZiBTZWNvbmQgRnJhY3Rpb25zIHRvIHN1YnN0aXR1dGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBhbnkgdmFsdWUgZnJvbSAwIHRvIDB4N0ZGRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRTeW5jaHJvU2hpZnQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IFNoaWZ0QWRkMVMsIHVpbnQzMl90IFNoaWZ0U3ViRlMpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX1NISUZUX0FERDFTKFNoaWZ0QWRkMVMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19TSElGVF9TVUJGUyhTaGlmdFN1YkZTKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8gCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgLyogV2FpdCB1bnRpbCB0aGUgc2hpZnQgaXMgY29tcGxldGVkKi8KKyAgICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfU0hQRikgIT0gMFUpCisgICAgeworICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJUQ19USU1FT1VUX1ZBTFVFKQorICAgICAgeworICAgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1RJTUVPVVQ7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICAgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbiBpcyBkaXNhYmxlZCAqLworICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfUkVGQ0tPTikgPT0gMFUpCisgICAgeworICAgICAgLyogQ29uZmlndXJlIHRoZSBTaGlmdCBzZXR0aW5ncyAqLworICAgICAgaHJ0Yy0+SW5zdGFuY2UtPlNISUZUUiA9ICh1aW50MzJfdCkodWludDMyX3QpKFNoaWZ0U3ViRlMpIHwgKHVpbnQzMl90KShTaGlmdEFkZDFTKTsKKworICAgICAgLyogSWYgIFJUQ19DUl9CWVBTSEFEIGJpdCA9IDAsIHdhaXQgZm9yIHN5bmNocm8gZWxzZSB0aGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgKi8KKyAgICAgIGlmKChocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfQ1JfQllQU0hBRCkgPT0gMFUpCisgICAgICB7CisgICAgICAgIGlmKEhBTF9SVENfV2FpdEZvclN5bmNocm8oaHJ0YykgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovIAorICAgICAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisgICAgICAKKyAgICAgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKyAgICAgIAorICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLyAKKyAgICAgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGliT3V0cHV0IDogU2VsZWN0IHRoZSBDYWxpYnJhdGlvbiBvdXRwdXQgU2VsZWN0aW9uIC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0NBTElCT1VUUFVUXzUxMkhaOiBBIHNpZ25hbCBoYXMgYSByZWd1bGFyIHdhdmVmb3JtIGF0IDUxMkh6LgorICAqICAgICAgICAgICAgIEBhcmcgUlRDX0NBTElCT1VUUFVUXzFIWjogQSBzaWduYWwgaGFzIGEgcmVndWxhciB3YXZlZm9ybSBhdCAxSHouCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfU2V0Q2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMsIHVpbnQzMl90IENhbGliT3V0cHV0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0NBTElCX09VVFBVVChDYWxpYk91dHB1dCkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHJ0Yyk7CisKKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgYmVmb3JlIGNvbmZpZyAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKHVpbnQzMl90KX5SVENfQ1JfQ09TRUw7CisKKyAgLyogQ29uZmlndXJlIHRoZSBSVENfQ1IgcmVnaXN0ZXIgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdClDYWxpYk91dHB1dDsKKworICBfX0hBTF9SVENfQ0FMSUJSQVRJT05fT1VUUFVUX0VOQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZWFjdGl2YXRlIHRoZSBDYWxpYnJhdGlvbiBQaW5vdXQgKFJUQ19DQUxJQikgU2VsZWN0aW9uICgxSHogb3IgNTEySHopLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EZWFjdGl2YXRlQ2FsaWJyYXRpb25PdXRQdXQoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovIAorICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIF9fSEFMX1JUQ19DQUxJQlJBVElPTl9PVVRQVVRfRElTQUJMRShocnRjKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFJUQyByZWZlcmVuY2UgY2xvY2sgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9TZXRSZWZDbG9jayhSVENfSGFuZGxlVHlwZURlZiogaHJ0YykKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocnRjKTsKKworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZihSVENfRW50ZXJJbml0TW9kZShocnRjKSAhPSBIQUxfT0spCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgIC8qIFNldCBSVEMgc3RhdGUqLworICAgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9FUlJPUjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX1JUQ19DTE9DS1JFRl9ERVRFQ1RJT05fRU5BQkxFKGhydGMpOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAgLyogQ2hhbmdlIFJUQyBzdGF0ZSAqLworICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHJ0Yyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBSVEMgcmVmZXJlbmNlIGNsb2NrIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRGVhY3RpdmF0ZVJlZkNsb2NrKFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworICAKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYoUlRDX0VudGVySW5pdE1vZGUoaHJ0YykgIT0gSEFMX09LKQorICB7CisgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7CisKKyAgICAvKiBTZXQgUlRDIHN0YXRlKi8KKyAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfRVJST1I7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhydGMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBfX0hBTF9SVENfQ0xPQ0tSRUZfREVURUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CisKKyAgICAvKiBFeGl0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBocnRjLT5JbnN0YW5jZS0+SVNSICY9ICh1aW50MzJfdCl+UlRDX0lTUl9JTklUOworICB9CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBCeXBhc3MgU2hhZG93IGZlYXR1cmUuCisgICogQHBhcmFtIGhydGMgUlRDIGhhbmRsZQorICAqIEBub3RlICAgV2hlbiB0aGUgQnlwYXNzIFNoYWRvdyBpcyBlbmFibGVkIHRoZSBjYWxlbmRhciB2YWx1ZSBhcmUgdGFrZW4KKyAgKiAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIENhbGVuZGFyIGNvdW50ZXIuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfRW5hYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCB0aGUgQllQU0hBRCBiaXQgKi8KKyAgaHJ0Yy0+SW5zdGFuY2UtPkNSIHw9ICh1aW50OF90KVJUQ19DUl9CWVBTSEFEOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhocnRjKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEJ5cGFzcyBTaGFkb3cgZmVhdHVyZS4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQG5vdGUgICBXaGVuIHRoZSBCeXBhc3MgU2hhZG93IGlzIGVuYWJsZWQgdGhlIGNhbGVuZGFyIHZhbHVlIGFyZSB0YWtlbgorICAqICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgQ2FsZW5kYXIgY291bnRlci4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SVENFeF9EaXNhYmxlQnlwYXNzU2hhZG93KFJUQ19IYW5kbGVUeXBlRGVmKiBocnRjKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhydGMpOworCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFJlc2V0IHRoZSBCWVBTSEFEIGJpdCAqLworICBocnRjLT5JbnN0YW5jZS0+Q1IgJj0gKCh1aW50OF90KX5SVENfQ1JfQllQU0hBRCk7CisKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOworCisgIC8qIENoYW5nZSBSVEMgc3RhdGUgKi8KKyAgaHJ0Yy0+U3RhdGUgPSBIQUxfUlRDX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhydGMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0CisgICogQGJyaWVmICAgIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0gICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIGZlYXR1cmVzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgUlRDIEFscmFtIEIgY2FsbGJhY2sKKyAgICAgICgrKSBSVEMgUG9sbCBmb3IgQWxhcm0gQiByZXF1ZXN0CisgICAgICAgICAgICAgICAKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgQWxhcm0gQiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaHJ0YyBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHJ0Yyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9SVENFeF9BbGFybUJFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEFsYXJtIEIgUG9sbGluZyByZXF1ZXN0LgorICAqIEBwYXJhbSBocnRjIFJUQyBoYW5kbGUKKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUlRDRXhfUG9sbEZvckFsYXJtQkV2ZW50KFJUQ19IYW5kbGVUeXBlRGVmICpocnRjLCB1aW50MzJfdCBUaW1lb3V0KQoreyAKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgCisgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJCRikgPT0gMFUpCisgIHsKKyAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICBocnRjLT5TdGF0ZSA9IEhBTF9SVENfU1RBVEVfVElNRU9VVDsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENsZWFyIHRoZSBBbGFybSBGbGFnICovCisgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKTsKKworICAvKiBDaGFuZ2UgUlRDIHN0YXRlICovCisgIGhydGMtPlN0YXRlID0gSEFMX1JUQ19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworICAKKyNlbmRpZiAvKiBIQUxfUlRDX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3NhaS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfc2FpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxNThhYgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3NhaS5jCkBAIC0wLDAgKzEsMjc2NCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc2FpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNBSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgQXVkaW8gSW50ZXJmYWNlIChTQUkpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSS9PIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICBUaGUgU0FJIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgU0FJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNBSV9IYW5kbGVUeXBlRGVmIGhzYWkpLgorICAgICgjKSBJbml0aWFsaXplIHRoZSBTQUkgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TQUlfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCMjKSBFbmFibGUgdGhlIFNBSSBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgjIykgU0FJIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTQUkgR1BJT3MuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgU0FJIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1NBSV9UcmFuc21pdF9JVCgpCisgICAgICAgICAgICAgYW5kIEhBTF9TQUlfUmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTQUkgaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNBSSBJUlEgaGFuZGxlLgorCisgICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfU0FJX1RyYW5zbWl0X0RNQSgpCisgICAgICAgICAgICAgYW5kIEhBTF9TQUlfUmVjZWl2ZV9ETUEoKSBBUElzKToKKyAgICAgICAgICAgICgrKyspIERlY2xhcmUgYSBETUEgaGFuZGxlIHN0cnVjdHVyZSBmb3IgdGhlIFR4L1J4IHN0cmVhbS4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBTdHJlYW0uCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFNBSSBETUEgVHgvUnggaGFuZGxlLgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZQorICAgICAgICAgICAgICAgIERNQSBUeC9SeCBTdHJlYW0uCisKKyAgICAoIykgVGhlIGluaXRpYWxpemF0aW9uIGNhbiBiZSBkb25lIGJ5IHR3byB3YXlzCisgICAgICAgICgjIykgRXhwZXJ0IG1vZGUgOiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmVzIEluaXQsIEZyYW1lSW5pdCBhbmQgU2xvdEluaXQgYW5kIGNhbGwgSEFMX1NBSV9Jbml0KCkuCisgICAgICAgICgjIykgU2ltcGxpZmllZCBtb2RlIDogSW5pdGlhbGl6ZSB0aGUgaGlnaCBwYXJ0IG9mIEluaXQgU3RydWN0dXJlIGFuZCBjYWxsIEhBTF9TQUlfSW5pdFByb3RvY29sKCkuCisKKyAgWy4uXQorICAgIChAKSBUaGUgc3BlY2lmaWMgU0FJIGludGVycnVwdHMgKEZJRk8gcmVxdWVzdCBhbmQgT3ZlcnJ1biB1bmRlcnJ1biBpbnRlcnJ1cHQpCisgICAgICAgIHdpbGwgYmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1NBSV9FTkFCTEVfSVQoKSBhbmQgX19IQUxfU0FJX0RJU0FCTEVfSVQoKQorICAgICAgICBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisgIFsuLl0KKyAgICAoQCkgTWFrZSBzdXJlIHRoYXQgZWl0aGVyOgorICAgICAgICAoK0ApIFBMTFNBSTFDTEsgb3V0cHV0IGlzIGNvbmZpZ3VyZWQgb3IKKyAgICAgICAgKCtAKSBQTExTQUkyQ0xLIG91dHB1dCBpcyBjb25maWd1cmVkIG9yCisgICAgICAgICgrQCkgUExMU0FJM0NMSyBvdXRwdXQgaXMgY29uZmlndXJlZCBvcgorICAgICAgICAoK0ApIEV4dGVybmFsIGNsb2NrIHNvdXJjZSBpcyBjb25maWd1cmVkIGFmdGVyIHNldHRpbmcgY29ycmVjdGx5CisgICAgICAgICAgICAgdGhlIGRlZmluZSBjb25zdGFudCBFWFRFUk5BTF9TQUkxX0NMT0NLX1ZBTFVFIG9yIEVYVEVSTkFMX1NBSTJfQ0xPQ0tfVkFMVUUgaW4gdGhlIHN0bTMyd2J4eF9oYWxfY29uZi5oIGZpbGUuCisKKyAgWy4uXQorICAgIChAKSBJbiBtYXN0ZXIgVHggbW9kZTogZW5hYmxpbmcgdGhlIGF1ZGlvIGJsb2NrIGltbWVkaWF0ZWx5IGdlbmVyYXRlcyB0aGUgYml0IGNsb2NrCisgICAgICAgIGZvciB0aGUgZXh0ZXJuYWwgc2xhdmVzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSBpbiB0aGUgRklGTywgSG93ZXZlciBGUyBzaWduYWwKKyAgICAgICAgZ2VuZXJhdGlvbiBpcyBjb25kaXRpb25lZCBieSB0aGUgcHJlc2VuY2Ugb2YgZGF0YSBpbiB0aGUgRklGTy4KKworICBbLi5dCisgICAgKEApIEluIG1hc3RlciBSeCBtb2RlOiBlbmFibGluZyB0aGUgYXVkaW8gYmxvY2sgaW1tZWRpYXRlbHkgZ2VuZXJhdGVzIHRoZSBiaXQgY2xvY2sKKyAgICAgICAgYW5kIEZTIHNpZ25hbCBmb3IgdGhlIGV4dGVybmFsIHNsYXZlcy4KKworICBbLi5dCisgICAgKEApIEl0IGlzIG1hbmRhdG9yeSB0byByZXNwZWN0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpbiBvcmRlciB0byBhdm9pZCBiYWQgU0FJIGJlaGF2aW9yOgorICAgICAgICAoK0ApIEZpcnN0IGJpdCBPZmZzZXQgPD0gKFNMT1Qgc2l6ZSAtIERhdGEgc2l6ZSkKKyAgICAgICAgKCtAKSBEYXRhIHNpemUgPD0gU0xPVCBzaXplCisgICAgICAgICgrQCkgTnVtYmVyIG9mIFNMT1QgeCBTTE9UIHNpemUgPSBGcmFtZSBsZW5ndGgKKyAgICAgICAgKCtAKSBUaGUgbnVtYmVyIG9mIHNsb3RzIHNob3VsZCBiZSBldmVuIHdoZW4gU0FJX0ZTX0NIQU5ORUxfSURFTlRJRklDQVRJT04gaXMgc2VsZWN0ZWQuCisKKyAgWy4uXQorICAgIChAKSBQRE0gaW50ZXJmYWNlIGNhbiBiZSBhY3RpdmF0ZWQgdGhyb3VnaCBIQUxfU0FJX0luaXQgZnVuY3Rpb24uCisgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgUERNIGludGVyZmFjZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgU0FJMSBzdWItYmxvY2sgQS4KKyAgICAgICAgUERNIG1pY3JvcGhvbmUgZGVsYXlzIGNhbiBiZSB0dW5lZCB3aXRoIEhBTF9TQUlFeF9Db25maWdQZG1NaWNEZWxheSBmdW5jdGlvbi4KKworICBbLi5dCisgICAgVGhyZWUgb3BlcmF0aW9uIG1vZGVzIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgZHJpdmVyIDoKKworICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NBSV9UcmFuc21pdCgpCisgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TQUlfUmVjZWl2ZSgpCisKKyAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgKCspIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NBSV9UcmFuc21pdF9JVCgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NBSV9UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU0FJX1JlY2VpdmVfSVQoKQorICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NBSV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEluIGNhc2Ugb2YgZmxhZyBlcnJvciwgSEFMX1NBSV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NBSV9FcnJvckNhbGxiYWNrKCkKKworICAgICoqKiBETUEgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU0FJX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NBSV9UeENwbHRDYWxsYmFjaygpCisgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU0FJX1JlY2VpdmVfRE1BKCkKKyAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBJbiBjYXNlIG9mIGZsYWcgZXJyb3IsIEhBTF9TQUlfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TQUlfRXJyb3JDYWxsYmFjaygpCisgICAgICAoKykgUGF1c2UgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfU0FJX0RNQVBhdXNlKCkKKyAgICAgICgrKSBSZXN1bWUgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfU0FJX0RNQVJlc3VtZSgpCisgICAgICAoKykgU3RvcCB0aGUgRE1BIFRyYW5zZmVyIHVzaW5nIEhBTF9TQUlfRE1BU3RvcCgpCisKKyAgICAqKiogU0FJIEhBTCBkcml2ZXIgYWRkaXRpb25hbCBmdW5jdGlvbiBsaXN0ICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQmVsb3cgdGhlIGxpc3QgdGhlIG90aGVycyBBUEkgYXZhaWxhYmxlIFNBSSBIQUwgZHJpdmVyIDoKKworICAgICAgKCspIEhBTF9TQUlfRW5hYmxlVHhNdXRlTW9kZSgpOiBFbmFibGUgdGhlIG11dGUgaW4gdHggbW9kZQorICAgICAgKCspIEhBTF9TQUlfRGlzYWJsZVR4TXV0ZU1vZGUoKTogRGlzYWJsZSB0aGUgbXV0ZSBpbiB0eCBtb2RlCisgICAgICAoKykgSEFMX1NBSV9FbmFibGVSeE11dGVNb2RlKCk6IEVuYWJsZSB0aGUgbXV0ZSBpbiBSeCBtb2RlCisgICAgICAoKykgSEFMX1NBSV9EaXNhYmxlUnhNdXRlTW9kZSgpOiBEaXNhYmxlIHRoZSBtdXRlIGluIFJ4IG1vZGUKKyAgICAgICgrKSBIQUxfU0FJX0ZsdXNoUnhGaWZvKCk6IEZsdXNoIHRoZSByeCBmaWZvLgorICAgICAgKCspIEhBTF9TQUlfQWJvcnQoKTogQWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNmZXIKKworICAgICoqKiBTQUkgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTQUkgSEFMIGRyaXZlciA6CisKKyAgICAgICgrKSBfX0hBTF9TQUlfRU5BQkxFKCk6IEVuYWJsZSB0aGUgU0FJIHBlcmlwaGVyYWwKKyAgICAgICgrKSBfX0hBTF9TQUlfRElTQUJMRSgpOiBEaXNhYmxlIHRoZSBTQUkgcGVyaXBoZXJhbAorICAgICAgKCspIF9fSEFMX1NBSV9FTkFCTEVfSVQoKTogRW5hYmxlIHRoZSBzcGVjaWZpZWQgU0FJIGludGVycnVwdHMKKyAgICAgICgrKSBfX0hBTF9TQUlfRElTQUJMRV9JVCgpOiBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgU0FJIGludGVycnVwdHMKKyAgICAgICgrKSBfX0hBTF9TQUlfR0VUX0lUX1NPVVJDRSgpOiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIFNBSSBpbnRlcnJ1cHQgc291cmNlIGlzCisgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgKCspIF9fSEFMX1NBSV9HRVRfRkxBRygpOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU0FJIGZsYWcgaXMgc2V0IG9yIG5vdAorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICBVc2UgZnVuY3Rpb25zIEhBTF9TQUlfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KKworICAgIFsuLl0KKyAgICBGdW5jdGlvbiBIQUxfU0FJX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgOiBTQUkgcmVjZWl2ZSBjb21wbGV0ZS4KKyAgICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgOiBTQUkgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlLgorICAgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICA6IFNBSSB0cmFuc21pdCBjb21wbGV0ZS4KKyAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgOiBTQUkgdHJhbnNtaXQgaGFsZiBjb21wbGV0ZS4KKyAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBTQUkgZXJyb3IuCisgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogU0FJIE1zcEluaXQuCisgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogU0FJIE1zcERlSW5pdC4KKyAgICBbLi5dCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBjYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEhBTF9TQUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEhBTF9TQUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgY2FsbGJhY2sgSUQuCisgICAgWy4uXQorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgIDogU0FJIHJlY2VpdmUgY29tcGxldGUuCisgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogU0FJIHJlY2VpdmUgaGFsZiBjb21wbGV0ZS4KKyAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgOiBTQUkgdHJhbnNtaXQgY29tcGxldGUuCisgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrIDogU0FJIHRyYW5zbWl0IGhhbGYgY29tcGxldGUuCisgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogU0FJIGVycm9yLgorICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IFNBSSBNc3BJbml0LgorICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IFNBSSBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9TQUlfSW5pdCBhbmQgaWYgdGhlIHN0YXRlIGlzIEhBTF9TQUlfU1RBVEVfUkVTRVQKKyAgICBhbGwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOgorICAgIGV4YW1wbGVzIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soKSwgSEFMX1NBSV9FcnJvckNhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEhBTF9TQUlfSW5pdAorICAgIGFuZCBIQUxfU0FJX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEhBTF9TQUlfSW5pdCBhbmQgSEFMX1NBSV9EZUluaXQKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCisgICAgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgdXNpbmcgSEFMX1NBSV9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEhBTF9TQUlfRGVJbml0CisgICAgb3IgSEFMX1NBSV9Jbml0IGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTQUkgU0FJCisgICogQGJyaWVmIFNBSSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfU0FJX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNBSV9Qcml2YXRlX1R5cGVkZWZzICBTQUkgUHJpdmF0ZSBUeXBlZGVmcworICAqIEB7CisgICovCit0eXBlZGVmIGVudW0KK3sKKyAgU0FJX01PREVfRE1BLAorICBTQUlfTU9ERV9JVAorfSBTQUlfTW9kZVR5cGVkZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTQUlfUHJpdmF0ZV9Db25zdGFudHMgIFNBSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNBSV9ERUZBVUxUX1RJTUVPVVQgICAgICA0VQorI2RlZmluZSBTQUlfTE9OR19USU1FT1VUICAgICAgICAgMTAwMFUKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU0FJX1ByaXZhdGVfRnVuY3Rpb25zICBTQUkgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgU0FJX0ZpbGxGaWZvKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3N0YXRpYyB1aW50MzJfdCBTQUlfSW50ZXJydXB0RmxhZyhjb25zdCBTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgU0FJX01vZGVUeXBlZGVmIG1vZGUpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9Jbml0STJTKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MzJfdCBwcm90b2NvbCwgdWludDMyX3QgZGF0YXNpemUsIHVpbnQzMl90IG5ic2xvdCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0FJX0luaXRQQ00oU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQzMl90IHByb3RvY29sLCB1aW50MzJfdCBkYXRhc2l6ZSwgdWludDMyX3QgbmJzbG90KTsKKworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9EaXNhYmxlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3N0YXRpYyB2b2lkIFNBSV9UcmFuc21pdF9JVDhCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMzJCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworc3RhdGljIHZvaWQgU0FJX1JlY2VpdmVfSVQ4Qml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKTsKK3N0YXRpYyB2b2lkIFNBSV9SZWNlaXZlX0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpOworc3RhdGljIHZvaWQgU0FJX1JlY2VpdmVfSVQzMkJpdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSk7CisKK3N0YXRpYyB2b2lkIFNBSV9ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU0FJX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU0FJX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTQUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTQUlfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU0FJX0RNQUFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTQUlfRXhwb3J0ZWRfRnVuY3Rpb25zIFNBSSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNBSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgIGRlLWluaXRpYWxpemUgdGhlIFNBSXggcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBpbXBsZW1lbnQgSEFMX1NBSV9Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TQUlfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBNb2RlIChNYXN0ZXIvc2xhdmUgVFgvUlgpCisgICAgICAgICgrKykgUHJvdG9jb2wKKyAgICAgICAgKCsrKSBEYXRhIFNpemUKKyAgICAgICAgKCsrKSBNQ0xLIE91dHB1dAorICAgICAgICAoKyspIEF1ZGlvIGZyZXF1ZW5jeQorICAgICAgICAoKyspIEZJRk8gVGhyZXNob2xkCisgICAgICAgICgrKykgRnJhbWUgQ29uZmlnCisgICAgICAgICgrKykgU2xvdCBDb25maWcKKyAgICAgICAgKCsrKSBQRE0gQ29uZmlnCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU0FJX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBTQUkgcGVyaXBoZXJhbC4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgRnJhbWVJbml0LCBTbG90SW5pdCBhbmQgdGhlIGxvdyBwYXJ0IG9mCisgICogICAgICAgICBJbml0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCisgICogICAgICAgICBIQUxfU0FJX0luaXQgdG8gaW5pdGlhbGl6ZSB0aGUgU0FJIGJsb2NrLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwcm90b2NvbCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbCBAcmVmIFNBSV9Qcm90b2NvbAorICAqIEBwYXJhbSAgZGF0YXNpemUgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YXNpemUgQHJlZiBTQUlfUHJvdG9jb2xfRGF0YVNpemUKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIG5ic2xvdCBOdW1iZXIgb2Ygc2xvdC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfSW5pdFByb3RvY29sKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MzJfdCBwcm90b2NvbCwgdWludDMyX3QgZGF0YXNpemUsIHVpbnQzMl90IG5ic2xvdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TQUlfU1VQUE9SVEVEX1BST1RPQ09MKHByb3RvY29sKSk7CisgIGFzc2VydF9wYXJhbShJU19TQUlfUFJPVE9DT0xfREFUQVNJWkUoZGF0YXNpemUpKTsKKworICBzd2l0Y2ggKHByb3RvY29sKQorICB7CisgICAgY2FzZSBTQUlfSTJTX1NUQU5EQVJEIDoKKyAgICBjYXNlIFNBSV9JMlNfTVNCSlVTVElGSUVEIDoKKyAgICBjYXNlIFNBSV9JMlNfTFNCSlVTVElGSUVEIDoKKyAgICAgIHN0YXR1cyA9IFNBSV9Jbml0STJTKGhzYWksIHByb3RvY29sLCBkYXRhc2l6ZSwgbmJzbG90KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1BDTV9MT05HIDoKKyAgICBjYXNlIFNBSV9QQ01fU0hPUlQgOgorICAgICAgc3RhdHVzID0gU0FJX0luaXRQQ00oaHNhaSwgcHJvdG9jb2wsIGRhdGFzaXplLCBuYnNsb3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX1NBSV9Jbml0KGhzYWkpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTQUkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgKiAgICAgICAgIGluIHRoZSBTQUlfSW5pdFR5cGVEZWYgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9Jbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICB1aW50MzJfdCB0bXByZWdpc3RlckdDUjsKKyAgdWludDMyX3QgY2tzdHJfYml0czsKKyAgdWludDMyX3Qgc3luY2VuX2JpdHM7CisKKyAgLyogQ2hlY2sgdGhlIFNBSSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNhaSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIGNoZWNrIHRoZSBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0FMTF9JTlNUQU5DRShoc2FpLT5JbnN0YW5jZSkpOworCisgIC8qIENoZWNrIHRoZSBTQUkgQmxvY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0FVRElPX0ZSRVFVRU5DWShoc2FpLT5Jbml0LkF1ZGlvRnJlcXVlbmN5KSk7CisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfUFJPVE9DT0woaHNhaS0+SW5pdC5Qcm90b2NvbCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01PREUoaHNhaS0+SW5pdC5BdWRpb01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19EQVRBU0laRShoc2FpLT5Jbml0LkRhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRklSU1RfQklUKGhzYWktPkluaXQuRmlyc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19DTE9DS19TVFJPQklORyhoc2FpLT5Jbml0LkNsb2NrU3Ryb2JpbmcpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19TWU5DSFJPKGhzYWktPkluaXQuU3luY2hybykpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01DS19PVVRQVVQoaHNhaS0+SW5pdC5NY2tPdXRwdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19PVVRQVVRfRFJJVkUoaHNhaS0+SW5pdC5PdXRwdXREcml2ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX05PRElWSURFUihoc2FpLT5Jbml0Lk5vRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0ZJRk9fVEhSRVNIT0xEKGhzYWktPkluaXQuRklGT1RocmVzaG9sZCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX01PTk9fU1RFUkVPX01PREUoaHNhaS0+SW5pdC5Nb25vU3RlcmVvTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0NPTVBBTkRJTkdfTU9ERShoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfVFJJU1RBVEVfTUFOQUdFTUVOVChoc2FpLT5Jbml0LlRyaVN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfU1lOQ0VYVChoc2FpLT5Jbml0LlN5bmNocm9FeHQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19NQ0tfT1ZFUlNBTVBMSU5HKGhzYWktPkluaXQuTWNrT3ZlclNhbXBsaW5nKSk7CisKKyAgLyogQ2hlY2sgdGhlIFNBSSBCbG9jayBGcmFtZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfRlJBTUVfTEVOR1RIKGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0FDVElWRV9GUkFNRShoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19GU19ERUZJTklUSU9OKGhzYWktPkZyYW1lSW5pdC5GU0RlZmluaXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9CTE9DS19GU19QT0xBUklUWShoc2FpLT5GcmFtZUluaXQuRlNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0ZTX09GRlNFVChoc2FpLT5GcmFtZUluaXQuRlNPZmZzZXQpKTsKKworICAvKiBDaGVjayB0aGUgU0FJIEJsb2NrIFNsb3QgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX0ZJUlNUQklUX09GRlNFVChoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX1NMT1RfU0laRShoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX1NMT1RfTlVNQkVSKGhzYWktPlNsb3RJbml0LlNsb3ROdW1iZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NBSV9TTE9UX0FDVElWRShoc2FpLT5TbG90SW5pdC5TbG90QWN0aXZlKSk7CisKKyAgLyogQ2hlY2sgdGhlIFNBSSBQRE0gcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShoc2FpLT5Jbml0LlBkbUluaXQuQWN0aXZhdGlvbikpOworICBpZiAoaHNhaS0+SW5pdC5QZG1Jbml0LkFjdGl2YXRpb24gPT0gRU5BQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NBSV9QRE1fTUlDX1BBSVJTX05VTUJFUihoc2FpLT5Jbml0LlBkbUluaXQuTWljUGFpcnNOYnIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU0FJX1BETV9DTE9DS19FTkFCTEUoaHNhaS0+SW5pdC5QZG1Jbml0LkNsb2NrRW5hYmxlKSk7CisgICAgLyogQ2hlY2sgdGhhdCBTQUkgc3ViLWJsb2NrIGlzIFNBSTEgc3ViLWJsb2NrIEEsIGluIG1hc3RlciBSWCBtb2RlIHdpdGggZnJlZSBwcm90b2NvbCAqLworICAgIGlmICgoaHNhaS0+SW5zdGFuY2UgIT0gU0FJMV9CbG9ja19BKSB8fAorICAgICAgICAoaHNhaS0+SW5pdC5BdWRpb01vZGUgIT0gU0FJX01PREVNQVNURVJfUlgpIHx8CisgICAgICAgIChoc2FpLT5Jbml0LlByb3RvY29sICE9IFNBSV9GUkVFX1BST1RPQ09MKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGhzYWktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgY2FsbGJhY2sgcG9pbnRlcnMgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFja3MgKi8KKyAgICBoc2FpLT5SeENwbHRDYWxsYmFjayAgICAgPSBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrOworICAgIGhzYWktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TQUlfUnhIYWxmQ3BsdENhbGxiYWNrOworICAgIGhzYWktPlR4Q3BsdENhbGxiYWNrICAgICA9IEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2s7CisgICAgaHNhaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2s7CisgICAgaHNhaS0+RXJyb3JDYWxsYmFjayAgICAgID0gSEFMX1NBSV9FcnJvckNhbGxiYWNrOworCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIGlmIChoc2FpLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBoc2FpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU0FJX01zcEluaXQ7CisgICAgfQorICAgIGhzYWktPk1zcEluaXRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9TQUlfTXNwSW5pdChoc2FpKTsKKyNlbmRpZgorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU0FJIHBlcmlwaGVyYWwgKi8KKyAgaWYgKFNBSV9EaXNhYmxlKGhzYWkpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWTsKKworICAvKiBTQUkgQmxvY2sgU3luY2hybyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogVGhpcyBzZXR0aW5nIG11c3QgYmUgZG9uZSB3aXRoIGJvdGggYXVkaW8gYmxvY2sgKEEgJiBCKSBkaXNhYmxlZCAgICAgICAgICovCisgIHN3aXRjaCAoaHNhaS0+SW5pdC5TeW5jaHJvRXh0KQorICB7CisgICAgY2FzZSBTQUlfU1lOQ0VYVF9ESVNBQkxFIDoKKyAgICAgIHRtcHJlZ2lzdGVyR0NSID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1NZTkNFWFRfT1VUQkxPQ0tBX0VOQUJMRSA6CisgICAgICB0bXByZWdpc3RlckdDUiA9IFNBSV9HQ1JfU1lOQ09VVF8wOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUlfU1lOQ0VYVF9PVVRCTE9DS0JfRU5BQkxFIDoKKyAgICAgIHRtcHJlZ2lzdGVyR0NSID0gU0FJX0dDUl9TWU5DT1VUXzE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHRtcHJlZ2lzdGVyR0NSID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChoc2FpLT5Jbml0LlN5bmNocm8pCisgIHsKKyAgICBjYXNlIFNBSV9BU1lOQ0hST05PVVMgOgorICAgICAgc3luY2VuX2JpdHMgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUlfU1lOQ0hST05PVVMgOgorICAgICAgc3luY2VuX2JpdHMgPSBTQUlfeENSMV9TWU5DRU5fMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1NZTkNIUk9OT1VTX0VYVF9TQUkxIDoKKyAgICAgIHN5bmNlbl9iaXRzID0gU0FJX3hDUjFfU1lOQ0VOXzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBSV9TWU5DSFJPTk9VU19FWFRfU0FJMiA6CisgICAgICBzeW5jZW5fYml0cyA9IFNBSV94Q1IxX1NZTkNFTl8xOworICAgICAgdG1wcmVnaXN0ZXJHQ1IgfD0gU0FJX0dDUl9TWU5DSU5fMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgc3luY2VuX2JpdHMgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICBTQUkxLT5HQ1IgPSB0bXByZWdpc3RlckdDUjsKKworICBpZiAoaHNhaS0+SW5pdC5BdWRpb0ZyZXF1ZW5jeSAhPSBTQUlfQVVESU9fRlJFUVVFTkNZX01DS0RJVikKKyAgeworICAgIHVpbnQzMl90IGZyZXE7CisgICAgdWludDMyX3QgdG1wdmFsOworCisgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgTUNLRElWIHZhbHVlIGlzIGNhbGN1bGF0ZWQgdG8gZ2V0IEF1ZGlvRnJlcXVlbmN5ICovCisgICAgZnJlcSA9IEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxKFJDQ19QRVJJUEhDTEtfU0FJMSk7CisKKyAgICAvKiBDb25maWd1cmUgTWFzdGVyIENsb2NrIERpdmlkZXIgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhIDoKKyAgICAgICAtIElmIE5PRElWID0gMSA6CisgICAgICAgICBNQ0tESVZbNTowXSA9IFNBSV9DS194IC8gKEZTICogKEZSTCArIDEpKQorICAgICAgIC0gSWYgTk9ESVYgPSAwIDoKKyAgICAgICAgIE1DS0RJVls1OjBdID0gU0FJX0NLX3ggLyAoRlMgKiAoT1NSICsgMSkgKiAyNTYpICovCisgICAgaWYgKGhzYWktPkluaXQuTm9EaXZpZGVyID09IFNBSV9NQVNURVJESVZJREVSX0RJU0FCTEUpCisgICAgeworICAgICAgLyogTk9ESVYgPSAxICovCisgICAgICAvKiAoZnJlcSB4IDEwKSB0byBrZWVwIFNpZ25pZmljYW50IGRpZ2l0cyAqLworICAgICAgdG1wdmFsID0gKGZyZXEgKiAxMFUpIC8gKGhzYWktPkluaXQuQXVkaW9GcmVxdWVuY3kgKiBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTk9ESVYgPSAwICovCisgICAgICB1aW50MzJfdCB0bXBvc3I7CisgICAgICB0bXBvc3IgPSAoaHNhaS0+SW5pdC5NY2tPdmVyU2FtcGxpbmcgPT0gU0FJX01DS19PVkVSU0FNUExJTkdfRU5BQkxFKSA/IDJVIDogMVU7CisgICAgICAvKiAoZnJlcSB4IDEwKSB0byBrZWVwIFNpZ25pZmljYW50IGRpZ2l0cyAqLworICAgICAgdG1wdmFsID0gKGZyZXEgKiAxMFUpIC8gKGhzYWktPkluaXQuQXVkaW9GcmVxdWVuY3kgKiB0bXBvc3IgKiAyNTZVKTsKKyAgICB9CisgICAgaHNhaS0+SW5pdC5NY2tkaXYgPSB0bXB2YWwgLyAxMFU7CisKKyAgICAvKiBSb3VuZCByZXN1bHQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciAqLworICAgIGlmICgodG1wdmFsICUgMTBVKSA+IDhVKQorICAgIHsKKyAgICAgIGhzYWktPkluaXQuTWNrZGl2ICs9IDFVOworICAgIH0KKyAgfQorICAvKiBDaGVjayB0aGUgU0FJIEJsb2NrIG1hc3RlciBjbG9jayBkaXZpZGVyIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01BU1RFUl9ESVZJREVSKGhzYWktPkluaXQuTWNrZGl2KSk7CisKKyAgLyogQ29tcHV0ZSBDS1NUUiBiaXRzIG9mIFNBSSBDUjEgYWNjb3JkaW5nIENsb2NrU3Ryb2JpbmcgYW5kIEF1ZGlvTW9kZSAqLworICBpZiAoKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFTUFTVEVSX1RYKSB8fCAoaHNhaS0+SW5pdC5BdWRpb01vZGUgPT0gU0FJX01PREVTTEFWRV9UWCkpCisgIHsKKyAgICAvKiBUcmFuc21pdCAqLworICAgIGNrc3RyX2JpdHMgPSAoaHNhaS0+SW5pdC5DbG9ja1N0cm9iaW5nID09IFNBSV9DTE9DS1NUUk9CSU5HX1JJU0lOR0VER0UpID8gMFUgOiBTQUlfeENSMV9DS1NUUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWNlaXZlICovCisgICAgY2tzdHJfYml0cyA9IChoc2FpLT5Jbml0LkNsb2NrU3Ryb2JpbmcgPT0gU0FJX0NMT0NLU1RST0JJTkdfUklTSU5HRURHRSkgPyBTQUlfeENSMV9DS1NUUiA6IDBVOworICB9CisKKyAgLyogU0FJIEJsb2NrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIFNBSSBDUjEgQ29uZmlndXJhdGlvbiAqLworICBoc2FpLT5JbnN0YW5jZS0+Q1IxICY9IH4oU0FJX3hDUjFfTU9ERSB8IFNBSV94Q1IxX1BSVENGRyB8ICBTQUlfeENSMV9EUyB8ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FJX3hDUjFfTFNCRklSU1QgfCBTQUlfeENSMV9DS1NUUiB8IFNBSV94Q1IxX1NZTkNFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBSV94Q1IxX01PTk8gfCBTQUlfeENSMV9PVVREUklWICB8IFNBSV94Q1IxX0RNQUVOIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBSV94Q1IxX05PRElWIHwgU0FJX3hDUjFfTUNLRElWIHwgU0FJX3hDUjFfT1NSIHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBSV94Q1IxX01DS0VOKTsKKworICBoc2FpLT5JbnN0YW5jZS0+Q1IxIHw9IChoc2FpLT5Jbml0LkF1ZGlvTW9kZSB8IGhzYWktPkluaXQuUHJvdG9jb2wgfCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5Jbml0LkRhdGFTaXplIHwgaHNhaS0+SW5pdC5GaXJzdEJpdCAgfCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBja3N0cl9iaXRzIHwgc3luY2VuX2JpdHMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5Jbml0Lk1vbm9TdGVyZW9Nb2RlIHwgaHNhaS0+SW5pdC5PdXRwdXREcml2ZSB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5Jbml0Lk5vRGl2aWRlciB8IChoc2FpLT5Jbml0Lk1ja2RpdiA8PCAyMCkgfCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBoc2FpLT5Jbml0Lk1ja092ZXJTYW1wbGluZyB8IGhzYWktPkluaXQuTWNrT3V0cHV0KTsKKworICAvKiBTQUkgQ1IyIENvbmZpZ3VyYXRpb24gKi8KKyAgaHNhaS0+SW5zdGFuY2UtPkNSMiAmPSB+KFNBSV94Q1IyX0ZUSCB8IFNBSV94Q1IyX0ZGTFVTSCB8IFNBSV94Q1IyX0NPTVAgfCBTQUlfeENSMl9DUEwpOworICBoc2FpLT5JbnN0YW5jZS0+Q1IyIHw9IChoc2FpLT5Jbml0LkZJRk9UaHJlc2hvbGQgfCBoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlIHwgaHNhaS0+SW5pdC5UcmlTdGF0ZSk7CisKKyAgLyogU0FJIEZyYW1lIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBoc2FpLT5JbnN0YW5jZS0+RlJDUiAmPSAofihTQUlfeEZSQ1JfRlJMIHwgU0FJX3hGUkNSX0ZTQUxMIHwgU0FJX3hGUkNSX0ZTREVGIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUlfeEZSQ1JfRlNQT0wgfCBTQUlfeEZSQ1JfRlNPRkYpKTsKKyAgaHNhaS0+SW5zdGFuY2UtPkZSQ1IgfD0gKChoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggLSAxVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNhaS0+RnJhbWVJbml0LkZTT2Zmc2V0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzYWktPkZyYW1lSW5pdC5GU0RlZmluaXRpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNhaS0+RnJhbWVJbml0LkZTUG9sYXJpdHkgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhzYWktPkZyYW1lSW5pdC5BY3RpdmVGcmFtZUxlbmd0aCAtIDFVKSA8PCA4KSk7CisKKyAgLyogU0FJIEJsb2NrX3ggU0xPVCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIFRoaXMgcmVnaXN0ZXIgaGFzIG5vIG1lYW5pbmcgaW4gQUMgOTcgYW5kIFNQRElGIGF1ZGlvIHByb3RvY29sICovCisgIGhzYWktPkluc3RhbmNlLT5TTE9UUiAmPSAofihTQUlfeFNMT1RSX0ZCT0ZGIHwgU0FJX3hTTE9UUl9TTE9UU1ogfCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FJX3hTTE9UUl9OQlNMT1QgfCBTQUlfeFNMT1RSX1NMT1RFTikpOworCisgIGhzYWktPkluc3RhbmNlLT5TTE9UUiB8PSBoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCB8IGhzYWktPlNsb3RJbml0LlNsb3RTaXplIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhzYWktPlNsb3RJbml0LlNsb3RBY3RpdmUgPDwgMTYpIHwgKChoc2FpLT5TbG90SW5pdC5TbG90TnVtYmVyIC0gMVUpIDw8ICA4KTsKKworICAvKiBTQUkgUERNIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKGhzYWktPkluc3RhbmNlID09IFNBSTFfQmxvY2tfQSkKKyAgeworICAgIC8qIERpc2FibGUgUERNIGludGVyZmFjZSAqLworICAgIFNBSTEtPlBETUNSICY9IH4oU0FJX1BETUNSX1BETUVOKTsKKyAgICBpZiAoaHNhaS0+SW5pdC5QZG1Jbml0LkFjdGl2YXRpb24gPT0gRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIENvbmZpZ3VyZSBhbmQgZW5hYmxlIFBETSBpbnRlcmZhY2UgKi8KKyAgICAgIFNBSTEtPlBETUNSID0gKGhzYWktPkluaXQuUGRtSW5pdC5DbG9ja0VuYWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAoKGhzYWktPkluaXQuUGRtSW5pdC5NaWNQYWlyc05iciAtIDFVKSA8PCBTQUlfUERNQ1JfTUlDTkJSX1BvcykpOworICAgICAgU0FJMS0+UERNQ1IgfD0gU0FJX1BETUNSX1BETUVOOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KKyAgaHNhaS0+RXJyb3JDb2RlID0gSEFMX1NBSV9FUlJPUl9OT05FOworCisgIC8qIEluaXRpYWxpemUgdGhlIFNBSSBzdGF0ZSAqLworICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU0FJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRGVJbml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICAvKiBDaGVjayB0aGUgU0FJIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc2FpID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZWQgQWxsIGludGVycnVwdCBhbmQgY2xlYXIgYWxsIHRoZSBmbGFnICovCisgIGhzYWktPkluc3RhbmNlLT5JTVIgPSAwOworICBoc2FpLT5JbnN0YW5jZS0+Q0xSRlIgPSAweEZGRkZGRkZGVTsKKworICAvKiBEaXNhYmxlIHRoZSBTQUkgKi8KKyAgaWYgKFNBSV9EaXNhYmxlKGhzYWkpICE9IEhBTF9PSykKKyAgeworICAgIC8qIFJlc2V0IFNBSSBzdGF0ZSB0byByZWFkeSAqLworICAgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsKKworICAgIC8qIFJlbGVhc2UgTG9jayAqLworICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBGbHVzaCB0aGUgZmlmbyAqLworICBTRVRfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX0ZGTFVTSCk7CisKKyAgLyogRGlzYWJsZSBTQUkgUERNIGludGVyZmFjZSAqLworICBpZiAoaHNhaS0+SW5zdGFuY2UgPT0gU0FJMV9CbG9ja19BKQorICB7CisgICAgLyogUmVzZXQgUERNIGRlbGF5cyAqLworICAgIFNBSTEtPlBETURMWSA9IDBVOworCisgICAgLyogRGlzYWJsZSBQRE0gaW50ZXJmYWNlICovCisgICAgU0FJMS0+UERNQ1IgJj0gfihTQUlfUERNQ1JfUERNRU4pOworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChoc2FpLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHNhaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU0FJX01zcERlSW5pdDsKKyAgfQorICBoc2FpLT5Nc3BEZUluaXRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgIEhBTF9TQUlfTXNwRGVJbml0KGhzYWkpOworI2VuZGlmCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgZXJyb3IgY29kZSAqLworICBoc2FpLT5FcnJvckNvZGUgPSBIQUxfU0FJX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgU0FJIHN0YXRlICovCisgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBTQUkgTVNQLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU0FJX01zcEluaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzYWkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0FJX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgU0FJIE1TUC4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NBSV9Nc3BEZUluaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzYWkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0FJX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIHVzZXIgU0FJIGNhbGxiYWNrCisgICogICAgICAgICB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzYWkgU0FJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9SWF9DT01QTEVURV9DQl9JRCByZWNlaXZlIGNvbXBsZXRlIGNhbGxiYWNrIElELgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElELgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9UWF9DT01QTEVURV9DQl9JRCB0cmFuc21pdCBjb21wbGV0ZSBjYWxsYmFjayBJRC4KKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TQUlfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIHRyYW5zbWl0IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgSUQuCisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX0VSUk9SX0NCX0lEIGVycm9yIGNhbGxiYWNrIElELgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9NU1BJTklUX0NCX0lEIE1TUCBpbml0IGNhbGxiYWNrIElELgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9NU1BERUlOSVRfQ0JfSUQgTVNQIGRlLWluaXQgY2FsbGJhY2sgSUQuCisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWdpc3RlckNhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICAgICAgICAqaHNhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU0FJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNBSV9DYWxsYmFja1R5cGVEZWYgICAgICBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChIQUxfU0FJX1NUQVRFX1JFQURZID09IGhzYWktPlN0YXRlKQorICAgIHsKKyAgICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBIQUxfU0FJX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgICBoc2FpLT5SeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfU0FJX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgICAgaHNhaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9TQUlfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICAgIGhzYWktPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9TQUlfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgICBoc2FpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1NBSV9FUlJPUl9DQl9JRCA6CisgICAgICAgICAgaHNhaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfU0FJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICAgIGhzYWktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfU0FJX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgICAgaHNhaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KKyAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEhBTF9TQUlfU1RBVEVfUkVTRVQgPT0gaHNhaS0+U3RhdGUpCisgICAgeworICAgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgICAgeworICAgICAgICBjYXNlIEhBTF9TQUlfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgICAgaHNhaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9TQUlfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgICBoc2FpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIHVzZXIgU0FJIGNhbGxiYWNrLgorICAqICAgICAgICAgU0FJIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzYWkgU0FJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX1JYX0NPTVBMRVRFX0NCX0lEIHJlY2VpdmUgY29tcGxldGUgY2FsbGJhY2sgSUQuCisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX1JYX0hBTEZDT01QTEVURV9DQl9JRCByZWNlaXZlIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgSUQuCisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX1RYX0NPTVBMRVRFX0NCX0lEIHRyYW5zbWl0IGNvbXBsZXRlIGNhbGxiYWNrIElELgorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NBSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgdHJhbnNtaXQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBJRC4KKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TQUlfRVJST1JfQ0JfSUQgZXJyb3IgY2FsbGJhY2sgSUQuCisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX01TUElOSVRfQ0JfSUQgTVNQIGluaXQgY2FsbGJhY2sgSUQuCisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0FJX01TUERFSU5JVF9DQl9JRCBNU1AgZGUtaW5pdCBjYWxsYmFjayBJRC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX1VuUmVnaXN0ZXJDYWxsYmFjayhTQUlfSGFuZGxlVHlwZURlZiAgICAgICAgKmhzYWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU0FJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAoSEFMX1NBSV9TVEFURV9SRUFEWSA9PSBoc2FpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TQUlfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc2FpLT5SeENwbHRDYWxsYmFjayA9IEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfU0FJX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzYWktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TQUlfUnhIYWxmQ3BsdENhbGxiYWNrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX1NBSV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzYWktPlR4Q3BsdENhbGxiYWNrID0gSEFMX1NBSV9UeENwbHRDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9TQUlfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNhaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfU0FJX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNhaS0+RXJyb3JDYWxsYmFjayA9IEhBTF9TQUlfRXJyb3JDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9TQUlfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzYWktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TQUlfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9TQUlfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNhaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU0FJX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TQUlfU1RBVEVfUkVTRVQgPT0gaHNhaS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU0FJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc2FpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU0FJX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfU0FJX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzYWktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NBSV9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU0FJIGRhdGEKKyAgICB0cmFuc2ZlcnMuCisKKyAgICAoKykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICgrKykgQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgcG9sbGluZyBtb2RlLgorICAgICAgICAgICBUaGUgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlIDogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgb3IgRE1BLiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIHN0YXJ0dXAuCisgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICBkZWRpY2F0ZWQgU0FJIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgdXNpbmcgRE1BIG1vZGUuCisKKyAgICAoKykgQmxvY2tpbmcgbW9kZSBmdW5jdGlvbnMgYXJlIDoKKyAgICAgICgrKykgSEFMX1NBSV9UcmFuc21pdCgpCisgICAgICAoKyspIEhBTF9TQUlfUmVjZWl2ZSgpCisKKyAgICAoKykgTm9uIEJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAoKyspIEhBTF9TQUlfVHJhbnNtaXRfSVQoKQorICAgICAgKCsrKSBIQUxfU0FJX1JlY2VpdmVfSVQoKQorCisgICAgKCspIE5vbiBCbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgKCsrKSBIQUxfU0FJX1RyYW5zbWl0X0RNQSgpCisgICAgICAoKyspIEhBTF9TQUlfUmVjZWl2ZV9ETUEoKQorCisgICAgKCspIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gbm9uIEJsb2NraW5nIG1vZGU6CisgICAgICAoKyspIEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCsrKSBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKykgSEFMX1NBSV9FcnJvckNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9UcmFuc21pdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzYWkpOworCisgICAgaHNhaS0+WGZlclNpemUgPSBTaXplOworICAgIGhzYWktPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNhaS0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9UWDsKKyAgICBoc2FpLT5FcnJvckNvZGUgPSBIQUxfU0FJX0VSUk9SX05PTkU7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgU0FJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICAgIGlmICgoaHNhaS0+SW5zdGFuY2UtPkNSMSAmIFNBSV94Q1IxX1NBSUVOKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBmaWxsIHRoZSBmaWZvIHdpdGggZGF0YSBiZWZvcmUgdG8gZW5hYmxlZCB0aGUgU0FJICovCisgICAgICBTQUlfRmlsbEZpZm8oaHNhaSk7CisgICAgICAvKiBFbmFibGUgU0FJIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NBSV9FTkFCTEUoaHNhaSk7CisgICAgfQorCisgICAgd2hpbGUgKGhzYWktPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGRhdGEgaWYgdGhlIEZJRk8gaXMgbm90IGZ1bGwgKi8KKyAgICAgIGlmICgoaHNhaS0+SW5zdGFuY2UtPlNSICYgU0FJX3hTUl9GTFZMKSAhPSBTQUlfRklGT1NUQVRVU19GVUxMKQorICAgICAgeworICAgICAgICBpZiAoKGhzYWktPkluaXQuRGF0YVNpemUgPT0gU0FJX0RBVEFTSVpFXzgpICYmIChoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlID09IFNBSV9OT0NPTVBBTkRJTkcpKQorICAgICAgICB7CisgICAgICAgICAgaHNhaS0+SW5zdGFuY2UtPkRSID0gKmhzYWktPnBCdWZmUHRyOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHNhaS0+SW5pdC5EYXRhU2l6ZSA8PSBTQUlfREFUQVNJWkVfMTYpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgdGVtcCB8PSAoKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpIDw8IDgpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgaHNhaS0+SW5zdGFuY2UtPkRSID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgdGVtcCB8PSAoKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpIDw8IDgpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgdGVtcCB8PSAoKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpIDw8IDE2KTsKKyAgICAgICAgICBoc2FpLT5wQnVmZlB0cisrOworICAgICAgICAgIHRlbXAgfD0gKCh1aW50MzJfdCkoKmhzYWktPnBCdWZmUHRyKSA8PCAyNCk7CisgICAgICAgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICAgICAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSB0ZW1wOworICAgICAgICB9CisgICAgICAgIGhzYWktPlhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovCisgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfVElNRU9VVDsKKworICAgICAgICAgIC8qIENsZWFyIGFsbCB0aGUgZmxhZ3MgKi8KKyAgICAgICAgICBoc2FpLT5JbnN0YW5jZS0+Q0xSRlIgPSAweEZGRkZGRkZGVTsKKworICAgICAgICAgIC8qIERpc2FibGUgU0FJIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIHJldHVybiB2YWx1ZSBiZWNhdXNlIHN0YXRlIHVwZGF0ZSwgdW5sb2NrIGFuZCBlcnJvciByZXR1cm4gd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIgKi8KKyAgICAgICAgICAodm9pZCkgU0FJX0Rpc2FibGUoaHNhaSk7CisKKyAgICAgICAgICAvKiBGbHVzaCB0aGUgZmlmbyAqLworICAgICAgICAgIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfRkZMVVNIKTsKKworICAgICAgICAgIC8qIENoYW5nZSB0aGUgU0FJIHN0YXRlICovCisgICAgICAgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9SZWNlaXZlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKyAgdWludDMyX3QgdGVtcDsKKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNhaSk7CisKKyAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9CVVNZX1JYOworICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfTk9ORTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBTQUkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgICAgaWYgKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pID09IDBVKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBTQUkgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsKKyAgICB9CisKKyAgICAvKiBSZWNlaXZlIGRhdGEgKi8KKyAgICB3aGlsZSAoaHNhaS0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaWYgKChoc2FpLT5JbnN0YW5jZS0+U1IgJiBTQUlfeFNSX0ZMVkwpICE9IFNBSV9GSUZPU1RBVFVTX0VNUFRZKQorICAgICAgeworICAgICAgICBpZiAoKGhzYWktPkluaXQuRGF0YVNpemUgPT0gU0FJX0RBVEFTSVpFXzgpICYmIChoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlID09IFNBSV9OT0NPTVBBTkRJTkcpKQorICAgICAgICB7CisgICAgICAgICAgKmhzYWktPnBCdWZmUHRyID0gKHVpbnQ4X3QpaHNhaS0+SW5zdGFuY2UtPkRSOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHNhaS0+SW5pdC5EYXRhU2l6ZSA8PSBTQUlfREFUQVNJWkVfMTYpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wID0gaHNhaS0+SW5zdGFuY2UtPkRSOworICAgICAgICAgICpoc2FpLT5wQnVmZlB0ciA9ICh1aW50OF90KXRlbXA7CisgICAgICAgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICAgICAgICAqaHNhaS0+cEJ1ZmZQdHIgPSAodWludDhfdCkodGVtcCA+PiA4KTsKKyAgICAgICAgICBoc2FpLT5wQnVmZlB0cisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRlbXAgPSBoc2FpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgICAgKmhzYWktPnBCdWZmUHRyID0gKHVpbnQ4X3QpdGVtcDsKKyAgICAgICAgICBoc2FpLT5wQnVmZlB0cisrOworICAgICAgICAgICpoc2FpLT5wQnVmZlB0ciA9ICh1aW50OF90KSh0ZW1wID4+IDgpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgKmhzYWktPnBCdWZmUHRyID0gKHVpbnQ4X3QpKHRlbXAgPj4gMTYpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgICAgKmhzYWktPnBCdWZmUHRyID0gKHVpbnQ4X3QpKHRlbXAgPj4gMjQpOworICAgICAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICAgIH0KKyAgICAgICAgaHNhaS0+WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpICYmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKQorICAgICAgICB7CisgICAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9USU1FT1VUOworCisgICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBmbGFncyAqLworICAgICAgICAgIGhzYWktPkluc3RhbmNlLT5DTFJGUiA9IDB4RkZGRkZGRkZVOworCisgICAgICAgICAgLyogRGlzYWJsZSBTQUkgcGVyaXBoZXJhbCAqLworICAgICAgICAgIC8qIE5vIG5lZWQgdG8gY2hlY2sgcmV0dXJuIHZhbHVlIGJlY2F1c2Ugc3RhdGUgdXBkYXRlLCB1bmxvY2sgYW5kIGVycm9yIHJldHVybiB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlciAqLworICAgICAgICAgICh2b2lkKSBTQUlfRGlzYWJsZShoc2FpKTsKKworICAgICAgICAgIC8qIEZsdXNoIHRoZSBmaWZvICovCisgICAgICAgICAgU0VUX0JJVChoc2FpLT5JbnN0YW5jZS0+Q1IyLCBTQUlfeENSMl9GRkxVU0gpOworCisgICAgICAgICAgLyogQ2hhbmdlIHRoZSBTQUkgc3RhdGUgKi8KKyAgICAgICAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNhaSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfVHJhbnNtaXRfSVQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNhaSk7CisKKyAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfTk9ORTsKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9UWDsKKworICAgIGlmICgoaHNhaS0+SW5pdC5EYXRhU2l6ZSA9PSBTQUlfREFUQVNJWkVfOCkgJiYgKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUgPT0gU0FJX05PQ09NUEFORElORykpCisgICAgeworICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfVHJhbnNtaXRfSVQ4Qml0OworICAgIH0KKyAgICBlbHNlIGlmIChoc2FpLT5Jbml0LkRhdGFTaXplIDw9IFNBSV9EQVRBU0laRV8xNikKKyAgICB7CisgICAgICBoc2FpLT5JbnRlcnJ1cHRTZXJ2aWNlUm91dGluZSA9IFNBSV9UcmFuc21pdF9JVDE2Qml0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfVHJhbnNtaXRfSVQzMkJpdDsKKyAgICB9CisKKyAgICAvKiBGaWxsIHRoZSBmaWZvIGJlZm9yZSBzdGFydGluZyB0aGUgY29tbXVuaWNhdGlvbiAqLworICAgIFNBSV9GaWxsRmlmbyhoc2FpKTsKKworICAgIC8qIEVuYWJsZSBGUlEgYW5kIE9WUlVEUiBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfU0FJX0VOQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOworCisgICAgLyogQ2hlY2sgaWYgdGhlIFNBSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgICBpZiAoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgPT0gMFUpCisgICAgeworICAgICAgLyogRW5hYmxlIFNBSSBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TQUlfRU5BQkxFKGhzYWkpOworICAgIH0KKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX1JlY2VpdmVfSVQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNhaSk7CisKKyAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfTk9ORTsKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9SWDsKKworICAgIGlmICgoaHNhaS0+SW5pdC5EYXRhU2l6ZSA9PSBTQUlfREFUQVNJWkVfOCkgJiYgKGhzYWktPkluaXQuQ29tcGFuZGluZ01vZGUgPT0gU0FJX05PQ09NUEFORElORykpCisgICAgeworICAgICAgaHNhaS0+SW50ZXJydXB0U2VydmljZVJvdXRpbmUgPSBTQUlfUmVjZWl2ZV9JVDhCaXQ7CisgICAgfQorICAgIGVsc2UgaWYgKGhzYWktPkluaXQuRGF0YVNpemUgPD0gU0FJX0RBVEFTSVpFXzE2KQorICAgIHsKKyAgICAgIGhzYWktPkludGVycnVwdFNlcnZpY2VSb3V0aW5lID0gU0FJX1JlY2VpdmVfSVQxNkJpdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzYWktPkludGVycnVwdFNlcnZpY2VSb3V0aW5lID0gU0FJX1JlY2VpdmVfSVQzMkJpdDsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgVFhFIGFuZCBPVlJVRFIgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX1NBSV9FTkFCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfSVQpKTsKKworICAgIC8qIENoZWNrIGlmIHRoZSBTQUkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgICAgaWYgKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pID09IDBVKQorICAgIHsKKyAgICAgIC8qIEVuYWJsZSBTQUkgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFBhdXNlIHRoZSBhdWRpbyBzdHJlYW0gcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9ETUFQYXVzZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc2FpKTsKKworICAvKiBQYXVzZSB0aGUgYXVkaW8gZmlsZSBwbGF5aW5nIGJ5IGRpc2FibGluZyB0aGUgU0FJIERNQSByZXF1ZXN0cyAqLworICBoc2FpLT5JbnN0YW5jZS0+Q1IxICY9IH5TQUlfeENSMV9ETUFFTjsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIHRoZSBhdWRpbyBzdHJlYW0gcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9ETUFSZXN1bWUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNhaSk7CisKKyAgLyogRW5hYmxlIHRoZSBTQUkgRE1BIHJlcXVlc3RzICovCisgIGhzYWktPkluc3RhbmNlLT5DUjEgfD0gU0FJX3hDUjFfRE1BRU47CisKKyAgLyogSWYgdGhlIFNBSSBwZXJpcGhlcmFsIGlzIHN0aWxsIG5vdCBlbmFibGVkLCBlbmFibGUgaXQgKi8KKyAgaWYgKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfU0FJRU4pID09IDBVKQorICB7CisgICAgLyogRW5hYmxlIFNBSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU0FJX0VOQUJMRShoc2FpKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzYWkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBTdG9wIHRoZSBhdWRpbyBzdHJlYW0gcGxheWluZyBmcm9tIHRoZSBNZWRpYS4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSV9ETUFTdG9wKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc2FpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTQUkgRE1BIHJlcXVlc3QgKi8KKyAgaHNhaS0+SW5zdGFuY2UtPkNSMSAmPSB+U0FJX3hDUjFfRE1BRU47CisKKyAgLyogQWJvcnQgdGhlIFNBSSBUeCBETUEgU3RyZWFtICovCisgIGlmICgoaHNhaS0+U3RhdGUgPT0gSEFMX1NBSV9TVEFURV9CVVNZX1RYKSAmJiAoaHNhaS0+aGRtYXR4ICE9IE5VTEwpKQorICB7CisgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNhaS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogSWYgdGhlIERNQSBUeCBlcnJvckNvZGUgaXMgZGlmZmVyZW50IGZyb20gRE1BIE5vIFRyYW5zZmVyIHRoZW4gcmV0dXJuIEVycm9yICovCisgICAgICBpZiAoaHNhaS0+aGRtYXR4LT5FcnJvckNvZGUgIT0gSEFMX0RNQV9FUlJPUl9OT19YRkVSKQorICAgICAgeworICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0RNQTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBBYm9ydCB0aGUgU0FJIFJ4IERNQSBTdHJlYW0gKi8KKyAgaWYgKChoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX0JVU1lfUlgpICYmIChoc2FpLT5oZG1hcnggIT0gTlVMTCkpCisgIHsKKyAgICBpZiAoSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBJZiB0aGUgRE1BIFJ4IGVycm9yQ29kZSBpcyBkaWZmZXJlbnQgZnJvbSBETUEgTm8gVHJhbnNmZXIgdGhlbiByZXR1cm4gRXJyb3IgKi8KKyAgICAgIGlmIChoc2FpLT5oZG1hcngtPkVycm9yQ29kZSAhPSBIQUxfRE1BX0VSUk9SX05PX1hGRVIpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfRE1BOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgU0FJIHBlcmlwaGVyYWwgKi8KKyAgaWYgKFNBSV9EaXNhYmxlKGhzYWkpICE9IEhBTF9PSykKKyAgeworICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEZsdXNoIHRoZSBmaWZvICovCisgIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfRkZMVVNIKTsKKworICAvKiBTZXQgaHNhaSBzdGF0ZSB0byByZWFkeSAqLworICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNhaSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyIGFuZCBkaXNhYmxlIHRoZSBTQUkuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfQWJvcnQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzYWkpOworCisgIC8qIENoZWNrIFNBSSBETUEgaXMgZW5hYmxlZCBvciBub3QgKi8KKyAgaWYgKChoc2FpLT5JbnN0YW5jZS0+Q1IxICYgU0FJX3hDUjFfRE1BRU4pID09IFNBSV94Q1IxX0RNQUVOKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU0FJIERNQSByZXF1ZXN0ICovCisgICAgaHNhaS0+SW5zdGFuY2UtPkNSMSAmPSB+U0FJX3hDUjFfRE1BRU47CisKKyAgICAvKiBBYm9ydCB0aGUgU0FJIFR4IERNQSBTdHJlYW0gKi8KKyAgICBpZiAoKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfQlVTWV9UWCkgJiYgKGhzYWktPmhkbWF0eCAhPSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc2FpLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogSWYgdGhlIERNQSBUeCBlcnJvckNvZGUgaXMgZGlmZmVyZW50IGZyb20gRE1BIE5vIFRyYW5zZmVyIHRoZW4gcmV0dXJuIEVycm9yICovCisgICAgICAgIGlmIChoc2FpLT5oZG1hdHgtPkVycm9yQ29kZSAhPSBIQUxfRE1BX0VSUk9SX05PX1hGRVIpCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfRE1BOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogQWJvcnQgdGhlIFNBSSBSeCBETUEgU3RyZWFtICovCisgICAgaWYgKChoc2FpLT5TdGF0ZSA9PSBIQUxfU0FJX1NUQVRFX0JVU1lfUlgpICYmIChoc2FpLT5oZG1hcnggIT0gTlVMTCkpCisgICAgeworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNhaS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIElmIHRoZSBETUEgUnggZXJyb3JDb2RlIGlzIGRpZmZlcmVudCBmcm9tIERNQSBObyBUcmFuc2ZlciB0aGVuIHJldHVybiBFcnJvciAqLworICAgICAgICBpZiAoaHNhaS0+aGRtYXJ4LT5FcnJvckNvZGUgIT0gSEFMX0RNQV9FUlJPUl9OT19YRkVSKQorICAgICAgICB7CisgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0RNQTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGVkIEFsbCBpbnRlcnJ1cHQgYW5kIGNsZWFyIGFsbCB0aGUgZmxhZyAqLworICBoc2FpLT5JbnN0YW5jZS0+SU1SID0gMDsKKyAgaHNhaS0+SW5zdGFuY2UtPkNMUkZSID0gMHhGRkZGRkZGRlU7CisKKyAgLyogRGlzYWJsZSBTQUkgcGVyaXBoZXJhbCAqLworICBpZiAoU0FJX0Rpc2FibGUoaHNhaSkgIT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICB9CisKKyAgLyogRmx1c2ggdGhlIGZpZm8gKi8KKyAgU0VUX0JJVChoc2FpLT5JbnN0YW5jZS0+Q1IyLCBTQUlfeENSMl9GRkxVU0gpOworCisgIC8qIFNldCBoc2FpIHN0YXRlIHRvIHJlYWR5ICovCisgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfVHJhbnNtaXRfRE1BKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNhaSk7CisKKyAgICBoc2FpLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzYWktPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoc2FpLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzYWktPkVycm9yQ29kZSA9IEhBTF9TQUlfRVJST1JfTk9ORTsKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIFNldCB0aGUgU0FJIFR4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNhaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNBSV9ETUFUeEhhbGZDcGx0OworCisgICAgLyogU2V0IHRoZSBTQUkgVHhETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTQUlfRE1BVHhDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gU0FJX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgVHggYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbSAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhzYWktPmhkbWF0eCwgKHVpbnQzMl90KWhzYWktPnBCdWZmUHRyLCAodWludDMyX3QpJmhzYWktPkluc3RhbmNlLT5EUiwgaHNhaS0+WGZlclNpemUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBfX0hBTF9VTkxPQ0soaHNhaSk7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgdGhlIGludGVycnVwdHMgZm9yIGVycm9yIGhhbmRsaW5nICovCisgICAgX19IQUxfU0FJX0VOQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9ETUEpKTsKKworICAgIC8qIEVuYWJsZSBTQUkgVHggRE1BIFJlcXVlc3QgKi8KKyAgICBoc2FpLT5JbnN0YW5jZS0+Q1IxIHw9IFNBSV94Q1IxX0RNQUVOOworCisgICAgLyogV2FpdCB1bnRpbGwgRklGTyBpcyBub3QgZW1wdHkgKi8KKyAgICB3aGlsZSAoKGhzYWktPkluc3RhbmNlLT5TUiAmIFNBSV94U1JfRkxWTCkgPT0gU0FJX0ZJRk9TVEFUVVNfRU1QVFkpCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gU0FJX0xPTkdfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc2FpKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIFNBSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgICBpZiAoKGhzYWktPkluc3RhbmNlLT5DUjEgJiBTQUlfeENSMV9TQUlFTikgPT0gMFUpCisgICAgeworICAgICAgLyogRW5hYmxlIFNBSSBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TQUlfRU5BQkxFKGhzYWkpOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNhaSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfUmVjZWl2ZV9ETUEoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworCisgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgcmV0dXJuICBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHNhaS0+U3RhdGUgPT0gSEFMX1NBSV9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc2FpKTsKKworICAgIGhzYWktPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNhaS0+WGZlclNpemUgPSBTaXplOworICAgIGhzYWktPlhmZXJDb3VudCA9IFNpemU7CisgICAgaHNhaS0+RXJyb3JDb2RlID0gSEFMX1NBSV9FUlJPUl9OT05FOworICAgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9CVVNZX1JYOworCisgICAgLyogU2V0IHRoZSBTQUkgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU0FJX0RNQVJ4SGFsZkNwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFNBSSBSeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTQUlfRE1BUnhDcGx0OworCisgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU0FJX0RNQUVycm9yOworCisgICAgLyogU2V0IHRoZSBETUEgUnggYWJvcnQgY2FsbGJhY2sgKi8KKyAgICBoc2FpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgIC8qIEVuYWJsZSB0aGUgUnggRE1BIFN0cmVhbSAqLworICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhzYWktPmhkbWFyeCwgKHVpbnQzMl90KSZoc2FpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdCloc2FpLT5wQnVmZlB0ciwgaHNhaS0+WGZlclNpemUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBfX0hBTF9VTkxPQ0soaHNhaSk7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgU0FJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICAgIGlmICgoaHNhaS0+SW5zdGFuY2UtPkNSMSAmIFNBSV94Q1IxX1NBSUVOKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgU0FJIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NBSV9FTkFCTEUoaHNhaSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGZvciBlcnJvciBoYW5kbGluZyAqLworICAgIF9fSEFMX1NBSV9FTkFCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7CisKKyAgICAvKiBFbmFibGUgU0FJIFJ4IERNQSBSZXF1ZXN0ICovCisgICAgaHNhaS0+SW5zdGFuY2UtPkNSMSB8PSBTQUlfeENSMV9ETUFFTjsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNhaSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVHggbXV0ZSBtb2RlLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICB2YWwgIHZhbHVlIHNlbnQgZHVyaW5nIHRoZSBtdXRlIEByZWYgU0FJX0Jsb2NrX011dGVfVmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRW5hYmxlVHhNdXRlTW9kZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDE2X3QgdmFsKQoreworICBhc3NlcnRfcGFyYW0oSVNfU0FJX0JMT0NLX01VVEVfVkFMVUUodmFsKSk7CisKKyAgaWYgKGhzYWktPlN0YXRlICE9IEhBTF9TQUlfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfTVVURVZBTCB8IFNBSV94Q1IyX01VVEUpOworICAgIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfTVVURSB8ICh1aW50MzJfdCl2YWwpOworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUeCBtdXRlIG1vZGUuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRGlzYWJsZVR4TXV0ZU1vZGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIGlmIChoc2FpLT5TdGF0ZSAhPSBIQUxfU0FJX1NUQVRFX1JFU0VUKQorICB7CisgICAgQ0xFQVJfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX01VVEVWQUwgfCBTQUlfeENSMl9NVVRFKTsKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBSeCBtdXRlIGRldGVjdGlvbi4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEBwYXJhbSAgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIG11dGUgaXMgZGV0ZWN0ZWQuCisgICogQHBhcmFtICBjb3VudGVyIG51bWJlciBhIGRhdGEgYmVmb3JlIG11dGUgZGV0ZWN0aW9uIG1heCA2My4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TQUlfRW5hYmxlUnhNdXRlTW9kZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgU0FJY2FsbGJhY2sgY2FsbGJhY2ssIHVpbnQxNl90IGNvdW50ZXIpCit7CisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfTVVURV9DT1VOVEVSKGNvdW50ZXIpKTsKKworICBpZiAoaHNhaS0+U3RhdGUgIT0gSEFMX1NBSV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIHNldCB0aGUgbXV0ZSBjb3VudGVyICovCisgICAgQ0xFQVJfQklUKGhzYWktPkluc3RhbmNlLT5DUjIsIFNBSV94Q1IyX01VVEVDTlQpOworICAgIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgKHVpbnQzMl90KSgodWludDMyX3QpY291bnRlciA8PCBTQUlfeENSMl9NVVRFQ05UX1BvcykpOworICAgIGhzYWktPm11dGVjYWxsYmFjayA9IGNhbGxiYWNrOworICAgIC8qIGVuYWJsZSB0aGUgSVQgaW50ZXJydXB0ICovCisgICAgX19IQUxfU0FJX0VOQUJMRV9JVChoc2FpLCBTQUlfSVRfTVVURURFVCk7CisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICByZXR1cm4gSEFMX0VSUk9SOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFJ4IG11dGUgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0FJX0Rpc2FibGVSeE11dGVNb2RlKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICBpZiAoaHNhaS0+U3RhdGUgIT0gSEFMX1NBSV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIHNldCB0aGUgbXV0ZWNhbGxiYWNrIHRvIE5VTEwgKi8KKyAgICBoc2FpLT5tdXRlY2FsbGJhY2sgPSBOVUxMOworICAgIC8qIGVuYWJsZSB0aGUgSVQgaW50ZXJydXB0ICovCisgICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0lUX01VVEVERVQpOworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgcmV0dXJuIEhBTF9FUlJPUjsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU0FJIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TQUlfSVJRSGFuZGxlcihTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkKK3sKKyAgaWYgKGhzYWktPlN0YXRlICE9IEhBTF9TQUlfU1RBVEVfUkVTRVQpCisgIHsKKyAgICB1aW50MzJfdCBpdGZsYWdzID0gaHNhaS0+SW5zdGFuY2UtPlNSOworICAgIHVpbnQzMl90IGl0c291cmNlcyA9IGhzYWktPkluc3RhbmNlLT5JTVI7CisgICAgdWludDMyX3QgY3IxY29uZmlnID0gaHNhaS0+SW5zdGFuY2UtPkNSMTsKKyAgICB1aW50MzJfdCB0bXBlcnJvcjsKKworICAgIC8qIFNBSSBGaWZvIHJlcXVlc3QgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpdGZsYWdzICYgU0FJX3hTUl9GUkVRKSA9PSBTQUlfeFNSX0ZSRVEpICYmICgoaXRzb3VyY2VzICYgU0FJX0lUX0ZSRVEpID09IFNBSV9JVF9GUkVRKSkKKyAgICB7CisgICAgICBoc2FpLT5JbnRlcnJ1cHRTZXJ2aWNlUm91dGluZShoc2FpKTsKKyAgICB9CisgICAgLyogU0FJIE92ZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGVsc2UgaWYgKCgoaXRmbGFncyAmIFNBSV9GTEFHX09WUlVEUikgPT0gU0FJX0ZMQUdfT1ZSVURSKSAmJiAoKGl0c291cmNlcyAmIFNBSV9JVF9PVlJVRFIpID09IFNBSV9JVF9PVlJVRFIpKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBTQUkgT3ZlcnJ1biBmbGFnICovCisgICAgICBfX0hBTF9TQUlfQ0xFQVJfRkxBRyhoc2FpLCBTQUlfRkxBR19PVlJVRFIpOworICAgICAgLyogR2V0IHRoZSBTQUkgZXJyb3IgY29kZSAqLworICAgICAgdG1wZXJyb3IgPSAoKGhzYWktPlN0YXRlID09IEhBTF9TQUlfU1RBVEVfQlVTWV9SWCkgPyBIQUxfU0FJX0VSUk9SX09WUiA6IEhBTF9TQUlfRVJST1JfVURSKTsKKyAgICAgIC8qIENoYW5nZSB0aGUgU0FJIGVycm9yIGNvZGUgKi8KKyAgICAgIGhzYWktPkVycm9yQ29kZSB8PSB0bXBlcnJvcjsKKyAgICAgIC8qIHRoZSB0cmFuc2ZlciBpcyBub3Qgc3RvcHBlZCwgd2Ugd2lsbCBmb3J3YXJkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciBhbmQgd2UgbGV0IHRoZSB1c2VyIGRlY2lkZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc2FpLT5FcnJvckNhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICAgIEhBTF9TQUlfRXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBTQUkgbXV0ZWRldCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgZWxzZSBpZiAoKChpdGZsYWdzICYgU0FJX0ZMQUdfTVVURURFVCkgPT0gU0FJX0ZMQUdfTVVURURFVCkgJiYgKChpdHNvdXJjZXMgJiBTQUlfSVRfTVVURURFVCkgPT0gU0FJX0lUX01VVEVERVQpKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBTQUkgbXV0ZWRldCBmbGFnICovCisgICAgICBfX0hBTF9TQUlfQ0xFQVJfRkxBRyhoc2FpLCBTQUlfRkxBR19NVVRFREVUKTsKKyAgICAgIC8qIGNhbGwgdGhlIGNhbGwgYmFjayBmdW5jdGlvbiAqLworICAgICAgaWYgKGhzYWktPm11dGVjYWxsYmFjayAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBpbmZvcm0gdGhlIHVzZXIgdGhhdCBhbiBSWCBtdXRlIGV2ZW50IGhhcyBiZWVuIGRldGVjdGVkICovCisgICAgICAgIGhzYWktPm11dGVjYWxsYmFjaygpOworICAgICAgfQorICAgIH0KKyAgICAvKiBTQUkgQUZTREVUIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBlbHNlIGlmICgoKGl0ZmxhZ3MgJiBTQUlfRkxBR19BRlNERVQpID09IFNBSV9GTEFHX0FGU0RFVCkgJiYgKChpdHNvdXJjZXMgJiBTQUlfSVRfQUZTREVUKSA9PSBTQUlfSVRfQUZTREVUKSkKKyAgICB7CisgICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBlcnJvciBjb2RlICovCisgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9BRlNERVQ7CisKKyAgICAgIC8qIENoZWNrIFNBSSBETUEgaXMgZW5hYmxlZCBvciBub3QgKi8KKyAgICAgIGlmICgoY3IxY29uZmlnICYgU0FJX3hDUjFfRE1BRU4pID09IFNBSV94Q1IxX0RNQUVOKQorICAgICAgeworICAgICAgICAvKiBBYm9ydCB0aGUgU0FJIERNQSBTdHJlYW1zICovCisgICAgICAgIGlmIChoc2FpLT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgRE1BIFR4IGFib3J0IGNhbGxiYWNrICovCisgICAgICAgICAgaHNhaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNBSV9ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBpbiBJVCBtb2RlICovCisgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNhaS0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogVXBkYXRlIFNBSSBlcnJvciBjb2RlICovCisgICAgICAgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9ETUE7CisKKyAgICAgICAgICAgIC8qIENhbGwgU0FJIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgaHNhaS0+RXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgICAgICAgICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhzYWktPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBETUEgUnggYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgICAgICBoc2FpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU0FJX0RNQUFib3J0OworCisgICAgICAgICAgLyogQWJvcnQgRE1BIGluIElUIG1vZGUgKi8KKyAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc2FpLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBVcGRhdGUgU0FJIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0RNQTsKKworICAgICAgICAgICAgLyogQ2FsbCBTQUkgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICBoc2FpLT5FcnJvckNhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICAgICAgICAgIEhBTF9TQUlfRXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBBYm9ydCBTQUkgKi8KKyAgICAgICAgLyogTm8gbmVlZCB0byBjaGVjayByZXR1cm4gdmFsdWUgYmVjYXVzZSBIQUxfU0FJX0Vycm9yQ2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgKi8KKyAgICAgICAgKHZvaWQpIEhBTF9TQUlfQWJvcnQoaHNhaSk7CisKKyAgICAgICAgLyogU2V0IGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICBoc2FpLT5FcnJvckNhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgICAgICB9CisgICAgfQorICAgIC8qIFNBSSBMRlNERVQgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGVsc2UgaWYgKCgoaXRmbGFncyAmIFNBSV9GTEFHX0xGU0RFVCkgPT0gU0FJX0ZMQUdfTEZTREVUKSAmJiAoKGl0c291cmNlcyAmIFNBSV9JVF9MRlNERVQpID09IFNBSV9JVF9MRlNERVQpKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSB0aGUgU0FJIGVycm9yIGNvZGUgKi8KKyAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0xGU0RFVDsKKworICAgICAgLyogQ2hlY2sgU0FJIERNQSBpcyBlbmFibGVkIG9yIG5vdCAqLworICAgICAgaWYgKChjcjFjb25maWcgJiBTQUlfeENSMV9ETUFFTikgPT0gU0FJX3hDUjFfRE1BRU4pCisgICAgICB7CisgICAgICAgIC8qIEFib3J0IHRoZSBTQUkgRE1BIFN0cmVhbXMgKi8KKyAgICAgICAgaWYgKGhzYWktPmhkbWF0eCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBETUEgVHggYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgICAgICBoc2FpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU0FJX0RNQUFib3J0OworCisgICAgICAgICAgLyogQWJvcnQgRE1BIGluIElUIG1vZGUgKi8KKyAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc2FpLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBVcGRhdGUgU0FJIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX0RNQTsKKworICAgICAgICAgICAgLyogQ2FsbCBTQUkgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICBoc2FpLT5FcnJvckNhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICAgICAgICAgIEhBTF9TQUlfRXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaHNhaS0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIERNQSBSeCBhYm9ydCBjYWxsYmFjayAqLworICAgICAgICAgIGhzYWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTQUlfRE1BQWJvcnQ7CisKKyAgICAgICAgICAvKiBBYm9ydCBETUEgaW4gSVQgbW9kZSAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzYWktPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBTQUkgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfRE1BOworCisgICAgICAgICAgICAvKiBDYWxsIFNBSSBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIGhzYWktPkVycm9yQ2FsbGJhY2soaHNhaSk7CisjZWxzZQorICAgICAgICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIEFib3J0IFNBSSAqLworICAgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIHJldHVybiB2YWx1ZSBiZWNhdXNlIEhBTF9TQUlfRXJyb3JDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBsYXRlciAqLworICAgICAgICAodm9pZCkgSEFMX1NBSV9BYm9ydChoc2FpKTsKKworICAgICAgICAvKiBTZXQgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhzYWktPkVycm9yQ2FsbGJhY2soaHNhaSk7CisjZWxzZQorICAgICAgICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisgICAgLyogU0FJIFdDS0NGRyBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgZWxzZSBpZiAoKChpdGZsYWdzICYgU0FJX0ZMQUdfV0NLQ0ZHKSA9PSBTQUlfRkxBR19XQ0tDRkcpICYmICgoaXRzb3VyY2VzICYgU0FJX0lUX1dDS0NGRykgPT0gU0FJX0lUX1dDS0NGRykpCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBTQUkgZXJyb3IgY29kZSAqLworICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfV0NLQ0ZHOworCisgICAgICAvKiBDaGVjayBTQUkgRE1BIGlzIGVuYWJsZWQgb3Igbm90ICovCisgICAgICBpZiAoKGNyMWNvbmZpZyAmIFNBSV94Q1IxX0RNQUVOKSA9PSBTQUlfeENSMV9ETUFFTikKKyAgICAgIHsKKyAgICAgICAgLyogQWJvcnQgdGhlIFNBSSBETUEgU3RyZWFtcyAqLworICAgICAgICBpZiAoaHNhaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIERNQSBUeCBhYm9ydCBjYWxsYmFjayAqLworICAgICAgICAgIGhzYWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTQUlfRE1BQWJvcnQ7CisKKyAgICAgICAgICAvKiBBYm9ydCBETUEgaW4gSVQgbW9kZSAqLworICAgICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhzYWktPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBTQUkgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgaHNhaS0+RXJyb3JDb2RlIHw9IEhBTF9TQUlfRVJST1JfRE1BOworCisgICAgICAgICAgICAvKiBDYWxsIFNBSSBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIGhzYWktPkVycm9yQ2FsbGJhY2soaHNhaSk7CisjZWxzZQorICAgICAgICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoc2FpLT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgRE1BIFJ4IGFib3J0IGNhbGxiYWNrICovCisgICAgICAgICAgaHNhaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNBSV9ETUFBYm9ydDsKKworICAgICAgICAgIC8qIEFib3J0IERNQSBpbiBJVCBtb2RlICovCisgICAgICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNhaS0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogVXBkYXRlIFNBSSBlcnJvciBjb2RlICovCisgICAgICAgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9ETUE7CisKKyAgICAgICAgICAgIC8qIENhbGwgU0FJIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgaHNhaS0+RXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgICAgICAgICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogSWYgV0NLQ0ZHIG9jY3VycywgU0FJIGF1ZGlvIGJsb2NrIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgKi8KKyAgICAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgY2xlYXIgYWxsIGZsYWdzICovCisgICAgICAgIGhzYWktPkluc3RhbmNlLT5JTVIgPSAwVTsKKyAgICAgICAgaHNhaS0+SW5zdGFuY2UtPkNMUkZSID0gMHhGRkZGRkZGRlU7CisgICAgICAgIC8qIFNldCB0aGUgU0FJIHN0YXRlIHRvIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIEluaXRpYWxpemUgWGZlckNvdW50ICovCisgICAgICAgIGhzYWktPlhmZXJDb3VudCA9IDBVOworCisgICAgICAgIC8qIFNBSSBlcnJvciBDYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHNhaS0+RXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgICAgIEhBTF9TQUlfRXJyb3JDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICAgICAgfQorICAgIH0KKyAgICAvKiBTQUkgQ05SRFkgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGVsc2UgaWYgKCgoaXRmbGFncyAmIFNBSV9GTEFHX0NOUkRZKSA9PSBTQUlfRkxBR19DTlJEWSkgJiYgKChpdHNvdXJjZXMgJiBTQUlfSVRfQ05SRFkpID09IFNBSV9JVF9DTlJEWSkpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFNBSSBDTlJEWSBmbGFnICovCisgICAgICBfX0hBTF9TQUlfQ0xFQVJfRkxBRyhoc2FpLCBTQUlfRkxBR19DTlJEWSk7CisgICAgICAvKiBDaGFuZ2UgdGhlIFNBSSBlcnJvciBjb2RlICovCisgICAgICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9DTlJFQURZOworICAgICAgLyogdGhlIHRyYW5zZmVyIGlzIG5vdCBzdG9wcGVkLCB3ZSB3aWxsIGZvcndhcmQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIGFuZCB3ZSBsZXQgdGhlIHVzZXIgZGVjaWRlIHdoYXQgbmVlZHMgdG8gYmUgZG9uZSAqLworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzYWktPkVycm9yQ2FsbGJhY2soaHNhaSk7CisjZWxzZQorICAgICAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzYWkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBIYWxmIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2soU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzYWkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU0FJX1R4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc2FpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NBSV9SeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgUnggVHJhbnNmZXIgaGFsZiBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TQUlfUnhIYWxmQ3BsdENhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc2FpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NBSV9SeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFNBSSBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NBSV9FcnJvckNhbGxiYWNrKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc2FpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NBSV9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTQUkgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9TQUlfU3RhdGVUeXBlRGVmIEhBTF9TQUlfR2V0U3RhdGUoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIHJldHVybiBoc2FpLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNBSSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU0FJIEJsb2NrLgorICAqIEByZXR2YWwgU0FJIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9TQUlfR2V0RXJyb3IoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIHJldHVybiBoc2FpLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTQUlfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgICBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU0FJIEkyUyBwcm90b2NvbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgU0FJX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHBhcmFtICBwcm90b2NvbCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbC4KKyAgKiBAcGFyYW0gIGRhdGFzaXplIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGFzaXplIEByZWYgU0FJX1Byb3RvY29sX0RhdGFTaXplLgorICAqIEBwYXJhbSAgbmJzbG90IG51bWJlciBvZiBzbG90IG1pbmltdW0gdmFsdWUgaXMgMiBhbmQgbWF4IGlzIDE2LgorICAqICAgICAgICAgdGhlIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNBSV9Jbml0STJTKFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCB1aW50MzJfdCBwcm90b2NvbCwgdWludDMyX3QgZGF0YXNpemUsIHVpbnQzMl90IG5ic2xvdCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGhzYWktPkluaXQuUHJvdG9jb2wgICAgICAgICAgICA9IFNBSV9GUkVFX1BST1RPQ09MOworICBoc2FpLT5Jbml0LkZpcnN0Qml0ICAgICAgICAgICAgPSBTQUlfRklSU1RCSVRfTVNCOworICAvKiBDb21wdXRlIENsb2NrU3Ryb2JpbmcgYWNjb3JkaW5nIEF1ZGlvTW9kZSAqLworICBpZiAoKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFTUFTVEVSX1RYKSB8fCAoaHNhaS0+SW5pdC5BdWRpb01vZGUgPT0gU0FJX01PREVTTEFWRV9UWCkpCisgIHsKKyAgICAvKiBUcmFuc21pdCAqLworICAgIGhzYWktPkluaXQuQ2xvY2tTdHJvYmluZyAgICAgPSBTQUlfQ0xPQ0tTVFJPQklOR19GQUxMSU5HRURHRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWNlaXZlICovCisgICAgaHNhaS0+SW5pdC5DbG9ja1N0cm9iaW5nICAgICA9IFNBSV9DTE9DS1NUUk9CSU5HX1JJU0lOR0VER0U7CisgIH0KKyAgaHNhaS0+RnJhbWVJbml0LkZTRGVmaW5pdGlvbiAgID0gU0FJX0ZTX0NIQU5ORUxfSURFTlRJRklDQVRJT047CisgIGhzYWktPlNsb3RJbml0LlNsb3RBY3RpdmUgICAgICA9IFNBSV9TTE9UQUNUSVZFX0FMTDsKKyAgaHNhaS0+U2xvdEluaXQuRmlyc3RCaXRPZmZzZXQgID0gMDsKKyAgaHNhaS0+U2xvdEluaXQuU2xvdE51bWJlciAgICAgID0gbmJzbG90OworCisgIC8qIGluIElTMiB0aGUgbnVtYmVyIG9mIHNsb3QgbXVzdCBiZSBldmVuICovCisgIGlmICgobmJzbG90ICYgMHgxVSkgIT0gMFUpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgc3dpdGNoIChwcm90b2NvbCkKKyAgeworICAgIGNhc2UgU0FJX0kyU19TVEFOREFSRCA6CisgICAgICBoc2FpLT5GcmFtZUluaXQuRlNQb2xhcml0eSA9IFNBSV9GU19BQ1RJVkVfTE9XOworICAgICAgaHNhaS0+RnJhbWVJbml0LkZTT2Zmc2V0ICAgPSBTQUlfRlNfQkVGT1JFRklSU1RCSVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBSV9JMlNfTVNCSlVTVElGSUVEIDoKKyAgICBjYXNlIFNBSV9JMlNfTFNCSlVTVElGSUVEIDoKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5GU1BvbGFyaXR5ID0gU0FJX0ZTX0FDVElWRV9ISUdIOworICAgICAgaHNhaS0+RnJhbWVJbml0LkZTT2Zmc2V0ICAgPSBTQUlfRlNfRklSU1RCSVQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRnJhbWUgZGVmaW5pdGlvbiAqLworICBzd2l0Y2ggKGRhdGFzaXplKQorICB7CisgICAgY2FzZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVQ6CisgICAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzE2OworICAgICAgaHNhaS0+RnJhbWVJbml0LkZyYW1lTGVuZ3RoID0gMzJVICogKG5ic2xvdCAvIDJVKTsKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5BY3RpdmVGcmFtZUxlbmd0aCA9IDE2VSAqIChuYnNsb3QgLyAyVSk7CisgICAgICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSA9IFNBSV9TTE9UU0laRV8xNkI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBSV9QUk9UT0NPTF9EQVRBU0laRV8xNkJJVEVYVEVOREVEIDoKKyAgICAgIGhzYWktPkluaXQuRGF0YVNpemUgPSBTQUlfREFUQVNJWkVfMTY7CisgICAgICBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggPSA2NFUgKiAobmJzbG90IC8gMlUpOworICAgICAgaHNhaS0+RnJhbWVJbml0LkFjdGl2ZUZyYW1lTGVuZ3RoID0gMzJVICogKG5ic2xvdCAvIDJVKTsKKyAgICAgIGhzYWktPlNsb3RJbml0LlNsb3RTaXplID0gU0FJX1NMT1RTSVpFXzMyQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzI0QklUOgorICAgICAgaHNhaS0+SW5pdC5EYXRhU2l6ZSA9IFNBSV9EQVRBU0laRV8yNDsKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCA9IDY0VSAqIChuYnNsb3QgLyAyVSk7CisgICAgICBoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGggPSAzMlUgKiAobmJzbG90IC8gMlUpOworICAgICAgaHNhaS0+U2xvdEluaXQuU2xvdFNpemUgPSBTQUlfU0xPVFNJWkVfMzJCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMzJCSVQ6CisgICAgICBoc2FpLT5Jbml0LkRhdGFTaXplID0gU0FJX0RBVEFTSVpFXzMyOworICAgICAgaHNhaS0+RnJhbWVJbml0LkZyYW1lTGVuZ3RoID0gNjRVICogKG5ic2xvdCAvIDJVKTsKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5BY3RpdmVGcmFtZUxlbmd0aCA9IDMyVSAqIChuYnNsb3QgLyAyVSk7CisgICAgICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSA9IFNBSV9TTE9UU0laRV8zMkI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChwcm90b2NvbCA9PSBTQUlfSTJTX0xTQkpVU1RJRklFRCkKKyAgeworICAgIGlmIChkYXRhc2l6ZSA9PSBTQUlfUFJPVE9DT0xfREFUQVNJWkVfMTZCSVRFWFRFTkRFRCkKKyAgICB7CisgICAgICBoc2FpLT5TbG90SW5pdC5GaXJzdEJpdE9mZnNldCA9IDE2OworICAgIH0KKyAgICBpZiAoZGF0YXNpemUgPT0gU0FJX1BST1RPQ09MX0RBVEFTSVpFXzI0QklUKQorICAgIHsKKyAgICAgIGhzYWktPlNsb3RJbml0LkZpcnN0Qml0T2Zmc2V0ID0gODsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTQUkgUENNIHByb3RvY29sIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBTQUlfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHByb3RvY29sIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHByb3RvY29sCisgICogQHBhcmFtICBkYXRhc2l6ZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhc2l6ZSBAcmVmIFNBSV9Qcm90b2NvbF9EYXRhU2l6ZQorICAqIEBwYXJhbSAgbmJzbG90IG51bWJlciBvZiBzbG90IG1pbmltdW0gdmFsdWUgaXMgMSBhbmQgdGhlIG1heCBpcyAxNi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTQUlfSW5pdFBDTShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSwgdWludDMyX3QgcHJvdG9jb2wsIHVpbnQzMl90IGRhdGFzaXplLCB1aW50MzJfdCBuYnNsb3QpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBoc2FpLT5Jbml0LlByb3RvY29sICAgICAgICAgICAgPSBTQUlfRlJFRV9QUk9UT0NPTDsKKyAgaHNhaS0+SW5pdC5GaXJzdEJpdCAgICAgICAgICAgID0gU0FJX0ZJUlNUQklUX01TQjsKKyAgLyogQ29tcHV0ZSBDbG9ja1N0cm9iaW5nIGFjY29yZGluZyBBdWRpb01vZGUgKi8KKyAgaWYgKChoc2FpLT5Jbml0LkF1ZGlvTW9kZSA9PSBTQUlfTU9ERU1BU1RFUl9UWCkgfHwgKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFU0xBVkVfVFgpKQorICB7CisgICAgLyogVHJhbnNtaXQgKi8KKyAgICBoc2FpLT5Jbml0LkNsb2NrU3Ryb2JpbmcgICAgID0gU0FJX0NMT0NLU1RST0JJTkdfUklTSU5HRURHRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZWNlaXZlICovCisgICAgaHNhaS0+SW5pdC5DbG9ja1N0cm9iaW5nICAgICA9IFNBSV9DTE9DS1NUUk9CSU5HX0ZBTExJTkdFREdFOworICB9CisgIGhzYWktPkZyYW1lSW5pdC5GU0RlZmluaXRpb24gICA9IFNBSV9GU19TVEFSVEZSQU1FOworICBoc2FpLT5GcmFtZUluaXQuRlNQb2xhcml0eSAgICAgPSBTQUlfRlNfQUNUSVZFX0hJR0g7CisgIGhzYWktPkZyYW1lSW5pdC5GU09mZnNldCAgICAgICA9IFNBSV9GU19CRUZPUkVGSVJTVEJJVDsKKyAgaHNhaS0+U2xvdEluaXQuRmlyc3RCaXRPZmZzZXQgID0gMDsKKyAgaHNhaS0+U2xvdEluaXQuU2xvdE51bWJlciAgICAgID0gbmJzbG90OworICBoc2FpLT5TbG90SW5pdC5TbG90QWN0aXZlICAgICAgPSBTQUlfU0xPVEFDVElWRV9BTEw7CisKKyAgc3dpdGNoIChwcm90b2NvbCkKKyAgeworICAgIGNhc2UgU0FJX1BDTV9TSE9SVCA6CisgICAgICBoc2FpLT5GcmFtZUluaXQuQWN0aXZlRnJhbWVMZW5ndGggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQUlfUENNX0xPTkcgOgorICAgICAgaHNhaS0+RnJhbWVJbml0LkFjdGl2ZUZyYW1lTGVuZ3RoID0gMTM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChkYXRhc2l6ZSkKKyAgeworICAgIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklUOgorICAgICAgaHNhaS0+SW5pdC5EYXRhU2l6ZSA9IFNBSV9EQVRBU0laRV8xNjsKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCA9IDE2VSAqIG5ic2xvdDsKKyAgICAgIGhzYWktPlNsb3RJbml0LlNsb3RTaXplID0gU0FJX1NMT1RTSVpFXzE2QjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzE2QklURVhURU5ERUQgOgorICAgICAgaHNhaS0+SW5pdC5EYXRhU2l6ZSA9IFNBSV9EQVRBU0laRV8xNjsKKyAgICAgIGhzYWktPkZyYW1lSW5pdC5GcmFtZUxlbmd0aCA9IDMyVSAqIG5ic2xvdDsKKyAgICAgIGhzYWktPlNsb3RJbml0LlNsb3RTaXplID0gU0FJX1NMT1RTSVpFXzMyQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0FJX1BST1RPQ09MX0RBVEFTSVpFXzI0QklUIDoKKyAgICAgIGhzYWktPkluaXQuRGF0YVNpemUgPSBTQUlfREFUQVNJWkVfMjQ7CisgICAgICBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggPSAzMlUgKiBuYnNsb3Q7CisgICAgICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSA9IFNBSV9TTE9UU0laRV8zMkI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNBSV9QUk9UT0NPTF9EQVRBU0laRV8zMkJJVDoKKyAgICAgIGhzYWktPkluaXQuRGF0YVNpemUgPSBTQUlfREFUQVNJWkVfMzI7CisgICAgICBoc2FpLT5GcmFtZUluaXQuRnJhbWVMZW5ndGggPSAzMlUgKiBuYnNsb3Q7CisgICAgICBoc2FpLT5TbG90SW5pdC5TbG90U2l6ZSA9IFNBSV9TTE9UU0laRV8zMkI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBGaWxsIHRoZSBmaWZvLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfRmlsbEZpZm8oU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgLyogZmlsbCB0aGUgZmlmbyB3aXRoIGRhdGEgYmVmb3JlIHRvIGVuYWJsZWQgdGhlIFNBSSAqLworICB3aGlsZSAoKChoc2FpLT5JbnN0YW5jZS0+U1IgJiBTQUlfeFNSX0ZMVkwpICE9IFNBSV9GSUZPU1RBVFVTX0ZVTEwpICYmIChoc2FpLT5YZmVyQ291bnQgPiAwVSkpCisgIHsKKyAgICBpZiAoKGhzYWktPkluaXQuRGF0YVNpemUgPT0gU0FJX0RBVEFTSVpFXzgpICYmIChoc2FpLT5Jbml0LkNvbXBhbmRpbmdNb2RlID09IFNBSV9OT0NPTVBBTkRJTkcpKQorICAgIHsKKyAgICAgIGhzYWktPkluc3RhbmNlLT5EUiA9ICpoc2FpLT5wQnVmZlB0cjsKKyAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgfQorICAgIGVsc2UgaWYgKGhzYWktPkluaXQuRGF0YVNpemUgPD0gU0FJX0RBVEFTSVpFXzE2KQorICAgIHsKKyAgICAgIHRlbXAgPSAodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cik7CisgICAgICBoc2FpLT5wQnVmZlB0cisrOworICAgICAgdGVtcCB8PSAoKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpIDw8IDgpOworICAgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICAgIGhzYWktPkluc3RhbmNlLT5EUiA9IHRlbXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0ZW1wID0gKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpOworICAgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICAgIHRlbXAgfD0gKCh1aW50MzJfdCkoKmhzYWktPnBCdWZmUHRyKSA8PCA4KTsKKyAgICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgICB0ZW1wIHw9ICgodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cikgPDwgMTYpOworICAgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICAgIHRlbXAgfD0gKCh1aW50MzJfdCkoKmhzYWktPnBCdWZmUHRyKSA8PCAyNCk7CisgICAgICBoc2FpLT5wQnVmZlB0cisrOworICAgICAgaHNhaS0+SW5zdGFuY2UtPkRSID0gdGVtcDsKKyAgICB9CisgICAgaHNhaS0+WGZlckNvdW50LS07CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGludGVycnVwdCBmbGFnIHRvIHNldCBhY2NvcmRpbmcgdGhlIFNBSSBzZXR1cC4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEBwYXJhbSAgbW9kZSBTQUlfTU9ERV9ETUEgb3IgU0FJX01PREVfSVQKKyAgKiBAcmV0dmFsIHRoZSBsaXN0IG9mIHRoZSBJVCBmbGFnIHRvIGVuYWJsZQorICAqLworc3RhdGljIHVpbnQzMl90IFNBSV9JbnRlcnJ1cHRGbGFnKGNvbnN0IFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCBTQUlfTW9kZVR5cGVkZWYgbW9kZSkKK3sKKyAgdWludDMyX3QgdG1wSVQgPSBTQUlfSVRfT1ZSVURSOworCisgIGlmIChtb2RlID09IFNBSV9NT0RFX0lUKQorICB7CisgICAgdG1wSVQgfD0gU0FJX0lUX0ZSRVE7CisgIH0KKworICBpZiAoKGhzYWktPkluaXQuUHJvdG9jb2wgPT0gU0FJX0FDOTdfUFJPVE9DT0wpICYmCisgICAgICAoKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFU0xBVkVfUlgpIHx8IChoc2FpLT5Jbml0LkF1ZGlvTW9kZSA9PSBTQUlfTU9ERU1BU1RFUl9SWCkpKQorICB7CisgICAgdG1wSVQgfD0gU0FJX0lUX0NOUkRZOworICB9CisKKyAgaWYgKChoc2FpLT5Jbml0LkF1ZGlvTW9kZSA9PSBTQUlfTU9ERVNMQVZFX1JYKSB8fCAoaHNhaS0+SW5pdC5BdWRpb01vZGUgPT0gU0FJX01PREVTTEFWRV9UWCkpCisgIHsKKyAgICB0bXBJVCB8PSBTQUlfSVRfQUZTREVUIHwgU0FJX0lUX0xGU0RFVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBoc2FpIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gbWFzdGVyIG1vZGUgKi8KKyAgICB0bXBJVCB8PSBTQUlfSVRfV0NLQ0ZHOworICB9CisgIHJldHVybiB0bXBJVDsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTQUkgYW5kIHdhaXQgZm9yIHRoZSBkaXNhYmxpbmcuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTQUlfRGlzYWJsZShTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkKK3sKKyAgcmVnaXN0ZXIgdWludDMyX3QgY291bnQgPSBTQUlfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDdVIC8gMTAwMFUpOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogRGlzYWJsZSB0aGUgU0FJIGluc3RhbmNlICovCisgIF9fSEFMX1NBSV9ESVNBQkxFKGhzYWkpOworCisgIGRvCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoY291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgIGhzYWktPkVycm9yQ29kZSB8PSBIQUxfU0FJX0VSUk9SX1RJTUVPVVQ7CisgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjb3VudC0tOworICB9CisgIHdoaWxlICgoaHNhaS0+SW5zdGFuY2UtPkNSMSAmIFNBSV94Q1IxX1NBSUVOKSAhPSAwVSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUeCBIYW5kbGVyIGZvciBUcmFuc21pdCBpbiBJbnRlcnJ1cHQgbW9kZSA4LUJpdCB0cmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUOEJpdChTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSkKK3sKKyAgaWYgKGhzYWktPlhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSB0cmFuc21pc3Npb24gKi8KKyAgICAvKiBEaXNhYmxlIEZSRVEgYW5kIE9WUlVEUiBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfSVQpKTsKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzYWktPlR4Q3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICBIQUxfU0FJX1R4Q3BsdENhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogV3JpdGUgZGF0YSBvbiBEUiByZWdpc3RlciAqLworICAgIGhzYWktPkluc3RhbmNlLT5EUiA9ICpoc2FpLT5wQnVmZlB0cjsKKyAgICBoc2FpLT5wQnVmZlB0cisrOworICAgIGhzYWktPlhmZXJDb3VudC0tOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFuZGxlciBmb3IgVHJhbnNtaXQgaW4gSW50ZXJydXB0IG1vZGUgZm9yIDE2LUJpdCB0cmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIGlmIChoc2FpLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXNzaW9uICovCisgICAgLyogRGlzYWJsZSBGUkVRIGFuZCBPVlJVRFIgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX1NBSV9ESVNBQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7CisgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc2FpLT5UeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgb24gRFIgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHRlbXAgPSAodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cik7CisgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICB0ZW1wIHw9ICgodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cikgPDwgOCk7CisgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICBoc2FpLT5JbnN0YW5jZS0+RFIgPSB0ZW1wOworICAgIGhzYWktPlhmZXJDb3VudC0tOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFuZGxlciBmb3IgVHJhbnNtaXQgaW4gSW50ZXJydXB0IG1vZGUgZm9yIDMyLUJpdCB0cmFuc2Zlci4KKyAgKiBAcGFyYW0gIGhzYWkgcG9pbnRlciB0byBhIFNBSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTQUkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0FJX1RyYW5zbWl0X0lUMzJCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIGlmIChoc2FpLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXNzaW9uICovCisgICAgLyogRGlzYWJsZSBGUkVRIGFuZCBPVlJVRFIgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX1NBSV9ESVNBQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7CisgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc2FpLT5UeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgSEFMX1NBSV9UeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgb24gRFIgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHRlbXAgPSAodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cik7CisgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICB0ZW1wIHw9ICgodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cikgPDwgOCk7CisgICAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgICB0ZW1wIHw9ICgodWludDMyX3QpKCpoc2FpLT5wQnVmZlB0cikgPDwgMTYpOworICAgIGhzYWktPnBCdWZmUHRyKys7CisgICAgdGVtcCB8PSAoKHVpbnQzMl90KSgqaHNhaS0+cEJ1ZmZQdHIpIDw8IDI0KTsKKyAgICBoc2FpLT5wQnVmZlB0cisrOworICAgIGhzYWktPkluc3RhbmNlLT5EUiA9IHRlbXA7CisgICAgaHNhaS0+WGZlckNvdW50LS07CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSeCBIYW5kbGVyIGZvciBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlIDgtQml0IHRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfUmVjZWl2ZV9JVDhCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIC8qIFJlY2VpdmUgZGF0YSAqLworICAqaHNhaS0+cEJ1ZmZQdHIgPSAodWludDhfdCloc2FpLT5JbnN0YW5jZS0+RFI7CisgIGhzYWktPnBCdWZmUHRyKys7CisgIGhzYWktPlhmZXJDb3VudC0tOworCisgIC8qIENoZWNrIGVuZCBvZiB0aGUgdHJhbnNmZXIgKi8KKyAgaWYgKGhzYWktPlhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgVFhFIGFuZCBPVlJVRFIgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX1NBSV9ESVNBQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7CisKKyAgICAvKiBDbGVhciB0aGUgU0FJIE92ZXJydW4gZmxhZyAqLworICAgIF9fSEFMX1NBSV9DTEVBUl9GTEFHKGhzYWksIFNBSV9GTEFHX09WUlVEUik7CisKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzYWktPlJ4Q3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSeCBIYW5kbGVyIGZvciBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlIGZvciAxNi1CaXQgdHJhbnNmZXIuCisgICogQHBhcmFtICBoc2FpIHBvaW50ZXIgdG8gYSBTQUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU0FJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNBSV9SZWNlaXZlX0lUMTZCaXQoU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkpCit7CisgIHVpbnQzMl90IHRlbXA7CisKKyAgLyogUmVjZWl2ZSBkYXRhICovCisgIHRlbXAgPSBoc2FpLT5JbnN0YW5jZS0+RFI7CisgICpoc2FpLT5wQnVmZlB0ciA9ICh1aW50OF90KXRlbXA7CisgIGhzYWktPnBCdWZmUHRyKys7CisgICpoc2FpLT5wQnVmZlB0ciA9ICh1aW50OF90KSh0ZW1wID4+IDgpOworICBoc2FpLT5wQnVmZlB0cisrOworICBoc2FpLT5YZmVyQ291bnQtLTsKKworICAvKiBDaGVjayBlbmQgb2YgdGhlIHRyYW5zZmVyICovCisgIGlmIChoc2FpLT5YZmVyQ291bnQgPT0gMFUpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRYRSBhbmQgT1ZSVURSIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9TQUlfRElTQUJMRV9JVChoc2FpLCBTQUlfSW50ZXJydXB0RmxhZyhoc2FpLCBTQUlfTU9ERV9JVCkpOworCisgICAgLyogQ2xlYXIgdGhlIFNBSSBPdmVycnVuIGZsYWcgKi8KKyAgICBfX0hBTF9TQUlfQ0xFQVJfRkxBRyhoc2FpLCBTQUlfRkxBR19PVlJVRFIpOworCisgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc2FpLT5SeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgICAgSEFMX1NBSV9SeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFuZGxlciBmb3IgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZSBmb3IgMzItQml0IHRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNhaSBwb2ludGVyIHRvIGEgU0FJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNBSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfUmVjZWl2ZV9JVDMyQml0KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpKQoreworICB1aW50MzJfdCB0ZW1wOworCisgIC8qIFJlY2VpdmUgZGF0YSAqLworICB0ZW1wID0gaHNhaS0+SW5zdGFuY2UtPkRSOworICAqaHNhaS0+cEJ1ZmZQdHIgPSAodWludDhfdCl0ZW1wOworICBoc2FpLT5wQnVmZlB0cisrOworICAqaHNhaS0+cEJ1ZmZQdHIgPSAodWludDhfdCkodGVtcCA+PiA4KTsKKyAgaHNhaS0+cEJ1ZmZQdHIrKzsKKyAgKmhzYWktPnBCdWZmUHRyID0gKHVpbnQ4X3QpKHRlbXAgPj4gMTYpOworICBoc2FpLT5wQnVmZlB0cisrOworICAqaHNhaS0+cEJ1ZmZQdHIgPSAodWludDhfdCkodGVtcCA+PiAyNCk7CisgIGhzYWktPnBCdWZmUHRyKys7CisgIGhzYWktPlhmZXJDb3VudC0tOworCisgIC8qIENoZWNrIGVuZCBvZiB0aGUgdHJhbnNmZXIgKi8KKyAgaWYgKGhzYWktPlhmZXJDb3VudCA9PSAwVSkKKyAgeworICAgIC8qIERpc2FibGUgVFhFIGFuZCBPVlJVRFIgaW50ZXJydXB0cyAqLworICAgIF9fSEFMX1NBSV9ESVNBQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0lUKSk7CisKKyAgICAvKiBDbGVhciB0aGUgU0FJIE92ZXJydW4gZmxhZyAqLworICAgIF9fSEFMX1NBSV9DTEVBUl9GTEFHKGhzYWksIFNBSV9GTEFHX09WUlVEUik7CisKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhzYWktPlJ4Q3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgICBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKGhzYWkpOworI2VuZGlmCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU0FJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0FJX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkgPSAoU0FJX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBpZiAoaGRtYS0+SW5pdC5Nb2RlICE9IERNQV9DSVJDVUxBUikKKyAgeworICAgIGhzYWktPlhmZXJDb3VudCA9IDA7CisKKyAgICAvKiBEaXNhYmxlIFNBSSBUeCBETUEgUmVxdWVzdCAqLworICAgIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSh+U0FJX3hDUjFfRE1BRU4pOworCisgICAgLyogU3RvcCB0aGUgaW50ZXJydXB0cyBlcnJvciBoYW5kbGluZyAqLworICAgIF9fSEFMX1NBSV9ESVNBQkxFX0lUKGhzYWksIFNBSV9JbnRlcnJ1cHRGbGFnKGhzYWksIFNBSV9NT0RFX0RNQSkpOworCisgICAgaHNhaS0+U3RhdGUgPSBIQUxfU0FJX1NUQVRFX1JFQURZOworICB9CisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoc2FpLT5UeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbHNlCisgIEhBTF9TQUlfVHhDcGx0Q2FsbGJhY2soaHNhaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU0FJIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkgPSAoU0FJX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHNhaS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgSEFMX1NBSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHNhaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU0FJIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSA9IChTQUlfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGlmIChoZG1hLT5Jbml0Lk1vZGUgIT0gRE1BX0NJUkNVTEFSKQorICB7CisgICAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICAgIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSh+U0FJX3hDUjFfRE1BRU4pOworICAgIGhzYWktPlhmZXJDb3VudCA9IDA7CisKKyAgICAvKiBTdG9wIHRoZSBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsaW5nICovCisgICAgX19IQUxfU0FJX0RJU0FCTEVfSVQoaHNhaSwgU0FJX0ludGVycnVwdEZsYWcoaHNhaSwgU0FJX01PREVfRE1BKSk7CisKKyAgICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisgIH0KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhzYWktPlJ4Q3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgSEFMX1NBSV9SeENwbHRDYWxsYmFjayhoc2FpKTsKKyNlbmRpZgorfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTQUkgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU0FJX0hhbmRsZVR5cGVEZWYgKmhzYWkgPSAoU0FJX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworI2lmIChVU0VfSEFMX1NBSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHNhaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgSEFMX1NBSV9SeEhhbGZDcGx0Q2FsbGJhY2soaHNhaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU0FJIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0FJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTQUlfSGFuZGxlVHlwZURlZiAqaHNhaSA9IChTQUlfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIC8qIFNldCBTQUkgZXJyb3IgY29kZSAqLworICBoc2FpLT5FcnJvckNvZGUgfD0gSEFMX1NBSV9FUlJPUl9ETUE7CisKKyAgLyogRGlzYWJsZSB0aGUgU0FJIERNQSByZXF1ZXN0ICovCisgIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gflNBSV94Q1IxX0RNQUVOOworCisgIC8qIERpc2FibGUgU0FJIHBlcmlwaGVyYWwgKi8KKyAgLyogTm8gbmVlZCB0byBjaGVjayByZXR1cm4gdmFsdWUgYmVjYXVzZSBzdGF0ZSB3aWxsIGJlIHVwZGF0ZWQgYW5kIEhBTF9TQUlfRXJyb3JDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBsYXRlciAqLworICAodm9pZCkgU0FJX0Rpc2FibGUoaHNhaSk7CisKKyAgLyogU2V0IHRoZSBTQUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLworICBoc2FpLT5TdGF0ZSA9IEhBTF9TQUlfU1RBVEVfUkVBRFk7CisKKyAgLyogSW5pdGlhbGl6ZSBYZmVyQ291bnQgKi8KKyAgaHNhaS0+WGZlckNvdW50ID0gMFU7CisKKyAgLyogU0FJIGVycm9yIENhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBoc2FpLT5FcnJvckNhbGxiYWNrKGhzYWkpOworI2Vsc2UKKyAgSEFMX1NBSV9FcnJvckNhbGxiYWNrKGhzYWkpOworI2VuZGlmCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNBSSBBYm9ydCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTQUlfRE1BQWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpID0gKFNBSV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogRGlzYWJsZSBETUEgcmVxdWVzdCAqLworICBoc2FpLT5JbnN0YW5jZS0+Q1IxICY9IH5TQUlfeENSMV9ETUFFTjsKKworICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBjbGVhciBhbGwgZmxhZ3MgKi8KKyAgaHNhaS0+SW5zdGFuY2UtPklNUiA9IDBVOworICBoc2FpLT5JbnN0YW5jZS0+Q0xSRlIgPSAweEZGRkZGRkZGVTsKKworICBpZiAoaHNhaS0+RXJyb3JDb2RlICE9IEhBTF9TQUlfRVJST1JfV0NLQ0ZHKQorICB7CisgICAgLyogRGlzYWJsZSBTQUkgcGVyaXBoZXJhbCAqLworICAgIC8qIE5vIG5lZWQgdG8gY2hlY2sgcmV0dXJuIHZhbHVlIGJlY2F1c2Ugc3RhdGUgd2lsbCBiZSB1cGRhdGVkIGFuZCBIQUxfU0FJX0Vycm9yQ2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgKi8KKyAgICAodm9pZCkgU0FJX0Rpc2FibGUoaHNhaSk7CisKKyAgICAvKiBGbHVzaCB0aGUgZmlmbyAqLworICAgIFNFVF9CSVQoaHNhaS0+SW5zdGFuY2UtPkNSMiwgU0FJX3hDUjJfRkZMVVNIKTsKKyAgfQorICAvKiBTZXQgdGhlIFNBSSBzdGF0ZSB0byByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCisgIGhzYWktPlN0YXRlID0gSEFMX1NBSV9TVEFURV9SRUFEWTsKKworICAvKiBJbml0aWFsaXplIFhmZXJDb3VudCAqLworICBoc2FpLT5YZmVyQ291bnQgPSAwVTsKKworICAvKiBTQUkgZXJyb3IgQ2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGhzYWktPkVycm9yQ2FsbGJhY2soaHNhaSk7CisjZWxzZQorICBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soaHNhaSk7CisjZW5kaWYKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TQUlfTU9EVUxFX0VOQUJMRUQgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF9zYWlfZXguYyBiL1NyYy9zdG0zMndieHhfaGFsX3NhaV9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjgzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9zYWlfZXguYwpAQCAtMCwwICsxLDEzMSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc2FpX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNBSSBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgU0FJIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBNb2RpZnkgUERNIG1pY3JvcGhvbmUgZGVsYXlzLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfU0FJX01PRFVMRV9FTkFCTEVECisKKy8qKiBAZGVmZ3JvdXAgU0FJRXggU0FJRXgKKyAgKiBAYnJpZWYgU0FJIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTQUlFeF9Qcml2YXRlX0RlZmluZXMgU0FJRXggRXh0ZW5kZWQgUHJpdmF0ZSBEZWZpbmVzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgU0FJX1BETV9ERUxBWV9NQVNLICAgICAgICAgIDB4NzdVCisjZGVmaW5lIFNBSV9QRE1fREVMQVlfT0ZGU0VUICAgICAgICA4VQorI2RlZmluZSBTQUlfUERNX1JJR0hUX0RFTEFZX09GRlNFVCAgNFUKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU0FJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFNBSUV4IEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU0FJRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFNBSUV4IGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgTW9kaWZ5IFBETSBtaWNyb3Bob25lIGRlbGF5cworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBQRE0gbWljcm9waG9uZSBkZWxheXMuCisgICogQHBhcmFtICBoc2FpIFNBSSBoYW5kbGUuCisgICogQHBhcmFtICBwZG1NaWNEZWxheSBNaWNyb3Bob25lIGRlbGF5cyBjb25maWd1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NBSUV4X0NvbmZpZ1BkbU1pY0RlbGF5KFNBSV9IYW5kbGVUeXBlRGVmICpoc2FpLCBTQUlFeF9QZG1NaWNEZWxheVBhcmFtVHlwZURlZiAqcGRtTWljRGVsYXkpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3Qgb2Zmc2V0OworCisgIC8qIENoZWNrIHRoYXQgU0FJIHN1Yi1ibG9jayBpcyBTQUkxIHN1Yi1ibG9jayBBICovCisgIGlmIChoc2FpLT5JbnN0YW5jZSAhPSBTQUkxX0Jsb2NrX0EpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hlY2sgbWljcm9waG9uZSBkZWxheSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1NBSV9QRE1fTUlDX1BBSVJTX05VTUJFUihwZG1NaWNEZWxheS0+TWljUGFpcikpOworICAgIGFzc2VydF9wYXJhbShJU19TQUlfUERNX01JQ19ERUxBWShwZG1NaWNEZWxheS0+TGVmdERlbGF5KSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NBSV9QRE1fTUlDX0RFTEFZKHBkbU1pY0RlbGF5LT5SaWdodERlbGF5KSk7CisKKyAgICAvKiBDb21wdXRlIG9mZnNldCBvbiBQRE1ETFkgcmVnaXN0ZXIgYWNjb3JkaW5nIG1pYyBwYWlyIG51bWJlciAqLworICAgIG9mZnNldCA9IFNBSV9QRE1fREVMQVlfT0ZGU0VUICogKHBkbU1pY0RlbGF5LT5NaWNQYWlyIC0gMVUpOworCisgICAgLyogQ2hlY2sgU0FJIHN0YXRlIGFuZCBvZmZzZXQgKi8KKyAgICBpZiAoKGhzYWktPlN0YXRlICE9IEhBTF9TQUlfU1RBVEVfUkVTRVQpICYmIChvZmZzZXQgPD0gMjRVKSkKKyAgICB7CisgICAgICAvKiBSZXNldCBjdXJyZW50IGRlbGF5cyBmb3Igc3BlY2lmaWVkIG1pY3JvcGhvbmUgKi8KKyAgICAgIFNBSTEtPlBETURMWSAmPSB+KFNBSV9QRE1fREVMQVlfTUFTSyA8PCBvZmZzZXQpOworCisgICAgICAvKiBBcHBseSBuZXcgbWljcm9waG9uZSBkZWxheXMgKi8KKyAgICAgIFNBSTEtPlBETURMWSB8PSAoKChwZG1NaWNEZWxheS0+UmlnaHREZWxheSA8PCBTQUlfUERNX1JJR0hUX0RFTEFZX09GRlNFVCkgfCBwZG1NaWNEZWxheS0+TGVmdERlbGF5KSA8PCBvZmZzZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NBSV9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3NtYXJ0Y2FyZC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiZjNlNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3NtYXJ0Y2FyZC5jCkBAIC0wLDAgKzEsMzA5OCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc21hcnRjYXJkLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNNQVJUQ0FSRCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTTUFSVENBUkQgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhlIFNNQVJUQ0FSRCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgKGVnLiBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBoc21hcnRjYXJkKS4KKyAgICAoIykgQXNzb2NpYXRlIGEgVVNBUlQgdG8gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgaHNtYXJ0Y2FyZC4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfU01BUlRDQVJEX01zcEluaXQoKSBBUEk6CisgICAgICAgICgrKykgRW5hYmxlIHRoZSBVU0FSVHggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAoKyspIFVTQVJUIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVVNBUlQgR1BJT3MuCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVCBwaW5zIChUWCBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVsbC11cCwgUlggYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIElucHV0KS4KKyAgICAgICAgKCsrKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVHggaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBVU0FSVCBJUlEgaGFuZGxlLgorICAgICAgICAoKyspIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcyAoSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgIGFuZCBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLgorICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgU01BUlRDQVJEIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHgvUnggY2hhbm5lbC4KKworICAgICgjKSBQcm9ncmFtIHRoZSBCYXVkIFJhdGUsIFBhcml0eSwgTW9kZShSZWNlaXZlci9UcmFuc21pdHRlciksIGNsb2NrIGVuYWJsaW5nL2Rpc2FibGluZyBhbmQgYWNjb3JkaW5nbHksCisgICAgICAgIHRoZSBjbG9jayBwYXJhbWV0ZXJzIChwYXJpdHksIHBoYXNlLCBsYXN0IGJpdCksIHByZXNjYWxlciB2YWx1ZSwgZ3VhcmQgdGltZSBhbmQgTkFDSyBvbiB0cmFuc21pc3Npb24KKyAgICAgICAgZXJyb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGluIHRoZSBoc21hcnRjYXJkIGhhbmRsZSBJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBJZiByZXF1aXJlZCwgcHJvZ3JhbSBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgKFRYL1JYIHBpbnMgc3dhcCwgVGltZU91dCwgYXV0by1yZXRyeSBjb3VudGVyLC4uLikKKyAgICAgICAgaW4gdGhlIGhzbWFydGNhcmQgaGFuZGxlIEFkdmFuY2VkSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfU01BUlRDQVJEX0luaXQoKSBBUEk6CisgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9TTUFSVENBUkRfTXNwSW5pdCgpIEFQSS4KKyAgICAgICAgWy4uXQorICAgICAgICAoQCkgVGhlIHNwZWNpZmljIFNNQVJUQ0FSRCBpbnRlcnJ1cHRzIChUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LAorICAgICAgICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgICAgICAgIF9fSEFMX1NNQVJUQ0FSRF9FTkFCTEVfSVQoKSBhbmQgX19IQUxfU01BUlRDQVJEX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisKKyAgICBbLi5dCisgICAgWy4uXSBUaHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgorCisgICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdCgpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01BUlRDQVJEX1JlY2VpdmUoKQorCisgICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKCkKKyAgICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAoKykgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKQorICAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpCisKKyAgICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFsuLl0KKyAgICAgICAoKykgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSAoRE1BKSB1c2luZyBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0RNQSgpCisgICAgICAgKCspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgKERNQSkgdXNpbmcgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0RNQSgpCisgICAgICAgKCspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkKKworICAgICAqKiogU01BUlRDQVJEIEhBTCBkcml2ZXIgbWFjcm9zIGxpc3QgKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQorICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gU01BUlRDQVJEIEhBTCBkcml2ZXIuCisKKyAgICAgICAoKykgX19IQUxfU01BUlRDQVJEX0dFVF9GTEFHIDogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgZmxhZyBpcyBzZXQKKyAgICAgICAoKykgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcgOiBDbGVhciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBwZW5kaW5nIGZsYWcKKyAgICAgICAoKykgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVDogRW5hYmxlIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIGludGVycnVwdAorICAgICAgICgrKSBfX0hBTF9TTUFSVENBUkRfRElTQUJMRV9JVDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBpbnRlcnJ1cHQKKyAgICAgICAoKykgX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0U6IENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIGludGVycnVwdCBpcyBlbmFibGVkCisKKyAgICAgWy4uXQorICAgICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBTTUFSVENBUkQgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKKyAgICAjIyMjIyBDYWxsYmFjayByZWdpc3RyYXRpb24gIyMjIyMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBbLi5dCisgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA6IEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBTTUFSVENBUkQgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1NNQVJUQ0FSRF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA6IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA6IEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgIDogQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBTTUFSVENBUkQgTXNwSW5pdC4KKyAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA6IFNNQVJUQ0FSRCBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQKKyAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOgorICAgIGV4YW1wbGVzIEByZWYgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKS4KKyAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKKyAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfU01BUlRDQVJEX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9TTUFSVENBUkRfRGVJbml0KCkgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9TTUFSVENBUkRfSW5pdCgpIGFuZCBAcmVmIEhBTF9TTUFSVENBUkRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgaW4gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSBvciBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfU01BUlRDQVJEX0RlSW5pdCgpCisgICAgb3IgQHJlZiBIQUxfU01BUlRDQVJEX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCisgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRCBTTUFSVENBUkQKKyAgKiBAYnJpZWYgSEFMIFNNQVJUQ0FSRCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9TTUFSVENBUkRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9Qcml2YXRlX0NvbnN0YW50cyBTTUFSVENBUkQgUHJpdmF0ZSBDb25zdGFudHMKKyAqIEB7CisgKi8KKyNkZWZpbmUgU01BUlRDQVJEX1RFQUNLX1JFQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAxMDAwVSAgICAgIC8qITwgU01BUlRDQVJEIFRYIG9yIFJYIGVuYWJsZSBhY2tub3dsZWRnZSB0aW1lLW91dCB2YWx1ZSAgKi8KKworI2RlZmluZSBVU0FSVF9DUjFfRklFTERTICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfT1ZFUjh8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBTTUFSVENBUkRfU2V0Q29uZmlnIEFQSSAqLworCisjZGVmaW5lIFVTQVJUX0NSMl9DTEtfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfQ1BPTCB8IFVTQVJUX0NSMl9DUEhBIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0xCQ0wpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBTTUFSVENBUkQgY2xvY2stcmVsYXRlZCBVU0FSVCBDUjIgZmllbGRzIG9mIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBVU0FSVF9DUjJfRklFTERTICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IyX1JUT0VOIHwgVVNBUlRfQ1IyX0NMS19GSUVMRFMgfCBVU0FSVF9DUjJfU1RPUCkpICAgLyohPCBVU0FSVCBDUjIgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFNNQVJUQ0FSRF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IzX0ZJRUxEUyAgICAgICgodWludDMyX3QpKFVTQVJUX0NSM19PTkVCSVQgfCBVU0FSVF9DUjNfTkFDSyB8IFVTQVJUX0NSM19TQ0FSQ05UIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX1RYRlRDRkcgfCBVU0FSVF9DUjNfUlhGVENGRyApKSAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBDUjMgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFNNQVJUQ0FSRF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQlJSX01JTiAgICAweDEwVSAgICAgICAgLyohPCBVU0FSVCBCUlIgbWluaW11bSBhdXRob3JpemVkIHZhbHVlICovCisKKyNkZWZpbmUgVVNBUlRfQlJSX01BWCAgICAweDAwMDBGRkZGVSAgLyohPCBVU0FSVCBCUlIgbWF4aW11bSBhdXRob3JpemVkIHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFNNQVJUQ0FSRF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfU2V0Q29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9BZHZGZWF0dXJlQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfQ2hlY2tJZGxlU3RhdGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRUeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfVHhJU1IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX1R4SVNSX0ZJRk9FTihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworc3RhdGljIHZvaWQgU01BUlRDQVJEX1J4SVNSKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9SeElTUl9GSUZPRU4oU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zIFNNQVJUQ0FSRCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4CisgIGFzc29jaWF0ZWQgdG8gdGhlIFNtYXJ0Q2FyZC4KKyAgKCspIFRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAoKyspIEJhdWQgUmF0ZQorICAgICAgKCsrKSBQYXJpdHk6IHBhcml0eSBzaG91bGQgYmUgZW5hYmxlZCwgZnJhbWUgTGVuZ3RoIGlzIGZpeGVkIHRvIDggYml0cyBwbHVzIHBhcml0eQorICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgKCsrKSBTeW5jaHJvbm91cyBtb2RlIChhbmQgaWYgZW5hYmxlZCwgcGhhc2UsIHBvbGFyaXR5IGFuZCBsYXN0IGJpdCBwYXJhbWV0ZXJzKQorICAgICAgKCsrKSBQcmVzY2FsZXIgdmFsdWUKKyAgICAgICgrKykgR3VhcmQgYml0IHRpbWUKKyAgICAgICgrKykgTkFDSyBlbmFibGluZyBvciBkaXNhYmxpbmcgb24gdHJhbnNtaXNzaW9uIGVycm9yCisKKyAgKCspIFRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgd2VsbDoKKyAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICgrKykgZGF0YSBsb2dpY2FsIGxldmVsIGludmVyc2lvbgorICAgICAgKCsrKSBSWCBhbmQgVFggcGlucyBzd2FwCisgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgKCsrKSBETUEgZGlzYWJsaW5nIG9uIFJYIGVycm9yCisgICAgICAoKyspIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUKKyAgICAgICgrKykgVGltZSBvdXQgZW5hYmxpbmcgKGFuZCBpZiBhY3RpdmF0ZWQsIHRpbWVvdXQgdmFsdWUpCisgICAgICAoKyspIEJsb2NrIGxlbmd0aAorICAgICAgKCsrKSBBdXRvLXJldHJ5IGNvdW50ZXIKKyAgWy4uXQorICBUaGUgSEFMX1NNQVJUQ0FSRF9Jbml0KCkgQVBJIGZvbGxvd3MgdGhlIFVTQVJUIHN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcworICAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgVGhlIFVTQVJUIGZyYW1lIGZvcm1hdCBpcyBnaXZlbiBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgVGFibGUgMS4gVVNBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBNMU0wIGJpdHMgfCAgUENFIGJpdCAgfCAgICAgICAgICAgIFVTQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgIDAxICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDggYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgdGhlIFNNQVJUQ0FSRCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNtYXJ0Y2FyZCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBVU0FSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgaGFuZGxlICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHNtYXJ0Y2FyZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgICAgU01BUlRDQVJEX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHNtYXJ0Y2FyZCk7CisKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSRF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0sgKi8KKyAgICBIQUxfU01BUlRDQVJEX01zcEluaXQoaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCB0byBzZXQgc21hcnRjYXJkIG1vZGUgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgLyogSW4gU21hcnRDYXJkIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIEhEU0VMIGFuZCBJUkVOICBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9MSU5FTik7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICAvKiBzZXQgdGhlIFVTQVJUIGluIFNNQVJUQ0FSRCBtb2RlICovCisgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1NDRU4pOworCisgIC8qIFNldCB0aGUgU01BUlRDQVJEIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoU01BUlRDQVJEX1NldENvbmZpZyhoc21hcnRjYXJkKSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogU2V0IHRoZSBTTUFSVENBUkQgdHJhbnNtaXNzaW9uIGNvbXBsZXRpb24gaW5kaWNhdGlvbiAqLworICBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fU0VUVElORyhoc21hcnRjYXJkKTsKKworICBpZiAoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFNNQVJUQ0FSRF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhoc21hcnRjYXJkKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKGhzbWFydGNhcmQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfRGVJbml0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBDaGVjayB0aGUgU01BUlRDQVJEIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc21hcnRjYXJkID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIFVTQVJUL1VBUlQgYXNzb2NpYXRlZCB0byB0aGUgU01BUlRDQVJEIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIDB4MFUpOworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgMHgwVSk7CisgIFdSSVRFX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SVE9SLCAweDBVKTsKKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5HVFBSLCAweDBVKTsKKworICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworI2lmIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxCisgIGlmIChoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIEhBTF9TTUFSVENBUkRfTXNwRGVJbml0KGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgTVNQLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfTXNwSW5pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFNNQVJUQ0FSRCBNU1AuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9Nc3BEZUluaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNNQVJUQ0FSRCBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgc21hcnRjYXJkIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVnaXN0ZXJDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgSEFMX1NNQVJUQ0FSRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU01BUlRDQVJEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhGaWZvRnVsbENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5UeEZpZm9FbXB0eUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gU01BUlRDQVJEIGNhbGxiYWNrCisgICogICAgICAgICBTTUFSVENBUkQgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc21hcnRjYXJkIHNtYXJ0Y2FyZCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfUlhfQ09NUExFVEVfQ0JfSUQgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUFSVENBUkRfVFhfRklGT19FTVBUWV9DQl9JRCBUeCBGaWZvIEVtcHR5IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgSEFMX1NNQVJUQ0FSRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICBpZiAoSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSA9PSBoc21hcnRjYXJkLT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX1RSQU5TTUlUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX0FCT1JUX1JFQ0VJVkVfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhGaWZvRnVsbENhbGxiYWNrID0gSEFMX1NNQVJUQ0FSREV4X1J4Rmlmb0Z1bGxDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5UeEZpZm9FbXB0eUNhbGxiYWNrID0gSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWFydGNhcmQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUFSVENBUkRfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVCA9PSBoc21hcnRjYXJkLT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01BUlRDQVJEX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21hcnRjYXJkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUFSVENBUkRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYXJ0Y2FyZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBTTUFSVENBUkQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNNQVJUQ0FSRCBkYXRhIHRyYW5zZmVycy4KKworICBbLi5dCisgICAgU21hcnRjYXJkIGlzIGEgc2luZ2xlIHdpcmUgaGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiBwcm90b2NvbC4KKyAgICBUaGUgU21hcnRjYXJkIGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFzeW5jaHJvbm91cyBwcm90b2NvbCBTbWFydGNhcmRzIGFzCisgICAgZGVmaW5lZCBpbiB0aGUgSVNPIDc4MTYtMyBzdGFuZGFyZC4gVGhlIFVTQVJUIHNob3VsZCBiZSBjb25maWd1cmVkIGFzOgorICAgICgrKSA4IGJpdHMgcGx1cyBwYXJpdHk6IHdoZXJlIE09MSBhbmQgUENFPTEgaW4gdGhlIFVTQVJUX0NSMSByZWdpc3RlcgorICAgICgrKSAxLjUgc3RvcCBiaXRzIHdoZW4gdHJhbnNtaXR0aW5nIGFuZCByZWNlaXZpbmc6IHdoZXJlIFNUT1A9MTEgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3Rlci4KKworICBbLi5dCisgICAgKCspIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CisgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgZmluaXNoaW5nIHRyYW5zZmVyLgorICAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgIG9yIERNQSwgdGhlIHJlbGV2YW50IEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICBkZWRpY2F0ZWQgU01BUlRDQVJEIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yIHRoZSBETUEgSVJRIHdoZW4KKyAgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgKCsrKSBUaGUgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjaygpLCBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUgZW5kIG9mIHRoZSBUcmFuc21pdCBvciBSZWNlaXZlIHByb2Nlc3MKKyAgICAgICAgICAgICBUaGUgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uCisgICAgICAgICAgICAgZXJyb3IgaXMgZGV0ZWN0ZWQuCisKKyAgICAoKykgQmxvY2tpbmcgbW9kZSBBUElzIGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlKCkKKworICAgICgrKSBOb24gQmxvY2tpbmcgbW9kZSBBUElzIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0lSUUhhbmRsZXIoKQorCisgICAgKCspIE5vbiBCbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKCkKKworICAgICgrKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIG5vbiBCbG9ja2luZyBtb2RlOgorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKQorCisgICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfU01BUlRDQVJEX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuIFRyYW5zZmVyIGlzIGtlcHQgb25nb2luZyBvbiBTTUFSVENBUkQgc2lkZS4KKyAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIEJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZCBwcm9wZXJseSBhbmQgaXMgYWJvcnRlZC4KKyAgICAgICAgICAgVGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSB0cmFubWlzc2lvbiwgT3ZlcnJ1biBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCisgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgd3JpdGluZyBhIGRhdGEgaW4gdGhlIFREUiByZWdpc3RlciBhZGRzIG9uZQorICAqICAgICAgICAgZGF0YSB0byB0aGUgVFhGSUZPLiBXcml0ZSBvcGVyYXRpb25zIHRvIHRoZSBURFIgcmVnaXN0ZXIgYXJlIHBlcmZvcm1lZAorICAqICAgICAgICAgd2hlbiBUWEZORiBmbGFnIGlzIHNldC4gRnJvbSBoYXJkd2FyZSBwZXJzcGVjdGl2ZSwgVFhGTkYgZmxhZyBhbmQKKyAgKiAgICAgICAgIFRYRSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSAgVGltZW91dCAgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIHVpbnQ4X3QgICpwdG1wZGF0YSA9IHBEYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwdG1wZGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsIGZpcnN0IHRvIHVwZGF0ZSBtb2RlIGZvciBUWCBtYXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIERpc2FibGUgUngsIGVuYWJsZSBUeCAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9URSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSBTaXplOworCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcHRtcGRhdGEgJiAweEZGVSk7CisgICAgICBwdG1wZGF0YSsrOworICAgIH0KKyAgICBpZiAoU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX1RSQU5TTUlTU0lPTl9DT01QTEVUSU9OX0ZMQUcoaHNtYXJ0Y2FyZCksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICAgIC8qIFJlLWVuYWJsZSBSeCBhdCBlbmQgb2YgdHJhbnNtaXNzaW9uIGlmIGluaXRpYWwgbW9kZSBpcyBSeC9UeCAqLworICAgIGlmIChoc21hcnRjYXJkLT5Jbml0Lk1vZGUgPT0gU01BUlRDQVJEX01PREVfVFhfUlgpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZXMgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gRklGTyBtb2RlIGlzIGVuYWJsZWQsIHRoZSBSWEZORSBmbGFnIGlzIHNldCBhcyBsb25nIGFzIHRoZSBSWEZJRk8KKyAgKiAgICAgICAgIGlzIG5vdCBlbXB0eS4gUmVhZCBvcGVyYXRpb25zIGZyb20gdGhlIFJEUiByZWdpc3RlciBhcmUgcGVyZm9ybWVkIHdoZW4KKyAgKiAgICAgICAgIFJYRk5FIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBSWEZORSBmbGFnIGFuZAorICAqICAgICAgICAgUlhORSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwdG1wZGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ2hlY2sgdGhlIHJlbWFpbiBkYXRhIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9GTEFHX1JYTkUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgKnB0bXBkYXRhID0gKHVpbnQ4X3QpKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkweDAwRkYpOworICAgICAgKnB0bXBkYXRhKys7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gRklGTyBtb2RlIGlzIGRpc2FibGVkLCBVU0FSVCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW5ldmVyCisgICogICAgICAgICBVU0FSVF9URFIgcmVnaXN0ZXIgaXMgZW1wdHksIGkuZSBvbmUgaW50ZXJydXB0IHBlciBkYXRhIHRvIHRyYW5zbWl0LgorICAqIEBub3RlICAgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgVVNBUlQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuZXZlcgorICAqICAgICAgICAgVFhGSUZPIHRocmVzaG9sZCByZWFjaGVkLiBJbiB0aGF0IGNhc2UgdGhlIGludGVycnVwdCByYXRlIGRlcGVuZHMgb24KKyAgKiAgICAgICAgIFRYRklGTyB0aHJlc2hvbGQgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaHNtYXJ0Y2FyZC0+VHhJc3IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8KKyAgKiAgICAgICAgIHRoZSBGSUZPIG1vZGUgKGRhdGEgdHJhbnNtaXNzaW9uIHByb2Nlc3NpbmcgZGVwZW5kcyBvbiBGSUZPIG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21hcnRjYXJkKTsKKworICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICBoc21hcnRjYXJkLT5wVHhCdWZmUHRyICA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlR4WGZlclNpemUgID0gU2l6ZTsKKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgICAgICAgPSBOVUxMOworCisgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCBmaXJzdCB0byB1cGRhdGUgbW9kZSBmb3IgVFggbWFzdGVyICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisKKyAgICAvKiBEaXNhYmxlIFJ4LCBlbmFibGUgVHggKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SUVIsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVEUpOworCisgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogQ29uZmlndXJlIFR4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgaWYgKGhzbWFydGNhcmQtPkZpZm9Nb2RlID09IFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEUpCisgICAgeworICAgICAgLyogU2V0IHRoZSBUeCBJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBTTUFSVENBUkRfVHhJU1JfRklGT0VOOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoc21hcnRjYXJkLT5UeElTUiA9IFNNQVJUQ0FSRF9UeElTUjsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgRW1wdHkgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIEZJRk8gbW9kZSBpcyBkaXNhYmxlZCwgVVNBUlQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuZXZlcgorICAqICAgICAgICAgVVNBUlRfUkRSIHJlZ2lzdGVyIGNhbiBiZSByZWFkLCBpLmUgb25lIGludGVycnVwdCBwZXIgZGF0YSB0byByZWNlaXZlLgorICAqIEBub3RlICAgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgVVNBUlQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCB3aGVuZXZlcgorICAqICAgICAgICAgUlhGSUZPIHRocmVzaG9sZCByZWFjaGVkLiBJbiB0aGF0IGNhc2UgdGhlIGludGVycnVwdCByYXRlIGRlcGVuZHMgb24KKyAgKiAgICAgICAgIFJYRklGTyB0aHJlc2hvbGQgY29uZmlndXJhdGlvbi4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaHNtYXJ0Y2FyZC0+UnhJc3IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8KKyAgKiAgICAgICAgIHRoZSBGSUZPIG1vZGUgKGRhdGEgcmVjZXB0aW9uIHByb2Nlc3NpbmcgZGVwZW5kcyBvbiBGSUZPIG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWNlaXZlX0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSAgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1JYOworCisgICAgaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbmZpZ3VyZSBSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmICgoaHNtYXJ0Y2FyZC0+Rmlmb01vZGUgPT0gU01BUlRDQVJEX0ZJRk9NT0RFX0VOQUJMRSkgJiYgKFNpemUgPj0gaHNtYXJ0Y2FyZC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSX0ZJRk9FTjsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBhbmQgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0cyAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisgICAgfQorCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfVFg7CisKKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisgICAgaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWFydGNhcmQtPlR4WGZlclNpemUgPSBTaXplOworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgZmlyc3QgdG8gdXBkYXRlIG1vZGUgZm9yIFRYIG1hc3RlciAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworCisgICAgLyogRGlzYWJsZSBSeCwgZW5hYmxlIFR4ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SRSk7CisgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKKworICAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFKTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICBzdGF0dXMgPSBIQUxfRE1BX1N0YXJ0X0lUKGhzbWFydGNhcmQtPmhkbWF0eCwgKHVpbnQzMl90KWhzbWFydGNhcmQtPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7CisKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+SUNSLCBVU0FSVF9JQ1JfVENDRik7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICAgIGluIHRoZSBTTUFSVENBUkQgYXNzb2NpYXRlZCBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlN0YXRlIHRvIHJlYWR5ICovCisgICAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEBub3RlICAgVGhlIFNNQVJUQ0FSRC1hc3NvY2lhdGVkIFVTQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwKKyAgKiAgICAgICAgIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4gdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPlJ4U3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWDsKKworICAgIGhzbWFydGNhcmQtPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoc21hcnRjYXJkLT5SeFhmZXJTaXplID0gU2l6ZTsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNNQVJUQ0FSRF9ETUFSZWNlaXZlQ3BsdDsKKworICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BRXJyb3I7CisKKyAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXJ4LCAodWludDMyX3QpJmhzbWFydGNhcmQtPkluc3RhbmNlLT5SRFIsICh1aW50MzJfdCloc21hcnRjYXJkLT5wUnhCdWZmUHRyLCBTaXplKTsKKworICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgICBpbiB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgdHJhbnNmZXJzIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJUT0lFLCBFT0JJRSwgVFhFSUUsIFRDSUUsIFJYTkUsIFBFLCBSWEZULCBUWEZUIGFuZCAgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzbWFydGNhcmQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihoc21hcnRjYXJkLT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfRE1BOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhzbWFydGNhcmQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFRyYW5zbWl0IHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBUeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBUQ0lFLCBUWEVJRSBhbmQgVFhGVElFIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgU01BUlRDQVJEIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHNtYXJ0Y2FyZC0+aGRtYXR4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0ZFRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTTUFSVENBUkQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFJYTkUsIFBFLCBSWEZULCBUWEZUIGFuZCAgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogQ2hlY2sgaWYgYSBUcmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90LiBJZiBub3QgZGlzYWJsZSBFUlIgSVQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmdTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgUnggY2hhbm5lbCA6IHVzZSBibG9ja2luZyBETUEgQWJvcnQgQVBJIChubyBjYWxsYmFjaykgKi8KKyAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGhzbWFydGNhcmQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9ETUE7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFNNQVJUQ0FSRCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBUWEVJRSwgVENJRSwgUlhORSwgUEUsIFJYRlQsIFRYRlQgYW5kICBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX1RYRlRJRSkpOworCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gU01BUlRDQVJEIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BVHhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQVJ4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBUeCBhdCBVQVJUIGxldmVsICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTTUFSVENBUkQgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTTUFSVENBUkQgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKyAgICBoc21hcnRjYXJkLT5UeElTUiA9IE5VTEw7CisKKyAgICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgVENJRSwgVFhFSUUgYW5kIFRYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QuIElmIG5vdCBkaXNhYmxlIEVSUiBJVCAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yKSAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFNNQVJUQ0FSRCBETUEgVHggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgU01BUlRDQVJEIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTTUFSVENBUkRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hdHgpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgVHggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworICAgICAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICAgIGhzbWFydGNhcmQtPlR4SVNSID0gTlVMTDsKKworICAgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBoc21hcnRjYXJkLT5UeElTUiA9IE5VTEw7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgUmVjZWl2ZSB0cmFuc2ZlciAoSW50ZXJydXB0IG1vZGUpLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFJ4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU01BUlRDQVJEIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBSWE5FLCBQRSwgUlhGVCBhbmQgIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSkpOworCisgIC8qIENoZWNrIGlmIGEgVHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvcikgKi8KKyAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChoc21hcnRjYXJkLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNNQVJUQ0FSRCBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQVJ4T25seUFib3J0Q2FsbGJhY2s7CisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHNtYXJ0Y2FyZC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHNtYXJ0Y2FyZC0+aGRtYXJ4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKworICAgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisKKyAgICAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHNtYXJ0Y2FyZC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgaHNtYXJ0Y2FyZC0+UnhJU1IgPSBOVUxMOworCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01BUlRDQVJEIGludGVycnVwdCByZXF1ZXN0cy4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TTUFSVENBUkRfSVJRSGFuZGxlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgaXNyZmxhZ3MgICA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBjcjFpdHMgICAgID0gUkVBRF9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IGNyM2l0cyAgICAgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzKTsKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKworICAvKiBJZiBubyBlcnJvciBvY2N1cnMgKi8KKyAgZXJyb3JmbGFncyA9IChpc3JmbGFncyAmICh1aW50MzJfdCkoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX09SRSB8IFVTQVJUX0lTUl9ORSB8IFVTQVJUX0lTUl9SVE9GKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogU01BUlRDQVJEIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9SWE5FX1JYRk5FKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkKKyAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpKSkKKyAgICB7CisgICAgICBpZiAoaHNtYXJ0Y2FyZC0+UnhJU1IgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+UnhJU1IoaHNtYXJ0Y2FyZCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogSWYgc29tZSBlcnJvcnMgb2NjdXIgKi8KKyAgaWYgKChlcnJvcmZsYWdzICE9IDBVKQorICAgICAgJiYgKCgoKGNyM2l0cyAmIChVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX0VJRSkpICE9IDBVKQorICAgICAgICAgICB8fCAoKGNyMWl0cyAmIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpICE9IDBVKSkpKQorICB7CisgICAgLyogU01BUlRDQVJEIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0lUKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9QRUYpOworCisgICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgfD0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBTTUFSVENBUkQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfRkVGKTsKKworICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlIHw9IEhBTF9TTUFSVENBUkRfRVJST1JfRkU7CisgICAgfQorCisgICAgLyogU01BUlRDQVJEIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX05FRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX05FOworICAgIH0KKworICAgIC8qIFNNQVJUQ0FSRCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX09SRSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKQorICAgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfRUlFKSAhPSAwVSkpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX09SRTsKKyAgICB9CisKKyAgICAvKiBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JUT0YpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SVE9JRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9JVChoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfUlRPRik7CisKKyAgICAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX1JUTzsKKyAgICB9CisKKyAgICAvKiBDYWxsIFNNQVJUQ0FSRCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGhzbWFydGNhcmQtPkVycm9yQ29kZSAhPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogU01BUlRDQVJEIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKQorICAgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGhzbWFydGNhcmQtPlJ4SVNSICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBoc21hcnRjYXJkLT5SeElTUihoc21hcnRjYXJkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBFcnJvciBpcyB0byBiZSBjb25zaWRlcmVkIGFzIGJsb2NraW5nIDoKKyAgICAgIC0gUmVjZWl2ZXIgVGltZW91dCBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgIC0gT3ZlcnJ1biBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgIC0gYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24KKyAgICAgICovCisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICAgICAgICB8fCAoKGhzbWFydGNhcmQtPkVycm9yQ29kZSAmIChIQUxfU01BUlRDQVJEX0VSUk9SX1JUTyB8IEhBTF9TTUFSVENBUkRfRVJST1JfT1JFKSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgU2V0IHRoZSBTTUFSVENBUkQgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKKyAgICAgICAgRGlzYWJsZSBSeCBJbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSBSeCBETUEgcmVxdWVzdCwgaWYgb25nb2luZyAqLworICAgICAgICBTTUFSVENBUkRfRW5kUnhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hcngpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBvdGhlciBlcnJvciB0eXBlIHRvIGJlIGNvbnNpZGVyZWQgYXMgYmxvY2tpbmcgOgorICAgICAgLSBGcmFtZSBlcnJvciBpbiBUcmFuc21pc3Npb24KKyAgICAgICovCisgICAgICBlbHNlIGlmICgoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCkKKyAgICAgICAgICAgICAgICYmICgoaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlICYgSEFMX1NNQVJUQ0FSRF9FUlJPUl9GRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgU2V0IHRoZSBTTUFSVENBUkQgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKKyAgICAgICAgRGlzYWJsZSBUeCBJbnRlcnJ1cHRzLCBhbmQgZGlzYWJsZSBUeCBETUEgcmVxdWVzdCwgaWYgb25nb2luZyAqLworICAgICAgICBTTUFSVENBUkRfRW5kVHhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICAgICAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBTTUFSVENBUkQgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSBTTUFSVENBUkQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc21hcnRjYXJkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KKyAgICAgICAgICAgICAgaHNtYXJ0Y2FyZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoc21hcnRjYXJkLT5oZG1hdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICBoc21hcnRjYXJkLT5FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICAgICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisKKyAgfSAvKiBFbmQgaWYgc29tZSBlcnJvciBvY2N1cnMgKi8KKworICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciwgZW5kIG9mIGJsb2NrIGludGVycnVwdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9FT0JGKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfRU9CSUUpICE9IDBVKSkKKyAgeworICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+UnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgLyogQ2xlYXIgRU9CRiBpbnRlcnJ1cHQgYWZ0ZXIgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIGNhbGwgZm9yIHRoZSBFbmQgb2YgQmxvY2sgaW5mb3JtYXRpb24KKyAgICAqIHRvIGJlIGF2YWlsYWJsZSBkdXJpbmcgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjaygpIHByb2Nlc3NpbmcgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfSVQoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpCisgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfVFhGVElFKSAhPSAwVSkpKQorICB7CisgICAgaWYgKGhzbWFydGNhcmQtPlR4SVNSICE9IE5VTEwpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+VHhJU1IoaHNtYXJ0Y2FyZCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFRyYW5zbWl0dGVyICh0cmFuc21pc3Npb24gZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoX19IQUxfU01BUlRDQVJEX0dFVF9JVChoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbikgIT0gUkVTRVQpCisgIHsKKyAgICBpZihfX0hBTF9TTUFSVENBUkRfR0VUX0lUX1NPVVJDRShoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbikgIT0gUkVTRVQpCisgICAgeworICAgICAgU01BUlRDQVJEX0VuZFRyYW5zbWl0X0lUKGhzbWFydGNhcmQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIFNNQVJUQ0FSRCBUWCBGaWZvIEVtcHR5IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEZFKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhGRUlFKSAhPSAwVSkpCisgIHsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgKi8KKyAgICBoc21hcnRjYXJkLT5UeEZpZm9FbXB0eUNhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgKi8KKyAgICBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNNQVJUQ0FSRCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYRkYpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWEZGSUUpICE9IDBVKSkKKyAgeworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggRmlmbyBGdWxsIENhbGxiYWNrICovCisgICAgaHNtYXJ0Y2FyZC0+UnhGaWZvRnVsbENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIEhBTF9TTUFSVENBUkRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU01BUlRDQVJEIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21hcnRjYXJkKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUFSVENBUkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFNNQVJUQ0FSRCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byByZXR1cm4gdGhlIFN0YXRlIG9mIFNtYXJ0Q2FyZAorICAgIGhhbmRsZSBhbmQgYWxzbyByZXR1cm4gUGVyaXBoZXJhbCBFcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGNvbW11bmljYXRpb24gcHJvY2VzcworICAgICAoKykgSEFMX1NNQVJUQ0FSRF9HZXRTdGF0ZSgpIEFQSSBjYW4gYmUgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUKKyAgICAgICAgIG9mIHRoZSBTTUFSVENBUkQgcGVyaXBoZXJhbC4KKyAgICAgKCspIEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoKSBjaGVja3MgaW4gcnVuLXRpbWUgZXJyb3JzIHRoYXQgY291bGQgb2NjdXIgZHVyaW5nCisgICAgICAgICBjb21tdW5pY2F0aW9uLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgU01BUlRDQVJEIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBTTUFSVENBUkQgaGFuZGxlIHN0YXRlCisgICovCitIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBSZXR1cm4gU01BUlRDQVJEIGhhbmRsZSBzdGF0ZSAqLworICB1aW50MzJfdCB0ZW1wMSwgdGVtcDI7CisgIHRlbXAxID0gKHVpbnQzMl90KWhzbWFydGNhcmQtPmdTdGF0ZTsKKyAgdGVtcDIgPSAodWludDMyX3QpaHNtYXJ0Y2FyZC0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9TTUFSVENBUkRfU3RhdGVUeXBlRGVmKSh0ZW1wMSB8IHRlbXAyKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNNQVJUQ0FSRCBoYW5kbGUgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBTTUFSVENBUkQgaGFuZGxlIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9TTUFSVENBUkRfR2V0RXJyb3IoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHJldHVybiBoc21hcnRjYXJkLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfRnVuY3Rpb25zIFNNQVJUQ0FSRCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcmV0dmFsIG5vbmUKKyAgKi8KK3ZvaWQgU01BUlRDQVJEX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIEluaXQgdGhlIFNNQVJUQ0FSRCBDYWxsYmFjayBzZXR0aW5ncyAqLworICBoc21hcnRjYXJkLT5UeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1NNQVJUQ0FSRF9UeENwbHRDYWxsYmFjazsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICBoc21hcnRjYXJkLT5BYm9ydENwbHRDYWxsYmFjayAgICAgICAgID0gSEFMX1NNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGhzbWFydGNhcmQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgPSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICBoc21hcnRjYXJkLT5SeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgID0gSEFMX1NNQVJUQ0FSREV4X1J4Rmlmb0Z1bGxDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovCisgIGhzbWFydGNhcmQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgPSBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKworfQorI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1NldENvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworICBTTUFSVENBUkRfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOworICBIQUxfU3RhdHVzVHlwZURlZiByZXQgICAgICAgICAgICAgICAgICAgID0gSEFMX09LOworICBjb25zdCB1aW50MTZfdCBTTUFSVENBUkRQcmVzY1RhYmxlWzEyXSA9IHsxVSwgMlUsIDRVLCA2VSwgOFUsIDEwVSwgMTJVLCAxNlUsIDMyVSwgNjRVLCAxMjhVLCAyNTZVfTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQkFVRFJBVEUoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1dPUkRfTEVOR1RIKGhzbWFydGNhcmQtPkluaXQuV29yZExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1NUT1BCSVRTKGhzbWFydGNhcmQtPkluaXQuU3RvcEJpdHMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9QQVJJVFkoaHNtYXJ0Y2FyZC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9NT0RFKGhzbWFydGNhcmQtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX1BPTEFSSVRZKGhzbWFydGNhcmQtPkluaXQuQ0xLUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9QSEFTRShoc21hcnRjYXJkLT5Jbml0LkNMS1BoYXNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfTEFTVEJJVChoc21hcnRjYXJkLT5Jbml0LkNMS0xhc3RCaXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9PTkVfQklUX1NBTVBMRShoc21hcnRjYXJkLT5Jbml0Lk9uZUJpdFNhbXBsaW5nKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfTkFDSyhoc21hcnRjYXJkLT5Jbml0Lk5BQ0tFbmFibGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9USU1FT1VUKGhzbWFydGNhcmQtPkluaXQuVGltZU91dEVuYWJsZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FVVE9SRVRSWV9DT1VOVChoc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50KSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQ0xPQ0tQUkVTQ0FMRVIoaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBJbiBTbWFydENhcmQgbW9kZSwgTSBhbmQgUENFIGFyZSBmb3JjZWQgdG8gMSAoOCBiaXRzICsgcGFyaXR5KS4KKyAgICogT3ZlcnNhbXBsaW5nIGlzIGZvcmNlZCB0byAxNiAoT1ZFUjggPSAwKS4KKyAgICogQ29uZmlndXJlIHRoZSBQYXJpdHkgYW5kIE1vZGU6CisgICAqICBzZXQgUFMgYml0IGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB2YWx1ZQorICAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0Lk1vZGUgdmFsdWUgKi8KKyAgdG1wcmVnID0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB8IGhzbWFydGNhcmQtPkluaXQuTW9kZTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5Xb3JkTGVuZ3RoIHwgaHNtYXJ0Y2FyZC0+Rmlmb01vZGU7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdG1wcmVnID0gaHNtYXJ0Y2FyZC0+SW5pdC5TdG9wQml0czsKKyAgLyogU3luY2hyb25vdXMgbW9kZSBpcyBhY3RpdmF0ZWQgYnkgZGVmYXVsdCAqLworICB0bXByZWcgfD0gKHVpbnQzMl90KSBVU0FSVF9DUjJfQ0xLRU4gfCBoc21hcnRjYXJkLT5Jbml0LkNMS1BvbGFyaXR5OworICB0bXByZWcgfD0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LkNMS1BoYXNlIHwgaHNtYXJ0Y2FyZC0+SW5pdC5DTEtMYXN0Qml0OworICB0bXByZWcgfD0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRFbmFibGU7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUKKyAgICogICBhY2NvcmRpbmcgdG8gaHNtYXJ0Y2FyZC0+SW5pdC5PbmVCaXRTYW1wbGluZworICAgKiAtIE5BQ0sgdHJhbnNtaXNzaW9uIGluIGNhc2Ugb2YgcGFyaXR5IGVycm9yIGFjY29yZGluZworICAgKiAgIHRvIGhzbWFydGNhcmQtPkluaXQuTkFDS0VuYWJsZQorICAgKiAtIGF1dG9yZXRyeSBjb3VudGVyIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50ICovCisKKyAgdG1wcmVnID0gKHVpbnQzMl90KSBoc21hcnRjYXJkLT5Jbml0Lk9uZUJpdFNhbXBsaW5nIHwgaHNtYXJ0Y2FyZC0+SW5pdC5OQUNLRW5hYmxlOworICB0bXByZWcgfD0gKCh1aW50MzJfdCloc21hcnRjYXJkLT5Jbml0LkF1dG9SZXRyeUNvdW50IDw8IFVTQVJUX0NSM19TQ0FSQ05UX1Bvcyk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUFSVENBUkQgY2xvY2sgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICogLSBTTUFSVENBUkQgQ2xvY2sgUHJlc2NhbGVyOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBoc21hcnRjYXJkLT5Jbml0LkNsb2NrUHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlBSRVNDLCBVU0FSVF9QUkVTQ19QUkVTQ0FMRVIsIGhzbWFydGNhcmQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bXByZWcgPSAoaHNtYXJ0Y2FyZC0+SW5pdC5QcmVzY2FsZXIgfCAoKHVpbnQzMl90KWhzbWFydGNhcmQtPkluaXQuR3VhcmRUaW1lIDw8IFVTQVJUX0dUUFJfR1RfUG9zKSk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkdUUFIsIChVU0FSVF9HVFBSX0dUIHwgVVNBUlRfR1RQUl9QU0MpLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgUlRPUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB0bXByZWcgPSAoKHVpbnQzMl90KWhzbWFydGNhcmQtPkluaXQuQmxvY2tMZW5ndGggPDwgVVNBUlRfUlRPUl9CTEVOX1Bvcyk7CisgIGlmIChoc21hcnRjYXJkLT5Jbml0LlRpbWVPdXRFbmFibGUgPT0gU01BUlRDQVJEX1RJTUVPVVRfRU5BQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKGhzbWFydGNhcmQtPkluaXQuVGltZU91dFZhbHVlKSk7CisgICAgdG1wcmVnIHw9ICh1aW50MzJfdCkgaHNtYXJ0Y2FyZC0+SW5pdC5UaW1lT3V0VmFsdWU7CisgIH0KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+UlRPUiwgKFVTQVJUX1JUT1JfUlRPIHwgVVNBUlRfUlRPUl9CTEVOKSwgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgU01BUlRDQVJEX0dFVENMT0NLU09VUkNFKGhzbWFydGNhcmQsIGNsb2Nrc291cmNlKTsKKyAgdG1wcmVnID0gICAwVTsKKyAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgeworICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsyOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgoKEhBTF9SQ0NfR2V0UENMSzJGcmVxKCkgLyBTTUFSVENBUkRQcmVzY1RhYmxlW2hzbWFydGNhcmQtPkluaXQuQ2xvY2tQcmVzY2FsZXJdKSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlIC8gMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgoKEhTSV9WQUxVRSAvIFNNQVJUQ0FSRFByZXNjVGFibGVbaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcl0pICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9TWVNDTEs6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKCgoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSAvIFNNQVJUQ0FSRFByZXNjVGFibGVbaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcl0pICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0U6CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKCgodWludDE2X3QpKExTRV9WQUxVRSAvIFNNQVJUQ0FSRFByZXNjVGFibGVbaHNtYXJ0Y2FyZC0+SW5pdC5DbG9ja1ByZXNjYWxlcl0pICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBVU0FSVERJViBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwZDE2ICovCisgIGlmICgodG1wcmVnID49IFVTQVJUX0JSUl9NSU4pICYmICh0bXByZWcgPD0gVVNBUlRfQlJSX01BWCkpCisgIHsKKyAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+QlJSID0gdG1wcmVnOworICB9CisgIGVsc2UKKyAgeworICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgaHNtYXJ0Y2FyZC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgaHNtYXJ0Y2FyZC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAxVTsKKworICAvKiBDbGVhciBJU1IgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhJU1IgICA9IE5VTEw7CisgIGhzbWFydGNhcmQtPlR4SVNSICAgPSBOVUxMOworCisgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgcGVyaXBoZXJhbCBhZHZhbmNlZCBmZWF0dXJlcy4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0FkdkZlYXR1cmVDb25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9JTklUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCkpOworCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgVFggcGluIGFjdGl2ZSBsZXZlbCBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfVFhJTlYoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9UWElOViwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVkVSVF9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9SWElOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JYSU5WLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIGRhdGEgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX0RBVEFJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfREFUQUlOVihoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRGF0YUludmVydCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0RBVEFJTlYsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5EYXRhSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlgvVFggcGlucyBzd2FwICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1NXQVBfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfU1dBUChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuU3dhcCkpOworICAgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NXQVAsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5Td2FwKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFNNQVJUQ0FSRF9BRFZGRUFUVVJFX1JYT1ZFUlJVTkRJU0FCTEVfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX09WRVJSVU4oaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuT3ZlcnJ1bkRpc2FibGUpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBETUEgZGlzYWJsaW5nIG9uIHJlY2VwdGlvbiBlcnJvciAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9ETUFESVNBQkxFT05FUlJPUl9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfQURWRkVBVFVSRV9ETUFPTlJYRVJST1IoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpKTsKKyAgICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ERFJFLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuRE1BRGlzYWJsZW9uUnhFcnJvcik7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0FEVkZFQVRVUkVfTVNCRklSU1QoaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0Lk1TQkZpcnN0KSk7CisgICAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5NU0JGaXJzdCk7CisgIH0KKworfQorCisvKioKKyAgKiBAYnJpZWYgQ2hlY2sgdGhlIFNNQVJUQ0FSRCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgU01BUlRDQVJEIEVycm9yQ29kZSAqLworICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCAqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIENoZWNrIGlmIHRoZSBUcmFuc21pdHRlciBpcyBlbmFibGVkICovCisgIGlmICgoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBVU0FSVF9JU1JfVEVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYXJ0Y2FyZCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBTTUFSVENBUkRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBTTUFSVENBUkQgc3RhdGVzICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUFSVENBUkQgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIFRoZSBuZXcgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQoreworICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCisgIHdoaWxlICgoX19IQUxfU01BUlRDQVJEX0dFVF9GTEFHKGhzbWFydGNhcmQsIEZsYWcpID8gU0VUIDogUkVTRVQpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICAgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gU01BUlRDQVJEIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgVHJhbnNtaXQgY29tcGxldGlvbikuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0VuZFR4VHJhbnNmZXIoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUgfCBVU0FSVF9DUjFfVENJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmQgb25nb2luZyBSeCB0cmFuc2ZlciBvbiBVQVJUIHBlcmlwaGVyYWwgKGZvbGxvd2luZyBlcnJvciBkZXRlY3Rpb24gb3IgUmVjZXB0aW9uIGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgaW4gdGhlIFNNQVJUQ0FSRCBhc3NvY2lhdGVkIFVTQVJUIENSMyByZWdpc3RlciAqLworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9TTUFSVENBUkRfRU5BQkxFX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKTsKK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgUG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkID0gKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICBpbiB0aGUgU01BUlRDQVJEIGFzc29jaWF0ZWQgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBQb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBTdG9wIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgICAgICBTTUFSVENBUkRfRW5kVHhUcmFuc2Zlcihoc21hcnRjYXJkKTsKKyAgICB9CisgIH0KKworICAvKiBTdG9wIFNNQVJUQ0FSRCBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICAgIFNNQVJUQ0FSRF9FbmRSeFRyYW5zZmVyKGhzbWFydGNhcmQpOworICAgIH0KKyAgfQorCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSB8PSBIQUxfU01BUlRDQVJEX0VSUk9SX0RNQTsKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkVycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNNQVJUQ0FSRCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKyAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQgPSAwVTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+RXJyb3JDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgdXNlciBlcnJvciBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkFib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkFib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCit9CisKKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQgQVBJIChBYm9ydCBvbmx5IFR4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFR4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQgPSAoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBoc21hcnRjYXJkLT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU01BUlRDQVJEIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIgYnkgYSBjYWxsIHRvCisgICogICAgICAgICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZV9JVCBBUEkgKEFib3J0IG9ubHkgUnggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgUnggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCA9IChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX0NMRUFSX09SRUYgfCBTTUFSVENBUkRfQ0xFQVJfTkVGIHwgU01BUlRDQVJEX0NMRUFSX1BFRiB8IFNNQVJUQ0FSRF9DTEVBUl9GRUYgfCBTTUFSVENBUkRfQ0xFQVJfUlRPRiB8IFNNQVJUQ0FSRF9DTEVBUl9FT0JGKTsKKworICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgIGhzbWFydGNhcmQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfU01BUlRDQVJEX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhoc21hcnRjYXJkKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDSyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NNQVJUQ0FSRF9UcmFuc21pdF9JVCgpCisgICogICAgICAgICBhbmQgd2hlbiB0aGUgRklGTyBtb2RlIGlzIGRpc2FibGVkLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9UeElTUihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChoc21hcnRjYXJkLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgU01BUlRDQVJEIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVChoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpoc21hcnRjYXJkLT5wVHhCdWZmUHRyICYgMHhGRlUpOworICAgICAgaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0cisrOworICAgICAgaHNtYXJ0Y2FyZC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfSVQoKQorICAqICAgICAgICAgYW5kIHdoZW4gdGhlIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9UeElTUl9GSUZPRU4oU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQxNl90ICAgbmJfdHhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgZm9yIChuYl90eF9kYXRhID0gaHNtYXJ0Y2FyZC0+TmJUeERhdGFUb1Byb2Nlc3MgOyBuYl90eF9kYXRhID4gMFUgOyBuYl90eF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIFNNQVJUQ0FSRCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfU01BUlRDQVJEX0VOQUJMRV9JVChoc21hcnRjYXJkLCBoc21hcnRjYXJkLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbik7CisgICAgICB9CisgICAgICBlbHNlIGlmIChSRUFEX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+SVNSLCBVU0FSVF9JU1JfVFhFX1RYRk5GKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0ciAmIDB4RkZVKTsKKyAgICAgICAgaHNtYXJ0Y2FyZC0+cFR4QnVmZlB0cisrOworICAgICAgICBoc21hcnRjYXJkLT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JhcCB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01BUlRDQVJEX0VuZFRyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQoreworICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKTsKKworICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgIGlmIChoc21hcnRjYXJkLT5SeFN0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBTTUFSVENBUkQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IpICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICB9CisKKyAgLyogUmUtZW5hYmxlIFJ4IGF0IGVuZCBvZiB0cmFuc21pc3Npb24gaWYgaW5pdGlhbCBtb2RlIGlzIFJ4L1R4ICovCisgIGlmIChoc21hcnRjYXJkLT5Jbml0Lk1vZGUgPT0gU01BUlRDQVJEX01PREVfVFhfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsIGZpcnN0IHRvIHVwZGF0ZSBtb2RlcyAqLworICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUpOworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JFKTsKKyAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRSk7CisgIH0KKworICAvKiBUeCBwcm9jZXNzIGlzIGVuZGVkLCByZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgIC8qIENsZWFyIFR4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNtYXJ0Y2FyZC0+VHhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgIEhBTF9TTUFSVENBUkRfVHhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TTUFSVENBUkRfUmVjZWl2ZV9JVCgpCisgICogICAgICAgICBhbmQgd2hlbiB0aGUgRklGTyBtb2RlIGlzIGRpc2FibGVkLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9SeElTUihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAqaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciA9ICh1aW50OF90KShoc21hcnRjYXJkLT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpMHhGRik7CisgICAgaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0cisrOworCisgICAgaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQtLTsKKyAgICBpZiAoaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgICAgICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9TTUFSVENBUkRfUnhDcGx0Q2FsbGJhY2soaHNtYXJ0Y2FyZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUFSVENBUkRfUkVHSVNURVJfQ0FMTEJBQ0sgKi8KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1NNQVJUQ0FSRF9TRU5EX1JFUShoc21hcnRjYXJkLCBTTUFSVENBUkRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoKQorICAqICAgICAgICAgYW5kIHdoZW4gdGhlIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSRF9SeElTUl9GSUZPRU4oU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQxNl90ICAgbmJfcnhfZGF0YTsKKyAgdWludDE2X3QgcnhkYXRhY291bnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHNtYXJ0Y2FyZC0+UnhTdGF0ZSA9PSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBmb3IgKG5iX3J4X2RhdGEgPSBoc21hcnRjYXJkLT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX3J4X2RhdGEgPiAwVSA7IG5iX3J4X2RhdGEtLSkKKyAgICB7CisgICAgICAqaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciA9ICh1aW50OF90KShoc21hcnRjYXJkLT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpMHhGRik7CisgICAgICBoc21hcnRjYXJkLT5wUnhCdWZmUHRyKys7CisKKyAgICAgIGhzbWFydGNhcmQtPlJ4WGZlckNvdW50LS07CisgICAgICBpZiAoaHNtYXJ0Y2FyZC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworCisgICAgICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdC4gSWYgbm90IGRpc2FibGUgRVJSIElUICovCisgICAgICAgIGlmIChoc21hcnRjYXJkLT5nU3RhdGUgPT0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU01BUlRDQVJEIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhzbWFydGNhcmQtPlJ4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2Vsc2UKKyAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKGhzbWFydGNhcmQpOworI2VuZGlmIC8qIFVTRV9IQUxfU01BUlRDQVJEX1JFR0lTVEVSX0NBTExCQUNLICovCisgICAgICB9CisgICAgfQorCisgICAgLyogV2hlbiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIHRoZSBSWCBGSUZPCisgICAgdGhyZXNob2xkLCBuZXh0IGluY29taW5nIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGFzIGlmIEZJRk8gbW9kZSB3YXMKKyAgICBkaXNhYmxlZCAoaS5lLiBvbmUgaW50ZXJydXB0IHBlciByZWNlaXZlZCBmcmFtZSkuCisgICAgKi8KKyAgICByeGRhdGFjb3VudCA9IGhzbWFydGNhcmQtPlJ4WGZlckNvdW50OworICAgIGlmICgoKHJ4ZGF0YWNvdW50ICE9IDBVKSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHNtYXJ0Y2FyZC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgUlhGVCBpbnRlcnJ1cHQqLworICAgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworCisgICAgICAvKiBVcGRhdGUgdGhlIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGhzbWFydGNhcmQtPlJ4SVNSID0gU01BUlRDQVJEX1J4SVNSOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9TTUFSVENBUkRfU0VORF9SRVEoaHNtYXJ0Y2FyZCwgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3NtYXJ0Y2FyZF9leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfc21hcnRjYXJkX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYWMzMwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3NtYXJ0Y2FyZF9leC5jCkBAIC0wLDAgKzEsNDk0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9zbWFydGNhcmRfZXguYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgU01BUlRDQVJEIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBleHRlbmRlZCBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKKyAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFNtYXJ0Q2FyZC4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAjIyMjIyBTTUFSVENBUkQgcGVyaXBoZXJhbCBleHRlbmRlZCBmZWF0dXJlcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICBUaGUgRXh0ZW5kZWQgU01BUlRDQVJEIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBBZnRlciBoYXZpbmcgY29uZmlndXJlZCB0aGUgU01BUlRDQVJEIGJhc2ljIGZlYXR1cmVzIHdpdGggSEFMX1NNQVJUQ0FSRF9Jbml0KCksCisgICAgICAgIHRoZW4gcHJvZ3JhbSBTTUFSVENBUkQgYWR2YW5jZWQgZmVhdHVyZXMgaWYgcmVxdWlyZWQgKFRYL1JYIHBpbnMgc3dhcCwgVGltZU91dCwKKyAgICAgICAgYXV0by1yZXRyeSBjb3VudGVyLC4uLikgaW4gdGhlIGhzbWFydGNhcmQgQWR2YW5jZWRJbml0IHN0cnVjdHVyZS4KKworICAgICgjKSBGSUZPIG1vZGUgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBSWC9UWCBGSUZPIHRocmVzaG9sZCBwcm9ncmFtbWluZy4KKworICAgICAgICAtQC0gV2hlbiBTTUFSVENBUkQgb3BlcmF0ZXMgaW4gRklGTyBtb2RlLCBGSUZPIG1vZGUgbXVzdCBiZSBlbmFibGVkIHByaW9yCisgICAgICAgICAgICBzdGFydGluZyBSWC9UWCB0cmFuc2ZlcnMuIEFsc28gUlgvVFggRklGTyB0aHJlc2hvbGRzIG11c3QgYmUKKyAgICAgICAgICAgIGNvbmZpZ3VyZWQgcHJpb3Igc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4IFNNQVJUQ0FSREV4CisgICogQGJyaWVmIFNNQVJUQ0FSRCBFeHRlbmRlZCBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisjaWZkZWYgSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFVBUlQgUlggRklGTyBkZXB0aCAqLworI2RlZmluZSBSWF9GSUZPX0RFUFRIIDhVCisKKy8qIFVBUlQgVFggRklGTyBkZXB0aCAqLworI2RlZmluZSBUWF9GSUZPX0RFUFRIIDhVCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSREV4X1NldE5iRGF0YVRvUHJvY2VzcyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X0V4cG9ydGVkX0Z1bmN0aW9ucyAgU01BUlRDQVJEIEV4dGVuZGVkIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBTTUFSVENBUkQuCisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKCkgQVBJIGFsbG93cyB0byBjb25maWd1cmUgdGhlIEJsb2NrIExlbmd0aCBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfVGltZU91dF9Db25maWcoKSBBUEkgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBvbiB0aGUgZmx5CisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfRW5hYmxlUmVjZWl2ZXJUaW1lT3V0KCkgQVBJIGVuYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X0Rpc2FibGVSZWNlaXZlclRpbWVPdXQoKSBBUEkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIFNNQVJUQ0FSRCBibG9jayBsZW5ndGggaW4gUlRPUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gQmxvY2tMZW5ndGggU01BUlRDQVJEIGJsb2NrIGxlbmd0aCAoOC1iaXQgbG9uZyBhdCBtb3N0KQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJERXhfQmxvY2tMZW5ndGhfQ29uZmlnKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90IEJsb2NrTGVuZ3RoKQoreworICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5SVE9SLCBVU0FSVF9SVE9SX0JMRU4sICgodWludDMyX3QpQmxvY2tMZW5ndGggPDwgVVNBUlRfUlRPUl9CTEVOX1BvcykpOworfQorCisvKioKKyAgKiBAYnJpZWYgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gUlRPUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIG1vZHVsZS4KKyAgKiBAcGFyYW0gVGltZU91dFZhbHVlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gbnVtYmVyIG9mIGJhdWQgYmxvY2tzLiBUaGUgdGltZW91dAorICAqICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbXVzdCBiZSBsZXNzIG9yIGVxdWFsIHRvIDB4MEZGRkZGRkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01BUlRDQVJERXhfVGltZU91dF9Db25maWcoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IFRpbWVPdXRWYWx1ZSkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQVJUQ0FSRF9USU1FT1VUX1ZBTFVFKGhzbWFydGNhcmQtPkluaXQuVGltZU91dFZhbHVlKSk7CisgIE1PRElGWV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPlJUT1IsIFVTQVJUX1JUT1JfUlRPLCBUaW1lT3V0VmFsdWUpOworfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIHRoZSBTTUFSVENBUkQgcmVjZWl2ZXIgdGltZW91dCBmZWF0dXJlLgorICAqIEBwYXJhbSBoc21hcnRjYXJkIFBvaW50ZXIgdG8gYSBTTUFSVENBUkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X0VuYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIFJUT0VOIGJpdCAqLworICAgIFNFVF9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1JUT0VOKTsKKworICAgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgdGhlIFNNQVJUQ0FSRCByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgUG9pbnRlciB0byBhIFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJERXhfRGlzYWJsZVJlY2VpdmVyVGltZU91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKworICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX0JVU1k7CisKKyAgICAvKiBDbGVhciB0aGUgVVNBUlQgUlRPRU4gYml0ICovCisgICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBoc21hcnRjYXJkLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBFeHRlbmRlZCBQZXJpcGhlcmFsIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBTTUFSVENBUkQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBGSUZPIG1vZGUgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMuCisKKyAgICAoIykgVFgvUlggRmlmb3MgQ2FsbGJhY2tzOgorICAgICAgICAoKykgSEFMX1NNQVJUQ0FSREV4X1J4Rmlmb0Z1bGxDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjaygpCisKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTTUFSVENBUkQgUlggRmlmbyBmdWxsIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSREV4X1J4Rmlmb0Z1bGxDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYXJ0Y2FyZCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUFSVENBUkRFeF9SeEZpZm9GdWxsQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQVJUQ0FSRCBUWCBGaWZvIGVtcHR5IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYXJ0Y2FyZCBQb2ludGVyIHRvIGEgU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUFSVENBUkQgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQVJUQ0FSREV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWFydGNhcmQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01BUlRDQVJERXhfVHhGaWZvRW1wdHlDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgUGVyaXBoZXJhbCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFNNQVJUQ0FSRCBjb250cm9sIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTTUFSVENBUkQuCisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfRW5hYmxlRmlmb01vZGUoKSBBUEkgZW5hYmxlcyB0aGUgRklGTyBtb2RlCisgICAgICgrKSBIQUxfU01BUlRDQVJERXhfRGlzYWJsZUZpZm9Nb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgVFggRklGTyB0aHJlc2hvbGQKKyAgICAgKCspIEhBTF9TTUFSVENBUkRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgUlggRklGTyB0aHJlc2hvbGQKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGSUZPIG1vZGUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9FbmFibGVGaWZvTW9kZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShoc21hcnRjYXJkLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFNNQVJUQ0FSRCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgU01BUlRDQVJEICovCisgIF9fSEFMX1NNQVJUQ0FSRF9ESVNBQkxFKGhzbWFydGNhcmQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgU0VUX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOworICBoc21hcnRjYXJkLT5GaWZvTW9kZSA9IFNNQVJUQ0FSRF9GSUZPTU9ERV9FTkFCTEU7CisKKyAgLyogUmVzdG9yZSBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgU01BUlRDQVJERXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGhzbWFydGNhcmQpOworCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNtYXJ0Y2FyZCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBGSUZPIG1vZGUuCisgICogQHBhcmFtIGhzbWFydGNhcmQgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRFeF9EaXNhYmxlRmlmb01vZGUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFNNQVJUQ0FSRCAqLworICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRShoc21hcnRjYXJkKTsKKworICAvKiBFbmFibGUgRklGTyBtb2RlICovCisgIENMRUFSX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOworICBoc21hcnRjYXJkLT5GaWZvTW9kZSA9IFNNQVJUQ0FSRF9GSUZPTU9ERV9ESVNBQkxFOworCisgIC8qIFJlc3RvcmUgU01BUlRDQVJEIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVFhGSUZPIHRocmVzaG9sZC4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCAgICAgIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHBhcmFtIFRocmVzaG9sZCAgVFggRklGTyB0aHJlc2hvbGQgdmFsdWUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9UWEZJRk9fVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X1NldFR4Rmlmb1RocmVzaG9sZChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfVFhGSUZPX1RIUkVTSE9MRChUaHJlc2hvbGQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFNNQVJUQ0FSRCAqLworICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRShoc21hcnRjYXJkKTsKKworICAvKiBVcGRhdGUgVFggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgU01BUlRDQVJERXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGhzbWFydGNhcmQpOworCisgIC8qIFJlc3RvcmUgU01BUlRDQVJEIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUsIHRtcGNyMSk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUlhGSUZPIHRocmVzaG9sZC4KKyAgKiBAcGFyYW0gaHNtYXJ0Y2FyZCAgICAgIFNNQVJUQ0FSRCBoYW5kbGUuCisgICogQHBhcmFtIFRocmVzaG9sZCAgUlggRklGTyB0aHJlc2hvbGQgdmFsdWUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFNNQVJUQ0FSRF9SWEZJRk9fVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSREV4X1NldFJ4Rmlmb1RocmVzaG9sZChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUFSVENBUkRfUlhGSUZPX1RIUkVTSE9MRChUaHJlc2hvbGQpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWFydGNhcmQpOworCisgIGhzbWFydGNhcmQtPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBTTUFSVENBUkQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFNNQVJUQ0FSRCAqLworICBfX0hBTF9TTUFSVENBUkRfRElTQUJMRShoc21hcnRjYXJkKTsKKworICAvKiBVcGRhdGUgUlggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgU01BUlRDQVJERXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGhzbWFydGNhcmQpOworCisgIC8qIFJlc3RvcmUgU01BUlRDQVJEIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUUsIHRtcGNyMSk7CisKKyAgaHNtYXJ0Y2FyZC0+Z1N0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21hcnRjYXJkKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X1ByaXZhdGVfRnVuY3Rpb25zICBTTUFSVENBUkQgRXh0ZW5kZWQgcHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAgKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20KKyAgKiAgICAgICB0aGUgVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtIGhzbWFydGNhcmQgU01BUlRDQVJEIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQVJUQ0FSREV4X1NldE5iRGF0YVRvUHJvY2VzcyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCkKK3sKKyAgdWludDhfdCByeF9maWZvX2RlcHRoOworICB1aW50OF90IHR4X2ZpZm9fZGVwdGg7CisgIHVpbnQ4X3QgcnhfZmlmb190aHJlc2hvbGQ7CisgIHVpbnQ4X3QgdHhfZmlmb190aHJlc2hvbGQ7CisgIC8qIDIgMFUvMVUgYWRkZWQgZm9yIE1JU1JBQzIwMTItUnVsZS0xOC4xX2IgYW5kIE1JU1JBQzIwMTItUnVsZS0xOC4xX2QgKi8KKyAgdWludDhfdCBudW1lcmF0b3JbXSAgID0gezFVLCAxVSwgMVUsIDNVLCA3VSwgMVUsIDBVLCAwVX07CisgIHVpbnQ4X3QgZGVub21pbmF0b3JbXSA9IHs4VSwgNFUsIDJVLCA0VSwgOFUsIDFVLCAxVSwgMVV9OworCisgIGlmIChoc21hcnRjYXJkLT5GaWZvTW9kZSA9PSBTTUFSVENBUkRfRklGT01PREVfRElTQUJMRSkKKyAgeworICAgIGhzbWFydGNhcmQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMVU7CisgICAgaHNtYXJ0Y2FyZC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByeF9maWZvX2RlcHRoID0gUlhfRklGT19ERVBUSDsKKyAgICB0eF9maWZvX2RlcHRoID0gVFhfRklGT19ERVBUSDsKKyAgICByeF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KShSRUFEX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRykgPj4gVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKTsKKyAgICB0eF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KShSRUFEX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKKyAgICBoc21hcnRjYXJkLT5OYlR4RGF0YVRvUHJvY2VzcyA9ICgodWludDE2X3QpdHhfZmlmb19kZXB0aCAqIG51bWVyYXRvclt0eF9maWZvX3RocmVzaG9sZF0pIC8gKHVpbnQxNl90KWRlbm9taW5hdG9yW3R4X2ZpZm9fdGhyZXNob2xkXTsKKyAgICBoc21hcnRjYXJkLT5OYlJ4RGF0YVRvUHJvY2VzcyA9ICgodWludDE2X3QpcnhfZmlmb19kZXB0aCAqIG51bWVyYXRvcltyeF9maWZvX3RocmVzaG9sZF0pIC8gKHVpbnQxNl90KWRlbm9taW5hdG9yW3J4X2ZpZm9fdGhyZXNob2xkXTsKKyAgfQorfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NNQVJUQ0FSRF9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfc21idXMuYyBiL1NyYy9zdG0zMndieHhfaGFsX3NtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3NmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3NtYnVzLmMKQEAgLTAsMCArMSwyNjczIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF9zbWJ1cy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTTUJVUyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBCdXMgKFNNQnVzKSBwZXJpcGhlcmFsLAorICAqICAgICAgICAgIGJhc2VkIG9uIEkyQyBwcmluY2lwbGVzIG9mIG9wZXJhdGlvbiA6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIFNNQlVTIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgU01CVVNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgU01CVVNfSGFuZGxlVHlwZURlZiAgaHNtYnVzOworCisgICAgKCMpSW5pdGlhbGl6ZSB0aGUgU01CVVMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEByZWYgSEFMX1NNQlVTX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBTTUJVU3ggaW50ZXJmYWNlIGNsb2NrCisgICAgICAgICgjIykgU01CVVMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU01CVVMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBTTUJVUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBvcGVuLWRyYWluCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTTUJVU3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU01CVVMgSVJRIENoYW5uZWwKKworICAgICgjKSBDb25maWd1cmUgdGhlIENvbW11bmljYXRpb24gQ2xvY2sgVGltaW5nLCBCdXMgVGltZW91dCwgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLAorICAgICAgICBEdWFsIEFkZHJlc3NpbmcgbW9kZSwgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsLCBOb3N0cmV0Y2ggbW9kZSwKKyAgICAgICAgUGVyaXBoZXJhbCBtb2RlIGFuZCBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpbiB0aGUgaHNtYnVzIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIFNNQlVTIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBAcmVmIEhBTF9TTUJVU19Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoZXNlIEFQSSdzIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBAcmVmIEhBTF9TTUJVU19Nc3BJbml0KCZoc21idXMpIEFQSS4KKworICAgICgjKSBUbyBjaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLCB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBTTUJVUyBJTyBvcGVyYXRpb25zLCBvbmx5IG9uZSBtb2RlIG9mIG9wZXJhdGlvbnMgaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlcgorCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKyspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9TTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyL2hvc3QgU01CVVMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEByZWYgSEFMX1NNQlVTX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKyspIFRoZSBhc3NvY2lhdGVkIHByZXZpb3VzIHRyYW5zZmVyIGNhbGxiYWNrIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGFib3J0IHByb2Nlc3MKKyAgICAgICgrKykgbWVhbiBAcmVmIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGluIGNhc2Ugb2YgcHJldmlvdXMgc3RhdGUgd2FzIG1hc3RlciB0cmFuc21pdAorICAgICAgKCsrKSBtZWFuIEByZWYgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHJlY2VpdmUKKyAgICAgICgrKSBFbmFibGUvZGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBpbiBzbGF2ZS9kZXZpY2Ugb3IgaG9zdC9zbGF2ZSBTTUJVUyBtb2RlCisgICAgICAgICAgIHVzaW5nIEByZWYgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpIEByZWYgSEFMX1NNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgKCsrKSBXaGVuIGFkZHJlc3Mgc2xhdmUvZGV2aWNlIFNNQlVTIG1hdGNoLCBAcmVmIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3Rlci9ob3N0IChXcml0ZS9SZWFkKS4KKyAgICAgICgrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEByZWYgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlL2RldmljZSBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgU01CVVMgYWxlcnQgbW9kZSB1c2luZyBAcmVmIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVCgpIEByZWYgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVCgpCisgICAgICAoKyspIFdoZW4gU01CVVMgQWxlcnQgaXMgZ2VuZXJhdGVkIEByZWYgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBBbGVydCBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0dldEVycm9yKCkKKyAgICAgICgrKSBHZXQgSEFMIHN0YXRlIG1hY2hpbmUgb3IgZXJyb3IgdmFsdWVzIHVzaW5nIEByZWYgSEFMX1NNQlVTX0dldFN0YXRlKCkgb3IgQHJlZiBIQUxfU01CVVNfR2V0RXJyb3IoKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEByZWYgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX0dldEVycm9yKCkKKworICAgICAqKiogU01CVVMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTTUJVUyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19FTkFCTEU6ICAgICAgRW5hYmxlIHRoZSBTTUJVUyBwZXJpcGhlcmFsCisgICAgICAoKykgQHJlZiBfX0hBTF9TTUJVU19ESVNBQkxFOiAgICAgRGlzYWJsZSB0aGUgU01CVVMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfR0VUX0ZMQUc6ICAgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTTUJVUyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBAcmVmIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUc6ICBDbGVhciB0aGUgc3BlY2lmaWVkIFNNQlVTIHBlbmRpbmcgZmxhZworICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfRU5BQkxFX0lUOiAgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFNNQlVTIGludGVycnVwdAorICAgICAgKCspIEByZWYgX19IQUxfU01CVVNfRElTQUJMRV9JVDogIERpc2FibGUgdGhlIHNwZWNpZmllZCBTTUJVUyBpbnRlcnJ1cHQKKworICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgb3IgQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQorICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICAgWy4uXQorICAgICBGdW5jdGlvbiBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVUeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVSeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTGlzdGVuQ3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgZW5kIG9mIGxpc3RlbiBtb2RlLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgWy4uXQorICAgICBGb3Igc3BlY2lmaWMgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2suCisgICAgWy4uXQorICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgd2VhayBmdW5jdGlvbi4KKyAgICAgQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgWy4uXQorICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckFkZHJDYWxsYmFjay4KKyAgICBbLi5dCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9TTUJVU19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVAorICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgIGV4YW1wbGVzIEByZWYgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKS8gQHJlZiBIQUxfU01CVVNfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKS8gQHJlZiBIQUxfU01CVVNfRGVJbml0KCkKKyAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisgICAgWy4uXQorICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0kyQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICB1c2luZyBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfU01CVVNfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfU01CVVNfSW5pdCgpIGZ1bmN0aW9uLgorICAgIFsuLl0KKyAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIFNNQlVTIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTIFNNQlVTCisgICogQGJyaWVmIFNNQlVTIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU01CVVNfUHJpdmF0ZV9EZWZpbmUgU01CVVMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1JTkdfQ0xFQVJfTUFTSyAgICgweEYwRkZGRkZGVUwpICAgICAvKiE8IFNNQlVTIFRJTUlORyBjbGVhciByZWdpc3RlciBNYXNrICovCisjZGVmaW5lIEhBTF9USU1FT1VUX0FERFIgICAgKDEwMDAwVSkgICAgICAgICAgIC8qITwgMTAgcyAgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfQlVTWSAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9ESVIgICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1JYTkUgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfU1RPUEYgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9UQyAgICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1RDUiAgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfVFhJUyAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBNQVhfTkJZVEVfU0laRSAgICAgIDI1NVUKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0KTsKKworc3RhdGljIHZvaWQgU01CVVNfRW5hYmxlX0lSUShzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IEludGVycnVwdFJlcXVlc3QpOworc3RhdGljIHZvaWQgU01CVVNfRGlzYWJsZV9JUlEoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBJbnRlcnJ1cHRSZXF1ZXN0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19NYXN0ZXJfSVNSKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX1NsYXZlX0lTUihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQzMl90IFN0YXR1c0ZsYWdzKTsKKworc3RhdGljIHZvaWQgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKworc3RhdGljIHZvaWQgU01CVVNfSVRFcnJvckhhbmRsZXIoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKTsKKworc3RhdGljIHZvaWQgU01CVVNfVHJhbnNmZXJDb25maWcoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCAgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCBTaXplLCB1aW50MzJfdCBNb2RlLCB1aW50MzJfdCBSZXF1ZXN0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zIFNNQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgYW5kCisgICAgICAgICAgZGVpbml0aWFsaXplIHRoZSBTTUJVU3ggcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBJbXBsZW1lbnQgSEFMX1NNQlVTX01zcEluaXQoKSBmdW5jdGlvbiBpbiB3aGljaCBoZSBjb25maWd1cmVzCisgICAgICAgICAgYWxsIHJlbGF0ZWQgcGVyaXBoZXJhbHMgcmVzb3VyY2VzIChDTE9DSywgR1BJTywgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TTUJVU19Jbml0KCkgdG8gY29uZmlndXJlIHRoZSBzZWxlY3RlZCBkZXZpY2Ugd2l0aAorICAgICAgICAgIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uOgorICAgICAgICAoKyspIENsb2NrIFRpbWluZworICAgICAgICAoKyspIEJ1cyBUaW1lb3V0CisgICAgICAgICgrKykgQW5hbG9nIEZpbGVyIG1vZGUKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAxCisgICAgICAgICgrKykgQWRkcmVzc2luZyBtb2RlIChNYXN0ZXIsIFNsYXZlKQorICAgICAgICAoKyspIER1YWwgQWRkcmVzc2luZyBtb2RlCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMgorICAgICAgICAoKyspIE93biBBZGRyZXNzIDIgTWFzaworICAgICAgICAoKyspIEdlbmVyYWwgY2FsbCBtb2RlCisgICAgICAgICgrKykgTm9zdHJldGNoIG1vZGUKKyAgICAgICAgKCsrKSBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZQorICAgICAgICAoKyspIFBlcmlwaGVyYWwgbW9kZQorCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfU01CVVNfRGVJbml0KCkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICAgICAgb2YgdGhlIHNlbGVjdGVkIFNNQlVTeCBwZXJpcGhlcmFsLgorCisgICAgICAoKykgRW5hYmxlL0Rpc2FibGUgQW5hbG9nL0RpZ2l0YWwgZmlsdGVycyB3aXRoIEhBTF9TTUJVU19Db25maWdBbmFsb2dGaWx0ZXIoKSBhbmQKKyAgICAgICAgICBIQUxfU01CVVNfQ29uZmlnRGlnaXRhbEZpbHRlcigpLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNNQlVTIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIHRoZSBTTUJVU19Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19Jbml0KFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogQ2hlY2sgdGhlIFNNQlVTIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChoc21idXMgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUxMX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FOQUxPR19GSUxURVIoaHNtYnVzLT5Jbml0LkFuYWxvZ0ZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfT1dOX0FERFJFU1MxKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUREUkVTU0lOR19NT0RFKGhzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfRFVBTF9BRERSRVNTKGhzbWJ1cy0+SW5pdC5EdWFsQWRkcmVzc01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX09XTl9BRERSRVNTMihoc21idXMtPkluaXQuT3duQWRkcmVzczIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX09XTl9BRERSRVNTMl9NQVNLKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19HRU5FUkFMX0NBTEwoaHNtYnVzLT5Jbml0LkdlbmVyYWxDYWxsTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfTk9fU1RSRVRDSChoc21idXMtPkluaXQuTm9TdHJldGNoTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfUEVDKGhzbWJ1cy0+SW5pdC5QYWNrZXRFcnJvckNoZWNrTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfUEVSSVBIRVJBTF9NT0RFKGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSkpOworCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoc21idXMtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJUeENwbHRDYWxsYmFjayAqLworICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclJ4Q3BsdENhbGxiYWNrICovCisgICAgaHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrICA9IEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgU2xhdmVUeENwbHRDYWxsYmFjayAgKi8KKyAgICBoc21idXMtPlNsYXZlUnhDcGx0Q2FsbGJhY2sgID0gSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBTbGF2ZVJ4Q3BsdENhbGxiYWNrICAqLworICAgIGhzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrICAgPSBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIExpc3RlbkNwbHRDYWxsYmFjayAgICovCisgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrICAgICAgICA9IEhBTF9TTUJVU19FcnJvckNhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICBoc21idXMtPkFkZHJDYWxsYmFjayAgICAgICAgID0gSEFMX1NNQlVTX0FkZHJDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBZGRyQ2FsbGJhY2sgICAgICAgICAqLworCisgICAgaWYgKGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCisgICAgaHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBIQUxfU01CVVNfTXNwSW5pdChoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU01CVVMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9TTUJVU19ESVNBQkxFKGhzbWJ1cyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBUSU1JTkdSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogRnJlcXVlbmN5IHJhbmdlICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPlRJTUlOR1IgPSBoc21idXMtPkluaXQuVGltaW5nICYgVElNSU5HX0NMRUFSX01BU0s7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBUSU1FT1VUUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBTTUJVU3g6IEJ1cyBUaW1lb3V0ICAqLworICBoc21idXMtPkluc3RhbmNlLT5USU1FT1VUUiAmPSB+STJDX1RJTUVPVVRSX1RJTU9VVEVOOworICBoc21idXMtPkluc3RhbmNlLT5USU1FT1VUUiAmPSB+STJDX1RJTUVPVVRSX1RFWFRFTjsKKyAgaHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgPSBoc21idXMtPkluaXQuU01CdXNUaW1lb3V0OworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggT0FSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogT3duIEFkZHJlc3MxIGFuZCBhY2sgb3duIGFkZHJlc3MxIG1vZGUgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMSAmPSB+STJDX09BUjFfT0ExRU47CisKKyAgaWYgKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSAhPSAwVUwpCisgIHsKKyAgICBpZiAoaHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQpCisgICAgeworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMSA9IChJMkNfT0FSMV9PQTFFTiB8IGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgICAgfQorICAgIGVsc2UgLyogU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQgKi8KKyAgICB7CisgICAgICBoc21idXMtPkluc3RhbmNlLT5PQVIxID0gKEkyQ19PQVIxX09BMUVOIHwgSTJDX09BUjFfT0ExTU9ERSB8IGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMSk7CisgICAgfQorICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBBZGRyZXNzaW5nIE1hc3RlciBtb2RlICovCisgIGlmIChoc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUgPT0gU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQpCisgIHsKKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgPSAoSTJDX0NSMl9BREQxMCk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBBVVRPRU5EIGJ5IGRlZmF1bHQsIGFuZCBlbmFibGUgTkFDSyAoc2hvdWxkIGJlIGRpc2FibGUgb25seSBkdXJpbmcgU2xhdmUgcHJvY2VzcykgKi8KKyAgLyogQVVUT0VORCBhbmQgTkFDSyBiaXQgd2lsbCBiZSBtYW5hZ2UgZHVyaW5nIFRyYW5zZmVyIHByb2Nlc3MgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IChJMkNfQ1IyX0FVVE9FTkQgfCBJMkNfQ1IyX05BQ0spOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTUJVU3ggT0FSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIFNNQlVTeDogRHVhbCBtb2RlIGFuZCBPd24gQWRkcmVzczIgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+T0FSMiA9IChoc21idXMtPkluaXQuRHVhbEFkZHJlc3NNb2RlIHwgaHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyIHwgKGhzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMk1hc2tzIDw8IDhVKSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNNQlVTeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgU01CVVN4OiBHZW5lcmFsY2FsbCBhbmQgTm9TdHJldGNoIG1vZGUgKi8KKyAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxID0gKGhzbWJ1cy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUgfCBoc21idXMtPkluaXQuTm9TdHJldGNoTW9kZSB8IGhzbWJ1cy0+SW5pdC5QYWNrZXRFcnJvckNoZWNrTW9kZSB8IGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSB8IGhzbWJ1cy0+SW5pdC5BbmFsb2dGaWx0ZXIpOworCisgIC8qIEVuYWJsZSBTbGF2ZSBCeXRlIENvbnRyb2wgb25seSBpbiBjYXNlIG9mIFBhY2tldCBFcnJvciBDaGVjayBpcyBlbmFibGVkIGFuZCBTTUJVUyBQZXJpcGhlcmFsIGlzIHNldCBpbiBTbGF2ZSBtb2RlICovCisgIGlmICgoaHNtYnVzLT5Jbml0LlBhY2tldEVycm9yQ2hlY2tNb2RlID09IFNNQlVTX1BFQ19FTkFCTEUpCisgICAgICAmJiAoKGhzbWJ1cy0+SW5pdC5QZXJpcGhlcmFsTW9kZSA9PSBTTUJVU19QRVJJUEhFUkFMX01PREVfU01CVVNfU0xBVkUpIHx8IChoc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgPT0gU01CVVNfUEVSSVBIRVJBTF9NT0RFX1NNQlVTX1NMQVZFX0FSUCkpKQorICB7CisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEkyQ19DUjFfU0JDOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgU01CVVMgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0RlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIENoZWNrIHRoZSBTTUJVUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNtYnVzID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisKKyAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFNNQlVTIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfU01CVVNfTXNwRGVJbml0KGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSAgSEFMX1NNQlVTX1NUQVRFX1JFU0VUOworICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU01CVVMgTVNQLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTXNwSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFNNQlVTIE1TUC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01zcERlSW5pdChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgQW5hbG9nIG5vaXNlIGZpbHRlci4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgQW5hbG9nRmlsdGVyIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgU01CVVNfQU5BTE9HRklMVEVSX0VOQUJMRQorICAqICAgICAgICAgQGFyZyBAcmVmIFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgQW5hbG9nRmlsdGVyKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUxMX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FOQUxPR19GSUxURVIoQW5hbG9nRmlsdGVyKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgICAgLyogUmVzZXQgQU5PRkYgYml0ICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IxICY9IH4oSTJDX0NSMV9BTkZPRkYpOworCisgICAgLyogU2V0IGFuYWxvZyBmaWx0ZXIgYml0Ki8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgfD0gQW5hbG9nRmlsdGVyOworCisgICAgX19IQUxfU01CVVNfRU5BQkxFKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgRGlnaXRhbCBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERpZ2l0YWxGaWx0ZXIgQ29lZmZpY2llbnQgb2YgZGlnaXRhbCBub2lzZSBmaWx0ZXIgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDBGLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICB1aW50MzJfdCB0bXByZWc7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX0FMTF9JTlNUQU5DRShoc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TTUJVU19ESUdJVEFMX0ZJTFRFUihEaWdpdGFsRmlsdGVyKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX0JVU1k7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU01CVVNfRElTQUJMRShoc21idXMpOworCisgICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICB0bXByZWcgPSBoc21idXMtPkluc3RhbmNlLT5DUjE7CisKKyAgICAvKiBSZXNldCBJMkMgRE5GIGJpdHMgWzExOjhdICovCisgICAgdG1wcmVnICY9IH4oSTJDX0NSMV9ETkYpOworCisgICAgLyogU2V0IEkyQ3ggRE5GIGNvZWZmaWNpZW50ICovCisgICAgdG1wcmVnIHw9IERpZ2l0YWxGaWx0ZXIgPDwgSTJDX0NSMV9ETkZfUG9zOworCisgICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSA9IHRtcHJlZzsKKworICAgIF9fSEFMX1NNQlVTX0VOQUJMRShoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNNQlVTIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfUmVnaXN0ZXJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIEhBTF9TTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU01CVVNfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFQURZID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+U2xhdmVUeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TTUJVU19TVEFURV9SRVNFVCA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgU01CVVMgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19MSVNURU5fQ09NUExFVEVfQ0JfSUQgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgSEFMX1NNQlVTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKEhBTF9TTUJVU19TVEFURV9SRUFEWSA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE1hc3RlclR4Q3BsdENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJSeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBTbGF2ZVR4Q3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfU0xBVkVfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc21idXMtPlNsYXZlUnhDcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBTbGF2ZVJ4Q3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5MaXN0ZW5DcGx0Q2FsbGJhY2sgPSBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgTGlzdGVuQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrID0gSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NNQlVTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TTUJVU19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9TTUJVU19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoSEFMX1NNQlVTX1NUQVRFX1JFU0VUID09IGhzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU01CVVNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NNQlVTX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIHRoZSBTbGF2ZSBBZGRyZXNzIE1hdGNoIFNNQlVTIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIEFkZHJlc3MgTWF0Y2ggQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19SZWdpc3RlckFkZHJDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHBTTUJVU19BZGRyQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKEhBTF9TTUJVU19TVEFURV9SRUFEWSA9PSBoc21idXMtPlN0YXRlKQorICB7CisgICAgaHNtYnVzLT5BZGRyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVblJlZ2lzdGVyIHRoZSBTbGF2ZSBBZGRyZXNzIE1hdGNoIFNNQlVTIENhbGxiYWNrCisgICogICAgICAgICBJbmZvIFJlYWR5IFNNQlVTIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgSEFMX1NNQlVTX0FkZHJDYWxsYmFjaygpIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChIQUxfU01CVVNfU1RBVEVfUkVBRFkgPT0gaHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIGhzbWJ1cy0+QWRkckNhbGxiYWNrID0gSEFMX1NNQlVTX0FkZHJDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWRkckNhbGxiYWNrICAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBTTUJVUyBkYXRhCisgICAgdHJhbnNmZXJzLgorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGV2aWNlIGlzIHJlYWR5IGZvciB1c2FnZSBpcyA6CisgICAgICAgICgrKykgSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIFRoZXJlIGlzIG9ubHkgb25lIG1vZGUgb2YgdHJhbnNmZXI6CisgICAgICAgKCsrKSBOb24tQmxvY2tpbmcgbW9kZSA6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzLgorICAgICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBzdGFydHVwLgorICAgICAgICAgICAgVGhlIGVuZCBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIHdpbGwgYmUgaW5kaWNhdGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICBkZWRpY2F0ZWQgU01CVVMgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUuCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgZnVuY3Rpb25zIHdpdGggSW50ZXJydXB0IGFyZSA6CisgICAgICAgICgrKykgSEFMX1NNQlVTX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfU2xhdmVfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19TbGF2ZV9SZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRW5hYmxlTGlzdGVuX0lUKCkgb3IgYWxpYXMgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgICAoKyspIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQlVTX0Rpc2FibGVBbGVydF9JVCgpCisKKyAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBub24tQmxvY2tpbmcgbW9kZToKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfQWRkckNhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01CVVNfRXJyb3JDYWxsYmFjaygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgaW4gbWFzdGVyL2hvc3QgU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBJbiBjYXNlIG9mIFF1aWNrIGNvbW1hbmQsIHJlbW92ZSBhdXRvZW5kIG1vZGUgKi8KKyAgICAvKiBNYW5hZ2UgdGhlIHN0b3AgZ2VuZXJhdGlvbiBieSBzb2Z0d2FyZSAqLworICAgIGlmIChoc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyAmPSB+U01CVVNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIGlmIChTaXplID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIHNpemUgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA8IGhzbWJ1cy0+WGZlckNvdW50KSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSBNQVhfTkJZVEVfU0laRSkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBTTUJVU19SRUxPQURfTU9ERSB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSwgU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKworICAgICAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBYZmVyT3B0aW9ucywgbWlzcmEgcnVsZSAqLworICAgICAgdG1wID0gaHNtYnVzLT5YZmVyT3B0aW9uczsKKworICAgICAgaWYgKChoc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKSAmJiAoSVNfU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKHRtcCkgPT0gMCkpCisgICAgICB7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIC8qIEVsc2UgdHJhbnNmZXIgZGlyZWN0aW9uIGNoYW5nZSwgc28gZ2VuZXJhdGUgUmVzdGFydCB3aXRoIG5ldyB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICAgICAgLyogSGFuZGxlIFRyYW5zZmVyICovCisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUpOworICAgICAgfQorCisgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgbWFuYWdlIGJ5IFNXIHBhcnQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfUEVDX01PREUoaHNtYnVzKSAhPSAwVUwpCisgICAgICB7CisgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgaHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIG1hc3Rlci9ob3N0IFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfTWFzdGVyX1JlY2VpdmVfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYnVzLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKworICAgIC8qIEluIGNhc2Ugb2YgUXVpY2sgY29tbWFuZCwgcmVtb3ZlIGF1dG9lbmQgbW9kZSAqLworICAgIC8qIE1hbmFnZSB0aGUgc3RvcCBnZW5lcmF0aW9uIGJ5IHNvZnR3YXJlICovCisgICAgaWYgKGhzbWJ1cy0+cEJ1ZmZQdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJPcHRpb25zICY9IH5TTUJVU19BVVRPRU5EX01PREU7CisgICAgfQorCisgICAgaWYgKFNpemUgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZW5kIFNsYXZlIEFkZHJlc3MgKi8KKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgc2l6ZSA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKChoc21idXMtPlhmZXJTaXplIDwgaHNtYnVzLT5YZmVyQ291bnQpICYmIChoc21idXMtPlhmZXJTaXplID09IE1BWF9OQllURV9TSVpFKSkKKyAgICB7CisgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhzbWJ1cy0+WGZlclNpemUsIFNNQlVTX1JFTE9BRF9NT0RFICB8IChoc21idXMtPlhmZXJPcHRpb25zICYgU01CVVNfU0VORFBFQ19NT0RFKSwgU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0cmFuc2ZlciBkaXJlY3Rpb24gbm90IGNoYW5nZSwgZG8gbm90IGdlbmVyYXRlIFJlc3RhcnQgQ29uZGl0aW9uICovCisgICAgICAvKiBNZWFuIFByZXZpb3VzIHN0YXRlIGlzIHNhbWUgYXMgY3VycmVudCBzdGF0ZSAqLworCisgICAgICAvKiBTdG9yZSBjdXJyZW50IHZvbGF0aWxlIFhmZXJPcHRpb25zLCBNaXNyYSBydWxlICovCisgICAgICB0bXAgPSBoc21idXMtPlhmZXJPcHRpb25zOworCisgICAgICBpZiAoKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpICYmIChJU19TTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QodG1wKSA9PSAwKSkKKyAgICAgIHsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgfQorICAgICAgLyogRWxzZSB0cmFuc2ZlciBkaXJlY3Rpb24gY2hhbmdlLCBzbyBnZW5lcmF0ZSBSZXN0YXJ0IHdpdGggbmV3IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICAgICAgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaHNtYnVzKTsKKworICAgICAgICAvKiBIYW5kbGUgVHJhbnNmZXIgKi8KKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBTTUJVU19FbmFibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBhIG1hc3Rlci9ob3N0IFNNQlVTIHByb2Nlc3MgY29tbXVuaWNhdGlvbiB3aXRoIEludGVycnVwdC4KKyAgKiBAbm90ZSAgIFRoaXMgYWJvcnQgY2FuIGJlIGNhbGxlZCBvbmx5IGlmIHN0YXRlIGlzIHJlYWR5CisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19NYXN0ZXJfQWJvcnRfSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzKQoreworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIC8qIEtlZXAgdGhlIHNhbWUgc3RhdGUgYXMgcHJldmlvdXMgKi8KKyAgICAvKiB0byBwZXJmb3JtIGFzIHdlbGwgdGhlIGNhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW5kIG9mIHRyYW5zZmVyIGNhbGxiYWNrICovCisgICAgaWYgKGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICB9CisgICAgZWxzZSBpZiAoaHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3JvbmcgdXNhZ2Ugb2YgYWJvcnQgZnVuY3Rpb24gKi8KKyAgICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBpbiBjYXNlIG9mIGFib3J0IG1vbml0b3JlZCBieSBtYXN0ZXIgZGV2aWNlICovCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IE5CWVRFUyB0byAxIHRvIGdlbmVyYXRlIGEgZHVtbXkgcmVhZCBvbiBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgLyogU2V0IEFVVE9FTkQgbW9kZSwgdGhpcyB3aWxsIGdlbmVyYXRlIGEgTkFDSyB0aGVuIFNUT1AgY29uZGl0aW9uIHRvIGFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyICovCisgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAxLCBTTUJVU19BVVRPRU5EX01PREUsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgeworICAgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGluIHNsYXZlL2RldmljZSBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfT1BUSU9OU19SRVFVRVNUKFhmZXJPcHRpb25zKSk7CisKKyAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFVMKSkKKyAgICB7CisgICAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9JTlZBTElEX1BBUkFNOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEludGVycnVwdHMsIHRvIHByZXZlbnQgcHJlZW1wdGlvbiBkdXJpbmcgdHJlYXRtZW50IGluIGNhc2Ugb2YgbXVsdGljYWxsICovCisgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9BRERSIHwgU01CVVNfSVRfVFgpOworCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgICBoc21idXMtPlN0YXRlID0gKEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYIHwgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTik7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCBTQkMgYml0IHRvIG1hbmFnZSBBY2tub3dsZWRnZSBhdCBlYWNoIGJpdCAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBJMkNfQ1IxX1NCQzsKKworICAgIC8qIEVuYWJsZSBBZGRyZXNzIEFja25vd2xlZGdlICovCisgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyICY9IH5JMkNfQ1IyX05BQ0s7CisKKyAgICAvKiBQcmVwYXJlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyID0gcERhdGE7CisgICAgaHNtYnVzLT5YZmVyQ291bnQgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBYZmVyT3B0aW9uczsKKworICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgIFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhzbWJ1cyk7CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhzbWJ1cy0+WGZlclNpemUgPCBoc21idXMtPlhmZXJDb3VudCkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpKQorICAgIHsKKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgU01CVVNfUkVMT0FEX01PREUgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTZXQgTkJZVEUgdG8gdHJhbnNtaXQgKi8KKyAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKworICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgLyogUEVDIGJ5dGUgaXMgYXV0b21hdGljYWxseSBzZW50IGJ5IEhXIGJsb2NrLCBubyBuZWVkIHRvIG1hbmFnZSBpdCBpbiBUcmFuc21pdCBwcm9jZXNzICovCisgICAgICBpZiAoU01CVVNfR0VUX1BFQ19NT0RFKGhzbWJ1cykgIT0gMFVMKQorICAgICAgeworICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYXIgQUREUiBmbGFnIGFmdGVyIHByZXBhcmUgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBIT1NUICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUREUik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYIHwgU01CVVNfSVRfQUREUik7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgaW4gc2xhdmUvZGV2aWNlIFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfU2xhdmVfUmVjZWl2ZV9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVTCkpCisgICAgeworICAgICAgaHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfU01CVVNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUiB8IFNNQlVTX0lUX1JYKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoc21idXMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IChIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCB8IEhBTF9TTUJVU19TVEFURV9MSVNURU4pOworICAgIGhzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX1NNQlVTX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgU0JDIGJpdCB0byBtYW5hZ2UgQWNrbm93bGVkZ2UgYXQgZWFjaCBiaXQgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9TQkM7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIGhzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoc21idXMpOworCisgICAgLyogU2V0IE5CWVRFIHRvIHJlY2VpdmUgKi8KKyAgICAvKiBJZiBYZmVyU2l6ZSBlcXVhbCAiMSIsIG9yIFhmZXJTaXplIGVxdWFsICIyIiB3aXRoIFBFQyByZXF1ZXN0ZWQgKG1lYW4gMSBkYXRhIGJ5dGUgKyAxIFBFQyBieXRlICovCisgICAgLyogbm8gbmVlZCB0byBzZXQgUkVMT0FEIGJpdCBtb2RlLCBhIEFDSyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGluIHRoYXQgY2FzZSAqLworICAgIC8qIGVsc2UgbmVlZCB0byBzZXQgUkVMT0FEIGJpdCBtb2RlIHRvIGdlbmVyYXRlIGFuIGF1dG9tYXRpYyBBQ0sgYXQgZWFjaCBieXRlIFJlY2VpdmVkICovCisgICAgLyogVGhpcyBSRUxPQUQgYml0IHdpbGwgYmUgcmVzZXQgZm9yIGxhc3QgQllURSB0byBiZSByZWNlaXZlIGluIFNNQlVTX1NsYXZlX0lTUiAqLworICAgIGlmICgoKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IDBVTCkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gMlUpKSB8fCAoaHNtYnVzLT5YZmVyU2l6ZSA9PSAxVSkpCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAxLCBoc21idXMtPlhmZXJPcHRpb25zIHwgU01CVVNfUkVMT0FEX01PREUsIFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgfQorCisgICAgLyogQ2xlYXIgQUREUiBmbGFnIGFmdGVyIHByZXBhcmUgdGhlIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBUaGlzIGFjdGlvbiB3aWxsIGdlbmVyYXRlIGFuIGFja25vd2xlZGdlIHRvIHRoZSBIT1NUICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUREUik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBOb3RlIDogVGhlIFNNQlVTIGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIGFmdGVyIHVubG9ja2luZyBjdXJyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlIGN1cnJlbnQKKyAgICAgICAgICAgICAgcHJvY2VzcyB1bmxvY2sgKi8KKyAgICAvKiBSRW5hYmxlIEFERFIgaW50ZXJydXB0ICovCisgICAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYIHwgU01CVVNfSVRfQUREUik7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0VuYWJsZUxpc3Rlbl9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOOworCisgIC8qIEVuYWJsZSB0aGUgQWRkcmVzcyBNYXRjaCBpbnRlcnJ1cHQgKi8KKyAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBEaXNhYmxlIEFkZHJlc3MgbGlzdGVuIG1vZGUgb25seSBpZiBhIHRyYW5zZmVyIGlzIG5vdCBvbmdvaW5nICovCisgIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgIHsKKyAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgLyogRGlzYWJsZSB0aGUgQWRkcmVzcyBNYXRjaCBpbnRlcnJ1cHQgKi8KKyAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFNNQlVTIGFsZXJ0IG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVU3ggcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUJVU19FbmFibGVBbGVydF9JVChTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIEVuYWJsZSBTTUJ1cyBhbGVydCAqLworICBoc21idXMtPkluc3RhbmNlLT5DUjEgfD0gSTJDX0NSMV9BTEVSVEVOOworCisgIC8qIENsZWFyIEFMRVJUIGZsYWcgKi8KKyAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUxFUlQpOworCisgIC8qIEVuYWJsZSBBbGVydCBJbnRlcnJ1cHQgKi8KKyAgU01CVVNfRW5hYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX0FMRVJUKTsKKworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTTUJVUyBhbGVydCBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01CVVNfRGlzYWJsZUFsZXJ0X0lUKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogRW5hYmxlIFNNQnVzIGFsZXJ0ICovCisgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSAmPSB+STJDX0NSMV9BTEVSVEVOOworCisgIC8qIERpc2FibGUgQWxlcnQgSW50ZXJydXB0ICovCisgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUxFUlQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGFyZ2V0IGRldmljZSBpcyByZWFkeSBmb3IgY29tbXVuaWNhdGlvbi4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBUYXJnZXQgZGV2aWNlIGFkZHJlc3M6IFRoZSBkZXZpY2UgNyBiaXRzIGFkZHJlc3MgdmFsdWUKKyAgKiAgICAgICAgIGluIGRhdGFzaGVldCBtdXN0IGJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYmVmb3JlIGNhbGxpbmcgdGhlIGludGVyZmFjZQorICAqIEBwYXJhbSAgVHJpYWxzIE51bWJlciBvZiB0cmlhbHMKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQlVTX0lzRGV2aWNlUmVhZHkoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICBfX0lPIHVpbnQzMl90IFNNQlVTX1RyaWFscyA9IDBVTDsKKworICBGbGFnU3RhdHVzIHRtcDE7CisgIEZsYWdTdGF0dXMgdG1wMjsKKworICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0JVU1kpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfQlVTWTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHNtYnVzKTsKKworICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfQlVTWTsKKyAgICBoc21idXMtPkVycm9yQ29kZSA9IEhBTF9TTUJVU19FUlJPUl9OT05FOworCisgICAgZG8KKyAgICB7CisgICAgICAvKiBHZW5lcmF0ZSBTdGFydCAqLworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyID0gU01CVVNfR0VORVJBVEVfU1RBUlQoaHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlLCBEZXZBZGRyZXNzKTsKKworICAgICAgLyogTm8gbmVlZCB0byBDaGVjayBUQyBmbGFnLCB3aXRoIEFVVE9FTkQgbW9kZSB0aGUgc3RvcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAqLworICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHNldCBvciBhIE5BQ0sgZmxhZyBpcyBzZXQqLworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgdG1wMSA9IF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICB0bXAyID0gX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX0FGKTsKKworICAgICAgd2hpbGUgKCh0bXAxID09IFJFU0VUKSAmJiAodG1wMiA9PSBSRVNFVCkpCisgICAgICB7CisgICAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRGV2aWNlIGlzIHJlYWR5ICovCisgICAgICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBVcGRhdGUgU01CVVMgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0hBTFRJTUVPVVQ7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0bXAxID0gX19IQUxfU01CVVNfR0VUX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKyAgICAgICAgdG1wMiA9IF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBOQUNLRiBmbGFnIGhhcyBub3QgYmVlbiBzZXQgKi8KKyAgICAgIGlmIChfX0hBTF9TTUJVU19HRVRfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpID09IFJFU0VUKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisKKyAgICAgICAgLyogRGV2aWNlIGlzIHJlYWR5ICovCisgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19BRik7CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnLCBhdXRvIGdlbmVyYXRlZCB3aXRoIGF1dG9lbmQqLworICAgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHRyaWFscyBoYXMgYmVlbiByZWFjaGVkICovCisgICAgICBpZiAoU01CVVNfVHJpYWxzID09IFRyaWFscykKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgU3RvcCAqLworICAgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworCisgICAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyByZXNldCAqLworICAgICAgICBpZiAoU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21idXMsIFNNQlVTX0ZMQUdfU1RPUEYsIFJFU0VULCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1NUT1BGKTsKKyAgICAgIH0KKworICAgICAgLyogSW5jcmVtZW50IFRyaWFscyAqLworICAgICAgU01CVVNfVHJpYWxzKys7CisgICAgfQorICAgIHdoaWxlIChTTUJVU19UcmlhbHMgPCBUcmlhbHMpOworCisgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFVwZGF0ZSBTTUJVUyBlcnJvciBjb2RlICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0hBTFRJTUVPVVQ7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgU01CVVMgZXZlbnQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1NNQlVTX0VWX0lSUUhhbmRsZXIoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgY3VycmVudCBJU1IgZmxhZ3MgKi8KKyAgLyogVGhpcyBhY3Rpb24gd2lsbCBhdm9pZCBhIHdyb25nIHRyZWF0bWVudCBkdWUgdG8gSVNSIGZsYWdzIGNoYW5nZSBkdXJpbmcgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgdWludDMyX3QgdG1waXNydmFsdWUgPSBSRUFEX1JFRyhoc21idXMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCB0bXBjcjF2YWx1ZSA9IFJFQURfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogU01CVVMgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgKFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9UWEkpKSAhPSBSRVNFVCkgJiYgKChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1RYSVMpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UQ1IpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19UQykgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKSkpCisgIHsKKyAgICAvKiBTbGF2ZSBtb2RlIHNlbGVjdGVkICovCisgICAgaWYgKChoc21idXMtPlN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKQorICAgIHsKKyAgICAgICh2b2lkKVNNQlVTX1NsYXZlX0lTUihoc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgICAgLyogTWFzdGVyIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBlbHNlIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgICh2b2lkKVNNQlVTX01hc3Rlcl9JU1IoaHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisKKyAgLyogU01CVVMgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIChTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfUlhJKSkgIT0gUkVTRVQpICYmICgoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfVEMpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpKQorICB7CisgICAgLyogU2xhdmUgbW9kZSBzZWxlY3RlZCAqLworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkKKyAgICB7CisgICAgICAodm9pZClTTUJVU19TbGF2ZV9JU1IoaHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICAgIC8qIE1hc3RlciBtb2RlIHNlbGVjdGVkICovCisgICAgZWxzZSBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICB7CisgICAgICAodm9pZClTTUJVU19NYXN0ZXJfSVNSKGhzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorCisgIC8qIFNNQlVTIGluIG1vZGUgTGlzdGVuZXIgT25seSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgU01CVVNfSVRfQUREUkkpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBTTUJVU19JVF9TVE9QSSkgIT0gUkVTRVQpIHx8IChTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIFNNQlVTX0lUX05BQ0tJKSAhPSBSRVNFVCkpICYmICgoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19BRERSKSAhPSBSRVNFVCkgfHwgKFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgU01CVVNfRkxBR19BRikgIT0gUkVTRVQpKSkKKyAgeworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9TTUJVU19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgKHZvaWQpU01CVVNfU2xhdmVfSVNSKGhzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUJVUyBlcnJvciBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU01CVVNfRVJfSVJRSGFuZGxlcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIFNNQlVTX0lURXJyb3JIYW5kbGVyKGhzbWJ1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKiogQGJyaWVmICBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU2xhdmUgQWRkcmVzcyBNYXRjaCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gTWFzdGVyIHJlcXVlc3QgVHJhbnNmZXIgRGlyZWN0aW9uIChXcml0ZS9SZWFkKQorICAqIEBwYXJhbSAgQWRkck1hdGNoQ29kZSBBZGRyZXNzIE1hdGNoIENvZGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc21idXMpOworICBVTlVTRUQoVHJhbnNmZXJEaXJlY3Rpb24pOworICBVTlVTRUQoQWRkck1hdGNoQ29kZSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19BZGRyQ2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NNQlVTX0xpc3RlbkNwbHRDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQlVTIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU01CVVNfRXJyb3JDYWxsYmFjayhTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFNNQlVTIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCit1aW50MzJfdCBIQUxfU01CVVNfR2V0U3RhdGUoU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBSZXR1cm4gU01CVVMgaGFuZGxlIHN0YXRlICovCisgIHJldHVybiBoc21idXMtPlN0YXRlOworfQorCisvKioKKyogQGJyaWVmICBSZXR1cm4gdGhlIFNNQlVTIGVycm9yIGNvZGUuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisqIEByZXR2YWwgU01CVVMgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9TTUJVU19HZXRFcnJvcihTTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIHJldHVybiBoc21idXMtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFNNQlVTX1ByaXZhdGVfRnVuY3Rpb25zIFNNQlVTIFByaXZhdGUgRnVuY3Rpb25zCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlcnMgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEludGVycnVwdCBTdWItUm91dGluZSB3aGljaCBoYW5kbGUgdGhlIEludGVycnVwdCBGbGFncyBNYXN0ZXIgTW9kZS4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBQb2ludGVyIHRvIGEgU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNNQlVTLgorICAqIEBwYXJhbSAgU3RhdHVzRmxhZ3MgVmFsdWUgb2YgSW50ZXJydXB0IEZsYWdzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQlVTX01hc3Rlcl9JU1Ioc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBTdGF0dXNGbGFncykKK3sKKyAgdWludDE2X3QgRGV2QWRkcmVzczsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzbWJ1cyk7CisKKyAgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2xlYXIgTkFDSyBGbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworCisgICAgLyogU2V0IGNvcnJlc3BvbmRpbmcgRXJyb3IgQ29kZSAqLworICAgIC8qIE5vIG5lZWQgdG8gZ2VuZXJhdGUgU1RPUCwgaXQgaXMgYXV0b21hdGljYWxseSBkb25lICovCisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX0FDS0Y7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc21idXMtPkVycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKQorICB7CisgICAgLyogQ2hlY2sgYW5kIHRyZWF0IGVycm9ycyBpZiBlcnJvcnMgb2NjdXJzIGR1cmluZyBTVE9QIHByb2Nlc3MgKi8KKyAgICBTTUJVU19JVEVycm9ySGFuZGxlcihoc21idXMpOworCisgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKworICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisKKyAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgU01CVVNfUkVTRVRfQ1IyKGhzbWJ1cyk7CisKKyAgICAgIC8qIEZsdXNoIHJlbWFpbmluZyBkYXRhIGluIEZpZm8gcmVnaXN0ZXIgaW4gY2FzZSBvZiBlcnJvciBvY2N1cnMgYmVmb3JlIFRYRW1wdHkgKi8KKyAgICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NNQlVTX0RJU0FCTEUoaHNtYnVzKTsKKworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgIC8qIFJFZW5hYmxlIHRoZSBzZWxlY3RlZCBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9TTUJVU19FTkFCTEUoaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgLyogU3RvcmUgTGFzdCByZWNlaXZlIGRhdGEgaWYgYW55ICovCisgICAgICBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgICAqaHNtYnVzLT5wQnVmZlB0ciA9ICh1aW50OF90KShoc21idXMtPkluc3RhbmNlLT5SWERSKTsKKworICAgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKworICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisKKyAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgU01CVVNfUkVTRVRfQ1IyKGhzbWJ1cyk7CisKKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1JYTkUpICE9IFJFU0VUKQorICB7CisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICpoc21idXMtPnBCdWZmUHRyID0gKHVpbnQ4X3QpKGhzbWJ1cy0+SW5zdGFuY2UtPlJYRFIpOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgLyogSW5jcmVtZW50IFNpemUgY291bnRlciAqLworICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICBoc21idXMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfVFhJUykgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBXcml0ZSBkYXRhIHRvIFRYRFIgKi8KKyAgICBoc21idXMtPkluc3RhbmNlLT5UWERSID0gKmhzbWJ1cy0+cEJ1ZmZQdHI7CisKKyAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAvKiBJbmNyZW1lbnQgU2l6ZSBjb3VudGVyICovCisgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgIH0KKyAgZWxzZSBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19UQ1IpICE9IFJFU0VUKQorICB7CisgICAgaWYgKChoc21idXMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhzbWJ1cy0+WGZlclNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIERldkFkZHJlc3MgPSAodWludDE2X3QpKGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiAmIEkyQ19DUjJfU0FERCk7CisKKyAgICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgeworICAgICAgICBTTUJVU19UcmFuc2ZlckNvbmZpZyhoc21idXMsIERldkFkZHJlc3MsIE1BWF9OQllURV9TSVpFLCAoU01CVVNfUkVMT0FEX01PREUgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSkpLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhzbWJ1cy0+WGZlclNpemUgPSBoc21idXMtPlhmZXJDb3VudDsKKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloc21idXMtPlhmZXJTaXplLCBoc21idXMtPlhmZXJPcHRpb25zLCBTTUJVU19OT19TVEFSVFNUT1ApOworICAgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgICBpZiAoU01CVVNfR0VUX1BFQ19NT0RFKGhzbWJ1cykgIT0gMFVMKQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhzbWJ1cy0+WGZlckNvdW50ID09IDBVKSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmIChTTUJVU19HRVRfU1RPUF9NT0RFKGhzbWJ1cykgIT0gU01CVVNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgaWYgKGhzbWJ1cy0+U3RhdGUgPT0gSEFMX1NNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1RYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9TTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgICAgIHsKKyAgICAgICAgICBTTUJVU19EaXNhYmxlX0lSUShoc21idXMsIFNNQlVTX0lUX1JYKTsKKyAgICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9TTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9CisgIGVsc2UgaWYgKFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIFNNQlVTX0ZMQUdfVEMpICE9IFJFU0VUKQorICB7CisgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIFNwZWNpZmljIHVzZSBjYXNlIGZvciBRdWljayBjb21tYW5kICovCisgICAgICBpZiAoaHNtYnVzLT5wQnVmZlB0ciA9PSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBHZW5lcmF0ZSBhIFN0b3AgY29tbWFuZCAqLworICAgICAgICBoc21idXMtPkluc3RhbmNlLT5DUjIgfD0gSTJDX0NSMl9TVE9QOworICAgICAgfQorICAgICAgLyogQ2FsbCBUeENwbHRDYWxsYmFjaygpIGlmIG5vIHN0b3AgbW9kZSBpcyBzZXQgKi8KKyAgICAgIGVsc2UgaWYgKFNNQlVTX0dFVF9TVE9QX01PREUoaHNtYnVzKSAhPSBTTUJVU19BVVRPRU5EX01PREUpCisgICAgICB7CisgICAgICAgIC8qIE5vIEdlbmVyYXRlIFN0b3AsIHRvIHBlcm1pdCByZXN0YXJ0IG1vZGUgKi8KKyAgICAgICAgLyogVGhlIHN0b3Agd2lsbCBiZSBkb25lIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIsIHdoZW4gU01CVVNfQVVUT0VORF9NT0RFIGVuYWJsZSAqLworCisgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgICAgICBpZiAoaHNtYnVzLT5TdGF0ZSA9PSBIQUxfU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIGhzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1NNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChoc21idXMtPlN0YXRlID09IEhBTF9TTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWCkKKyAgICAgICAgeworICAgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworICAgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIGhzbWJ1cy0+TWFzdGVyUnhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICAgICAgSEFMX1NNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIEludGVycnVwdCBTdWItUm91dGluZSB3aGljaCBoYW5kbGUgdGhlIEludGVycnVwdCBGbGFncyBTbGF2ZSBNb2RlLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBTdGF0dXNGbGFncyBWYWx1ZSBvZiBJbnRlcnJ1cHQgRmxhZ3MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01CVVNfU2xhdmVfSVNSKHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpCit7CisgIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb247CisgIHVpbnQxNl90IFNsYXZlQWRkckNvZGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc21idXMpOworCisgIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIHRoYXQgU01CVVMgdHJhbnNmZXIgZmluaXNoZWQgKi8KKyAgICAvKiBpZiB5ZXMsIG5vcm1hbCB1c2VjYXNlLCBhIE5BQ0sgaXMgc2VudCBieSB0aGUgSE9TVCB3aGVuIFRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisgICAgLyogTWVhbiBYZmVyQ291bnQgPT0gMCovCisgICAgLyogU28gY2xlYXIgRmxhZyBOQUNLRiBvbmx5ICovCisgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIGlmIG5vLCBlcnJvciB1c2VjYXNlLCBhIE5vbi1BY2tub3dsZWRnZSBvZiBsYXN0IERhdGEgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBIT1NUKi8KKyAgICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUYpOworCisgICAgICAvKiBTZXQgSEFMIFN0YXRlIHRvICJJZGxlIiBTdGF0ZSwgbWVhbiB0byBMSVNURU4gc3RhdGUgKi8KKyAgICAgIC8qIFNvIHJlc2V0IFNsYXZlIEJ1c3kgc3RhdGUgKi8KKyAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhzbWJ1cy0+U3RhdGU7CisgICAgICBoc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpOworCisgICAgICAvKiBEaXNhYmxlIFJYL1RYIEludGVycnVwdHMsIGtlZXAgb25seSBBRERSIEludGVycnVwdCAqLworICAgICAgU01CVVNfRGlzYWJsZV9JUlEoaHNtYnVzLCBTTUJVU19JVF9SWCB8IFNNQlVTX0lUX1RYKTsKKworICAgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCisgICAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQUNLRjsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIEVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciAqLworI2lmIChVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX1NNQlVTX0Vycm9yQ2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX0FERFIpICE9IFJFU0VUKQorICB7CisgICAgVHJhbnNmZXJEaXJlY3Rpb24gPSAodWludDhfdCkoU01CVVNfR0VUX0RJUihoc21idXMpKTsKKyAgICBTbGF2ZUFkZHJDb2RlID0gKHVpbnQxNl90KShTTUJVU19HRVRfQUREUl9NQVRDSChoc21idXMpKTsKKworICAgIC8qIERpc2FibGUgQUREUiBpbnRlcnJ1cHQgdG8gcHJldmVudCBtdWx0aXBsZSBBRERSSW50ZXJydXB0Ki8KKyAgICAvKiBPdGhlciBBRERSSW50ZXJydXB0IHdpbGwgYmUgdHJlYXQgaW4gbmV4dCBMaXN0ZW4gdXNlY2FzZSAqLworICAgIF9fSEFMX1NNQlVTX0RJU0FCTEVfSVQoaHNtYnVzLCBTTUJVU19JVF9BRERSSSk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAvKiBDYWxsIFNsYXZlIEFkZHIgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICBoc21idXMtPkFkZHJDYWxsYmFjayhoc21idXMsIFRyYW5zZmVyRGlyZWN0aW9uLCBTbGF2ZUFkZHJDb2RlKTsKKyNlbHNlCisgICAgSEFMX1NNQlVTX0FkZHJDYWxsYmFjayhoc21idXMsIFRyYW5zZmVyRGlyZWN0aW9uLCBTbGF2ZUFkZHJDb2RlKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UgaWYgKChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1JYTkUpICE9IFJFU0VUKSB8fCAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19UQ1IpICE9IFJFU0VUKSkKKyAgeworICAgIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkKKyAgICB7CisgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBSWERSICovCisgICAgICAqaHNtYnVzLT5wQnVmZlB0ciA9ICh1aW50OF90KShoc21idXMtPkluc3RhbmNlLT5SWERSKTsKKworICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICBoc21idXMtPnBCdWZmUHRyKys7CisKKyAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgIGhzbWJ1cy0+WGZlckNvdW50LS07CisKKyAgICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogUmVjZWl2ZSBsYXN0IEJ5dGUsIGNhbiBiZSBQRUMgYnl0ZSBpbiBjYXNlIG9mIFBFQyBCWVRFIGVuYWJsZWQgKi8KKyAgICAgICAgLyogb3Igb25seSB0aGUgbGFzdCBCeXRlIG9mIFRyYW5zZmVyICovCisgICAgICAgIC8qIFNvIHJlc2V0IHRoZSBSRUxPQUQgYml0IG1vZGUgKi8KKyAgICAgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyAmPSB+U01CVVNfUkVMT0FEX01PREU7CisgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgMSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBMYXN0IEJ5dGUgaXMgcmVjZWl2ZWQsIGRpc2FibGUgSW50ZXJydXB0ICovCisgICAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlgpOworCisgICAgICAgIC8qIFJlbW92ZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCwga2VlcCBvbmx5IEhBTF9TTUJVU19TVEFURV9MSVNURU4gKi8KKyAgICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgaHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgICAgICBIQUxfU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFNldCBSZWxvYWQgZm9yIG5leHQgQnl0ZXMgKi8KKyAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCAxLCBTTUJVU19SRUxPQURfTU9ERSAgfCAoaHNtYnVzLT5YZmVyT3B0aW9ucyAmIFNNQlVTX1NFTkRQRUNfTU9ERSksIFNNQlVTX05PX1NUQVJUU1RPUCk7CisKKyAgICAgICAgLyogQWNrIGxhc3QgQnl0ZSBSZWFkICovCisgICAgICAgIGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiAmPSB+STJDX0NSMl9OQUNLOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoaHNtYnVzLT5TdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkKKyAgICB7CisgICAgICBpZiAoKGhzbWJ1cy0+WGZlckNvdW50ICE9IDBVKSAmJiAoaHNtYnVzLT5YZmVyU2l6ZSA9PSAwVSkpCisgICAgICB7CisgICAgICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA+IE1BWF9OQllURV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgU01CVVNfVHJhbnNmZXJDb25maWcoaHNtYnVzLCAwLCBNQVhfTkJZVEVfU0laRSwgKFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhzbWJ1cy0+WGZlck9wdGlvbnMgJiBTTUJVU19TRU5EUEVDX01PREUpKSwgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgICBoc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHNtYnVzLT5YZmVyU2l6ZSA9IGhzbWJ1cy0+WGZlckNvdW50OworICAgICAgICAgIFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhzbWJ1cywgMCwgKHVpbnQ4X3QpaHNtYnVzLT5YZmVyU2l6ZSwgaHNtYnVzLT5YZmVyT3B0aW9ucywgU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgICAvKiBJZiBQRUMgbW9kZSBpcyBlbmFibGUsIHNpemUgdG8gdHJhbnNtaXQgc2hvdWxkIGJlIFNpemUtMSBieXRlLCBjb3JyZXNwb25kaW5nIHRvIFBFQyBieXRlICovCisgICAgICAgICAgLyogUEVDIGJ5dGUgaXMgYXV0b21hdGljYWxseSBzZW50IGJ5IEhXIGJsb2NrLCBubyBuZWVkIHRvIG1hbmFnZSBpdCBpbiBUcmFuc21pdCBwcm9jZXNzICovCisgICAgICAgICAgaWYgKFNNQlVTX0dFVF9QRUNfTU9ERShoc21idXMpICE9IDBVTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBoc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorICBlbHNlIGlmIChTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBTTUJVU19GTEFHX1RYSVMpICE9IFJFU0VUKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSIG9ubHkgaWYgWGZlckNvdW50IG5vdCByZWFjaCAiMCIgKi8KKyAgICAvKiBBIFRYSVMgZmxhZyBjYW4gYmUgc2V0LCBkdXJpbmcgU1RPUCB0cmVhdG1lbnQgICAgICAqLworICAgIC8qIENoZWNrIGlmIGFsbCBEYXRhIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgKi8KKyAgICAvKiBJZiBpdCBpcyB0aGUgY2FzZSwgdGhpcyBsYXN0IHdyaXRlIGluIFRYRFIgaXMgbm90IHNlbnQsIGNvcnJlc3BvbmQgdG8gYSBkdW1teSBUWElTIGV2ZW50ICovCisgICAgaWYgKGhzbWJ1cy0+WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgICBoc21idXMtPkluc3RhbmNlLT5UWERSID0gKmhzbWJ1cy0+cEJ1ZmZQdHI7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgaHNtYnVzLT5YZmVyU2l6ZS0tOworICAgIH0KKworICAgIGlmIChoc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBMYXN0IEJ5dGUgaXMgVHJhbnNtaXR0ZWQgKi8KKyAgICAgIC8qIFJlbW92ZSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCwga2VlcCBvbmx5IEhBTF9TTUJVU19TVEFURV9MSVNURU4gKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfVFgpOworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc21idXMtPlNsYXZlVHhDcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhoc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIENoZWNrIGlmIFNUT1BGIGlzIHNldCAqLworICBpZiAoU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoKGhzbWJ1cy0+U3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgICAqaHNtYnVzLT5wQnVmZlB0ciA9ICh1aW50OF90KShoc21idXMtPkluc3RhbmNlLT5SWERSKTsKKworICAgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgaHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgICAgIGlmICgoaHNtYnVzLT5YZmVyU2l6ZSA+IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGhzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICBoc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgUlggYW5kIFRYIEludGVycnVwdHMgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfUlggfCBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIERpc2FibGUgQUREUiBJbnRlcnJ1cHQgKi8KKyAgICAgIFNNQlVTX0Rpc2FibGVfSVJRKGhzbWJ1cywgU01CVVNfSVRfQUREUik7CisKKyAgICAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgICAgaHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEkyQ19DUjJfTkFDSzsKKworICAgICAgLyogQ2xlYXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisgICAgICBTTUJVU19SRVNFVF9DUjIoaHNtYnVzKTsKKworICAgICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCisgICAgICBfX0hBTF9TTUJVU19DTEVBUl9GTEFHKGhzbWJ1cywgU01CVVNfRkxBR19TVE9QRik7CisKKyAgICAgIC8qIENsZWFyIEFERFIgZmxhZyAqLworICAgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUREUik7CisKKyAgICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSAwOworICAgICAgaHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKyAgICAgIGhzbWJ1cy0+U3RhdGUgPSBIQUxfU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2ssIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiB0aGUgZW5kIG9mIExpc3RlbiB1c2VjYXNlICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoc21idXMtPkxpc3RlbkNwbHRDYWxsYmFjayhoc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9TTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soaHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBlbmFibGluZyBvZiBJbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaHNtYnVzIFBvaW50ZXIgdG8gYSBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU01CVVMuCisgICogQHBhcmFtICBJbnRlcnJ1cHRSZXF1ZXN0IFZhbHVlIG9mIEByZWYgU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyB2b2lkIFNNQlVTX0VuYWJsZV9JUlEoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVUw7CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUxFUlQpID09IFNNQlVTX0lUX0FMRVJUKQorICB7CisgICAgLyogRW5hYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX0FERFIpID09IFNNQlVTX0lUX0FERFIpCisgIHsKKyAgICAvKiBFbmFibGUgQUREUiwgU1RPUCBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfQUREUkkgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX1RYKSA9PSBTTUJVU19JVF9UWCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBSWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0VSUkkgfCBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJIHwgU01CVVNfSVRfVFhJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfUlgpID09IFNNQlVTX0lUX1JYKQorICB7CisgICAgLyogRW5hYmxlIEVSUiwgVEMsIFNUT1AsIE5BQ0ssIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSSB8IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1NUT1BJIHwgU01CVVNfSVRfTkFDS0kgfCBTTUJVU19JVF9SWEk7CisgIH0KKworICAvKiBFbmFibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgdGhlIHJpc2sgb2YgU01CVVMgaW50ZXJydXB0IGhhbmRsZSBleGVjdXRpb24gYmVmb3JlICovCisgIC8qIGFsbCBpbnRlcnJ1cHRzIHJlcXVlc3RlZCBkb25lICovCisgIF9fSEFMX1NNQlVTX0VOQUJMRV9JVChoc21idXMsIHRtcGlzcik7Cit9CisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgZGlzYWJsaW5nIG9mIEludGVycnVwdHMuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIEludGVycnVwdFJlcXVlc3QgVmFsdWUgb2YgQHJlZiBTTUJVU19JbnRlcnJ1cHRfY29uZmlndXJhdGlvbl9kZWZpbml0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIHZvaWQgU01CVVNfRGlzYWJsZV9JUlEoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCB1aW50MzJfdCBJbnRlcnJ1cHRSZXF1ZXN0KQoreworICB1aW50MzJfdCB0bXBpc3IgPSAwVUw7CisgIHVpbnQzMl90IHRtcHN0YXRlID0gaHNtYnVzLT5TdGF0ZTsKKworICBpZiAoKHRtcHN0YXRlID09IEhBTF9TTUJVU19TVEFURV9SRUFEWSkgJiYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfQUxFUlQpID09IFNNQlVTX0lUX0FMRVJUKSkKKyAgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJOworICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgU01CVVNfSVRfVFgpID09IFNNQlVTX0lUX1RYKQorICB7CisgICAgLyogRGlzYWJsZSBUQywgU1RPUCwgTkFDSyBhbmQgVFhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBTTUJVU19JVF9UQ0kgfCBTTUJVU19JVF9UWEk7CisKKyAgICBpZiAoKFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKGhzbWJ1cykgPT0gMFVMKQorICAgICAgICAmJiAoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX1NNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFNUT1AgYW5kIE5BQ0sgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBTTUJVU19JVF9SWCkgPT0gU01CVVNfSVRfUlgpCisgIHsKKyAgICAvKiBEaXNhYmxlIFRDLCBTVE9QLCBOQUNLIGFuZCBSWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX1RDSSB8IFNNQlVTX0lUX1JYSTsKKworICAgIGlmICgoU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaHNtYnVzKSA9PSAwVUwpCisgICAgICAgICYmICgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJOworICAgIH0KKworICAgIGlmICgodG1wc3RhdGUgJiBIQUxfU01CVVNfU1RBVEVfTElTVEVOKSAhPSBIQUxfU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgU1RPUCBhbmQgTkFDSyBpbnRlcnJ1cHQgKi8KKyAgICAgIHRtcGlzciB8PSBTTUJVU19JVF9TVE9QSSB8IFNNQlVTX0lUX05BQ0tJOworICAgIH0KKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIFNNQlVTX0lUX0FERFIpID09IFNNQlVTX0lUX0FERFIpCisgIHsKKyAgICAvKiBEaXNhYmxlIEFERFIsIFNUT1AgYW5kIE5BQ0sgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IFNNQlVTX0lUX0FERFJJIHwgU01CVVNfSVRfU1RPUEkgfCBTTUJVU19JVF9OQUNLSTsKKworICAgIGlmIChTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChoc21idXMpID09IDBVTCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICAgIHRtcGlzciB8PSBTTUJVU19JVF9FUlJJOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyBvbmx5IGF0IHRoZSBlbmQgKi8KKyAgLyogdG8gYXZvaWQgYSBicmVha2luZyBzaXR1YXRpb24gbGlrZSBhdCAidCIgdGltZSAqLworICAvKiBhbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIHJlcXVlc3QgYXJlIG5vdCBkb25lICovCisgIF9fSEFMX1NNQlVTX0RJU0FCTEVfSVQoaHNtYnVzLCB0bXBpc3IpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNNQlVTIGludGVycnVwdHMgZXJyb3IgaGFuZGxlci4KKyAgKiBAcGFyYW0gIGhzbWJ1cyBTTUJVUyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTTUJVU19JVEVycm9ySGFuZGxlcihzdHJ1Y3QgX19TTUJVU19IYW5kbGVUeXBlRGVmICpoc21idXMpCit7CisgIHVpbnQzMl90IGl0ZmxhZ3MgICA9IFJFQURfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGl0c291cmNlcyA9IFJFQURfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IHRtcHN0YXRlOworICB1aW50MzJfdCB0bXBlcnJvcjsKKworICAvKiBTTUJVUyBCdXMgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX0JFUlIpID09IFNNQlVTX0ZMQUdfQkVSUikgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9CRVJSOworCisgICAgLyogQ2xlYXIgQkVSUiBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQkVSUik7CisgIH0KKworICAvKiBTTUJVUyBPdmVyLVJ1bi9VbmRlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19PVlIpID09IFNNQlVTX0ZMQUdfT1ZSKSAmJiAoKGl0c291cmNlcyAmIFNNQlVTX0lUX0VSUkkpID09IFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX1NNQlVTX0VSUk9SX09WUjsKKworICAgIC8qIENsZWFyIE9WUiBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfT1ZSKTsKKyAgfQorCisgIC8qIFNNQlVTIEFyYml0cmF0aW9uIExvc3MgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBTTUJVU19GTEFHX0FSTE8pID09IFNNQlVTX0ZMQUdfQVJMTykgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9BUkxPOworCisgICAgLyogQ2xlYXIgQVJMTyBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQVJMTyk7CisgIH0KKworICAvKiBTTUJVUyBUaW1lb3V0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgU01CVVNfRkxBR19USU1FT1VUKSA9PSBTTUJVU19GTEFHX1RJTUVPVVQpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQlVTVElNRU9VVDsKKworICAgIC8qIENsZWFyIFRJTUVPVVQgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1RJTUVPVVQpOworICB9CisKKyAgLyogU01CVVMgQWxlcnQgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfQUxFUlQpID09IFNNQlVTX0ZMQUdfQUxFUlQpICYmICgoaXRzb3VyY2VzICYgU01CVVNfSVRfRVJSSSkgPT0gU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoc21idXMtPkVycm9yQ29kZSB8PSBIQUxfU01CVVNfRVJST1JfQUxFUlQ7CisKKyAgICAvKiBDbGVhciBBTEVSVCBmbGFnICovCisgICAgX19IQUxfU01CVVNfQ0xFQVJfRkxBRyhoc21idXMsIFNNQlVTX0ZMQUdfQUxFUlQpOworICB9CisKKyAgLyogU01CVVMgUGFja2V0IEVycm9yIENoZWNrIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIFNNQlVTX0ZMQUdfUEVDRVJSKSA9PSBTTUJVU19GTEFHX1BFQ0VSUikgJiYgKChpdHNvdXJjZXMgJiBTTUJVU19JVF9FUlJJKSA9PSBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9QRUNFUlI7CisKKyAgICAvKiBDbGVhciBQRUMgZXJyb3IgZmxhZyAqLworICAgIF9fSEFMX1NNQlVTX0NMRUFSX0ZMQUcoaHNtYnVzLCBTTUJVU19GTEFHX1BFQ0VSUik7CisgIH0KKworICAvKiBTdG9yZSBjdXJyZW50IHZvbGF0aWxlIGhzbWJ1cy0+U3RhdGUsIG1pc3JhIHJ1bGUgKi8KKyAgdG1wZXJyb3IgPSBoc21idXMtPkVycm9yQ29kZTsKKworICAvKiBDYWxsIHRoZSBFcnJvciBDYWxsYmFjayBpbiBjYXNlIG9mIEVycm9yIGRldGVjdGVkICovCisgIGlmICgodG1wZXJyb3IgIT0gSEFMX1NNQlVTX0VSUk9SX05PTkUpICYmICh0bXBlcnJvciAhPSBIQUxfU01CVVNfRVJST1JfQUNLRikpCisgIHsKKyAgICAvKiBEbyBub3QgUmVzZXQgdGhlIEhBTCBzdGF0ZSBpbiBjYXNlIG9mIEFMRVJUIGVycm9yICovCisgICAgaWYgKCh0bXBlcnJvciAmIEhBTF9TTUJVU19FUlJPUl9BTEVSVCkgIT0gSEFMX1NNQlVTX0VSUk9SX0FMRVJUKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaHNtYnVzLT5TdGF0ZSwgbWlzcmEgcnVsZSAqLworICAgICAgdG1wc3RhdGUgPSBoc21idXMtPlN0YXRlOworCisgICAgICBpZiAoKCh0bXBzdGF0ZSAmIEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKSA9PSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkKKyAgICAgICAgICB8fCAoKHRtcHN0YXRlICYgSEFMX1NNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpID09IEhBTF9TTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSkKKyAgICAgIHsKKyAgICAgICAgLyogUmVzZXQgb25seSBIQUxfU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9YWCAqLworICAgICAgICAvKiBrZWVwIEhBTF9TTUJVU19TVEFURV9MSVNURU4gaWYgc2V0ICovCisgICAgICAgIGhzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9SRUFEWTsKKyAgICAgICAgaHNtYnVzLT5TdGF0ZSA9IEhBTF9TTUJVU19TVEFURV9MSVNURU47CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyICovCisjaWYgKFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHNtYnVzLT5FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZWxzZQorICAgIEhBTF9TTUJVU19FcnJvckNhbGxiYWNrKGhzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUJVUyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc21idXMgUG9pbnRlciB0byBhIFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTTUJVUy4KKyAgKiBAcGFyYW0gIEZsYWcgU3BlY2lmaWVzIHRoZSBTTUJVUyBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgU3RhdHVzIFRoZSBuZXcgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KHN0cnVjdCBfX1NNQlVTX0hhbmRsZVR5cGVEZWYgKmhzbWJ1cywgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSAoKEZsYWdTdGF0dXMpKF9fSEFMX1NNQlVTX0dFVF9GTEFHKGhzbWJ1cywgRmxhZykpID09IFN0YXR1cykKKyAgeworICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgeworICAgICAgICBoc21idXMtPlByZXZpb3VzU3RhdGUgPSBoc21idXMtPlN0YXRlOworICAgICAgICBoc21idXMtPlN0YXRlID0gSEFMX1NNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFVwZGF0ZSBTTUJVUyBlcnJvciBjb2RlICovCisgICAgICAgIGhzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9TTUJVU19FUlJPUl9IQUxUSU1FT1VUOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzbWJ1cyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTTUJVU3ggY29tbXVuaWNhdGlvbiB3aGVuIHN0YXJ0aW5nIHRyYW5zZmVyIG9yIGR1cmluZyB0cmFuc2ZlciAoVEMgb3IgVENSIGZsYWcgYXJlIHNldCkuCisgICogQHBhcmFtICBoc21idXMgU01CVVMgaGFuZGxlLgorICAqIEBwYXJhbSAgRGV2QWRkcmVzcyBzcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNpemUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS4KKyAgKiBAcGFyYW0gIE1vZGUgTmV3IHN0YXRlIG9mIHRoZSBTTUJVUyBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbi4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBTTUJVU19SRUxPQURfTU9ERSBFbmFibGUgUmVsb2FkIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19BVVRPRU5EX01PREUgRW5hYmxlIEF1dG9tYXRpYyBlbmQgbW9kZS4KKyAgKiAgICAgQGFyZyBAcmVmIFNNQlVTX1NPRlRFTkRfTU9ERSBFbmFibGUgU29mdHdhcmUgZW5kIG1vZGUgYW5kIFJlbG9hZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfU0VORFBFQ19NT0RFIEVuYWJsZSBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIFJlcXVlc3QgTmV3IHN0YXRlIG9mIHRoZSBTTUJVUyBTVEFSVCBjb25kaXRpb24gZ2VuZXJhdGlvbi4KKyAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgIEBhcmcgQHJlZiBTTUJVU19OT19TVEFSVFNUT1AgRG9uJ3QgR2VuZXJhdGUgc3RvcCBhbmQgc3RhcnQgY29uZGl0aW9uLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfR0VORVJBVEVfU1RPUCBHZW5lcmF0ZSBzdG9wIGNvbmRpdGlvbiAoU2l6ZSBzaG91bGQgYmUgc2V0IHRvIDApLgorICAqICAgICBAYXJnIEByZWYgU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciByZWFkIHJlcXVlc3QuCisgICogICAgIEBhcmcgQHJlZiBTTUJVU19HRU5FUkFURV9TVEFSVF9XUklURSBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01CVVNfVHJhbnNmZXJDb25maWcoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzLCAgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCBTaXplLCB1aW50MzJfdCBNb2RlLCB1aW50MzJfdCBSZXF1ZXN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfQUxMX0lOU1RBTkNFKGhzbWJ1cy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NNQlVTX1RSQU5TRkVSX01PREUoTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfU01CVVNfVFJBTlNGRVJfUkVRVUVTVChSZXF1ZXN0KSk7CisKKyAgLyogdXBkYXRlIENSMiByZWdpc3RlciAqLworICBNT0RJRllfUkVHKGhzbWJ1cy0+SW5zdGFuY2UtPkNSMiwgKChJMkNfQ1IyX1NBREQgfCBJMkNfQ1IyX05CWVRFUyB8IEkyQ19DUjJfUkVMT0FEIHwgSTJDX0NSMl9BVVRPRU5EIHwgKEkyQ19DUjJfUkRfV1JOICYgKHVpbnQzMl90KShSZXF1ZXN0ID4+ICgzMVVMIC0gSTJDX0NSMl9SRF9XUk5fUG9zKSkpIHwgSTJDX0NSMl9TVEFSVCB8IEkyQ19DUjJfU1RPUCAgfCBJMkNfQ1IyX1BFQ0JZVEUpKSwgXAorICAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50MzJfdClEZXZBZGRyZXNzICYgSTJDX0NSMl9TQUREKSB8ICgoKHVpbnQzMl90KVNpemUgPDwgSTJDX0NSMl9OQllURVNfUG9zKSAmIEkyQ19DUjJfTkJZVEVTKSB8ICh1aW50MzJfdClNb2RlIHwgKHVpbnQzMl90KVJlcXVlc3QpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb252ZXJ0IFNNQlVTeCBPVEhFUl94eHggWGZlck9wdGlvbnMgdG8gZnVuY3Rpb25uYWwgWGZlck9wdGlvbnMuCisgICogQHBhcmFtICBoc21idXMgU01CVVMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoc3RydWN0IF9fU01CVVNfSGFuZGxlVHlwZURlZiAqaHNtYnVzKQoreworICAvKiBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMgICAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfRlJBTUUgICAgICAgICAgICAgICAgICAqLworICBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9GUkFNRV9OT19QRUMpCisgIHsKKyAgICBoc21idXMtPlhmZXJPcHRpb25zID0gU01CVVNfRklSU1RfRlJBTUU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19GSVJTVF9GUkFNRSB8IFNNQlVTX1NFTkRQRUNfTU9ERSAgKi8KKyAgZWxzZSBpZiAoaHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBTTUJVU19PVEhFUl9GUkFNRV9XSVRIX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9GUkFNRSB8IFNNQlVTX1NFTkRQRUNfTU9ERTsKKyAgfQorICAvKiBlbHNlIGlmIHVzZXIgc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICAgICAgICAqLworICAvKiB0aGVuIGdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gYXQgdGhlIGVuZCBvZiB0cmFuc2ZlciAgICAgICAgICAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgICAgICAgICAqLworICBlbHNlIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQykKKyAgeworICAgIGhzbWJ1cy0+WGZlck9wdGlvbnMgPSBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUM7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAqLworICAvKiBpdCByZXF1ZXN0IGltcGxpY2l0bHkgdG8gZ2VuZXJhdGUgYSByZXN0YXJ0IGNvbmRpdGlvbiAgICAgICAgICAgICAgICovCisgIC8qIHRoZW4gZ2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbiBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyICAgICAgICAgICAgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICAqLworICBlbHNlIGlmIChoc21idXMtPlhmZXJPcHRpb25zID09IFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDKQorICB7CisgICAgaHNtYnVzLT5YZmVyT3B0aW9ucyA9IFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9TTUJVU19NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3NwaS5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxOTdiYQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3NwaS5jCkBAIC0wLDAgKzEsNDI3MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfc3BpLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFNQSSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgVGhlIFNQSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgU1BJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgU1BJX0hhbmRsZVR5cGVEZWYgIGhzcGk7CisKKyAgICAgICgjKUluaXRpYWxpemUgdGhlIFNQSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NQSV9Nc3BJbml0KCkgQVBJOgorICAgICAgICAgICgjIykgRW5hYmxlIHRoZSBTUEl4IGludGVyZmFjZSBjbG9jaworICAgICAgICAgICgjIykgU1BJIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1BJIEdQSU9zCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTUEkgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVzaC1wdWxsCisgICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzCisgICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1BJeCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNQSSBJUlEgaGFuZGxlCisgICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MKKyAgICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSB0cmFuc21pdCBvciByZWNlaXZlIFN0cmVhbS9DaGFubmVsCisgICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBjbG9jaworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBoYW5kbGUgcGFyYW1ldGVycworICAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeCBvciBSeCBTdHJlYW0vQ2hhbm5lbAorICAgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIGhkbWFfdHgob3IgX3J4KSAgaGFuZGxlIHRvIHRoZSBoc3BpIERNQSBUeCBvciBSeCBoYW5kbGUKKyAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IG9uIHRoZSBETUEgVHggb3IgUnggU3RyZWFtL0NoYW5uZWwKKworICAgICAgKCMpIFByb2dyYW0gdGhlIE1vZGUsIEJpZGlyZWN0aW9uYWxNb2RlICwgRGF0YSBzaXplLCBCYXVkcmF0ZSBQcmVzY2FsZXIsIE5TUworICAgICAgICAgIG1hbmFnZW1lbnQsIENsb2NrIHBvbGFyaXR5IGFuZCBwaGFzZSwgRmlyc3RCaXQgYW5kIENSQyBjb25maWd1cmF0aW9uIGluIHRoZSBoc3BpIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBIQUxfU1BJX0luaXQoKSBBUEk6CisgICAgICAgICAgKCsrKSBUaGlzIEFQSSBjb25maWd1cmVzIGFsc28gdGhlIGxvdyBsZXZlbCBIYXJkd2FyZSBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjKQorICAgICAgICAgICAgICBieSBjYWxsaW5nIHRoZSBjdXN0b21pemVkIEhBTF9TUElfTXNwSW5pdCgpIEFQSS4KKyAgICAgWy4uXQorICAgICAgIENpcmN1bGFyIG1vZGUgcmVzdHJpY3Rpb246CisgICAgICAoIykgVGhlIERNQSBjaXJjdWxhciBtb2RlIGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIFNQSSBpcyBjb25maWd1cmVkIGluIHRoZXNlIG1vZGVzOgorICAgICAgICAgICgjIykgTWFzdGVyIDJMaW5lcyBSeE9ubHkKKyAgICAgICAgICAoIyMpIE1hc3RlciAxTGluZSBSeAorICAgICAgKCMpIFRoZSBDUkMgZmVhdHVyZSBpcyBub3QgbWFuYWdlZCB3aGVuIHRoZSBETUEgY2lyY3VsYXIgbW9kZSBpcyBlbmFibGVkCisgICAgICAoIykgV2hlbiB0aGUgU1BJIERNQSBQYXVzZS9TdG9wIGZlYXR1cmVzIGFyZSB1c2VkLCB3ZSBtdXN0IHVzZSB0aGUgZm9sbG93aW5nIEFQSXMKKyAgICAgICAgICB0aGUgSEFMX1NQSV9ETUFQYXVzZSgpLyBIQUxfU1BJX0RNQVN0b3AoKSBvbmx5IHVuZGVyIHRoZSBTUEkgY2FsbGJhY2tzCisgICAgIFsuLl0KKyAgICAgICBNYXN0ZXIgUmVjZWl2ZSBtb2RlIHJlc3RyaWN0aW9uOgorICAgICAgKCMpIEluIE1hc3RlciB1bmlkaXJlY3Rpb25hbCByZWNlaXZlLW9ubHkgbW9kZSAoTVNUUiA9MSwgQklESU1PREU9MCwgUlhPTkxZPTEpIG9yCisgICAgICAgICAgYmlkaXJlY3Rpb25hbCByZWNlaXZlIG1vZGUgKE1TVFI9MSwgQklESU1PREU9MSwgQklESU9FPTApLCB0byBlbnN1cmUgdGhhdCB0aGUgU1BJCisgICAgICAgICAgZG9lcyBub3QgaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaGFzIHRvIGJlIHJlc3BlY3RlZDoKKyAgICAgICAgICAoIyMpIEhBTF9TUElfRGVJbml0KCkKKyAgICAgICAgICAoIyMpIEhBTF9TUElfSW5pdCgpCisgICAgIFsuLl0KKyAgICAgICBDYWxsYmFjayByZWdpc3RyYXRpb246CisKKyAgICAgICgjKSBUaGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMVUKKyAgICAgICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorICAgICAgICAgIFVzZSBGdW5jdGlvbnMgSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgorCisgICAgICAgICAgRnVuY3Rpb24gSEFMX1NQSV9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgICAgIDogU1BJIFR4IENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeFJ4Q3BsdENhbGxiYWNrICAgICAgOiBTUEkgVHhSeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgVHggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgOiBTUEkgUnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBUeFJ4SGFsZkNwbHRDYWxsYmFjayAgOiBTUEkgVHhSeCBIYWxmIENvbXBsZXRlZCBjYWxsYmFjaworICAgICAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IFNQSSBFcnJvciBjYWxsYmFjaworICAgICAgICAgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICA6IFNQSSBBYm9ydCBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICA6IFNQSSBNc3AgSW5pdCBjYWxsYmFjaworICAgICAgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IFNQSSBNc3AgRGVJbml0IGNhbGxiYWNrCisgICAgICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICAgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKworICAgICAgKCMpIFVzZSBmdW5jdGlvbiBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgd2VhayBmdW5jdGlvbi4KKyAgICAgICAgICBIQUxfU1BJX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgICAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICAgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICA6IFNQSSBUeCBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgICAgOiBTUEkgUnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgIDogU1BJIFR4UnggQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFR4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgIDogU1BJIFJ4IEhhbGYgQ29tcGxldGVkIGNhbGxiYWNrCisgICAgICAgICAgICAoKykgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgIDogU1BJIFR4UnggSGFsZiBDb21wbGV0ZWQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgOiBTUEkgRXJyb3IgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgOiBTUEkgQWJvcnQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBTUEkgTXNwIEluaXQgY2FsbGJhY2sKKyAgICAgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBTUEkgTXNwIERlSW5pdCBjYWxsYmFjaworCisgICAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9TUElfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfU1BJX1NUQVRFX1JFU0VUCisgICAgICAgYWxsIGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICAgICAgIGV4YW1wbGVzIEhBTF9TUElfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NQSV9NYXN0ZXJSeENwbHRDYWxsYmFjaygpLgorICAgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgSEFMX1NQSV9Jbml0KCkvIEhBTF9TUElfRGVJbml0KCkgb25seSB3aGVuCisgICAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBIQUxfU1BJX0luaXQoKS8gSEFMX1NQSV9EZUluaXQoKQorICAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorCisgICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfU1BJX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgICAgaW4gSEFMX1NQSV9TVEFURV9SRUFEWSBvciBIQUxfU1BJX1NUQVRFX1JFU0VUIHN0YXRlLAorICAgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICAgIHVzaW5nIEhBTF9TUElfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9TUElfRGVJbml0KCkKKyAgICAgICBvciBIQUxfU1BJX0luaXQoKSBmdW5jdGlvbi4KKworICAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1BQUF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKyAgICAgWy4uXQorICAgICAgIFVzaW5nIHRoZSBIQUwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlYWNoIGFsbCBzdXBwb3J0ZWQgU1BJIGZyZXF1ZW5jeSB3aXRoIHRoZSBkaWZmZXJlbnQgU1BJIE1vZGVzLAorICAgICAgIHRoZSBmb2xsb3dpbmcgdGFibGUgcmVzdW1lIHRoZSBtYXggU1BJIGZyZXF1ZW5jeSByZWFjaGVkIHdpdGggZGF0YSBzaXplIDhiaXRzLzE2Yml0cywKKyAgICAgICAgIGFjY29yZGluZyB0byBmcmVxdWVuY3kgb2YgdGhlIEFQQnggUGVyaXBoZXJhbCBDbG9jayAoZlBDTEspIHVzZWQgYnkgdGhlIFNQSSBpbnN0YW5jZS4KKworICBAZW5kdmVyYmF0aW0KKworICBBZGRpdGlvbmFsIHRhYmxlIDoKKworICAgICAgIERhdGFTaXplID0gU1BJX0RBVEFTSVpFXzhCSVQ6CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAyTGluZXMgRnVsbGR1cGxleCAgIHwgICAgIDJMaW5lcyBSeE9ubHkgICAgfCAgICAgICAgIDFMaW5lICAgICAgICB8CisgICAgICAgfCBQcm9jZXNzIHwgVHJhbmZlcnQgbW9kZSAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgTWFzdGVyICB8ICBTbGF2ZSAgIHwgIE1hc3RlciAgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8CisgICAgICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CisgICAgICAgfCAgICBUICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAvICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay80ICB8IEZwY2xrLzE2IHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfCAgICBSICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBYICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgTkEgICAgIHwgICAgTkEgICAgfCAgICBOQSAgICAgfCAgIE5BICAgICB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay80ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgIHwgRnBjbGsvOCAgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBSICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay84ICB8IEZwY2xrLzE2IHwgRnBjbGsvOCAgIHwgRnBjbGsvOCAgfCBGcGNsay84ICAgfCBGcGNsay80ICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay80ICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgIHwgRnBjbGsvMTYgfCBGcGNsay8yICAgfCBGcGNsay8xNiB8CisgICAgICAgfD09PT09PT09PXw9PT09PT09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18CisgICAgICAgfCAgICAgICAgIHwgICAgIFBvbGxpbmcgICAgfCBGcGNsay84ICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay84ICAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICBUICAgIHwgICAgIEludGVycnVwdCAgfCBGcGNsay8yICB8IEZwY2xrLzQgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay8xNiAgfCBGcGNsay84ICB8CisgICAgICAgfCAgICBYICAgIHwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CisgICAgICAgfCAgICAgICAgIHwgICAgICAgRE1BICAgICAgfCBGcGNsay8yICB8IEZwY2xrLzIgIHwgICAgIE5BICAgIHwgICAgTkEgICAgfCBGcGNsay84ICAgfCBGcGNsay8xNiB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICBEYXRhU2l6ZSA9IFNQSV9EQVRBU0laRV8xNkJJVDoKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8IDJMaW5lcyBGdWxsZHVwbGV4ICAgfCAgICAgMkxpbmVzIFJ4T25seSAgICB8ICAgICAgICAgMUxpbmUgICAgICAgIHwKKyAgICAgICB8IFByb2Nlc3MgfCBUcmFuZmVydCBtb2RlICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICBNYXN0ZXIgIHwgIFNsYXZlICAgfCAgTWFzdGVyICAgfCAgU2xhdmUgICB8ICBNYXN0ZXIgICB8ICBTbGF2ZSAgIHwKKyAgICAgICB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzQgIHwgRnBjbGsvOCAgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIC8gICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzQgIHwgRnBjbGsvMTYgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8ICAgIFIgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFggICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICBOQSAgICAgfCAgICBOQSAgICB8ICAgIE5BICAgICB8ICAgTkEgICAgIHwKKyAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzQgIHwgRnBjbGsvOCAgfCBGcGNsay8xNiAgfCBGcGNsay84ICB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFIgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzggIHwgRnBjbGsvMTYgfCBGcGNsay84ICAgfCBGcGNsay84ICB8IEZwY2xrLzggICB8IEZwY2xrLzQgIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzQgIHwgRnBjbGsvMiAgfCBGcGNsay8yICAgfCBGcGNsay8xNiB8IEZwY2xrLzIgICB8IEZwY2xrLzE2IHwKKyAgICAgICB8PT09PT09PT09fD09PT09PT09PT09PT09PT18PT09PT09PT09PXw9PT09PT09PT09fD09PT09PT09PT09fD09PT09PT09PT18PT09PT09PT09PT18PT09PT09PT09PXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgUG9sbGluZyAgICB8IEZwY2xrLzggIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzggICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgIFQgICAgfCAgICAgSW50ZXJydXB0ICB8IEZwY2xrLzIgIHwgRnBjbGsvNCAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzE2ICB8IEZwY2xrLzggIHwKKyAgICAgICB8ICAgIFggICAgfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgICAgICB8ICAgICAgICAgfCAgICAgICBETUEgICAgICB8IEZwY2xrLzIgIHwgRnBjbGsvMiAgfCAgICAgTkEgICAgfCAgICBOQSAgICB8IEZwY2xrLzggICB8IEZwY2xrLzE2IHwKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICBAbm90ZSBUaGUgbWF4IFNQSSBmcmVxdWVuY3kgZGVwZW5kIG9uIFNQSSBkYXRhIHNpemUgKDRiaXRzLCA1Yml0cywuLi4sIDhiaXRzLC4uLjE1Yml0cywgMTZiaXRzKSwKKyAgICAgICAgICAgICBTUEkgbW9kZSgyIExpbmVzIGZ1bGxkdXBsZXgsIDIgbGluZXMgUnhPbmx5LCAxIGxpbmUgVFgvUlgpIGFuZCBQcm9jZXNzIG1vZGUgKFBvbGxpbmcsIElULCBETUEpLgorICAgICAgIEBub3RlCisgICAgICAgICAgICAoIykgVFgvUlggcHJvY2Vzc2VzIGFyZSBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZSgpLCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVCgpIGFuZCBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoKQorICAgICAgICAgICAgKCMpIFJYIHByb2Nlc3NlcyBhcmUgSEFMX1NQSV9SZWNlaXZlKCksIEhBTF9TUElfUmVjZWl2ZV9JVCgpIGFuZCBIQUxfU1BJX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgICAgICgjKSBUWCBwcm9jZXNzZXMgYXJlIEhBTF9TUElfVHJhbnNtaXQoKSwgSEFMX1NQSV9UcmFuc21pdF9JVCgpIGFuZCBIQUxfU1BJX1RyYW5zbWl0X0RNQSgpCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBTUEkgU1BJCisgICogQGJyaWVmIFNQSSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisjaWZkZWYgSEFMX1NQSV9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFNQSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9ERUZBVUxUX1RJTUVPVVQgMTAwVQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvbnMgU1BJIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBTUElfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFNQSV9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgU1BJX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgRmlmbywgdWludDMyX3QgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKK3N0YXRpYyB2b2lkIFNQSV9UeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9UeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfUnhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzhCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorc3RhdGljIHZvaWQgU1BJX1J4SVNSXzhCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl8xNkJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgdm9pZCBTUElfQWJvcnRUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhUeF9JU1IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpOworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKTsKK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVR4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHJhbnNhY3Rpb24oU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnMgU1BJIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlLWluaXRpYWxpemUgdGhlIFNQSXggcGVyaXBoZXJhbDoKKworICAgICAgKCspIFVzZXIgbXVzdCBpbXBsZW1lbnQgSEFMX1NQSV9Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIERNQSwgSVQgYW5kIE5WSUMgKS4KKworICAgICAgKCspIENhbGwgdGhlIGZ1bmN0aW9uIEhBTF9TUElfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBNb2RlCisgICAgICAgICgrKykgRGlyZWN0aW9uCisgICAgICAgICgrKykgRGF0YSBTaXplCisgICAgICAgICgrKykgQ2xvY2sgUG9sYXJpdHkgYW5kIFBoYXNlCisgICAgICAgICgrKykgTlNTIE1hbmFnZW1lbnQKKyAgICAgICAgKCsrKSBCYXVkUmF0ZSBQcmVzY2FsZXIKKyAgICAgICAgKCsrKSBGaXJzdEJpdAorICAgICAgICAoKyspIFRJTW9kZQorICAgICAgICAoKyspIENSQyBDYWxjdWxhdGlvbgorICAgICAgICAoKyspIENSQyBQb2x5bm9taWFsIGlmIENSQyBlbmFibGVkCisgICAgICAgICgrKykgQ1JDIExlbmd0aCwgdXNlZCBvbmx5IHdpdGggRGF0YTggYW5kIERhdGExNgorICAgICAgICAoKyspIEZJRk8gcmVjZXB0aW9uIHRocmVzaG9sZAorCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX1NQSV9EZUluaXQoKSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICBvZiB0aGUgc2VsZWN0ZWQgU1BJeCBwZXJpcGhlcmFsLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFNQSSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgU1BJX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgdWludDMyX3QgZnJ4dGg7CisKKyAgLyogQ2hlY2sgdGhlIFNQSSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNwaSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19TUElfQUxMX0lOU1RBTkNFKGhzcGktPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfTU9ERShoc3BpLT5Jbml0Lk1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT04oaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9EQVRBU0laRShoc3BpLT5Jbml0LkRhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfTlNTKGhzcGktPkluaXQuTlNTKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfTlNTUChoc3BpLT5Jbml0Lk5TU1BNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfQkFVRFJBVEVfUFJFU0NBTEVSKGhzcGktPkluaXQuQmF1ZFJhdGVQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9GSVJTVF9CSVQoaHNwaS0+SW5pdC5GaXJzdEJpdCkpOworICBhc3NlcnRfcGFyYW0oSVNfU1BJX1RJTU9ERShoc3BpLT5Jbml0LlRJTW9kZSkpOworICBpZiAoaHNwaS0+SW5pdC5USU1vZGUgPT0gU1BJX1RJTU9ERV9ESVNBQkxFKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9DUE9MKGhzcGktPkluaXQuQ0xLUG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NQSEEoaHNwaS0+SW5pdC5DTEtQaGFzZSkpOworICB9CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NSQ19DQUxDVUxBVElPTihoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uKSk7CisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfU1BJX0NSQ19QT0xZTk9NSUFMKGhzcGktPkluaXQuQ1JDUG9seW5vbWlhbCkpOworICAgIGFzc2VydF9wYXJhbShJU19TUElfQ1JDX0xFTkdUSChoc3BpLT5Jbml0LkNSQ0xlbmd0aCkpOworICB9CisjZWxzZQorICBoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID0gU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBoc3BpLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAvKiBJbml0IHRoZSBTUEkgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KKyAgICBoc3BpLT5UeENwbHRDYWxsYmFjayAgICAgICA9IEhBTF9TUElfVHhDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICovCisgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgICAgICAgPSBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAqLworICAgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgKi8KKyAgICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgICA9IEhBTF9TUElfVHhIYWxmQ3BsdENhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgaHNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrICAgPSBIQUxfU1BJX1J4SGFsZkNwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAqLworICAgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1NQSV9UeFJ4SGFsZkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVHhSeEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgICBoc3BpLT5FcnJvckNhbGxiYWNrICAgICAgICA9IEhBTF9TUElfRXJyb3JDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgICAgPSBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAqLworCisgICAgaWYgKGhzcGktPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TUElfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQy4uLiAqLworICAgIGhzcGktPk1zcEluaXRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMuLi4gKi8KKyAgICBIQUxfU1BJX01zcEluaXQoaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAvKiBBbGlnbiBieSBkZWZhdWx0IHRoZSBycyBmaWZvIHRocmVzaG9sZCBvbiB0aGUgZGF0YSBzaXplICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICBmcnh0aCA9IFNQSV9SWEZJRk9fVEhSRVNIT0xEX0hGOworICB9CisgIGVsc2UKKyAgeworICAgIGZyeHRoID0gU1BJX1JYRklGT19USFJFU0hPTERfUUY7CisgIH0KKworICAvKiBDUkMgY2FsY3VsYXRpb24gaXMgdmFsaWQgb25seSBmb3IgMTZCaXQgYW5kIDggQml0ICovCisgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSAhPSBTUElfREFUQVNJWkVfMTZCSVQpICYmIChoc3BpLT5Jbml0LkRhdGFTaXplICE9IFNQSV9EQVRBU0laRV84QklUKSkKKyAgeworICAgIC8qIENSQyBtdXN0IGJlIGRpc2FibGVkICovCisgICAgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9IFNQSV9DUkNDQUxDVUxBVElPTl9ESVNBQkxFOworICB9CisKKyAgLyogQWxpZ24gdGhlIENSQyBMZW5ndGggb24gdGhlIGRhdGEgc2l6ZSAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfREFUQVNJWkUpCisgIHsKKyAgICAvKiBDUkMgTGVuZ3RoIGFsaWduZWQgb24gdGhlIGRhdGEgc2l6ZSA6IHZhbHVlIHNldCBieSBkZWZhdWx0ICovCisgICAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgICB7CisgICAgICBoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9IFNQSV9DUkNfTEVOR1RIXzE2QklUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHNwaS0+SW5pdC5DUkNMZW5ndGggPSBTUElfQ1JDX0xFTkdUSF84QklUOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUjEgJiBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgOiBTUEkgTW9kZSwgQ29tbXVuaWNhdGlvbiBNb2RlLCBDbG9jayBwb2xhcml0eSBhbmQgcGhhc2UsIE5TUyBtYW5hZ2VtZW50LAorICBDb21tdW5pY2F0aW9uIHNwZWVkLCBGaXJzdCBiaXQgYW5kIENSQyBjYWxjdWxhdGlvbiBzdGF0ZSAqLworICBXUklURV9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSMSwgKGhzcGktPkluaXQuTW9kZSB8IGhzcGktPkluaXQuRGlyZWN0aW9uIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3BpLT5Jbml0LkNMS1BvbGFyaXR5IHwgaHNwaS0+SW5pdC5DTEtQaGFzZSB8IChoc3BpLT5Jbml0Lk5TUyAmIFNQSV9DUjFfU1NNKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+SW5pdC5CYXVkUmF0ZVByZXNjYWxlciB8IGhzcGktPkluaXQuRmlyc3RCaXQgIHwgaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbikpOworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogQ29uZmlndXJlIDogQ1JDIExlbmd0aCAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpCisgIHsKKyAgICBoc3BpLT5JbnN0YW5jZS0+Q1IxIHw9IFNQSV9DUjFfQ1JDTDsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ29uZmlndXJlIDogTlNTIG1hbmFnZW1lbnQsIFRJIE1vZGUsIE5TUyBQdWxzZSwgRGF0YSBzaXplIGFuZCBSeCBGaWZvIHRocmVzaG9sZCAqLworICBXUklURV9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKCgoaHNwaS0+SW5pdC5OU1MgPj4gMTZVKSAmIFNQSV9DUjJfU1NPRSkgfCBoc3BpLT5Jbml0LlRJTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwaS0+SW5pdC5OU1NQTW9kZSB8IGhzcGktPkluaXQuRGF0YVNpemUpIHwgZnJ4dGgpOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUkNQT0xZIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIDogQ1JDIFBvbHlub21pYWwgKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFdSSVRFX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1JDUFIsIGhzcGktPkluaXQuQ1JDUG9seW5vbWlhbCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisjaWYgZGVmaW5lZChTUElfSTJTQ0ZHUl9JMlNNT0QpCisgIC8qIEFjdGl2YXRlIHRoZSBTUEkgbW9kZSAoTWFrZSBzdXJlIHRoYXQgSTJTTU9EIGJpdCBpbiBJMlNDRkdSIHJlZ2lzdGVyIGlzIHJlc2V0KSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkkyU0NGR1IsIFNQSV9JMlNDRkdSX0kyU01PRCk7CisjZW5kaWYgLyogU1BJX0kyU0NGR1JfSTJTTU9EICovCisKKyAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5TdGF0ZSAgICAgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSB0aGUgU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogQ2hlY2sgdGhlIFNQSSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHNwaSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIFNQSSBJbnN0YW5jZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoaHNwaS0+SW5zdGFuY2UpKTsKKworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBTUEkgUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGlmIChoc3BpLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcERlSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAqLworICB9CisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgIGhzcGktPk1zcERlSW5pdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDLi4uICovCisgIEhBTF9TUElfTXNwRGVJbml0KGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBTUEkgTVNQLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9Nc3BJbml0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9Nc3BJbml0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemUgdGhlIFNQSSBNU1AuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX01zcERlSW5pdChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHNwaSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9TUElfTXNwRGVJbml0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNQSSBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhzcGkgUG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlZ2lzdGVyQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNQSV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlIHw9IEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoSEFMX1NQSV9TVEFURV9SRUFEWSA9PSBoc3BpLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9TUElfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1JYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfVFhfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlR4UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9BQk9SVF9DQl9JRCA6CisgICAgICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9TUElfU1RBVEVfUkVTRVQgPT0gaHNwaS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0spOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gU1BJIENhbGxiYWNrCisgICogICAgICAgICBTUEkgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoc3BpIFBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSS4KKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9VblJlZ2lzdGVyQ2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIEhBTF9TUElfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgaWYgKEhBTF9TUElfU1RBVEVfUkVBRFkgPT0gaHNwaS0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfU1BJX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeENwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhSeENwbHRDYWxsYmFjayA9IEhBTF9TUElfVHhSeENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeFJ4Q3BsdENhbGxiYWNrICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX1RYX0hBTEZfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFR4SGFsZkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfUlhfSEFMRl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1NQSV9UWF9SWF9IQUxGX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBUeFJ4SGFsZkNwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayA9IEhBTF9TUElfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX0FCT1JUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrOyAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoc3BpLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9TUElfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1BJX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLKTsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfU1BJX1NUQVRFX1JFU0VUID09IGhzcGktPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1NQSV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHNwaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfU1BJX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhzcGktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NQSV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyk7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFNQSQorICAgIGRhdGEgdHJhbnNmZXJzLgorCisgICAgWy4uXSBUaGUgU1BJIHN1cHBvcnRzIG1hc3RlciBhbmQgc2xhdmUgbW9kZSA6CisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgKCsrKSBOby1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cworICAgICAgICAgICAgb3IgRE1BLCBUaGVzZSBBUElzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgZGVkaWNhdGVkIFNQSSBJUlEgd2hlbiB1c2luZyBJbnRlcnJ1cHQgbW9kZSBvciB0aGUgRE1BIElSUSB3aGVuCisgICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgIFRoZSBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soKSBhbmQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIFJlY2VpdmUgcHJvY2VzcworICAgICAgICAgICAgVGhlIEhBTF9TUElfRXJyb3JDYWxsYmFjaygpdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkCisKKyAgICAoIykgQVBJcyBwcm92aWRlZCBmb3IgdGhlc2UgMiB0cmFuc2ZlciBtb2RlcyAoQmxvY2tpbmcgbW9kZSBvciBOb24gYmxvY2tpbmcgbW9kZSB1c2luZyBlaXRoZXIgSW50ZXJydXB0IG9yIERNQSkKKyAgICAgICAgZXhpc3QgZm9yIDFMaW5lIChzaW1wbGV4KSBhbmQgMkxpbmVzIChmdWxsIGR1cGxleCkgbW9kZXMuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisgIHVpbnQxNl90IGluaXRpYWxfVHhYZmVyQ291bnQ7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVNfT1JfMUxJTkUoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworICBpbml0aWFsX1R4WGZlckNvdW50ID0gU2l6ZTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5SeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9UWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgICAgd2hpbGUgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1RYRSkpCisgICAgICB7CisgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogVHJhbnNtaXQgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX1NMQVZFKSB8fCAoaW5pdGlhbF9UeFhmZXJDb3VudCA9PSAweDAxVSkpCisgICAgeworICAgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID4gMVUpCisgICAgICB7CisgICAgICAgIC8qIHdyaXRlIG9uIHRoZSBkYXRhIHJlZ2lzdGVyIGluIHBhY2tpbmcgbW9kZSAqLworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKSA9ICgqaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgIGhzcGktPnBUeEJ1ZmZQdHIgKys7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5UeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0IHRvIHNlbmQgZGF0YSAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19UWEUpKQorICAgICAgeworICAgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdyaXRlIG9uIHRoZSBkYXRhIHJlZ2lzdGVyIGluIHBhY2tpbmcgbW9kZSAqLworICAgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgICBoc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgICAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7CisgIH0KKworICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBpcyBub3QgcmVhZCAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpCisgIHsKKyAgICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgfQorCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisKK2Vycm9yOgorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9SZWNlaXZlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZShoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUsIFRpbWVvdXQpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilOVUxMOworICBoc3BpLT5UeFhmZXJTaXplICA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgIC8qIHRoaXMgaXMgZG9uZSB0byBoYW5kbGUgdGhlIENSQ05FWFQgYmVmb3JlIHRoZSBsYXRlc3QgZGF0YSAqLworICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgUnggRmlmbyB0aHJlc2hvbGQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9SWChoc3BpKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBSZWNlaXZlIGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA8PSBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIC8qIFRyYW5zZmVyIGxvb3AgKi8KKyAgICB3aGlsZSAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgUlhORSBmbGFnICovCisgICAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKQorICAgICAgeworICAgICAgICAvKiByZWFkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgICAgICgqICh1aW50OF90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBUaW1lb3V0IG1hbmFnZW1lbnQgKi8KKyAgICAgICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID49ICBUaW1lb3V0KSAmJiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBUcmFuc2ZlciBsb29wICovCisgICAgd2hpbGUgKGhzcGktPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIFJYTkUgZmxhZyAqLworICAgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19SWE5FKSkKKyAgICAgIHsKKyAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogVGltZW91dCBtYW5hZ2VtZW50ICovCisgICAgICAgIGlmICgoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogSGFuZGxlIHRoZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICAvKiBmcmVlemUgdGhlIENSQyBiZWZvcmUgdGhlIGxhdGVzdCBkYXRhICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworCisgICAgLyogUmVhZCB0aGUgbGF0ZXN0IGRhdGEgKi8KKyAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiB0aGUgbGF0ZXN0IGRhdGEgaGFzIG5vdCBiZWVuIHJlY2VpdmVkICovCisgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogUmVjZWl2ZSBsYXN0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICAgIHsKKyAgICAgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpaHNwaS0+SW5zdGFuY2UtPkRSOworICAgIH0KKyAgICAvKiBSZWNlaXZlIGxhc3QgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICgqKHVpbnQ4X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUjsKKyAgICB9CisKKyAgICAvKiBXYWl0IHRoZSBDUkMgZGF0YSAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfVElNRU9VVDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogUmVhZCBDUkMgdG8gRmx1c2ggRFIgYW5kIFJYTkUgZmxhZyAqLworICAgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV8xNkJJVCkKKyAgICB7CisgICAgICAvKiBSZWFkIDE2Yml0IENSQyAqLworICAgICAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlYWQgOGJpdCBDUkMgKi8KKyAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisKKyAgICAgIGlmICgoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfOEJJVCkgJiYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDIGFnYWluIGluIGNhc2Ugb2YgMTZiaXQgQ1JDIGluIDhiaXQgRGF0YSBtb2RlICovCisgICAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICBpZiAoU1BJX0VuZFJ4VHJhbnNhY3Rpb24oaHNwaSwgVGltZW91dCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0ZMQUc7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfQ1JDRVJSKSkKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICB9CisKK2Vycm9yIDoKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQKKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NQSV9UcmFuc21pdFJlY2VpdmUoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MTZfdCAgICAgICAgICAgICBpbml0aWFsX1R4WGZlckNvdW50OworICB1aW50MTZfdCAgICAgICAgICAgICBpbml0aWFsX1J4WGZlckNvdW50OworICB1aW50MzJfdCAgICAgICAgICAgICB0bXBfbW9kZTsKKyAgSEFMX1NQSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOworICB1aW50MzJfdCAgICAgICAgICAgICB0aWNrc3RhcnQ7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICB1aW50MzJfdCAgICAgICAgICAgICBzcGlfY3IxOworICB1aW50MzJfdCAgICAgICAgICAgICBzcGlfY3IyOworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogVmFyaWFibGUgdXNlZCB0byBhbHRlcm5hdGUgUnggYW5kIFR4IGR1cmluZyB0cmFuc2ZlciAqLworICB1aW50MzJfdCAgICAgICAgICAgICB0eGFsbG93ZWQgPSAxVTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgICAgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBJbml0IHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdG1wX3N0YXRlICAgICAgICAgICA9IGhzcGktPlN0YXRlOworICB0bXBfbW9kZSAgICAgICAgICAgID0gaHNwaS0+SW5pdC5Nb2RlOworICBpbml0aWFsX1R4WGZlckNvdW50ID0gU2l6ZTsKKyAgaW5pdGlhbF9SeFhmZXJDb3VudCA9IFNpemU7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICBzcGlfY3IxICAgICAgICAgICAgID0gUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkNSMSk7CisgIHNwaV9jcjIgICAgICAgICAgICAgPSBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+Q1IyKTsKKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmICghKCh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9SRUFEWSkgfHwgXAorICAgICAgICAoKHRtcF9tb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkpKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBEb24ndCBvdmVyd3JpdGUgaW4gY2FzZSBvZiBIQUxfU1BJX1NUQVRFX0JVU1lfUlggKi8KKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9CVVNZX1RYX1JYOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5FcnJvckNvZGUgICA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgaHNwaS0+cFJ4QnVmZlB0ciAgPSAodWludDhfdCAqKXBSeERhdGE7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcFR4RGF0YTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSBTaXplOworICBoc3BpLT5UeFhmZXJTaXplICA9IFNpemU7CisKKyAgLypJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFNldCB0aGUgUnggRmlmbyB0aHJlc2hvbGQgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8IChpbml0aWFsX1J4WGZlckNvdW50ID4gMVUpKQorICB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBmaWZvcnh0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDhiaXQgKi8KKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9TTEFWRSkgfHwgKGluaXRpYWxfVHhYZmVyQ291bnQgPT0gMHgwMVUpKQorICAgIHsKKyAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHx8IChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkKKyAgICB7CisgICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgJiYgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpICYmICh0eGFsbG93ZWQgPT0gMVUpKQorICAgICAgeworICAgICAgICBoc3BpLT5JbnN0YW5jZS0+RFIgPSAqKCh1aW50MTZfdCAqKWhzcGktPnBUeEJ1ZmZQdHIpOworICAgICAgICBoc3BpLT5wVHhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICAgIC8qIE5leHQgRGF0YSBpcyBhIHJlY2VwdGlvbiAoUngpLiBUeCBub3QgYWxsb3dlZCAqLworICAgICAgICB0eGFsbG93ZWQgPSAwVTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgICAgICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgTlNTIFNvZnQgdG8gcmVjZWl2ZWQgY29ycmVjdGx5IHRoZSBDUkMgb24gc2xhdmUgbW9kZSB3aXRoIE5TUyBwdWxzZSBhY3RpdmF0ZWQgKi8KKyAgICAgICAgICBpZiAoKFJFQURfQklUKHNwaV9jcjEsIFNQSV9DUjFfTVNUUikgPT0gMFUpICYmIChSRUFEX0JJVChzcGlfY3IyLCBTUElfQ1IyX05TU1ApID09IFNQSV9DUjJfTlNTUCkpCisgICAgICAgICAgeworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX1NTTSk7CisgICAgICAgICAgfQorICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIFJYTkUgZmxhZyAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfUlhORSkpICYmIChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkKKyAgICAgIHsKKyAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgVHJhbnNtaXNzaW9uIChUeCkuIFR4IGlzIGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMVU7CisgICAgICB9CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgJiYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkpCisgICAgICB7CisgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBkYXRhIGluIDggQml0IG1vZGUgKi8KKyAgZWxzZQorICB7CisgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfU0xBVkUpIHx8IChpbml0aWFsX1R4WGZlckNvdW50ID09IDB4MDFVKSkKKyAgICB7CisgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCAtPSAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSID0gKCpoc3BpLT5wVHhCdWZmUHRyKTsKKyAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoKGhzcGktPlR4WGZlckNvdW50ID4gMFUpIHx8IChoc3BpLT5SeFhmZXJDb3VudCA+IDBVKSkKKyAgICB7CisgICAgICAvKiBDaGVjayBUWEUgZmxhZyAqLworICAgICAgaWYgKChfX0hBTF9TUElfR0VUX0ZMQUcoaHNwaSwgU1BJX0ZMQUdfVFhFKSkgJiYgKGhzcGktPlR4WGZlckNvdW50ID4gMFUpICYmICh0eGFsbG93ZWQgPT0gMVUpKQorICAgICAgeworICAgICAgICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPiAxVSkKKyAgICAgICAgeworICAgICAgICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUiA9ICgqaHNwaS0+cFR4QnVmZlB0cik7CisgICAgICAgICAgaHNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICAgIGhzcGktPlR4WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgcmVjZXB0aW9uIChSeCkuIFR4IG5vdCBhbGxvd2VkICovCisgICAgICAgIHR4YWxsb3dlZCA9IDBVOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgICBpZiAoKGhzcGktPlR4WGZlckNvdW50ID09IDBVKSAmJiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBOU1MgU29mdCB0byByZWNlaXZlZCBjb3JyZWN0bHkgdGhlIENSQyBvbiBzbGF2ZSBtb2RlIHdpdGggTlNTIHB1bHNlIGFjdGl2YXRlZCAqLworICAgICAgICAgIGlmICgoUkVBRF9CSVQoc3BpX2NyMSwgU1BJX0NSMV9NU1RSKSA9PSAwVSkgJiYgKFJFQURfQklUKHNwaV9jcjIsIFNQSV9DUjJfTlNTUCkgPT0gU1BJX0NSMl9OU1NQKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfU1NNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICAgIH0KKworICAgICAgLyogV2FpdCB1bnRpbCBSWE5FIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgIGlmICgoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX1JYTkUpKSAmJiAoaHNwaS0+UnhYZmVyQ291bnQgPiAwVSkpCisgICAgICB7CisgICAgICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA+IDFVKQorICAgICAgICB7CisgICAgICAgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCloc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgICAgaHNwaS0+cFJ4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICAgIGhzcGktPlJ4WGZlckNvdW50IC09IDJVOworICAgICAgICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA8PSAxVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYmVmb3JlIHRvIHN3aXRjaCBvbiA4IGJpdCBkYXRhIHNpemUgKi8KKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAoKih1aW50OF90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFI7CisgICAgICAgICAgaHNwaS0+cFJ4QnVmZlB0cisrOworICAgICAgICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgLyogTmV4dCBEYXRhIGlzIGEgVHJhbnNtaXNzaW9uIChUeCkuIFR4IGlzIGFsbG93ZWQgKi8KKyAgICAgICAgdHhhbGxvd2VkID0gMVU7CisgICAgICB9CisgICAgICBpZiAoKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPj0gIFRpbWVvdXQpICYmICgoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKSkpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3Jjb2RlID0gSEFMX1RJTUVPVVQ7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlYWQgQ1JDIGZyb20gRFIgdG8gY2xvc2UgQ1JDIGNhbGN1bGF0aW9uIHByb2Nlc3MgKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgKi8KKyAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBUaW1lb3V0LCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFcnJvciBvbiB0aGUgQ1JDIHJlY2VwdGlvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogUmVhZCBDUkMgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA9PSBTUElfREFUQVNJWkVfMTZCSVQpCisgICAgeworICAgICAgLyogUmVhZCAxNmJpdCBDUkMgKi8KKyAgICAgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZWFkIDhiaXQgQ1JDICovCisgICAgICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworCisgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpCisgICAgICB7CisgICAgICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19SWE5FLCBTRVQsIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgICAgIGVycm9yY29kZSA9IEhBTF9USU1FT1VUOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCA4Yml0IENSQyBhZ2FpbiBpbiBjYXNlIG9mIDE2Yml0IENSQyBpbiA4Yml0IERhdGEgbW9kZSAqLworICAgICAgICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgIC8qIENsZWFyIENSQyBGbGFnICovCisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFRpbWVvdXQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgfQorCitlcnJvciA6CisgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1RyYW5zbWl0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTX09SXzFMSU5FKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+UnhJU1IgICAgICAgPSBOVUxMOworCisgIC8qIFNldCB0aGUgZnVuY3Rpb24gZm9yIElUIHRyZWF0bWVudCAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgaHNwaS0+VHhJU1IgPSBTUElfVHhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNwaS0+VHhJU1IgPSBTUElfVHhJU1JfOEJJVDsKKyAgfQorCisgIC8qIENvbmZpZ3VyZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbiA6IDFMaW5lICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICB7CisgICAgU1BJXzFMSU5FX1RYKGhzcGkpOworICB9CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICB7CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX0VSUikpOworCisKKyAgLyogQ2hlY2sgaWYgdGhlIFNQSSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKyAgaWYgKChoc3BpLT5JbnN0YW5jZS0+Q1IxICYgU1BJX0NSMV9TUEUpICE9IFNQSV9DUjFfU1BFKQorICB7CisgICAgLyogRW5hYmxlIFNQSSBwZXJpcGhlcmFsICovCisgICAgX19IQUxfU1BJX0VOQUJMRShoc3BpKTsKKyAgfQorCitlcnJvciA6CisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX1JlY2VpdmVfSVQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9JVChoc3BpLCBwRGF0YSwgcERhdGEsIFNpemUpOworICB9CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9SWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+UnhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisgIC8qIENoZWNrIHRoZSBkYXRhIHNpemUgdG8gYWRhcHQgUnggdGhyZXNob2xkIGFuZCB0aGUgc2V0IHRoZSBmdW5jdGlvbiBmb3IgSVQgdHJlYXRtZW50ICovCisgIGlmIChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpCisgIHsKKyAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDE2IGJpdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgICAgaHNwaS0+UnhJU1IgPSBTUElfUnhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiA4IGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzhCSVQ7CisgIH0KKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9SWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAxVTsKKyAgICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5Jbml0LkNSQ0xlbmd0aCA9PSBTUElfQ1JDX0xFTkdUSF8xNkJJVCkpCisgICAgeworICAgICAgaHNwaS0+Q1JDU2l6ZSA9IDJVOworICAgIH0KKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisgIGVsc2UKKyAgeworICAgIGhzcGktPkNSQ1NpemUgPSAwVTsKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgLyogRW5hYmxlIFRYRSBhbmQgRVJSIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBOb3RlIDogVGhlIFNQSSBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgdW5sb2NraW5nIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHJpc2sgb2YgU1BJIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICBwcm9jZXNzIHVubG9jayAqLworCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBhbmQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byB0cmFuc21pc3Npb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byByZWNlcHRpb24gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCBhbmQgcmVjZWl2ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCAgICAgICAgICAgICB0bXBfbW9kZTsKKyAgSEFMX1NQSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOworICBIQUxfU3RhdHVzVHlwZURlZiAgICBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgRGlyZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RJUkVDVElPTl8yTElORVMoaHNwaS0+SW5pdC5EaXJlY3Rpb24pKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIEluaXQgdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworICB0bXBfc3RhdGUgICAgICAgICAgID0gaHNwaS0+U3RhdGU7CisgIHRtcF9tb2RlICAgICAgICAgICAgPSBoc3BpLT5Jbml0Lk1vZGU7CisKKyAgaWYgKCEoKHRtcF9zdGF0ZSA9PSBIQUxfU1BJX1NUQVRFX1JFQURZKSB8fCBcCisgICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmICh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcFR4RGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwUnhEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBTZXQgdGhlIGZ1bmN0aW9uIGZvciBJVCB0cmVhdG1lbnQgKi8KKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIGhzcGktPlJ4SVNSICAgICA9IFNQSV8ybGluZXNSeElTUl8xNkJJVDsKKyAgICBoc3BpLT5UeElTUiAgICAgPSBTUElfMmxpbmVzVHhJU1JfMTZCSVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNwaS0+UnhJU1IgICAgID0gU1BJXzJsaW5lc1J4SVNSXzhCSVQ7CisgICAgaHNwaS0+VHhJU1IgICAgID0gU1BJXzJsaW5lc1R4SVNSXzhCSVQ7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMVU7CisgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplIDw9IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfMTZCSVQpKQorICAgIHsKKyAgICAgIGhzcGktPkNSQ1NpemUgPSAyVTsKKyAgICB9CisgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBoc3BpLT5DUkNTaXplID0gMFU7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIENoZWNrIGlmIHBhY2tpbmcgbW9kZSBpcyBlbmFibGVkIGFuZCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMiBkYXRhIHRvIHJlY2VpdmUgKi8KKyAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID4gU1BJX0RBVEFTSVpFXzhCSVQpIHx8IChTaXplID49IDJVKSkKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTYgYml0ICovCisgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgUlggRmlmbyB0aHJlc2hvbGQgYWNjb3JkaW5nIHRoZSByZWNlcHRpb24gZGF0YSBsZW5ndGg6IDggYml0ICovCisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgIH0KKworICAvKiBFbmFibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAvKiBDaGVjayBpZiB0aGUgU1BJIGlzIGFscmVhZHkgZW5hYmxlZCAqLworICBpZiAoKGhzcGktPkluc3RhbmNlLT5DUjEgJiBTUElfQ1IxX1NQRSkgIT0gU1BJX0NSMV9TUEUpCisgIHsKKyAgICAvKiBFbmFibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRU5BQkxFKGhzcGkpOworICB9CisKK2Vycm9yIDoKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRfRE1BKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworCisgIC8qIENoZWNrIHR4IGRtYSBoYW5kbGUgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOworCisgIC8qIENoZWNrIERpcmVjdGlvbiBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ESVJFQ1RJT05fMkxJTkVTX09SXzFMSU5FKGhzcGktPkluaXQuRGlyZWN0aW9uKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9SRUFEWSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9CVVNZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgeworICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiAqLworICBoc3BpLT5TdGF0ZSAgICAgICA9IEhBTF9TUElfU1RBVEVfQlVTWV9UWDsKKyAgaHNwaS0+RXJyb3JDb2RlICAgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgIGhzcGktPnBUeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwRGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgLyogSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlJ4WGZlclNpemUgID0gMFU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ29uZmlndXJlIGNvbW11bmljYXRpb24gZGlyZWN0aW9uIDogMUxpbmUgKi8KKyAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgIHsKKyAgICBTUElfMUxJTkVfVFgoaHNwaSk7CisgIH0KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgIHsKKyAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAvKiBTZXQgdGhlIFNQSSBUeERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTUElfRE1BSGFsZlRyYW5zbWl0Q3BsdDsKKworICAvKiBTZXQgdGhlIFNQSSBUeERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTUElfRE1BVHJhbnNtaXRDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTUElfRE1BRXJyb3I7CisKKyAgLyogU2V0IHRoZSBETUEgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgLyogUGFja2luZyBtb2RlIGlzIGVuYWJsZWQgb25seSBpZiB0aGUgRE1BIHNldHRpbmcgaXMgSEFMV09SRCAqLworICBpZiAoKGhzcGktPkluaXQuRGF0YVNpemUgPD0gU1BJX0RBVEFTSVpFXzhCSVQpICYmIChoc3BpLT5oZG1hdHgtPkluaXQuTWVtRGF0YUFsaWdubWVudCA9PSBETUFfTURBVEFBTElHTl9IQUxGV09SRCkpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgZXZlbi9vZGQgb2YgdGhlIGRhdGEgc2l6ZSArIGNyYyBpZiBlbmFibGVkICovCisgICAgaWYgKChoc3BpLT5UeFhmZXJDb3VudCAmIDB4MVUpID09IDBVKQorICAgIHsKKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IChoc3BpLT5UeFhmZXJDb3VudCA+PiAxVSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVRYKTsKKyAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gKGhzcGktPlR4WGZlckNvdW50ID4+IDFVKSArIDFVOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgVHggRE1BIFN0cmVhbS9DaGFubmVsICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hdHgsICh1aW50MzJfdCloc3BpLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwgaHNwaS0+VHhYZmVyQ291bnQpKQorICB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFNQSSBFcnJvciBJbnRlcnJ1cHQgQml0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsKKworICAvKiBFbmFibGUgVHggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCitlcnJvciA6CisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhzcGkpOworICByZXR1cm4gZXJyb3Jjb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQG5vdGUgICBJbiBjYXNlIG9mIE1BU1RFUiBtb2RlIGFuZCBTUElfRElSRUNUSU9OXzJMSU5FUyBkaXJlY3Rpb24sIGhkbWF0eCBzaGFsbCBiZSBkZWZpbmVkLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBub3RlICAgV2hlbiB0aGUgQ1JDIGZlYXR1cmUgaXMgZW5hYmxlZCB0aGUgcERhdGEgTGVuZ3RoIG11c3QgYmUgU2l6ZSArIDEuCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfUmVjZWl2ZV9ETUEoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcnggZG1hIGhhbmRsZSAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXJ4KSk7CisKKyAgaWYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykgJiYgKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBDaGVjayB0eCBkbWEgaGFuZGxlICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1NQSV9ETUFfSEFORExFKGhzcGktPmhkbWF0eCkpOworCisgICAgLyogQ2FsbCB0cmFuc21pdC1yZWNlaXZlIGZ1bmN0aW9uIHRvIHNlbmQgRHVtbXkgZGF0YSBvbiBUeCBsaW5lIGFuZCBnZW5lcmF0ZSBjbG9jayBvbiBDTEsgbGluZSAqLworICAgIHJldHVybiBIQUxfU1BJX1RyYW5zbWl0UmVjZWl2ZV9ETUEoaHNwaSwgcERhdGEsIHBEYXRhLCBTaXplKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfQlVTWTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIFNldCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgaHNwaS0+U3RhdGUgICAgICAgPSBIQUxfU1BJX1NUQVRFX0JVU1lfUlg7CisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wUnhCdWZmUHRyICA9ICh1aW50OF90ICopcERhdGE7CisgIGhzcGktPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgaHNwaS0+UnhYZmVyQ291bnQgPSBTaXplOworCisgIC8qSW5pdCBmaWVsZCBub3QgdXNlZCBpbiBoYW5kbGUgdG8gemVybyAqLworICBoc3BpLT5SeElTUiAgICAgICA9IE5VTEw7CisgIGhzcGktPlR4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDb25maWd1cmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24gOiAxTGluZSAqLworICBpZiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgeworICAgIFNQSV8xTElORV9SWChoc3BpKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisKKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgaWYgKGhzcGktPkluaXQuRGF0YVNpemUgPiBTUElfREFUQVNJWkVfOEJJVCkKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgaWYgKGhzcGktPmhkbWFyeC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKQorICAgIHsKKyAgICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisKKyAgICAgIGlmICgoaHNwaS0+UnhYZmVyQ291bnQgJiAweDFVKSA9PSAweDBVKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IGhzcGktPlJ4WGZlckNvdW50ID4+IDFVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfTERNQVJYKTsKKyAgICAgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAoaHNwaS0+UnhYZmVyQ291bnQgPj4gMVUpICsgMVU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHRoZSBTUEkgUnhETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdDsKKworICAvKiBTZXQgdGhlIFNQSSBSeCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1BJX0RNQVJlY2VpdmVDcGx0OworCisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTUElfRE1BRXJyb3I7CisKKyAgLyogU2V0IHRoZSBETUEgQWJvcnRDcGx0Q2FsbGJhY2sgKi8KKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRW5hYmxlIHRoZSBSeCBETUEgU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hcngsICh1aW50MzJfdCkmaHNwaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpaHNwaS0+cFJ4QnVmZlB0ciwgaHNwaS0+UnhYZmVyQ291bnQpKQorICB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFNQSSBFcnJvciBJbnRlcnJ1cHQgQml0ICovCisgIF9fSEFMX1NQSV9FTkFCTEVfSVQoaHNwaSwgKFNQSV9JVF9FUlIpKTsKKworICAvKiBFbmFibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworCitlcnJvcjoKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgVHJhbnNtaXQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gdHJhbnNtaXNzaW9uIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gcmVjZXB0aW9uIGRhdGEgYnVmZmVyCisgICogQG5vdGUgICBXaGVuIHRoZSBDUkMgZmVhdHVyZSBpcyBlbmFibGVkIHRoZSBwUnhEYXRhIExlbmd0aCBtdXN0IGJlIFNpemUgKyAxCisgICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfVHJhbnNtaXRSZWNlaXZlX0RNQShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKQoreworICB1aW50MzJfdCAgICAgICAgICAgICB0bXBfbW9kZTsKKyAgSEFMX1NQSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGUgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgcnggJiB0eCBkbWEgaGFuZGxlcyAqLworICBhc3NlcnRfcGFyYW0oSVNfU1BJX0RNQV9IQU5ETEUoaHNwaS0+aGRtYXJ4KSk7CisgIGFzc2VydF9wYXJhbShJU19TUElfRE1BX0hBTkRMRShoc3BpLT5oZG1hdHgpKTsKKworICAvKiBDaGVjayBEaXJlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TUElfRElSRUNUSU9OXzJMSU5FUyhoc3BpLT5Jbml0LkRpcmVjdGlvbikpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHNwaSk7CisKKyAgLyogSW5pdCB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisgIHRtcF9zdGF0ZSAgICAgICAgICAgPSBoc3BpLT5TdGF0ZTsKKyAgdG1wX21vZGUgICAgICAgICAgICA9IGhzcGktPkluaXQuTW9kZTsKKworICBpZiAoISgodG1wX3N0YXRlID09IEhBTF9TUElfU1RBVEVfUkVBRFkpIHx8CisgICAgICAgICgodG1wX21vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVMpICYmICh0bXBfc3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKSkpKQorICB7CisgICAgZXJyb3Jjb2RlID0gSEFMX0JVU1k7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgIHsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIERvbid0IG92ZXJ3cml0ZSBpbiBjYXNlIG9mIEhBTF9TUElfU1RBVEVfQlVTWV9SWCAqLworICBpZiAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0JVU1lfVFhfUlg7CisgIH0KKworICAvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uICovCisgIGhzcGktPkVycm9yQ29kZSAgID0gSEFMX1NQSV9FUlJPUl9OT05FOworICBoc3BpLT5wVHhCdWZmUHRyICA9ICh1aW50OF90ICopcFR4RGF0YTsKKyAgaHNwaS0+VHhYZmVyU2l6ZSAgPSBTaXplOworICBoc3BpLT5UeFhmZXJDb3VudCA9IFNpemU7CisgIGhzcGktPnBSeEJ1ZmZQdHIgID0gKHVpbnQ4X3QgKilwUnhEYXRhOworICBoc3BpLT5SeFhmZXJTaXplICA9IFNpemU7CisgIGhzcGktPlJ4WGZlckNvdW50ID0gU2l6ZTsKKworICAvKiBJbml0IGZpZWxkIG5vdCB1c2VkIGluIGhhbmRsZSB0byB6ZXJvICovCisgIGhzcGktPlJ4SVNSICAgICAgID0gTlVMTDsKKyAgaHNwaS0+VHhJU1IgICAgICAgPSBOVUxMOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBSZXNldCBDUkMgQ2FsY3VsYXRpb24gKi8KKyAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgeworICAgIFNQSV9SRVNFVF9DUkMoaHNwaSk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIC8qIFJlc2V0IHRoZSB0aHJlc2hvbGQgYml0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCB8IFNQSV9DUjJfTERNQVJYKTsKKworICAvKiBUaGUgcGFja2luZyBtb2RlIG1hbmFnZW1lbnQgaXMgZW5hYmxlZCBieSB0aGUgRE1BIHNldHRpbmdzIGFjY29yZGluZyB0aGUgc3BpIGRhdGEgc2l6ZSAqLworICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICB7CisgICAgLyogU2V0IGZpZm9yeHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogMTZiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX1JYRklGT19USFJFU0hPTEQpOworCisgICAgaWYgKGhzcGktPmhkbWF0eC0+SW5pdC5NZW1EYXRhQWxpZ25tZW50ID09IERNQV9NREFUQUFMSUdOX0hBTEZXT1JEKQorICAgIHsKKyAgICAgIGlmICgoaHNwaS0+VHhYZmVyU2l6ZSAmIDB4MVUpID09IDB4MFUpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFUWCk7CisgICAgICAgIGhzcGktPlR4WGZlckNvdW50ID0gaHNwaS0+VHhYZmVyQ291bnQgPj4gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BVFgpOworICAgICAgICBoc3BpLT5UeFhmZXJDb3VudCA9IChoc3BpLT5UeFhmZXJDb3VudCA+PiAxVSkgKyAxVTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaHNwaS0+aGRtYXJ4LT5Jbml0Lk1lbURhdGFBbGlnbm1lbnQgPT0gRE1BX01EQVRBQUxJR05fSEFMRldPUkQpCisgICAgeworICAgICAgLyogU2V0IFJYIEZpZm8gdGhyZXNob2xkIGFjY29yZGluZyB0aGUgcmVjZXB0aW9uIGRhdGEgbGVuZ3RoOiAxNmJpdCAqLworICAgICAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKworICAgICAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCAmIDB4MVUpID09IDB4MFUpCisgICAgICB7CisgICAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0xETUFSWCk7CisgICAgICAgIGhzcGktPlJ4WGZlckNvdW50ID0gaHNwaS0+UnhYZmVyQ291bnQgPj4gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9MRE1BUlgpOworICAgICAgICBoc3BpLT5SeFhmZXJDb3VudCA9IChoc3BpLT5SeFhmZXJDb3VudCA+PiAxVSkgKyAxVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiB3ZSBhcmUgaW4gUnggb25seSBvciBpbiBSeC9UeCBNb2RlIGFuZCBjb25maWd1cmUgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICB7CisgICAgLyogU2V0IHRoZSBTUEkgUnggRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICBoc3BpLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1BJX0RNQUhhbGZSZWNlaXZlQ3BsdDsKKyAgICBoc3BpLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgICAgID0gU1BJX0RNQVJlY2VpdmVDcGx0OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgU1BJIFR4L1J4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHNwaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNQSV9ETUFIYWxmVHJhbnNtaXRSZWNlaXZlQ3BsdDsKKyAgICBoc3BpLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgICAgID0gU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQ7CisgIH0KKworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBoc3BpLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1BJX0RNQUVycm9yOworCisgIC8qIFNldCB0aGUgRE1BIEFib3J0Q3BsdENhbGxiYWNrICovCisgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIEVuYWJsZSB0aGUgUnggRE1BIFN0cmVhbS9DaGFubmVsICAqLworICBpZiAoSEFMX09LICE9IEhBTF9ETUFfU3RhcnRfSVQoaHNwaS0+aGRtYXJ4LCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwgKHVpbnQzMl90KWhzcGktPnBSeEJ1ZmZQdHIsIGhzcGktPlJ4WGZlckNvdW50KSkKKyAgeworICAgIC8qIFVwZGF0ZSBTUEkgZXJyb3IgY29kZSAqLworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworCisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBFbmFibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYRE1BRU4pOworCisgIC8qIFNldCB0aGUgU1BJIFR4IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayBhcyBOVUxMIGJlY2F1c2UgdGhlIGNvbW11bmljYXRpb24gY2xvc2luZworICBpcyBwZXJmb3JtZWQgaW4gRE1BIHJlY2VwdGlvbiBjb21wbGV0ZSBjYWxsYmFjayAgKi8KKyAgaHNwaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IE5VTEw7CisgIGhzcGktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayAgICAgPSBOVUxMOworICBoc3BpLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrICAgID0gTlVMTDsKKyAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAgICA9IE5VTEw7CisKKyAgLyogRW5hYmxlIHRoZSBUeCBETUEgU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9TdGFydF9JVChoc3BpLT5oZG1hdHgsICh1aW50MzJfdCloc3BpLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzcGktPkluc3RhbmNlLT5EUiwgaHNwaS0+VHhYZmVyQ291bnQpKQorICB7CisgICAgLyogVXBkYXRlIFNQSSBlcnJvciBjb2RlICovCisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBTUEkgaXMgYWxyZWFkeSBlbmFibGVkICovCisgIGlmICgoaHNwaS0+SW5zdGFuY2UtPkNSMSAmIFNQSV9DUjFfU1BFKSAhPSBTUElfQ1IxX1NQRSkKKyAgeworICAgIC8qIEVuYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX1NQSV9FTkFCTEUoaHNwaSk7CisgIH0KKyAgLyogRW5hYmxlIHRoZSBTUEkgRXJyb3IgSW50ZXJydXB0IEJpdCAqLworICBfX0hBTF9TUElfRU5BQkxFX0lUKGhzcGksIChTUElfSVRfRVJSKSk7CisKKyAgLyogRW5hYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworZXJyb3IgOgorICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChibG9ja2luZyBtb2RlKS4KKyAgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIChUeCBhbmQgUngpLAorICAqICAgICAgICAgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBTUEkgSW50ZXJydXB0cyAoZGVwZW5kaW5nIG9mIHRyYW5zZmVyIGRpcmVjdGlvbikKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGU7CisgIF9fSU8gdWludDMyX3QgY291bnQsIHJlc2V0Y291bnQ7CisKKyAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovCisgIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgcmVzZXRjb3VudCA9IFNQSV9ERUZBVUxUX1RJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMjRVIC8gMTAwMFUpOworICBjb3VudCA9IHJlc2V0Y291bnQ7CisKKyAgLyogQ2xlYXIgRVJSSUUgaW50ZXJydXB0IHRvIGF2b2lkIGVycm9yIGludGVycnVwdHMgZ2VuZXJhdGlvbiBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX0VSUklFKTsKKworICAvKiBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFKG1vZGUgZmF1bHQgZXZlbnQsIG92ZXJydW4gZXJyb3IsIFRJIGZyYW1lIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRUlFKSkKKyAgeworICAgIGhzcGktPlR4SVNSID0gU1BJX0Fib3J0VHhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIGlmIChIQUxfSVNfQklUX1NFVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1JYTkVJRSkpCisgIHsKKyAgICBoc3BpLT5SeElTUiA9IFNQSV9BYm9ydFJ4X0lTUjsKKyAgICAvKiBXYWl0IEhBTF9TUElfU1RBVEVfQUJPUlQgc3RhdGUgKi8KKyAgICBkbworICAgIHsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNvdW50LS07CisgICAgfQorICAgIHdoaWxlIChoc3BpLT5TdGF0ZSAhPSBIQUxfU1BJX1NUQVRFX0FCT1JUKTsKKyAgICAvKiBSZXNldCBUaW1lb3V0IENvdW50ZXIgKi8KKyAgICBjb3VudCA9IHJlc2V0Y291bnQ7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IFN0cmVhbS9DaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogQWJvcnQgRE1BIFR4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFR4IERNQSBSZXF1ZXN0ICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfVFhETUFFTikpOworCisgICAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgICAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IFN0cmVhbS9DaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogQWJvcnQgRE1BIFJ4IEhhbmRsZSBsaW5rZWQgdG8gU1BJIFBlcmlwaGVyYWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgICAgICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0JTWSwgUkVTRVQsIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICAgIH0KKworICAgICAgLyogRW1wdHkgdGhlIEZSTFZMIGZpZm8gKi8KKyAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisKKyAgICAgIC8qIERpc2FibGUgUnggRE1BIFJlcXVlc3QgKi8KKyAgICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9SWERNQUVOKSk7CisgICAgfQorICB9CisgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICB7CisgICAgLyogcmV0dXJuIEhBTF9FcnJvciBpbiBjYXNlIG9mIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5zdGF0ZSB0byByZWFkeSAqLworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVyIChJbnRlcnJ1cHQgbW9kZSkuCisgICogQHBhcmFtICBoc3BpIFNQSSBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciAoVHggYW5kIFJ4KSwKKyAgKiAgICAgICAgIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgU1BJIEludGVycnVwdHMgKGRlcGVuZGluZyBvZiB0cmFuc2ZlciBkaXJlY3Rpb24pCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnRfSVQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqICAgICAgICAgICAtIEF0IGFib3J0IGNvbXBsZXRpb24sIGNhbGwgdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjaworICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKKyAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0Fib3J0X0lUKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBlcnJvcmNvZGU7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA7CisgIF9fSU8gdWludDMyX3QgY291bnQsIHJlc2V0Y291bnQ7CisKKyAgLyogSW5pdGlhbGl6ZWQgbG9jYWwgdmFyaWFibGUgICovCisgIGVycm9yY29kZSA9IEhBTF9PSzsKKyAgYWJvcnRjcGx0ID0gMVU7CisgIHJlc2V0Y291bnQgPSBTUElfREVGQVVMVF9USU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDI0VSAvIDEwMDBVKTsKKyAgY291bnQgPSByZXNldGNvdW50OworCisgIC8qIENsZWFyIEVSUklFIGludGVycnVwdCB0byBhdm9pZCBlcnJvciBpbnRlcnJ1cHRzIGdlbmVyYXRpb24gZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9FUlJJRSk7CisKKyAgLyogQ2hhbmdlIFJ4IGFuZCBUeCBJcnEgSGFuZGxlciB0byBEaXNhYmxlIFRYRUlFLCBSWE5FSUUgYW5kIEVSUklFIGludGVycnVwdHMgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhFSUUpKQorICB7CisgICAgaHNwaS0+VHhJU1IgPSBTUElfQWJvcnRUeF9JU1I7CisgICAgLyogV2FpdCBIQUxfU1BJX1NUQVRFX0FCT1JUIHN0YXRlICovCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb3VudC0tOworICAgIH0KKyAgICB3aGlsZSAoaHNwaS0+U3RhdGUgIT0gSEFMX1NQSV9TVEFURV9BQk9SVCk7CisgICAgLyogUmVzZXQgVGltZW91dCBDb3VudGVyICovCisgICAgY291bnQgPSByZXNldGNvdW50OworICB9CisKKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkKKyAgeworICAgIGhzcGktPlJ4SVNSID0gU1BJX0Fib3J0UnhfSVNSOworICAgIC8qIFdhaXQgSEFMX1NQSV9TVEFURV9BQk9SVCBzdGF0ZSAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQUJPUlQpOworICAgIC8qIFJlc2V0IFRpbWVvdXQgQ291bnRlciAqLworICAgIGNvdW50ID0gcmVzZXRjb3VudDsKKyAgfQorCisgIC8qIElmIERNQSBUeCBhbmQvb3IgRE1BIFJ4IEhhbmRsZXMgYXJlIGFzc29jaWF0ZWQgdG8gU1BJIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTikpCisgICAgeworICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKyAgLyogRE1BIFJ4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTikpCisgICAgeworICAgICAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc3BpLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFR4IFN0cmVhbS9DaGFubmVsICovCisgICAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEFib3J0IERNQSBUeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBEaXNhYmxlIHRoZSBTUEkgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IFN0cmVhbS9DaGFubmVsICovCisgICAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEFib3J0IERNQSBSeCBIYW5kbGUgbGlua2VkIHRvIFNQSSBQZXJpcGhlcmFsICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hcngpICE9ICBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoYWJvcnRjcGx0ID09IDFVKQorICB7CisgICAgLyogUmVzZXQgVHggYW5kIFJ4IHRyYW5zZmVyIGNvdW50ZXJzICovCisgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2hlY2sgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgPT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkKKyAgICB7CisgICAgICAvKiByZXR1cm4gSEFMX0Vycm9yIGluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIEFib3J0IHByb2NlZHVyZSAqLworICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX05PTkU7CisgICAgfQorCisgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworCisgICAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIGVycm9yY29kZTsKK30KKworLyoqCisgICogQGJyaWVmICBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVBhdXNlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGhzcGkpOworCisgIC8qIERpc2FibGUgdGhlIFNQSSBETUEgVHggJiBSeCByZXF1ZXN0cyAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1BJX0RNQVJlc3VtZShTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoc3BpKTsKKworICAvKiBFbmFibGUgdGhlIFNQSSBETUEgVHggJiBSeCByZXF1ZXN0cyAqLworICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTik7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHNwaSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElfRE1BU3RvcChTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgZXJyb3Jjb2RlID0gSEFMX09LOworICAvKiBUaGUgTG9jayBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBBUEkgdG8gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24KKyAgICAgdG8gY2FsbCB0aGUgSEFMIFNQSSBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soKSBvciBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCk6CisgICAgIHdoZW4gY2FsbGluZyBIQUxfRE1BX0Fib3J0KCkgQVBJIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZAorICAgICBhbmQgdGhlIGNvcnJlc3BvbmQgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soKSBvciBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgKi8KKworICAvKiBBYm9ydCB0aGUgU1BJIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAgKi8KKyAgaWYgKGhzcGktPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0KGhzcGktPmhkbWF0eCkpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRE1BKTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgLyogQWJvcnQgdGhlIFNQSSBETUEgcnggU3RyZWFtL0NoYW5uZWwgICovCisgIGlmIChoc3BpLT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoc3BpLT5oZG1hcngpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0RNQSk7CisgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSBUeCAmIFJ4IHJlcXVlc3RzICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIHJldHVybiBlcnJvcmNvZGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFNQSSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU1BJX0lSUUhhbmRsZXIoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIHVpbnQzMl90IGl0c291cmNlID0gaHNwaS0+SW5zdGFuY2UtPkNSMjsKKyAgdWludDMyX3QgaXRmbGFnICAgPSBoc3BpLT5JbnN0YW5jZS0+U1I7CisKKyAgLyogU1BJIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19PVlIpID09IFJFU0VUKSAmJgorICAgICAgKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfUlhORSkgIT0gUkVTRVQpICYmIChTUElfQ0hFQ0tfSVRfU09VUkNFKGl0c291cmNlLCBTUElfSVRfUlhORSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNwaS0+UnhJU1IoaHNwaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU1BJIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19UWEUpICE9IFJFU0VUKSAmJiAoU1BJX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgU1BJX0lUX1RYRSkgIT0gUkVTRVQpKQorICB7CisgICAgaHNwaS0+VHhJU1IoaHNwaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU1BJIGluIEVycm9yIFRyZWF0bWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKFNQSV9DSEVDS19GTEFHKGl0ZmxhZywgU1BJX0ZMQUdfTU9ERikgIT0gUkVTRVQpIHx8IChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX09WUikgIT0gUkVTRVQpIHx8IChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX0ZSRSkgIT0gUkVTRVQpKSAmJiAoU1BJX0NIRUNLX0lUX1NPVVJDRShpdHNvdXJjZSwgU1BJX0lUX0VSUikgIT0gUkVTRVQpKQorICB7CisgICAgLyogU1BJIE92ZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX09WUikgIT0gUkVTRVQpCisgICAgeworICAgICAgaWYgKGhzcGktPlN0YXRlICE9IEhBTF9TUElfU1RBVEVfQlVTWV9UWCkKKyAgICAgIHsKKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfT1ZSKTsKKyAgICAgICAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLyogU1BJIE1vZGUgRmF1bHQgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChTUElfQ0hFQ0tfRkxBRyhpdGZsYWcsIFNQSV9GTEFHX01PREYpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX01PREYpOworICAgICAgX19IQUxfU1BJX0NMRUFSX01PREZGTEFHKGhzcGkpOworICAgIH0KKworICAgIC8qIFNQSSBGcmFtZSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoU1BJX0NIRUNLX0ZMQUcoaXRmbGFnLCBTUElfRkxBR19GUkUpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZSRSk7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfRlJFRkxBRyhoc3BpKTsKKyAgICB9CisKKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisgICAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSB8IFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKTsKKworICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIERNQSByZXF1ZXN0cyBpZiBlbmFibGVkICovCisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGl0c291cmNlLCBTUElfQ1IyX1RYRE1BRU4pKSB8fCAoSEFMX0lTX0JJVF9TRVQoaXRzb3VyY2UsIFNQSV9DUjJfUlhETUFFTikpKQorICAgICAgeworICAgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgKFNQSV9DUjJfVFhETUFFTiB8IFNQSV9DUjJfUlhETUFFTikpOworCisgICAgICAgIC8qIEFib3J0IHRoZSBTUEkgRE1BIFJ4IGNoYW5uZWwgKi8KKyAgICAgICAgaWYgKGhzcGktPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IHRoZSBTUEkgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgIGhzcGktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTUElfRE1BQWJvcnRPbkVycm9yOworICAgICAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydF9JVChoc3BpLT5oZG1hcngpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0FCT1JUKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWJvcnQgdGhlIFNQSSBETUEgVHggY2hhbm5lbCAqLworICAgICAgICBpZiAoaHNwaS0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIFNQSSBETUEgQWJvcnQgY2FsbGJhY2sgOgorICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TUElfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNQSV9ETUFBYm9ydE9uRXJyb3I7CisgICAgICAgICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0X0lUKGhzcGktPmhkbWF0eCkpCisgICAgICAgICAgeworICAgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQUJPUlQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1R4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9UeENwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfU1BJX1J4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9SeENwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBhbmQgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfUnhIYWxmQ3BsdENhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2soKSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUeCBhbmQgUnggSGFsZiBUcmFuc2ZlciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfVHhSeEhhbGZDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU1BJIGVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1NQSV9FcnJvckNhbGxiYWNrKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoc3BpKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1NQSV9FcnJvckNhbGxiYWNrIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworICAvKiBOT1RFIDogVGhlIEVycm9yQ29kZSBwYXJhbWV0ZXIgaW4gdGhlIGhzcGkgaGFuZGxlIGlzIHVwZGF0ZWQgYnkgdGhlIFNQSSBwcm9jZXNzZXMKKyAgICAgICAgICAgIGFuZCB1c2VyIGNhbiB1c2UgSEFMX1NQSV9HZXRFcnJvcigpIEFQSSB0byBjaGVjayB0aGUgbGF0ZXN0IGVycm9yIG9jY3VycmVkCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNQSSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhzcGkgU1BJIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhzcGkpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfU1BJX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICogQGJyaWVmICAgU1BJIGNvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFNQSS4KKyAgICAgKCspIEhBTF9TUElfR2V0U3RhdGUoKSBBUEkgY2FuIGJlIGhlbHBmdWwgdG8gY2hlY2sgaW4gcnVuLXRpbWUgdGhlIHN0YXRlIG9mIHRoZSBTUEkgcGVyaXBoZXJhbAorICAgICAoKykgSEFMX1NQSV9HZXRFcnJvcigpIGNoZWNrIGluIHJ1bi10aW1lIEVycm9ycyBvY2N1cnJpbmcgZHVyaW5nIGNvbW11bmljYXRpb24KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTUEkgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgU1BJIHN0YXRlCisgICovCitIQUxfU1BJX1N0YXRlVHlwZURlZiBIQUxfU1BJX0dldFN0YXRlKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZXR1cm4gU1BJIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaHNwaS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBTUEkgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIFNQSSBlcnJvciBjb2RlIGluIGJpdG1hcCBmb3JtYXQKKyAgKi8KK3VpbnQzMl90IEhBTF9TUElfR2V0RXJyb3IoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJldHVybiBTUEkgRXJyb3JDb2RlICovCisgIHJldHVybiBoc3BpLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBTUElfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAYnJpZWYgICBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERNQSBOb3JtYWwgTW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykKKyAgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOworCisgICAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCisgICAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBvdmVycnVuIGZsYWcgaW4gMiBMaW5lcyBjb21tdW5pY2F0aW9uIG1vZGUgYmVjYXVzZSByZWNlaXZlZCBkYXRhIGlzIG5vdCByZWFkICovCisgICAgaWYgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKQorICAgIHsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICAgIH0KKworICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBDYWxsIHVzZXIgVHggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIHVpbnQzMl90IHRpY2tzdGFydDsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ2VtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBETUEgTm9ybWFsIE1vZGUgKi8KKyAgaWYgKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSAhPSBETUFfQ0NSX0NJUkMpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfRVJSKTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAvKiBDUkMgaGFuZGxpbmcgKi8KKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIFdhaXQgdW50aWwgUlhORSBmbGFnICovCisgICAgICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfUlhORSwgU0VULCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIH0KKyAgICAgIC8qIFJlYWQgQ1JDICovCisgICAgICBpZiAoaHNwaS0+SW5pdC5EYXRhU2l6ZSA+IFNQSV9EQVRBU0laRV84QklUKQorICAgICAgeworICAgICAgICAvKiBSZWFkIDE2Yml0IENSQyAqLworICAgICAgICBSRUFEX1JFRyhoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBSZWFkIDhiaXQgQ1JDICovCisgICAgICAgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisKKyAgICAgICAgaWYgKGhzcGktPkluaXQuQ1JDTGVuZ3RoID09IFNQSV9DUkNfTEVOR1RIXzE2QklUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKFNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX1JYTkUsIFNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgICAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIFJlYWQgOGJpdCBDUkMgYWdhaW4gaW4gY2FzZSBvZiAxNmJpdCBDUkMgaW4gOGJpdCBEYXRhIG1vZGUgKi8KKyAgICAgICAgICBSRUFEX1JFRygqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFJ4L1R4IERNQSBSZXF1ZXN0IChkb25lIGJ5IGRlZmF1bHQgdG8gaGFuZGxlIHRoZSBjYXNlIG1hc3RlciByeCBkaXJlY3Rpb24gMiBsaW5lcykgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICAgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgICAgaWYgKFNQSV9FbmRSeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfRkxBRzsKKyAgICB9CisKKyAgICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikpCisgICAgeworICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBDYWxsIHVzZXIgUnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSB0cmFuc21pdCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnZW1lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIERNQSBOb3JtYWwgTW9kZSAqLworICBpZiAoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IERNQV9DQ1JfQ0lSQykKKyAgeworICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9FUlIpOworCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIC8qIENSQyBoYW5kbGluZyAqLworICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgaWYgKChoc3BpLT5Jbml0LkRhdGFTaXplID09IFNQSV9EQVRBU0laRV84QklUKSAmJiAoaHNwaS0+SW5pdC5DUkNMZW5ndGggPT0gU1BJX0NSQ19MRU5HVEhfOEJJVCkpCisgICAgICB7CisgICAgICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX1FVQVJURVJfRlVMTCwgU1BJX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3Igb24gdGhlIENSQyByZWNlcHRpb24gKi8KKyAgICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgICAgICB9CisgICAgICAgIC8qIFJlYWQgQ1JDIHRvIEZsdXNoIERSIGFuZCBSWE5FIGZsYWcgKi8KKyAgICAgICAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfSEFMRl9GVUxMLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIEVycm9yIG9uIHRoZSBDUkMgcmVjZXB0aW9uICovCisgICAgICAgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfQ1JDKTsKKyAgICAgICAgfQorICAgICAgICAvKiBSZWFkIENSQyB0byBGbHVzaCBEUiBhbmQgUlhORSBmbGFnICovCisgICAgICAgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworICAgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIHRpY2tzdGFydCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIH0KKworICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICAgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgLyogQ2hlY2sgaWYgQ1JDIGVycm9yIG9jY3VycmVkICovCisgICAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpKQorICAgIHsKKyAgICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgICBfX0hBTF9TUElfQ0xFQVJfQ1JDRVJSRkxBRyhoc3BpKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICAgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgLyogQ2FsbCB1c2VyIFR4UnggY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeFJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9UeFJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgaGFsZiB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIGEgRE1BX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfRE1BSGFsZlRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgLyogQ2FsbCB1c2VyIFR4IGhhbGYgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIGhhbGYgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRE1BIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFIYWxmUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIENhbGwgdXNlciBSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9SeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBoYWxmIHRyYW5zbWl0IHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUhhbGZUcmFuc21pdFJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBDYWxsIHVzZXIgVHhSeCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+VHhSeEhhbGZDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX1R4UnhIYWxmQ3BsdENhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBTUEkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBhIERNQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBTUElfSGFuZGxlVHlwZURlZiAqaHNwaSA9IChTUElfSGFuZGxlVHlwZURlZiAqKSgoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudCk7IC8qIERlcm9nYXRpb24gTUlTUkFDMjAxMi1SdWxlLTExLjUgKi8KKworICAvKiBTdG9wIHRoZSBkaXNhYmxlIERNQSB0cmFuc2ZlciBvbiBTUEkgc2lkZSAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKworICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9ETUEpOworICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPkVycm9yQ2FsbGJhY2soaHNwaSk7CisjZWxzZQorICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSBIQUwgc2VydmljZXMgb24gRXJyb3IKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVuY2UpLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisgIGhzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhzcGktPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfRXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgU1BJIFR4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBSeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkgPSAoU1BJX0hhbmRsZVR5cGVEZWYgKikoKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQpOyAvKiBEZXJvZ2F0aW9uIE1JU1JBQzIwMTItUnVsZS0xMS41ICovCisKKyAgaHNwaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRGlzYWJsZSBUeCBETUEgUmVxdWVzdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOKTsKKworICBpZiAoU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogRGlzYWJsZSBTUEkgUGVyaXBoZXJhbCAqLworICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKworICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICBpZiAoU1BJX1dhaXRGaWZvU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfRlJMVkwsIFNQSV9GUkxWTF9FTVBUWSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHNwaS0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIFN0cmVhbS9DaGFubmVsIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHNwaS0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHNwaS0+VHhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDaGVjayBubyBlcnJvciBkdXJpbmcgQWJvcnQgcHJvY2VkdXJlICovCisgIGlmIChoc3BpLT5FcnJvckNvZGUgIT0gSEFMX1NQSV9FUlJPUl9BQk9SVCkKKyAgeworICAgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfTk9ORTsKKyAgfQorCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgU1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfU1BJX0NMRUFSX09WUkZMQUcoaHNwaSk7CisgIF9fSEFMX1NQSV9DTEVBUl9GUkVGTEFHKGhzcGkpOworCisgIC8qIFJlc3RvcmUgaHNwaS0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHNwaS0+U3RhdGUgID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICBoc3BpLT5BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgIEhBTF9TUElfQWJvcnRDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFNQSSBSeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgUnggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgVHggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9ETUFSeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpID0gKFNQSV9IYW5kbGVUeXBlRGVmICopKCgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50KTsgLyogRGVyb2dhdGlvbiBNSVNSQUMyMDEyLVJ1bGUtMTEuNSAqLworCisgIC8qIERpc2FibGUgU1BJIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEUoaHNwaSk7CisKKyAgaHNwaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLworICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKworICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChoc3BpLT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChoc3BpLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIE5vIEFib3J0IHByb2Nlc3Mgc3RpbGwgb25nb2luZyA6IEFsbCBETUEgU3RyZWFtL0NoYW5uZWwgYXJlIGFib3J0ZWQsIGNhbGwgdXNlciBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayAqLworICBoc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBoc3BpLT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENoZWNrIG5vIGVycm9yIGR1cmluZyBBYm9ydCBwcm9jZWR1cmUgKi8KKyAgaWYgKGhzcGktPkVycm9yQ29kZSAhPSBIQUxfU1BJX0VSUk9SX0FCT1JUKQorICB7CisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9OT05FOworICB9CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBTUiByZWdpc3RlciAqLworICBfX0hBTF9TUElfQ0xFQVJfT1ZSRkxBRyhoc3BpKTsKKyAgX19IQUxfU1BJX0NMRUFSX0ZSRUZMQUcoaHNwaSk7CisKKyAgLyogUmVzdG9yZSBoc3BpLT5TdGF0ZSB0byBSZWFkeSAqLworICBoc3BpLT5TdGF0ZSAgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgIGhzcGktPkFib3J0Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgSEFMX1NQSV9BYm9ydENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCA4LWJpdCBoYW5kbGVyIGZvciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV8ybGluZXNSeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWNlaXZlIGRhdGEgaW4gcGFja2luZyBtb2RlICovCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA+IDFVKQorICB7CisgICAgKigodWludDE2X3QgKiloc3BpLT5wUnhCdWZmUHRyKSA9ICh1aW50MTZfdCkoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKyAgICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgICAgaHNwaS0+UnhYZmVyQ291bnQgLT0gMlU7CisgICAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDFVKQorICAgIHsKKyAgICAgIC8qIFNldCBSWCBGaWZvIHRocmVzaG9sZCBhY2NvcmRpbmcgdGhlIHJlY2VwdGlvbiBkYXRhIGxlbmd0aDogOGJpdCAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfUlhGSUZPX1RIUkVTSE9MRCk7CisgICAgfQorICB9CisgIC8qIFJlY2VpdmUgZGF0YSBpbiA4IEJpdCBtb2RlICovCisgIGVsc2UKKyAgeworICAgICpoc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisgICAgaHNwaS0+cFJ4QnVmZlB0cisrOworICAgIGhzcGktPlJ4WGZlckNvdW50LS07CisgIH0KKworICAvKiBDaGVjayBlbmQgb2YgdGhlIHJlY2VwdGlvbiAqLworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9SWEZJRk9fVEhSRVNIT0xEKTsKKyAgICAgIGhzcGktPlJ4SVNSID0gIFNQSV8ybGluZXNSeElTUl84QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogRGlzYWJsZSBSWE5FICBhbmQgRVJSIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgUnggOC1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfOEJJVENSQyhzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogUmVhZCA4Yml0IENSQyB0byBmbHVzaCBEYXRhIFJlZ3NpdGVyICovCisgIFJFQURfUkVHKCooX19JTyB1aW50OF90ICopJmhzcGktPkluc3RhbmNlLT5EUik7CisKKyAgaHNwaS0+Q1JDU2l6ZS0tOworCisgIC8qIENoZWNrIGVuZCBvZiB0aGUgcmVjZXB0aW9uICovCisgIGlmIChoc3BpLT5DUkNTaXplID09IDBVKQorICB7CisgICAgLyogRGlzYWJsZSBSWE5FIGFuZCBFUlIgaW50ZXJydXB0ICovCisgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgICAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIFNQSV9DbG9zZVJ4VHhfSVNSKGhzcGkpOworICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKy8qKgorICAqIEBicmllZiAgVHggOC1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfOEJJVChzdHJ1Y3QgX19TUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgLyogVHJhbnNtaXQgZGF0YSBpbiBwYWNraW5nIEJpdCBtb2RlICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA+PSAyVSkKKyAgeworICAgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgICAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICAgIGhzcGktPlR4WGZlckNvdW50IC09IDJVOworICB9CisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gOCBCaXQgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICAgIGhzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgICBoc3BpLT5UeFhmZXJDb3VudC0tOworICB9CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIFNldCBDUkMgTmV4dCBCaXQgdG8gc2VuZCBDUkMgKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlY2VpdmUgZGF0YSBpbiAxNiBCaXQgbW9kZSAqLworICAqKCh1aW50MTZfdCAqKWhzcGktPnBSeEJ1ZmZQdHIpID0gKHVpbnQxNl90KShoc3BpLT5JbnN0YW5jZS0+RFIpOworICBoc3BpLT5wUnhCdWZmUHRyICs9IHNpemVvZih1aW50MTZfdCk7CisgIGhzcGktPlJ4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgaHNwaS0+UnhJU1IgPSAgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgICAgLyogRGlzYWJsZSBSWE5FIGludGVycnVwdCAqLworICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIFNQSV9JVF9SWE5FKTsKKworICAgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgMTYtYml0IHJlY2VpdmUgZm9yIFRyYW5zbWl0IGFuZCBSZWNlaXZlIGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJXzJsaW5lc1J4SVNSXzE2QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWFkIDE2Yml0IENSQyB0byBmbHVzaCBEYXRhIFJlZ3NpdGVyICovCisgIFJFQURfUkVHKGhzcGktPkluc3RhbmNlLT5EUik7CisKKyAgLyogRGlzYWJsZSBSWE5FIGludGVycnVwdCAqLworICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfUlhORSk7CisKKyAgU1BJX0Nsb3NlUnhUeF9JU1IoaHNwaSk7Cit9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworLyoqCisgICogQGJyaWVmICBUeCAxNi1iaXQgaGFuZGxlciBmb3IgVHJhbnNtaXQgYW5kIFJlY2VpdmUgaW4gSW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfMmxpbmVzVHhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFRyYW5zbWl0IGRhdGEgaW4gMTYgQml0IG1vZGUgKi8KKyAgaHNwaS0+SW5zdGFuY2UtPkRSID0gKigodWludDE2X3QgKiloc3BpLT5wVHhCdWZmUHRyKTsKKyAgaHNwaS0+cFR4QnVmZlB0ciArPSBzaXplb2YodWludDE2X3QpOworICBoc3BpLT5UeFhmZXJDb3VudC0tOworCisgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmIChoc3BpLT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIC8qIFNldCBDUkMgTmV4dCBCaXQgdG8gc2VuZCBDUkMgKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICAgIC8qIERpc2FibGUgVFhFIGludGVycnVwdCAqLworICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX1RYRSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisKKyAgICAvKiBEaXNhYmxlIFRYRSBpbnRlcnJ1cHQgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRV9JVChoc3BpLCBTUElfSVRfVFhFKTsKKworICAgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTUElfQ2xvc2VSeFR4X0lTUihoc3BpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgOC1iaXQgcmVjZWl2ZSBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUQ1JDKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBSZWFkIDhiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8KKyAgUkVBRF9SRUcoKihfX0lPIHVpbnQ4X3QgKikmaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICBoc3BpLT5DUkNTaXplLS07CisKKyAgaWYgKGhzcGktPkNSQ1NpemUgPT0gMFUpCisgIHsKKyAgICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7CisgIH0KK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgcmVjZWl2ZSA4LWJpdCBpbiBJbnRlcnJ1cHQgY29udGV4dC4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9SeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAqaHNwaS0+cFJ4QnVmZlB0ciA9ICgqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpOworICBoc3BpLT5wUnhCdWZmUHRyKys7CisgIGhzcGktPlJ4WGZlckNvdW50LS07CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIEVuYWJsZSBDUkMgVHJhbnNtaXNzaW9uICovCisgIGlmICgoaHNwaS0+UnhYZmVyQ291bnQgPT0gMVUpICYmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKworICBpZiAoaHNwaS0+UnhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICBoc3BpLT5SeElTUiA9ICBTUElfUnhJU1JfOEJJVENSQzsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VSeF9JU1IoaHNwaSk7CisgIH0KK30KKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKy8qKgorICAqIEBicmllZiAgTWFuYWdlIHRoZSBDUkMgMTYtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVRDUkMoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgIC8qIFJlYWQgMTZiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8KKyAgUkVBRF9SRUcoaHNwaS0+SW5zdGFuY2UtPkRSKTsKKworICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKK30KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgMTYtYml0IHJlY2VpdmUgaW4gSW50ZXJydXB0IGNvbnRleHQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBTUElfUnhJU1JfMTZCSVQoc3RydWN0IF9fU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGkpCit7CisgICooKHVpbnQxNl90ICopaHNwaS0+cFJ4QnVmZlB0cikgPSAodWludDE2X3QpKGhzcGktPkluc3RhbmNlLT5EUik7CisgIGhzcGktPnBSeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+UnhYZmVyQ291bnQtLTsKKworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgaWYgKChoc3BpLT5SeFhmZXJDb3VudCA9PSAxVSkgJiYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkluc3RhbmNlLT5DUjEsIFNQSV9DUjFfQ1JDTkVYVCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworCisgIGlmIChoc3BpLT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgeworI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgIHsKKyAgICAgIGhzcGktPlJ4SVNSID0gU1BJX1J4SVNSXzE2QklUQ1JDOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVJ4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSB0aGUgZGF0YSA4LWJpdCB0cmFuc21pdCBpbiBJbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9UeElTUl84QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAqKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIgPSAoKmhzcGktPnBUeEJ1ZmZQdHIpOworICBoc3BpLT5wVHhCdWZmUHRyKys7CisgIGhzcGktPlR4WGZlckNvdW50LS07CisKKyAgaWYgKGhzcGktPlR4WGZlckNvdW50ID09IDBVKQorICB7CisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgLyogRW5hYmxlIENSQyBUcmFuc21pc3Npb24gKi8KKyAgICAgIFNFVF9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMSwgU1BJX0NSMV9DUkNORVhUKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBTUElfQ2xvc2VUeF9JU1IoaHNwaSk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGRhdGEgMTYtYml0IHRyYW5zbWl0IGluIEludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX1R4SVNSXzE2QklUKHN0cnVjdCBfX1NQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBUcmFuc21pdCBkYXRhIGluIDE2IEJpdCBtb2RlICovCisgIGhzcGktPkluc3RhbmNlLT5EUiA9ICooKHVpbnQxNl90ICopaHNwaS0+cFR4QnVmZlB0cik7CisgIGhzcGktPnBUeEJ1ZmZQdHIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgaHNwaS0+VHhYZmVyQ291bnQtLTsKKworICBpZiAoaHNwaS0+VHhYZmVyQ291bnQgPT0gMFUpCisgIHsKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgICAgaWYgKGhzcGktPkluaXQuQ1JDQ2FsY3VsYXRpb24gPT0gU1BJX0NSQ0NBTENVTEFUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgQ1JDIFRyYW5zbWlzc2lvbiAqLworICAgICAgU0VUX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IxLCBTUElfQ1IxX0NSQ05FWFQpOworICAgIH0KKyNlbmRpZiAvKiBVU0VfU1BJX0NSQyAqLworICAgIFNQSV9DbG9zZVR4X0lTUihoc3BpKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTUEkgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNQSSBtb2R1bGUuCisgICogQHBhcmFtICBGbGFnIFNQSSBmbGFnIHRvIGNoZWNrCisgICogQHBhcmFtICBTdGF0ZSBmbGFnIHN0YXRlIHRvIGNoZWNrCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoU1BJX0hhbmRsZVR5cGVEZWYgKmhzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICB3aGlsZSAoKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBGbGFnKSA/IFNFVCA6IFJFU0VUKSAhPSBTdGF0ZSkKKyAgeworICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgeworICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIFRpY2tzdGFydCkgPj0gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBTUEkgYW5kIHJlc2V0IHRoZSBDUkM6IHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGNsZWFyZWQKKyAgICAgICAgb24gYm90aCBtYXN0ZXIgYW5kIHNsYXZlIHNpZGVzIGluIG9yZGVyIHRvIHJlc3luY2hyb25pemUgdGhlIG1hc3RlcgorICAgICAgICBhbmQgc2xhdmUgZm9yIHRoZWlyIHJlc3BlY3RpdmUgQ1JDIGNhbGN1bGF0aW9uICovCisKKyAgICAgICAgLyogRGlzYWJsZSBUWEUsIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfUlhORSB8IFNQSV9JVF9FUlIpKTsKKworICAgICAgICBpZiAoKGhzcGktPkluaXQuTW9kZSA9PSBTUElfTU9ERV9NQVNURVIpICYmICgoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8xTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTX1JYT05MWSkpKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBTUEkgcGVyaXBoZXJhbCAqLworICAgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVzZXQgQ1JDIENhbGN1bGF0aW9uICovCisgICAgICAgIGlmIChoc3BpLT5Jbml0LkNSQ0NhbGN1bGF0aW9uID09IFNQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBTUElfUkVTRVRfQ1JDKGhzcGkpOworICAgICAgICB9CisKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhzcGkpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBTUEkgRklGTyBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIEZpZm8gRmlmbyB0byBjaGVjaworICAqIEBwYXJhbSAgU3RhdGUgRmlmbyBzdGF0ZSB0byBjaGVjaworICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHBhcmFtICBUaWNrc3RhcnQgdGljayBzdGFydCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpLCB1aW50MzJfdCBGaWZvLCB1aW50MzJfdCBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0LCB1aW50MzJfdCBUaWNrc3RhcnQpCit7CisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgRmlmbykgIT0gU3RhdGUpCisgIHsKKyAgICBpZiAoKEZpZm8gPT0gU1BJX1NSX0ZSTFZMKSAmJiAoU3RhdGUgPT0gU1BJX0ZSTFZMX0VNUFRZKSkKKyAgICB7CisgICAgICAvKiBSZWFkIDhiaXQgQ1JDIHRvIGZsdXNoIERhdGEgUmVnaXN0ZXIgKi8KKyAgICAgIFJFQURfUkVHKCooKF9fSU8gdWludDhfdCAqKSZoc3BpLT5JbnN0YW5jZS0+RFIpKTsKKyAgICB9CisKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID49IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgU1BJIGFuZCByZXNldCB0aGUgQ1JDOiB0aGUgQ1JDIHZhbHVlIHNob3VsZCBiZSBjbGVhcmVkCisgICAgICAgICAgIG9uIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBzaWRlcyBpbiBvcmRlciB0byByZXN5bmNocm9uaXplIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgYW5kIHNsYXZlIGZvciB0aGVpciByZXNwZWN0aXZlIENSQyBjYWxjdWxhdGlvbiAqLworCisgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FIGFuZCBFUlIgaW50ZXJydXB0cyBmb3IgdGhlIGludGVycnVwdCBwcm9jZXNzICovCisgICAgICAgIF9fSEFMX1NQSV9ESVNBQkxFX0lUKGhzcGksIChTUElfSVRfVFhFIHwgU1BJX0lUX1JYTkUgfCBTUElfSVRfRVJSKSk7CisKKyAgICAgICAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICAgICAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlc2V0IENSQyBDYWxjdWxhdGlvbiAqLworICAgICAgICBpZiAoaHNwaS0+SW5pdC5DUkNDYWxjdWxhdGlvbiA9PSBTUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgU1BJX1JFU0VUX0NSQyhoc3BpKTsKKyAgICAgICAgfQorCisgICAgICAgIGhzcGktPlN0YXRlID0gSEFMX1NQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoc3BpKTsKKworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGNoZWNrIG9mIHRoZSBSWCB0cmFuc2FjdGlvbiBjb21wbGV0ZS4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTUElfRW5kUnhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IFRpY2tzdGFydCkKK3sKKyAgaWYgKChoc3BpLT5Jbml0Lk1vZGUgPT0gU1BJX01PREVfTUFTVEVSKSAmJiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FU19SWE9OTFkpKSkKKyAgeworICAgIC8qIERpc2FibGUgU1BJIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9TUElfRElTQUJMRShoc3BpKTsKKyAgfQorCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIGlmICgoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikgJiYgKChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzFMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaHNwaS0+SW5pdC5EaXJlY3Rpb24gPT0gU1BJX0RJUkVDVElPTl8yTElORVNfUlhPTkxZKSkpCisgIHsKKyAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGNoZWNrIG9mIHRoZSBSWFRYIG9yIFRYIHRyYW5zYWN0aW9uIGNvbXBsZXRlLgorICAqIEBwYXJhbSAgaHNwaSBTUEkgaGFuZGxlCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcGFyYW0gIFRpY2tzdGFydCB0aWNrIHN0YXJ0IHZhbHVlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1BJX0VuZFJ4VHhUcmFuc2FjdGlvbihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgVGlja3N0YXJ0KQoreworICAvKiBDb250cm9sIGlmIHRoZSBUWCBmaWZvIGlzIGVtcHR5ICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GVExWTCwgU1BJX0ZUTFZMX0VNUFRZLCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENvbnRyb2wgdGhlIEJTWSBmbGFnICovCisgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBUaW1lb3V0LCBUaWNrc3RhcnQpICE9IEhBTF9PSykKKyAgeworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0ZMQUcpOworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENvbnRyb2wgaWYgdGhlIFJYIGZpZm8gaXMgZW1wdHkgKi8KKyAgaWYgKFNQSV9XYWl0Rmlmb1N0YXRlVW50aWxUaW1lb3V0KGhzcGksIFNQSV9GTEFHX0ZSTFZMLCBTUElfRlJMVkxfRU1QVFksIFRpbWVvdXQsIFRpY2tzdGFydCkgIT0gSEFMX09LKQorICB7CisgICAgU0VUX0JJVChoc3BpLT5FcnJvckNvZGUsIEhBTF9TUElfRVJST1JfRkxBRyk7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgdGhlIGVuZCBvZiB0aGUgUlhUWCB0cmFuc2FjdGlvbi4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9DbG9zZVJ4VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgU1BJX0lUX0VSUik7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorCisjaWYgKFVTRV9TUElfQ1JDICE9IDBVKQorICAvKiBDaGVjayBpZiBDUkMgZXJyb3Igb2NjdXJyZWQgKi8KKyAgaWYgKF9fSEFMX1NQSV9HRVRfRkxBRyhoc3BpLCBTUElfRkxBR19DUkNFUlIpICE9IFJFU0VUKQorICB7CisgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgIFNFVF9CSVQoaHNwaS0+RXJyb3JDb2RlLCBIQUxfU1BJX0VSUk9SX0NSQyk7CisgICAgX19IQUxfU1BJX0NMRUFSX0NSQ0VSUkZMQUcoaHNwaSk7CisgICAgLyogQ2FsbCB1c2VyIGVycm9yIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICBoc3BpLT5FcnJvckNhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KKyAgICBpZiAoaHNwaS0+RXJyb3JDb2RlID09IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICBpZiAoaHNwaS0+U3RhdGUgPT0gSEFMX1NQSV9TVEFURV9CVVNZX1JYKQorICAgICAgeworICAgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgICAgSEFMX1NQSV9SeENwbHRDYWxsYmFjayhoc3BpKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICAgICAgICAvKiBDYWxsIHVzZXIgVHhSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhzcGktPlR4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgICAgICBIQUxfU1BJX1R4UnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFJYIHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Nsb3NlUnhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICAvKiBEaXNhYmxlIFJYTkUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9SWE5FIHwgU1BJX0lUX0VSUikpOworCisgIC8qIENoZWNrIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uICovCisgIGlmIChTUElfRW5kUnhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorICBoc3BpLT5TdGF0ZSA9IEhBTF9TUElfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX1NQSV9DUkMgIT0gMFUpCisgIC8qIENoZWNrIGlmIENSQyBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfU1BJX0dFVF9GTEFHKGhzcGksIFNQSV9GTEFHX0NSQ0VSUikgIT0gUkVTRVQpCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9DUkMpOworICAgIF9fSEFMX1NQSV9DTEVBUl9DUkNFUlJGTEFHKGhzcGkpOworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCisgICAgaWYgKGhzcGktPkVycm9yQ29kZSA9PSBIQUxfU1BJX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2FsbCB1c2VyIFJ4IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzcGktPlJ4Q3BsdENhbGxiYWNrKGhzcGkpOworI2Vsc2UKKyAgICAgIEhBTF9TUElfUnhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgICBIQUxfU1BJX0Vycm9yQ2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorI2lmIChVU0VfU1BJX0NSQyAhPSAwVSkKKyAgfQorI2VuZGlmIC8qIFVTRV9TUElfQ1JDICovCit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIHRoZSBlbmQgb2YgdGhlIFRYIHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Nsb3NlVHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdlbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogRGlzYWJsZSBUWEUgYW5kIEVSUiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfU1BJX0RJU0FCTEVfSVQoaHNwaSwgKFNQSV9JVF9UWEUgfCBTUElfSVRfRVJSKSk7CisKKyAgLyogQ2hlY2sgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKFNQSV9FbmRSeFR4VHJhbnNhY3Rpb24oaHNwaSwgU1BJX0RFRkFVTFRfVElNRU9VVCwgdGlja3N0YXJ0KSAhPSBIQUxfT0spCisgIHsKKyAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9GTEFHKTsKKyAgfQorCisgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBpbiAyIExpbmVzIGNvbW11bmljYXRpb24gbW9kZSBiZWNhdXNlIHJlY2VpdmVkIGlzIG5vdCByZWFkICovCisgIGlmIChoc3BpLT5Jbml0LkRpcmVjdGlvbiA9PSBTUElfRElSRUNUSU9OXzJMSU5FUykKKyAgeworICAgIF9fSEFMX1NQSV9DTEVBUl9PVlJGTEFHKGhzcGkpOworICB9CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX1JFQURZOworICBpZiAoaHNwaS0+RXJyb3JDb2RlICE9IEhBTF9TUElfRVJST1JfTk9ORSkKKyAgeworICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+RXJyb3JDYWxsYmFjayhoc3BpKTsKKyNlbHNlCisgICAgSEFMX1NQSV9FcnJvckNhbGxiYWNrKGhzcGkpOworI2VuZGlmIC8qIFVTRV9IQUxfU1BJX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENhbGwgdXNlciBSeCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1NQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgaHNwaS0+VHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZWxzZQorICAgIEhBTF9TUElfVHhDcGx0Q2FsbGJhY2soaHNwaSk7CisjZW5kaWYgLyogVVNFX0hBTF9TUElfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgYWJvcnQgYSBSeCB0cmFuc2FjdGlvbi4KKyAgKiBAcGFyYW0gIGhzcGkgcG9pbnRlciB0byBhIFNQSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFNQSV9BYm9ydFJ4X0lTUihTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgX19JTyB1aW50MzJfdCBjb3VudDsKKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisKKyAgLyogRGlzYWJsZSBSWE5FSUUgaW50ZXJydXB0ICovCisgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9SWE5FSUUpKTsKKworICAvKiBDaGVjayBSWE5FSUUgaXMgZGlzYWJsZWQgKi8KKyAgZG8KKyAgeworICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY291bnQtLTsKKyAgfQorICB3aGlsZSAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWE5FSUUpKTsKKworICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICBpZiAoU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHNwaSwgU1BJX0ZMQUdfQlNZLCBSRVNFVCwgU1BJX0RFRkFVTFRfVElNRU9VVCwgSEFMX0dldFRpY2soKSkgIT0gSEFMX09LKQorICB7CisgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgfQorCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0FCT1JUOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBhYm9ydCBhIFR4IG9yIFJ4L1R4IHRyYW5zYWN0aW9uLgorICAqIEBwYXJhbSAgaHNwaSBwb2ludGVyIHRvIGEgU1BJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTUEkgbW9kdWxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU1BJX0Fib3J0VHhfSVNSKFNQSV9IYW5kbGVUeXBlRGVmICpoc3BpKQoreworICBfX0lPIHVpbnQzMl90IGNvdW50OworCisgIGNvdW50ID0gU1BJX0RFRkFVTFRfVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyNFUgLyAxMDAwVSk7CisKKyAgLyogRGlzYWJsZSBUWEVJRSBpbnRlcnJ1cHQgKi8KKyAgQ0xFQVJfQklUKGhzcGktPkluc3RhbmNlLT5DUjIsIChTUElfQ1IyX1RYRUlFKSk7CisKKyAgLyogQ2hlY2sgVFhFSUUgaXMgZGlzYWJsZWQgKi8KKyAgZG8KKyAgeworICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICB7CisgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY291bnQtLTsKKyAgfQorICB3aGlsZSAoSEFMX0lTX0JJVF9TRVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWEVJRSkpOworCisgIGlmIChTUElfRW5kUnhUeFRyYW5zYWN0aW9uKGhzcGksIFNQSV9ERUZBVUxUX1RJTUVPVVQsIEhBTF9HZXRUaWNrKCkpICE9IEhBTF9PSykKKyAgeworICAgIGhzcGktPkVycm9yQ29kZSA9IEhBTF9TUElfRVJST1JfQUJPUlQ7CisgIH0KKworICAvKiBEaXNhYmxlIFNQSSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1NQSV9ESVNBQkxFKGhzcGkpOworCisgIC8qIEVtcHR5IHRoZSBGUkxWTCBmaWZvICovCisgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgIHsKKyAgICBoc3BpLT5FcnJvckNvZGUgPSBIQUxfU1BJX0VSUk9SX0FCT1JUOworICB9CisKKyAgLyogQ2hlY2sgY2FzZSBvZiBGdWxsLUR1cGxleCBNb2RlIGFuZCBkaXNhYmxlIGRpcmVjdGx5IFJYTkVJRSBpbnRlcnJ1cHQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSkKKyAgeworICAgIC8qIERpc2FibGUgUlhORUlFIGludGVycnVwdCAqLworICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCAoU1BJX0NSMl9SWE5FSUUpKTsKKworICAgIC8qIENoZWNrIFJYTkVJRSBpcyBkaXNhYmxlZCAqLworICAgIGRvCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhzcGktPkVycm9yQ29kZSwgSEFMX1NQSV9FUlJPUl9BQk9SVCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY291bnQtLTsKKyAgICB9CisgICAgd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhzcGktPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhORUlFKSk7CisKKyAgICAvKiBDb250cm9sIHRoZSBCU1kgZmxhZyAqLworICAgIGlmIChTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19CU1ksIFJFU0VULCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgeworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICB9CisKKyAgICAvKiBFbXB0eSB0aGUgRlJMVkwgZmlmbyAqLworICAgIGlmIChTUElfV2FpdEZpZm9TdGF0ZVVudGlsVGltZW91dChoc3BpLCBTUElfRkxBR19GUkxWTCwgU1BJX0ZSTFZMX0VNUFRZLCBTUElfREVGQVVMVF9USU1FT1VULCBIQUxfR2V0VGljaygpKSAhPSBIQUxfT0spCisgICAgeworICAgICAgaHNwaS0+RXJyb3JDb2RlID0gSEFMX1NQSV9FUlJPUl9BQk9SVDsKKyAgICB9CisgIH0KKyAgaHNwaS0+U3RhdGUgPSBIQUxfU1BJX1NUQVRFX0FCT1JUOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1NQSV9NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfc3BpX2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF9zcGlfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2EyZmZjCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfc3BpX2V4LmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3NwaV9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBTUEkgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIFNQSSBwZXJpcGhlcmFsIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdGllcyA6CisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgU1BJRXggU1BJRXgKKyAgKiBAYnJpZWYgU1BJIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKyNpZmRlZiBIQUxfU1BJX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBTUElFeF9Qcml2YXRlX0NvbnN0YW50cyBTUElFeCBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFNQSV9GSUZPX1NJWkUgICAgICAgNFVMCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9ucyBTUElFeCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFNQSUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBEYXRhIHRyYW5zZmVycyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBleHRlbmRlZCBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBTUEkKKyAgICBkYXRhIHRyYW5zZmVycy4KKworICAgICgjKSBSeCBkYXRhIGZsdXNoIGZ1bmN0aW9uOgorICAgICAgICAoKyspIEhBTF9TUElFeF9GbHVzaFJ4RmlmbygpCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRmx1c2ggdGhlIFJYIGZpZm8uCisgICogQHBhcmFtICBoc3BpIHBvaW50ZXIgdG8gYSBTUElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1BJIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TUElFeF9GbHVzaFJ4RmlmbyhTUElfSGFuZGxlVHlwZURlZiAqaHNwaSkKK3sKKyAgX19JTyB1aW50MzJfdCB0bXByZWc7CisgIHVpbnQ4X3QgIGNvdW50ID0gMFU7CisgIHdoaWxlICgoaHNwaS0+SW5zdGFuY2UtPlNSICYgU1BJX0ZMQUdfRlJMVkwpICE9ICBTUElfRlJMVkxfRU1QVFkpCisgIHsKKyAgICBjb3VudCsrOworICAgIHRtcHJlZyA9IGhzcGktPkluc3RhbmNlLT5EUjsKKyAgICBVTlVTRUQodG1wcmVnKTsgLyogVG8gYXZvaWQgR0NDIHdhcm5pbmcgKi8KKyAgICBpZiAoY291bnQgPT0gU1BJX0ZJRk9fU0laRSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfU1BJX01PRFVMRV9FTkFCTEVEICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF90aW0uYyBiL1NyYy9zdG0zMndieHhfaGFsX3RpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDUwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF90aW0uYwpAQCAtMCwwICsxLDY5MjIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3RpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVGltZXIgKFRJTSkgcGVyaXBoZXJhbDoKKyAgKiAgICAgICAgICAgKyBUSU0gVGltZSBCYXNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBUaW1lIEJhc2UgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIFRpbWUgQmFzZSBTdGFydCBETUEKKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVElNIE91dHB1dCBDb21wYXJlL1BXTSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT3V0cHV0IENvbXBhcmUvUFdNICBTdGFydAorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBPdXRwdXQgQ29tcGFyZS9QV00gU3RhcnQgRE1BCisgICogICAgICAgICAgICsgVElNIElucHV0IENhcHR1cmUgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gSW5wdXQgQ2FwdHVyZSBTdGFydAorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0IEludGVycnVwdGlvbgorICAqICAgICAgICAgICArIFRJTSBJbnB1dCBDYXB0dXJlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gT25lIFB1bHNlIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRJTSBPbmUgUHVsc2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24KKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUSU0gRW5jb2RlciBJbnRlcmZhY2UgU3RhcnQgSW50ZXJydXB0aW9uCisgICogICAgICAgICAgICsgVElNIEVuY29kZXIgSW50ZXJmYWNlIFN0YXJ0IERNQQorICAqICAgICAgICAgICArIENvbW11dGF0aW9uIEV2ZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBJbnRlcnJ1cHRpb24gYW5kIERNQQorICAqICAgICAgICAgICArIFRJTSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVElNIEV4dGVybmFsIENsb2NrIGNvbmZpZ3VyYXRpb24KKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTUVSIEdlbmVyaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0gVGhlIFRpbWVyIGZlYXR1cmVzIGluY2x1ZGU6CisgICAgICAgKCMpIDE2LWJpdCB1cCwgZG93biwgdXAvZG93biBhdXRvLXJlbG9hZCBjb3VudGVyLgorICAgICAgICgjKSAxNi1iaXQgcHJvZ3JhbW1hYmxlIHByZXNjYWxlciBhbGxvd2luZyBkaXZpZGluZyAoYWxzbyBvbiB0aGUgZmx5KSB0aGUKKyAgICAgICAgICAgY291bnRlciBjbG9jayBmcmVxdWVuY3kgZWl0aGVyIGJ5IGFueSBmYWN0b3IgYmV0d2VlbiAxIGFuZCA2NTUzNi4KKyAgICAgICAoIykgVXAgdG8gNCBpbmRlcGVuZGVudCBjaGFubmVscyBmb3I6CisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlCisgICAgICAgICAgICgrKykgUFdNIGdlbmVyYXRpb24gKEVkZ2UgYW5kIENlbnRlci1hbGlnbmVkIE1vZGUpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0CisgICAgICAgKCMpIFN5bmNocm9uaXphdGlvbiBjaXJjdWl0IHRvIGNvbnRyb2wgdGhlIHRpbWVyIHdpdGggZXh0ZXJuYWwgc2lnbmFscyBhbmQgdG8gaW50ZXJjb25uZWN0CisgICAgICAgICAgICBzZXZlcmFsIHRpbWVycyB0b2dldGhlci4KKyAgICAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgZW5jb2RlciBmb3IgcG9zaXRpb25pbmcgcHVycG9zZXMKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToKKyAgICAgICAgICAgKCsrKSBUaW1lIEJhc2UgOiBIQUxfVElNX0Jhc2VfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6IEhBTF9USU1fSUNfTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUgOiBIQUxfVElNX09DX01zcEluaXQoKQorICAgICAgICAgICAoKyspIFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTV9QV01fTXNwSW5pdCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoKQorCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyA6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBUSU0gaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19USU14X0NMS19FTkFCTEUoKTsKKyAgICAgICAgKCMjKSBUSU0gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVElNIEdQSU9zIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICAgICAgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKTsKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBUSU0gcGlucyBpbiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSB1c2luZyBIQUxfR1BJT19Jbml0KCk7CisKKyAgICAgKCMpIFRoZSBleHRlcm5hbCBDbG9jayBjYW4gYmUgY29uZmlndXJlZCwgaWYgbmVlZGVkICh0aGUgZGVmYXVsdCBjbG9jayBpcyB0aGUKKyAgICAgICAgIGludGVybmFsIGNsb2NrIGZyb20gdGhlIEFQQngpLCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSwgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisgICAgICAgICBhbnkgc3RhcnQgZnVuY3Rpb24uCisKKyAgICAgKCMpIENvbmZpZ3VyZSB0aGUgVElNIGluIHRoZSBkZXNpcmVkIGZ1bmN0aW9uaW5nIG1vZGUgdXNpbmcgb25lIG9mIHRoZQorICAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9mIHRoaXMgZHJpdmVyOgorICAgICAgICgrKykgSEFMX1RJTV9CYXNlX0luaXQ6IHRvIHVzZSB0aGUgVGltZXIgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgdGltZSBiYXNlCisgICAgICAgKCsrKSBIQUxfVElNX09DX0luaXQgYW5kIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhbgorICAgICAgICAgICAgT3V0cHV0IENvbXBhcmUgc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9QV01fSW5pdCBhbmQgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbDogdG8gdXNlIHRoZSBUaW1lciB0byBnZW5lcmF0ZSBhCisgICAgICAgICAgICBQV00gc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9JQ19Jbml0IGFuZCBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUgVGltZXIgdG8gbWVhc3VyZSBhbgorICAgICAgICAgICAgZXh0ZXJuYWwgc2lnbmFsLgorICAgICAgICgrKykgSEFMX1RJTV9PbmVQdWxzZV9Jbml0IGFuZCBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWw6IHRvIHVzZSB0aGUgVGltZXIKKyAgICAgICAgICAgIGluIE9uZSBQdWxzZSBNb2RlLgorICAgICAgICgrKykgSEFMX1RJTV9FbmNvZGVyX0luaXQ6IHRvIHVzZSB0aGUgVGltZXIgRW5jb2RlciBJbnRlcmZhY2UuCisKKyAgICAgKCMpIEFjdGl2YXRlIHRoZSBUSU0gcGVyaXBoZXJhbCB1c2luZyBvbmUgb2YgdGhlIHN0YXJ0IGZ1bmN0aW9ucyBkZXBlbmRpbmcgZnJvbSB0aGUgZmVhdHVyZSB1c2VkOgorICAgICAgICAgICAoKyspIFRpbWUgQmFzZSA6IEhBTF9USU1fQmFzZV9TdGFydCgpLCBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKCksIEhBTF9USU1fQmFzZV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSW5wdXQgQ2FwdHVyZSA6ICBIQUxfVElNX0lDX1N0YXJ0KCksIEhBTF9USU1fSUNfU3RhcnRfRE1BKCksIEhBTF9USU1fSUNfU3RhcnRfSVQoKQorICAgICAgICAgICAoKyspIE91dHB1dCBDb21wYXJlIDogSEFMX1RJTV9PQ19TdGFydCgpLCBIQUxfVElNX09DX1N0YXJ0X0RNQSgpLCBIQUxfVElNX09DX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiA6IEhBTF9USU1fUFdNX1N0YXJ0KCksIEhBTF9USU1fUFdNX1N0YXJ0X0RNQSgpLCBIQUxfVElNX1BXTV9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgT25lLXB1bHNlIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9PbmVQdWxzZV9TdGFydCgpLCBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBFbmNvZGVyIG1vZGUgb3V0cHV0IDogSEFMX1RJTV9FbmNvZGVyX1N0YXJ0KCksIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoKSwgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKCkuCisKKyAgICAgKCMpIFRoZSBETUEgQnVyc3QgaXMgbWFuYWdlZCB3aXRoIHRoZSB0d28gZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICAgICAgIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydCgpCisgICAgICAgICBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydCgpCisKKyAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dCisgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgWy4uXQorICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgorICBAcmVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgdGhlIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgWy4uXQorICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgd2VhayBmdW5jdGlvbi4KKyAgQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisKKyAgWy4uXQorICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICgrKSBCYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgQmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgSUNfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogVElNIElDIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBJQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gSUMgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgT0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgIDogVElNIE9DIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBPQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gT0MgTXNwIERlSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgIDogVElNIFBXTSBNc3AgSW5pdCBDYWxsYmFjay4KKyAgICAoKykgUFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgIDogVElNIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBPbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgOiBUSU0gT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBPbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gT25lIFB1bHNlIE1zcCBEZUluaXQgQ2FsbGJhY2suCisgICAgKCspIEVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA6IFRJTSBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrLgorICAgICgrKSBFbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgOiBUSU0gRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBIYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgICAgICAgOiBUSU0gSGFsbCBTZW5zb3IgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIEhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgICAgICA6IFRJTSBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBQZXJpb2RFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgICAgOiBUSU0gUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2suCisgICAgKCspIFBlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrICAgICA6IFRJTSBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgOiBUSU0gVHJpZ2dlciBDYWxsYmFjay4KKyAgICAoKykgVHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgIDogVElNIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgSUNfQ2FwdHVyZUNhbGxiYWNrICAgICAgICAgICAgICAgIDogVElNIElucHV0IENhcHR1cmUgQ2FsbGJhY2suCisgICAgKCspIElDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFRJTSBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIE9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICA6IFRJTSBPdXRwdXQgQ29tcGFyZSBEZWxheSBFbGFwc2VkIENhbGxiYWNrLgorICAgICgrKSBQV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICAgICAgICAgOiBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrLgorICAgICgrKSBQV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgOiBUSU0gUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICA6IFRJTSBFcnJvciBDYWxsYmFjay4KKyAgICAoKykgQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICAgICAgIDogVElNIENvbW11dGF0aW9uIENhbGxiYWNrLgorICAgICgrKSBDb21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgOiBUSU0gQ29tbXV0YXRpb24gaGFsZiBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQnJlYWtDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIDogVElNIEJyZWFrIENhbGxiYWNrLgorICAgICgrKSBCcmVhazJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgOiBUSU0gQnJlYWsyIENhbGxiYWNrLgorCisgIFsuLl0KK0J5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVElNX1NUQVRFX1JFU0VUCithbGwgaW50ZXJydXB0IGNhbGxiYWNrcyBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zOgorICBleGFtcGxlcyBAcmVmIEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrKCksIEByZWYgSEFMX1RJTV9FcnJvckNhbGxiYWNrKCkuCisKKyAgWy4uXQorICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsKKyAgZnVuY3Rpb25hbGl0aWVzIGluIHRoZSBJbml0IC8gRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwKKyAgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLiBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEluaXQgLyBEZUluaXQKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdCAvIE1zcERlSW5pdCBjYWxsYmFja3MocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQorCisgIFsuLl0KKyAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQgLyB1bnJlZ2lzdGVyZWQgaW4gSEFMX1RJTV9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQgLyBNc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCAvIHVucmVnaXN0ZXJlZAorICAgIGluIEhBTF9USU1fU1RBVEVfUkVBRFkgb3IgSEFMX1RJTV9TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICB0aHVzIHJlZ2lzdGVyZWQodXNlcikgTXNwSW5pdCAvIERlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0IC8gRGVJbml0LgorICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCisgICAgICB1c2luZyBAcmVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIERlSW5pdCBvciBJbml0IGZ1bmN0aW9uLgorCisgIFsuLl0KKyAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU0gVElNCisgICogQGJyaWVmIFRJTSBIQUwgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVElNX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9Qcml2YXRlX0NvbnN0YW50cworICAqIEB7CisgICovCisjZGVmaW5lIFRJTXhfQUYxX0VUUlNFTCBUSU0xX0FGMV9FVFJTRUwKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgVElNX09DMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9PQzNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fT0M0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOworc3RhdGljIHZvaWQgVElNX09DNV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKTsKK3N0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZyk7CitzdGF0aWMgdm9pZCBUSU1fVEkxX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOworc3RhdGljIHZvaWQgVElNX1RJMl9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTNfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9USTRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0lDRmlsdGVyKTsKK3N0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BUGVyaW9kRWxhcHNlZEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBUSU1fU2xhdmVUaW1lcl9TZXRDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZyk7CisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIFRJTSBUaW1lIEJhc2UgZnVuY3Rpb25zCisgICogIEBicmllZiAgICBUaW1lIEJhc2UgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVGltZSBCYXNlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIGJhc2UuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBiYXNlLgorICAgICgrKSBTdGFydCB0aGUgVGltZSBCYXNlLgorICAgICgrKSBTdG9wIHRoZSBUaW1lIEJhc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEJhc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUaW1lIEJhc2UgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAgKCspIFN0b3AgdGhlIFRpbWUgQmFzZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gVGltZSBiYXNlIFVuaXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9IYW5kbGVUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFN3aXRjaGluZyBmcm9tIENlbnRlciBBbGlnbmVkIGNvdW50ZXIgbW9kZSB0byBFZGdlIGNvdW50ZXIgbW9kZSAob3IgcmV2ZXJzZSkKKyAgKiAgICAgICAgIHJlcXVpcmVzIGEgdGltZXIgcmVzZXQgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXJlY3Rpb24KKyAgKiAgICAgICAgIGR1ZSB0byBESVIgYml0IHJlYWRvbmx5IGluIGNlbnRlciBhbGlnbmVkIG1vZGUuCisgICogICAgICAgICBFeDogY2FsbCBAcmVmIEhBTF9USU1fQmFzZV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9CYXNlX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIEhBTF9USU1fQmFzZV9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogU2V0IHRoZSBUaW1lIEJhc2UgY29uZmlndXJhdGlvbiAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gQmFzZSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fQmFzZV9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+QmFzZV9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEJhc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fQmFzZV9Nc3BJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBCYXNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0Jhc2VfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9CYXNlX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQmFzZV9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBTZXQgdGhlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBVcGRhdGUgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX1VQREFURSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBCYXNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9CYXNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX1VQREFURSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gQmFzZSBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gQmFzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBTZXQgdGhlIERNQSBQZXJpb2QgZWxhcHNlZCBjYWxsYmFja3MgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BUGVyaW9kRWxhcHNlZENwbHQ7CisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQ7CisKKyAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkFSUiwgTGVuZ3RoKSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVVBEQVRFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEJhc2UgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0Jhc2VfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFVwZGF0ZSBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9VUERBVEUpOworCisgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1VQREFURV0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVElNIE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZS4KKyAgICAoKykgU3RvcCB0aGUgVElNIE91dHB1dCBDb21wYXJlLgorICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgICgrKSBTdG9wIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGRpc2FibGUgaW50ZXJydXB0LgorICAgICgrKSBTdGFydCB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9PQ19EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9PQ19Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BJbml0OworICAgIH0KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLworICAgIGh0aW0tPk9DX01zcEluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICAgIEhBTF9USU1fT0NfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIE91dHB1dCBDb21wYXJlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX09DX01zcERlSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAvKiBDaGFuZ2UgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fT0NfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIE91dHB1dCBDb21wYXJlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PQ19Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09DX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBPdXRwdXQgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdG9wX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHBhcmFtICBwRGF0YSBUaGUgc291cmNlIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIG1lbW9yeSB0byBUSU0gcGVyaXBoZXJhbAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PQ19TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IzLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgT3V0cHV0IGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE91dHB1dCBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgVElNIFBXTSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIFRJTSBQV00gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIFBXTSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBQV00uCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBQV00uCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gUFdNLgorICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNLgorICAgICgrKSBTdGFydCB0aGUgVElNIFBXTSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVElNIFBXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gUFdNIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gUFdNIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBQV00gVGltZSBCYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9QV01fRGVJbml0KCkgYmVmb3JlIEhBTF9USU1fUFdNX0luaXQoKQorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICAgIFRJTV9SZXNldENhbGxiYWNrKGh0aW0pOworCisgICAgaWYgKGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9QV01fTXNwSW5pdDsKKyAgICB9CisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9QV01fTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIEluaXQgdGhlIGJhc2UgdGltZSBmb3IgdGhlIFBXTSAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0aW0tPlBXTV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5QV01fTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLworICBIQUxfVElNX1BXTV9Nc3BEZUluaXQoaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgLyogQ2hhbmdlIFRJTSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVTRVQ7CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gUFdNIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUFdNX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fUFdNX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX1N0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBQV00gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRW5hYmxlIHRoZSBtYWluIG91dHB1dCAqLworICAgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhIFRoZSBzb3VyY2UgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gbWVtb3J5IHRvIFRJTSBwZXJpcGhlcmFsCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1BXTV9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgTGVuZ3RoKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ2FwdHVyZS9Db21wYXJlIDMgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1I0LCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIFBXTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9QV01fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFRJTSBJbnB1dCBDYXB0dXJlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZS4KKyAgICgrKSBTdGFydCB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUuCisgICAoKykgU3RhcnQgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgaW50ZXJydXB0LgorICAgKCspIFN0b3AgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICgrKSBTdGFydCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXIuCisgICAoKykgU3RvcCB0aGUgVElNIElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVyLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgVGltZSBiYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9JQ19EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9JQ19Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9JQ19Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogSW5pdCB0aGUgYmFzZSB0aW1lIGZvciB0aGUgaW5wdXQgY2FwdHVyZSAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBUSU0gc3RhdGUqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNX0lDX01zcERlSW5pdDsKKyAgfQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBodGltLT5JQ19Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgIEhBTF9USU1fSUNfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIElucHV0IENhcHR1cmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfTXNwSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIElucHV0IENhcHR1cmUgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX0lDX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzQ6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSA0IGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDNCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudCBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIElucHV0IENhcHR1cmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFRJTSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjQsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0M0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBJbnB1dCBDYXB0dXJlIG1lYXN1cmVtZW50IGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSW5wdXQgQ2FwdHVyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9JQ19TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAzICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgNCAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDNCk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBUSU0gT25lIFB1bHNlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBPbmUgUHVsc2UuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT25lIFB1bHNlLgorICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlLgorICAgICgrKSBTdGFydCB0aGUgVElNIE9uZSBQdWxzZSBhbmQgZW5hYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RvcCB0aGUgVElNIE9uZSBQdWxzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0YXJ0IHRoZSBUSU0gT25lIFB1bHNlIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gT25lIFB1bHNlIGFuZCBkaXNhYmxlIERNQSB0cmFuc2Zlci4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgVGltZSBCYXNlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSGFuZGxlVHlwZURlZiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoKSBiZWZvcmUgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KCkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE9uZVB1bHNlTW9kZSBTZWxlY3QgdGhlIE9uZSBwdWxzZSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX09QTU9ERV9TSU5HTEU6IE9ubHkgb25lIHB1bHNlIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fT1BNT0RFX1JFUEVUSVRJVkU6IFJlcGV0aXRpdmUgcHVsc2VzIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Jbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPbmVQdWxzZU1vZGUpCit7CisgIC8qIENoZWNrIHRoZSBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh0aW0gPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fTU9ERShPbmVQdWxzZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCisgICAgSEFMX1RJTV9PbmVQdWxzZV9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIE9uZSBQdWxzZSBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovCisgIGh0aW0tPkluc3RhbmNlLT5DUjEgJj0gflRJTV9DUjFfT1BNOworCisgIC8qIENvbmZpZ3VyZSB0aGUgT1BNIE1vZGUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMSB8PSBPbmVQdWxzZU1vZGU7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9EZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBUSU0gUGVyaXBoZXJhbCBDbG9jayAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IEdQSU8sIENMT0NLLCBOVklDICovCisgIEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIE9uZSBQdWxzZSBNU1AuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX09uZVB1bHNlX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIFRJTSBPbmUgUHVsc2UgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX09uZVB1bHNlX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKQorICAgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBvdXRwdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBpbnB1dCBhbmQKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZW5hYmxlZCB0b2dldGhlcgorCisgICAgTm8gbmVlZCB0byBlbmFibGUgdGhlIGNvdW50ZXIsIGl0J3MgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IGhhcmR3YXJlCisgICAgKHRoZSBjb3VudGVyIHN0YXJ0cyBpbiByZXNwb25zZSB0byBhIHN0aW11bHVzIGFuZCBnZW5lcmF0ZSBhIHB1bHNlICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgbWFpbiBvdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoT3V0cHV0Q2hhbm5lbCk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGFuZCB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVscworICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIG91dHB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIGlucHV0IGFuZAorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgaW5wdXQsIHRoZSBUSU1fQ0hBTk5FTF8yIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQKKyAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGRpc2FibGVkIHRvZ2V0aGVyICovCisKKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChPdXRwdXRDaGFubmVsKTsKKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBhbmQgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMKKyAgICAoaW4gdGhlIE9QTSBNb2RlIHRoZSB0d28gcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMikKKyAgICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kCisgICAgaWYgVElNX0NIQU5ORUxfMSBpcyB1c2VkIGFzIGlucHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0CisgICAgaW4gYWxsIGNvbWJpbmF0aW9ucywgdGhlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIgc2hvdWxkIGJlIGVuYWJsZWQgdG9nZXRoZXIKKworICAgIE5vIG5lZWQgdG8gZW5hYmxlIHRoZSBjb3VudGVyLCBpdCdzIGVuYWJsZWQgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZQorICAgICh0aGUgY291bnRlciBzdGFydHMgaW4gcmVzcG9uc2UgdG8gYSBzdGltdWx1cyBhbmQgZ2VuZXJhdGUgYSBwdWxzZSAqLworCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIG1haW4gb3V0cHV0ICovCisgICAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKE91dHB1dENoYW5uZWwpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgYW5kIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzCisgIChpbiB0aGUgT1BNIE1vZGUgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKQorICBpZiBUSU1fQ0hBTk5FTF8xIGlzIHVzZWQgYXMgb3V0cHV0LCB0aGUgVElNX0NIQU5ORUxfMiB3aWxsIGJlIHVzZWQgYXMgaW5wdXQgYW5kCisgIGlmIFRJTV9DSEFOTkVMXzEgaXMgdXNlZCBhcyBpbnB1dCwgdGhlIFRJTV9DSEFOTkVMXzIgd2lsbCBiZSB1c2VkIGFzIG91dHB1dAorICBpbiBhbGwgY29tYmluYXRpb25zLCB0aGUgVElNX0NIQU5ORUxfMSBhbmQgVElNX0NIQU5ORUxfMiBzaG91bGQgYmUgZGlzYWJsZWQgdG9nZXRoZXIgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0RJU0FCTEUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNiBUSU0gRW5jb2RlciBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyLgorICAgICgrKSBTdGFydCB0aGUgVElNIEVuY29kZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQuCisgICAgKCspIFN0b3AgdGhlIFRJTSBFbmNvZGVyIGFuZCBkaXNhYmxlIGludGVycnVwdC4KKyAgICAoKykgU3RhcnQgdGhlIFRJTSBFbmNvZGVyIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVyLgorICAgICgrKSBTdG9wIHRoZSBUSU0gRW5jb2RlciBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXIuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBub3RlICAgU3dpdGNoaW5nIGZyb20gQ2VudGVyIEFsaWduZWQgY291bnRlciBtb2RlIHRvIEVkZ2UgY291bnRlciBtb2RlIChvciByZXZlcnNlKQorICAqICAgICAgICAgcmVxdWlyZXMgYSB0aW1lciByZXNldCB0byBhdm9pZCB1bmV4cGVjdGVkIGRpcmVjdGlvbgorICAqICAgICAgICAgZHVlIHRvIERJUiBiaXQgcmVhZG9ubHkgaW4gY2VudGVyIGFsaWduZWQgbW9kZS4KKyAgKiAgICAgICAgIEV4OiBjYWxsIEByZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdCgpIGJlZm9yZSBIQUxfVElNX0VuY29kZXJfSW5pdCgpCisgICogQG5vdGUgICBFbmNvZGVyIG1vZGUgYW5kIEV4dGVybmFsIGNsb2NrIG1vZGUgMiBhcmUgbm90IGNvbXBhdGlibGUgYW5kIG11c3Qgbm90IGJlIHNlbGVjdGVkIHRvZ2V0aGVyCisgICogICAgICAgICBFeDogQSBjYWxsIGZvciBAcmVmIEhBTF9USU1fRW5jb2Rlcl9Jbml0IHdpbGwgZXJhc2UgdGhlIHNldHRpbmdzIG9mIEByZWYgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZQorICAqICAgICAgICAgdXNpbmcgVElNX0NMT0NLU09VUkNFX0VUUk1PREUyIGFuZCB2aWNlIHZlcnNhCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIEVuY29kZXIgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9FbmNvZGVyX0luaXRUeXBlRGVmICpzQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgVElNIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodGltID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT1VOVEVSX01PREUoaHRpbS0+SW5pdC5Db3VudGVyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRElWSVNJT05fRElWKGh0aW0tPkluaXQuQ2xvY2tEaXZpc2lvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9SRUxPQURfUFJFTE9BRChodGltLT5Jbml0LkF1dG9SZWxvYWRQcmVsb2FkKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9NT0RFKHNDb25maWctPkVuY29kZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMVNlbGVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1NFTEVDVElPTihzQ29uZmlnLT5JQzJTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QT0xBUklUWShzQ29uZmlnLT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDMlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BSRVNDQUxFUihzQ29uZmlnLT5JQzJQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUMxRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfRklMVEVSKHNDb25maWctPklDMkZpbHRlcikpOworCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh0aW0tPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBUSU1fUmVzZXRDYWxsYmFjayhodGltKTsKKworICAgIGlmIChodGltLT5FbmNvZGVyX01zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrID0gSEFMX1RJTV9FbmNvZGVyX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNX0VuY29kZXJfTXNwSW5pdChodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIC8qIFNldCB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFJlc2V0IHRoZSBTTVMgYW5kIEVDRSBiaXRzICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfRUNFKTsKKworICAvKiBDb25maWd1cmUgdGhlIFRpbWUgYmFzZSBpbiB0aGUgRW5jb2RlciBNb2RlICovCisgIFRJTV9CYXNlX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJmh0aW0tPkluaXQpOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBodGltLT5JbnN0YW5jZS0+Q0NNUjE7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworCisgIC8qIFNldCB0aGUgZW5jb2RlciBNb2RlICovCisgIHRtcHNtY3IgfD0gc0NvbmZpZy0+RW5jb2Rlck1vZGU7CisKKyAgLyogU2VsZWN0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIGFzIGlucHV0ICovCisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfQ0MyUyk7CisgIHRtcGNjbXIxIHw9IChzQ29uZmlnLT5JQzFTZWxlY3Rpb24gfCAoc0NvbmZpZy0+SUMyU2VsZWN0aW9uIDw8IDhVKSk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgMSBhbmQgdGhlIENhcHR1cmUgQ29tcGFyZSAyIHByZXNjYWxlcnMgYW5kIGZpbHRlcnMgKi8KKyAgdG1wY2NtcjEgJj0gfihUSU1fQ0NNUjFfSUMxUFNDIHwgVElNX0NDTVIxX0lDMlBTQyk7CisgIHRtcGNjbXIxICY9IH4oVElNX0NDTVIxX0lDMUYgfCBUSU1fQ0NNUjFfSUMyRik7CisgIHRtcGNjbXIxIHw9IHNDb25maWctPklDMVByZXNjYWxlciB8IChzQ29uZmlnLT5JQzJQcmVzY2FsZXIgPDwgOFUpOworICB0bXBjY21yMSB8PSAoc0NvbmZpZy0+SUMxRmlsdGVyIDw8IDRVKSB8IChzQ29uZmlnLT5JQzJGaWx0ZXIgPDwgMTJVKTsKKworICAvKiBTZXQgdGhlIFRJMSBhbmQgdGhlIFRJMiBQb2xhcml0aWVzICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFQIHwgVElNX0NDRVJfQ0MyUCk7CisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSBzQ29uZmlnLT5JQzFQb2xhcml0eSB8IChzQ29uZmlnLT5JQzJQb2xhcml0eSA8PCA0VSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSA9IHRtcGNjbXIxOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBodGltLT5JbnN0YW5jZS0+Q0NFUiA9IHRtcGNjZXI7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBUSU0gRW5jb2RlciBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgVElNIEVuY29kZXIgSW50ZXJmYWNlIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9FbmNvZGVyX01zcERlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fRW5jb2Rlcl9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdCA6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQgOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBFbmNvZGVyIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEVuY29kZXIgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbHMgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLworICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kL29yIDIgKi8KKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdCA6CisgICAgeworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF9BTEw6IFRJTSBDaGFubmVsIDEgYW5kIFRJTSBDaGFubmVsIDIgYXJlIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBEaXNhYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWxzIDEgYW5kIDIKKyAgICAoaW4gdGhlIEVuY29kZXJJbnRlcmZhY2UgdGhlIHR3byBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xIGFuZCBUSU1fQ0hBTk5FTF8yKSAqLworICBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8xKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgIH0KKyAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKyAgZWxzZQorICB7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBjYXB0dXJlIGNvbXBhcmUgSW50ZXJydXB0cyAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIEVuY29kZXIgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMX0FMTDogVElNIENoYW5uZWwgMSBhbmQgVElNIENoYW5uZWwgMiBhcmUgc2VsZWN0ZWQKKyAgKiBAcGFyYW0gIHBEYXRhMSBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMS4KKyAgKiBAcGFyYW0gIHBEYXRhMiBUaGUgZGVzdGluYXRpb24gQnVmZmVyIGFkZHJlc3MgZm9yIElDMi4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBUSU0gcGVyaXBoZXJhbCB0byBtZW1vcnkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcERhdGEyLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgoKChwRGF0YTEgPT0gTlVMTCkgfHwgKHBEYXRhMiA9PSBOVUxMKSkpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCAodWludDMyX3QpcERhdGExLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNhcHR1cmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3I7CisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMiwgKHVpbnQzMl90KXBEYXRhMiwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBJbnB1dCBDYXB0dXJlICBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworCisgICAgICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgKi8KKyAgICAgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8yLCBUSU1fQ0N4X0VOQUJMRSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMX0FMTDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YTEsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsICh1aW50MzJfdClwRGF0YTIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworCisgICAgICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsICovCisgICAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworICAgICAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzIsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSAgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIElucHV0IENhcHR1cmUgIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBFbmNvZGVyIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfQUxMOiBUSU0gQ2hhbm5lbCAxIGFuZCBUSU0gQ2hhbm5lbCAyIGFyZSBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgorICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCisgIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgfQorICBlbHNlIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzIpCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKyAgICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMiwgVElNX0NDeF9ESVNBQkxFKTsKKworICAgIC8qIERpc2FibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBETUEgUmVxdWVzdCAxIGFuZCAyICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDcgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKiAgQGJyaWVmICAgIFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgVGltZXIgSVJRIGhhbmRsZXIgZnVuY3Rpb24uCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBUSU0gaW50ZXJydXB0cyByZXF1ZXN0cy4KKyAgKiBAcGFyYW0gIGh0aW0gVElNICBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1RJTV9JUlFIYW5kbGVyKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDYXB0dXJlIGNvbXBhcmUgMSBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDMSkgIT0gUkVTRVQpCisgICAgeworICAgICAgeworICAgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisKKyAgICAgICAgLyogSW5wdXQgY2FwdHVyZSBldmVudCAqLworICAgICAgICBpZiAoKGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmIFRJTV9DQ01SMV9DQzFTKSAhPSAweDAwVSkKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICAgIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIC8qIE91dHB1dCBjb21wYXJlIGV2ZW50ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhodGltKTsKKyAgICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICAgIEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworICAgICAgfQorICAgIH0KKyAgfQorICAvKiBDYXB0dXJlIGNvbXBhcmUgMiBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMikgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDMikgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIxICYgVElNX0NDTVIxX0NDMlMpICE9IDB4MDBVKQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgZWxzZQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworICAgIH0KKyAgfQorICAvKiBDYXB0dXJlIGNvbXBhcmUgMyBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDMykgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDMykgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0NDM1MpICE9IDB4MDBVKQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgZWxzZQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworICAgIH0KKyAgfQorICAvKiBDYXB0dXJlIGNvbXBhcmUgNCBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NDNCkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NDNCkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9DQzQpOworICAgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgICAgIC8qIElucHV0IGNhcHR1cmUgZXZlbnQgKi8KKyAgICAgIGlmICgoaHRpbS0+SW5zdGFuY2UtPkNDTVIyICYgVElNX0NDTVIyX0NDNFMpICE9IDB4MDBVKQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICAvKiBPdXRwdXQgY29tcGFyZSBldmVudCAqLworICAgICAgZWxzZQorICAgICAgeworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgICBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrKGh0aW0pOworICAgICAgICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworICAgIH0KKyAgfQorICAvKiBUSU0gVXBkYXRlIGV2ZW50ICovCisgIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfVVBEQVRFKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfVVBEQVRFKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX1VQREFURSk7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gQnJlYWsgaW5wdXQgZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19CUkVBSykgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0JSRUFLKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICBfX0hBTF9USU1fQ0xFQVJfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5CcmVha0NhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgICAgIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gQnJlYWsyIGlucHV0IGV2ZW50ICovCisgIGlmIChfX0hBTF9USU1fR0VUX0ZMQUcoaHRpbSwgVElNX0ZMQUdfQlJFQUsyKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfQlJFQUspICE9IFJFU0VUKQorICAgIHsKKyAgICAgIF9fSEFMX1RJTV9DTEVBUl9GTEFHKGh0aW0sIFRJTV9GTEFHX0JSRUFLMik7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+QnJlYWsyQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTUV4X0JyZWFrMkNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICAvKiBUSU0gVHJpZ2dlciBkZXRlY3Rpb24gZXZlbnQgKi8KKyAgaWYgKF9fSEFMX1RJTV9HRVRfRkxBRyhodGltLCBUSU1fRkxBR19UUklHR0VSKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShodGltLCBUSU1fSVRfVFJJR0dFUikgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBodGltLT5UcmlnZ2VyQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgICAgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIC8qIFRJTSBjb21tdXRhdGlvbiBldmVudCAqLworICBpZiAoX19IQUxfVElNX0dFVF9GTEFHKGh0aW0sIFRJTV9GTEFHX0NPTSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfVElNX0dFVF9JVF9TT1VSQ0UoaHRpbSwgVElNX0lUX0NPTSkgIT0gUkVTRVQpCisgICAgeworICAgICAgX19IQUxfVElNX0NMRUFSX0lUKGh0aW0sIFRJTV9GTEFHX0NPTSk7CisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayhodGltKTsKKyNlbHNlCisgICAgICBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDggVElNIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIFsuLl0KKyAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CisgICAgICAoKykgQ29uZmlndXJlIFRoZSBJbnB1dCBPdXRwdXQgY2hhbm5lbHMgZm9yIE9DLCBQV00sIElDIG9yIE9uZSBQdWxzZSBtb2RlLgorICAgICAgKCspIENvbmZpZ3VyZSBFeHRlcm5hbCBDbG9jayBzb3VyY2UuCisgICAgICAoKykgQ29uZmlndXJlIENvbXBsZW1lbnRhcnkgY2hhbm5lbHMsIGJyZWFrIGZlYXR1cmVzIGFuZCBkZWFkIHRpbWUuCisgICAgICAoKykgQ29uZmlndXJlIE1hc3RlciBhbmQgdGhlIFNsYXZlIHN5bmNocm9uaXphdGlvbi4KKyAgICAgICgrKSBDb25maWd1cmUgdGhlIERNQSBCdXJzdCBNb2RlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PQ19Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gT3V0cHV0IENvbXBhcmUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNTogVElNIENoYW5uZWwgNSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF82OiBUSU0gQ2hhbm5lbCA2IHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0hBTk5FTFMoQ2hhbm5lbCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09DX01PREUoc0NvbmZpZy0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoc0NvbmZpZy0+T0NQb2xhcml0eSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDEgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCAyIGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0MyX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgMyBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DM19TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIFRJTSBDaGFubmVsIDQgaW4gT3V0cHV0IENvbXBhcmUgKi8KKyAgICAgIFRJTV9PQzRfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBUSU0gQ2hhbm5lbCA1IGluIE91dHB1dCBDb21wYXJlICovCisgICAgICBUSU1fT0M1X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0M2X0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgVElNIENoYW5uZWwgNiBpbiBPdXRwdXQgQ29tcGFyZSAqLworICAgICAgVElNX09DNl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBDaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX0lDX0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBJbnB1dCBDYXB0dXJlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGNvbmZpZ3VyZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzQ6IFRJTSBDaGFubmVsIDQgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0lDX0luaXRUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19TRUxFQ1RJT04oc0NvbmZpZy0+SUNTZWxlY3Rpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUNQcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19GSUxURVIoc0NvbmZpZy0+SUNGaWx0ZXIpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIGlmIChDaGFubmVsID09IFRJTV9DSEFOTkVMXzEpCisgIHsKKyAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLworICAgIFRJTV9USTFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgLyogUmVzZXQgdGhlIElDMVBTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMxUFNDOworCisgICAgLyogU2V0IHRoZSBJQzFQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+SUNQcmVzY2FsZXI7CisgIH0KKyAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBUSU1fQ0hBTk5FTF8yKQorICB7CisgICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgVElNX1RJMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUMyUFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzJQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDMlBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSAoc0NvbmZpZy0+SUNQcmVzY2FsZXIgPDwgOFUpOworICB9CisgIGVsc2UgaWYgKENoYW5uZWwgPT0gVElNX0NIQU5ORUxfMykKKyAgeworICAgIC8qIFRJMyBDb25maWd1cmF0aW9uICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzNfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgIFRJTV9USTNfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgLyogUmVzZXQgdGhlIElDM1BTQyBCaXRzICovCisgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfSUMzUFNDOworCisgICAgLyogU2V0IHRoZSBJQzNQU0MgdmFsdWUgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+SUNQcmVzY2FsZXI7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVEk0IENvbmZpZ3VyYXRpb24gKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgVElNX1RJNF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgc0NvbmZpZy0+SUNQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAvKiBSZXNldCB0aGUgSUM0UFNDIEJpdHMgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzRQU0M7CisKKyAgICAvKiBTZXQgdGhlIElDNFBTQyB2YWx1ZSAqLworICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSAoc0NvbmZpZy0+SUNQcmVzY2FsZXIgPDwgOFUpOworICB9CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBUSU0gUFdNICBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DX0luaXRUeXBlRGVmLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gUFdNIGhhbmRsZQorICAqIEBwYXJhbSAgc0NvbmZpZyBUSU0gUFdNIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVscyB0byBiZSBjb25maWd1cmVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DSEFOTkVMUyhDaGFubmVsKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fUFdNX01PREUoc0NvbmZpZy0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fT0NfUE9MQVJJVFkoc0NvbmZpZy0+T0NQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0ZBU1RfU1RBVEUoc0NvbmZpZy0+T0NGYXN0TW9kZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDEgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDIgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWwyICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgfD0gVElNX0NDTVIxX09DMlBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIxIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQ2hhbm5lbCAzIGluIFBXTSBtb2RlICovCisgICAgICBUSU1fT0MzX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgc0NvbmZpZyk7CisKKyAgICAgIC8qIFNldCB0aGUgUHJlbG9hZCBlbmFibGUgYml0IGZvciBjaGFubmVsMyAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNQRTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBPdXRwdXQgRmFzdCBtb2RlICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzNGRTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBzQ29uZmlnLT5PQ0Zhc3RNb2RlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgNCBpbiBQV00gbW9kZSAqLworICAgICAgVElNX09DNF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWcpOworCisgICAgICAvKiBTZXQgdGhlIFByZWxvYWQgZW5hYmxlIGJpdCBmb3IgY2hhbm5lbDQgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0UEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjIgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZSA8PCA4VTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDUgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzVfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw1Ki8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1UEU7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgT3V0cHV0IEZhc3QgbW9kZSAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M1RkU7CisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gc0NvbmZpZy0+T0NGYXN0TW9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfNjoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzZfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBDaGFubmVsIDYgaW4gUFdNIG1vZGUgKi8KKyAgICAgIFRJTV9PQzZfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnKTsKKworICAgICAgLyogU2V0IHRoZSBQcmVsb2FkIGVuYWJsZSBiaXQgZm9yIGNoYW5uZWw2ICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNlBFOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIE91dHB1dCBGYXN0IG1vZGUgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNkZFOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDTVIzIHw9IHNDb25maWctPk9DRmFzdE1vZGUgPDwgOFU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFRJTSBPbmUgUHVsc2UgQ2hhbm5lbHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZi4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNDb25maWcgVElNIE9uZSBQdWxzZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gb3V0cHV0IGNoYW5uZWwgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHBhcmFtICBJbnB1dENoYW5uZWwgVElNIGlucHV0IENoYW5uZWwgdG8gY29uZmlndXJlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sICBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgIHVpbnQzMl90IElucHV0Q2hhbm5lbCkKK3sKKyAgVElNX09DX0luaXRUeXBlRGVmIHRlbXAxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fT1BNX0NIQU5ORUxTKE91dHB1dENoYW5uZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9PUE1fQ0hBTk5FTFMoSW5wdXRDaGFubmVsKSk7CisKKyAgaWYgKE91dHB1dENoYW5uZWwgIT0gSW5wdXRDaGFubmVsKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh0aW0pOworCisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgICAvKiBFeHRyYWN0IHRoZSBPdXRwdXQgY29tcGFyZSBjb25maWd1cmF0aW9uIGZyb20gc0NvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICB0ZW1wMS5PQ01vZGUgPSBzQ29uZmlnLT5PQ01vZGU7CisgICAgdGVtcDEuUHVsc2UgPSBzQ29uZmlnLT5QdWxzZTsKKyAgICB0ZW1wMS5PQ1BvbGFyaXR5ID0gc0NvbmZpZy0+T0NQb2xhcml0eTsKKyAgICB0ZW1wMS5PQ05Qb2xhcml0eSA9IHNDb25maWctPk9DTlBvbGFyaXR5OworICAgIHRlbXAxLk9DSWRsZVN0YXRlID0gc0NvbmZpZy0+T0NJZGxlU3RhdGU7CisgICAgdGVtcDEuT0NOSWRsZVN0YXRlID0gc0NvbmZpZy0+T0NOSWRsZVN0YXRlOworCisgICAgc3dpdGNoIChPdXRwdXRDaGFubmVsKQorICAgIHsKKyAgICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICAgIHsKKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgICBUSU1fT0MxX1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgJnRlbXAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgICAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZ0ZW1wMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChJbnB1dENoYW5uZWwpCisgICAgeworICAgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgICAgeworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAgIFRJTV9USTFfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBzQ29uZmlnLT5JQ1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29uZmlnLT5JQ1NlbGVjdGlvbiwgc0NvbmZpZy0+SUNGaWx0ZXIpOworCisgICAgICAgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgICBodGltLT5JbnN0YW5jZS0+U01DUiAmPSB+VElNX1NNQ1JfVFM7CisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9UU19USTFGUDE7CisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBTbGF2ZSBNb2RlICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9TTVM7CisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IFRJTV9TTEFWRU1PREVfVFJJR0dFUjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgICB7CisgICAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgICAgVElNX1RJMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDUG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb25maWctPklDU2VsZWN0aW9uLCBzQ29uZmlnLT5JQ0ZpbHRlcik7CisKKyAgICAgICAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMlBTQzsKKworICAgICAgICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovCisgICAgICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1RTX1RJMkZQMjsKKworICAgICAgICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8KKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsKKyAgICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NMQVZFTU9ERV9UUklHR0VSOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgICAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBETUEgQnVyc3QgdG8gdHJhbnNmZXIgRGF0YSBmcm9tIHRoZSBtZW1vcnkgdG8gdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIEJ1cnN0QmFzZUFkZHJlc3MgVElNIEJhc2UgYWRkcmVzcyBmcm9tIHdoZXJlIHRoZSBETUEgIHdpbGwgc3RhcnQgdGhlIERhdGEgd3JpdGUKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfU01DUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9ESUVSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0VHUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ01SMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ0VSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NOVAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9QU0MKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQVJSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1JDUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IxCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMworICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I0CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0JEVFIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfT1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjMgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjUgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjYgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMSAgCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FGMiAgCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfVVBEQVRFOiBUSU0gdXBkYXRlIEludGVycnVwdCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzE6IFRJTSBDYXB0dXJlIENvbXBhcmUgMSBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MyOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDIgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMzogVElNIENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzQ6IFRJTSBDYXB0dXJlIENvbXBhcmUgNCBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ09NOiBUSU0gQ29tbXV0YXRpb24gRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1RSSUdHRVI6IFRJTSBUcmlnZ2VyIERNQSBzb3VyY2UKKyAgKiBAcGFyYW0gIEJ1cnN0QnVmZmVyIFRoZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIEJ1cnN0TGVuZ3RoIERNQSBCdXJzdCBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUKKyAgKiAgICAgICAgIGJldHdlZW46IFRJTV9ETUFCVVJTVExFTkdUSF8xVFJBTlNGRVIgYW5kIFRJTV9ETUFCVVJTVExFTkdUSF8xOFRSQU5TRkVSUy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIEJ1cnN0TGVuZ3RoIGlzIGVxdWFsIHRvIERNQSBkYXRhIHRyYW5zZmVyIGxlbmd0aC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChCdXJzdExlbmd0aCkpOworCisgIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZiAoKEJ1cnN0QnVmZmVyID09IE5VTEwpICYmIChCdXJzdExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykKKyAgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DT006CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tbXV0YXRpb24gY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyQ3BsdENhbGxiYWNrID0gIFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gIFRJTUV4X0RNQUNvbW11dGF0aW9uSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgdHJpZ2dlciBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VyQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogY29uZmlndXJlIHRoZSBETUEgQnVyc3QgTW9kZSAqLworICBodGltLT5JbnN0YW5jZS0+RENSID0gKEJ1cnN0QmFzZUFkZHJlc3MgfCBCdXJzdExlbmd0aCk7CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gRE1BIFJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gRE1BIEJ1cnN0IG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzIHRvIGRpc2FibGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOworCisgIC8qIEFib3J0IHRoZSBETUEgdHJhbnNmZXIgKGF0IGxlYXN0IGRpc2FibGUgdGhlIERNQSBjaGFubmVsKSAqLworICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykKKyAgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MyOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeworICAgICAgc3RhdHVzID0gIEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzQ6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NPTToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9UUklHR0VSOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoSEFMX09LID09IHN0YXR1cykKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFRJTSBVcGRhdGUgRE1BIHJlcXVlc3QgKi8KKyAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgQnVyc3RSZXF1ZXN0U3JjKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQSBCdXJzdCB0byB0cmFuc2ZlciBEYXRhIGZyb20gdGhlIFRJTSBwZXJpcGhlcmFsIHRvIHRoZSBtZW1vcnkKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQnVyc3RCYXNlQWRkcmVzcyBUSU0gQmFzZSBhZGRyZXNzIGZyb20gd2hlcmUgdGhlIERNQSAgd2lsbCBzdGFydCB0aGUgRGF0YSByZWFkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX1NNQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfRElFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9TUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9FR1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NNUjIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NFUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DTlQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfUFNDCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0FSUgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9SQ1IKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1IyCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDUjMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQUJBU0VfQ0NSNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9CRFRSCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX09SCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFCQVNFX0NDTVIzIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I1IAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9DQ1I2IAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjEgIAorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BQkFTRV9BRjIgIAorICAqIEBwYXJhbSAgQnVyc3RSZXF1ZXN0U3JjIFRJTSBETUEgUmVxdWVzdCBzb3VyY2VzCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX1VQREFURTogVElNIHVwZGF0ZSBJbnRlcnJ1cHQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0MxOiBUSU0gQ2FwdHVyZSBDb21wYXJlIDEgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NDMjogVElNIENhcHR1cmUgQ29tcGFyZSAyIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9DQzM6IFRJTSBDYXB0dXJlIENvbXBhcmUgMyBETUEgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9ETUFfQ0M0OiBUSU0gQ2FwdHVyZSBDb21wYXJlIDQgRE1BIHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRE1BX0NPTTogVElNIENvbW11dGF0aW9uIERNQSBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0RNQV9UUklHR0VSOiBUSU0gVHJpZ2dlciBETUEgc291cmNlCisgICogQHBhcmFtICBCdXJzdEJ1ZmZlciBUaGUgQnVmZmVyIGFkZHJlc3MuCisgICogQHBhcmFtICBCdXJzdExlbmd0aCBETUEgQnVyc3QgbGVuZ3RoLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIHZhbHVlCisgICogICAgICAgICBiZXR3ZWVuOiBUSU1fRE1BQlVSU1RMRU5HVEhfMVRSQU5TRkVSIGFuZCBUSU1fRE1BQlVSU1RMRU5HVEhfMThUUkFOU0ZFUlMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBCdXJzdExlbmd0aCBpcyBlcXVhbCB0byBETUEgZGF0YSB0cmFuc2ZlciBsZW5ndGguCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0JBU0UoQnVyc3RCYXNlQWRkcmVzcykpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0xFTkdUSChCdXJzdExlbmd0aCkpOworCisgIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIHsKKyAgICBpZiAoKEJ1cnN0QnVmZmVyID09IE5VTEwpICYmIChCdXJzdExlbmd0aCA+IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorICBzd2l0Y2ggKEJ1cnN0UmVxdWVzdFNyYykKKyAgeworICAgIGNhc2UgVElNX0RNQV9VUERBVEU6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgUGVyaW9kIGVsYXBzZWQgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfVVBEQVRFXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzE6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMjoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlL2NvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY2FwdHVyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQUNhcHR1cmVIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDNDoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjYXB0dXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ09NOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbW11dGF0aW9uIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9ICBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9ICBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX1RSSUdHRVI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgdHJpZ2dlciBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFUcmlnZ2VyQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNvbmZpZ3VyZSB0aGUgRE1BIEJ1cnN0IE1vZGUgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkRDUiA9IChCdXJzdEJhc2VBZGRyZXNzIHwgQnVyc3RMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgVElNIERNQSBSZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBETUEgYnVyc3QgcmVhZGluZworICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBCdXJzdFJlcXVlc3RTcmMgVElNIERNQSBSZXF1ZXN0IHNvdXJjZXMgdG8gZGlzYWJsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0b3AoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9TT1VSQ0UoQnVyc3RSZXF1ZXN0U3JjKSk7CisKKyAgLyogQWJvcnQgdGhlIERNQSB0cmFuc2ZlciAoYXQgbGVhc3QgZGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwpICovCisgIHN3aXRjaCAoQnVyc3RSZXF1ZXN0U3JjKQorICB7CisgICAgY2FzZSBUSU1fRE1BX1VQREFURToKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9VUERBVEVdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0MxOgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DQzI6CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fRE1BX0NDMzoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfQ0M0OgorICAgIHsKKyAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0RNQV9DT006CisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9ETUFfVFJJR0dFUjoKKyAgICB7CisgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKEhBTF9PSyA9PSBzdGF0dXMpCisgIHsKKyAgICAvKiBEaXNhYmxlIHRoZSBUSU0gVXBkYXRlIERNQSByZXF1ZXN0ICovCisgICAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIEJ1cnN0UmVxdWVzdFNyYyk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBzb2Z0d2FyZSBldmVudAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBFdmVudFNvdXJjZSBzcGVjaWZpZXMgdGhlIGV2ZW50IHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfVVBEQVRFOiBUaW1lciB1cGRhdGUgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzE6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAxIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VWRU5UU09VUkNFX0NDMzogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDMgRXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9DQzQ6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSA0IEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQ09NOiBUaW1lciBDT00gZXZlbnQgc291cmNlCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVkVOVFNPVVJDRV9UUklHR0VSOiBUaW1lciBUcmlnZ2VyIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQlJFQUs6IFRpbWVyIEJyZWFrIGV2ZW50IHNvdXJjZQorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyOiBUaW1lciBCcmVhazIgZXZlbnQgc291cmNlCisgICogQG5vdGUgICBCYXNpYyB0aW1lcnMgY2FuIG9ubHkgZ2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50LgorICAqIEBub3RlICAgVElNX0VWRU5UU09VUkNFX0NPTSBpcyByZWxldmFudCBvbmx5IHdpdGggYWR2YW5jZWQgdGltZXIgaW5zdGFuY2VzLgorICAqIEBub3RlICAgVElNX0VWRU5UU09VUkNFX0JSRUFLIGFuZCBUSU1fRVZFTlRTT1VSQ0VfQlJFQUsyIGFyZSByZWxldmFudAorICAqICAgICAgICAgb25seSBmb3IgdGltZXIgaW5zdGFuY2VzIHN1cHBvcnRpbmcgYnJlYWsgaW5wdXQocykuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRXZlbnRTb3VyY2UpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FVkVOVF9TT1VSQ0UoRXZlbnRTb3VyY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIC8qIFNldCB0aGUgZXZlbnQgc291cmNlcyAqLworICBodGltLT5JbnN0YW5jZS0+RUdSID0gRXZlbnRTb3VyY2U7CisKKyAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgT0NSZWYgY2xlYXIgZmVhdHVyZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBzQ2xlYXJJbnB1dENvbmZpZyBwb2ludGVyIHRvIGEgVElNX0NsZWFySW5wdXRDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgT0NSRUYgY2xlYXIgZmVhdHVyZSBhbmQgcGFyYW1ldGVycyBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fQ29uZmlnT0NyZWZDbGVhcihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQ2xlYXJJbnB1dENvbmZpZ1R5cGVEZWYgKnNDbGVhcklucHV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ0xFQVJJTlBVVF9TT1VSQ0Uoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTb3VyY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworCisgIHN3aXRjaCAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTb3VyY2UpCisgIHsKKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX05PTkU6CisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgYW5kIHRoZSB0aGUgRVRSIEJpdHMgKi8KKyAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgKFRJTV9TTUNSX09DQ1MgfCBUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwgVElNX1NNQ1JfRVRQKSk7CisKKyAgICAgIC8qIENsZWFyIFRJTXhfQUYxX09DUkVGX0NMUiAocmVzZXQgdmFsdWUpICovCisgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkFGMSwgVElNMV9BRjFfRVRSU0VMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRJTV9DTEVBUklOUFVUU09VUkNFX0NPTVAxOgorICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfQ09NUDI6CisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIE9DUkVGIGNsZWFyIHNlbGVjdGlvbiBiaXQgKi8KKyAgICAgIENMRUFSX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfT0NDUyk7CisKKyAgICAgIC8qIE9DUkVGX0NMUl9JTlQgaXMgY29ubmVjdGVkIHRvIENPTVB4IG91dHB1dCAqLworICAgICAgTU9ESUZZX1JFRyhodGltLT5JbnN0YW5jZS0+QUYxLCBUSU0xX0FGMV9FVFJTRUwsIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0U291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMRUFSSU5QVVRTT1VSQ0VfRVRSOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMRUFSSU5QVVRfUE9MQVJJVFkoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUklOUFVUX1BSRVNDQUxFUihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlcikpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTEVBUklOUFVUX0ZJTFRFUihzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dEZpbHRlcikpOworCisgICAgICAvKiBXaGVuIE9DUmVmIGNsZWFyIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUiBwcmVzY2FsZXIgbXVzdCBiZSBvZmYgKi8KKyAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlciAhPSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxKQorICAgICAgeworICAgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgICAgIF9fSEFMX1VOTE9DSyhodGltKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbGVhcklucHV0Q29uZmlnLT5DbGVhcklucHV0UG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dEZpbHRlcik7CisKKyAgICAgIC8qIFNldCB0aGUgT0NSRUYgY2xlYXIgc2VsZWN0aW9uIGJpdCAqLworICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+U01DUiwgVElNX1NNQ1JfT0NDUyk7CisKKyAgICAgIC8qIENsZWFyIFRJTXhfQUYxX09DUkVGX0NMUiAocmVzZXQgdmFsdWUpICovCisgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkFGMSwgVElNMV9BRjFfRVRSU0VMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDEgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjEsIFRJTV9DQ01SMV9PQzFDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMSAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MxQ0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDIgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjEsIFRJTV9DQ01SMV9PQzJDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMiAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIxLCBUSU1fQ0NNUjFfT0MyQ0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDMgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjIsIFRJTV9DQ01SMl9PQzNDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgMyAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0MzQ0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfNDoKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDQgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjIsIFRJTV9DQ01SMl9PQzRDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNCAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIyLCBUSU1fQ0NNUjJfT0M0Q0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfNToKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDUgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjMsIFRJTV9DQ01SM19PQzVDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNSAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M1Q0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0NIQU5ORUxfNjoKKyAgICB7CisgICAgICBpZiAoc0NsZWFySW5wdXRDb25maWctPkNsZWFySW5wdXRTdGF0ZSAhPSAodWludDMyX3QpRElTQUJMRSkKKyAgICAgIHsKKyAgICAgICAgLyogRW5hYmxlIHRoZSBPQ1JFRiBjbGVhciBmZWF0dXJlIGZvciBDaGFubmVsIDYgKi8KKyAgICAgICAgU0VUX0JJVChodGltLT5JbnN0YW5jZS0+Q0NNUjMsIFRJTV9DQ01SM19PQzZDRSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIE9DUkVGIGNsZWFyIGZlYXR1cmUgZm9yIENoYW5uZWwgNiAqLworICAgICAgICBDTEVBUl9CSVQoaHRpbS0+SW5zdGFuY2UtPkNDTVIzLCBUSU1fQ0NNUjNfT0M2Q0UpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICAgQ29uZmlndXJlcyB0aGUgY2xvY2sgc291cmNlIHRvIGJlIHVzZWQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgc0Nsb2NrU291cmNlQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ2xvY2tDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyB0aGUgY2xvY2sgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpKTsKKworICAvKiBSZXNldCB0aGUgU01TLCBUUywgRUNFLCBFVFBTIGFuZCBFVFJGIGJpdHMgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfU01TIHwgVElNX1NNQ1JfVFMpOworICB0bXBzbWNyICY9IH4oVElNX1NNQ1JfRVRGIHwgVElNX1NNQ1JfRVRQUyB8IFRJTV9TTUNSX0VDRSB8IFRJTV9TTUNSX0VUUCk7CisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICBzd2l0Y2ggKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpCisgIHsKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JTlRFUk5BTDoKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMToKKyAgICB7CisgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCBtb2RlIDEgKEVUUkYpKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgRVRSIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQUkVTQ0FMRVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1BPTEFSSVRZKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0ZJTFRFUihzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcik7CisKKyAgICAgIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgYW5kIHRoZSBFVFJGIHRyaWdnZXIgKi8KKyAgICAgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUjsKKyAgICAgIHRtcHNtY3IgfD0gKFRJTV9TTEFWRU1PREVfRVhURVJOQUwxIHwgVElNX0NMT0NLU09VUkNFX0VUUk1PREUxKTsKKyAgICAgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgPSB0bXBzbWNyOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTI6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIHRyaWdnZXIgaW5wdXQgbW9kZSAyIChFVFJGKSovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIEVUUiBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUFJFU0NBTEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBDbG9jayBzb3VyY2UgKi8KKyAgICAgIFRJTV9FVFJfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgLyogRW5hYmxlIHRoZSBFeHRlcm5hbCBjbG9jayBtb2RlMiAqLworICAgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NNQ1JfRUNFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfVEkxOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9USTI6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGV4dGVybmFsIGNsb2NrIG1vZGUgMSAoRVRSRikqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS1NPVVJDRV9USVhfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAgICAgLyogQ2hlY2sgVEkyIGlucHV0IGNvbmRpdGlvbmluZyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tQT0xBUklUWShzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tGSUxURVIoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja0ZpbHRlcikpOworCisgICAgICBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpOworICAgICAgVElNX0lUUnhfU2V0Q29uZmlnKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0xPQ0tTT1VSQ0VfVEkyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX1RJMUVEOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlIDEgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfVElYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgICAgIC8qIENoZWNrIFRJMSBpbnB1dCBjb25kaXRpb25pbmcgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLUE9MQVJJVFkoc0Nsb2NrU291cmNlQ29uZmlnLT5DbG9ja1BvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NMT0NLRklMVEVSKHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tGaWx0ZXIpKTsKKworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2xvY2tTb3VyY2VDb25maWctPkNsb2NrRmlsdGVyKTsKKyAgICAgIFRJTV9JVFJ4X1NldENvbmZpZyhodGltLT5JbnN0YW5jZSwgVElNX0NMT0NLU09VUkNFX1RJMUVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjA6CisgICAgY2FzZSBUSU1fQ0xPQ0tTT1VSQ0VfSVRSMToKKyAgICBjYXNlIFRJTV9DTE9DS1NPVVJDRV9JVFIyOgorICAgIGNhc2UgVElNX0NMT0NLU09VUkNFX0lUUjM6CisgICAgeworICAgICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGludGVybmFsIHRyaWdnZXIgaW5wdXQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfSVRSWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICBUSU1fSVRSeF9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDbG9ja1NvdXJjZUNvbmZpZy0+Q2xvY2tTb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZWxlY3RzIHRoZSBzaWduYWwgY29ubmVjdGVkIHRvIHRoZSBUSTEgaW5wdXQ6IGRpcmVjdCBmcm9tIENIMV9pbnB1dAorICAqICAgICAgICAgb3IgYSBYT1IgY29tYmluYXRpb24gYmV0d2VlbiBDSDFfaW5wdXQsIENIMl9pbnB1dCAmIENIM19pbnB1dAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgVEkxX1NlbGVjdGlvbiBJbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCBjaGFubmVsIDEgaXMgY29ubmVjdGVkIHRvIHRoZQorICAqICAgICAgICAgb3V0cHV0IG9mIGEgWE9SIGdhdGUuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJMVNFTEVDVElPTl9DSDE6IFRoZSBUSU14X0NIMSBwaW4gaXMgY29ubmVjdGVkIHRvIFRJMSBpbnB1dAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVEkxU0VMRUNUSU9OX1hPUkNPTUJJTkFUSU9OOiBUaGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzCisgICogICAgICAgICAgICBwaW5zIGFyZSBjb25uZWN0ZWQgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVEkxX1NlbGVjdGlvbikKK3sKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fWE9SX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVEkxU0VMRUNUSU9OKFRJMV9TZWxlY3Rpb24pKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IGh0aW0tPkluc3RhbmNlLT5DUjI7CisKKyAgLyogUmVzZXQgdGhlIFRJMSBzZWxlY3Rpb24gKi8KKyAgdG1wY3IyICY9IH5USU1fQ1IyX1RJMVM7CisKKyAgLyogU2V0IHRoZSBUSTEgc2VsZWN0aW9uICovCisgIHRtcGNyMiB8PSBUSTFfU2VsZWN0aW9uOworCisgIC8qIFdyaXRlIHRvIFRJTXhDUjIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIFRJTSBpbiBTbGF2ZSBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBzU2xhdmVDb25maWcgcG9pbnRlciB0byBhIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIHRoZSBzZWxlY3RlZCB0cmlnZ2VyIChpbnRlcm5hbCB0cmlnZ2VyIGlucHV0LCBmaWx0ZXJlZAorICAqICAgICAgICAgdGltZXIgaW5wdXQgb3IgZXh0ZXJuYWwgdHJpZ2dlciBpbnB1dCkgYW5kIHRoZSBTbGF2ZSBtb2RlCisgICogICAgICAgICAoRGlzYWJsZSwgUmVzZXQsIEdhdGVkLCBUcmlnZ2VyLCBFeHRlcm5hbCBjbG9jayBtb2RlIDEpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9TbGF2ZUNvbmZpZ1N5bmNocm8oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX01PREUoc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgeworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIERpc2FibGUgVHJpZ2dlciBJbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX1RSSUdHRVIpOworCisgIC8qIERpc2FibGUgVHJpZ2dlciBETUEgcmVxdWVzdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9UUklHR0VSKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNIGluIFNsYXZlIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHNTbGF2ZUNvbmZpZyBwb2ludGVyIHRvIGEgVElNX1NsYXZlQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRyaWdnZXIgKGludGVybmFsIHRyaWdnZXIgaW5wdXQsIGZpbHRlcmVkCisgICogICAgICAgICB0aW1lciBpbnB1dCBvciBleHRlcm5hbCB0cmlnZ2VyIGlucHV0KSBhbmQgdGhlIFNsYXZlIG1vZGUKKyAgKiAgICAgICAgIChEaXNhYmxlLCBSZXNldCwgR2F0ZWQsIFRyaWdnZXIsIEV4dGVybmFsIGNsb2NrIG1vZGUgMSkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hyb19JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX1NMQVZFX01PREUoc1NsYXZlQ29uZmlnLT5TbGF2ZU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgeworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEVuYWJsZSBUcmlnZ2VyIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9UUklHR0VSKTsKKworICAvKiBEaXNhYmxlIFRyaWdnZXIgRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfVFJJR0dFUik7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlYWQgdGhlIGNhcHR1cmVkIHZhbHVlIGZyb20gQ2FwdHVyZSBDb21wYXJlIHVuaXQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWxzIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogQHJldHZhbCBDYXB0dXJlZCB2YWx1ZQorICAqLwordWludDMyX3QgSEFMX1RJTV9SZWFkQ2FwdHVyZWRWYWx1ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wcmVnID0gMFU7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgMSB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gIGh0aW0tPkluc3RhbmNlLT5DQ1IxOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgMiB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gICBodGltLT5JbnN0YW5jZS0+Q0NSMjsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDM19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgMyB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gICBodGltLT5JbnN0YW5jZS0+Q0NSMzsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF80OgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDNF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgICAgICAvKiBSZXR1cm4gdGhlIGNhcHR1cmUgNCB2YWx1ZSAqLworICAgICAgdG1wcmVnID0gICBodGltLT5JbnN0YW5jZS0+Q0NSNDsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHRtcHJlZzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOSBUSU0gQ2FsbGJhY2tzIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgWy4uXQorICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFRJTSBjYWxsYmFjayBmdW5jdGlvbnM6CisgICAoKykgVElNIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrCisgICAoKykgVElNIE91dHB1dCBDb21wYXJlIGNhbGxiYWNrCisgICAoKykgVElNIElucHV0IGNhcHR1cmUgY2FsbGJhY2sKKyAgICgrKSBUSU0gVHJpZ2dlciBjYWxsYmFjaworICAgKCspIFRJTSBFcnJvciBjYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBQZXJpb2QgZWxhcHNlZCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgT3V0cHV0IENvbXBhcmUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9DIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fT0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJbnB1dCBDYXB0dXJlIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBJQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIElDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBQV00gUHVsc2UgZmluaXNoZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUFdNIFB1bHNlIGZpbmlzaGVkIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgVHJpZ2dlciBkZXRlY3Rpb24gaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIGVycm9yIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1fRXJyb3JDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1fRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgVElNIGNhbGxiYWNrIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIEJhc2UgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JBU0VfTVNQREVJTklUX0NCX0lEIEJhc2UgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCBJQyBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIElDIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUElOSVRfQ0JfSUQgT0MgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCBPQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCBQV00gTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BERUlOSVRfQ0JfSUQgUFdNIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCBPbmUgUHVsc2UgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIEVuY29kZXIgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIEVuY29kZXIgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCBIYWxsIFNlbnNvciBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEIEhhbGwgU2Vuc29yIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEIFBlcmlvZCBFbGFwc2VkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfSEFMRl9DQl9JRCBQZXJpb2QgRWxhcHNlZCBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fVFJJR0dFUl9IQUxGX0NCX0lEIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfQ0JfSUQgSW5wdXQgQ2FwdHVyZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0lDX0NBUFRVUkVfSEFMRl9DQl9JRCBJbnB1dCBDYXB0dXJlIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PQ19ERUxBWV9FTEFQU0VEX0NCX0lEIE91dHB1dCBDb21wYXJlIERlbGF5IEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQgUFdNIFB1bHNlIEZpbmlzaGVkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0NPTU1VVEFUSU9OX0NCX0lEIENvbW11dGF0aW9uIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQ09NTVVUQVRJT05fSEFMRl9DQl9JRCBDb21tdXRhdGlvbiBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQlJFQUtfQ0JfSUQgQnJlYWsgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgQnJlYWsyIENhbGxiYWNrIElECisgICogICAgICAgICAgQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVElNX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9DX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T25lUHVsc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICAgICAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BFUklPRF9FTEFQU0VEX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fVFJJR0dFUl9DQl9JRCA6CisgICAgICAgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19DQVBUVVJFX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfREVMQVlfRUxBUFNFRF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX1BVTFNFX0ZJTklTSEVEX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRVJST1JfQ0JfSUQgOgorICAgICAgICBodGltLT5FcnJvckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgOgorICAgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CUkVBS19DQl9JRCA6CisgICAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CUkVBSzJfQ0JfSUQgOgorICAgICAgICBodGltLT5CcmVhazJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9USU1fQkFTRV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+QmFzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcEluaXRDYWxsYmFjayAgICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RW5jb2Rlcl9Nc3BJbml0Q2FsbGJhY2sgICAgICA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrICAgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgVElNIGNhbGxiYWNrCisgICogICAgICAgICBUSU0gY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGh0aW0gdGltIGhhbmRsZQorICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgQmFzZSBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQkFTRV9NU1BERUlOSVRfQ0JfSUQgQmFzZSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIElDIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9JQ19NU1BERUlOSVRfQ0JfSUQgSUMgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfTVNQSU5JVF9DQl9JRCBPQyBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEIE9DIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9NU1BJTklUX0NCX0lEIFBXTSBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUFdNX01TUERFSU5JVF9DQl9JRCBQV00gTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQgT25lIFB1bHNlIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9PTkVfUFVMU0VfTVNQREVJTklUX0NCX0lEIE9uZSBQdWxzZSBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9FTkNPREVSX01TUElOSVRfQ0JfSUQgRW5jb2RlciBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQgRW5jb2RlciBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BJTklUX0NCX0lEIEhhbGwgU2Vuc29yIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9IQUxMX1NFTlNPUl9NU1BERUlOSVRfQ0JfSUQgSGFsbCBTZW5zb3IgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9IQUxGX0NCX0lEIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUklHR0VSX0NCX0lEIFRyaWdnZXIgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCBJbnB1dCBDYXB0dXJlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIElucHV0IENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgT3V0cHV0IENvbXBhcmUgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0VSUk9SX0NCX0lEIEVycm9yIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgQ29tbXV0YXRpb24gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9DT01NVVRBVElPTl9IQUxGX0NCX0lEIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RJTV9CUkVBS19DQl9JRCBCcmVhayBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVElNX0JSRUFLMl9DQl9JRCBCcmVhazIgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9VblJlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVElNX0JBU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICA9IEhBTF9USU1fQmFzZV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9USU1fQmFzZV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9JQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgID0gSEFMX1RJTV9JQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgID0gSEFMX1RJTV9JQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAgICAgID0gSEFMX1RJTV9PQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgICAgICAgID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgICAgICA9IEhBTF9USU1fUFdNX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgICAgID0gSEFMX1RJTV9QV01fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBXTSBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT25lIFB1bHNlIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fT05FX1BVTFNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fT25lUHVsc2VfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fRW5jb2Rlcl9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFbmNvZGVyIE1zcCBJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fRU5DT0RFUl9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5FbmNvZGVyX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRW5jb2RlciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSEFMTF9TRU5TT1JfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwSW5pdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgICAgICA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcERlSW5pdDsgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUEVSSU9EX0VMQVBTRURfQ0JfSUQgOgorICAgICAgICBodGltLT5QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfVElNX1BlcmlvZEVsYXBzZWRDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kIEVsYXBzZWQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QRVJJT0RfRUxBUFNFRF9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFBlcmlvZCBFbGFwc2VkIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgID0gSEFMX1RJTV9UcmlnZ2VyQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXIgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9UUklHR0VSX0hBTEZfQ0JfSUQgOgorICAgICAgICBodGltLT5UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX1RyaWdnZXJIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHJpZ2dlciBoYWxmIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX0NhcHR1cmVDYWxsYmFjayAgICAgICAgICAgICAgICA9IEhBTF9USU1fSUNfQ2FwdHVyZUNhbGxiYWNrOyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBDYXB0dXJlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fSUNfQ0FQVFVSRV9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+SUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIENhcHR1cmUgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09DX0RFTEFZX0VMQVBTRURfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19EZWxheUVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgPSBIQUxfVElNX09DX0RlbGF5RWxhcHNlZENhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgRGVsYXkgRWxhcHNlZCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX1BXTV9QVUxTRV9GSU5JU0hFRF9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2sgICAgICAgICA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gUHVsc2UgRmluaXNoZWQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fUFVMU0VfRklOSVNIRURfSEFMRl9DQl9JRCA6CisgICAgICAgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBQV00gUHVsc2UgRmluaXNoZWQgaGFsZiBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fQ09NTVVUQVRJT05fQ0JfSUQgOgorICAgICAgICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb24gQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9DT01NVVRBVElPTl9IQUxGX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+Q29tbXV0YXRpb25IYWxmQ3BsdENhbGxiYWNrICAgICAgID0gSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CUkVBS19DQl9JRCA6CisgICAgICAgIGh0aW0tPkJyZWFrQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICA9IEhBTF9USU1FeF9CcmVha0NhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhayBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0JSRUFLMl9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJyZWFrMkNhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9IEhBTF9USU1FeF9CcmVhazJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCcmVhazIgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFU0VUKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5CYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9CYXNlX01zcEluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBCYXNlIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9CQVNFX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkJhc2VfTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgPSBIQUxfVElNX0Jhc2VfTXNwRGVJbml0OyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5JQ19Nc3BJbml0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9JQ19Nc3BJbml0OyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBJQyBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0lDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPklDX01zcERlSW5pdENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX0lDX01zcERlSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIElDIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+T0NfTXNwSW5pdENhbGxiYWNrICAgICAgICAgICA9IEhBTF9USU1fT0NfTXNwSW5pdDsgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgT0MgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PQ19Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgID0gSEFMX1RJTV9PQ19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBPQyBNc3AgRGVJbml0IENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9USU1fUFdNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5QV01fTXNwSW5pdENhbGxiYWNrICAgICAgICAgID0gSEFMX1RJTV9QV01fTXNwSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBQV00gTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9QV01fTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRpbS0+UFdNX01zcERlSW5pdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fUFdNX01zcERlSW5pdDsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9PTkVfUFVMU0VfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPk9uZVB1bHNlX01zcEluaXRDYWxsYmFjayAgICAgPSBIQUxfVElNX09uZVB1bHNlX01zcEluaXQ7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9uZSBQdWxzZSBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX09ORV9QVUxTRV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5PbmVQdWxzZV9Nc3BEZUluaXRDYWxsYmFjayAgID0gSEFMX1RJTV9PbmVQdWxzZV9Nc3BEZUluaXQ7ICAgICAgICAvKiBMZWdhY3kgd2VhayBPbmUgUHVsc2UgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0VOQ09ERVJfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwSW5pdENhbGxiYWNrICAgICAgPSBIQUxfVElNX0VuY29kZXJfTXNwSW5pdDsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RJTV9FTkNPREVSX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkVuY29kZXJfTXNwRGVJbml0Q2FsbGJhY2sgICAgPSBIQUxfVElNX0VuY29kZXJfTXNwRGVJbml0OyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVuY29kZXIgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayAgID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwSW5pdDsgICAgICAvKiBMZWdhY3kgd2VhayBIYWxsIFNlbnNvciBNc3AgSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVElNX0hBTExfU0VOU09SX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BEZUluaXQ7ICAgIC8qIExlZ2FjeSB3ZWFrIEhhbGwgU2Vuc29yIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMTAgVElNIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwKKyAgICBhbmQgdGhlIGRhdGEgZmxvdy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBCYXNlIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEJhc2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fQmFzZV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIE9DIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX09DX0dldFN0YXRlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICByZXR1cm4gaHRpbS0+U3RhdGU7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gUFdNIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNX1BXTV9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVElNIElucHV0IENhcHR1cmUgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSUMgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fSUNfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBPbmUgUHVsc2UgTW9kZSBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBodGltIFRJTSBPUE0gaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfR2V0U3RhdGUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHJldHVybiBodGltLT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIFRJTSBFbmNvZGVyIE1vZGUgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gRW5jb2RlciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9USU1fU3RhdGVUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgZXJyb3IgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5FcnJvckNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9FcnJvckNhbGxiYWNrKGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgRGVsYXkgUHVsc2UgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIERlbGF5IFB1bHNlIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8xOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8yOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF8zOworICB9CisgIGVsc2UgaWYgKGhkbWEgPT0gaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0pCisgIHsKKyAgICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF80OworICB9CisgIGVsc2UKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgQ2FwdHVyZSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BQ2FwdHVyZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMTsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMjsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfMzsKKyAgfQorICBlbHNlIGlmIChoZG1hID09IGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdKQorICB7CisgICAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfNDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+SUNfQ2FwdHVyZUNhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9JQ19DYXB0dXJlQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHRpbS0+Q2hhbm5lbCA9IEhBTF9USU1fQUNUSVZFX0NIQU5ORUxfQ0xFQVJFRDsKK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIENhcHR1cmUgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRE1BQ2FwdHVyZUhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzE7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzI7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzM7CisgIH0KKyAgZWxzZSBpZiAoaGRtYSA9PSBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0M0XSkKKyAgeworICAgIGh0aW0tPkNoYW5uZWwgPSBIQUxfVElNX0FDVElWRV9DSEFOTkVMXzQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9JQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICBodGltLT5DaGFubmVsID0gSEFMX1RJTV9BQ1RJVkVfQ0hBTk5FTF9DTEVBUkVEOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRJTSBETUEgUGVyaW9kIEVsYXBzZSBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVBlcmlvZEVsYXBzZWRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSA9IChUSU1fSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBQZXJpb2QgRWxhcHNlIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9ETUFQZXJpb2RFbGFwc2VkSGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1fUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBUcmlnZ2VyIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSBwb2ludGVyIHRvIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5UcmlnZ2VyQ2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNX1RyaWdnZXJDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIFRyaWdnZXIgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX0RNQVRyaWdnZXJIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGh0aW0tPlRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrKGh0aW0pOworI2Vsc2UKKyAgSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUaW1lIEJhc2UgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgU3RydWN0dXJlIFRJTSBCYXNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworICB0bXBjcjEgPSBUSU14LT5DUjE7CisKKyAgLyogU2V0IFRJTSBUaW1lIEJhc2UgVW5pdCBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmIChJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFNlbGVjdCB0aGUgQ291bnRlciBNb2RlICovCisgICAgdG1wY3IxICY9IH4oVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyk7CisgICAgdG1wY3IxIHw9IFN0cnVjdHVyZS0+Q291bnRlck1vZGU7CisgIH0KKworICBpZiAoSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2V0IHRoZSBjbG9jayBkaXZpc2lvbiAqLworICAgIHRtcGNyMSAmPSB+VElNX0NSMV9DS0Q7CisgICAgdG1wY3IxIHw9ICh1aW50MzJfdClTdHJ1Y3R1cmUtPkNsb2NrRGl2aXNpb247CisgIH0KKworICAvKiBTZXQgdGhlIGF1dG8tcmVsb2FkIHByZWxvYWQgKi8KKyAgTU9ESUZZX1JFRyh0bXBjcjEsIFRJTV9DUjFfQVJQRSwgU3RydWN0dXJlLT5BdXRvUmVsb2FkUHJlbG9hZCk7CisKKyAgVElNeC0+Q1IxID0gdG1wY3IxOworCisgIC8qIFNldCB0aGUgQXV0b3JlbG9hZCB2YWx1ZSAqLworICBUSU14LT5BUlIgPSAodWludDMyX3QpU3RydWN0dXJlLT5QZXJpb2QgOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovCisgIFRJTXgtPlBTQyA9IFN0cnVjdHVyZS0+UHJlc2NhbGVyOworCisgIGlmIChJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2V0IHRoZSBSZXBldGl0aW9uIENvdW50ZXIgdmFsdWUgKi8KKyAgICBUSU14LT5SQ1IgPSBTdHJ1Y3R1cmUtPlJlcGV0aXRpb25Db3VudGVyOworICB9CisKKyAgLyogR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50IHRvIHJlbG9hZCB0aGUgUHJlc2NhbGVyCisgICAgIGFuZCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIChvbmx5IGZvciBhZHZhbmNlZCB0aW1lcikgdmFsdWUgaW1tZWRpYXRlbHkgKi8KKyAgVElNeC0+RUdSID0gVElNX0VHUl9VRzsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSAxIGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfT0MxTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9DQzFTOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gT0NfQ29uZmlnLT5PQ01vZGU7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLworICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzFQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gT0NfQ29uZmlnLT5PQ1BvbGFyaXR5OworCisgIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8xKSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzFOUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSBPQ19Db25maWctPk9DTlBvbGFyaXR5OworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBTdGF0ZSAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMU5FOworICB9CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgYW5kIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMxOworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMxTjsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IE9DX0NvbmZpZy0+T0NJZGxlU3RhdGU7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgTiBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IxID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgMiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNX09DMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIFRJTV9PQ19Jbml0VHlwZURlZiAqT0NfQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjY21yeDsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIFRJTXgtPkNSMjsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgbW9kZSBhbmQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjFfT0MyTTsKKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMV9DQzJTOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSAoT0NfQ29uZmlnLT5PQ01vZGUgPDwgOFUpOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgUG9sYXJpdHkgbGV2ZWwgKi8KKyAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MyUDsKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DUG9sYXJpdHkgPDwgNFUpOworCisgIGlmIChJU19USU1fQ0NYTl9JTlNUQU5DRShUSU14LCBUSU1fQ0hBTk5FTF8yKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOX1BPTEFSSVRZKE9DX0NvbmZpZy0+T0NOUG9sYXJpdHkpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgTiBQb2xhcml0eSBsZXZlbCAqLworICAgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDMk5QOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgKi8KKyAgICB0bXBjY2VyIHw9IChPQ19Db25maWctPk9DTlBvbGFyaXR5IDw8IDRVKTsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gU3RhdGUgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzJORTsKKworICB9CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTklETEVfU1RBVEUoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgYW5kIE91dHB1dCBDb21wYXJlIE4gSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMyOworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVMyTjsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgdG1wY3IyIHw9IChPQ19Db25maWctPk9DSWRsZVN0YXRlIDw8IDJVKTsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NOSWRsZVN0YXRlIDw8IDJVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSMiA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIFRpbWVyIE91dHB1dCBDb21wYXJlIDMgY29uZmlndXJhdGlvbgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBPQ19Db25maWcgVGhlIG91cHV0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fT0MzX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MzRTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIyOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBtb2RlIGFuZCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gflRJTV9DQ01SMl9PQzNNOworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX0NDM1M7CisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDM1A7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDhVKTsKKworICBpZiAoSVNfVElNX0NDWE5fSU5TVEFOQ0UoVElNeCwgVElNX0NIQU5ORUxfMykpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DTl9QT0xBUklUWShPQ19Db25maWctPk9DTlBvbGFyaXR5KSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IE4gUG9sYXJpdHkgbGV2ZWwgKi8KKyAgICB0bXBjY2VyICY9IH5USU1fQ0NFUl9DQzNOUDsKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBOIFBvbGFyaXR5ICovCisgICAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ05Qb2xhcml0eSA8PCA4VSk7CisgICAgLyogUmVzZXQgdGhlIE91dHB1dCBOIFN0YXRlICovCisgICAgdG1wY2NlciAmPSB+VElNX0NDRVJfQ0MzTkU7CisgIH0KKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NOSURMRV9TVEFURShPQ19Db25maWctPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19USU1fT0NJRExFX1NUQVRFKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBhbmQgT3V0cHV0IENvbXBhcmUgTiBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzM7CisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzNOOworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgNFUpOworICAgIC8qIFNldCB0aGUgT3V0cHV0IE4gSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ05JZGxlU3RhdGUgPDwgNFUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjIgKi8KKyAgVElNeC0+Q0NNUjIgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1IzID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNCBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzRfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzRFOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjI7CisKKyAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIG1vZGUgYW5kIENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICB0bXBjY21yeCAmPSB+VElNX0NDTVIyX09DNE07CisgIHRtcGNjbXJ4ICY9IH5USU1fQ0NNUjJfQ0M0UzsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNFA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDEyVSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX09DSURMRV9TVEFURShPQ19Db25maWctPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM0OworCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA2VSk7CisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBUSU14LT5DUjIgPSB0bXBjcjI7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXJ4OworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIFRJTXgtPkNDUjQgPSBPQ19Db25maWctPlB1bHNlOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBUaW1lciBPdXRwdXQgQ29tcGFyZSA1IGNvbmZpZ3VyYXRpb24KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgT0NfQ29uZmlnIFRoZSBvdXB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX09DNV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fT0NfSW5pdFR5cGVEZWYgKk9DX0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY2Ntcng7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcGNyMjsKKworICAvKiBEaXNhYmxlIHRoZSBvdXRwdXQ6IFJlc2V0IHRoZSBDQ3hFIEJpdCAqLworICBUSU14LT5DQ0VSICY9IH5USU1fQ0NFUl9DQzVFOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9ICBUSU14LT5DUjI7CisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yeCA9IFRJTXgtPkNDTVIzOworCisgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlIEJpdHMgKi8KKyAgdG1wY2NtcnggJj0gfihUSU1fQ0NNUjNfT0M1TSk7CisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICB0bXBjY21yeCB8PSBPQ19Db25maWctPk9DTW9kZTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gflRJTV9DQ0VSX0NDNVA7CisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgdG1wY2NlciB8PSAoT0NfQ29uZmlnLT5PQ1BvbGFyaXR5IDw8IDE2VSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIC8qIFJlc2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBJRExFIFN0YXRlICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX09JUzU7CisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIHRtcGNyMiB8PSAoT0NfQ29uZmlnLT5PQ0lkbGVTdGF0ZSA8PCA4VSk7CisgIH0KKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgVElNeC0+Q1IyID0gdG1wY3IyOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgVElNeC0+Q0NNUjMgPSB0bXBjY21yeDsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBUSU14LT5DQ1I1ID0gT0NfQ29uZmlnLT5QdWxzZTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGltZXIgT3V0cHV0IENvbXBhcmUgNiBjb25maWd1cmF0aW9uCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIE9DX0NvbmZpZyBUaGUgb3VwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9PQzZfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpCit7CisgIHVpbnQzMl90IHRtcGNjbXJ4OworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogRGlzYWJsZSB0aGUgb3V0cHV0OiBSZXNldCB0aGUgQ0N4RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M2RTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSAgVElNeC0+Q1IyOworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcnggPSBUSU14LT5DQ01SMzsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSBCaXRzICovCisgIHRtcGNjbXJ4ICY9IH4oVElNX0NDTVIzX09DNk0pOworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgdG1wY2NtcnggfD0gKE9DX0NvbmZpZy0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBSZXNldCB0aGUgT3V0cHV0IFBvbGFyaXR5IGxldmVsICovCisgIHRtcGNjZXIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzZQOworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIHRtcGNjZXIgfD0gKE9DX0NvbmZpZy0+T0NQb2xhcml0eSA8PCAyMFUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgSURMRSBTdGF0ZSAqLworICAgIHRtcGNyMiAmPSB+VElNX0NSMl9PSVM2OworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICB0bXBjcjIgfD0gKE9DX0NvbmZpZy0+T0NJZGxlU3RhdGUgPDwgMTBVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIFRJTXgtPkNSMiA9IHRtcGNyMjsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIFRJTXgtPkNDTVIzID0gdG1wY2Ntcng7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgVElNeC0+Q0NSNiA9IE9DX0NvbmZpZy0+UHVsc2U7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIFRpbWVyIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgc1NsYXZlQ29uZmlnIFNsYXZlIHRpbWVyIGNvbmZpZ3VyYXRpb24KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBUSU1fU2xhdmVUaW1lcl9TZXRDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworCisgIC8qIFJlc2V0IHRoZSBUcmlnZ2VyIFNlbGVjdGlvbiBCaXRzICovCisgIHRtcHNtY3IgJj0gflRJTV9TTUNSX1RTOworICAvKiBTZXQgdGhlIElucHV0IFRyaWdnZXIgc291cmNlICovCisgIHRtcHNtY3IgfD0gc1NsYXZlQ29uZmlnLT5JbnB1dFRyaWdnZXI7CisKKyAgLyogUmVzZXQgdGhlIHNsYXZlIG1vZGUgQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9TTVM7CisgIC8qIFNldCB0aGUgc2xhdmUgbW9kZSAqLworICB0bXBzbWNyIHw9IHNTbGF2ZUNvbmZpZy0+U2xhdmVNb2RlOworCisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisKKyAgLyogQ29uZmlndXJlIHRoZSB0cmlnZ2VyIHByZXNjYWxlciwgZmlsdGVyLCBhbmQgcG9sYXJpdHkgKi8KKyAgc3dpdGNoIChzU2xhdmVDb25maWctPklucHV0VHJpZ2dlcikKKyAgeworICAgIGNhc2UgVElNX1RTX0VUUkY6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tTT1VSQ0VfRVRSTU9ERTFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBSRVNDQUxFUihzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisgICAgICAvKiBDb25maWd1cmUgdGhlIEVUUiBUcmlnZ2VyIHNvdXJjZSAqLworICAgICAgVElNX0VUUl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTFGX0VEOgorICAgIHsKKyAgICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworCisgICAgICBpZihzU2xhdmVDb25maWctPlNsYXZlTW9kZSA9PSBUSU1fU0xBVkVNT0RFX0dBVEVEKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICAgICAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICAgICAgaHRpbS0+SW5zdGFuY2UtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMUU7CisgICAgICB0bXBjY21yMSA9IGh0aW0tPkluc3RhbmNlLT5DQ01SMTsKKworICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgICAgIHRtcGNjbXIxIHw9ICgoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSA8PCA0VSk7CisKKyAgICAgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgICAgICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgICAgIGh0aW0tPkluc3RhbmNlLT5DQ0VSID0gdG1wY2NlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX1RTX1RJMUZQMToKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJJR0dFUlBPTEFSSVRZKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5KSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJGSUxURVIoc1NsYXZlQ29uZmlnLT5UcmlnZ2VyRmlsdGVyKSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBUSTEgRmlsdGVyIGFuZCBQb2xhcml0eSAqLworICAgICAgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKGh0aW0tPkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlclBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9UU19USTJGUDI6CisgICAgeworICAgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX1RSSUdHRVJQT0xBUklUWShzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9UUklHR0VSRklMVEVSKHNTbGF2ZUNvbmZpZy0+VHJpZ2dlckZpbHRlcikpOworCisgICAgICAvKiBDb25maWd1cmUgVEkyIEZpbHRlciBhbmQgUG9sYXJpdHkgKi8KKyAgICAgIFRJTV9USTJfQ29uZmlnSW5wdXRTdGFnZShodGltLT5JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2xhdmVDb25maWctPlRyaWdnZXJGaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fVFNfSVRSMDoKKyAgICBjYXNlIFRJTV9UU19JVFIxOgorICAgIGNhc2UgVElNX1RTX0lUUjI6CisgICAgY2FzZSBUSU1fVFNfSVRSMzoKKyAgICB7CisgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTEgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ1NlbGVjdGlvbiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0RJUkVDVFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fSU5ESVJFQ1RUSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDMi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX1RSQzogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIFRSQy4KKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgVElNX0lDRmlsdGVyIGFuZCBUSU1fSUNQb2xhcml0eSBhcmUgbm90IHVzZWQgaW4gSU5ESVJFQ1QgbW9kZSBhcyBUSTJGUDEKKyAgKiAgICAgICAob24gY2hhbm5lbDIgcGF0aCkgaXMgdXNlZCBhcyB0aGUgaW5wdXQgc2lnbmFsLiBUaGVyZWZvcmUgQ0NNUjEgbXVzdCBiZQorICAqICAgICAgICBwcm90ZWN0ZWQgYWdhaW5zdCB1bi1pbml0aWFsaXplZCBmaWx0ZXIgYW5kIHBvbGFyaXR5IHZhbHVlcy4KKyAgKi8KK3ZvaWQgVElNX1RJMV9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICBpZiAoSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSAhPSBSRVNFVCkKKyAgeworICAgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfQ0MxUzsKKyAgICB0bXBjY21yMSB8PSBUSU1fSUNTZWxlY3Rpb247CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wY2NtcjEgfD0gVElNX0NDTVIxX0NDMVNfMDsKKyAgfQorCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMxRjsKKyAgdG1wY2NtcjEgfD0gKChUSU1fSUNGaWx0ZXIgPDwgNFUpICYgVElNX0NDTVIxX0lDMUYpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5ICYgKFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgYW5kIENDRVIgcmVnaXN0ZXJzICovCisgIFRJTXgtPkNDTVIxID0gdG1wY2NtcjE7CisgIFRJTXgtPkNDRVIgPSB0bXBjY2VyOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUG9sYXJpdHkgYW5kIEZpbHRlciBmb3IgVEkxLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVElNX1RJMV9Db25maWdJbnB1dFN0YWdlKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDRmlsdGVyKQoreworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQzFFIEJpdCAqLworICB0bXBjY2VyID0gVElNeC0+Q0NFUjsKKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0MxRTsKKyAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMUY7CisgIHRtcGNjbXIxIHw9IChUSU1fSUNGaWx0ZXIgPDwgNFUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCk7CisgIHRtcGNjZXIgfD0gVElNX0lDUG9sYXJpdHk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSBhbmQgQ0NFUiByZWdpc3RlcnMgKi8KKyAgVElNeC0+Q0NNUjEgPSB0bXBjY21yMTsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTIgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQorICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEk6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUMxLgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLgorICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJMUZQMgorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMSBtdXN0IGJlCisgICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICAqLworc3RhdGljIHZvaWQgVElNX1RJMl9TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjEgJj0gflRJTV9DQ01SMV9DQzJTOworICB0bXBjY21yMSB8PSAoVElNX0lDU2VsZWN0aW9uIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIGZpbHRlciAqLworICB0bXBjY21yMSAmPSB+VElNX0NDTVIxX0lDMkY7CisgIHRtcGNjbXIxIHw9ICgoVElNX0lDRmlsdGVyIDw8IDEyVSkgJiBUSU1fQ0NNUjFfSUMyRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzJFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKSAmIChUSU1fQ0NFUl9DQzJQIHwgVElNX0NDRVJfQ0MyTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBQb2xhcml0eSBhbmQgRmlsdGVyIGZvciBUSTIuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBUSU1fSUNQb2xhcml0eSBUaGUgSW5wdXQgUG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfUklTSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0ZBTExJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfQk9USEVER0UKKyAgKiBAcGFyYW0gIFRJTV9JQ0ZpbHRlciBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEkyX0NvbmZpZ0lucHV0U3RhZ2UoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDMkU7CisgIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIxICY9IH5USU1fQ0NNUjFfSUMyRjsKKyAgdG1wY2NtcjEgfD0gKFRJTV9JQ0ZpbHRlciA8PCAxMlUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgdG1wY2NlciAmPSB+KFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gKFRJTV9JQ1BvbGFyaXR5IDw8IDRVKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMSA9IHRtcGNjbXIxIDsKKyAgVElNeC0+Q0NFUiA9IHRtcGNjZXI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSTMgYXMgSW5wdXQuCisgICogQHBhcmFtICBUSU14IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwKKyAgKiBAcGFyYW0gIFRJTV9JQ1BvbGFyaXR5IFRoZSBJbnB1dCBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9SSVNJTkcKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDUE9MQVJJVFlfRkFMTElORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9CT1RIRURHRQorICAqIEBwYXJhbSAgVElNX0lDU2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgaW5wdXQgdG8gYmUgdXNlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fRElSRUNUVEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzMuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9JTkRJUkVDVFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gSUM0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNTRUxFQ1RJT05fVFJDOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0byBiZSBjb25uZWN0ZWQgdG8gVFJDLgorICAqIEBwYXJhbSAgVElNX0lDRmlsdGVyIFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKiBAbm90ZSBUSU1fSUNGaWx0ZXIgYW5kIFRJTV9JQ1BvbGFyaXR5IGFyZSBub3QgdXNlZCBpbiBJTkRJUkVDVCBtb2RlIGFzIFRJM0ZQNAorICAqICAgICAgIChvbiBjaGFubmVsMSBwYXRoKSBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzaWduYWwuIFRoZXJlZm9yZSBDQ01SMiBtdXN0IGJlCisgICogICAgICAgIHByb3RlY3RlZCBhZ2FpbnN0IHVuLWluaXRpYWxpemVkIGZpbHRlciBhbmQgcG9sYXJpdHkgdmFsdWVzLgorICAqLworc3RhdGljIHZvaWQgVElNX1RJM19TZXRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFRJTV9JQ1BvbGFyaXR5LCB1aW50MzJfdCBUSU1fSUNTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcGNjbXIyOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDM0UgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gflRJTV9DQ0VSX0NDM0U7CisgIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7CisgIHRtcGNjZXIgPSBUSU14LT5DQ0VSOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9DQzNTOworICB0bXBjY21yMiB8PSBUSU1fSUNTZWxlY3Rpb247CisKKyAgLyogU2V0IHRoZSBmaWx0ZXIgKi8KKyAgdG1wY2NtcjIgJj0gflRJTV9DQ01SMl9JQzNGOworICB0bXBjY21yMiB8PSAoKFRJTV9JQ0ZpbHRlciA8PCA0VSkgJiBUSU1fQ0NNUjJfSUMzRik7CisKKyAgLyogU2VsZWN0IHRoZSBQb2xhcml0eSBhbmQgc2V0IHRoZSBDQzNFIEJpdCAqLworICB0bXBjY2VyICY9IH4oVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKTsKKyAgdG1wY2NlciB8PSAoKFRJTV9JQ1BvbGFyaXR5IDw8IDhVKSAmIChUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOworICBUSU14LT5DQ0VSID0gdG1wY2NlcjsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJNCBhcyBJbnB1dC4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgVElNX0lDUG9sYXJpdHkgVGhlIElucHV0IFBvbGFyaXR5LgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX1JJU0lORworICAqICAgICAgICAgICAgQGFyZyBUSU1fSUNQT0xBUklUWV9GQUxMSU5HCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFCisgICogQHBhcmFtICBUSU1fSUNTZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9ESVJFQ1RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8gYmUgY29ubmVjdGVkIHRvIElDNC4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0lDU0VMRUNUSU9OX0lORElSRUNUVEk6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBJQzMuCisgICogICAgICAgICAgICBAYXJnIFRJTV9JQ1NFTEVDVElPTl9UUkM6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlIGNvbm5lY3RlZCB0byBUUkMuCisgICogQHBhcmFtICBUSU1fSUNGaWx0ZXIgU3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlIEZpbHRlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLgorICAqIEBub3RlIFRJTV9JQ0ZpbHRlciBhbmQgVElNX0lDUG9sYXJpdHkgYXJlIG5vdCB1c2VkIGluIElORElSRUNUIG1vZGUgYXMgVEk0RlAzCisgICogICAgICAgKG9uIGNoYW5uZWwxIHBhdGgpIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNpZ25hbC4gVGhlcmVmb3JlIENDTVIyIG11c3QgYmUKKyAgKiAgICAgICAgcHJvdGVjdGVkIGFnYWluc3QgdW4taW5pdGlhbGl6ZWQgZmlsdGVyIGFuZCBwb2xhcml0eSB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fVEk0X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0lDUG9sYXJpdHksIHVpbnQzMl90IFRJTV9JQ1NlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRJTV9JQ0ZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wY2NtcjI7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSB+VElNX0NDRVJfQ0M0RTsKKyAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsKKyAgdG1wY2NlciA9IFRJTXgtPkNDRVI7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCAqLworICB0bXBjY21yMiAmPSB+VElNX0NDTVIyX0NDNFM7CisgIHRtcGNjbXIyIHw9IChUSU1fSUNTZWxlY3Rpb24gPDwgOFUpOworCisgIC8qIFNldCB0aGUgZmlsdGVyICovCisgIHRtcGNjbXIyICY9IH5USU1fQ0NNUjJfSUM0RjsKKyAgdG1wY2NtcjIgfD0gKChUSU1fSUNGaWx0ZXIgPDwgMTJVKSAmIFRJTV9DQ01SMl9JQzRGKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDNEUgQml0ICovCisgIHRtcGNjZXIgJj0gfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApOworICB0bXBjY2VyIHw9ICgoVElNX0lDUG9sYXJpdHkgPDwgMTJVKSAmIChUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyIGFuZCBDQ0VSIHJlZ2lzdGVycyAqLworICBUSU14LT5DQ01SMiA9IHRtcGNjbXIyOworICBUSU14LT5DQ0VSID0gdG1wY2NlciA7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UKKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyU291cmNlIFRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIFRyaWdnZXIgMgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3RvcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfVEkxRlAxOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19USTJGUDI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0VUUkY6IEV4dGVybmFsIFRyaWdnZXIgaW5wdXQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFRJTV9JVFJ4X1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgSW5wdXRUcmlnZ2VyU291cmNlKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIEdldCB0aGUgVElNeCBTTUNSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcHNtY3IgPSBUSU14LT5TTUNSOworICAvKiBSZXNldCB0aGUgVFMgQml0cyAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9UUzsKKyAgLyogU2V0IHRoZSBJbnB1dCBUcmlnZ2VyIHNvdXJjZSBhbmQgdGhlIHNsYXZlIG1vZGUqLworICB0bXBzbWNyIHw9IChJbnB1dFRyaWdnZXJTb3VyY2UgfCBUSU1fU0xBVkVNT0RFX0VYVEVSTkFMMSk7CisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBUSU14LT5TTUNSID0gdG1wc21jcjsKK30KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBFeHRlcm5hbCBUcmlnZ2VyIChFVFIpLgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBUSU1fRXh0VFJHUHJlc2NhbGVyIFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjE6IEVUUlAgUHJlc2NhbGVyIE9GRi4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBSRVNDQUxFUl9ESVYyOiBFVFJQIGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDIuCisgICogICAgICAgICAgICBAYXJnIFRJTV9FVFJQUkVTQ0FMRVJfRElWNDogRVRSUCBmcmVxdWVuY3kgZGl2aWRlZCBieSA0LgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUFJFU0NBTEVSX0RJVjg6IEVUUlAgZnJlcXVlbmN5IGRpdmlkZWQgYnkgOC4KKyAgKiBAcGFyYW0gIFRJTV9FeHRUUkdQb2xhcml0eSBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQb2xhcml0eS4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fRVRSUE9MQVJJVFlfSU5WRVJURUQ6IGFjdGl2ZSBsb3cgb3IgZmFsbGluZyBlZGdlIGFjdGl2ZS4KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0VUUlBPTEFSSVRZX05PTklOVkVSVEVEOiBhY3RpdmUgaGlnaCBvciByaXNpbmcgZWRnZSBhY3RpdmUuCisgICogQHBhcmFtICBFeHRUUkdGaWx0ZXIgRXh0ZXJuYWwgVHJpZ2dlciBGaWx0ZXIuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fRVRSX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgVElNX0V4dFRSR1ByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVElNX0V4dFRSR1BvbGFyaXR5LCB1aW50MzJfdCBFeHRUUkdGaWx0ZXIpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgdG1wc21jciA9IFRJTXgtPlNNQ1I7CisKKyAgLyogUmVzZXQgdGhlIEVUUiBCaXRzICovCisgIHRtcHNtY3IgJj0gfihUSU1fU01DUl9FVEYgfCBUSU1fU01DUl9FVFBTIHwgVElNX1NNQ1JfRUNFIHwgVElNX1NNQ1JfRVRQKTsKKworICAvKiBTZXQgdGhlIFByZXNjYWxlciwgdGhlIEZpbHRlciB2YWx1ZSBhbmQgdGhlIFBvbGFyaXR5ICovCisgIHRtcHNtY3IgfD0gKHVpbnQzMl90KShUSU1fRXh0VFJHUHJlc2NhbGVyIHwgKFRJTV9FeHRUUkdQb2xhcml0eSB8IChFeHRUUkdGaWx0ZXIgPDwgOFUpKSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBTTUNSICovCisgIFRJTXgtPlNNQ1IgPSB0bXBzbWNyOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4LgorICAqIEBwYXJhbSAgVElNeCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsCisgICogQHBhcmFtICBDaGFubmVsIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMworICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEBwYXJhbSAgQ2hhbm5lbFN0YXRlIHNwZWNpZmllcyB0aGUgVElNIENoYW5uZWwgQ0N4RSBiaXQgbmV3IHN0YXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeF9FTkFCTEUgb3IgVElNX0NDeF9ESVNBQkxFLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1fQ0N4Q2hhbm5lbENtZChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgQ2hhbm5lbFN0YXRlKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NIQU5ORUxTKENoYW5uZWwpKTsKKworICB0bXAgPSBUSU1fQ0NFUl9DQzFFIDw8IChDaGFubmVsICYgMHgxRlUpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCisKKyAgLyogUmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gfnRtcDsKKworICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeEUgQml0ICovCisgIFRJTXgtPkNDRVIgfD0gKHVpbnQzMl90KShDaGFubmVsU3RhdGUgPDwgKENoYW5uZWwgJiAweDFGVSkpOyAvKiAweDFGVSA9IDMxIGJpdHMgbWF4IHNoaWZ0ICovCit9CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcy4KKyAgKiBAcGFyYW0gIGh0aW0gcG9pbnRlciB0byBhIFRJTV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFRJTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIFRJTV9SZXNldENhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBSZXNldCB0aGUgVElNIGNhbGxiYWNrIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgaHRpbS0+UGVyaW9kRWxhcHNlZENhbGxiYWNrICAgICAgICAgICAgID0gSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFBlcmlvZEVsYXBzZWRDYWxsYmFjayAgICAgICAgICAgICAqLworICBodGltLT5QZXJpb2RFbGFwc2VkSGFsZkNwbHRDYWxsYmFjayAgICAgPSBIQUxfVElNX1BlcmlvZEVsYXBzZWRIYWxmQ3BsdENhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgUGVyaW9kRWxhcHNlZEhhbGZDcGx0Q2FsbGJhY2sgICAgICovCisgIGh0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgICAgICAgICAgICA9IEhBTF9USU1fVHJpZ2dlckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgaHRpbS0+VHJpZ2dlckhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9UcmlnZ2VySGFsZkNwbHRDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXJIYWxmQ3BsdENhbGxiYWNrICAgICAgICAgICAqLworICBodGltLT5JQ19DYXB0dXJlQ2FsbGJhY2sgICAgICAgICAgICAgICAgPSBIQUxfVElNX0lDX0NhcHR1cmVDYWxsYmFjazsgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgSUNfQ2FwdHVyZUNhbGxiYWNrICAgICAgICAgICAgICAgICovCisgIGh0aW0tPklDX0NhcHR1cmVIYWxmQ3BsdENhbGxiYWNrICAgICAgICA9IEhBTF9USU1fSUNfQ2FwdHVyZUhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBJQ19DYXB0dXJlSGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgaHRpbS0+T0NfRGVsYXlFbGFwc2VkQ2FsbGJhY2sgICAgICAgICAgID0gSEFMX1RJTV9PQ19EZWxheUVsYXBzZWRDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE9DX0RlbGF5RWxhcHNlZENhbGxiYWNrICAgICAgICAgICAqLworICBodGltLT5QV01fUHVsc2VGaW5pc2hlZENhbGxiYWNrICAgICAgICAgPSBIQUxfVElNX1BXTV9QdWxzZUZpbmlzaGVkQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgUFdNX1B1bHNlRmluaXNoZWRDYWxsYmFjayAgICAgICAgICovCisgIGh0aW0tPlBXTV9QdWxzZUZpbmlzaGVkSGFsZkNwbHRDYWxsYmFjayA9IEhBTF9USU1fUFdNX1B1bHNlRmluaXNoZWRIYWxmQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBQV01fUHVsc2VGaW5pc2hlZEhhbGZDcGx0Q2FsbGJhY2sgKi8KKyAgaHRpbS0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgID0gSEFMX1RJTV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICBodGltLT5Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tbXV0YXRpb25DYWxsYmFjayAgICAgICAgICAgICAgICovCisgIGh0aW0tPkNvbW11dGF0aW9uSGFsZkNwbHRDYWxsYmFjayAgICAgICA9IEhBTF9USU1FeF9Db21tdXRIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgaHRpbS0+QnJlYWtDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgID0gSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEJyZWFrQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICBodGltLT5CcmVhazJDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgPSBIQUxfVElNRXhfQnJlYWsyQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgQnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICovCit9CisjZW5kaWYgLyogVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3RpbV9leC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfdGltX2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiZWUxMQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfaGFsX3RpbV9leC5jCkBAIC0wLDAgKzEsMjE5NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfdGltX2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBUaW1lciBFeHRlbmRlZCBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIFRpbWUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIEluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgVGltZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgU3RhcnQKKyAgKiAgICAgICAgICAgKyBUaW1lIENvbXBsZW1lbnRhcnkgc2lnbmFsIGJyZWFrIGFuZCBkZWFkIHRpbWUgY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgTWFzdGVyIGFuZCBTbGF2ZSBzeW5jaHJvbml6YXRpb24gY29uZmlndXJhdGlvbgorICAqICAgICAgICAgICArIFRpbWUgT3V0cHV0IENvbXBhcmUvUFdNIENoYW5uZWwgQ29uZmlndXJhdGlvbiAoZm9yIGNoYW5uZWxzIDUgYW5kIDYpCisgICogICAgICAgICAgICsgVGltZSBPQ1JlZiBjbGVhciBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgVGltZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcyBjb25maWd1cmF0aW9uCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU1FUiBFeHRlbmRlZCBmZWF0dXJlcyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoZSBUaW1lciBFeHRlbmRlZCBmZWF0dXJlcyBpbmNsdWRlOgorICAgICgjKSBDb21wbGVtZW50YXJ5IG91dHB1dHMgd2l0aCBwcm9ncmFtbWFibGUgZGVhZC10aW1lIGZvciA6CisgICAgICAgICgrKykgT3V0cHV0IENvbXBhcmUKKyAgICAgICAgKCsrKSBQV00gZ2VuZXJhdGlvbiAoRWRnZSBhbmQgQ2VudGVyLWFsaWduZWQgTW9kZSkKKyAgICAgICAgKCsrKSBPbmUtcHVsc2UgbW9kZSBvdXRwdXQKKyAgICAoIykgU3luY2hyb25pemF0aW9uIGNpcmN1aXQgdG8gY29udHJvbCB0aGUgdGltZXIgd2l0aCBleHRlcm5hbCBzaWduYWxzIGFuZCB0bworICAgICAgICBpbnRlcmNvbm5lY3Qgc2V2ZXJhbCB0aW1lcnMgdG9nZXRoZXIuCisgICAgKCMpIEJyZWFrIGlucHV0IHRvIHB1dCB0aGUgdGltZXIgb3V0cHV0IHNpZ25hbHMgaW4gcmVzZXQgc3RhdGUgb3IgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAoIykgU3VwcG9ydHMgaW5jcmVtZW50YWwgKHF1YWRyYXR1cmUpIGVuY29kZXIgYW5kIGhhbGwtc2Vuc29yIGNpcmN1aXRyeSBmb3IKKyAgICAgICAgcG9zaXRpb25pbmcgcHVycG9zZXMKKworICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICgjKSBJbml0aWFsaXplIHRoZSBUSU0gbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgZmVhdHVyZToKKyAgICAgICAgICAgKCsrKSBIYWxsIFNlbnNvciBvdXRwdXQgOiBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KCkKKworICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVElNIGxvdyBsZXZlbCByZXNvdXJjZXMgOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgVElNIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfVElNeF9DTEtfRU5BQkxFKCk7CisgICAgICAgICgjIykgVElNIHBpbnMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFRJTSBHUElPcyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorICAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFRJTSBwaW5zIGluIEFsdGVybmF0ZSBmdW5jdGlvbiBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKTsKKworICAgICAoIykgVGhlIGV4dGVybmFsIENsb2NrIGNhbiBiZSBjb25maWd1cmVkLCBpZiBuZWVkZWQgKHRoZSBkZWZhdWx0IGNsb2NrIGlzIHRoZQorICAgICAgICAgaW50ZXJuYWwgY2xvY2sgZnJvbSB0aGUgQVBCeCksIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAgICBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlLCB0aGUgY2xvY2sgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG9uZSBiZWZvcmUKKyAgICAgICAgIGFueSBzdGFydCBmdW5jdGlvbi4KKworICAgICAoIykgQ29uZmlndXJlIHRoZSBUSU0gaW4gdGhlIGRlc2lyZWQgZnVuY3Rpb25pbmcgbW9kZSB1c2luZyBvbmUgb2YgdGhlCisgICAgICAgICBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvZiB0aGlzIGRyaXZlcjoKKyAgICAgICAgICAoKyspIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoKSBhbmQgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KCk6IHRvIHVzZSB0aGUKKyAgICAgICAgICAgICAgIFRpbWVyIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgdGhlIGNvbW11dGF0aW9uIGV2ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgIEludGVycnVwdCBhbmQgRE1BIHJlcXVlc3QgaWYgbmVlZGVkIChOb3RlIHRoYXQgT25lIFRpbWVyIGlzIHVzZWQgdG8gaW50ZXJmYWNlCisgICAgICAgICAgICAgICB3aXRoIHRoZSBIYWxsIHNlbnNvciBJbnRlcmZhY2UgYW5kIGFub3RoZXIgVGltZXIgc2hvdWxkIGJlIHVzZWQgdG8gdXNlCisgICAgICAgICAgICAgICB0aGUgY29tbXV0YXRpb24gZXZlbnQpLgorCisgICAgICgjKSBBY3RpdmF0ZSB0aGUgVElNIHBlcmlwaGVyYWwgdXNpbmcgb25lIG9mIHRoZSBzdGFydCBmdW5jdGlvbnM6CisgICAgICAgICAgICgrKykgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSA6IEhBTF9USU1FeF9PQ05fU3RhcnQoKSwgSEFMX1RJTUV4X09DTl9TdGFydF9ETUEoKSwgSEFMX1RJTUV4X09DX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBDb21wbGVtZW50YXJ5IFBXTSBnZW5lcmF0aW9uIDogSEFMX1RJTUV4X1BXTU5fU3RhcnQoKSwgSEFMX1RJTUV4X1BXTU5fU3RhcnRfRE1BKCksIEhBTF9USU1FeF9QV01OX1N0YXJ0X0lUKCkKKyAgICAgICAgICAgKCsrKSBDb21wbGVtZW50YXJ5IE9uZS1wdWxzZSBtb2RlIG91dHB1dCA6IEhBTF9USU1FeF9PbmVQdWxzZU5fU3RhcnQoKSwgSEFMX1RJTUV4X09uZVB1bHNlTl9TdGFydF9JVCgpCisgICAgICAgICAgICgrKykgSGFsbCBTZW5zb3Igb3V0cHV0IDogSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoKSwgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnRfRE1BKCksIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0lUKCkuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXggVElNRXgKKyAgKiBAYnJpZWYgVElNIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9USU1fTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTUV4X1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNX0dFVF9PUl9NQVNLKF9fSU5TVEFOQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoX19JTlNUQU5DRV9fKSA9PSBUSU0xKSA/IChUSU0xX09SX0VUUl9BREMxX1JNUCB8IFRJTTFfT1JfVEkxX1JNUCkgOiAgICAgICAgICAgICAgIFwKKyAgICgoX19JTlNUQU5DRV9fKSA9PSBUSU0yKSA/IChUSU0yX09SX1RJNF9STVAgfCBUSU0yX09SX0VUUl9STVAgfCBUSU0yX09SX0lUUjFfUk1QKSA6IFwKKyAgICgoX19JTlNUQU5DRV9fKSA9PSBUSU0xNikgPyBUSU0xNl9PUl9USTFfUk1QIDogVElNMTdfT1JfVEkxX1JNUCkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgVElNX0NDeE5DaGFubmVsQ21kKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCBDaGFubmVsTlN0YXRlKTsKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgRXh0ZW5kZWQgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIFRJTSBIQUwgU2Vuc29yLgorICAgICgrKSBEZS1pbml0aWFsaXplIFRJTSBIQUwgU2Vuc29yLgorICAgICgrKSBTdGFydCB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlLgorICAgICgrKSBTdG9wIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UuCisgICAgKCspIFN0YXJ0IHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZW5hYmxlIERNQSB0cmFuc2ZlcnMuCisgICAgKCspIFN0b3AgdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHBhcmFtICBzQ29uZmlnIFRJTSBIYWxsIFNlbnNvciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX0hhbGxTZW5zb3JfSW5pdFR5cGVEZWYgKnNDb25maWcpCit7CisgIFRJTV9PQ19Jbml0VHlwZURlZiBPQ19Db25maWc7CisKKyAgLyogQ2hlY2sgdGhlIFRJTSBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRpbSA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQ09VTlRFUl9NT0RFKGh0aW0tPkluaXQuQ291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DTE9DS0RJVklTSU9OX0RJVihodGltLT5Jbml0LkNsb2NrRGl2aXNpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9BVVRPUkVMT0FEX1BSRUxPQUQoaHRpbS0+SW5pdC5BdXRvUmVsb2FkUHJlbG9hZCkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDMVBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMVByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsKKworICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodGltLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIFJlc2V0IGludGVycnVwdCBjYWxsYmFja3MgdG8gbGVnYWN5IHdlZWsgY2FsbGJhY2tzICovCisgICAgVElNX1Jlc2V0Q2FsbGJhY2soaHRpbSk7CisKKyAgICBpZiAoaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICBodGltLT5IYWxsU2Vuc29yX01zcEluaXRDYWxsYmFjayA9IEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQ7CisgICAgfQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgaHRpbS0+SGFsbFNlbnNvcl9Nc3BJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KKyAgICBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogU2V0IHRoZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogQ29uZmlndXJlIHRoZSBUaW1lIGJhc2UgaW4gdGhlIEVuY29kZXIgTW9kZSAqLworICBUSU1fQmFzZV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZodGltLT5Jbml0KTsKKworICAvKiBDb25maWd1cmUgdGhlIENoYW5uZWwgMSBhcyBJbnB1dCBDaGFubmVsIHRvIGludGVyZmFjZSB3aXRoIHRoZSB0aHJlZSBPdXRwdXRzIG9mIHRoZSAgSGFsbCBzZW5zb3IgKi8KKyAgVElNX1RJMV9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsIHNDb25maWctPklDMVBvbGFyaXR5LCBUSU1fSUNTRUxFQ1RJT05fVFJDLCBzQ29uZmlnLT5JQzFGaWx0ZXIpOworCisgIC8qIFJlc2V0IHRoZSBJQzFQU0MgQml0cyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9JQzFQU0M7CisgIC8qIFNldCB0aGUgSUMxUFNDIHZhbHVlICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ01SMSB8PSBzQ29uZmlnLT5JQzFQcmVzY2FsZXI7CisKKyAgLyogRW5hYmxlIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2UgKFhPUiBmdW5jdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzKSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfVEkxUzsKKworICAvKiBTZWxlY3QgdGhlIFRJTV9UU19USTFGX0VEIHNpZ25hbCBhcyBJbnB1dCB0cmlnZ2VyIGZvciB0aGUgVElNICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSICY9IH5USU1fU01DUl9UUzsKKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1RTX1RJMUZfRUQ7CisKKyAgLyogVXNlIHRoZSBUSU1fVFNfVEkxRl9FRCBzaWduYWwgdG8gcmVzZXQgdGhlIFRJTSBjb3VudGVyIGVhY2ggZWRnZSBkZXRlY3Rpb24gKi8KKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1NNUzsKKyAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgfD0gVElNX1NMQVZFTU9ERV9SRVNFVDsKKworICAvKiBQcm9ncmFtIGNoYW5uZWwgMiBpbiBQV00gMiBtb2RlIHdpdGggdGhlIGRlc2lyZWQgQ29tbXV0YXRpb25fRGVsYXkqLworICBPQ19Db25maWcuT0NGYXN0TW9kZSA9IFRJTV9PQ0ZBU1RfRElTQUJMRTsKKyAgT0NfQ29uZmlnLk9DSWRsZVN0YXRlID0gVElNX09DSURMRVNUQVRFX1JFU0VUOworICBPQ19Db25maWcuT0NNb2RlID0gVElNX09DTU9ERV9QV00yOworICBPQ19Db25maWcuT0NOSWRsZVN0YXRlID0gVElNX09DTklETEVTVEFURV9SRVNFVDsKKyAgT0NfQ29uZmlnLk9DTlBvbGFyaXR5ID0gVElNX09DTlBPTEFSSVRZX0hJR0g7CisgIE9DX0NvbmZpZy5PQ1BvbGFyaXR5ID0gVElNX09DUE9MQVJJVFlfSElHSDsKKyAgT0NfQ29uZmlnLlB1bHNlID0gc0NvbmZpZy0+Q29tbXV0YXRpb25fRGVsYXk7CisKKyAgVElNX09DMl9TZXRDb25maWcoaHRpbS0+SW5zdGFuY2UsICZPQ19Db25maWcpOworCisgIC8qIFNlbGVjdCBPQzJSRUYgYXMgdHJpZ2dlciBvdXRwdXQgb24gVFJHTzogd3JpdGUgdGhlIE1NUyBiaXRzIGluIHRoZSBUSU14X0NSMgorICAgIHJlZ2lzdGVyIHRvIDEwMSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyICY9IH5USU1fQ1IyX01NUzsKKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiB8PSBUSU1fVFJHT19PQzJSRUY7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVElNIHN0YXRlKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyB0aGUgVElNIEhhbGwgU2Vuc29yIGludGVyZmFjZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyNpZiAoVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIGlmIChodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBodGltLT5IYWxsU2Vuc29yX01zcERlSW5pdENhbGxiYWNrID0gSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh0aW0tPkhhbGxTZW5zb3JfTXNwRGVJbml0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0KGh0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUSU0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFU0VUOworCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVElNIEhhbGwgU2Vuc29yIE1TUC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9IYWxsU2Vuc29yX01zcEluaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfSGFsbFNlbnNvcl9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBUSU0gSGFsbCBTZW5zb3IgTVNQLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0hhbGxTZW5zb3JfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0hhbGxTZW5zb3JfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICAvKiBFbmFibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBIYWxsIHNlbnNvciBJbnRlcmZhY2UuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSwgMiBhbmQgMworICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9TdGFydF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBldmVudCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworCisgIC8qIEVuYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fSEFMTF9TRU5TT1JfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgSW5wdXQgQ2FwdHVyZSBjaGFubmVsIDEKKyAgICAoaW4gdGhlIEhhbGwgU2Vuc29yIEludGVyZmFjZSB0aGUgdGhyZWUgcG9zc2libGUgY2hhbm5lbHMgdGhhdCBjYW4gYmUgdXNlZCBhcmUgVElNX0NIQU5ORUxfMSwgVElNX0NIQU5ORUxfMiBhbmQgVElNX0NIQU5ORUxfMykgKi8KKyAgVElNX0NDeENoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIFRJTV9DSEFOTkVMXzEsIFRJTV9DQ3hfRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgZXZlbnQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGluIERNQSBtb2RlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gSGFsbCBTZW5zb3IgSW50ZXJmYWNlIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGEgVGhlIGRlc3RpbmF0aW9uIEJ1ZmZlciBhZGRyZXNzLgorICAqIEBwYXJhbSAgTGVuZ3RoIFRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIFRJTSBwZXJpcGhlcmFsIHRvIG1lbW9yeS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKCgodWludDMyX3QpcERhdGEgPT0gMFUpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKyAgLyogRW5hYmxlIHRoZSBJbnB1dCBDYXB0dXJlIGNoYW5uZWwgMQorICAgIChpbiB0aGUgSGFsbCBTZW5zb3IgSW50ZXJmYWNlIHRoZSB0aHJlZSBwb3NzaWJsZSBjaGFubmVscyB0aGF0IGNhbiBiZSB1c2VkIGFyZSBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0hBTk5FTF8yIGFuZCBUSU1fQ0hBTk5FTF8zKSAqLworICBUSU1fQ0N4Q2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgVElNX0NIQU5ORUxfMSwgVElNX0NDeF9FTkFCTEUpOworCisgIC8qIFNldCB0aGUgRE1BIElucHV0IENhcHR1cmUgMSBDYWxsYmFja3MgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BQ2FwdHVyZUNwbHQ7CisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFDYXB0dXJlSGFsZkNwbHQ7CisgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCBmb3IgQ2FwdHVyZSAxKi8KKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjEsICh1aW50MzJfdClwRGF0YSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIEVuYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIDEgSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MxKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIEludGVyZmFjZSBoYW5kbGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0hBTExfU0VOU09SX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworCisgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbCAxCisgICAgKGluIHRoZSBIYWxsIFNlbnNvciBJbnRlcmZhY2UgdGhlIHRocmVlIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEsIFRJTV9DSEFOTkVMXzIgYW5kIFRJTV9DSEFOTkVMXzMpICovCisgIFRJTV9DQ3hDaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBUSU1fQ0hBTk5FTF8xLCBUSU1fQ0N4X0RJU0FCTEUpOworCisKKyAgLyogRGlzYWJsZSB0aGUgY2FwdHVyZSBjb21wYXJlIEludGVycnVwdHMgMSBldmVudCAqLworICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworCisgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0pOworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT3V0cHV0IENvbXBhcmUvUFdNLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZS9QV00gYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlL1BXTSBhbmQgZGlzYWJsZSBETUEgdHJhbnNmZXJzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgICogICAgICAgICBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBPdXRwdXQgQ29tcGFyZSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5CisgICogICAgICAgICBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE91dHB1dCBDb21wYXJlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlCisgICogICAgICAgICBvbiB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBPQyBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZW5hYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKworICAvKiBFbmFibGUgdGhlIENhcHR1cmUgY29tcGFyZSBjaGFubmVsIE4gKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZQorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgQ2FwdHVyZSBjb21wYXJlIGNoYW5uZWwgTiAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKG9ubHkgaWYgbm8gbW9yZSBjaGFubmVsIGlzIGFjdGl2ZSkgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICBpZiAoKHRtcGNjZXIgJiAoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FKSkgPT0gKHVpbnQzMl90KVJFU0VUKQorICB7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZQorICAqICAgICAgICAgb24gdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT3V0cHV0IENvbXBhcmUgaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PQ05fU3RhcnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IExlbmd0aCkKK3sKKyAgdWludDMyX3QgdG1wc21jcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KKyAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICB7CisgICAgaWYgKCgodWludDMyX3QpcERhdGEgPT0gMFUpICYmIChMZW5ndGggPiAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICAqLworICB9CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IxLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjIsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMywgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBPdXRwdXQgQ29tcGFyZSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRU5BQkxFKTsKKworICAvKiBFbmFibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRU5BQkxFKGh0aW0pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCwgZXhjZXB0IGluIHRyaWdnZXIgbW9kZSB3aGVyZSBlbmFibGUgaXMgYXV0b21hdGljYWxseSBkb25lIHdpdGggdHJpZ2dlciAqLworICB0bXBzbWNyID0gaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJiBUSU1fU01DUl9TTVM7CisgIGlmICghSVNfVElNX1NMQVZFTU9ERV9UUklHR0VSX0VOQUJMRUQodG1wc21jcikpCisgIHsKKyAgICBfX0hBTF9USU1fRU5BQkxFKGh0aW0pOworICB9CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUSU0gT3V0cHV0IENvbXBhcmUgc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUKKyAgKiAgICAgICAgIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE91dHB1dCBDb21wYXJlIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT0NOX1N0b3BfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzE6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzI6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzIpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVElNIE91dHB1dCBDb21wYXJlIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRElTQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzMpOworICAgICAgKHZvaWQpSEFMX0RNQV9BYm9ydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MzXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBDYXB0dXJlIGNvbXBhcmUgY2hhbm5lbCBOICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBFeHRlbmRlZCBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IFBXTS4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgUFdNIGFuZCBlbmFibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBQV00gYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgSW5wdXQgQ2FwdHVyZSBtZWFzdXJlbWVudC4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4KKyAgICAoKykgU3RvcCB0aGUgQ29tcGxlbWVudGFyeSBJbnB1dCBDYXB0dXJlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisgICAgKCspIFN0YXJ0IHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGVuYWJsZSBETUEgdHJhbnNmZXJzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IElucHV0IENhcHR1cmUgYW5kIGRpc2FibGUgRE1BIHRyYW5zZmVycy4KKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGdlbmVyYXRpb24uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICB1aW50MzJfdCB0bXBzbWNyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIG9uIHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBkaXNhYmxlZAorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzE6IFRJTSBDaGFubmVsIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMjogVElNIENoYW5uZWwgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8zOiBUSU0gQ2hhbm5lbCAzIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IFBXTSBvdXRwdXQgICovCisgIFRJTV9DQ3hOQ2hhbm5lbENtZChodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCwgVElNX0NDeE5fRElTQUJMRSk7CisKKyAgLyogRGlzYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9ESVNBQkxFKGh0aW0pOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVElNX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgUFdNIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlIG9uIHRoZQorICAqICAgICAgICAgY29tcGxlbWVudGFyeSBvdXRwdXQuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAxIGludGVycnVwdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBUSU0gQnJlYWsgaW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsLCBUSU1fQ0N4Tl9FTkFCTEUpOworCisgIC8qIEVuYWJsZSB0aGUgTWFpbiBPdXRwdXQgKi8KKyAgX19IQUxfVElNX01PRV9FTkFCTEUoaHRpbSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsLCBleGNlcHQgaW4gdHJpZ2dlciBtb2RlIHdoZXJlIGVuYWJsZSBpcyBhdXRvbWF0aWNhbGx5IGRvbmUgd2l0aCB0cmlnZ2VyICovCisgIHRtcHNtY3IgPSBodGltLT5JbnN0YW5jZS0+U01DUiAmIFRJTV9TTUNSX1NNUzsKKyAgaWYgKCFJU19USU1fU0xBVkVNT0RFX1RSSUdHRVJfRU5BQkxFRCh0bXBzbWNyKSkKKyAgeworICAgIF9fSEFMX1RJTV9FTkFCTEUoaHRpbSk7CisgIH0KKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZSBvbiB0aGUKKyAgKiAgICAgICAgIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIHVpbnQzMl90IHRtcGNjZXI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBUSU1fQ0hBTk5FTF8xOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8zOgorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMyBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DQzMpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBCcmVhayBpbnRlcnJ1cHQgKG9ubHkgaWYgbm8gbW9yZSBjaGFubmVsIGlzIGFjdGl2ZSkgKi8KKyAgdG1wY2NlciA9IGh0aW0tPkluc3RhbmNlLT5DQ0VSOworICBpZiAoKHRtcGNjZXIgJiAoVElNX0NDRVJfQ0MxTkUgfCBUSU1fQ0NFUl9DQzJORSB8IFRJTV9DQ0VSX0NDM05FKSkgPT0gKHVpbnQzMl90KVJFU0VUKQorICB7CisgICAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0JSRUFLKTsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydHMgdGhlIFRJTSBQV00gc2lnbmFsIGdlbmVyYXRpb24gaW4gRE1BIG1vZGUgb24gdGhlCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IG91dHB1dAorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGVuYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEBwYXJhbSAgcERhdGEgVGhlIHNvdXJjZSBCdWZmZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBtZW1vcnkgdG8gVElNIHBlcmlwaGVyYWwKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9QV01OX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCit7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CisKKyAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisgIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgeworICAgIGlmICgoKHVpbnQzMl90KXBEYXRhID09IDBVKSAmJiAoTGVuZ3RoID4gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIERNQSBjb21wYXJlIGNhbGxiYWNrcyAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUNwbHQ7CisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MxXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1fRE1BRGVsYXlQdWxzZUhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+Q0NSMSwgTGVuZ3RoKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBETUEgcmVxdWVzdCAqLworICAgICAgX19IQUxfVElNX0VOQUJMRV9ETUEoaHRpbSwgVElNX0RNQV9DQzEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBUSU1fQ0hBTk5FTF8yOgorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgRE1BIGNvbXBhcmUgY2FsbGJhY2tzICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlQ3BsdDsKKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFRJTV9ETUFEZWxheVB1bHNlSGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSBjaGFubmVsICovCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ0MyXSwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5DQ1IyLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8qIEVuYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIERNQSByZXF1ZXN0ICovCisgICAgICBfX0hBTF9USU1fRU5BQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFRJTV9DSEFOTkVMXzM6CisgICAgeworICAgICAgLyogU2V0IHRoZSBETUEgY29tcGFyZSBjYWxsYmFja3MgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VDcGx0OworICAgICAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10tPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVElNX0RNQURlbGF5UHVsc2VIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkNDUjMsIExlbmd0aCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgLyogRW5hYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ0MzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgY29tcGxlbWVudGFyeSBQV00gb3V0cHV0ICAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwsIGV4Y2VwdCBpbiB0cmlnZ2VyIG1vZGUgd2hlcmUgZW5hYmxlIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aXRoIHRyaWdnZXIgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSICYgVElNX1NNQ1JfU01TOworICBpZiAoIUlTX1RJTV9TTEFWRU1PREVfVFJJR0dFUl9FTkFCTEVEKHRtcHNtY3IpKQorICB7CisgICAgX19IQUxfVElNX0VOQUJMRShodGltKTsKKyAgfQorCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wcyB0aGUgVElNIFBXTSBzaWduYWwgZ2VuZXJhdGlvbiBpbiBETUEgbW9kZSBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0CisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X1BXTU5fU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOworCisgIHN3aXRjaCAoQ2hhbm5lbCkKKyAgeworICAgIGNhc2UgVElNX0NIQU5ORUxfMToKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDEgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMSk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMjoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDIgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMik7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgVElNX0NIQU5ORUxfMzoKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ2FwdHVyZS9Db21wYXJlIDMgRE1BIHJlcXVlc3QgKi8KKyAgICAgIF9fSEFMX1RJTV9ESVNBQkxFX0RNQShodGltLCBUSU1fRE1BX0NDMyk7CisgICAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIGNvbXBsZW1lbnRhcnkgUFdNIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIENoYW5uZWwsIFRJTV9DQ3hOX0RJU0FCTEUpOworCisgIC8qIERpc2FibGUgdGhlIE1haW4gT3V0cHV0ICovCisgIF9fSEFMX1RJTV9NT0VfRElTQUJMRShodGltKTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1RJTV9ESVNBQkxFKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaHRpbSBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgIyMjIyMgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAoKykgU3RhcnQgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGdlbmVyYXRpb24uCisgICAgKCspIFN0b3AgdGhlIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlLgorICAgICgrKSBTdGFydCB0aGUgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLgorICAgICgrKSBTdG9wIHRoZSBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVElNIE9uZSBQdWxzZSBzaWduYWwgZ2VuZXJhdGlvbiBvbiB0aGUgY29tcGxlbWVudGFyeQorICAqICAgICAgICAgb3V0cHV0LgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gb24gdGhlIGNvbXBsZW1lbnRhcnkKKyAgKiAgICAgICAgIG91dHB1dC4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIE9uZSBQdWxzZSBoYW5kbGUKKyAgKiBAcGFyYW0gIE91dHB1dENoYW5uZWwgVElNIENoYW5uZWwgdG8gYmUgZGlzYWJsZWQKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9PbmVQdWxzZU5fU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCkKK3sKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RhcnRzIHRoZSBUSU0gT25lIFB1bHNlIHNpZ25hbCBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlIG9uIHRoZQorICAqICAgICAgICAgY29tcGxlbWVudGFyeSBjaGFubmVsLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gT25lIFB1bHNlIGhhbmRsZQorICAqIEBwYXJhbSAgT3V0cHV0Q2hhbm5lbCBUSU0gQ2hhbm5lbCB0byBiZSBlbmFibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWE5fSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwpKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MxKTsKKworICAvKiBFbmFibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0VOQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBFbmFibGUgdGhlIGNvbXBsZW1lbnRhcnkgT25lIFB1bHNlIG91dHB1dCAqLworICBUSU1fQ0N4TkNoYW5uZWxDbWQoaHRpbS0+SW5zdGFuY2UsIE91dHB1dENoYW5uZWwsIFRJTV9DQ3hOX0VOQUJMRSk7CisKKyAgLyogRW5hYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0VOQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcHMgdGhlIFRJTSBPbmUgUHVsc2Ugc2lnbmFsIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgb24gdGhlCisgICogICAgICAgICBjb21wbGVtZW50YXJ5IGNoYW5uZWwuCisgICogQHBhcmFtICBodGltIFRJTSBPbmUgUHVsc2UgaGFuZGxlCisgICogQHBhcmFtICBPdXRwdXRDaGFubmVsIFRJTSBDaGFubmVsIHRvIGJlIGRpc2FibGVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IE91dHB1dENoYW5uZWwpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYTl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgT3V0cHV0Q2hhbm5lbCkpOworCisgIC8qIERpc2FibGUgdGhlIFRJTSBDYXB0dXJlL0NvbXBhcmUgMSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfSVQoaHRpbSwgVElNX0lUX0NDMSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVElNIENhcHR1cmUvQ29tcGFyZSAyIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ0MyKTsKKworICAvKiBEaXNhYmxlIHRoZSBjb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBvdXRwdXQgKi8KKyAgVElNX0NDeE5DaGFubmVsQ21kKGh0aW0tPkluc3RhbmNlLCBPdXRwdXRDaGFubmVsLCBUSU1fQ0N4Tl9ESVNBQkxFKTsKKworICAvKiBEaXNhYmxlIHRoZSBNYWluIE91dHB1dCAqLworICBfX0hBTF9USU1fTU9FX0RJU0FCTEUoaHRpbSk7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9USU1fRElTQUJMRShodGltKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIGNhc2Ugb2YgdXNlIG9mIHRoZSBIYWxsIHNlbnNvciBpbnRlcmZhY2UuCisgICAgICAoKykgQ29uZmlndXJlIE91dHB1dCBjaGFubmVscyBmb3IgT0MgYW5kIFBXTSBtb2RlLgorCisgICAgICAoKykgQ29uZmlndXJlIENvbXBsZW1lbnRhcnkgY2hhbm5lbHMsIGJyZWFrIGZlYXR1cmVzIGFuZCBkZWFkIHRpbWUuCisgICAgICAoKykgQ29uZmlndXJlIE1hc3RlciBzeW5jaHJvbml6YXRpb24uCisgICAgICAoKykgQ29uZmlndXJlIHRpbWVyIHJlbWFwcGluZyBjYXBhYmlsaXRpZXMuCisgICAgICAoKykgRW5hYmxlIG9yIGRpc2FibGUgY2hhbm5lbCBncm91cGluZy4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZS4KKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikKKyAgKiAgICAgICAgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlCisgICogICAgICAgIGNvbW11dGF0aW9uIGF0IGl0cyBUUkdPIG91dHB1dCAoY29ubmVjdGVkIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZAorICAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9UUkdJOiBDb21tdXRhdGlvbiBzb3VyY2UgaXMgdGhlIFRSR0kgb2YgdGhlIEludGVyZmFjZSBUaW1lcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fU09GVFdBUkU6ICBDb21tdXRhdGlvbiBzb3VyY2UgaXMgc2V0IGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBDT01HIGJpdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oSW5wdXRUcmlnZ2VyKSk7CisKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpKQorICB7CisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gSW50ZXJydXB0ICovCisgIF9fSEFMX1RJTV9ESVNBQkxFX0lUKGh0aW0sIFRJTV9JVF9DT00pOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTSBjb21tdXRhdGlvbiBldmVudCBzZXF1ZW5jZSB3aXRoIGludGVycnVwdC4KKyAgKiBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBjb21tdXRhdGlvbiBldmVudCBpbiBvcmRlciB0bworICAqICAgICAgICB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYXQgZWFjaCBjb21tdXRhdGlvbiBkZXRlY3Rpb24gb24gdGhlIFRSR0kgaW5wdXQgb2YgdGhlIFRpbWVyLAorICAqICAgICAgICB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHdpdGggdGhlIHVzZSBvZiBhbm90aGVyIFRpbWVyKGludGVyZmFjZSBUaW1lcikKKyAgKiAgICAgICAgY29uZmlndXJlZCBpbiBIYWxsIHNlbnNvciBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIFRpbWVyIHdpbGwgZ2VuZXJhdGUgdGhlCisgICogICAgICAgIGNvbW11dGF0aW9uIGF0IGl0cyBUUkdPIG91dHB1dCAoY29ubmVjdGVkIHRvIFRpbWVyIHVzZWQgaW4gdGhpcyBmdW5jdGlvbikgZWFjaCB0aW1lCisgICogICAgICAgIHRoZSBUSTEgb2YgdGhlIEludGVyZmFjZSBUaW1lciBkZXRlY3QgYSBjb21tdXRhdGlvbiBhdCBpdHMgaW5wdXQgVEkxLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHBhcmFtICBJbnB1dFRyaWdnZXIgdGhlIEludGVybmFsIHRyaWdnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgVGltZXIgSW50ZXJmYWNpbmcgd2l0aCB0aGUgSGFsbCBzZW5zb3IKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMDogSW50ZXJuYWwgdHJpZ2dlciAwIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIxOiBJbnRlcm5hbCB0cmlnZ2VyIDEgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjI6IEludGVybmFsIHRyaWdnZXIgMiBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMzogSW50ZXJuYWwgdHJpZ2dlciAzIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19OT05FOiBObyB0cmlnZ2VyIGlzIG5lZWRlZAorICAqIEBwYXJhbSAgQ29tbXV0YXRpb25Tb3VyY2UgdGhlIENvbW11dGF0aW9uIEV2ZW50IHNvdXJjZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9UUkdJOiBDb21tdXRhdGlvbiBzb3VyY2UgaXMgdGhlIFRSR0kgb2YgdGhlIEludGVyZmFjZSBUaW1lcgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fU09GVFdBUkU6ICBDb21tdXRhdGlvbiBzb3VyY2UgaXMgc2V0IGJ5IHNvZnR3YXJlIHVzaW5nIHRoZSBDT01HIGJpdAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oSW5wdXRUcmlnZ2VyKSk7CisKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpKQorICB7CisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworCisgIC8qIERpc2FibGUgQ29tbXV0YXRpb24gRE1BIHJlcXVlc3QgKi8KKyAgX19IQUxfVElNX0RJU0FCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsKKworICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKGh0aW0sIFRJTV9JVF9DT00pOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNIGNvbW11dGF0aW9uIGV2ZW50IHNlcXVlbmNlIHdpdGggRE1BLgorICAqIEBub3RlICBUaGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB0byB1c2UgdGhlIGNvbW11dGF0aW9uIGV2ZW50IGluIG9yZGVyIHRvCisgICogICAgICAgIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhdCBlYWNoIGNvbW11dGF0aW9uIGRldGVjdGlvbiBvbiB0aGUgVFJHSSBpbnB1dCBvZiB0aGUgVGltZXIsCisgICogICAgICAgIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgd2l0aCB0aGUgdXNlIG9mIGFub3RoZXIgVGltZXIoaW50ZXJmYWNlIFRpbWVyKQorICAqICAgICAgICBjb25maWd1cmVkIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSwgdGhpcyBpbnRlcmZhY2UgVGltZXIgd2lsbCBnZW5lcmF0ZSB0aGUKKyAgKiAgICAgICAgY29tbXV0YXRpb24gYXQgaXRzIFRSR08gb3V0cHV0IChjb25uZWN0ZWQgdG8gVGltZXIgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uKSBlYWNoIHRpbWUKKyAgKiAgICAgICAgdGhlIFRJMSBvZiB0aGUgSW50ZXJmYWNlIFRpbWVyIGRldGVjdCBhIGNvbW11dGF0aW9uIGF0IGl0cyBpbnB1dCBUSTEuCisgICogQG5vdGUgIFRoZSB1c2VyIHNob3VsZCBjb25maWd1cmUgdGhlIERNQSBpbiBoaXMgb3duIHNvZnR3YXJlLCBpbiBUaGlzIGZ1bmN0aW9uIG9ubHkgdGhlIENPTURFIGJpdCBpcyBzZXQKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEBwYXJhbSAgSW5wdXRUcmlnZ2VyIHRoZSBJbnRlcm5hbCB0cmlnZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRpbWVyIEludGVyZmFjaW5nIHdpdGggdGhlIEhhbGwgc2Vuc29yCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjA6IEludGVybmFsIHRyaWdnZXIgMCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfSVRSMTogSW50ZXJuYWwgdHJpZ2dlciAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9UU19JVFIyOiBJbnRlcm5hbCB0cmlnZ2VyIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RTX0lUUjM6IEludGVybmFsIHRyaWdnZXIgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fVFNfTk9ORTogTm8gdHJpZ2dlciBpcyBuZWVkZWQKKyAgKiBAcGFyYW0gIENvbW11dGF0aW9uU291cmNlIHRoZSBDb21tdXRhdGlvbiBFdmVudCBzb3VyY2UKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ09NTVVUQVRJT05fVFJHSTogQ29tbXV0YXRpb24gc291cmNlIGlzIHRoZSBUUkdJIG9mIHRoZSBJbnRlcmZhY2UgVGltZXIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NPTU1VVEFUSU9OX1NPRlRXQVJFOiAgQ29tbXV0YXRpb24gc291cmNlIGlzIHNldCBieSBzb2Z0d2FyZSB1c2luZyB0aGUgQ09NRyBiaXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01NVVRBVElPTl9FVkVOVF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOVEVSTkFMX1RSSUdHRVJFVkVOVF9TRUxFQ1RJT04oSW5wdXRUcmlnZ2VyKSk7CisKKyAgX19IQUxfTE9DSyhodGltKTsKKworICBpZiAoKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMCkgfHwgKElucHV0VHJpZ2dlciA9PSBUSU1fVFNfSVRSMSkgfHwKKyAgICAgIChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjIpIHx8IChJbnB1dFRyaWdnZXIgPT0gVElNX1RTX0lUUjMpKQorICB7CisgICAgLyogU2VsZWN0IHRoZSBJbnB1dCB0cmlnZ2VyICovCisgICAgaHRpbS0+SW5zdGFuY2UtPlNNQ1IgJj0gflRJTV9TTUNSX1RTOworICAgIGh0aW0tPkluc3RhbmNlLT5TTUNSIHw9IElucHV0VHJpZ2dlcjsKKyAgfQorCisgIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIHByZWxvYWQgZmVhdHVyZSAqLworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IFRJTV9DUjJfQ0NQQzsKKyAgLyogU2VsZWN0IHRoZSBDb21tdXRhdGlvbiBldmVudCBzb3VyY2UgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiAmPSB+VElNX0NSMl9DQ1VTOworICBodGltLT5JbnN0YW5jZS0+Q1IyIHw9IENvbW11dGF0aW9uU291cmNlOworCisgIC8qIEVuYWJsZSB0aGUgQ29tbXV0YXRpb24gRE1BIFJlcXVlc3QgKi8KKyAgLyogU2V0IHRoZSBETUEgQ29tbXV0YXRpb24gQ2FsbGJhY2sgKi8KKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckNwbHRDYWxsYmFjayA9IFRJTUV4X0RNQUNvbW11dGF0aW9uQ3BsdDsKKyAgaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NPTU1VVEFUSU9OXS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBUSU1FeF9ETUFDb21tdXRhdGlvbkhhbGZDcGx0OworICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICBodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvcjsKKworICAvKiBEaXNhYmxlIENvbW11dGF0aW9uIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVChodGltLCBUSU1fSVRfQ09NKTsKKworICAvKiBFbmFibGUgdGhlIENvbW11dGF0aW9uIERNQSBSZXF1ZXN0ICovCisgIF9fSEFMX1RJTV9FTkFCTEVfRE1BKGh0aW0sIFRJTV9ETUFfQ09NKTsKKworICBfX0hBTF9VTkxPQ0soaHRpbSk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBUSU0gaW4gbWFzdGVyIG1vZGUuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBzTWFzdGVyQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRyaWdnZXIgb3V0cHV0IChUUkdPKSBhbmQgdGhlIE1hc3Rlci9TbGF2ZQorICAqICAgICAgICAgbW9kZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmICpzTWFzdGVyQ29uZmlnKQoreworICB1aW50MzJfdCB0bXBjcjI7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TWU5DSFJPX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fVFJHT19TT1VSQ0Uoc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX01TTV9TVEFURShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJTbGF2ZU1vZGUpKTsKKworICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIC8qIENoYW5nZSB0aGUgaGFuZGxlciBzdGF0ZSAqLworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IGh0aW0tPkluc3RhbmNlLT5DUjI7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IGh0aW0tPkluc3RhbmNlLT5TTUNSOworCisgIC8qIElmIHRoZSB0aW1lciBzdXBwb3J0cyBBREMgc3luY2hyb25pemF0aW9uIHRocm91Z2ggVFJHTzIsIHNldCB0aGUgbWFzdGVyIG1vZGUgc2VsZWN0aW9uIDIgKi8KKyAgaWYgKElTX1RJTV9UUkdPMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19USU1fVFJHTzJfU09VUkNFKHNNYXN0ZXJDb25maWctPk1hc3Rlck91dHB1dFRyaWdnZXIyKSk7CisKKyAgICAvKiBDbGVhciB0aGUgTU1TMiBiaXRzICovCisgICAgdG1wY3IyICY9IH5USU1fQ1IyX01NUzI7CisgICAgLyogU2VsZWN0IHRoZSBUUkdPMiBzb3VyY2UqLworICAgIHRtcGNyMiB8PSBzTWFzdGVyQ29uZmlnLT5NYXN0ZXJPdXRwdXRUcmlnZ2VyMjsKKyAgfQorCisgIC8qIFJlc2V0IHRoZSBNTVMgQml0cyAqLworICB0bXBjcjIgJj0gflRJTV9DUjJfTU1TOworICAvKiBTZWxlY3QgdGhlIFRSR08gc291cmNlICovCisgIHRtcGNyMiB8PSAgc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjsKKworICAvKiBSZXNldCB0aGUgTVNNIEJpdCAqLworICB0bXBzbWNyICY9IH5USU1fU01DUl9NU007CisgIC8qIFNldCBtYXN0ZXIgbW9kZSAqLworICB0bXBzbWNyIHw9IHNNYXN0ZXJDb25maWctPk1hc3RlclNsYXZlTW9kZTsKKworICAvKiBVcGRhdGUgVElNeCBDUjIgKi8KKyAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKKworICAvKiBVcGRhdGUgVElNeCBTTUNSICovCisgIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZXMgdGhlIEJyZWFrIGZlYXR1cmUsIGRlYWQgdGltZSwgTG9jayBsZXZlbCwgT1NTSS9PU1NSIFN0YXRlCisgICogICAgICAgICBhbmQgdGhlIEFPRShhdXRvbWF0aWMgb3V0cHV0IGVuYWJsZSkuCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIHNCcmVha0RlYWRUaW1lQ29uZmlnIHBvaW50ZXIgdG8gYSBUSU1fQ29uZmlnQnJlYWtEZWFkQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgY29udGFpbnMgdGhlIEJEVFIgUmVnaXN0ZXIgY29uZmlndXJhdGlvbiAgaW5mb3JtYXRpb24gZm9yIHRoZSBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdCcmVha0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0JyZWFrRGVhZFRpbWVDb25maWdUeXBlRGVmICpzQnJlYWtEZWFkVGltZUNvbmZpZykKK3sKKyAgLyogS2VlcCB0aGlzIHZhcmlhYmxlIGluaXRpYWxpemVkIHRvIDAgYXMgaXQgaXMgdXNlZCB0byBjb25maWd1cmUgQkRUUiByZWdpc3RlciAqLworICB1aW50MzJfdCB0bXBiZHRyID0gMFU7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU1JfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX09TU0lfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlSURMRU1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9MT0NLX0xFVkVMKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5Mb2NrTGV2ZWwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ERUFEVElNRShzQnJlYWtEZWFkVGltZUNvbmZpZy0+RGVhZFRpbWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9CUkVBS19TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX1BPTEFSSVRZKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfRklMVEVSKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVha0ZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoc0JyZWFrRGVhZFRpbWVDb25maWctPkF1dG9tYXRpY091dHB1dCkpOworCisgIC8qIENoZWNrIGlucHV0IHN0YXRlICovCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogU2V0IHRoZSBMb2NrIGxldmVsLCB0aGUgQnJlYWsgZW5hYmxlIEJpdCBhbmQgdGhlIFBvbGFyaXR5LCB0aGUgT1NTUiBTdGF0ZSwKKyAgICAgdGhlIE9TU0kgU3RhdGUsIHRoZSBkZWFkIHRpbWUgdmFsdWUgYW5kIHRoZSBBdXRvbWF0aWMgT3V0cHV0IEVuYWJsZSBCaXQgKi8KKworICAvKiBTZXQgdGhlIEJEVFIgYml0cyAqLworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0RURywgc0JyZWFrRGVhZFRpbWVDb25maWctPkRlYWRUaW1lKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9MT0NLLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+TG9ja0xldmVsKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9PU1NJLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+T2ZmU3RhdGVJRExFTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTUiwgc0JyZWFrRGVhZFRpbWVDb25maWctPk9mZlN0YXRlUnVuTW9kZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktFLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtQb2xhcml0eSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQU9FLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QXV0b21hdGljT3V0cHV0KTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0YsIChzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWtGaWx0ZXIgPDwgVElNX0JEVFJfQktGX1BvcykpOworCisgIGlmIChJU19USU1fQktJTjJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKQorICB7CisgICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLMl9TVEFURShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLMl9QT0xBUklUWShzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyUG9sYXJpdHkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0ZJTFRFUihzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyRmlsdGVyKSk7CisKKyAgICAvKiBTZXQgdGhlIEJSRUFLMiBpbnB1dCByZWxhdGVkIEJEVFIgYml0cyAqLworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyRiwgKHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJGaWx0ZXIgPDwgVElNX0JEVFJfQksyRl9Qb3MpKTsKKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkUsIHNCcmVha0RlYWRUaW1lQ29uZmlnLT5CcmVhazJTdGF0ZSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJQLCBzQnJlYWtEZWFkVGltZUNvbmZpZy0+QnJlYWsyUG9sYXJpdHkpOworICB9CisKKyAgLyogU2V0IFRJTXhfQkRUUiAqLworICBodGltLT5JbnN0YW5jZS0+QkRUUiA9IHRtcGJkdHI7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgYnJlYWsgaW5wdXQgc291cmNlLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQnJlYWtJbnB1dCBCcmVhayBpbnB1dCB0byBjb25maWd1cmUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQlJFQUtJTlBVVF9CUks6IFRpbWVyIGJyZWFrIGlucHV0CisgICogICAgICAgICAgICBAYXJnIFRJTV9CUkVBS0lOUFVUX0JSSzI6IFRpbWVyIGJyZWFrIDIgaW5wdXQKKyAgKiBAcGFyYW0gIHNCcmVha0lucHV0Q29uZmlnIEJyZWFrIGlucHV0IHNvdXJjZSBjb25maWd1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJyZWFrSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FeF9CcmVha0lucHV0Q29uZmlnVHlwZURlZiAqc0JyZWFrSW5wdXRDb25maWcpCisKK3sKKyAgdWludDMyX3QgdG1wb3J4OworICB1aW50MzJfdCBia2luX2VuYWJsZV9tYXNrID0gMFU7CisgIHVpbnQzMl90IGJraW5fcG9sYXJpdHlfbWFzayA9IDBVOworICB1aW50MzJfdCBia2luX2VuYWJsZV9iaXRwb3MgPSAwVTsKKyAgdWludDMyX3QgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSAwVTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0JSRUFLX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVChCcmVha0lucHV0KSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVFNPVVJDRShzQnJlYWtJbnB1dENvbmZpZy0+U291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9TVEFURShzQnJlYWtJbnB1dENvbmZpZy0+RW5hYmxlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtJTlBVVFNPVVJDRV9QT0xBUklUWShzQnJlYWtJbnB1dENvbmZpZy0+UG9sYXJpdHkpKTsKKworICAvKiBDaGVjayBpbnB1dCBzdGF0ZSAqLworICBfX0hBTF9MT0NLKGh0aW0pOworCisgIHN3aXRjaCAoc0JyZWFrSW5wdXRDb25maWctPlNvdXJjZSkKKyAgeworICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQktJTjoKKyAgICB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktJTkU7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSBUSU0xX0FGMV9CS0lOUDsKKyAgICAgIGJraW5fcG9sYXJpdHlfYml0cG9zID0gVElNMV9BRjFfQktJTlBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDE6CisgICAgeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QMUU7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDFFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QMVA7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QMVBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0JSRUFLSU5QVVRTT1VSQ0VfQ09NUDI6CisgICAgeworICAgICAgYmtpbl9lbmFibGVfbWFzayA9IFRJTTFfQUYxX0JLQ01QMkU7CisgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSBUSU0xX0FGMV9CS0NNUDJFX1BvczsKKyAgICAgIGJraW5fcG9sYXJpdHlfbWFzayA9IFRJTTFfQUYxX0JLQ01QMlA7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IFRJTTFfQUYxX0JLQ01QMlBfUG9zOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChCcmVha0lucHV0KQorICB7CisgICAgY2FzZSBUSU1fQlJFQUtJTlBVVF9CUks6CisgICAgeworICAgICAgLyogR2V0IHRoZSBUSU14X0FGMSByZWdpc3RlciB2YWx1ZSAqLworICAgICAgdG1wb3J4ID0gaHRpbS0+SW5zdGFuY2UtPkFGMTsKKworICAgICAgLyogRW5hYmxlIHRoZSBicmVhayBpbnB1dCAqLworICAgICAgdG1wb3J4ICY9IH5ia2luX2VuYWJsZV9tYXNrOworICAgICAgdG1wb3J4IHw9IChzQnJlYWtJbnB1dENvbmZpZy0+RW5hYmxlIDw8IGJraW5fZW5hYmxlX2JpdHBvcykgJiBia2luX2VuYWJsZV9tYXNrOworCisgICAgICAvKiBTZXQgdGhlIGJyZWFrIGlucHV0IHBvbGFyaXR5ICovCisgICAgICB0bXBvcnggJj0gfmJraW5fcG9sYXJpdHlfbWFzazsKKyAgICAgIHRtcG9yeCB8PSAoc0JyZWFrSW5wdXRDb25maWctPlBvbGFyaXR5IDw8IGJraW5fcG9sYXJpdHlfYml0cG9zKSAmIGJraW5fcG9sYXJpdHlfbWFzazsKKworICAgICAgLyogU2V0IFRJTXhfQUYxICovCisgICAgICBodGltLT5JbnN0YW5jZS0+QUYxID0gdG1wb3J4OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVElNX0JSRUFLSU5QVVRfQlJLMjoKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIFRJTXhfQUYyIHJlZ2lzdGVyIHZhbHVlICovCisgICAgICB0bXBvcnggPSBodGltLT5JbnN0YW5jZS0+QUYyOworCisgICAgICAvKiBFbmFibGUgdGhlIGJyZWFrIGlucHV0ICovCisgICAgICB0bXBvcnggJj0gfmJraW5fZW5hYmxlX21hc2s7CisgICAgICB0bXBvcnggfD0gKHNCcmVha0lucHV0Q29uZmlnLT5FbmFibGUgPDwgYmtpbl9lbmFibGVfYml0cG9zKSAmIGJraW5fZW5hYmxlX21hc2s7CisKKyAgICAgIC8qIFNldCB0aGUgYnJlYWsgaW5wdXQgcG9sYXJpdHkgKi8KKyAgICAgIHRtcG9yeCAmPSB+Ymtpbl9wb2xhcml0eV9tYXNrOworICAgICAgdG1wb3J4IHw9IChzQnJlYWtJbnB1dENvbmZpZy0+UG9sYXJpdHkgPDwgYmtpbl9wb2xhcml0eV9iaXRwb3MpICYgYmtpbl9wb2xhcml0eV9tYXNrOworCisgICAgICAvKiBTZXQgVElNeF9BRjIgKi8KKyAgICAgIGh0aW0tPkluc3RhbmNlLT5BRjIgPSB0bXBvcng7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgVElNeCBSZW1hcHBpbmcgaW5wdXQgY2FwYWJpbGl0aWVzLgorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgUmVtYXAgc3BlY2lmaWVzIHRoZSBUSU0gcmVtYXBwaW5nIHNvdXJjZS4KKyAgKiAgICAgRm9yIFRJTTEsIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb21iaW5hdGlvbiBvZiAyIGZpZWxkcyAoZmllbGQxIHwgZmllbGQyKToKKyAgKgorICAqICAgICAgIGZpZWxkMSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfR1BJTzogICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBJL08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMTogICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDEKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMjogICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDIKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0FEQzFfQVdEMzogICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBBREMxIEFXRDMKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTFfRVRSX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTFfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICBmaWVsZDIgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMV9HUElPOiAgICAgICAgICAgICAgICBUSU0xIFRJMSBpcyBjb25uZWN0ZWQgdG8gSS9PCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xX1RJMV9DT01QMTogICAgICAgICAgICAgICBUSU0xIFRJMSBpcyBjb25uZWN0ZWQgdG8gQ09NUDEgb3V0cHV0CisgICoKKyAgKiAgICAgICAgRm9yIFRJTTIsIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb21iaW5hdGlvbiBvZiAzIGZpZWxkcyAoZmllbGQxIHwgZmllbGQyIHwgZmllbGQzKToKKyAgKgorICAqICAgICAgIGZpZWxkMSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfSVRSMV9OT05FOiAgICAgICAgICAgICAgIE5vIGludGVybmFsIHRyaWdnZXIgb24gVElNMl9JVFIxCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0yX0lUUjFfVVNCOiAgICAgICAgICAgICAgICBUSU0yX0lUUjEgaXMgY29ubmVjdGVkIHRvIFVTQiBTT0YKKyAgKgorICAqICAgICAgIGZpZWxkMiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0dQSU86ICAgICAgICAgICAgICAgIFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBJL08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0xTRTogICAgICAgICAgICAgICAgIFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAxOiAgICAgICAgICAgICAgIFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfRVRSX0NPTVAyOiAgICAgICAgICAgICAgIFRJTTJfRVRSIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKgorICAqICAgICAgIGZpZWxkMyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0dQSU86ICAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0byBJL08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0NPTVAxOiAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0NPTVAyOiAgICAgICAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTJfVEk0X0NPTVAxX0NPTVAyOiAgICAgICAgIFRJTTIgVEk0IGlzIGNvbm5lY3RlZCB0byBsb2dpY2FsIE9SIGJldHdlZW4gQ09NUDEgYW5kIENPTVAyIG91dHB1dAorICAqCisgICogICAgIEZvciBUSU0xNiwgdGhlIHBhcmFtZXRlciBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9HUElPOiAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBJL08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9MU0k6ICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBMU0kKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9MU0U6ICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBMU0UKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE2X1RJMV9SVEM6ICAgICAgICAgICAgICAgVElNMTYgVEkxIGlzIGNvbm5lY3RlZCB0byBSVEMgd2FrZXVwIGludGVycnVwdAorICAqCisgICogICAgIEZvciBUSU0xNywgdGhlIHBhcmFtZXRlciBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE3X1RJMV9HUElPOiAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0byBJL08KKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE3X1RJMV9NU0k6ICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0byBNU0kgIChjb250cmFpbnRzOiBNU0kgY2xvY2sgPCAxLzQgVElNIEFQQiBjbG9jaykKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX1RJTTE3X1RJMV9IU0U6ICAgICAgICAgICAgICAgVElNMTcgVEkxIGlzIGNvbm5lY3RlZCB0byBIU0UgZGl2IDMyCisgICogICAgICAgICAgICBAYXJnIFRJTV9USU0xN19USTFfTUNPOiAgICAgICAgICAgICAgIFRJTTE3IFRJMSBpcyBjb25uZWN0ZWQgdG8gTUNPCisgICoKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9SZW1hcENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgUmVtYXApCit7CisgIHVpbnQzMl90IHRtcG9yOworICB1aW50MzJfdCB0bXBhZjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX1JFTUFQKGh0aW0tPkluc3RhbmNlLCBSZW1hcCkpOworCisgIF9fSEFMX0xPQ0soaHRpbSk7CisKKyAgLyogUmVhZCBUSU14X09SICovCisgIHRtcG9yID0gUkVBRF9SRUcoaHRpbS0+SW5zdGFuY2UtPk9SKTsKKworICAvKiBSZWFkIFRJTXhfQUYxICovCisgIHRtcGFmMSA9IFJFQURfUkVHKGh0aW0tPkluc3RhbmNlLT5BRjEpOworCisgIC8qIFNldCBFVFJfU0VMIGJpdCBmaWVsZCAoaWYgcmVxdWlyZWQpICovCisgIGlmIChJU19USU1fRVRSU0VMX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSkKKyAgeworICAgIGlmICgoUmVtYXAgJiBUSU0xX0FGMV9FVFJTRUwpICE9ICh1aW50MzJfdClSRVNFVCkKKyAgICB7CisgICAgICAvKiBDT01QMSBvdXRwdXQgb3IgQ09NUDIgb3V0cHV0IGNvbm5lY3RlZCB0byBFVFIgaW5wdXQgKi8KKyAgICAgIE1PRElGWV9SRUcodG1wYWYxLCBUSU0xX0FGMV9FVFJTRUwsIChSZW1hcCAmIFRJTTFfQUYxX0VUUlNFTCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRVRSIGxlZ2FjeSBtb2RlICovCisgICAgICBNT0RJRllfUkVHKHRtcGFmMSwgVElNMV9BRjFfRVRSU0VMLCAwVSk7CisgICAgfQorCisgICAgLyogU2V0IFRJTXhfQUYxICovCisgICAgV1JJVEVfUkVHKGh0aW0tPkluc3RhbmNlLT5BRjEsIHRtcGFmMSk7CisgIH0KKworICAvKiBTZXQgb3RoZXIgcmVtYXBwaW5nIGNhcGFiaWxpdGllcyAqLworICBNT0RJRllfUkVHKHRtcG9yLCBUSU1fR0VUX09SX01BU0soaHRpbS0+SW5zdGFuY2UpLCAoUmVtYXAgJiAoflRJTTFfQUYxX0VUUlNFTCkpKTsKKworICAvKiBTZXQgVElNeF9PUiAqLworICBXUklURV9SRUcoaHRpbS0+SW5zdGFuY2UtPk9SLCB0bXBvcik7CisKKyAgX19IQUxfVU5MT0NLKGh0aW0pOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR3JvdXAgY2hhbm5lbCA1IGFuZCBjaGFubmVsIDEsIDIgb3IgMworICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgQ2hhbm5lbHMgc3BlY2lmaWVzIHRoZSByZWZlcmVuY2Ugc2lnbmFsKHMpIHRoZSBPQzVSRUYgaXMgY29tYmluZWQgd2l0aC4KKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUSU1fR1JPVVBDSDVfTk9ORTogTm8gZWZmZWN0IG9mIE9DNVJFRiBvbiBPQzFSRUZDLCBPQzJSRUZDIGFuZCBPQzNSRUZDCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MxUkVGQzogT0MxUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MxUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MyUkVGQzogT0MyUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MyUkVGQyBhbmQgT0M1UkVGCisgICogICAgICAgICBUSU1fR1JPVVBDSDVfT0MzUkVGQzogT0MzUkVGQyBpcyB0aGUgbG9naWNhbCBBTkQgb2YgT0MzUkVGQyBhbmQgT0M1UkVGCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfR3JvdXBDaGFubmVsNShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbHMpCit7CisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DT01CSU5FRDNQSEFTRVBXTV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0dST1VQQ0g1KENoYW5uZWxzKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodGltKTsKKworICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfQlVTWTsKKworICAvKiBDbGVhciBHQzVDeCBiaXQgZmllbGRzICovCisgIGh0aW0tPkluc3RhbmNlLT5DQ1I1ICY9IH4oVElNX0NDUjVfR0M1QzMgfCBUSU1fQ0NSNV9HQzVDMiB8IFRJTV9DQ1I1X0dDNUMxKTsKKworICAvKiBTZXQgR0M1Q3ggYml0IGZpZWxkcyAqLworICBodGltLT5JbnN0YW5jZS0+Q0NSNSB8PSBDaGFubmVsczsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisgIF9fSEFMX1VOTE9DSyhodGltKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBDYWxsYmFja3MgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQ2FsbGJhY2tzIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBFeHRlbmRlZCBUSU0gY2FsbGJhY2sgZnVuY3Rpb25zOgorICAgICgrKSBUaW1lciBDb21tdXRhdGlvbiBjYWxsYmFjaworICAgICgrKSBUaW1lciBCcmVhayBjYWxsYmFjaworCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgY29tbXV0YXRpb24gY2hhbmdlZCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZQorICAqIEBwYXJhbSAgaHRpbSBUSU0gaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfQ29tbXV0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKy8qKgorICAqIEBicmllZiAgSGFsbCBjb21tdXRhdGlvbiBjaGFuZ2VkIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RJTUV4X0NvbW11dEhhbGZDcGx0Q2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0aW0pOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbGwgQnJlYWsgZGV0ZWN0aW9uIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlCisgICogQHBhcmFtICBodGltIFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVha0NhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodGltKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RJTUV4X0JyZWFrQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBIYWxsIEJyZWFrMiBkZXRlY3Rpb24gY2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAgKiBAcGFyYW0gIGh0aW06IFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRpbSk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9USU1FeF9CcmVhazJDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBUSU0gSGFsbCBTZW5zb3IgaW50ZXJmYWNlIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0aW0gVElNIEhhbGwgU2Vuc29yIGhhbmRsZQorICAqIEByZXR2YWwgSEFMIHN0YXRlCisgICovCitIQUxfVElNX1N0YXRlVHlwZURlZiBIQUxfVElNRXhfSGFsbFNlbnNvcl9HZXRTdGF0ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSkKK3sKKyAgcmV0dXJuIGh0aW0tPlN0YXRlOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU1FeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVElNIERNQSBDb21tdXRhdGlvbiBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgcG9pbnRlciB0byBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFRJTV9IYW5kbGVUeXBlRGVmICpodGltID0gKFRJTV9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogQ2hhbmdlIHRoZSBodGltIHN0YXRlICovCisgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaHRpbS0+Q29tbXV0YXRpb25DYWxsYmFjayhodGltKTsKKyNlbHNlCisgIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBUSU0gRE1BIENvbW11dGF0aW9uIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNRXhfRE1BQ29tbXV0YXRpb25IYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0gPSAoVElNX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KKyAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBodGltLT5Db21tdXRhdGlvbkhhbGZDcGx0Q2FsbGJhY2soaHRpbSk7CisjZWxzZQorICBIQUxfVElNRXhfQ29tbXV0SGFsZkNwbHRDYWxsYmFjayhodGltKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgQ2hhbm5lbCB4Ti4KKyAgKiBAcGFyYW0gIFRJTXggdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbAorICAqIEBwYXJhbSAgQ2hhbm5lbCBzcGVjaWZpZXMgdGhlIFRJTSBDaGFubmVsCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMQorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMKKyAgKiBAcGFyYW0gIENoYW5uZWxOU3RhdGUgc3BlY2lmaWVzIHRoZSBUSU0gQ2hhbm5lbCBDQ3hORSBiaXQgbmV3IHN0YXRlLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogVElNX0NDeE5fRU5BQkxFIG9yIFRJTV9DQ3hOX0Rpc2FibGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBUSU1fQ0N4TkNoYW5uZWxDbWQoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90IENoYW5uZWxOU3RhdGUpCit7CisgIHVpbnQzMl90IHRtcDsKKworICB0bXAgPSBUSU1fQ0NFUl9DQzFORSA8PCAoQ2hhbm5lbCAmIDB4MUZVKTsgLyogMHgxRlUgPSAzMSBiaXRzIG1heCBzaGlmdCAqLworCisgIC8qIFJlc2V0IHRoZSBDQ3hORSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSAgfnRtcDsKKworICAvKiBTZXQgb3IgcmVzZXQgdGhlIENDeE5FIEJpdCAqLworICBUSU14LT5DQ0VSIHw9ICh1aW50MzJfdCkoQ2hhbm5lbE5TdGF0ZSA8PCAoQ2hhbm5lbCAmIDB4MUZVKSk7IC8qIDB4MUZVID0gMzEgYml0cyBtYXggc2hpZnQgKi8KK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVElNX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm1fdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWExNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKKyAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcworICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zIAorICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMAorICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UgIAorIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgorICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyd2J4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtLmMnCisgICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKKyAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMndieHhfaGFsX2NvbmYuaCAKKworICAgIFsuLl0KKyAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgorICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlCisgICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuCisgICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAorICAgIChAKSBUaGUgc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCisgICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2RlcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfaGFsLmgiCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKKyAgKiBAeworICAqLyAKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAorICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgorICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCisgICovCisjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisvKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCisKKyNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQorICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDk5VQorICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDlVCisgICNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV8xTUhaICAgKCh1aW50MzJfdCkoKHVpbnQzMl90KVJDQ19CRENSX1JUQ1NFTCB8ICh1aW50MzJfdCkoKEhTRV9WQUxVRS8xMDAwMDAwVSkgPDwgMTZVKSkpCisjZWxzZSAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSB8fCBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLworICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCisgICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVCisjZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KKworLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gUlRDX0hhbmRsZVR5cGVEZWYgaFJUQ19IYW5kbGU7CitSVENfSGFuZGxlVHlwZURlZiBoUlRDX0hhbmRsZTsKKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUlRDX0FsYXJtX0lSUUhhbmRsZXIodm9pZCk7CisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX0FMQVJNQSBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAorICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAorICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuIAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCisgICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgorICAqIEBwYXJhbSAgVGlja1ByaW9yaXR5OiBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKKworICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0OworICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CisKKyNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQorICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOworICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CisjZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKKyAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KKyAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJMTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKKyNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQorICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CisgIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOworICAvKiBFbnN1cmUgdGhhdCBSVEMgaXMgY2xvY2tlZCBieSAxTUh6ICovCisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFo7CisjZWxzZQorI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKKyNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLworCisgIGlmKEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCkgPT0gSEFMX09LKQorICB7CisgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOworICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCisgICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOworICAgICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCisgICAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSyAKKyAgICAgICAgIEhTRSBhcyBSVEMgY2xvY2sgCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoOTkgKyAxKSAqICg5ICsgMSkpIC8gMU1IegorICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgICAgICAgIExTRSBhcyBSVEMgY2xvY2sgCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S0h6CisgICAgICAgICAgICAgICAgICAgICA9IH4xbXMKKyAgICAgICAgIExTSSBhcyBSVEMgY2xvY2sgCisgICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzJLSHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAqLworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UgPSBSVEM7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0LkhvdXJGb3JtYXQgPSBSVENfSE9VUkZPUk1BVF8yNDsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0LlN5bmNoUHJlZGl2ID0gUlRDX1NZTkNIX1BSRURJVjsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0ID0gUlRDX09VVFBVVF9ESVNBQkxFOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0VHlwZSA9IFJUQ19PVVRQVVRfVFlQRV9PUEVORFJBSU47CisgICAgICBpZiAoSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgQWxhcm0gQSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBDbGVhciBmbGFnIGFsYXJtIEEgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpOworCisgICAgICBjb3VudGVyID0gMFU7CisgICAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQorICAgICAgeworICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCkweDAxVTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCisgICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CisKKyAgICAgIC8qIFJUQyBBbGFybSBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCisgICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKKyAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KKyAgICAgIGlmKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOworICAgICAgICBjb3VudGVyID0gMFU7CisgICAgICAgIHdoaWxlKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQorICAgICAgICB7CisgICAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5EUiA9IDBVOworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPlRSID0gMFU7CisKKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKKworICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19BbGFybV9JUlFuKTsKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKK3sKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKKyAgLyogRGlzYWJsZSBSVEMgQUxBUk0gdXBkYXRlIEludGVycnVwdCAqLworICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgorICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworICAvKiBFbmFibGUgUlRDIEFMQVJNIFVwZGF0ZSBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKKyAgKiBSVENfQUxBUk1fSVJRSGFuZGxlcigpLiBJdCBtYWtlcyBhIGRpcmVjdCBjYWxsIHRvIEhBTF9JbmNUaWNrKCkgdG8gaW5jcmVtZW50CisgICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCisgICogQHBhcmFtICBocnRjIDogUlRDIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOworCisgIEhBTF9JbmNUaWNrKCk7CisKKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOworCisgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBocnRjLT5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KVJUQ19JTklUX01BU0s7CisKKyAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpCisgIHsKKyAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBocnRjLT5JbnN0YW5jZS0+RFIgPSAwVTsKKyAgaHJ0Yy0+SW5zdGFuY2UtPlRSID0gMFU7CisKKyAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFJUQyBBTEFSTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUlRDX0FsYXJtX0lSUUhhbmRsZXIodm9pZCkKK3sKKyAgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoJmhSVENfSGFuZGxlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYyBiL1NyYy9zdG0zMndieHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FhNTYwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfdGltZWJhc2VfcnRjX3dha2V1cF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjc5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwX3RlbXBsYXRlLmMgCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBSVENfV0FLRVVQIFRlbXBsYXRlLgorICAqICAgIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZXMgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQorICAqICAgICAgICAgIHRvIHVzZSB0aGUgUlRDIFdBS0VVUCBmb3IgdGhlIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgorICAqICAgICAgICAgICArIEludGlhbGl6ZXMgdGhlIFJUQyBwZXJpcGhlcmFsIGFuZCBjb25maWd1cmVzIHRoZSB3YWtldXAgdGltZXIgdG8gYmUKKyAgKiAgICAgICAgICAgICBpbmNyZW1lbnRlZCBlYWNoIDFtcworICAqICAgICAgICAgICArIFRoZSB3YWtldXAgZmVhdHVyZSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgZWFjaCAxbXMgCisgICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGluc2lkZSB0aGUgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjaworICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UKKyBAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIGZpbGUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgbW9kaWZpZWQgYXMgZm9sbG93czoKKyAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMndieHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXAuYycKKyAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudAorICAgICAgIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgZGVmaW5lIGluIHN0bTMyd2J4eF9oYWxfY29uZi5oIAorCisgICAgWy4uXQorICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6CisgICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKKyAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4KKyAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQgCisgICAgKEApIFRoZSBzdG0zMndieHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKKyAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfSEFMX0RyaXZlcgorICAqIEB7CisgICovCisKKy8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19XYWtlVXBfVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgV2FrZVVwIFRlbXBsYXRlCisgICogQHsKKyAgKi8gCisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOiAKKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0hTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIHRpbWluZyBwcmVjaXNpb24uCisgICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KKyAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTSTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgorICAqLworI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0hTRQorLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLworLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLworCisjaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9IU0UKKyAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA5OVUKKyAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICA5VQorICAjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfMU1IWiAgICgodWludDMyX3QpKCh1aW50MzJfdClSQ0NfQkRDUl9SVENTRUwgfCAodWludDMyX3QpKChIU0VfVkFMVUUvMTAwMDAwMFUpIDw8IDE2VSkpKQorI2Vsc2UgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgfHwgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KKyAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICAwVQorICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDMxVQorI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCisKKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIFJUQ19IYW5kbGVUeXBlRGVmIGhSVENfSGFuZGxlOworUlRDX0hhbmRsZVR5cGVEZWYgICAgICAgIGhSVENfSGFuZGxlOworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBSVENfV0tVUF9JUlFIYW5kbGVyKHZvaWQpOworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX1dLVVAgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiAKKyAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZCAKKyAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKKyAgKiAgICAgICAgIFdha2V1cCBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxbXMKKyAgKiAgICAgICAgIFdha2V1cCBUaW1lID0gV2FrZXVwVGltZWJhc2UgKiBXYWtlVXBDb3VudGVyICgwICsgMSkgCisgICAgICAgICAgICAgICAgICAgICAgICA9IDEgbXMKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgorICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4gCisgICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrICh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCit7CisgIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOworCisgIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CisgIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgUGVyaXBoQ2xrSW5pdFN0cnVjdDsKKworI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFCisgIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CisgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTRTsKKyNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQorICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLworICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kxOworICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CisgIFJDQ19Pc2NJbml0U3RydWN0LkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOworI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCisgIC8qIENvbmZpZ3VlIEhTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCisgIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKKyAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOworICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047CisgIC8qIEVuc3VyZSB0aGF0IFJUQyBpcyBjbG9ja2VkIGJ5IDFNSHogKi8KKyAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfMU1IWjsKKyNlbHNlCisjZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQorI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCisKKyAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spCisgIHsgCisgICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOworICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCisgICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOworICAgICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zIAorICAgICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDEpICogKFJUQ19TWU5DSF9QUkVESVYgKyAxKSkgLyBSVENfQ0xPQ0sgCisgICAgICAgICBIU0UgYXMgUlRDIGNsb2NrIAorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDk5ICsgMSkgKiAoOSArIDEpKSAvIDFNaHoKKyAgICAgICAgICAgICAgICAgICAgID0gMW1zCisgICAgICAgICBMU0UgYXMgUlRDIGNsb2NrIAorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyLjc2OEtoegorICAgICAgICAgICAgICAgICAgICAgPSB+MW1zCisgICAgICAgICBMU0kgYXMgUlRDIGNsb2NrIAorICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyS2h6CisgICAgICAgICAgICAgICAgICAgICA9IDFtcworICAgICAgKi8KKyAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0LkFzeW5jaFByZWRpdiA9IFJUQ19BU1lOQ0hfUFJFRElWOworICAgICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKKyAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0UG9sYXJpdHkgPSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0g7CisgICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOworICAgICAgaWYgKEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIC8qIERpc2FibGUgdGhlIFdha2UtdXAgVGltZXIgKi8KKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSxSVENfSVRfV1VUKTsKKworICAgICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCAgKi8KKyAgICAgIHdoaWxlKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX1dVVFdGKSA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBDbGVhciBQV1Igd2FrZSB1cCBGbGFnICovCisgICAgICBfX0hBTF9QV1JfQ0xFQVJfRkxBRyhQV1JfRkxBR19XVSk7CisKKyAgICAgIC8qIENsZWFyIFJUQyBXYWtlIFVwIHRpbWVyIEZsYWcgKi8KKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VURik7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgV2FrZS11cCBUaW1lciBjb3VudGVyICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+V1VUUiA9IDBVOworCisgICAgICAvKiBDbGVhciB0aGUgV2FrZS11cCBUaW1lciBjbG9jayBzb3VyY2UgYml0cyBpbiBDUiByZWdpc3RlciAqLworICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCl+UlRDX0NSX1dVQ0tTRUw7CisKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlICovCisgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE2QklUUzsKKworICAgICAgLyogUlRDIFdha2VVcFRpbWVyIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOworCisgICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKKworICAgICAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsUlRDX0lUX1dVVCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLworICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworCisgICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7CisKKyAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFJUQ19XS1VQX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOworICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19XS1VQX0lSUW4pOyAKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQorICB9CisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVENfV0tVUCBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworICAvKiBEaXNhYmxlIFdBS0UgVVAgVElNRVIgSW50ZXJydXB0ICovCisgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX1dVVCk7CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgRW5hYmxpbmcgUlRDX1dLVVAgaW50ZXJydXB0LgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOworICAvKiBFbmFibGUgIFdBS0UgVVAgVElNRVIgIGludGVycnVwdCAqLworICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX1dVVCk7CisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdha2UgVXAgVGltZXIgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB3aGVuIFJUQ19XS1VQIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKKyAgKiBSVENfV0tVUF9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKKyAgKiBhIGdsb2JhbCB2YXJpYWJsZSAidXdUaWNrIiB1c2VkIGFzIGFwcGxpY2F0aW9uIHRpbWUgYmFzZS4KKyAgKiBAcGFyYW0gIGhydGMgOiBSVEMgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9SVENFeF9XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCit7CisgIEhBTF9JbmNUaWNrKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzICBXQUtFIFVQIFRJTUVSICBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgUlRDX1dLVVBfSVJRSGFuZGxlcih2b2lkKQoreworICBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYyBiL1NyYy9zdG0zMndieHhfaGFsX3RpbWViYXNlX3RpbV90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV90aW1fdGVtcGxhdGUuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfdGltZWJhc2VfdGltX3RlbXBsYXRlLmMgCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBUSU0gVGVtcGxhdGUuCisgICogICAgCisgICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlcyB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCisgICogICAgICAgICAgdGhlIFRJTSB0aW1lIGJhc2U6CisgICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgVElNIHBlcmlwaGVyYWwgZ2VuZXJhdGUgYSBQZXJpb2QgZWxhcHNlZCBFdmVudCBlYWNoIDFtcworICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBpbnNpZGUgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2sgaWUgZWFjaCAxbXMKKyAgKiAKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSEFMX1RpbWVCYXNlX1RJTQorICAqIEB7CisgICovIAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIFRJTV9IYW5kbGVUeXBlRGVmIFRpbUhhbmRsZTsKK1RJTV9IYW5kbGVUeXBlRGVmICAgICAgICBUaW1IYW5kbGU7CisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBUSU0yX0lSUUhhbmRsZXIodm9pZCk7CisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgVElNMiBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAorICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCisgICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKKyAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuIAorICAqIEBwYXJhbSAgVGlja1ByaW9yaXR5OiBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQoreworICBSQ0NfQ2xrSW5pdFR5cGVEZWYgICAgY2xrY29uZmlnOworICB1aW50MzJfdCAgICAgICAgICAgICAgdXdUaW1jbG9jaywgdXdBUEIxUHJlc2NhbGVyOworICB1aW50MzJfdCAgICAgICAgICAgICAgdXdQcmVzY2FsZXJWYWx1ZTsKKyAgdWludDMyX3QgICAgICAgICAgICAgIHBGTGF0ZW5jeTsKKyAgCisgICAgLypDb25maWd1cmUgdGhlIFRJTTIgSVJRIHByaW9yaXR5ICovCisgIEhBTF9OVklDX1NldFByaW9yaXR5KFRJTTJfSVJRbiwgVGlja1ByaW9yaXR5ICwwVSk7CisgIAorICAvKiBFbmFibGUgdGhlIFRJTTIgZ2xvYmFsIEludGVycnVwdCAqLworICBIQUxfTlZJQ19FbmFibGVJUlEoVElNMl9JUlFuKTsKKyAgCisgIC8qIEVuYWJsZSBUSU0yIGNsb2NrICovCisgIF9fSEFMX1JDQ19USU0yX0NMS19FTkFCTEUoKTsKKyAgCisgIC8qIEdldCBjbG9jayBjb25maWd1cmF0aW9uICovCisgIEhBTF9SQ0NfR2V0Q2xvY2tDb25maWcoJmNsa2NvbmZpZywgJnBGTGF0ZW5jeSk7CisgIAorICAvKiBHZXQgQVBCMSBwcmVzY2FsZXIgKi8KKyAgdXdBUEIxUHJlc2NhbGVyID0gY2xrY29uZmlnLkFQQjFDTEtEaXZpZGVyOworICAKKyAgLyogQ29tcHV0ZSBUSU0yIGNsb2NrICovCisgIGlmICh1d0FQQjFQcmVzY2FsZXIgPT0gUkNDX0hDTEtfRElWMSkgCisgIHsKKyAgICB1d1RpbWNsb2NrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB1d1RpbWNsb2NrID0gMlUqSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgfQorICAKKyAgLyogQ29tcHV0ZSB0aGUgcHJlc2NhbGVyIHZhbHVlIHRvIGhhdmUgVElNMiBjb3VudGVyIGNsb2NrIGVxdWFsIHRvIDFNSHogKi8KKyAgdXdQcmVzY2FsZXJWYWx1ZSA9ICh1aW50MzJfdCkgKCh1d1RpbWNsb2NrIC8gMTAwMDAwMFUpIC0gMVUpOworICAKKyAgLyogSW5pdGlhbGl6ZSBUSU0yICovCisgIFRpbUhhbmRsZS5JbnN0YW5jZSA9IFRJTTI7CisgIAorICAvKiBJbml0aWFsaXplIFRJTXggcGVyaXBoZXJhbCBhcyBmb2xsb3c6CisgICsgUGVyaW9kID0gWyhUSU0yQ0xLLzEwMDApIC0gMV0uIHRvIGhhdmUgYSAoMS8xMDAwKSBzIHRpbWUgYmFzZS4KKyAgKyBQcmVzY2FsZXIgPSAodXdUaW1jbG9jay8xMDAwMDAwIC0gMSkgdG8gaGF2ZSBhIDFNSHogY291bnRlciBjbG9jay4KKyAgKyBDbG9ja0RpdmlzaW9uID0gMAorICArIENvdW50ZXIgZGlyZWN0aW9uID0gVXAKKyAgKi8KKyAgVGltSGFuZGxlLkluaXQuUGVyaW9kID0gKDEwMDAwMDBVIC8gMTAwMFUpIC0gMVU7CisgIFRpbUhhbmRsZS5Jbml0LlByZXNjYWxlciA9IHV3UHJlc2NhbGVyVmFsdWU7CisgIFRpbUhhbmRsZS5Jbml0LkNsb2NrRGl2aXNpb24gPSAwVTsKKyAgVGltSGFuZGxlLkluaXQuQ291bnRlck1vZGUgPSBUSU1fQ09VTlRFUk1PREVfVVA7CisgIGlmKEhBTF9USU1fQmFzZV9Jbml0KCZUaW1IYW5kbGUpID09IEhBTF9PSykKKyAgeworICAgIC8qIFN0YXJ0IHRoZSBUSU0gdGltZSBCYXNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUgKi8KKyAgICByZXR1cm4gSEFMX1RJTV9CYXNlX1N0YXJ0X0lUKCZUaW1IYW5kbGUpOworICB9CisgIAorICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfRVJST1I7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KKyAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBUSU0yIHVwZGF0ZSBpbnRlcnJ1cHQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQoreworICAvKiBEaXNhYmxlIFRJTTIgdXBkYXRlIEludGVycnVwdCAqLworICBfX0hBTF9USU1fRElTQUJMRV9JVCgmVGltSGFuZGxlLCBUSU1fSVRfVVBEQVRFKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuCisgICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFRJTTIgdXBkYXRlIGludGVycnVwdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKK3sKKyAgLyogRW5hYmxlIFRJTTIgVXBkYXRlIGludGVycnVwdCAqLworICBfX0hBTF9USU1fRU5BQkxFX0lUKCZUaW1IYW5kbGUsIFRJTV9JVF9VUERBVEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFBlcmlvZCBlbGFwc2VkIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBUSU0yIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKKyAgKiBIQUxfVElNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAorICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgorICAqIEBwYXJhbSAgaHRpbSA6IFRJTSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1RJTV9QZXJpb2RFbGFwc2VkQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0pCit7CisgIEhBTF9JbmNUaWNrKCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVElNMl9JUlFIYW5kbGVyKHZvaWQpCit7CisgIEhBTF9USU1fSVJRSGFuZGxlcigmVGltSGFuZGxlKTsKK30KKworLyoqCisgICogQH0KKyAgKi8gCisKKy8qKgorICAqIEB9CisgICovIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfdHNjLmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY5YTZlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfdHNjLmMKQEAgLTAsMCArMSwxMTIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF90c2MuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVG91Y2ggU2Vuc2luZyBDb250cm9sbGVyIChUU0MpIHBlcmlwaGVyYWw6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIERlLWluaXRpYWxpemF0aW9uCisgICogICAgICAgICAgICsgQ2hhbm5lbCBJT3MsIFNoaWVsZCBJT3MgYW5kIFNhbXBsaW5nIElPcyBjb25maWd1cmF0aW9uCisgICogICAgICAgICAgICsgU3RhcnQgYW5kIFN0b3AgYW4gYWNxdWlzaXRpb24KKyAgKiAgICAgICAgICAgKyBSZWFkIGFjcXVpc2l0aW9uIHJlc3VsdAorICAqICAgICAgICAgICArIEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQKKyAgKgorICBAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRTQyBzcGVjaWZpYyBmZWF0dXJlcyAjIyMjIworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAoIykgUHJvdmVuIGFuZCByb2J1c3Qgc3VyZmFjZSBjaGFyZ2UgdHJhbnNmZXIgYWNxdWlzaXRpb24gcHJpbmNpcGxlCisKKyAgKCMpIFN1cHBvcnRzIHVwIHRvIDMgY2FwYWNpdGl2ZSBzZW5zaW5nIGNoYW5uZWxzIHBlciBncm91cAorCisgICgjKSBDYXBhY2l0aXZlIHNlbnNpbmcgY2hhbm5lbHMgY2FuIGJlIGFjcXVpcmVkIGluIHBhcmFsbGVsIG9mZmVyaW5nIGEgdmVyeSBnb29kCisgICAgICByZXNwb25zZSB0aW1lCisKKyAgKCMpIFNwcmVhZCBzcGVjdHJ1bSBmZWF0dXJlIHRvIGltcHJvdmUgc3lzdGVtIHJvYnVzdG5lc3MgaW4gbm9pc3kgZW52aXJvbm1lbnRzCisKKyAgKCMpIEZ1bGwgaGFyZHdhcmUgbWFuYWdlbWVudCBvZiB0aGUgY2hhcmdlIHRyYW5zZmVyIGFjcXVpc2l0aW9uIHNlcXVlbmNlCisKKyAgKCMpIFByb2dyYW1tYWJsZSBjaGFyZ2UgdHJhbnNmZXIgZnJlcXVlbmN5CisKKyAgKCMpIFByb2dyYW1tYWJsZSBzYW1wbGluZyBjYXBhY2l0b3IgSS9PIHBpbgorCisgICgjKSBQcm9ncmFtbWFibGUgY2hhbm5lbCBJL08gcGluCisKKyAgKCMpIFByb2dyYW1tYWJsZSBtYXggY291bnQgdmFsdWUgdG8gYXZvaWQgbG9uZyBhY3F1aXNpdGlvbiB3aGVuIGEgY2hhbm5lbCBpcyBmYXVsdHkKKworICAoIykgRGVkaWNhdGVkIGVuZCBvZiBhY3F1aXNpdGlvbiBhbmQgbWF4IGNvdW50IGVycm9yIGZsYWdzIHdpdGggaW50ZXJydXB0IGNhcGFiaWxpdHkKKworICAoIykgT25lIHNhbXBsaW5nIGNhcGFjaXRvciBmb3IgdXAgdG8gMyBjYXBhY2l0aXZlIHNlbnNpbmcgY2hhbm5lbHMgdG8gcmVkdWNlIHRoZSBzeXN0ZW0KKyAgICAgIGNvbXBvbmVudHMKKworICAoIykgQ29tcGF0aWJsZSB3aXRoIHByb3hpbWl0eSwgdG91Y2hrZXksIGxpbmVhciBhbmQgcm90YXJ5IHRvdWNoIHNlbnNvciBpbXBsZW1lbnRhdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoIykgRW5hYmxlIHRoZSBUU0MgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19UU0NfQ0xLX0VOQUJMRSgpIG1hY3JvLgorCisgICAgKCMpIEdQSU8gcGlucyBjb25maWd1cmF0aW9uCisgICAgICAoKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBUU0MgR1BJT3MgdXNpbmcgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKSBtYWNyby4KKyAgICAgICgrKykgQ29uZmlndXJlIHRoZSBUU0MgcGlucyB1c2VkIGFzIHNhbXBsaW5nIElPcyBpbiBhbHRlcm5hdGUgZnVuY3Rpb24gb3V0cHV0IE9wZW4tRHJhaW4gbW9kZSwKKyAgICAgICAgICAgYW5kIFRTQyBwaW5zIHVzZWQgYXMgY2hhbm5lbC9zaGllbGQgSU9zIGluIGFsdGVybmF0ZSBmdW5jdGlvbiBvdXRwdXQgUHVzaC1QdWxsIG1vZGUKKyAgICAgICAgICAgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIGZ1bmN0aW9uLgorCisgICAgKCMpIEludGVycnVwdHMgY29uZmlndXJhdGlvbgorICAgICAgKCsrKSBDb25maWd1cmUgdGhlIE5WSUMgKGlmIHRoZSBpbnRlcnJ1cHQgbW9kZWwgaXMgdXNlZCkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKQorICAgICAgICAgICBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkgYW5kIGZ1bmN0aW9uLgorCisgICAgKCMpIFRTQyBjb25maWd1cmF0aW9uCisgICAgICAoKyspIENvbmZpZ3VyZSBhbGwgVFNDIHBhcmFtZXRlcnMgYW5kIHVzZWQgVFNDIElPcyB1c2luZyBIQUxfVFNDX0luaXQoKSBmdW5jdGlvbi4KKworIFsuLl0gICBUU0MgcGVyaXBoZXJhbCBhbHRlcm5hdGUgZnVuY3Rpb25zIGFyZSBtYXBwZWQgb24gQUY5LgorCisgICoqKiBBY3F1aXNpdGlvbiBzZXF1ZW5jZSAqKioKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBEaXNjaGFyZ2UgYWxsIElPcyB1c2luZyBIQUxfVFNDX0lPRGlzY2hhcmdlKCkgZnVuY3Rpb24uCisgICAgKCspIFdhaXQgYSBjZXJ0YWluIHRpbWUgYWxsb3dpbmcgYSBnb29kIGRpc2NoYXJnZSBvZiBhbGwgY2FwYWNpdG9ycy4gVGhpcyBkZWxheSBkZXBlbmRzCisgICAgICAgIG9mIHRoZSBzYW1wbGluZyBjYXBhY2l0b3IgYW5kIGVsZWN0cm9kZXMgZGVzaWduLgorICAgICgrKSBTZWxlY3QgdGhlIGNoYW5uZWwgSU9zIHRvIGJlIGFjcXVpcmVkIHVzaW5nIEhBTF9UU0NfSU9Db25maWcoKSBmdW5jdGlvbi4KKyAgICAoKykgTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiB1c2luZyBlaXRoZXIgSEFMX1RTQ19TdGFydCgpIG9yIEhBTF9UU0NfU3RhcnRfSVQoKSBmdW5jdGlvbi4KKyAgICAgICAgSWYgdGhlIHN5bmNocm9uaXplZCBtb2RlIGlzIHNlbGVjdGVkLCB0aGUgYWNxdWlzaXRpb24gd2lsbCBzdGFydCBhcyBzb29uIGFzIHRoZSBzaWduYWwKKyAgICAgICAgaXMgcmVjZWl2ZWQgb24gdGhlIHN5bmNocm8gcGluLgorICAgICgrKSBXYWl0IHRoZSBlbmQgb2YgYWNxdWlzaXRpb24gdXNpbmcgZWl0aGVyIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKCkgb3IKKyAgICAgICAgSEFMX1RTQ19HZXRTdGF0ZSgpIGZ1bmN0aW9uIG9yIHVzaW5nIFdGSSBpbnN0cnVjdGlvbiBmb3IgZXhhbXBsZS4KKyAgICAoKykgQ2hlY2sgdGhlIGdyb3VwIGFjcXVpc2l0aW9uIHN0YXR1cyB1c2luZyBIQUxfVFNDX0dyb3VwR2V0U3RhdHVzKCkgZnVuY3Rpb24uCisgICAgKCspIFJlYWQgdGhlIGFjcXVpc2l0aW9uIHZhbHVlIHVzaW5nIEhBTF9UU0NfR3JvdXBHZXRWYWx1ZSgpIGZ1bmN0aW9uLgorCisgICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGFuIGludGVycnVwdCBjYWxsYmFjay4KKworICBbLi5dCisgICAgIEZ1bmN0aW9uIEByZWYgSEFMX1RTQ19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIENvbnZDcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBjb252ZXJzaW9uIGNvbXBsZXRlIHByb2Nlc3MuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgSW5pdC4KKyAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgIFsuLl0KKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgIFsuLl0KKyAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1RTQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgICB3ZWFrIGZ1bmN0aW9uLgorICAgICBAcmVmIEhBTF9UU0NfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgWy4uXQorICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgorICAgICAgICgrKSBDb252Q3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgY29udmVyc2lvbiBjb21wbGV0ZSBwcm9jZXNzLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgorICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorCisgIFsuLl0KKyAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1RTQ19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX1RTQ19TVEFURV9SRVNFVAorICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgIGV4YW1wbGVzIEByZWYgSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX1RTQ19FcnJvckNhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1RTQ19Jbml0KCkvIEByZWYgSEFMX1RTQ19EZUluaXQoKSBvbmx5IHdoZW4KKyAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICAgSWYgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfVFNDX0luaXQoKS8gQHJlZiBIQUxfVFNDX0RlSW5pdCgpCisgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgorCisgIFsuLl0KKyAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBAcmVmIEhBTF9UU0NfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCisgICAgIGluIEByZWYgSEFMX1RTQ19TVEFURV9SRUFEWSBvciBAcmVmIEhBTF9UU0NfU1RBVEVfUkVTRVQgc3RhdGUsCisgICAgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgICAgdXNpbmcgQHJlZiBIQUxfVFNDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9UU0NfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfVFNDX0luaXQoKSBmdW5jdGlvbi4KKworICBbLi5dCisgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCisgICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcworICAgICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIFRhYmxlIDEuIElPcyBmb3IgdGhlIFNUTTMyV0J4eCBkZXZpY2VzCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgSU9zICAgIHwgICBUU0MgZnVuY3Rpb25zIHwKKyAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgIFBCMTIgKEFGKSAgfCAgIFRTQ19HMV9JTzEgICAgfAorICAgIHwgICBQQjEzIChBRikgIHwgICBUU0NfRzFfSU8yICAgIHwKKyAgICB8ICAgUEIxNCAoQUYpICB8ICAgVFNDX0cxX0lPMyAgICB8CisgICAgfCAgIFBCMTUgKEFGKSAgfCAgIFRTQ19HMV9JTzQgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEI0IChBRikgICB8ICAgVFNDX0cyX0lPMSAgICB8CisgICAgfCAgIFBCNSAoQUYpICAgfCAgIFRTQ19HMl9JTzIgICAgfAorICAgIHwgICBQQjYgKEFGKSAgIHwgICBUU0NfRzJfSU8zICAgIHwKKyAgICB8ICAgUEI3IChBRikgICB8ICAgVFNDX0cyX0lPNCAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICBQQTE1IChBRikgIHwgICBUU0NfRzNfSU8xICAgIHwKKyAgICB8ICAgUEMxMCAoQUYpICB8ICAgVFNDX0czX0lPMiAgICB8CisgICAgfCAgIFBDMTEgKEFGKSAgfCAgIFRTQ19HM19JTzMgICAgfAorICAgIHwgICBQQzEyIChBRikgIHwgICBUU0NfRzNfSU80ICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgIFBDNiAgKEFGKSAgfCAgIFRTQ19HNF9JTzEgICAgfAorICAgIHwgICBQQzcgIChBRikgIHwgICBUU0NfRzRfSU8yICAgIHwKKyAgICB8ICAgUEM4ICAoQUYpICB8ICAgVFNDX0c0X0lPMyAgICB8CisgICAgfCAgIFBDOSAgKEFGKSAgfCAgIFRTQ19HNF9JTzQgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEQ0ICAoQUYpICB8ICAgVFNDX0c1X0lPMSAgICB8CisgICAgfCAgIFBENSAgKEFGKSAgfCAgIFRTQ19HNV9JTzIgICAgfAorICAgIHwgICBQRDYgIChBRikgIHwgICBUU0NfRzVfSU8zICAgIHwKKyAgICB8ICAgUEQ3ICAoQUYpICB8ICAgVFNDX0c1X0lPNCAgICB8CisgICAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICBQRDEwIChBRikgIHwgICBUU0NfRzZfSU8xICAgIHwKKyAgICB8ICAgUEQxMSAoQUYpICB8ICAgVFNDX0c2X0lPMiAgICB8CisgICAgfCAgIFBEMTIgKEFGKSAgfCAgIFRTQ19HNl9JTzMgICAgfAorICAgIHwgICBQRDEzIChBRikgIHwgICBUU0NfRzZfSU80ICAgIHwKKyAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgIFBFMiAgKEFGKSAgfCAgIFRTQ19HN19JTzEgICAgfAorICAgIHwgICBQRTEgIChBRikgIHwgICBUU0NfRzdfSU8yICAgIHwKKyAgICB8ICAgUEUwICAoQUYpICB8ICAgVFNDX0c3X0lPMyAgICB8CisgICAgfCAgIFBCOSAgKEFGKSAgfCAgIFRTQ19HN19JTzQgICAgfAorICAgIHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgUEIxMCAoQUYpICB8ICAgVFNDX1NZTkMgICAgICB8CisgICAgfCAgIFBEMiAgKEFGKSAgfCAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFRTQyBUU0MKKyAgKiBAYnJpZWYgSEFMIFRTQyBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9UU0NfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdWludDMyX3QgVFNDX2V4dHJhY3RfZ3JvdXBzKHVpbnQzMl90IGlvbWFzayk7CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9ucyBUU0MgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICAgKCspIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSB0aGUgVFNDLgorICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFRTQy4KK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgVFNDIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICAgaW4gdGhlIFRTQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHRzYyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0luaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIFRTQyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHRzYyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfQ1RQSChodHNjLT5Jbml0LkNUUHVsc2VIaWdoTGVuZ3RoKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfQ1RQTChodHNjLT5Jbml0LkNUUHVsc2VMb3dMZW5ndGgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TUyhodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfU1NEKGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW1EZXZpYXRpb24pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TU19QUkVTQyhodHNjLT5Jbml0LlNwcmVhZFNwZWN0cnVtUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfUEdfUFJFU0MoaHRzYy0+SW5pdC5QdWxzZUdlbmVyYXRvclByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX01DVihodHNjLT5Jbml0Lk1heENvdW50VmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19JT0RFRihodHNjLT5Jbml0LklPRGVmYXVsdE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19TWU5DX1BPTChodHNjLT5Jbml0LlN5bmNocm9QaW5Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FDUV9NT0RFKGh0c2MtPkluaXQuQWNxdWlzaXRpb25Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfTUNFX0lUKGh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUChodHNjLT5Jbml0LkNoYW5uZWxJT3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUChodHNjLT5Jbml0LlNoaWVsZElPcykpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0dST1VQKGh0c2MtPkluaXQuU2FtcGxpbmdJT3MpKTsKKworICBpZiAoaHRzYy0+U3RhdGUgPT0gSEFMX1RTQ19TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodHNjLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIEluaXQgdGhlIFRTQyBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIGh0c2MtPkNvbnZDcGx0Q2FsbGJhY2sgID0gSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBDb252Q3BsdENhbGxiYWNrICAgICAqLworICAgIGh0c2MtPkVycm9yQ2FsbGJhY2sgICAgID0gSEFMX1RTQ19FcnJvckNhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworCisgICAgaWYgKGh0c2MtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh0c2MtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9UU0NfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCisgICAgaHRzYy0+TXNwSW5pdENhbGxiYWNrKGh0c2MpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYICovCisgICAgSEFMX1RTQ19Nc3BJbml0KGh0c2MpOworI2VuZGlmIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9CVVNZOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBTZXQgVFNDIHBhcmFtZXRlcnMgKi8KKworICAvKiBFbmFibGUgVFNDICovCisgIGh0c2MtPkluc3RhbmNlLT5DUiA9IFRTQ19DUl9UU0NFOworCisgIC8qIFNldCBhbGwgZnVuY3Rpb25zICovCisgIGh0c2MtPkluc3RhbmNlLT5DUiB8PSAoaHRzYy0+SW5pdC5DVFB1bHNlSGlnaExlbmd0aCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5DVFB1bHNlTG93TGVuZ3RoIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaHRzYy0+SW5pdC5TcHJlYWRTcGVjdHJ1bURldmlhdGlvbiA8PCBUU0NfQ1JfU1NEX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW1QcmVzY2FsZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuUHVsc2VHZW5lcmF0b3JQcmVzY2FsZXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuTWF4Q291bnRWYWx1ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgaHRzYy0+SW5pdC5TeW5jaHJvUGluUG9sYXJpdHkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIGh0c2MtPkluaXQuQWNxdWlzaXRpb25Nb2RlKTsKKworICAvKiBTcHJlYWQgc3BlY3RydW0gKi8KKyAgaWYgKGh0c2MtPkluaXQuU3ByZWFkU3BlY3RydW0gPT0gRU5BQkxFKQorICB7CisgICAgaHRzYy0+SW5zdGFuY2UtPkNSIHw9IFRTQ19DUl9TU0U7CisgIH0KKworICAvKiBEaXNhYmxlIFNjaG1pdHQgdHJpZ2dlciBoeXN0ZXJlc2lzIG9uIGFsbCB1c2VkIFRTQyBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPSENSID0gKH4oaHRzYy0+SW5pdC5DaGFubmVsSU9zIHwgaHRzYy0+SW5pdC5TaGllbGRJT3MgfCBodHNjLT5Jbml0LlNhbXBsaW5nSU9zKSk7CisKKyAgLyogU2V0IGNoYW5uZWwgYW5kIHNoaWVsZCBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPQ0NSID0gKGh0c2MtPkluaXQuQ2hhbm5lbElPcyB8IGh0c2MtPkluaXQuU2hpZWxkSU9zKTsKKworICAvKiBTZXQgc2FtcGxpbmcgSU9zICovCisgIGh0c2MtPkluc3RhbmNlLT5JT1NDUiA9IGh0c2MtPkluaXQuU2FtcGxpbmdJT3M7CisKKyAgLyogU2V0IHRoZSBncm91cHMgdG8gYmUgYWNxdWlyZWQgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPR0NTUiA9IFRTQ19leHRyYWN0X2dyb3VwcyhodHNjLT5Jbml0LkNoYW5uZWxJT3MpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBodHNjLT5JbnN0YW5jZS0+SUVSICY9ICh+KFRTQ19JVF9FT0EgfCBUU0NfSVRfTUNFKSk7CisKKyAgLyogQ2xlYXIgZmxhZ3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklDUiA9IChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgIC8qIEluaXRpYWxpemUgdGhlIFRTQyBzdGF0ZSAqLworICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZSB0aGUgVFNDIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgaHRzYyBUU0MgaGFuZGxlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0RlSW5pdChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgVFNDIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodHNjID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9CVVNZOworCisjaWYgKFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh0c2MtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1RTQ19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBodHNjLT5Nc3BEZUluaXRDYWxsYmFjayhodHNjKTsKKyNlbHNlCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9UU0NfTXNwRGVJbml0KGh0c2MpOworI2VuZGlmIC8qIFVTRV9IQUxfVFNDX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX1JFU0VUOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBUU0MgTVNQLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9UU0NfTXNwSW5pdChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIFRTQyBNU1AuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RTQ19Nc3BEZUluaXQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh0c2MpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVFNDX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFRTQyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9UU0NfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVFNDX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIGlmIChIQUxfVFNDX1NUQVRFX1JFQURZID09IGh0c2MtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+Q29udkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RTQ19FUlJPUl9DQl9JRCA6CisgICAgICAgIGh0c2MtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh0c2MtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHRzYy0+RXJyb3JDb2RlIHw9IEhBTF9UU0NfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfVFNDX1NUQVRFX1JFU0VUID09IGh0c2MtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1RTQ19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh0c2MtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh0c2MtPkVycm9yQ29kZSB8PSBIQUxfVFNDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBUU0MgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRTQyBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19DT05WX0NPTVBMRVRFX0NCX0lEIENvbnZlcnNpb24gY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9UU0NfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1RTQ19NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IGNhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1VuUmVnaXN0ZXJDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgSEFMX1RTQ19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICBpZiAoSEFMX1RTQ19TVEFURV9SRUFEWSA9PSBodHNjLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9UU0NfQ09OVl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh0c2MtPkNvbnZDcGx0Q2FsbGJhY2sgPSBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2s7ICAgICAgIC8qIExlZ2FjeSB3ZWFrIENvbnZDcGx0Q2FsbGJhY2sgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+RXJyb3JDYWxsYmFjayA9IEhBTF9UU0NfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVFNDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9UU0NfU1RBVEVfUkVTRVQgPT0gaHRzYy0+U3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVFNDX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodHNjLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9UU0NfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHRzYy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVFNDX01zcERlSW5pdDsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodHNjLT5FcnJvckNvZGUgfD0gSEFMX1RTQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh0c2MtPkVycm9yQ29kZSB8PSBIQUxfVFNDX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAvKiBVU0VfSEFMX1RTQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICAgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIElPIE9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBTdGFydCBhY3F1aXNpdGlvbiBpbiBwb2xsaW5nIG1vZGUuCisgICAgICAoKykgU3RhcnQgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgU3RvcCBjb252ZXJzaW9uIGluIHBvbGxpbmcgbW9kZS4KKyAgICAgICgrKSBTdG9wIGNvbnZlcnNpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICAgICAoKykgUG9sbCBmb3IgYWNxdWlzaXRpb24gY29tcGxldGVkLgorICAgICAgKCspIEdldCBncm91cCBhY3F1aXNpdGlvbiBzdGF0dXMuCisgICAgICAoKykgR2V0IGdyb3VwIGFjcXVpc2l0aW9uIHZhbHVlLgorQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24uCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RTQ19TdGFydChUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogQ2xlYXIgaW50ZXJydXB0cyAqLworICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCAoVFNDX0lUX0VPQSB8IFRTQ19JVF9NQ0UpKTsKKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIG5vdCBhY3F1aXJlZCB0byB0aGUgc3BlY2lmaWVkIElPRGVmYXVsdE1vZGUgKi8KKyAgaWYgKGh0c2MtPkluaXQuSU9EZWZhdWx0TW9kZSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKGh0c2MpOworICB9CisKKyAgLyogTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RBUlRfQUNRKGh0c2MpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgYWNxdWlzaXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfU3RhcnRfSVQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfTUNFX0lUKGh0c2MtPkluaXQuTWF4Q291bnRJbnRlcnJ1cHQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0JVU1k7CisKKyAgLyogRW5hYmxlIGVuZCBvZiBhY3F1aXNpdGlvbiBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfVFNDX0VOQUJMRV9JVChodHNjLCBUU0NfSVRfRU9BKTsKKworICAvKiBFbmFibGUgbWF4IGNvdW50IGVycm9yIGludGVycnVwdCAob3B0aW9uYWwpICovCisgIGlmIChodHNjLT5Jbml0Lk1heENvdW50SW50ZXJydXB0ID09IEVOQUJMRSkKKyAgeworICAgIF9fSEFMX1RTQ19FTkFCTEVfSVQoaHRzYywgVFNDX0lUX01DRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX0RJU0FCTEVfSVQoaHRzYywgVFNDX0lUX01DRSk7CisgIH0KKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIG5vdCBhY3F1aXJlZCB0byB0aGUgc3BlY2lmaWVkIElPRGVmYXVsdE1vZGUgKi8KKyAgaWYgKGh0c2MtPkluaXQuSU9EZWZhdWx0TW9kZSA9PSBUU0NfSU9ERUZfT1VUX1BQX0xPVykKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfT1VUUFBMT1coaHRzYyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgX19IQUxfVFNDX1NFVF9JT0RFRl9JTkZMT0FUKGh0c2MpOworICB9CisKKyAgLyogTGF1bmNoIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RBUlRfQUNRKGh0c2MpOworCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTdG9wIHRoZSBhY3F1aXNpdGlvbiBwcmV2aW91c2x5IGxhdW5jaGVkIGluIHBvbGxpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3AoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICAvKiBTdG9wIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIGluIGxvdyBwb3dlciBtb2RlIChvdXRwdXQgcHVzaC1wdWxsKSAqLworICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworCisgIC8qIENsZWFyIGZsYWdzICovCisgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIChUU0NfRkxBR19FT0EgfCBUU0NfRkxBR19NQ0UpKTsKKworICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU3RvcCB0aGUgYWNxdWlzaXRpb24gcHJldmlvdXNseSBsYXVuY2hlZCBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX1N0b3BfSVQoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodHNjKTsKKworICAvKiBTdG9wIHRoZSBhY3F1aXNpdGlvbiAqLworICBfX0hBTF9UU0NfU1RPUF9BQ1EoaHRzYyk7CisKKyAgLyogU2V0IHRvdWNoIHNlbnNpbmcgSU9zIGluIGxvdyBwb3dlciBtb2RlIChvdXRwdXQgcHVzaC1wdWxsKSAqLworICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBfX0hBTF9UU0NfRElTQUJMRV9JVChodHNjLCAoVFNDX0lUX0VPQSB8IFRTQ19JVF9NQ0UpKTsKKworICAvKiBDbGVhciBmbGFncyAqLworICBfX0hBTF9UU0NfQ0xFQVJfRkxBRyhodHNjLCAoVFNDX0ZMQUdfRU9BIHwgVFNDX0ZMQUdfTUNFKSk7CisKKyAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICBodHNjLT5TdGF0ZSA9IEhBTF9UU0NfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHRzYyk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFN0YXJ0IGFjcXVpc2l0aW9uIGFuZCB3YWl0IHVudGlsIGNvbXBsZXRpb24uCisgICogQG5vdGUgICBUaGVyZSBpcyBubyBuZWVkIG9mIGEgdGltZW91dCBwYXJhbWV0ZXIgYXMgdGhlIG1heCBjb3VudCBlcnJvciBpcyBhbHJlYWR5CisgICogICAgICAgICBtYW5hZ2VkIGJ5IHRoZSBUU0MgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfUG9sbEZvckFjcXVpc2l0aW9uKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRzYyk7CisKKyAgLyogQ2hlY2sgZW5kIG9mIGFjcXVpc2l0aW9uICovCisgIHdoaWxlIChIQUxfVFNDX0dldFN0YXRlKGh0c2MpID09IEhBTF9UU0NfU1RBVEVfQlVTWSkKKyAgeworICAgIC8qIFRoZSB0aW1lb3V0IChtYXggY291bnQgZXJyb3IpIGlzIG1hbmFnZWQgYnkgdGhlIFRTQyBwZXJpcGhlcmFsIGl0c2VsZi4gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhY3F1aXNpdGlvbiBzdGF0dXMgZm9yIGEgZ3JvdXAuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgZ3hfaW5kZXggSW5kZXggb2YgdGhlIGdyb3VwCisgICogQHJldHZhbCBHcm91cCBzdGF0dXMKKyAgKi8KK1RTQ19Hcm91cFN0YXR1c1R5cGVEZWYgSEFMX1RTQ19Hcm91cEdldFN0YXR1cyhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYywgdWludDMyX3QgZ3hfaW5kZXgpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19UU0NfR1JPVVBfSU5ERVgoZ3hfaW5kZXgpKTsKKworICAvKiBSZXR1cm4gdGhlIGdyb3VwIHN0YXR1cyAqLworICByZXR1cm4gKF9fSEFMX1RTQ19HRVRfR1JPVVBfU1RBVFVTKGh0c2MsIGd4X2luZGV4KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBhY3F1aXNpdGlvbiBtZWFzdXJlIGZvciBhIGdyb3VwLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcGFyYW0gIGd4X2luZGV4IEluZGV4IG9mIHRoZSBncm91cAorICAqIEByZXR2YWwgQWNxdWlzaXRpb24gbWVhc3VyZQorICAqLwordWludDMyX3QgSEFMX1RTQ19Hcm91cEdldFZhbHVlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCB1aW50MzJfdCBneF9pbmRleCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUF9JTkRFWChneF9pbmRleCkpOworCisgIC8qIFJldHVybiB0aGUgZ3JvdXAgYWNxdWlzaXRpb24gY291bnRlciAqLworICByZXR1cm4gaHRzYy0+SW5zdGFuY2UtPklPR1hDUltneF9pbmRleF07Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVFNDX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBDb25maWd1cmUgVFNDIElPcworICAgICAgKCspIERpc2NoYXJnZSBUU0MgSU9zCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBUU0MgSU9zLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcGFyYW0gIGNvbmZpZyBQb2ludGVyIHRvIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9UU0NfSU9Db25maWcoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MsIFRTQ19JT0NvbmZpZ1R5cGVEZWYgKmNvbmZpZykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUChjb25maWctPkNoYW5uZWxJT3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19HUk9VUChjb25maWctPlNoaWVsZElPcykpOworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0dST1VQKGNvbmZpZy0+U2FtcGxpbmdJT3MpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh0c2MpOworCisgIC8qIFN0b3AgYWNxdWlzaXRpb24gKi8KKyAgX19IQUxfVFNDX1NUT1BfQUNRKGh0c2MpOworCisgIC8qIERpc2FibGUgU2NobWl0dCB0cmlnZ2VyIGh5c3RlcmVzaXMgb24gYWxsIHVzZWQgVFNDIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9IQ1IgPSAofihjb25maWctPkNoYW5uZWxJT3MgfCBjb25maWctPlNoaWVsZElPcyB8IGNvbmZpZy0+U2FtcGxpbmdJT3MpKTsKKworICAvKiBTZXQgY2hhbm5lbCBhbmQgc2hpZWxkIElPcyAqLworICBodHNjLT5JbnN0YW5jZS0+SU9DQ1IgPSAoY29uZmlnLT5DaGFubmVsSU9zIHwgY29uZmlnLT5TaGllbGRJT3MpOworCisgIC8qIFNldCBzYW1wbGluZyBJT3MgKi8KKyAgaHRzYy0+SW5zdGFuY2UtPklPU0NSID0gY29uZmlnLT5TYW1wbGluZ0lPczsKKworICAvKiBTZXQgZ3JvdXBzIHRvIGJlIGFjcXVpcmVkICovCisgIGh0c2MtPkluc3RhbmNlLT5JT0dDU1IgPSBUU0NfZXh0cmFjdF9ncm91cHMoY29uZmlnLT5DaGFubmVsSU9zKTsKKworICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodHNjKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzY2hhcmdlIFRTQyBJT3MuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEBwYXJhbSAgY2hvaWNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gRU5BQkxFIG9yIERJU0FCTEUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVFNDX0lPRGlzY2hhcmdlKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjLCBGdW5jdGlvbmFsU3RhdGUgY2hvaWNlKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVFNDX0FMTF9JTlNUQU5DRShodHNjLT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHRzYyk7CisKKyAgaWYgKGNob2ljZSA9PSBFTkFCTEUpCisgIHsKKyAgICBfX0hBTF9UU0NfU0VUX0lPREVGX09VVFBQTE9XKGh0c2MpOworICB9CisgIGVsc2UKKyAgeworICAgIF9fSEFMX1RTQ19TRVRfSU9ERUZfSU5GTE9BVChodHNjKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh0c2MpOworCisgIC8qIFJldHVybiB0aGUgZ3JvdXAgYWNxdWlzaXRpb24gY291bnRlciAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFRTQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KKyAgICAgICgrKSBHZXQgVFNDIHN0YXRlLgorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgVFNDIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9UU0NfU3RhdGVUeXBlRGVmIEhBTF9UU0NfR2V0U3RhdGUoVFNDX0hhbmRsZVR5cGVEZWYgKmh0c2MpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19UU0NfQUxMX0lOU1RBTkNFKGh0c2MtPkluc3RhbmNlKSk7CisKKyAgaWYgKGh0c2MtPlN0YXRlID09IEhBTF9UU0NfU1RBVEVfQlVTWSkKKyAgeworICAgIC8qIENoZWNrIGVuZCBvZiBhY3F1aXNpdGlvbiBmbGFnICovCisgICAgaWYgKF9fSEFMX1RTQ19HRVRfRkxBRyhodHNjLCBUU0NfRkxBR19FT0EpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENoZWNrIG1heCBjb3VudCBlcnJvciBmbGFnICovCisgICAgICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX01DRSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIENoYW5nZSBUU0Mgc3RhdGUgKi8KKyAgICAgICAgaHRzYy0+U3RhdGUgPSBIQUxfVFNDX1NUQVRFX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBDaGFuZ2UgVFNDIHN0YXRlICovCisgICAgICAgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXR1cm4gVFNDIHN0YXRlICovCisgIHJldHVybiBodHNjLT5TdGF0ZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBUU0NfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFRTQyBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gIGh0c2MgUG9pbnRlciB0byBhIFRTQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUU0MuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9UU0NfSVJRSGFuZGxlcihUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RTQ19BTExfSU5TVEFOQ0UoaHRzYy0+SW5zdGFuY2UpKTsKKworICAvKiBDaGVjayBpZiB0aGUgZW5kIG9mIGFjcXVpc2l0aW9uIG9jY3VycmVkICovCisgIGlmIChfX0hBTF9UU0NfR0VUX0ZMQUcoaHRzYywgVFNDX0ZMQUdfRU9BKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIEVPQSBmbGFnICovCisgICAgX19IQUxfVFNDX0NMRUFSX0ZMQUcoaHRzYywgVFNDX0ZMQUdfRU9BKTsKKyAgfQorCisgIC8qIENoZWNrIGlmIG1heCBjb3VudCBlcnJvciBvY2N1cnJlZCAqLworICBpZiAoX19IQUxfVFNDX0dFVF9GTEFHKGh0c2MsIFRTQ19GTEFHX01DRSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDbGVhciBNQ0UgZmxhZyAqLworICAgIF9fSEFMX1RTQ19DTEVBUl9GTEFHKGh0c2MsIFRTQ19GTEFHX01DRSk7CisgICAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICAgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9FUlJPUjsKKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHRzYy0+RXJyb3JDYWxsYmFjayhodHNjKTsKKyNlbHNlCisgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgICBIQUxfVFNDX0Vycm9yQ2FsbGJhY2soaHRzYyk7CisjZW5kaWYgLyogVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2hhbmdlIFRTQyBzdGF0ZSAqLworICAgIGh0c2MtPlN0YXRlID0gSEFMX1RTQ19TVEFURV9SRUFEWTsKKyNpZiAoVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHRzYy0+Q29udkNwbHRDYWxsYmFjayhodHNjKTsKKyNlbHNlCisgICAgLyogQ29udmVyc2lvbiBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgICBIQUxfVFNDX0NvbnZDcGx0Q2FsbGJhY2soaHRzYyk7CisjZW5kaWYgLyogVVNFX0hBTF9UU0NfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBBY3F1aXNpdGlvbiBjb21wbGV0ZWQgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodHNjIFBvaW50ZXIgdG8gYSBUU0NfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVFNDLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrKFRTQ19IYW5kbGVUeXBlRGVmICpodHNjKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodHNjKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1RTQ19Db252Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIEVycm9yIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHRzYyBQb2ludGVyIHRvIGEgVFNDX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRTQy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9UU0NfRXJyb3JDYWxsYmFjayhUU0NfSGFuZGxlVHlwZURlZiAqaHRzYykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHRzYyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9UU0NfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVFNDX1ByaXZhdGVfRnVuY3Rpb25zIFRTQyBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIHRvIHNldCB0aGUgYWNxdWlyZWQgZ3JvdXBzIG1hc2suCisgICogQHBhcmFtICBpb21hc2sgQ2hhbm5lbHMgSU9zIG1hc2sKKyAgKiBAcmV0dmFsIEFjcXVpcmVkIGdyb3VwcyBtYXNrCisgICovCitzdGF0aWMgdWludDMyX3QgVFNDX2V4dHJhY3RfZ3JvdXBzKHVpbnQzMl90IGlvbWFzaykKK3sKKyAgdWludDMyX3QgZ3JvdXBzID0gMFVMOworICB1aW50MzJfdCBpZHg7CisKKyAgZm9yIChpZHggPSAwVUw7IGlkeCA8ICh1aW50MzJfdClUU0NfTkJfT0ZfR1JPVVBTOyBpZHgrKykKKyAgeworICAgIGlmICgoaW9tYXNrICYgKDB4MEZVTCA8PCAoaWR4ICogNFVMKSkpICE9IDBVTCApCisgICAgeworICAgICAgZ3JvdXBzIHw9ICgxVUwgPDwgaWR4KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3JvdXBzOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1RTQ19NT0RVTEVfRU5BQkxFRCAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9oYWxfdWFydC5jIGIvU3JjL3N0bTMyd2J4eF9oYWxfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTIxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF91YXJ0LmMKQEAgLTAsMCArMSwzOTQ3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF91YXJ0LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGUgVUFSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAoIykgRGVjbGFyZSBhIFVBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVUFSVF9IYW5kbGVUeXBlRGVmIGh1YXJ0KS4KKyAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVUFSVCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgKCsrKSBFbmFibGUgdGhlIFVTQVJUeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICgrKykgVUFSVCBwaW5zIGNvbmZpZ3VyYXRpb246CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgVUFSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVQVJUIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCisgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0lUKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFVTQVJUeCBpbnRlcnJ1cHQgcHJpb3JpdHkuCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgVVNBUlQgSVJRIGhhbmRsZS4KKyAgICAgICAgKCsrKSBVQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gIFRoZSBzcGVjaWZpYyBVQVJUIGludGVycnVwdHMgKFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgUlhORSBpbnRlcnJ1cHQsIFJYL1RYIEZJRk9zIHJlbGF0ZWQgaW50ZXJydXB0cyBhbmQgRXJyb3IgSW50ZXJydXB0cykKKyAgICAgICAgICAgICAgICBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1VBUlRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1VBUlRfRElTQUJMRV9JVCgpCisgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzZXMuCisgICAgICAgICgrKykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfVUFSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgIGFuZCBIQUxfVUFSVF9SZWNlaXZlX0RNQSgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbC4KKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkIFR4L1J4IHBhcmFtZXRlcnMuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBVQVJUIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgKCMpIFByb2dyYW0gdGhlIEJhdWQgUmF0ZSwgV29yZCBMZW5ndGgsIFN0b3AgQml0LCBQYXJpdHksIFByZXNjYWxlciB2YWx1ZSAsIEhhcmR3YXJlCisgICAgICAgIGZsb3cgY29udHJvbCBhbmQgTW9kZSAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodWFydCBoYW5kbGUgSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgSWYgcmVxdWlyZWQsIHByb2dyYW0gVUFSVCBhZHZhbmNlZCBmZWF0dXJlcyAoVFgvUlggcGlucyBzd2FwLCBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24sLi4uKQorICAgICAgICBpbiB0aGUgaHVhcnQgaGFuZGxlIEFkdmFuY2VkSW5pdCBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIGFzeW5jaHJvbm91cyBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfVUFSVF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBIYWxmIGR1cGxleCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycyBieSBjYWxsaW5nCisgICAgICAgIHRoZSBIQUxfSGFsZkR1cGxleF9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBMSU4gKExvY2FsIEludGVyY29ubmVjdGlvbiBOZXR3b3JrKSBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfTElOX0luaXQoKSBBUEkuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIE11bHRpcHJvY2Vzc29yIG1vZGUsIGluaXRpYWxpemUgdGhlIFVBUlQgcmVnaXN0ZXJzCisgICAgICAgIGJ5IGNhbGxpbmcgdGhlIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KCkgQVBJLgorCisgICAgKCMpIEZvciB0aGUgVUFSVCBSUzQ4NSBEcml2ZXIgRW5hYmxlZCBtb2RlLCBpbml0aWFsaXplIHRoZSBVQVJUIHJlZ2lzdGVycworICAgICAgICBieSBjYWxsaW5nIHRoZSBIQUxfUlM0ODVFeF9Jbml0KCkgQVBJLgorCisgICAgWy4uXQorICAgIChAKSBUaGVzZSBBUEkncyAoSEFMX1VBUlRfSW5pdCgpLCBIQUxfSGFsZkR1cGxleF9Jbml0KCksIEhBTF9MSU5fSW5pdCgpLCBIQUxfTXVsdGlQcm9jZXNzb3JfSW5pdCgpLAorICAgICAgICBhbHNvIGNvbmZpZ3VyZSB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpIGJ5CisgICAgICAgIGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VBUlRfTXNwSW5pdCgpIEFQSS4KKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQorICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCisKKyAgICBbLi5dCisgICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KKyAgICBGdW5jdGlvbiBAcmVmIEhBTF9VQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAorICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBbLi5dCisgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLgorICAgIEByZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICA6IEVycm9yIENhbGxiYWNrLgorICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgIDogQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgOiBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA6IEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgOiBXYWtldXAgQ2FsbGJhY2suCisgICAgKCspIFJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgOiBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2suCisgICAgKCspIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgOiBUeCBGaWZvIEVtcHR5IENhbGxiYWNrLgorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICAgIDogVUFSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVUFSVCBNc3BEZUluaXQuCisKKyAgICBbLi5dCisgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1VBUlRfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfVUFSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVUFSVF9UeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpLgorICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQorICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9VQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VQVJUX0RlSW5pdCgpIG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfVUFSVF9Jbml0KCkgYW5kIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VBUlRfU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KKyAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAorICAgIGluIEhBTF9VQVJUX1NUQVRFX1JFQURZIG9yIEhBTF9VQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1VBUlRfRGVJbml0KCkKKyAgICBvciBAcmVmIEhBTF9VQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUIFVBUlQKKyAgKiBAYnJpZWYgSEFMIFVBUlQgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRAorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVF9Qcml2YXRlX0NvbnN0YW50cyBVQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0ZJRUxEUyAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfT1ZFUjh8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX0ZJRk9FTiApKSAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVQVJUX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9DUjNfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjNfUlRTRSB8IFVTQVJUX0NSM19DVFNFIHwgVVNBUlRfQ1IzX09ORUJJVHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHICkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IzIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVQVJUX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBMUFVBUlRfQlJSX01JTiAgMHgwMDAwMDMwMFUgIC8qIExQVUFSVCBCUlIgbWluaW11bSBhdXRob3JpemVkIHZhbHVlICovCisjZGVmaW5lIExQVUFSVF9CUlJfTUFYICAweDAwMEZGRkZGVSAgLyogTFBVQVJUIEJSUiBtYXhpbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KKworI2RlZmluZSBVQVJUX0JSUl9NSU4gICAgMHgxMFUgICAgICAgIC8qIFVBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworI2RlZmluZSBVQVJUX0JSUl9NQVggICAgMHgwMDAwRkZGRlUgIC8qIFVBUlQgQlJSIG1heGltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVUFSVF9Qcml2YXRlX0Z1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFR4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFJ4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfOEJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9UeElTUl8xNkJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworc3RhdGljIHZvaWQgVUFSVF9SeElTUl8xNkJJVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfOEJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitzdGF0aWMgdm9pZCBVQVJUX1J4SVNSXzE2QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnMgVUFSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgVVNBUlR4IG9yIHRoZSBVQVJUeQorICAgIGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUgdGhlIHBhcmFtZXRlcnMgYmVsb3cgY2FuIGJlIGNvbmZpZ3VyZWQ6CisgICAgICAgICgrKykgQmF1ZCBSYXRlCisgICAgICAgICgrKykgV29yZCBMZW5ndGgKKyAgICAgICAgKCsrKSBTdG9wIEJpdAorICAgICAgICAoKyspIFBhcml0eTogSWYgdGhlIHBhcml0eSBpcyBlbmFibGVkLCB0aGVuIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIHdyaXR0ZW4KKyAgICAgICAgICAgICBpbiB0aGUgZGF0YSByZWdpc3RlciBpcyB0cmFuc21pdHRlZCBidXQgaXMgY2hhbmdlZCBieSB0aGUgcGFyaXR5IGJpdC4KKyAgICAgICAgKCsrKSBIYXJkd2FyZSBmbG93IGNvbnRyb2wKKyAgICAgICAgKCsrKSBSZWNlaXZlci90cmFuc21pdHRlciBtb2RlcworICAgICAgICAoKyspIE92ZXIgU2FtcGxpbmcgTWV0aG9kCisgICAgICAgICgrKykgT25lLUJpdCBTYW1wbGluZyBNZXRob2QKKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGNhbiBiZSBjb25maWd1cmVkIGFzIHdlbGw6CisgICAgICAgICgrKykgVFggYW5kL29yIFJYIHBpbiBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBkYXRhIGxvZ2ljYWwgbGV2ZWwgaW52ZXJzaW9uCisgICAgICAgICgrKykgUlggYW5kIFRYIHBpbnMgc3dhcAorICAgICAgICAoKyspIFJYIG92ZXJydW4gZGV0ZWN0aW9uIGRpc2FibGluZworICAgICAgICAoKyspIERNQSBkaXNhYmxpbmcgb24gUlggZXJyb3IKKyAgICAgICAgKCsrKSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lCisgICAgICAgICgrKykgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uCisgICAgWy4uXQorICAgIFRoZSBIQUxfVUFSVF9Jbml0KCksIEhBTF9IYWxmRHVwbGV4X0luaXQoKSwgSEFMX0xJTl9Jbml0KClhbmQgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKUFQSQorICAgIGZvbGxvdyByZXNwZWN0aXZlbHkgdGhlIFVBUlQgYXN5bmNocm9ub3VzLCBVQVJUIEhhbGYgZHVwbGV4LCBVQVJUIExJTiBtb2RlCisgICAgYW5kIFVBUlQgbXVsdGlwcm9jZXNzb3IgbW9kZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMgKGRldGFpbHMgZm9yIHRoZSBwcm9jZWR1cmVzCisgICAgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgIFRhYmxlIDEuIFVBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICAgVUFSVCBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+SW5pdC5Id0Zsb3dDdGwgIT0gVUFSVF9IV0NPTlRST0xfTk9ORSkKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSFdGTE9XX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgICAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8IChJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpOworICB9CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7CisKKyAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4sIEhEU0VMIGFuZCBJUkVOICBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgaGFsZi1kdXBsZXggbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSEFMRkRVUExFWF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBoYWxmLWR1cGxleCBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfSERTRUwpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIExJTiBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gQnJlYWtEZXRlY3RMZW5ndGggU3BlY2lmaWVzIHRoZSBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9MSU5CUkVBS0RFVEVDVExFTkdUSF8xMEIgMTAtYml0IGJyZWFrIGRldGVjdGlvbgorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0xJTkJSRUFLREVURUNUTEVOR1RIXzExQiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTElOX0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgQnJlYWtEZXRlY3RMZW5ndGgpCit7CisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBMSU4gVUFSVCBpbnN0YW5jZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIC8qIENoZWNrIHRoZSBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChCcmVha0RldGVjdExlbmd0aCkpOworCisgIC8qIExJTiBtb2RlIGxpbWl0ZWQgdG8gMTYtYml0IG92ZXJzYW1wbGluZyBvbmx5ICovCisgIGlmIChodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgPT0gVUFSVF9PVkVSU0FNUExJTkdfOCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogTElOIG1vZGUgbGltaXRlZCB0byA4LWJpdCBkYXRhIGxlbmd0aCAqLworICBpZiAoaHVhcnQtPkluaXQuV29yZExlbmd0aCAhPSBVQVJUX1dPUkRMRU5HVEhfOEIpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaHVhcnQtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChodWFydCk7CisKKyAgICBpZiAoaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OworICAgIH0KKworICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSyAqLworICAgIEhBTF9VQVJUX01zcEluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworICB9CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVBUlRfU2V0Q29uZmlnKGh1YXJ0KSA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgaWYgKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQgIT0gVUFSVF9BRFZGRUFUVVJFX05PX0lOSVQpCisgIHsKKyAgICBVQVJUX0FkdkZlYXR1cmVDb25maWcoaHVhcnQpOworICB9CisKKyAgLyogSW4gTElOIG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKKyAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAorICAtIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0NMS0VOKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTikpOworCisgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0xJTkVOKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIExJTiBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoLiAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTEJETCwgQnJlYWtEZXRlY3RMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIG11bHRpcHJvY2Vzc29yIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgKiAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gQWRkcmVzcyAgICAgIFVBUlQgbm9kZSBhZGRyZXNzICg0LSwgNi0sIDctIG9yIDgtYml0IGxvbmcpLgorICAqIEBwYXJhbSBXYWtlVXBNZXRob2QgU3BlY2lmaWVzIHRoZSBVQVJUIHdha2V1cCBtZXRob2QuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0lETEVMSU5FIFdha2VVcCBieSBhbiBpZGxlIGxpbmUgZGV0ZWN0aW9uCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQTUVUSE9EX0FERFJFU1NNQVJLIFdha2VVcCBieSBhbiBhZGRyZXNzIG1hcmsKKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBpZGxlIGxpbmUgZGV0ZWN0aW9uIHdha2UgdXAsIHRoZSBBZGRyZXNzIHBhcmFtZXRlcgorICAqICAgICAgICBpcyB1c2VsZXNzIGFuZCBpZ25vcmVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgSWYgdGhlIHVzZXIgcmVzb3J0cyB0byBhZGRyZXNzIG1hcmsgd2FrZSB1cCwgdGhlIGFkZHJlc3MgbGVuZ3RoIGRldGVjdGlvbgorICAqICAgICAgICBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQgdG8gNCBiaXRzIG9ubHkuIEZvciB0aGUgVUFSVCB0byBiZSBhYmxlIHRvCisgICogICAgICAgIG1hbmFnZSA2LSwgNy0gb3IgOC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uLCB0aGUgQVBJCisgICogICAgICAgIEhBTF9NdWx0aVByb2Nlc3NvckV4X0FkZHJlc3NMZW5ndGhfU2V0KCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgKiAgICAgICAgSEFMX011bHRpUHJvY2Vzc29yX0luaXQoKS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9Jbml0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgQWRkcmVzcywgdWludDMyX3QgV2FrZVVwTWV0aG9kKQoreworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgd2FrZSB1cCBtZXRob2QgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUE1FVEhPRChXYWtlVXBNZXRob2QpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLICovCisgICAgSEFMX1VBUlRfTXNwSW5pdChodWFydCk7CisjZW5kaWYgLyogKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCisgIH0KKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoVUFSVF9TZXRDb25maWcoaHVhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCAhPSBVQVJUX0FEVkZFQVRVUkVfTk9fSU5JVCkKKyAgeworICAgIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhodWFydCk7CisgIH0KKworICAvKiBJbiBtdWx0aXByb2Nlc3NvciBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYW5kIENMS0VOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlciwKKyAgLSBTQ0VOLCBIRFNFTCBhbmQgSVJFTiAgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOworCisgIGlmIChXYWtlVXBNZXRob2QgPT0gVUFSVF9XQUtFVVBNRVRIT0RfQUREUkVTU01BUkspCisgIHsKKyAgICAvKiBJZiBhZGRyZXNzIG1hcmsgd2FrZSB1cCBtZXRob2QgaXMgY2hvc2VuLCBzZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9BREQsICgodWludDMyX3QpQWRkcmVzcyA8PCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MpKTsKKyAgfQorCisgIC8qIFNldCB0aGUgd2FrZSB1cCBtZXRob2QgYnkgc2V0dGluZyB0aGUgV0FLRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfV0FLRSwgV2FrZVVwTWV0aG9kKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOworCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVUFSVF9DaGVja0lkbGVTdGF0ZShodWFydCkpOworfQorCisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9EZUluaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogQ2hlY2sgdGhlIFVBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1YXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKChJU19VQVJUX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpIHx8IChJU19MUFVBUlRfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSkpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICBodWFydC0+SW5zdGFuY2UtPkNSMSA9IDB4MFU7CisgIGh1YXJ0LT5JbnN0YW5jZS0+Q1IyID0gMHgwVTsKKyAgaHVhcnQtPkluc3RhbmNlLT5DUjMgPSAweDBVOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1VBUlRfTXNwRGVJbml0OworICB9CisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLworICBIQUxfVUFSVF9Nc3BEZUluaXQoaHVhcnQpOworI2VuZGlmIC8qIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLworCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CisKKyAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCBNU1AuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfTXNwSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVBUlQgTVNQLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX01zcERlSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHVhcnQgdWFydCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBVQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+VHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9BQk9SVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1dBS0VVUF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5XYWtldXBDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBVQVJUIENhbGxiYWNrCisgICogICAgICAgICBVQVJUIGNhbGxhYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGh1YXJ0IHVhcnQgaGFuZGxlCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfVFhfQ09NUExFVEVfQ0JfSUQgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX1JYX0hBTEZDT01QTEVURV9DQl9JRCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX0FCT1JUX0NPTVBMRVRFX0NCX0lEIEFib3J0IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9BQk9SVF9UUkFOU01JVF9DT01QTEVURV9DQl9JRCBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgV2FrZXVwIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgUnggRmlmbyBGdWxsIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVUFSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VQVJUX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VBUlRfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBpZiAoSEFMX1VBUlRfU1RBVEVfUkVBRFkgPT0gaHVhcnQtPmdTdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgIFR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5UeENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfRVJST1JfQ0JfSUQgOgorICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfVFJBTlNNSVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayA9IEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfQUJPUlRfUkVDRUlWRV9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgPSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9XQUtFVVBfQ0JfSUQgOgorICAgICAgICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgPSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9IEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrOyAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX1RYX0ZJRk9fRU1QVFlfQ0JfSUQgOgorICAgICAgICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBodWFydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdENhbGxiYWNrICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9VQVJUX1NUQVRFX1JFU0VUID09IGh1YXJ0LT5nU3RhdGUpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVUFSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1YXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgVUFSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgVUFSVCBhc3luY2hyb25vdXMKKyAgICBhbmQgSGFsZiBkdXBsZXggZGF0YSB0cmFuc2ZlcnMuCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KKyAgICAgICAoKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCisgICAgICAgICAgIG9yIERNQSwgVGhlc2UgQVBJJ3MgcmV0dXJuIHRoZSBIQUwgc3RhdHVzLgorICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgZGVkaWNhdGVkIFVBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICB1c2luZyBETUEgbW9kZS4KKyAgICAgICAgICAgVGhlIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgUmVjZWl2ZSBwcm9jZXNzCisgICAgICAgICAgIFRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCl1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQKKworICAgICgjKSBCbG9ja2luZyBtb2RlIEFQSSdzIGFyZSA6CisgICAgICAgICgrKSBIQUxfVUFSVF9UcmFuc21pdCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9SZWNlaXZlKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9JUlFIYW5kbGVyKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmUgOgorICAgICAgICAoKykgSEFMX1VBUlRfVHJhbnNtaXRfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1JlY2VpdmVfRE1BKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVBhdXNlKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0RNQVJlc3VtZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9ETUFTdG9wKCkKKworICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbl9CbG9ja2luZyBtb2RlOgorICAgICAgICAoKykgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkKKworICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMgY291bGQgYmUgYWJvcnRlZCB1c2luZyBBYm9ydCBBUEkncyA6CisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZSgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydF9JVCgpCisgICAgICAgICgrKSBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0X0lUKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCgpCisKKyAgICAoIykgRm9yIEFib3J0IHNlcnZpY2VzIGJhc2VkIG9uIGludGVycnVwdHMgKEhBTF9VQVJUX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgYW5kIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVUFSVCBzaWRlLgorICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgKCspIEVycm9yIGlzIGNvbnNpZGVyZWQgYXMgQmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIHByb3Blcmx5IGFuZCBpcyBhYm9ydGVkLgorICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4KKworICAgIC1ALSBJbiB0aGUgSGFsZiBkdXBsZXggY29tbXVuaWNhdGlvbiwgaXQgaXMgZm9yYmlkZGVuIHRvIHJ1biB0aGUgdHJhbnNtaXQKKyAgICAgICAgYW5kIHJlY2VpdmUgcHJvY2VzcyBpbiBwYXJhbGxlbCwgdGhlIFVBUlQgc3RhdGUgSEFMX1VBUlRfU1RBVEVfQlVTWV9UWF9SWCBjYW4ndCBiZSB1c2VmdWwuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgV2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCwgd3JpdGluZyBhIGRhdGEgaW4gdGhlIFREUiByZWdpc3RlciBhZGRzIG9uZQorICAqICAgICAgIGRhdGEgdG8gdGhlIFRYRklGTy4gV3JpdGUgb3BlcmF0aW9ucyB0byB0aGUgVERSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQKKyAgKiAgICAgICB3aGVuIFRYRk5GIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBUWEZORiBmbGFnIGFuZAorICAqICAgICAgIFRYRSBhcmUgbWFwcGVkIG9uIHRoZSBzYW1lIGJpdC1maWVsZC4KKyAgKiBAcGFyYW0gaHVhcnQgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICAgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1RyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnBkYXRhMTZiaXRzOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgICAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKKyAgICAgIHBkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBEYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBwRGF0YTsKKyAgICAgIHBkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoaHVhcnQtPlR4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVUFSVF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisgICAgICBpZiAocGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnBkYXRhMTZiaXRzICYgMHgwMUZGVSk7CisgICAgICAgIHBkYXRhMTZiaXRzKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwZGF0YThiaXRzICYgMHhGRlUpOworICAgICAgICBwZGF0YThiaXRzKys7CisgICAgICB9CisgICAgICBodWFydC0+VHhYZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfVEMsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkLCB0aGUgUlhGTkUgZmxhZyBpcyBzZXQgYXMgbG9uZyBhcyB0aGUgUlhGSUZPCisgICogICAgICAgaXMgbm90IGVtcHR5LiBSZWFkIG9wZXJhdGlvbnMgZnJvbSB0aGUgUkRSIHJlZ2lzdGVyIGFyZSBwZXJmb3JtZWQgd2hlbgorICAqICAgICAgIFJYRk5FIGZsYWcgaXMgc2V0LiBGcm9tIGhhcmR3YXJlIHBlcnNwZWN0aXZlLCBSWEZORSBmbGFnIGFuZAorICAqICAgICAgIFJYTkUgYXJlIG1hcHBlZCBvbiB0aGUgc2FtZSBiaXQtZmllbGQuCisgICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnBkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwZGF0YTE2Yml0czsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVhcnQtPlJ4WGZlclNpemUgID0gU2l6ZTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSBTaXplOworCisgICAgLyogQ29tcHV0YXRpb24gb2YgVUFSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVBUlRfTUFTS19DT01QVVRBVElPTihodWFydCk7CisgICAgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcGRhdGExNmJpdHMgPSAodWludDE2X3QgKikgcERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwZGF0YThiaXRzICA9IHBEYXRhOworICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFzIGxvbmcgYXMgZGF0YSBoYXZlIHRvIGJlIHJlY2VpdmVkICovCisgICAgd2hpbGUgKGh1YXJ0LT5SeFhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwZGF0YThiaXRzID09IE5VTEwpCisgICAgICB7CisgICAgICAgICpwZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICBwZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqcGRhdGE4Yml0cyA9ICh1aW50OF90KShodWFydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KXVoTWFzayk7CisgICAgICAgIHBkYXRhOGJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+cFR4QnVmZlB0ciAgPSBwRGF0YTsKKyAgICBodWFydC0+VHhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVhcnQtPlR4SVNSICAgICAgID0gTlVMTDsKKworICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogQ29uZmlndXJlIFR4IGludGVycnVwdCBwcm9jZXNzaW5nICovCisgICAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodWFydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF85QikgJiYgKGh1YXJ0LT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl8xNkJJVF9GSUZPRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5UeElTUiA9IFVBUlRfVHhJU1JfOEJJVF9GSUZPRU47CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodWFydC0+VHhJU1IgPSBVQVJUX1R4SVNSXzE2QklUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodWFydC0+VHhJU1IgPSBVQVJUX1R4SVNSXzhCSVQ7CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UWEVJRV9UWEZORklFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVjZWl2ZV9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgbm90IGFscmVhZHkgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+cFJ4QnVmZlB0ciAgPSBwRGF0YTsKKyAgICBodWFydC0+UnhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVhcnQtPlJ4SVNSICAgICAgID0gTlVMTDsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVBUlQgbWFzayB0byBhcHBseSB0byBSRFIgcmVnaXN0ZXIgKi8KKyAgICBVQVJUX01BU0tfQ09NUFVUQVRJT04oaHVhcnQpOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIENvbmZpZ3VyZSBSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyovCisgICAgaWYgKChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpICYmIChTaXplID49IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpCisgICAgeworICAgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodWFydC0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfMTZCSVRfRklGT0VOOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVRfRklGT0VOOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIGludGVycnVwdCBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzE2QklUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IgPSBVQVJUX1J4SVNSXzhCSVQ7CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG5vdCBhbHJlYWR5IG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+cFR4QnVmZlB0ciAgPSBwRGF0YTsKKyAgICBodWFydC0+VHhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWDsKKworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFVBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFUeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVQVJUX0RNQUVycm9yOworCisgICAgICAvKiBTZXQgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh1YXJ0LT5oZG1hdHgsICh1aW50MzJfdClodWFydC0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlREUiwgU2l6ZSkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIHJlYWR5ICovCisgICAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0KKyAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1RDRik7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBVQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbgorICAqICAgICAgICAgdGhlIHBhcml0eSBiaXQgKE1TQiBwb3NpdGlvbikuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1JlY2VpdmVfRE1BKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQoreworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodWFydC0+UnhTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gcERhdGE7CisgICAgaHVhcnQtPlJ4WGZlclNpemUgPSBTaXplOworCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYOworCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gVUFSVF9ETUFSZWNlaXZlQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVBUlRfRE1BUnhIYWxmQ3BsdDsKKworICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVUFSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLworICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHVhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodWFydC0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWh1YXJ0LT5wUnhCdWZmUHRyLCBTaXplKSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgICAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gcmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgICAgLyogRW5hYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgaW4gdGhlIFVBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BUGF1c2UoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKGdzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgfQorICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpICYmCisgICAgICAocnhzdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1JYKSkKKyAgeworICAgIC8qIERpc2FibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgUmVzdW1lIHRoZSBETUEgVHJhbnNmZXIuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRE1BUmVzdW1lKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisgIH0KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgT3ZlcnJ1biBmbGFnIGJlZm9yZSByZXN1bWluZyB0aGUgUnggdHJhbnNmZXIgKi8KKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAvKiBSZWVuYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9ETUFTdG9wKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVUFSVCBBUEkgdW5kZXIgY2FsbGJhY2tzIEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrKCkgLyBIQUxfVUFSVF9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIC8gSEFMX1VBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOgorICAgICBpbmRlZWQsIHdoZW4gSEFMX0RNQV9BYm9ydCgpIEFQSSBpcyBjYWxsZWQsIHRoZSBETUEgVFgvUlggVHJhbnNmZXIgb3IgSGFsZiBUcmFuc2ZlciBjb21wbGV0ZQorICAgICBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGlmIHRoZSBETUEgdHJhbnNmZXIgaW50ZXJydXB0aW9uIG9jY3VycyBhdCB0aGUgbWlkZGxlIG9yIGF0IHRoZSBlbmQgb2YKKyAgICAgdGhlIHN0cmVhbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkLiAqLworCisgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiBnc3RhdGUgPSBodWFydC0+Z1N0YXRlOworICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgcnhzdGF0ZSA9IGh1YXJ0LT5SeFN0YXRlOworCisgIC8qIFN0b3AgVUFSVCBETUEgVHggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkgJiYKKyAgICAgIChnc3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsICovCisgICAgaWYgKGh1YXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBVQVJUX0VuZFR4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgLyogU3RvcCBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIG9uZ29pbmcgKi8KKyAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSAmJgorICAgICAgKHJ4c3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBVQVJUX0VuZFJ4VHJhbnNmZXIoaHVhcnQpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBUWEUsIFRDLCBSWE5FLCBQRSwgUlhGVCwgVFhGVCBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hcngpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLworICBpZiAoaHVhcnQtPkZpZm9Nb2RlID09IFVBUlRfRklGT01PREVfRU5BQkxFKQorICB7CisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KKworICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSBhbmQgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBIYW5kbGUgRXJyb3JDb2RlIHRvIE5vIEVycm9yICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyBUcmFuc21pdCB0cmFuc2ZlciAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGNvdWxkIGJlIHVzZWQgZm9yIGFib3J0aW5nIGFueSBvbmdvaW5nIFR4IHRyYW5zZmVyIHN0YXJ0ZWQgaW4gSW50ZXJydXB0IG9yIERNQSBtb2RlLgorICAqICAgICAgICAgVGhpcyBwcm9jZWR1cmUgcGVyZm9ybXMgZm9sbG93aW5nIG9wZXJhdGlvbnMgOgorICAqICAgICAgICAgICAtIERpc2FibGUgVUFSVCBJbnRlcnJ1cHRzIChUeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgVENJRSwgVFhFSUUgYW5kIFRYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVElFKTsKKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayB0byBOdWxsLgorICAgICAgICAgTm8gY2FsbCBiYWNrIGV4ZWN1dGlvbiBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1YXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgIHsKKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorCisgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKGJsb2NraW5nIG1vZGUpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyBSeCB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVBUlQgSW50ZXJydXB0cyAoUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUEVJRSwgRUlFLCBSWE5FSUUgYW5kIFJYRlRJRSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UQ0lFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfVFhGVElFKSk7CisKKyAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBVQVJUIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgLyogU2V0IERNQSBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjayBpZiBVQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFUeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkLgorICAgICAgIE90aGVyd2lzZSwgc2V0IGl0IHRvIE5VTEwgKi8KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BUnhBYm9ydENhbGxiYWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIC8qIERpc2FibGUgRE1BIFR4IGF0IFVBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVBUlQgVHggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhYm9ydGNwbHQgPSAwVTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsIDogdXNlIG5vbiBibG9ja2luZyBETUEgQWJvcnQgQVBJIChjYWxsYmFjaykgKi8KKyAgICBpZiAoaHVhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVBUlQgUnggRE1BIEFib3J0IGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGlzZWQgOgorICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1VBUlRfQWJvcnRDcGx0Q2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBhYm9ydGNwbHQgPSAxVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm8gRE1BIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbiBpcyByZXF1aXJlZCA9PiBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaWYgKGFib3J0Y3BsdCA9PSAxVSkKKyAgeworICAgIC8qIFJlc2V0IFR4IGFuZCBSeCB0cmFuc2ZlciBjb3VudGVycyAqLworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKyAgICBodWFydC0+VHhJU1IgPSBOVUxMOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgICAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBEaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAvKiBSZXN0b3JlIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSAgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEFib3J0IG9uZ29pbmcgVHJhbnNtaXQgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgVHggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFR4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworCisgIC8qIERpc2FibGUgdGhlIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgeworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVQVJUIERNQSBBYm9ydCBjYWxsYmFjayA6CisgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVBUlRfRE1BVHhPbmx5QWJvcnRDYWxsYmFjazsKKworICAgICAgLyogQWJvcnQgRE1BIFRYICovCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBodWFydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXR4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlc2V0IFR4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgICAgaHVhcnQtPlR4SVNSID0gTlVMTDsKKworICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodWFydC0+QWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBSZXNldCBUeCB0cmFuc2ZlciBjb3VudGVyICovCisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBDbGVhciBUeElTUiBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKyAgICAvKiBGbHVzaCB0aGUgd2hvbGUgVFggRklGTyAoaWYgbmVlZGVkKSAqLworICAgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9FTkFCTEUpCisgICAgeworICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgfQorCisgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFRyYW5zbWl0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIFJlY2VpdmUgdHJhbnNmZXIgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgUnggdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVQVJUIEludGVycnVwdHMgKFJ4KQorICAqICAgICAgICAgICAtIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBpbiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlciAoaWYgZW5hYmxlZCkKKyAgKiAgICAgICAgICAgLSBBYm9ydCBETUEgdHJhbnNmZXIgYnkgY2FsbGluZyBIQUxfRE1BX0Fib3J0X0lUIChpbiBjYXNlIG9mIHRyYW5zZmVyIGluIERNQSBtb2RlKQorICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKKyAgKiAgICAgICAgICAgLSBBdCBhYm9ydCBjb21wbGV0aW9uLCBjYWxsIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCisgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBlbmFibGVkICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICB7CisgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVUFSVCBETUEgUnggY2hhbm5lbCA6IHVzZSBub24gYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAoY2FsbGJhY2spICovCisgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gVUFSVF9ETUFSeE9ubHlBYm9ydENhbGxiYWNrOworCisgICAgICAvKiBBYm9ydCBETUEgUlggKi8KKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGh1YXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgIGh1YXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrKGh1YXJ0LT5oZG1hcngpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzZXQgUnggdHJhbnNmZXIgY291bnRlciAqLworICAgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1YXJ0LT5wUnhCdWZmUHRyID0gTlVMTDsKKworICAgICAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIEFzIG5vIERNQSB0byBiZSBhYm9ydGVkLCBjYWxsIGRpcmVjdGx5IHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1YXJ0LT5BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgUmVjZWl2ZSBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFJlc2V0IFJ4IHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBodWFydC0+cFJ4QnVmZlB0ciA9IE5VTEw7CisKKyAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9PUkVGIHwgVUFSVF9DTEVBUl9ORUYgfCBVQVJUX0NMRUFSX1BFRiB8IFVBUlRfQ0xFQVJfRkVGKTsKKworICAgIC8qIFJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogQXMgbm8gRE1BIHRvIGJlIGFib3J0ZWQsIGNhbGwgZGlyZWN0bHkgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSGFuZGxlIFVBUlQgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBIQUxfVUFSVF9JUlFIYW5kbGVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IGlzcmZsYWdzICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPklTUik7CisgIHVpbnQzMl90IGNyMWl0cyAgICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IGNyM2l0cyAgICAgPSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMyk7CisKKyAgdWludDMyX3QgZXJyb3JmbGFnczsKKyAgdWludDMyX3QgZXJyb3Jjb2RlOworCisgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGlmIChlcnJvcmZsYWdzID09IDBVKQorICB7CisgICAgLyogVUFSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpCisgICAgeworICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodWFydC0+UnhJU1IoaHVhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKChjcjNpdHMgJiAoVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19FSUUpKSAhPSAwVSkKKyAgICAgICAgICAgfHwgKChjcjFpdHMgJiAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKSAhPSAwVSkpKSkKKyAgeworICAgIC8qIFVBUlQgcGFyaXR5IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9QRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1BFSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfUEVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9QRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIGZyYW1lIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfRkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9GRTsKKyAgICB9CisKKyAgICAvKiBVQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfTkVGKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVQVJUIE92ZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfT1JFKSAhPSAwVSkKKyAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkgfHwKKyAgICAgICAgICAgICgoY3IzaXRzICYgKFVTQVJUX0NSM19SWEZUSUUgfCBVU0FSVF9DUjNfRUlFKSkgIT0gMFUpKSkKKyAgICB7CisgICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRik7CisKKyAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfT1JFOworICAgIH0KKworICAgIC8qIENhbGwgVUFSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKGh1YXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VBUlRfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkVfUlhGTkUpICE9IDBVKQorICAgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1JYRlRJRSkgIT0gMFUpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGh1YXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaHVhcnQtPlJ4SVNSKGh1YXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBJZiBPdmVycnVuIGVycm9yIG9jY3Vycywgb3IgaWYgYW55IGVycm9yIG9jY3VycyBpbiBETUEgbW9kZSByZWNlcHRpb24sCisgICAgICAgICBjb25zaWRlciBlcnJvciBhcyBibG9ja2luZyAqLworICAgICAgZXJyb3Jjb2RlID0gaHVhcnQtPkVycm9yQ29kZTsKKyAgICAgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgfHwKKyAgICAgICAgICAoKGVycm9yY29kZSAmIEhBTF9VQVJUX0VSUk9SX09SRSkgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBVQVJUIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MsCisgICAgICAgICAgIERpc2FibGUgUnggSW50ZXJydXB0cywgYW5kIGRpc2FibGUgUnggRE1BIHJlcXVlc3QsIGlmIG9uZ29pbmcgKi8KKyAgICAgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgICAgIHsKKyAgICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVQVJUIERNQSBSeCBjaGFubmVsICovCisgICAgICAgICAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIFVBUlQgRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLworICAgICAgICAgICAgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVQVJUX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodWFydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHVhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICAgICAgICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhodWFydC0+aGRtYXJ4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGwgdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICAgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vbiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGNvdWxkIGdvIG9uLgorICAgICAgICAgICBFcnJvciBpcyBub3RpZmllZCB0byB1c2VyIHRocm91Z2ggdXNlciBlcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaHVhcnQtPkVycm9yQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX1VBUlRfRXJyb3JDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCisgIH0gLyogRW5kIGlmIHNvbWUgZXJyb3Igb2NjdXJzICovCisKKyAgLyogVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1dVRikgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX1dVRklFKSAhPSAwVSkpCisgIHsKKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfV1VGKTsKKworICAgIC8qIFVBUlQgUnggc3RhdGUgaXMgbm90IHJlc2V0IGFzIGEgcmVjZXB0aW9uIHByb2Nlc3MgbWlnaHQgYmUgb25nb2luZy4KKyAgICAgICBJZiBVQVJUIGhhbmRsZSBzdGF0ZSBmaWVsZHMgbmVlZCB0byBiZSByZXNldCB0byBSRUFEWSwgdGhpcyBjb3VsZCBiZSBkb25lIGluIFdha2V1cCBjYWxsYmFjayAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgV2FrZXVwIENhbGxiYWNrICovCisgICAgaHVhcnQtPldha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBXYWtldXAgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRV9UWEZORikgIT0gMFUpCisgICAgICAmJiAoKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkgIT0gMFUpCisgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfVFhGVElFKSAhPSAwVSkpKQorICB7CisgICAgaWYgKGh1YXJ0LT5UeElTUiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGh1YXJ0LT5UeElTUihodWFydCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAodHJhbnNtaXNzaW9uIGVuZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UQykgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RDSUUpICE9IDBVKSkKKyAgeworICAgIFVBUlRfRW5kVHJhbnNtaXRfSVQoaHVhcnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFVBUlQgVFggRmlmbyBFbXB0eSBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhGRSkgIT0gMFUpICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRkVJRSkgIT0gMFUpKQorICB7CisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBUeCBGaWZvIEVtcHR5IENhbGxiYWNrICovCisgICAgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisKKyAgLyogVUFSVCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYRkYpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWEZGSUUpICE9IDBVKSkKKyAgeworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIEhBTF9VQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9UeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFVBUlQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1YXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBBYm9ydCBSZWNlaXZlIENvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFVBUlQgY29udHJvbCBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgVUFSVC4KKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbmFibGVNdXRlTW9kZSgpIEFQSSBlbmFibGVzIG11dGUgbW9kZQorICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgpIEFQSSBkaXNhYmxlcyBtdXRlIG1vZGUKKyAgICAgKCspIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKCkgQVBJIGVudGVycyBtdXRlIG1vZGUKKyAgICAgKCspIFVBUlRfU2V0Q29uZmlnKCkgQVBJIGNvbmZpZ3VyZXMgdGhlIFVBUlQgcGVyaXBoZXJhbAorICAgICAoKykgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKCkgQVBJIG9wdGlvbmFsbHkgY29uZmlndXJlcyB0aGUgVUFSVCBhZHZhbmNlZCBmZWF0dXJlcworICAgICAoKykgVUFSVF9DaGVja0lkbGVTdGF0ZSgpIEFQSSBlbnN1cmVzIHRoYXQgVEVBQ0sgYW5kL29yIFJFQUNLIGFyZSBzZXQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgKCspIEhBTF9IYWxmRHVwbGV4X0VuYWJsZVRyYW5zbWl0dGVyKCkgQVBJIGRpc2FibGVzIHJlY2VpdmVyIGFuZCBlbmFibGVzIHRyYW5zbWl0dGVyCisgICAgICgrKSBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcigpIEFQSSBkaXNhYmxlcyB0cmFuc21pdHRlciBhbmQgZW5hYmxlcyByZWNlaXZlcgorICAgICAoKykgSEFMX0xJTl9TZW5kQnJlYWsoKSBBUEkgdHJhbnNtaXRzIHRoZSBicmVhayBjaGFyYWN0ZXJzCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBVQVJUIGluIG11dGUgbW9kZSAoZG9lcyBub3QgbWVhbiBVQVJUIGVudGVycyBtdXRlIG1vZGU7CisgICogICAgICAgICB0byBlbnRlciBtdXRlIG1vZGUsIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKCkgQVBJIG11c3QgYmUgY2FsbGVkKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIEVuYWJsZSBVU0FSVCBtdXRlIG1vZGUgYnkgc2V0dGluZyB0aGUgTU1FIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9NTUUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFVBUlQgbXV0ZSBtb2RlIChkb2VzIG5vdCBtZWFuIHRoZSBVQVJUIGFjdHVhbGx5IGV4aXRzIG11dGUgbW9kZQorICAqICAgICAgICAgYXMgaXQgbWF5IG5vdCBoYXZlIGJlZW4gaW4gbXV0ZSBtb2RlIGF0IHRoaXMgdmVyeSBtb21lbnQpLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBNTUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfTU1FKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBFbnRlciBVQVJUIG11dGUgbW9kZSAobWVhbnMgVUFSVCBhY3R1YWxseSBlbnRlcnMgbXV0ZSBtb2RlKS4KKyAgKiBAbm90ZSAgVG8gZXhpdCBmcm9tIG11dGUgbW9kZSwgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZSgpIEFQSSBtdXN0IGJlIGNhbGxlZC4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9NdWx0aVByb2Nlc3Nvcl9FbnRlck11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfTVVURV9NT0RFX1JFUVVFU1QpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgVUFSVCB0cmFuc21pdHRlciBhbmQgZGlzYWJsZSB0aGUgVUFSVCByZWNlaXZlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpOworCisgIC8qIEVuYWJsZSB0aGUgVVNBUlQncyB0cmFuc21pdCBpbnRlcmZhY2UgYnkgc2V0dGluZyB0aGUgVEUgYml0IGluIHRoZSBVU0FSVCBDUjEgcmVnaXN0ZXIgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RFKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIHJlY2VpdmVyIGFuZCBkaXNhYmxlIHRoZSBVQVJUIHRyYW5zbWl0dGVyLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzLgorICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlUmVjZWl2ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIENsZWFyIFRFIGFuZCBSRSBiaXRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpOworCisgIC8qIEVuYWJsZSB0aGUgVVNBUlQncyByZWNlaXZlIGludGVyZmFjZSBieSBzZXR0aW5nIHRoZSBSRSBiaXQgaW4gdGhlIFVTQVJUIENSMSByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGJyZWFrIGNoYXJhY3RlcnMuCisgICogQHBhcmFtICBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MSU5fU2VuZEJyZWFrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0xJTl9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9TRU5EQlJFQUtfUkVRVUVTVCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAqICBAYnJpZWYgICBVQVJUIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBSZXR1cm4gdGhlIFVBUlQgaGFuZGxlIHN0YXRlLgorICAgICAgKCspIFJldHVybiB0aGUgVUFSVCBoYW5kbGUgZXJyb3IgY29kZQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQuCisgICogQHJldHZhbCBIQUwgc3RhdGUKKyAgKi8KK0hBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MzJfdCB0ZW1wMSwgdGVtcDI7CisgIHRlbXAxID0gaHVhcnQtPmdTdGF0ZTsKKyAgdGVtcDIgPSBodWFydC0+UnhTdGF0ZTsKKworICByZXR1cm4gKEhBTF9VQVJUX1N0YXRlVHlwZURlZikodGVtcDEgfCB0ZW1wMik7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBVQVJUIGhhbmRsZSBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4KKyAgKiBAcmV0dmFsIFVBUlQgRXJyb3IgQ29kZQorKi8KK3VpbnQzMl90IEhBTF9VQVJUX0dldEVycm9yKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHJldHVybiBodWFydC0+RXJyb3JDb2RlOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVBUlQgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgbm9uZQorICAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVBUlRfSW5pdENhbGxiYWNrc1RvRGVmYXVsdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBJbml0IHRoZSBVQVJUIENhbGxiYWNrIHNldHRpbmdzICovCisgIGh1YXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgID0gSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodWFydC0+VHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VQVJUX1R4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgKi8KKyAgaHVhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVUFSVF9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAvKiBMZWdhY3kgd2VhayBSeEhhbGZDcGx0Q2FsbGJhY2sgICAgICAgICovCisgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayAgICAgICAgICAgID0gSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodWFydC0+RXJyb3JDYWxsYmFjayAgICAgICAgICAgICA9IEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgKi8KKyAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLworICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKyAgaHVhcnQtPldha2V1cENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrOyAgICAgICAgICAvKiBMZWdhY3kgd2VhayBXYWtldXBDYWxsYmFjayAgICAgICAgICAgICovCisgIGh1YXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgICAgICAgID0gSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICBodWFydC0+VHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA9IEhBTF9VQVJURXhfVHhGaWZvRW1wdHlDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIFR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgKi8KKworfQorI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfU2V0Q29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IHRtcHJlZzsKKyAgdWludDE2X3QgYnJydGVtcDsKKyAgVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2U7CisgIHVpbnQzMl90IHVzYXJ0ZGl2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMFU7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgID0gSEFMX09LOworICB1aW50MzJfdCBscHVhcnRfa2VyX2NrX3ByZXMgICAgICAgICA9IDB4MDAwMDAwMDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0JBVURSQVRFKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dPUkRfTEVOR1RIKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGgpKTsKKyAgaWYgKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVUFSVF9TVE9QQklUUyhodWFydC0+SW5pdC5TdG9wQml0cykpOworICB9CisgIGVsc2UKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX1NUT1BCSVRTKGh1YXJ0LT5Jbml0LlN0b3BCaXRzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT05FX0JJVF9TQU1QTEUoaHVhcnQtPkluaXQuT25lQml0U2FtcGxpbmcpKTsKKyAgfQorCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1BBUklUWShodWFydC0+SW5pdC5QYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTU9ERShodWFydC0+SW5pdC5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChodWFydC0+SW5pdC5Id0Zsb3dDdGwpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlNBTVBMSU5HKGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZykpOworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9QUkVTQ0FMRVIoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUsIFJFIGFuZCBPVkVSOCBiaXRzIGFuZCBjb25maWd1cmUKKyAgKiAgdGhlIFVBUlQgV29yZCBMZW5ndGgsIFBhcml0eSwgTW9kZSBhbmQgb3ZlcnNhbXBsaW5nOgorICAqICBzZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaHVhcnQtPkluaXQuV29yZExlbmd0aCB2YWx1ZQorICAqICBzZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5QYXJpdHkgdmFsdWUKKyAgKiAgc2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5Nb2RlIHZhbHVlCisgICogIHNldCBPVkVSOCBiaXQgYWNjb3JkaW5nIHRvIGh1YXJ0LT5Jbml0Lk92ZXJTYW1wbGluZyB2YWx1ZSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuV29yZExlbmd0aCB8IGh1YXJ0LT5Jbml0LlBhcml0eSB8IGh1YXJ0LT5Jbml0Lk1vZGUgfCBodWFydC0+SW5pdC5PdmVyU2FtcGxpbmcgOworICB0bXByZWcgfD0gKHVpbnQzMl90KWh1YXJ0LT5GaWZvTW9kZTsKKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIHRoZSBVQVJUIFN0b3AgQml0czogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nCisgICogdG8gaHVhcnQtPkluaXQuU3RvcEJpdHMgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NUT1AsIGh1YXJ0LT5Jbml0LlN0b3BCaXRzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlCisgICogLSBVQVJUIEhhcmRXYXJlIEZsb3cgQ29udHJvbDogc2V0IENUU0UgYW5kIFJUU0UgYml0cyBhY2NvcmRpbmcKKyAgKiAgIHRvIGh1YXJ0LT5Jbml0Lkh3Rmxvd0N0bCB2YWx1ZQorICAqIC0gb25lLWJpdCBzYW1wbGluZyBtZXRob2QgdmVyc3VzIHRocmVlIHNhbXBsZXMnIG1ham9yaXR5IHJ1bGUgYWNjb3JkaW5nCisgICogICB0byBodWFydC0+SW5pdC5PbmVCaXRTYW1wbGluZyAobm90IGFwcGxpY2FibGUgdG8gTFBVQVJUKSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVhcnQtPkluaXQuSHdGbG93Q3RsOworCisgIGlmICghKFVBUlRfSU5TVEFOQ0VfTE9XUE9XRVIoaHVhcnQpKSkKKyAgeworICAgIHRtcHJlZyB8PSBodWFydC0+SW5pdC5PbmVCaXRTYW1wbGluZzsKKyAgfQorICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZQorICAqIC0gVUFSVCBDbG9jayBQcmVzY2FsZXIgOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlciB2YWx1ZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UFJFU0MsIFVTQVJUX1BSRVNDX1BSRVNDQUxFUiwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBVQVJUX0dFVENMT0NLU09VUkNFKGh1YXJ0LCBjbG9ja3NvdXJjZSk7CisKKyAgLyogQ2hlY2sgTFBVQVJUIGluc3RhbmNlICovCisgIGlmIChVQVJUX0lOU1RBTkNFX0xPV1BPV0VSKGh1YXJ0KSkKKyAgeworICAgIC8qIFJldHJpZXZlIGZyZXF1ZW5jeSBjbG9jayAqLworICAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCisgICAgeworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoKHVpbnQzMl90KUhTSV9WQUxVRSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICBscHVhcnRfa2VyX2NrX3ByZXMgPSAoKHVpbnQzMl90KUxTRV9WQUxVRSAvIFVBUlRfR0VUX0RJVl9GQUNUT1IoaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGlmIHByb3BlciBjbG9jayBzb3VyY2UgcmVwb3J0ZWQgKi8KKyAgICBpZiAobHB1YXJ0X2tlcl9ja19wcmVzICE9IDBVKQorICAgIHsKKyAgICAgIC8qIGVuc3VyZSB0aGF0IEZyZXF1ZW5jeSBjbG9jayBpcyBpbiB0aGUgcmFuZ2UgWzMgKiBiYXVkcmF0ZSwgNDA5NiAqIGJhdWRyYXRlXSAqLworICAgICAgaWYgKChscHVhcnRfa2VyX2NrX3ByZXMgPCAoM1UgKiBodWFydC0+SW5pdC5CYXVkUmF0ZSkpIHx8CisgICAgICAgICAgKGxwdWFydF9rZXJfY2tfcHJlcyA+ICg0MDk2VSAqIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSkpCisgICAgICB7CisgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMToKKyAgICAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX0xQVUFSVChIU0lfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVQVJUX0RJVl9MUFVBUlQoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVBUlRfRElWX0xQVUFSVChMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogSXQgaXMgZm9yYmlkZGVuIHRvIHdyaXRlIHZhbHVlcyBsb3dlciB0aGFuIDB4MzAwIGluIHRoZSBMUFVBUlRfQlJSIHJlZ2lzdGVyICovCisgICAgICAgIGlmICgodXNhcnRkaXYgPj0gTFBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBMUFVBUlRfQlJSX01BWCkpCisgICAgICAgIHsKKyAgICAgICAgICBodWFydC0+SW5zdGFuY2UtPkJSUiA9IHVzYXJ0ZGl2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfSAvKiAgIGlmICggKGxwdWFydF9rZXJfY2tfcHJlcyA8ICgzICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpICkgfHwgKGxwdWFydF9rZXJfY2tfcHJlcyA+ICg0MDk2ICogaHVhcnQtPkluaXQuQmF1ZFJhdGUpICkpICovCisgICAgfSAvKiBpZiAobHB1YXJ0X2tlcl9ja19wcmVzICE9IDApICovCisgIH0KKyAgLyogQ2hlY2sgVUFSVCBPdmVyIFNhbXBsaW5nIHRvIHNldCBCYXVkIFJhdGUgUmVnaXN0ZXIgKi8KKyAgZWxzZSBpZiAoaHVhcnQtPkluaXQuT3ZlclNhbXBsaW5nID09IFVBUlRfT1ZFUlNBTVBMSU5HXzgpCisgIHsKKyAgICBzd2l0Y2ggKGNsb2Nrc291cmNlKQorICAgIHsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFBDTEsyRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhTSV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfTFNFOgorICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KExTRV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBVU0FSVERJViBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwZDE2ICovCisgICAgaWYgKCh1c2FydGRpdiA+PSBVQVJUX0JSUl9NSU4pICYmICh1c2FydGRpdiA8PSBVQVJUX0JSUl9NQVgpKQorICAgIHsKKyAgICAgIGJycnRlbXAgPSAodWludDE2X3QpKHVzYXJ0ZGl2ICYgMHhGRkYwVSk7CisgICAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+QlJSID0gYnJydGVtcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgICB7CisgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzJGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlLCBodWFydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9IU0k6CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhTSV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUsIGh1YXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0xTRToKKyAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoTFNFX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSwgaHVhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgKi8KKyAgICBpZiAoKHVzYXJ0ZGl2ID49IFVBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVBUlRfQlJSX01BWCkpCisgICAgeworICAgICAgaHVhcnQtPkluc3RhbmNlLT5CUlIgPSB1c2FydGRpdjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovCisgIGh1YXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA9IDE7CisgIGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA9IDE7CisKKyAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisgIGh1YXJ0LT5UeElTUiA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVUFSVCBwZXJpcGhlcmFsIGFkdmFuY2VkIGZlYXR1cmVzLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNldCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0byBjb25maWd1cmUgaXMgcHJvcGVybHkgc2V0ICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfSU5JVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0KSk7CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBUWCBwaW4gYWN0aXZlIGxldmVsIGludmVyc2lvbiAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX1RYSU5WRVJUX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9UWElOVihodWFydC0+QWR2YW5jZWRJbml0LlR4UGluTGV2ZWxJbnZlcnQpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfVFhJTlYsIGh1YXJ0LT5BZHZhbmNlZEluaXQuVHhQaW5MZXZlbEludmVydCk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIFJYIHBpbiBhY3RpdmUgbGV2ZWwgaW52ZXJzaW9uICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfUlhJTlZFUlRfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX1JYSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuUnhQaW5MZXZlbEludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SWElOViwgaHVhcnQtPkFkdmFuY2VkSW5pdC5SeFBpbkxldmVsSW52ZXJ0KTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgZGF0YSBpbnZlcnNpb24gKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9EQVRBSU5WRVJUX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9EQVRBSU5WKGh1YXJ0LT5BZHZhbmNlZEluaXQuRGF0YUludmVydCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9EQVRBSU5WLCBodWFydC0+QWR2YW5jZWRJbml0LkRhdGFJbnZlcnQpOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWC9UWCBwaW5zIHN3YXAgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9TV0FQX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9TV0FQKGh1YXJ0LT5BZHZhbmNlZEluaXQuU3dhcCkpOworICAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9TV0FQLCBodWFydC0+QWR2YW5jZWRJbml0LlN3YXApOworICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBSWCBvdmVycnVuIGRldGVjdGlvbiBkaXNhYmxpbmcgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5BZHZhbmNlZEluaXQuQWR2RmVhdHVyZUluaXQsIFVBUlRfQURWRkVBVFVSRV9SWE9WRVJSVU5ESVNBQkxFX0lOSVQpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfT1ZFUlJVTihodWFydC0+QWR2YW5jZWRJbml0Lk92ZXJydW5EaXNhYmxlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX09WUkRJUywgaHVhcnQtPkFkdmFuY2VkSW5pdC5PdmVycnVuRGlzYWJsZSk7CisgIH0KKworICAvKiBpZiByZXF1aXJlZCwgY29uZmlndXJlIERNQSBkaXNhYmxpbmcgb24gcmVjZXB0aW9uIGVycm9yICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfRE1BRElTQUJMRU9ORVJST1JfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX0RNQU9OUlhFUlJPUihodWFydC0+QWR2YW5jZWRJbml0LkRNQURpc2FibGVvblJ4RXJyb3IpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRERSRSwgaHVhcnQtPkFkdmFuY2VkSW5pdC5ETUFEaXNhYmxlb25SeEVycm9yKTsKKyAgfQorCisgIC8qIGlmIHJlcXVpcmVkLCBjb25maWd1cmUgYXV0byBCYXVkIHJhdGUgZGV0ZWN0aW9uIHNjaGVtZSAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkFkdmFuY2VkSW5pdC5BZHZGZWF0dXJlSW5pdCwgVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9JTklUKSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9BVVRPQkFVRFJBVEVfREVURUNUSU9OX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICAgIGFzc2VydF9wYXJhbShJU19VQVJUX0FEVkZFQVRVUkVfQVVUT0JBVURSQVRFKGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlRW5hYmxlKSk7CisgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUkVOLCBodWFydC0+QWR2YW5jZWRJbml0LkF1dG9CYXVkUmF0ZUVuYWJsZSk7CisgICAgLyogc2V0IGF1dG8gQmF1ZHJhdGUgZGV0ZWN0aW9uIHBhcmFtZXRlcnMgaWYgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgKi8KKyAgICBpZiAoaHVhcnQtPkFkdmFuY2VkSW5pdC5BdXRvQmF1ZFJhdGVFbmFibGUgPT0gVUFSVF9BRFZGRUFUVVJFX0FVVE9CQVVEUkFURV9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfQURWRkVBVFVSRV9BVVRPQkFVRFJBVEVNT0RFKGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSkpOworICAgICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FCUk1PREUsIGh1YXJ0LT5BZHZhbmNlZEluaXQuQXV0b0JhdWRSYXRlTW9kZSk7CisgICAgfQorICB9CisKKyAgLyogaWYgcmVxdWlyZWQsIGNvbmZpZ3VyZSBNU0IgZmlyc3Qgb24gY29tbXVuaWNhdGlvbiBsaW5lICovCisgIGlmIChIQUxfSVNfQklUX1NFVChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBVQVJUX0FEVkZFQVRVUkVfTVNCRklSU1RfSU5JVCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUKGh1YXJ0LT5BZHZhbmNlZEluaXQuTVNCRmlyc3QpKTsKKyAgICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfTVNCRklSU1QsIGh1YXJ0LT5BZHZhbmNlZEluaXQuTVNCRmlyc3QpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBDaGVjayB0aGUgVUFSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVBUlRfQ2hlY2tJZGxlU3RhdGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVBUlQgRXJyb3JDb2RlICovCisgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodWFydC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodWFydC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9SRSkgPT0gVVNBUlRfQ1IxX1JFKQorICB7CisgICAgLyogV2FpdCB1bnRpbCBSRUFDSyBmbGFnIGlzIHNldCAqLworICAgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIFN0YXRlICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgVUFSVCBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtIGh1YXJ0ICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gRmxhZyAgICAgIFNwZWNpZmllcyB0aGUgVUFSVCBmbGFnIHRvIGNoZWNrCisgICogQHBhcmFtIFN0YXR1cyAgICBGbGFnIHN0YXR1cyAoU0VUIG9yIFJFU0VUKQorICAqIEBwYXJhbSBUaWNrc3RhcnQgVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSBUaW1lb3V0ICAgVGltZW91dCBkdXJhdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChfX0hBTF9VQVJUX0dFVF9GTEFHKGh1YXJ0LCBGbGFnKSA/IFNFVCA6IFJFU0VUKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIFRYRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzIGZvciB0aGUgaW50ZXJydXB0IHByb2Nlc3MgKi8KKyAgICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSkpOworICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgVHggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFRyYW5zbWl0IGNvbXBsZXRpb24pLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFR4VHJhbnNmZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgVFhGVCBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX1RYRlRJRSkpOworCisgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworfQorCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgUnggdHJhbnNmZXIgb24gVUFSVCBwZXJpcGhlcmFsIChmb2xsb3dpbmcgZXJyb3IgZGV0ZWN0aW9uIG9yIFJlY2VwdGlvbiBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9FbmRSeFRyYW5zZmVyKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSk7CisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgLyogQXQgZW5kIG9mIFJ4IHByb2Nlc3MsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBSZXNldCBSeElzciBmdW5jdGlvbiBwb2ludGVyICovCisgIGh1YXJ0LT5SeElTUiA9IE5VTEw7Cit9CisKKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIC8qIERNQSBOb3JtYWwgbW9kZSAqLworICBpZiAoSEFMX0lTX0JJVF9DTFIoaGRtYS0+SW5zdGFuY2UtPkNDUiwgRE1BX0NDUl9DSVJDKSkKKyAgeworICAgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BVCBiaXQKKyAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgIH0KKyAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KKyAgZWxzZQorICB7CisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKkNhbGwgcmVnaXN0ZXJlZCBUeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgaHVhcnQtPlR4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICBIQUxfVUFSVF9UeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qQ2FsbCByZWdpc3RlcmVkIFR4IEhhbGYgY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+VHhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBUeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgVUFSVCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgLyogRE1BIE5vcm1hbCBtb2RlICovCisgIGlmIChIQUxfSVNfQklUX0NMUihoZG1hLT5JbnN0YW5jZS0+Q0NSLCBETUFfQ0NSX0NJUkMpKQorICB7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICBpbiB0aGUgVUFSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgfQorCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgUnggY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfUnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVQVJUIHJlY2VpdmUgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBIYWxmIGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgaHVhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggSGFsZiBjb21wbGV0ZSBjYWxsYmFjayovCisgIEhBTF9VQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVBUlQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBjb25zdCBIQUxfVUFSVF9TdGF0ZVR5cGVEZWYgZ3N0YXRlID0gaHVhcnQtPmdTdGF0ZTsKKyAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIHJ4c3RhdGUgPSBodWFydC0+UnhTdGF0ZTsKKworICAvKiBTdG9wIFVBUlQgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCkpICYmCisgICAgICAoZ3N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpKQorICB7CisgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgICAgVUFSVF9FbmRUeFRyYW5zZmVyKGh1YXJ0KTsKKyAgfQorCisgIC8qIFN0b3AgVUFSVCBETUEgUnggcmVxdWVzdCBpZiBvbmdvaW5nICovCisgIGlmICgoSEFMX0lTX0JJVF9TRVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkgJiYKKyAgICAgIChyeHN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpKQorICB7CisgICAgaHVhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisgICAgVUFSVF9FbmRSeFRyYW5zZmVyKGh1YXJ0KTsKKyAgfQorCisgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfRE1BOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICBodWFydC0+RXJyb3JDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICBIQUxfVUFSVF9FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgSEFMIHNlcnZpY2VzIG9uIEVycm9yCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlbmNlKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BQWJvcnRPbkVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgIGh1YXJ0LT5FcnJvckNhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgIEhBTF9VQVJUX0Vycm9yQ2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmICBETUEgVUFSVCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BVHhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0ID0gKFVBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGh1YXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKworICAvKiBDaGVjayBpZiBhbiBBYm9ydCBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgIGh1YXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfTk9ORTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0KS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCwgVXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsIGJhY2sgaXMgY2FsbGVkIG9ubHkgaWYgbm8KKyAgKiAgICAgICAgIEFib3J0IHN0aWxsIG9uZ29pbmcgZm9yIFR4IERNQSBIYW5kbGUuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVJ4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodWFydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodWFydC0+aGRtYXR4ICE9IE5VTEwpCisgIHsKKyAgICBpZiAoaHVhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1YXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBSZXNldCBlcnJvckNvZGUgKi8KKyAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX09SRUYgfCBVQVJUX0NMRUFSX05FRiB8IFVBUlRfQ0xFQVJfUEVGIHwgVUFSVF9DTEVBUl9GRUYpOworCisgIC8qIERpc2NhcmQgdGhlIHJlY2VpdmVkIGRhdGEgKi8KKyAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIENhbGwgdXNlciBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBodWFydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBjb21wbGV0ZSBjYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgVHggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQgQVBJIChBYm9ydCBvbmx5IFR4IHRyYW5zZmVyKQorICAqICAgICAgICAgKFRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYXQgZW5kIG9mIERNQSBUeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCwKKyAgKiAgICAgICAgIGFuZCBsZWFkcyB0byB1c2VyIFR4IEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGV4ZWN1dGlvbikuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0RNQVR4T25seUFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQgPSAoVUFSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyAgaHVhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgaWYgKGh1YXJ0LT5GaWZvTW9kZSA9PSBVQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgeworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAvKiBDYWxsIHJlZ2lzdGVyZWQgQWJvcnQgVHJhbnNtaXQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBBYm9ydCBUcmFuc21pdCBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVUFSVF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVBUlQgUnggY29tbXVuaWNhdGlvbiBhYm9ydCBjYWxsYmFjaywgd2hlbiBpbml0aWF0ZWQgYnkgdXNlciBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9VQVJUX0Fib3J0UmVjZWl2ZV9JVCBBUEkgKEFib3J0IG9ubHkgUnggdHJhbnNmZXIpCisgICogICAgICAgICAoVGhpcyBjYWxsYmFjayBpcyBleGVjdXRlZCBhdCBlbmQgb2YgRE1BIFJ4IEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgdXNlciBhYm9ydCByZXF1ZXN0LAorICAqICAgICAgICAgYW5kIGxlYWRzIHRvIHVzZXIgUnggQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgZXhlY3V0aW9uKS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfRE1BUnhPbmx5QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCA9IChVQVJUX0hhbmRsZVR5cGVEZWYgKikoKERNQV9IYW5kbGVUeXBlRGVmICopaGRtYSktPlBhcmVudDsKKworICBodWFydC0+UnhYZmVyQ291bnQgPSAwVTsKKworICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLworICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfT1JFRiB8IFVBUlRfQ0xFQVJfTkVGIHwgVUFSVF9DTEVBUl9QRUYgfCBVQVJUX0NMRUFSX0ZFRik7CisKKyAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAvKiBSZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2FsbCB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IFJlY2VpdmUgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBUWCBpbnRlcnJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9UeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIGlmIChodWFydC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IEludGVycnVwdCAqLworICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1YXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodWFydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIrKzsKKyAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgVFggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA5IGJpdHMgZGF0YSB3b3JkIGxlbmd0aC4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVUFSVF9UcmFuc21pdF9JVCgpLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfVHhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QgKnRtcDsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBpZiAoaHVhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVhcnQtPnBUeEJ1ZmZQdHI7CisgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnRtcCAmIFVTQVJUX1REUl9URFJfTXNrKTsKKyAgICAgIGh1YXJ0LT5wVHhCdWZmUHRyICs9IDJVOworICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUWCBpbnRlcnJydXB0IGhhbmRsZXIgZm9yIDcgb3IgOCBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9UeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCAgbmJfdHhfZGF0YTsKKworICAvKiBDaGVjayB0aGF0IGEgVHggcHJvY2VzcyBpcyBvbmdvaW5nICovCisgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgOyBuYl90eF9kYXRhID4gMFUgOyBuYl90eF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKGh1YXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRJRSk7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSk7CisKKyAgICAgICAgYnJlYWs7IC8qIGZvcmNlIGV4aXQgbG9vcCAqLworICAgICAgfQorICAgICAgZWxzZSBpZiAoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5JU1IsIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKQorICAgICAgeworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqaHVhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsKKyAgICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIrKzsKKyAgICAgICAgaHVhcnQtPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFRYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1RyYW5zbWl0X0lUKCkuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9UeElTUl8xNkJJVF9GSUZPRU4oVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QgKnRtcDsKKyAgdWludDE2X3QgIG5iX3R4X2RhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKQorICB7CisgICAgZm9yIChuYl90eF9kYXRhID0gaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzIDsgbmJfdHhfZGF0YSA+IDBVIDsgbmJfdHhfZGF0YS0tKQorICAgIHsKKyAgICAgIGlmIChodWFydC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19UWEZUSUUpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgICAgICAgIGJyZWFrOyAvKiBmb3JjZSBleGl0IGxvb3AgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+SVNSLCBVU0FSVF9JU1JfVFhFX1RYRk5GKSAhPSAwVSkKKyAgICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQxNl90ICopIGh1YXJ0LT5wVHhCdWZmUHRyOworICAgICAgICBodWFydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50MTZfdCkoKnRtcCAmIFVTQVJUX1REUl9URFJfTXNrKTsKKyAgICAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICAgIGh1YXJ0LT5UeFhmZXJDb3VudC0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgV3JhcCB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodWFydCBwb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJUX0VuZFRyYW5zbWl0X0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1RDSUUpOworCisgIC8qIFR4IHByb2Nlc3MgaXMgZW5kZWQsIHJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogQ2xlYXQgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodWFydC0+VHhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLypDYWxsIHJlZ2lzdGVyZWQgVHggY29tcGxldGUgY2FsbGJhY2sqLworICBodWFydC0+VHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgLypDYWxsIGxlZ2FjeSB3ZWFrIFR4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgSEFMX1VBUlRfVHhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgNyBvciA4IGJpdHMgZGF0YSB3b3JkIGxlbmd0aCAuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1YXJ0LT5NYXNrOworICB1aW50MTZfdCAgdWhkYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICAqaHVhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICBodWFydC0+cFJ4QnVmZlB0cisrOworICAgIGh1YXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0cyAqLworICAgICAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gTlVMTDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBodWFydC0+UnhDcGx0Q2FsbGJhY2soaHVhcnQpOworI2Vsc2UKKyAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDE2X3QgKnRtcDsKKyAgdWludDE2X3QgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisgIHVpbnQxNl90ICB1aGRhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIHVoZGF0YSA9ICh1aW50MTZfdCkgUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5SRFIpOworICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodWFydC0+cFJ4QnVmZlB0ciA7CisgICAgKnRtcCA9ICh1aW50MTZfdCkodWhkYXRhICYgdWhNYXNrKTsKKyAgICBodWFydC0+cFJ4QnVmZlB0ciArPSAyVTsKKyAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodWFydC0+UnhYZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCisgICAgICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodWFydC0+UnhJU1IgPSBOVUxMOworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIFJ4IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgIEhBTF9VQVJUX1J4Q3BsdENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIENsZWFyIFJYTkUgaW50ZXJydXB0IGZsYWcgKi8KKyAgICBfX0hBTF9VQVJUX1NFTkRfUkVRKGh1YXJ0LCBVQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUlggaW50ZXJycnVwdCBoYW5kbGVyIGZvciA3IG9yIDggIGJpdHMgZGF0YSB3b3JkIGxlbmd0aCBhbmQgRklGTyBtb2RlIGlzIGVuYWJsZWQuCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VBUlRfUmVjZWl2ZV9JVCgpCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVF9SeElTUl84QklUX0ZJRk9FTihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICB1aW50MTZfdCAgdWhNYXNrID0gaHVhcnQtPk1hc2s7CisgIHVpbnQxNl90ICB1aGRhdGE7CisgIHVpbnQxNl90ICAgbmJfcnhfZGF0YTsKKyAgdWludDE2X3QgIHJ4ZGF0YWNvdW50OworCisgIC8qIENoZWNrIHRoYXQgYSBSeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKGh1YXJ0LT5SeFN0YXRlID09IEhBTF9VQVJUX1NUQVRFX0JVU1lfUlgpCisgIHsKKyAgICBmb3IgKG5iX3J4X2RhdGEgPSBodWFydC0+TmJSeERhdGFUb1Byb2Nlc3MgOyBuYl9yeF9kYXRhID4gMFUgOyBuYl9yeF9kYXRhLS0pCisgICAgeworICAgICAgdWhkYXRhID0gKHVpbnQxNl90KSBSRUFEX1JFRyhodWFydC0+SW5zdGFuY2UtPlJEUik7CisgICAgICAqaHVhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkodWhkYXRhICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICAgIGh1YXJ0LT5wUnhCdWZmUHRyKys7CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWEZUIGludGVycnVwdCovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTworICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzCisgICAgZGlzYWJsZWQgKGkuZS4gb25lIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUpLgorICAgICovCisgICAgcnhkYXRhY291bnQgPSBodWFydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKChyeGRhdGFjb3VudCAhPSAwVSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl84QklUOworCisgICAgICAvKiBFbmFibGUgdGhlIFVBUlQgRGF0YSBSZWdpc3RlciBOb3QgRW1wdHkgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVUFSVF9TRU5EX1JFUShodWFydCwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJYIGludGVycnJ1cHQgaGFuZGxlciBmb3IgOSBiaXRzIGRhdGEgd29yZCBsZW5ndGggYW5kIEZJRk8gbW9kZSBpcyBlbmFibGVkLgorICAqIEBub3RlICAgRnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VQVJUX1JlY2VpdmVfSVQoKQorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRfUnhJU1JfMTZCSVRfRklGT0VOKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQxNl90ICp0bXA7CisgIHVpbnQxNl90ICB1aE1hc2sgPSBodWFydC0+TWFzazsKKyAgdWludDE2X3QgIHVoZGF0YTsKKyAgdWludDE2X3QgICBuYl9yeF9kYXRhOworICB1aW50MTZfdCAgcnhkYXRhY291bnQ7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoaHVhcnQtPlJ4U3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfQlVTWV9SWCkKKyAgeworICAgIGZvciAobmJfcnhfZGF0YSA9IGh1YXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcyA7IG5iX3J4X2RhdGEgPiAwVSA7IG5iX3J4X2RhdGEtLSkKKyAgICB7CisgICAgICB1aGRhdGEgPSAodWludDE2X3QpIFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UkRSKTsKKyAgICAgIHRtcCA9ICh1aW50MTZfdCAqKSBodWFydC0+cFJ4QnVmZlB0ciA7CisgICAgICAqdG1wID0gKHVpbnQxNl90KSh1aGRhdGEgJiB1aE1hc2spOworICAgICAgaHVhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodWFydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgaWYgKGh1YXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWEZUIGludGVycnVwdCovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVhcnQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBDbGVhciBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICAgIGh1YXJ0LT5SeElTUiA9IE5VTEw7CisKKyNpZiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBSeCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgIGh1YXJ0LT5SeENwbHRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgUnggY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgICBIQUxfVUFSVF9SeENwbHRDYWxsYmFjayhodWFydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTworICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzCisgICAgZGlzYWJsZWQgKGkuZS4gb25lIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUpLgorICAgICovCisgICAgcnhkYXRhY291bnQgPSBodWFydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKChyeGRhdGFjb3VudCAhPSAwVSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVQVJUIFJYRlQgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVhcnQtPlJ4SVNSID0gVUFSVF9SeElTUl8xNkJJVDsKKworICAgICAgLyogRW5hYmxlIHRoZSBVQVJUIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1VBUlRfU0VORF9SRVEoaHVhcnQsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVUFSVF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3VhcnRfZXguYyBiL1NyYy9zdG0zMndieHhfaGFsX3VhcnRfZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU0OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfdWFydF9leC5jCkBAIC0wLDAgKzEsNzM0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF91YXJ0X2V4LmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEV4dGVuZGVkIFVBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyBleHRlbmRlZAorICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlciBQZXJpcGhlcmFsIChVQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgIyMjIyMgVUFSVCBwZXJpcGhlcmFsIGV4dGVuZGVkIGZlYXR1cmVzICAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICgjKSBEZWNsYXJlIGEgVUFSVF9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUuCisKKyAgICAoIykgRm9yIHRoZSBVQVJUIFJTNDg1IERyaXZlciBFbmFibGUgbW9kZSwgaW5pdGlhbGl6ZSB0aGUgVUFSVCByZWdpc3RlcnMKKyAgICAgICAgYnkgY2FsbGluZyB0aGUgSEFMX1JTNDg1RXhfSW5pdCgpIEFQSS4KKworICAgICgjKSBGSUZPIG1vZGUgZW5hYmxpbmcvZGlzYWJsaW5nIGFuZCBSWC9UWCBGSUZPIHRocmVzaG9sZCBwcm9ncmFtbWluZy4KKworICAgICAgICAtQC0gV2hlbiBVQVJUIG9wZXJhdGVzIGluIEZJRk8gbW9kZSwgRklGTyBtb2RlIG11c3QgYmUgZW5hYmxlZCBwcmlvcgorICAgICAgICAgICAgc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLiBBbHNvIFJYL1RYIEZJRk8gdGhyZXNob2xkcyBtdXN0IGJlCisgICAgICAgICAgICBjb25maWd1cmVkIHByaW9yIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4KKworICBAZW5kdmVyYmF0aW0KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXggVUFSVEV4CisgICogQGJyaWVmIFVBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVBUlRFWF9Qcml2YXRlX0NvbnN0YW50cyBVQVJURXggUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyogVUFSVCBSWCBGSUZPIGRlcHRoICovCisjZGVmaW5lIFJYX0ZJRk9fREVQVEggOFUKKworLyogVUFSVCBUWCBGSUZPIGRlcHRoICovCisjZGVmaW5lIFRYX0ZJRk9fREVQVEggOFUKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVBUlRFeCBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCitzdGF0aWMgdm9pZCBVQVJURXhfV2FrZXVwX0FkZHJlc3NDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7CitzdGF0aWMgdm9pZCBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zICBVQVJURXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgIEV4dGVuZGVkIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIEZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIHRoZSBVU0FSVHggb3IgdGhlIFVBUlR5CisgICAgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgICAgICAoKykgRm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZSB0aGUgcGFyYW1ldGVycyBiZWxvdyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgKCsrKSBCYXVkIFJhdGUKKyAgICAgICAgKCsrKSBXb3JkIExlbmd0aAorICAgICAgICAoKyspIFN0b3AgQml0CisgICAgICAgICgrKykgUGFyaXR5OiBJZiB0aGUgcGFyaXR5IGlzIGVuYWJsZWQsIHRoZW4gdGhlIE1TQiBiaXQgb2YgdGhlIGRhdGEgd3JpdHRlbgorICAgICAgICAgICAgIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAoKyspIEhhcmR3YXJlIGZsb3cgY29udHJvbAorICAgICAgICAoKyspIFJlY2VpdmVyL3RyYW5zbWl0dGVyIG1vZGVzCisgICAgICAgICgrKykgT3ZlciBTYW1wbGluZyBNZXRob2QKKyAgICAgICAgKCsrKSBPbmUtQml0IFNhbXBsaW5nIE1ldGhvZAorICAgICAgKCspIEZvciB0aGUgYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBmb2xsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgd2VsbDoKKyAgICAgICAgKCsrKSBUWCBhbmQvb3IgUlggcGluIGxldmVsIGludmVyc2lvbgorICAgICAgICAoKyspIGRhdGEgbG9naWNhbCBsZXZlbCBpbnZlcnNpb24KKyAgICAgICAgKCsrKSBSWCBhbmQgVFggcGlucyBzd2FwCisgICAgICAgICgrKykgUlggb3ZlcnJ1biBkZXRlY3Rpb24gZGlzYWJsaW5nCisgICAgICAgICgrKykgRE1BIGRpc2FibGluZyBvbiBSWCBlcnJvcgorICAgICAgICAoKyspIE1TQiBmaXJzdCBvbiBjb21tdW5pY2F0aW9uIGxpbmUKKyAgICAgICAgKCsrKSBhdXRvIEJhdWQgcmF0ZSBkZXRlY3Rpb24KKyAgICBbLi5dCisgICAgVGhlIEhBTF9SUzQ4NUV4X0luaXQoKSBBUEkgZm9sbG93cyB0aGUgVUFSVCBSUzQ4NSBtb2RlIGNvbmZpZ3VyYXRpb24KKyAgICAgcHJvY2VkdXJlcyAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZXMgYXJlIGF2YWlsYWJsZSBpbiByZWZlcmVuY2UgbWFudWFsKS4KKworQGVuZHZlcmJhdGltCisKKyAgRGVwZW5kaW5nIG9uIHRoZSBmcmFtZSBsZW5ndGggZGVmaW5lZCBieSB0aGUgTTEgYW5kIE0wIGJpdHMgKDctYml0LAorICA4LWJpdCBvciA5LWJpdCksIHRoZSBwb3NzaWJsZSBVQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgICAgVGFibGUgMS4gVUFSVCBmcmFtZSBmb3JtYXQuCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgIE0xIGJpdCB8ICBNMCBiaXQgfCAgUENFIGJpdCAgfCAgICAgICAgICAgICBVQVJUIGZyYW1lICAgICAgICAgICAgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA4IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDcgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOSBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMSAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA4IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDcgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMSAgICB8ICAgIDAgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgNiBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUlM0ODUgRHJpdmVyIGVuYWJsZSBmZWF0dXJlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVQVJUX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gUG9sYXJpdHkgICAgICAgICBTZWxlY3QgdGhlIGRyaXZlciBlbmFibGUgcG9sYXJpdHkuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9ERV9QT0xBUklUWV9ISUdIIERFIHNpZ25hbCBpcyBhY3RpdmUgaGlnaAorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0RFX1BPTEFSSVRZX0xPVyAgREUgc2lnbmFsIGlzIGFjdGl2ZSBsb3cKKyAgKiBAcGFyYW0gQXNzZXJ0aW9uVGltZSAgICBEcml2ZXIgRW5hYmxlIGFzc2VydGlvbiB0aW1lOgorICAqICAgICAgIDUtYml0IHZhbHVlIGRlZmluaW5nIHRoZSB0aW1lIGJldHdlZW4gdGhlIGFjdGl2YXRpb24gb2YgdGhlIERFIChEcml2ZXIgRW5hYmxlKQorICAqICAgICAgIHNpZ25hbCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhcnQgYml0LiBJdCBpcyBleHByZXNzZWQgaW4gc2FtcGxlIHRpbWUKKyAgKiAgICAgICB1bml0cyAoMS84IG9yIDEvMTYgYml0IHRpbWUsIGRlcGVuZGluZyBvbiB0aGUgb3ZlcnNhbXBsaW5nIHJhdGUpCisgICogQHBhcmFtIERlYXNzZXJ0aW9uVGltZSAgRHJpdmVyIEVuYWJsZSBkZWFzc2VydGlvbiB0aW1lOgorICAqICAgICAgIDUtYml0IHZhbHVlIGRlZmluaW5nIHRoZSB0aW1lIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbGFzdCBzdG9wIGJpdCwgaW4gYQorICAqICAgICAgIHRyYW5zbWl0dGVkIG1lc3NhZ2UsIGFuZCB0aGUgZGUtYWN0aXZhdGlvbiBvZiB0aGUgREUgKERyaXZlciBFbmFibGUpIHNpZ25hbC4KKyAgKiAgICAgICBJdCBpcyBleHByZXNzZWQgaW4gc2FtcGxlIHRpbWUgdW5pdHMgKDEvOCBvciAxLzE2IGJpdCB0aW1lLCBkZXBlbmRpbmcgb24gdGhlCisgICogICAgICAgb3ZlcnNhbXBsaW5nIHJhdGUpLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKQoreworICB1aW50MzJfdCB0ZW1wOworCisgIC8qIENoZWNrIHRoZSBVQVJUIGhhbmRsZSBhbGxvY2F0aW9uICovCisgIGlmIChodWFydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBVQVJUIGluc3RhbmNlICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RSSVZFUl9FTkFCTEVfSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogQ2hlY2sgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfREVfUE9MQVJJVFkoUG9sYXJpdHkpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gdGltZSAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BU1NFUlRJT05USU1FKEFzc2VydGlvblRpbWUpKTsKKworICAvKiBDaGVjayB0aGUgRHJpdmVyIEVuYWJsZSBkZWFzc2VydGlvbiB0aW1lICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0RFQVNTRVJUSU9OVElNRShEZWFzc2VydGlvblRpbWUpKTsKKworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRVNFVCkKKyAgeworICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KKyAgICBodWFydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgVUFSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KGh1YXJ0KTsKKworICAgIGlmIChodWFydC0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCisgICAgeworICAgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVhcnQtPk1zcEluaXRDYWxsYmFjayhodWFydCk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVggKi8KKyAgICBIQUxfVUFSVF9Nc3BJbml0KGh1YXJ0KTsKKyNlbmRpZiAvKiAoVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKyAgfQorCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBTZXQgdGhlIFVBUlQgQ29tbXVuaWNhdGlvbiBwYXJhbWV0ZXJzICovCisgIGlmIChVQVJUX1NldENvbmZpZyhodWFydCkgPT0gSEFMX0VSUk9SKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIGlmIChodWFydC0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0ICE9IFVBUlRfQURWRkVBVFVSRV9OT19JTklUKQorICB7CisgICAgVUFSVF9BZHZGZWF0dXJlQ29uZmlnKGh1YXJ0KTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgRHJpdmVyIEVuYWJsZSBtb2RlIGJ5IHNldHRpbmcgdGhlIERFTSBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfREVNKTsKKworICAvKiBTZXQgdGhlIERyaXZlciBFbmFibGUgcG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RFUCwgUG9sYXJpdHkpOworCisgIC8qIFNldCB0aGUgRHJpdmVyIEVuYWJsZSBhc3NlcnRpb24gYW5kIGRlYXNzZXJ0aW9uIHRpbWVzICovCisgIHRlbXAgPSAoQXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERUFUX0FERFJFU1NfTFNCX1BPUyk7CisgIHRlbXAgfD0gKERlYXNzZXJ0aW9uVGltZSA8PCBVQVJUX0NSMV9ERURUX0FERFJFU1NfTFNCX1BPUyk7CisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfREVEVCB8IFVTQVJUX0NSMV9ERUFUKSwgdGVtcCk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIEV4dGVuZGVkIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgV2FrZXVwIGFuZCBGSUZPIG1vZGUgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMuCisKKyAgICAoIykgV2FrZXVwIGZyb20gU3RvcCBtb2RlIENhbGxiYWNrOgorICAgICAgICAoKykgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjaygpCisKKyAgICAoIykgVFgvUlggRmlmb3MgQ2FsbGJhY2tzOgorICAgICAgICAoKykgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soKQorICAgICAgICAoKykgSEFMX1VBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmIFVBUlQgd2FrZXVwIGZyb20gU3RvcCBtb2RlIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVQVJUIFJYIEZpZm8gZnVsbCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgVUFSVCBUWCBGaWZvIGVtcHR5IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVUFSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiBAYnJpZWYgICAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoKSBBUEkgb3B0aW9uYWxseSBzZXRzIHRoZSBVQVJUIG5vZGUgYWRkcmVzcworICAgICAgICAgZGV0ZWN0aW9uIGxlbmd0aCB0byBtb3JlIHRoYW4gNCBiaXRzIGZvciBtdWx0aXByb2Nlc3NvciBhZGRyZXNzIG1hcmsgd2FrZSB1cC4KKyAgICAgKCspIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoKSBBUEkgZGVmaW5lcyB0aGUgd2FrZS11cCBmcm9tIHN0b3AgbW9kZQorICAgICAgICAgdHJpZ2dlcjogYWRkcmVzcyBtYXRjaCwgU3RhcnQgQml0IGRldGVjdGlvbiBvciBSWE5FIGJpdCBzdGF0dXMuCisgICAgICgrKSBIQUxfVUFSVEV4X0VuYWJsZVN0b3BNb2RlKCkgQVBJIGVuYWJsZXMgdGhlIFVBUlQgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gc3RvcCBtb2RlCisgICAgICgrKSBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgYWJvdmUgZnVuY3Rpb25hbGl0eQorICAgICAoKykgSEFMX1VBUlRFeF9FbmFibGVGaWZvTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9VQVJURXhfRGlzYWJsZUZpZm9Nb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9VQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKCkgQVBJIHNldHMgdGhlIFRYIEZJRk8gdGhyZXNob2xkCisgICAgICgrKSBIQUxfVUFSVEV4X1NldFJ4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBSWCBGSUZPIHRocmVzaG9sZAorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisKKworCisvKioKKyAgKiBAYnJpZWYgQnkgZGVmYXVsdCBpbiBtdWx0aXByb2Nlc3NvciBtb2RlLCB3aGVuIHRoZSB3YWtlIHVwIG1ldGhvZCBpcyBzZXQKKyAgKiAgICAgICAgdG8gYWRkcmVzcyBtYXJrLCB0aGUgVUFSVCBoYW5kbGVzIG9ubHkgNC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uOworICAqICAgICAgICB0aGlzIEFQSSBhbGxvd3MgdG8gZW5hYmxlIGxvbmdlciBhZGRyZXNzZXMgZGV0ZWN0aW9uICg2LSwgNy0gb3IgOC1iaXQKKyAgKiAgICAgICAgbG9uZykuCisgICogQG5vdGUgIEFkZHJlc3NlcyBkZXRlY3Rpb24gbGVuZ3RocyBhcmU6IDYtYml0IGFkZHJlc3MgZGV0ZWN0aW9uIGluIDctYml0IGRhdGEgbW9kZSwKKyAgKiAgICAgICAgNy1iaXQgYWRkcmVzcyBkZXRlY3Rpb24gaW4gOC1iaXQgZGF0YSBtb2RlLCA4LWJpdCBhZGRyZXNzIGRldGVjdGlvbiBpbiA5LWJpdCBkYXRhIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIEFkZHJlc3NMZW5ndGggVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9BRERSRVNTX0RFVEVDVF80QiA0LWJpdCBsb25nIGFkZHJlc3MKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9BRERSRVNTX0RFVEVDVF83QiA2LSwgNy0gb3IgOC1iaXQgbG9uZyBhZGRyZXNzCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBBZGRyZXNzTGVuZ3RoKQoreworICAvKiBDaGVjayB0aGUgVUFSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVhcnQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBDaGVjayB0aGUgYWRkcmVzcyBsZW5ndGggcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKEFkZHJlc3NMZW5ndGgpKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CisKKyAgLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsIEFkZHJlc3NMZW5ndGgpOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogVEVBQ0sgYW5kL29yIFJFQUNLIHRvIGNoZWNrIGJlZm9yZSBtb3ZpbmcgaHVhcnQtPmdTdGF0ZSB0byBSZWFkeSAqLworICByZXR1cm4gKFVBUlRfQ2hlY2tJZGxlU3RhdGUoaHVhcnQpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgU2V0IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBpbnRlcnJ1cHQgZmxhZyBzZWxlY3Rpb24uCisgICogQG5vdGUgSXQgaXMgdGhlIGFwcGxpY2F0aW9uIHJlc3BvbnNpYmlsaXR5IHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IHVzZWQgYXMKKyAgKiAgICAgICB1c2FydF93a3VwIGludGVycnVwdCBzb3VyY2UgYmVmb3JlIGVudGVyaW5nIGxvdy1wb3dlciBtb2RlLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIFdha2VVcFNlbGVjdGlvbiBBZGRyZXNzIG1hdGNoLCBTdGFydCBCaXQgZGV0ZWN0aW9uIG9yIFJYTkUvUlhGTkUgYml0IHN0YXR1cy4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICAgICAgQGFyZyBAcmVmIFVBUlRfV0FLRVVQX09OX1JFQUREQVRBX05PTkVNUFRZCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIGNoZWNrIHRoZSB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIFVBUlQgaW5zdGFuY2UgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOworICAvKiBjaGVjayB0aGUgd2FrZS11cCBzZWxlY3Rpb24gcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUF9TRUxFQ1RJT04oV2FrZVVwU2VsZWN0aW9uLldha2VVcEV2ZW50KSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIFNldCB0aGUgd2FrZS11cCBzZWxlY3Rpb24gc2NoZW1lICovCisgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19XVVMsIFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCk7CisKKyAgaWYgKFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCA9PSBVQVJUX1dBS0VVUF9PTl9BRERSRVNTKQorICB7CisgICAgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKGh1YXJ0LCBXYWtlVXBTZWxlY3Rpb24pOworICB9CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKKworICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBVQVJUIFN0YXRlICovCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQGJyaWVmIEVuYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAgKiBAbm90ZSBUaGUgVUFSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgMSBtb2RlIGFzIGxvbmcgYXMgVUFSVCBjbG9jayBpcyBIU0kgb3IgTFNFLgorICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogU2V0IFVFU00gYml0ICovCisgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIERpc2FibGUgVUFSVCBTdG9wIE1vZGUuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgLyogQ2xlYXIgVUVTTSBiaXQgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGSUZPIG1vZGUuCisgICogQHBhcmFtIGh1YXJ0ICAgICAgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUZpZm9Nb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBFbmFibGUgRklGTyBtb2RlICovCisgIFNFVF9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVhcnQtPkZpZm9Nb2RlID0gVUFSVF9GSUZPTU9ERV9FTkFCTEU7CisKKyAgLyogUmVzdG9yZSBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRklGTyBtb2RlLgorICAqIEBwYXJhbSBodWFydCAgICAgIFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlRmlmb01vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVUFSVCAqLworICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgQ0xFQVJfQklUKHRtcGNyMSwgVVNBUlRfQ1IxX0ZJRk9FTik7CisgIGh1YXJ0LT5GaWZvTW9kZSA9IFVBUlRfRklGT01PREVfRElTQUJMRTsKKworICAvKiBSZXN0b3JlIFVBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgVFhGSUZPIHRocmVzaG9sZC4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBUWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzFfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9UWEZJRk9fVEhSRVNIT0xEXzNfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1RYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X1NldFR4Rmlmb1RocmVzaG9sZChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1RYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBVcGRhdGUgVFggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1RYRlRDRkcsIFRocmVzaG9sZCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovCisgIFVBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVhcnQpOworCisgIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBSWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBodWFydCAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBUaHJlc2hvbGQgIFJYIEZJRk8gdGhyZXNob2xkIHZhbHVlCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzIKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1JYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfUlhGSUZPX1RIUkVTSE9MRF84XzgKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU2V0UnhGaWZvVGhyZXNob2xkKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IFRocmVzaG9sZCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVhcnQtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX1JYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVUFSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVBUlQgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBVcGRhdGUgUlggdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRDRkcsIFRocmVzaG9sZCk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGR1cmluZyBSWC9UWCBJU1IgZXhlY3V0aW9uICovCisgIFVBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVhcnQpOworCisgIC8qIFJlc3RvcmUgVUFSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVQVJURXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMgd2hlbiB0cmlnZ2VyZWQgYnkgYWRkcmVzcyBkZXRlY3Rpb24uCisgICogQHBhcmFtIGh1YXJ0ICAgICAgICAgICBVQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gV2FrZVVwU2VsZWN0aW9uIFVBUlQgd2FrZSB1cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVUFSVEV4X1dha2V1cF9BZGRyZXNzQ29uZmlnKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIFVBUlRfV2FrZVVwVHlwZURlZiBXYWtlVXBTZWxlY3Rpb24pCit7CisgIGFzc2VydF9wYXJhbShJU19VQVJUX0FERFJFU1NMRU5HVEhfREVURUNUKFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKSk7CisKKyAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIGxlbmd0aCAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURETTcsIFdha2VVcFNlbGVjdGlvbi5BZGRyZXNzTGVuZ3RoKTsKKworICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfQURELCAoKHVpbnQzMl90KVdha2VVcFNlbGVjdGlvbi5BZGRyZXNzIDw8IFVBUlRfQ1IyX0FERFJFU1NfTFNCX1BPUykpOworfQorCisvKioKKyAgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAgKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20KKyAgKiAgICAgICB0aGUgVUFSVCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVQVJURXhfU2V0TmJEYXRhVG9Qcm9jZXNzKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCit7CisgIHVpbnQ4X3QgcnhfZmlmb19kZXB0aDsKKyAgdWludDhfdCB0eF9maWZvX2RlcHRoOworICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IHR4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IG51bWVyYXRvcltdID0gezFVLCAxVSwgMVUsIDNVLCA3VSwgMVUsIDBVLCAwVX07CisgIHVpbnQ4X3QgZGVub21pbmF0b3JbXSA9IHs4VSwgNFUsIDJVLCA0VSwgOFUsIDFVLCAxVSwgMVV9OworCisgIGlmIChodWFydC0+Rmlmb01vZGUgPT0gVUFSVF9GSUZPTU9ERV9ESVNBQkxFKQorICB7CisgICAgaHVhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gMVU7CisgICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMVU7CisgIH0KKyAgZWxzZQorICB7CisgICAgcnhfZmlmb19kZXB0aCA9IFJYX0ZJRk9fREVQVEg7CisgICAgdHhfZmlmb19kZXB0aCA9IFRYX0ZJRk9fREVQVEg7CisgICAgcnhfZmlmb190aHJlc2hvbGQgPSAodWludDhfdCkoUkVBRF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUQ0ZHKSA+PiBVU0FSVF9DUjNfUlhGVENGR19Qb3MpOworICAgIHR4X2ZpZm9fdGhyZXNob2xkID0gKHVpbnQ4X3QpKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKTsKKyAgICBodWFydC0+TmJUeERhdGFUb1Byb2Nlc3MgPSAoKHVpbnQxNl90KXR4X2ZpZm9fZGVwdGggKiBudW1lcmF0b3JbdHhfZmlmb190aHJlc2hvbGRdKSAvICh1aW50MTZfdClkZW5vbWluYXRvclt0eF9maWZvX3RocmVzaG9sZF07CisgICAgaHVhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdClyeF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3J4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbcnhfZmlmb190aHJlc2hvbGRdOworICB9Cit9CisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogSEFMX1VBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3VzYXJ0LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF91c2FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMWRmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF91c2FydC5jCkBAIC0wLDAgKzEsMzYyNCBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9oYWxfdXNhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVVNBUlQgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVW5pdmVyc2FsIFN5bmNocm9ub3VzL0FzeW5jaHJvbm91cyBSZWNlaXZlciBUcmFuc21pdHRlcgorICAqICAgICAgICAgIFBlcmlwaGVyYWwgKFVTQVJUKS4KKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgorICBAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgIFRoZSBVU0FSVCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICgjKSBEZWNsYXJlIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlIChlZy4gVVNBUlRfSGFuZGxlVHlwZURlZiBodXNhcnQpLgorICAgICAgKCMpIEluaXRpYWxpemUgdGhlIFVTQVJUIGxvdyBsZXZlbCByZXNvdXJjZXMgYnkgaW1wbGVtZW50aW5nIHRoZSBIQUxfVVNBUlRfTXNwSW5pdCgpIEFQSToKKyAgICAgICAgICAoKyspIEVuYWJsZSB0aGUgVVNBUlR4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAoKyspIFVTQVJUIHBpbnMgY29uZmlndXJhdGlvbjoKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBVU0FSVCBHUElPcy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBVU0FSVCBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLgorICAgICAgICAgICgrKykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCksCisgICAgICAgICAgICAgICAgSEFMX1VTQVJUX1JlY2VpdmVfSVQoKSBhbmQgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVCgpIEFQSXMpOgorICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBVU0FSVHggaW50ZXJydXB0IHByaW9yaXR5LgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFVTQVJUIElSUSBoYW5kbGUuCisgICAgICAgICAgICAoKyspIFVTQVJUIGludGVycnVwdHMgaGFuZGxpbmc6CisgICAgICAgICAgICAgIC1AQC0gICBUaGUgc3BlY2lmaWMgVVNBUlQgaW50ZXJydXB0cyAoVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgIFJYTkUgaW50ZXJydXB0IGFuZCBFcnJvciBJbnRlcnJ1cHRzKSB3aWxsIGJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcworICAgICAgICAgICAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUKCkgYW5kIF9fSEFMX1VTQVJUX0RJU0FCTEVfSVQoKSBpbnNpZGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3MuCisgICAgICAgICAgKCsrKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoKQorICAgICAgICAgICAgICAgSEFMX1VTQVJUX1JlY2VpdmVfRE1BKCkgYW5kIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKCkgQVBJcyk6CisgICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVsLgorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jay4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQgVHgvUnggcGFyYW1ldGVycy4KKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWwuCisgICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFVTQVJUIERNQSBUeC9SeCBoYW5kbGUuCisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIHByaW9yaXR5IGFuZCBlbmFibGUgdGhlIE5WSUMgZm9yIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVsLgorCisgICAgICAoIykgUHJvZ3JhbSB0aGUgQmF1ZCBSYXRlLCBXb3JkIExlbmd0aCwgU3RvcCBCaXQsIFBhcml0eSwgYW5kIE1vZGUKKyAgICAgICAgICAoUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpIGluIHRoZSBodXNhcnQgaGFuZGxlIEluaXQgc3RydWN0dXJlLgorCisgICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgcmVnaXN0ZXJzIGJ5IGNhbGxpbmcgdGhlIEhBTF9VU0FSVF9Jbml0KCkgQVBJOgorICAgICAgICAgICgrKykgVGhpcyBBUEkgY29uZmlndXJlcyBhbHNvIHRoZSBsb3cgbGV2ZWwgSGFyZHdhcmUgR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YykKKyAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgdGhlIGN1c3RvbWl6ZWQgSEFMX1VTQVJUX01zcEluaXQoJmh1c2FydCkgQVBJLgorCisgICAgWy4uXQorICAgICAoQCkgVG8gY29uZmlndXJlIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgVVNBUlQgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gc3RvcCBtb2RlLCByZXNvcnQgdG8gVUFSVCBBUEkncworICAgICAgICBIQUxfVUFSVEV4X1N0b3BNb2RlV2FrZVVwU291cmNlQ29uZmlnKCksIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoKSBhbmQKKyAgICAgICAgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoKSBpbiBjYXN0aW5nIHRoZSBVU0FSVCBoYW5kbGUgdG8gVUFSVCB0eXBlIFVBUlRfSGFuZGxlVHlwZURlZi4KKworICAgICMjIyMjIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAjIyMjIworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgorCisgICAgWy4uXQorICAgIFVzZSBGdW5jdGlvbiBAcmVmIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIEZ1bmN0aW9uIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICA6IFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVU0FSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVVNBUlQgTXNwRGVJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgWy4uXQorICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9VU0FSVF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCisgICAgQHJlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAorICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAoKykgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBUeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICA6IFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2suCisgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgOiBSeCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICA6IFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrLgorICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICAgICAgIDogRXJyb3IgQ2FsbGJhY2suCisgICAgKCspIEFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgOiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICA6IFJ4IEZpZm8gRnVsbCBDYWxsYmFjay4KKyAgICAoKykgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICA6IFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2suCisgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgOiBVU0FSVCBNc3BJbml0LgorICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgIDogVVNBUlQgTXNwRGVJbml0LgorCisgICAgWy4uXQorICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9VU0FSVF9Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9VU0FSVF9TVEFURV9SRVNFVAorICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnM6CisgICAgZXhhbXBsZXMgQHJlZiBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrKCkuCisgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKQorICAgIGFuZCBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1VTQVJUX0luaXQoKSBhbmQgQHJlZiBIQUxfVVNBUlRfRGVJbml0KCkKKyAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgorCisgICAgWy4uXQorICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gSEFMX1VTQVJUX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCisgICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICBpbiBIQUxfVVNBUlRfU1RBVEVfUkVBRFkgb3IgSEFMX1VTQVJUX1NUQVRFX1JFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpCisgICAgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgIHVzaW5nIEByZWYgSEFMX1VTQVJUX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9VU0FSVF9EZUluaXQoKQorICAgIG9yIEByZWYgSEFMX1VTQVJUX0luaXQoKSBmdW5jdGlvbi4KKworICAgIFsuLl0KKyAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKKyAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgorCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVCBVU0FSVAorICAqIEBicmllZiBIQUwgVVNBUlQgU3luY2hyb25vdXMgbW9kdWxlIGRyaXZlcgorICAqIEB7CisgICovCisKKyNpZmRlZiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQKKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfQ29uc3RhbnRzIFVTQVJUIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVVNBUlRfRFVNTVlfREFUQSAgICAgICAgICAoKHVpbnQxNl90KSAweEZGRkYpICAgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0dGVkIGR1bW15IGRhdGEgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9URUFDS19SRUFDS19USU1FT1VUICAgICAgICAgICAgIDEwMDBVICAgICAgICAgICAgIC8qITwgVVNBUlQgVFggb3IgUlggZW5hYmxlIGFja25vd2xlZGdlIHRpbWUtb3V0IHZhbHVlICovCisjZGVmaW5lIFVTQVJUX0NSMV9GSUVMRFMgICAgICAgICAgKCh1aW50MzJfdCkoVVNBUlRfQ1IxX00gfCAgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgIHwgVVNBUlRfQ1IxX09WRVI4IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9GSUZPRU4gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBVU0FSVCBDUjEgZmllbGRzIG9mIHBhcmFtZXRlcnMgc2V0IGJ5IFVTQVJUX1NldENvbmZpZyBBUEkgKi8KKworI2RlZmluZSBVU0FSVF9DUjJfRklFTERTICAgICAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfQ0xLRU4gfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0xCQ0wgfCBVU0FSVF9DUjJfU1RPUCB8IFVTQVJUX0NSMl9TTFZFTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfRElTX05TUykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVVNBUlQgQ1IyIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVU0FSVF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQ1IzX0ZJRUxEUyAgICAgICAgICAoKHVpbnQzMl90KShVU0FSVF9DUjNfVFhGVENGRyB8IFVTQVJUX0NSM19SWEZUQ0ZHICkpICAgICAgICAgICAgIC8qITwgVVNBUlQgb3IgVVNBUlQgQ1IzIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBVU0FSVF9TZXRDb25maWcgQVBJICovCisKKyNkZWZpbmUgVVNBUlRfQlJSX01JTiAgICAweDEwVSAgICAgICAgLyogVVNBUlQgQlJSIG1pbmltdW0gYXV0aG9yaXplZCB2YWx1ZSAqLworI2RlZmluZSBVU0FSVF9CUlJfTUFYICAgIDB4RkZGRlUgICAgICAvKiBVU0FSVCBCUlIgbWF4aW11bSBhdXRob3JpemVkIHZhbHVlICovCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVNBUlRfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQordm9pZCBVU0FSVF9Jbml0Q2FsbGJhY2tzVG9EZWZhdWx0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0VuZFRyYW5zZmVyKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfU2V0Q29uZmlnKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfQ2hlY2tJZGxlU3RhdGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzhCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl84QklUX0ZJRk9FTihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfMTZCSVRfRklGT0VOKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfMTZCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzhCSVRfRklGT0VOKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CitzdGF0aWMgdm9pZCBVU0FSVF9SeElTUl8xNkJJVF9GSUZPRU4oVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9ucyBVU0FSVCBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgKgorQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGluaXRpYWxpemUgdGhlIFVTQVJUCisgICAgaW4gYXN5bmNocm9ub3VzIGFuZCBpbiBzeW5jaHJvbm91cyBtb2Rlcy4KKyAgICAgICgrKSBGb3IgdGhlIGFzeW5jaHJvbm91cyBtb2RlIG9ubHkgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgY29uZmlndXJlZDoKKyAgICAgICAgKCsrKSBCYXVkIFJhdGUKKyAgICAgICAgKCsrKSBXb3JkIExlbmd0aAorICAgICAgICAoKyspIFN0b3AgQml0CisgICAgICAgICgrKykgUGFyaXR5OiBJZiB0aGUgcGFyaXR5IGlzIGVuYWJsZWQsIHRoZW4gdGhlIE1TQiBiaXQgb2YgdGhlIGRhdGEgd3JpdHRlbgorICAgICAgICAgICAgIGluIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIHRyYW5zbWl0dGVkIGJ1dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYXJpdHkgYml0LgorICAgICAgICAoKyspIFVTQVJUIHBvbGFyaXR5CisgICAgICAgICgrKykgVVNBUlQgcGhhc2UKKyAgICAgICAgKCsrKSBVU0FSVCBMYXN0Qml0CisgICAgICAgICgrKykgUmVjZWl2ZXIvdHJhbnNtaXR0ZXIgbW9kZXMKKworICAgIFsuLl0KKyAgICBUaGUgSEFMX1VTQVJUX0luaXQoKSBmdW5jdGlvbiBmb2xsb3dzIHRoZSBVU0FSVCAgc3luY2hyb25vdXMgY29uZmlndXJhdGlvbgorICAgIHByb2NlZHVyZSAoZGV0YWlscyBmb3IgdGhlIHByb2NlZHVyZSBhcmUgYXZhaWxhYmxlIGluIHJlZmVyZW5jZSBtYW51YWwpLgorCitAZW5kdmVyYmF0aW0KKworICBEZXBlbmRpbmcgb24gdGhlIGZyYW1lIGxlbmd0aCBkZWZpbmVkIGJ5IHRoZSBNMSBhbmQgTTAgYml0cyAoNy1iaXQsCisgIDgtYml0IG9yIDktYml0KSwgdGhlIHBvc3NpYmxlIFVTQVJUIGZvcm1hdHMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgZm9sbG93aW5nIHRhYmxlLgorCisgICAgVGFibGUgMS4gVVNBUlQgZnJhbWUgZm9ybWF0LgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICBNMSBiaXQgfCAgTTAgYml0IHwgIFBDRSBiaXQgIHwgICAgICAgICAgICBVU0FSVCBmcmFtZSAgICAgICAgICAgICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDAgICAgfCAgICAwICAgICAgfCAgICB8IFNCIHwgICAgOCBiaXQgZGF0YSAgIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAwICAgIHwgICAgMCAgICB8ICAgIDEgICAgICB8ICAgIHwgU0IgfCA3IGJpdCBkYXRhIHwgUEIgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDAgICAgfCAgICAxICAgIHwgICAgMCAgICAgIHwgICAgfCBTQiB8ICAgIDkgYml0IGRhdGEgICB8IFNUQiB8ICAgICB8CisgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIHwgICAgMCAgICB8ICAgIDEgICAgfCAgICAxICAgICAgfCAgICB8IFNCIHwgOCBiaXQgZGF0YSB8IFBCIHwgU1RCIHwgICAgIHwKKyAgICB8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgfCAgICAxICAgIHwgICAgMCAgICB8ICAgIDAgICAgICB8ICAgIHwgU0IgfCAgICA3IGJpdCBkYXRhICAgfCBTVEIgfCAgICAgfAorICAgIHwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICB8ICAgIDEgICAgfCAgICAwICAgIHwgICAgMSAgICAgIHwgICAgfCBTQiB8IDYgYml0IGRhdGEgfCBQQiB8IFNUQiB8ICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBVU0FSVCBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0luaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBDaGVjayB0aGUgVVNBUlQgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh1c2FydCA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFU0VUKQorICB7CisgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLworICAgIGh1c2FydC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIFVTQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoaHVzYXJ0KTsKKworICAgIGlmIChodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX1VTQVJUX01zcEluaXQ7CisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0sgKi8KKyAgICBIQUxfVVNBUlRfTXNwSW5pdChodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogU2V0IHRoZSBVc2FydCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KKyAgaWYgKFVTQVJUX1NldENvbmZpZyhodXNhcnQpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBJbiBTeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CisgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIKKyAgLSBIRFNFTCwgU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyICY9IH5VU0FSVF9DUjJfTElORU47CisgIGh1c2FydC0+SW5zdGFuY2UtPkNSMyAmPSB+KFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0hEU0VMIHwgVVNBUlRfQ1IzX0lSRU4pOworCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VU0FSVF9FTkFCTEUoaHVzYXJ0KTsKKworICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIHJldHVybiAoVVNBUlRfQ2hlY2tJZGxlU3RhdGUoaHVzYXJ0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIENoZWNrIHRoZSBVU0FSVCBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaHVzYXJ0ID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyID0gMHgwVTsKKyAgaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzID0gMHgwVTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BEZUluaXQ7CisgIH0KKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgSEFMX1VTQVJUX01zcERlSW5pdChodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRVNFVDsKKworICAvKiBQcm9jZXNzIFVubG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVVNBUlQgTVNQLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX01zcEluaXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgVVNBUlQgTVNQLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX01zcERlSW5pdChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFVTQVJUIENhbGxiYWNrCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHVzYXJ0IHVzYXJ0IGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKysgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfQUJPUlRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfRklGT19GVUxMX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5SeEZpZm9GdWxsQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5UeEZpZm9FbXB0eUNhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQpCisgIHsKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gVUFSVCBDYWxsYmFjaworICAqICAgICAgICAgVUFSVCBjYWxsYWJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBodXNhcnQgdWFydCBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX0NPTVBMRVRFX0NCX0lEIFR4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9SWF9DT01QTEVURV9DQl9JRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1RYX1JYX0NPTVBMRVRFX0NCX0lEIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfVVNBUlRfRVJST1JfQ0JfSUQgRXJyb3IgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9BQk9SVF9DT01QTEVURV9DQl9JRCBBYm9ydCBDb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1VTQVJUX1JYX0ZJRk9fRlVMTF9DQl9JRCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9UWF9GSUZPX0VNUFRZX0NCX0lEIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9VU0FSVF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaWYgKEhBTF9VU0FSVF9TVEFURV9SRUFEWSA9PSBodXNhcnQtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VTQVJUX1RYX0hBTEZDT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhIYWxmQ3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayAgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrID0gSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9FUlJPUl9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+RXJyb3JDYWxsYmFjayA9IEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9BQk9SVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+QWJvcnRDcGx0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9SWF9GSUZPX0ZVTExfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayA9IEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfVFhfRklGT19FTVBUWV9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+VHhGaWZvRW1wdHlDYWxsYmFjayA9IEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBUeEZpZm9FbXB0eUNhbGxiYWNrICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9VU0FSVF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXRDYWxsYmFjayAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGh1c2FydC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfVVNBUlRfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXRDYWxsYmFjayAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9VU0FSVF9TVEFURV9SRVNFVCA9PSBodXNhcnQtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX1VTQVJUX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBodXNhcnQtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfVVNBUlRfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaHVzYXJ0LT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9VU0FSVF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgICogQGJyaWVmICAgVVNBUlQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBtYW5hZ2UgdGhlIFVTQVJUIHN5bmNocm9ub3VzCisgICAgZGF0YSB0cmFuc2ZlcnMuCisKKyAgICBbLi5dIFRoZSBVU0FSVCBzdXBwb3J0cyBtYXN0ZXIgbW9kZSBvbmx5OiBpdCBjYW5ub3QgcmVjZWl2ZSBvciBzZW5kIGRhdGEgcmVsYXRlZCB0byBhbiBpbnB1dAorICAgICAgICAgY2xvY2sgKFNDTEsgaXMgYWx3YXlzIGFuIG91dHB1dCkuCisKKyAgICBbLi5dCisKKyAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoKKyAgICAgICAgKCsrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgorICAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuCisgICAgICAgICgrKykgTm8tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMKKyAgICAgICAgICAgICBvciBETUEsIFRoZXNlIEFQSSdzIHJldHVybiB0aGUgSEFMIHN0YXR1cy4KKyAgICAgICAgICAgICBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICBkZWRpY2F0ZWQgVVNBUlQgSVJRIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IgdGhlIERNQSBJUlEgd2hlbgorICAgICAgICAgICAgIHVzaW5nIERNQSBtb2RlLgorICAgICAgICAgICAgIFRoZSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKCkgYW5kIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MKKyAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIHJlc3BlY3RpdmVseSBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc21pdCBvciBSZWNlaXZlIHByb2Nlc3MKKyAgICAgICAgICAgICBUaGUgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKXVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgY29tbXVuaWNhdGlvbiBlcnJvciBpcyBkZXRlY3RlZAorCisgICAgKCMpIEJsb2NraW5nIG1vZGUgQVBJJ3MgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXQoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZSgpIGluIGZ1bGwgZHVwbGV4IHJlY2VpdmUgb25seQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmUoKSBpbiBmdWxsIGR1cGxleCBtb2RlCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJJ3Mgd2l0aCBJbnRlcnJ1cHQgYXJlIDoKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKSBpbiBzaW1wbGV4IG1vZGUKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUmVjZWl2ZV9JVCgpIGluIGZ1bGwgZHVwbGV4IHJlY2VpdmUgb25seQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfSVQoKSBpbiBmdWxsIGR1cGxleCBtb2RlCisgICAgICAgICgrKykgSEFMX1VTQVJUX0lSUUhhbmRsZXIoKQorCisgICAgKCMpIE5vLUJsb2NraW5nIG1vZGUgQVBJJ3MgIHdpdGggRE1BIGFyZSA6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQSgpIGluIHNpbXBsZXggbW9kZQorICAgICAgICAoKyspIEhBTF9VU0FSVF9SZWNlaXZlX0RNQSgpIGluIGZ1bGwgZHVwbGV4IHJlY2VpdmUgb25seQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKCkgaW4gZnVsbCBkdXBsZXggbW9kZQorICAgICAgICAoKyspIEhBTF9VU0FSVF9ETUFQYXVzZSgpCisgICAgICAgICgrKykgSEFMX1VTQVJUX0RNQVJlc3VtZSgpCisgICAgICAgICgrKykgSEFMX1VTQVJUX0RNQVN0b3AoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gTm9uX0Jsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9UeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjaygpCisKKyAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgorICAgICAgICAoKyspIEhBTF9VU0FSVF9BYm9ydCgpCisgICAgICAgICgrKykgSEFMX1VTQVJUX0Fib3J0X0lUKCkKKworICAgICgjKSBGb3IgQWJvcnQgc2VydmljZXMgYmFzZWQgb24gaW50ZXJydXB0cyAoSEFMX1VTQVJUX0Fib3J0X0lUKSwgYSBBYm9ydCBDb21wbGV0ZSBDYWxsYmFja3MgaXMgcHJvdmlkZWQ6CisgICAgICAgICgrKykgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKKworICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCisgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKKyAgICAgICAgKCsrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzCisgICAgICAgICAgICAgdG8gYmUgZXZhbHVhdGVkIGJ5IHVzZXIgOiB0aGlzIGNvbmNlcm5zIEZyYW1lIEVycm9yLCBQYXJpdHkgRXJyb3Igb3IgTm9pc2UgRXJyb3IgaW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIC4KKyAgICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKKyAgICAgICAgICAgICBhbmQgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gVVNBUlQgc2lkZS4KKyAgICAgICAgICAgICBJZiB1c2VyIHdhbnRzIHRvIGFib3J0IGl0LCBBYm9ydCBzZXJ2aWNlcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHVzZXIuCisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBCbG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuCisgICAgICAgICAgICAgVGhpcyBjb25jZXJucyBPdmVycnVuIEVycm9yIEluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgICBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsIGFuZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnB0eGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnB0eGRhdGExNmJpdHM7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgCisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIEluIGNhc2Ugb2YgOWJpdHMvTm8gUGFyaXR5IHRyYW5zZmVyLCBwVHhEYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSB1aW50MTZfdCBwb2ludGVyICovCisgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgeworICAgICAgcHR4ZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwdHhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBUeERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwdHhkYXRhOGJpdHMgID0gcFR4RGF0YTsKKyAgICAgIHB0eGRhdGExNmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIC8qIENoZWNrIHRoZSByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50ICovCisgICAgd2hpbGUgKGh1c2FydC0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICB7CisgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIGlmIChwdHhkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqcHR4ZGF0YTE2Yml0cyAmIDB4MDFGRlUpOworICAgICAgICBwdHhkYXRhMTZiaXRzKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9ICh1aW50OF90KSgqcHR4ZGF0YThiaXRzICYgMHhGRlUpOworICAgICAgICBwdHhkYXRhOGJpdHMrKzsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5UeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UQywgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKiBDbGVhciBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyAqLworICAgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9UQ0YpOworCisgICAgLyogQ2xlYXIgb3ZlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRoZSByZWNlaXZlZCBkYXRhICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfT1JFRkxBRyhodXNhcnQpOworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgICAgLyogQXQgZW5kIG9mIFR4IHByb2Nlc3MsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBub3RlIFRvIHJlY2VpdmUgc3luY2hyb25vdXMgZGF0YSwgZHVtbXkgZGF0YSBhcmUgc2ltdWx0YW5lb3VzbHkgdHJhbnNtaXR0ZWQuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtIHBSeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1JlY2VpdmUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50OF90ICAqcHJ4ZGF0YThiaXRzOworICB1aW50MTZfdCAqcHJ4ZGF0YTE2Yml0czsKKyAgdWludDE2X3QgdWhNYXNrOworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisgIAorCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuICBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oaHVzYXJ0KTsKKyAgICB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHByeGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCAqKSBwUnhEYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcHJ4ZGF0YThiaXRzICA9IHBSeERhdGE7CisgICAgICBwcnhkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLworICAgIHdoaWxlIChodXNhcnQtPlJ4WGZlckNvdW50ID4gMFUpCisgICAgeworICAgICAgaWYgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKQorICAgICAgeworICAgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGR1bW15IGJ5dGUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlCisgICAgICAgICogY2xvY2sgZm9yIHRoZSBzbGF2ZSB0byBzZW5kIGRhdGEuCisgICAgICAgICogV2hhdGV2ZXIgdGhlIGZyYW1lIGxlbmd0aCAoNywgOCBvciA5LWJpdCBsb25nKSwgdGhlIHNhbWUgZHVtbXkgdmFsdWUKKyAgICAgICAgKiBjYW4gYmUgd3JpdHRlbiBmb3IgYWxsIHRoZSBjYXNlcy4gKi8KKyAgICAgICAgaWYgKFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVzYXJ0LCBVU0FSVF9GTEFHX1RYRSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MEZGKTsKKyAgICAgIH0KKworICAgICAgLyogV2FpdCBmb3IgUlhORSBGbGFnICovCisgICAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0ZMQUdfUlhORSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICB9CisKKyAgICAgIGlmIChwcnhkYXRhOGJpdHMgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgKnByeGRhdGExNmJpdHMgPSAodWludDE2X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmIHVoTWFzayk7CisgICAgICAgIHByeGRhdGExNmJpdHMrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgKnByeGRhdGE4Yml0cyA9ICh1aW50OF90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgcHJ4ZGF0YThiaXRzKys7CisgICAgICB9CisKKyAgICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKworICAgIH0KKworICAgIC8qIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRyYW5zbWl0IGRhdGEgKi8KKyAgICBpZiAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgUnggcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBTZW5kIGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IChzYW1lIGFtb3VudCB0byBiZSByZWNlaXZlZCkuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgdWludDhfdCAgKnByeGRhdGE4Yml0czsKKyAgdWludDE2X3QgKnByeGRhdGExNmJpdHM7CisgIHVpbnQ4X3QgICpwdHhkYXRhOGJpdHM7CisgIHVpbnQxNl90ICpwdHhkYXRhMTZiaXRzOworICB1aW50MTZfdCB1aE1hc2s7CisgIHVpbnQxNl90IHJ4ZGF0YWNvdW50OworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICBpZiAoKHBUeERhdGEgPT0gTlVMTCkgfHwgKHBSeERhdGEgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLworICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IFNpemU7CisKKyAgICAvKiBDb21wdXRhdGlvbiBvZiBVU0FSVCBtYXNrIHRvIGFwcGx5IHRvIFJEUiByZWdpc3RlciAqLworICAgIFVTQVJUX01BU0tfQ09NUFVUQVRJT04oaHVzYXJ0KTsKKyAgICB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcFJ4RGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgdWludDE2X3QgcG9pbnRlciAqLworICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgIHsKKyAgICAgIHByeGRhdGE4Yml0cyAgPSBOVUxMOworICAgICAgcHR4ZGF0YThiaXRzICA9IE5VTEw7CisgICAgICBwdHhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBUeERhdGE7CisgICAgICBwcnhkYXRhMTZiaXRzID0gKHVpbnQxNl90ICopIHBSeERhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcnhkYXRhOGJpdHMgID0gcFJ4RGF0YTsKKyAgICAgIHB0eGRhdGE4Yml0cyAgPSBwVHhEYXRhOworICAgICAgcHR4ZGF0YTE2Yml0cyA9IE5VTEw7CisgICAgICBwcnhkYXRhMTZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMHgwMVUpIHx8IChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKSkKKyAgICB7CisgICAgICAvKiBXYWl0IHVudGlsIFRYRSBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KKyAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgICAgaWYgKHB0eGRhdGE4Yml0cyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgdWhNYXNrKTsKKyAgICAgICAgcHR4ZGF0YTE2Yml0cysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKnB0eGRhdGE4Yml0cyAmICh1aW50OF90KSh1aE1hc2sgJiAweEZGVSkpOworICAgICAgICBwdHhkYXRhOGJpdHMrKzsKKyAgICAgIH0KKworICAgICAgaHVzYXJ0LT5UeFhmZXJDb3VudC0tOworICAgIH0KKworICAgIC8qIENoZWNrIHRoZSByZW1haW4gZGF0YSB0byBiZSBzZW50ICovCisgICAgLyogcnhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgcnhkYXRhY291bnQgPSBodXNhcnQtPlJ4WGZlckNvdW50OworICAgIHdoaWxlICgoaHVzYXJ0LT5UeFhmZXJDb3VudCA+IDBVKSB8fCAocnhkYXRhY291bnQgPiAwVSkpCisgICAgeworICAgICAgaWYgKGh1c2FydC0+VHhYZmVyQ291bnQgPiAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgdG8gc2VuZCBkYXRhICovCisgICAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19UWEUsIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHR4ZGF0YThiaXRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCpwdHhkYXRhMTZiaXRzICYgdWhNYXNrKTsKKyAgICAgICAgICBwdHhkYXRhMTZiaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdHhkYXRhOGJpdHMgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgICBwdHhkYXRhOGJpdHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGh1c2FydC0+VHhYZmVyQ291bnQtLTsKKyAgICAgIH0KKworICAgICAgaWYgKGh1c2FydC0+UnhYZmVyQ291bnQgPiAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgUlhORSBGbGFnICovCisgICAgICAgIGlmIChVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1c2FydCwgVVNBUlRfRkxBR19SWE5FLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJ4ZGF0YThiaXRzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAqcHJ4ZGF0YTE2Yml0cyA9ICh1aW50MTZfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgdWhNYXNrKTsKKyAgICAgICAgICBwcnhkYXRhMTZiaXRzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKnByeGRhdGE4Yml0cyA9ICh1aW50OF90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiAodWludDhfdCkodWhNYXNrICYgMHhGRlUpKTsKKyAgICAgICAgICBwcnhkYXRhOGJpdHMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKyAgICAgIH0KKyAgICAgIHJ4ZGF0YWNvdW50ID0gaHVzYXJ0LT5SeFhmZXJDb3VudDsKKyAgICB9CisKKyAgICAvKiBBdCBlbmQgb2YgVHhSeCBwcm9jZXNzLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wVHhCdWZmUHRyICA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CisgICAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IFNpemU7CisgICAgaHVzYXJ0LT5UeElTUiAgICAgICA9IE5VTEw7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgICAgID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFg7CisKKyAgICAvKiBUaGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0czogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKKyAgICBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIFVTQVJUIFRyYW5zbWl0IFByb2Nlc3MgdG8gYXZvaWQgdGhlIG92ZXJydW4gaW50ZXJydXB0CisgICAgd2hlbiB0aGUgdXNhcnQgbW9kZSBpcyBjb25maWd1cmVkIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSAiVVNBUlRfTU9ERV9UWF9SWCIKKyAgICB0byBiZW5lZml0IGZvciB0aGUgZnJhbWUgZXJyb3IgYW5kIG5vaXNlIGludGVycnVwdHMgdGhlIHVzYXJ0IG1vZGUgc2hvdWxkIGJlCisgICAgY29uZmlndXJlZCBvbmx5IGZvciB0cmFuc21pdCAiVVNBUlRfTU9ERV9UWCIgKi8KKworICAgIC8qIENvbmZpZ3VyZSBUeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmIChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFR4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl8xNkJJVF9GSUZPRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl84QklUX0ZJRk9FTjsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVFggRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UWEZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVHggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzE2QklUOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBodXNhcnQtPlR4SVNSID0gVVNBUlRfVHhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgIFRvIHJlY2VpdmUgc3luY2hyb25vdXMgZGF0YSwgZHVtbXkgZGF0YSBhcmUgc2ltdWx0YW5lb3VzbHkgdHJhbnNtaXR0ZWQuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKK3sKKyAgdWludDE2X3QgbmJfZHVtbXlfZGF0YTsKKworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciAgPSBwUnhEYXRhOworICAgIGh1c2FydC0+UnhYZmVyU2l6ZSAgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+UnhJU1IgICAgICAgPSBOVUxMOworCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlg7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBDb25maWd1cmUgUnggaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KKyAgICBpZiAoKGh1c2FydC0+Rmlmb01vZGUgPT0gVVNBUlRfRklGT01PREVfRU5BQkxFKSAmJiAoU2l6ZSA+PSBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIFJ4IElTUiBmdW5jdGlvbiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgZGF0YSB3b3JkIGxlbmd0aCAqLworICAgICAgaWYgKChodXNhcnQtPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVzYXJ0LT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkpCisgICAgICB7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl8xNkJJVF9GSUZPRU47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl84QklUX0ZJRk9FTjsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIGludGVycnVwdCBhbmQgUlggRklGTyBUaHJlc2hvbGQgaW50ZXJydXB0ICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1BFSUUpOworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19SWEZUSUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBSeCBJU1IgZnVuY3Rpb24gcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgd29yZCBsZW5ndGggKi8KKyAgICAgIGlmICgoaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF85QikgJiYgKGh1c2FydC0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpKQorICAgICAgeworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfMTZCSVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+UnhJU1IgPSBVU0FSVF9SeElTUl84QklUOworICAgICAgfQorCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgYW5kIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisgICAgfQorCisgICAgaWYgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIFNlbmQgZHVtbXkgZGF0YSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBzZW5kIHRoZSBuZXh0IGRhdGEuCisgICAgICAgICBXaGVuIEZJRk8gbW9kZSBpcyBkaXNhYmxlZCBvbmx5IG9uZSBkYXRhIG11c3QgYmUgdHJhbnNmZXJyZWQuCisgICAgICAgICBXaGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkIGRhdGEgbXVzdCBiZSB0cmFuc21pdHRlZCB1bnRpbCB0aGUgUlggRklGTyByZWFjaGVzIGl0cyB0aHJlc2hvbGQuCisgICAgICAqLworICAgICAgaWYgKChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkgJiYgKFNpemUgPj0gaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpCisgICAgICB7CisgICAgICAgIGZvciAobmJfZHVtbXlfZGF0YSA9IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgOyBuYl9kdW1teV9kYXRhID4gMFUgOyBuYl9kdW1teV9kYXRhLS0pCisgICAgICAgIHsKKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIEZ1bGwtRHVwbGV4IFNlbmQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50IChzYW1lIGFtb3VudCB0byBiZSByZWNlaXZlZCkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwgIHVpbnQxNl90IFNpemUpCit7CisKKyAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKChwVHhEYXRhID09IE5VTEwpIHx8IChwUnhEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodXNhcnQpOworCisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyID0gcFJ4RGF0YTsKKyAgICBodXNhcnQtPlJ4WGZlclNpemUgPSBTaXplOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQgPSBTaXplOworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIC8qIENvbXB1dGF0aW9uIG9mIFVTQVJUIG1hc2sgdG8gYXBwbHkgdG8gUkRSIHJlZ2lzdGVyICovCisgICAgVVNBUlRfTUFTS19DT01QVVRBVElPTihodXNhcnQpOworCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlg7CisKKyAgICAvKiBDb25maWd1cmUgVHhSeCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworICAgIGlmICgoaHVzYXJ0LT5GaWZvTW9kZSA9PSBVU0FSVF9GSUZPTU9ERV9FTkFCTEUpICYmIChTaXplID49IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgUnggSVNSIGZ1bmN0aW9uIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHdvcmQgbGVuZ3RoICovCisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzE2QklUX0ZJRk9FTjsKKyAgICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzE2QklUX0ZJRk9FTjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzhCSVRfRklGT0VOOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfOEJJVF9GSUZPRU47CisgICAgICB9CisKKyAgICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIGludGVycnVwdCAgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVFggYW5kICBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHRzICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19UWEZUSUUgfCBVU0FSVF9DUjNfUlhGVElFKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGh1c2FydC0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOUIpICYmIChodXNhcnQtPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5UeElTUiA9IFVTQVJUX1R4SVNSXzE2QklUOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfMTZCSVQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGh1c2FydC0+VHhJU1IgPSBVU0FSVF9UeElTUl84QklUOworICAgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfOEJJVDsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgYW5kIFVTQVJUIERhdGEgUmVnaXN0ZXIgbm90IGVtcHR5IEludGVycnVwdHMgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSk7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgKnRtcDsKKworCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFR4QnVmZlB0ciA9IHBUeERhdGE7CisgICAgaHVzYXJ0LT5UeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKKworICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYOworCisgICAgaWYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gVVNBUlRfRE1BVHJhbnNtaXRDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwVHhEYXRhOworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCAqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworICAgIH0KKworICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIFRDIGZsYWcgaW4gdGhlIElDUiByZWdpc3RlciAqLworICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX1RDRik7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNldCBlcnJvciBjb2RlIHRvIERNQSAqLworICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfRE1BOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICAgICAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIHJlYWR5ICovCisgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICAgICAgCisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCisgICogQG5vdGUgICBXaGVuIHRoZSBVU0FSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4KKyAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBub3RlIFRoZSBVU0FSVCBETUEgdHJhbnNtaXQgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgc2xhdmUuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKyAgdWludDMyX3QgKnRtcCA9ICh1aW50MzJfdCAqKSZwUnhEYXRhOworICAKKworICAvKiBDaGVjayB0aGF0IGEgUnggcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBvbmdvaW5nICovCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwUnhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWDsKKworICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBSeCB0cmFuc2ZlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gVVNBUlRfRE1BRXJyb3I7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgcmVjZWl2ZSBETUEgY2hhbm5lbCAqLworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QgKil0bXAsIFNpemUpOworICAgIH0KKworICAgIGlmICgoc3RhdHVzID09IEhBTF9PSykgJiYKKyAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICB7CisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsOiB0aGUgdHJhbnNtaXQgY2hhbm5lbCBpcyB1c2VkIGluIG9yZGVyCisgICAgICAgICB0byBnZW5lcmF0ZSBpbiB0aGUgbm9uLWJsb2NraW5nIG1vZGUgdGhlIGNsb2NrIHRvIHRoZSBzbGF2ZSBkZXZpY2UsCisgICAgICAgICB0aGlzIG1vZGUgaXNuJ3QgYSBzaW1wbGV4IHJlY2VpdmUgbW9kZSBidXQgYSBmdWxsLWR1cGxleCByZWNlaXZlIG1vZGUgKi8KKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgVHggQ29tcGxldGUgYW5kIEVycm9yIGNhbGxiYWNrIHRvIE51bGwgKi8KKyAgICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IE5VTEw7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaHVzYXJ0LT5oZG1hdHgsICoodWludDMyX3QgKil0bXAsICh1aW50MzJfdCkmaHVzYXJ0LT5JbnN0YW5jZS0+VERSLCBTaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BUiBiaXQKKyAgICAgICAgIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVQgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWFyeCk7CisgICAgICB9CisgCisgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIG9uIGVycm9yIGNvZGUgKi8KKyAgICAgIFVOVVNFRChzdGF0dXMpOworCisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBGdWxsLUR1cGxleCBUcmFuc21pdCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgVVNBUlQgcGFyaXR5IGlzIGVuYWJsZWQgKFBDRSA9IDEpIHRoZSBkYXRhIHJlY2VpdmVkIGNvbnRhaW4gdGhlIHBhcml0eSBiaXQuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIFJYIGRhdGEgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC9zZW50LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CisgIHVpbnQzMl90ICp0bXA7CisgIAorCisgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIGlmICgocFR4RGF0YSA9PSBOVUxMKSB8fCAocFJ4RGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkpCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICAgIGh1c2FydC0+cFJ4QnVmZlB0ciA9IHBSeERhdGE7CisgICAgaHVzYXJ0LT5SeFhmZXJTaXplID0gU2l6ZTsKKyAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgPSBwVHhEYXRhOworICAgIGh1c2FydC0+VHhYZmVyU2l6ZSA9IFNpemU7CisKKyAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWDsKKworICAgIGlmICgoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkgJiYgKGh1c2FydC0+aGRtYXR4ICE9IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFJ4IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVJlY2VpdmVDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEhhbGZDcGx0OworCisgICAgICAvKiBTZXQgdGhlIFVTQVJUIERNQSBUeCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBVU0FSVF9ETUFUcmFuc21pdENwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFVTQVJUX0RNQVR4SGFsZkNwbHQ7CisKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIFR4IHRyYW5zZmVyIGVycm9yIGNhbGxiYWNrICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBVU0FSVF9ETUFFcnJvcjsKKworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgUnggdHJhbnNmZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFVTQVJUX0RNQUVycm9yOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHJlY2VpdmUgRE1BIGNoYW5uZWwgKi8KKyAgICAgIHRtcCA9ICh1aW50MzJfdCAqKSZwUnhEYXRhOworICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWFyeCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5SRFIsICoodWludDMyX3QgKil0bXAsIFNpemUpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIHRyYW5zbWl0IERNQSBjaGFubmVsICovCisgICAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDMyX3QgKikmcFR4RGF0YTsKKyAgICAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChodXNhcnQtPmhkbWF0eCwgKih1aW50MzJfdCAqKXRtcCwgKHVpbnQzMl90KSZodXNhcnQtPkluc3RhbmNlLT5URFIsIFNpemUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgIH0KKyAgICAKKyAgICBpZihzdGF0dXMgPT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBDbGVhciB0aGUgVEMgZmxhZyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9GTEFHKGh1c2FydCwgVVNBUlRfQ0xFQVJfVENGKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQVIgYml0CisgICAgICAgICBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovCisgICAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpOworICAgICAgfQorCisgICAgICAvKiBObyBuZWVkIHRvIGNoZWNrIG9uIGVycm9yIGNvZGUgKi8KKyAgICAgIFVOVVNFRChzdGF0dXMpOworCisgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byByZWFkeSAqLworICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBQYXVzZSB0aGUgRE1BIFRyYW5zZmVyLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9ETUFQYXVzZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgVHggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICAgIH0KKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBETUEgUnggcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiBSZXN1bWUgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUmVzdW1lKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIC8qIENsZWFyIHRoZSBPdmVycnVuIGZsYWcgYmVmb3JlIHJlc3VtaW5nIHRoZSBSeCB0cmFuc2ZlciovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYpOworCisgICAgLyogUmVlbmFibGUgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERNQSBSeCByZXF1ZXN0ICBiZWZvcmUgdGhlIERNQSBUeCByZXF1ZXN0ICovCisgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKworICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgRE1BIFR4IHJlcXVlc3QgKi8KKyAgICBTRVRfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIFN0b3AgdGhlIERNQSBUcmFuc2Zlci4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BU3RvcChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFRoZSBMb2NrIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIEFQSSB0byBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbgorICAgICB0byBjYWxsIHRoZSBIQUwgVVNBUlQgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soKSAvIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjaygpIC8KKyAgICAgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayAvIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2s6CisgICAgIGluZGVlZCwgd2hlbiBIQUxfRE1BX0Fib3J0KCkgQVBJIGlzIGNhbGxlZCwgdGhlIERNQSBUWC9SWCBUcmFuc2ZlciBvciBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlCisgICAgIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgdGhlIERNQSB0cmFuc2ZlciBpbnRlcnJ1cHRpb24gb2NjdXJzIGF0IHRoZSBtaWRkbGUgb3IgYXQgdGhlIGVuZCBvZgorICAgICB0aGUgc3RyZWFtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGJhY2sgaXMgZXhlY3V0ZWQuICovCisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgVHgvUnggRE1BIHJlcXVlc3RzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpOworCisgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgdHggY2hhbm5lbCAqLworICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXR4KSAhPSBIQUxfT0spCisgICAgeworICAgICAgaWYgKEhBTF9ETUFfR2V0RXJyb3IoaHVzYXJ0LT5oZG1hdHgpID09IEhBTF9ETUFfRVJST1JfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX0RNQTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSByeCBjaGFubmVsICovCisgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICB7CisgICAgaWYgKEhBTF9ETUFfQWJvcnQoaHVzYXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodXNhcnQtPmhkbWFyeCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgeworICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfRE1BOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFVTQVJUX0VuZFRyYW5zZmVyKGh1c2FydCk7CisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBYm9ydCBvbmdvaW5nIHRyYW5zZmVycyAoYmxvY2tpbmcgbW9kZSkuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgY291bGQgYmUgdXNlZCBmb3IgYWJvcnRpbmcgYW55IG9uZ29pbmcgdHJhbnNmZXIgc3RhcnRlZCBpbiBJbnRlcnJ1cHQgb3IgRE1BIG1vZGUuCisgICogICAgICAgICBUaGlzIHByb2NlZHVyZSBwZXJmb3JtcyBmb2xsb3dpbmcgb3BlcmF0aW9ucyA6CisgICogICAgICAgICAgIC0gRGlzYWJsZSBVU0FSVCBJbnRlcnJ1cHRzIChUeCBhbmQgUngpCisgICogICAgICAgICAgIC0gRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGluIHRoZSBwZXJpcGhlcmFsIHJlZ2lzdGVyIChpZiBlbmFibGVkKQorICAqICAgICAgICAgICAtIEFib3J0IERNQSB0cmFuc2ZlciBieSBjYWxsaW5nIEhBTF9ETUFfQWJvcnQgKGluIGNhc2Ugb2YgdHJhbnNmZXIgaW4gRE1BIG1vZGUpCisgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQorICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0Fib3J0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUlhGVCwgVFhGVCwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRV9UWEZORklFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgKFVTQVJUX0NSM19FSUUgfCBVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX1RYRlRJRSkpOworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBUeCBjaGFubmVsIDogdXNlIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKG5vIGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgVVNBUlQgRE1BIEFib3J0IGNhbGxiYWNrIHRvIE51bGwuCisgICAgICAgICBObyBjYWxsIGJhY2sgZXhlY3V0aW9uIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICBpZiAoSEFMX0RNQV9BYm9ydChodXNhcnQtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBpZiAoSEFMX0RNQV9HZXRFcnJvcihodXNhcnQtPmhkbWF0eCkgPT0gSEFMX0RNQV9FUlJPUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCisgICAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfRE1BOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2UgYmxvY2tpbmcgRE1BIEFib3J0IEFQSSAobm8gY2FsbGJhY2spICovCisgICAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHRoZSBVU0FSVCBETUEgQWJvcnQgY2FsbGJhY2sgdG8gTnVsbC4KKyAgICAgICAgIE5vIGNhbGwgYmFjayBleGVjdXRpb24gYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgICAgIGlmIChIQUxfRE1BX0Fib3J0KGh1c2FydC0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGlmIChIQUxfRE1BX0dldEVycm9yKGh1c2FydC0+aGRtYXJ4KSA9PSBIQUxfRE1BX0VSUk9SX1RJTUVPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KKyAgICAgICAgICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgIC8qIEZsdXNoIHRoZSB3aG9sZSBUWCBGSUZPIChpZiBuZWVkZWQpICovCisgIGlmIChodXNhcnQtPkZpZm9Nb2RlID09IFVTQVJUX0ZJRk9NT0RFX0VOQUJMRSkKKyAgeworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9CisKKyAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUmVzZXQgSGFuZGxlIEVycm9yQ29kZSB0byBObyBFcnJvciAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgb25nb2luZyB0cmFuc2ZlcnMgKEludGVycnVwdCBtb2RlKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBjb3VsZCBiZSB1c2VkIGZvciBhYm9ydGluZyBhbnkgb25nb2luZyB0cmFuc2ZlciBzdGFydGVkIGluIEludGVycnVwdCBvciBETUEgbW9kZS4KKyAgKiAgICAgICAgIFRoaXMgcHJvY2VkdXJlIHBlcmZvcm1zIGZvbGxvd2luZyBvcGVyYXRpb25zIDoKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIFVTQVJUIEludGVycnVwdHMgKFR4IGFuZCBSeCkKKyAgKiAgICAgICAgICAgLSBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgaW4gdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXIgKGlmIGVuYWJsZWQpCisgICogICAgICAgICAgIC0gQWJvcnQgRE1BIHRyYW5zZmVyIGJ5IGNhbGxpbmcgSEFMX0RNQV9BYm9ydF9JVCAoaW4gY2FzZSBvZiB0cmFuc2ZlciBpbiBETUEgbW9kZSkKKyAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCisgICogICAgICAgICAgIC0gQXQgYWJvcnQgY29tcGxldGlvbiwgY2FsbCB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrCisgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQorICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9BYm9ydF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOworCisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFJYRlQsIFRYRlQsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBJZiBETUEgVHggYW5kL29yIERNQSBSeCBIYW5kbGVzIGFyZSBhc3NvY2lhdGVkIHRvIFVTQVJUIEhhbmRsZSwgRE1BIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrcyBzaG91bGQgYmUgaW5pdGlhbGlzZWQKKyAgICAgYmVmb3JlIGFueSBjYWxsIHRvIERNQSBBYm9ydCBmdW5jdGlvbnMgKi8KKyAgLyogRE1BIFR4IEhhbmRsZSBpcyB2YWxpZCAqLworICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgeworICAgIC8qIFNldCBETUEgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgaWYgVVNBUlQgRE1BIFR4IHJlcXVlc3QgaWYgZW5hYmxlZC4KKyAgICAgICBPdGhlcndpc2UsIHNldCBpdCB0byBOVUxMICovCisgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVTQVJUX0RNQVR4QWJvcnRDYWxsYmFjazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisgICAgfQorICB9CisgIC8qIERNQSBSeCBIYW5kbGUgaXMgdmFsaWQgKi8KKyAgaWYgKGh1c2FydC0+aGRtYXJ4ICE9IE5VTEwpCisgIHsKKyAgICAvKiBTZXQgRE1BIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrIGlmIFVTQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQuCisgICAgICAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gTlVMTCAqLworICAgIGlmIChIQUxfSVNfQklUX1NFVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKSkKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBVU0FSVF9ETUFSeEFib3J0Q2FsbGJhY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBUeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgVHggYXQgVVNBUlQgbGV2ZWwgKi8KKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVTQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBUWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWJvcnRjcGx0ID0gMFU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRE1BIFJ4IHJlcXVlc3QgaWYgZW5hYmxlZCAqLworICBpZiAoSEFMX0lTX0JJVF9TRVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpCisgIHsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFJ4IGNoYW5uZWwgOiB1c2Ugbm9uIGJsb2NraW5nIERNQSBBYm9ydCBBUEkgKGNhbGxiYWNrKSAqLworICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVTQVJUIFJ4IERNQSBBYm9ydCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpc2VkIDoKKyAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9BYm9ydENwbHRDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisKKyAgICAgIC8qIEFib3J0IERNQSBSWCAqLworICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgYWJvcnRjcGx0ID0gMVU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFib3J0Y3BsdCA9IDBVOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIG5vIERNQSBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBleGVjdXRpb24gaXMgcmVxdWlyZWQgPT4gY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGlmIChhYm9ydGNwbHQgPT0gMVUpCisgIHsKKyAgICAvKiBSZXNldCBUeCBhbmQgUnggdHJhbnNmZXIgY291bnRlcnMgKi8KKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisgICAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgICAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgICAgaHVzYXJ0LT5FcnJvckNvZGUgPSBIQUxfVVNBUlRfRVJST1JfTk9ORTsKKworICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgICAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgICAgLyogRmx1c2ggdGhlIHdob2xlIFRYIEZJRk8gKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAoaHVzYXJ0LT5GaWZvTW9kZSA9PSBVU0FSVF9GSUZPTU9ERV9FTkFCTEUpCisgICAgeworICAgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgfQorCisgICAgLyogRGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworCisgICAgLyogUmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSAgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBBcyBubyBETUEgdG8gYmUgYWJvcnRlZCwgY2FsbCBkaXJlY3RseSB1c2VyIEFib3J0IGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVzYXJ0LT5BYm9ydENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFVTQVJUIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1VTQVJUX0lSUUhhbmRsZXIoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCBpc3JmbGFncyAgID0gUkVBRF9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgY3IxaXRzICAgICA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisgIHVpbnQzMl90IGNyM2l0cyAgICAgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjMpOworCisgIHVpbnQzMl90IGVycm9yZmxhZ3M7CisgIHVpbnQzMl90IGVycm9yY29kZTsKKworICAvKiBJZiBubyBlcnJvciBvY2N1cnMgKi8KKyAgZXJyb3JmbGFncyA9IChpc3JmbGFncyAmICh1aW50MzJfdCkoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX09SRSB8IFVTQVJUX0lTUl9ORSB8IFVTQVJUX0lTUl9VRFIpKTsKKyAgaWYgKGVycm9yZmxhZ3MgPT0gMFUpCisgIHsKKyAgICAvKiBVU0FSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpCisgICAgICAgICAgICB8fCAoKGNyM2l0cyAmIFVTQVJUX0NSM19SWEZUSUUpICE9IDBVKSkpCisgICAgeworICAgICAgaWYgKGh1c2FydC0+UnhJU1IgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5SeElTUihodXNhcnQpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIElmIHNvbWUgZXJyb3JzIG9jY3VyICovCisgIGlmICgoZXJyb3JmbGFncyAhPSAwVSkKKyAgICAgICYmICgoKGNyM2l0cyAmIChVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX0VJRSkpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IxaXRzICYgKFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSB8IFVTQVJUX0NSMV9QRUlFKSkgIT0gMFUpKSkKKyAgeworICAgIC8qIFVTQVJUIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUEUpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9QRUlFKSAhPSAwVSkpCisgICAgeworICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfSVQoaHVzYXJ0LCBVU0FSVF9DTEVBUl9QRUYpOworCisgICAgICBodXNhcnQtPkVycm9yQ29kZSB8PSBIQUxfVVNBUlRfRVJST1JfUEU7CisgICAgfQorCisgICAgLyogVVNBUlQgZnJhbWUgZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9GRSkgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfRkVGKTsKKworICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX0ZFOworICAgIH0KKworICAgIC8qIFVTQVJUIG5vaXNlIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfTkUpICE9IDBVKSAmJiAoKGNyM2l0cyAmIFVTQVJUX0NSM19FSUUpICE9IDBVKSkKKyAgICB7CisgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9JVChodXNhcnQsIFVTQVJUX0NMRUFSX05FRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9ORTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX09SRSkgIT0gMFUpCisgICAgICAgICYmICgoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSkgIT0gMFUpIHx8CisgICAgICAgICAgICAoKGNyM2l0cyAmIChVU0FSVF9DUjNfUlhGVElFIHwgVVNBUlRfQ1IzX0VJRSkpICE9IDBVKSkpCisgICAgeworICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfSVQoaHVzYXJ0LCBVU0FSVF9DTEVBUl9PUkVGKTsKKworICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX09SRTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1VEUikgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX0VJRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIC8qIElnbm9yZSBTUEkgc2xhdmUgdW5kZXJydW4gZXJyb3JzIHdoZW4gcmVjZXB0aW9uIGlzIGdvaW5nIG9uICovCisgICAgICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICAgIHsKKyAgICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfVURSRkxBRyhodXNhcnQpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX1VEUkZMQUcoaHVzYXJ0KTsKKyAgICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX1VEUjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYWxsIFVTQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoaHVzYXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VTQVJUX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogVVNBUlQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORV9SWEZORSkgIT0gMFUpCisgICAgICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFKSAhPSAwVSkKKyAgICAgICAgICAgICAgfHwgKChjcjNpdHMgJiBVU0FSVF9DUjNfUlhGVElFKSAhPSAwVSkpKQorICAgICAgeworICAgICAgICBpZiAoaHVzYXJ0LT5SeElTUiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaHVzYXJ0LT5SeElTUihodXNhcnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIElmIE92ZXJydW4gZXJyb3Igb2NjdXJzLCBvciBpZiBhbnkgZXJyb3Igb2NjdXJzIGluIERNQSBtb2RlIHJlY2VwdGlvbiwKKyAgICAgICAgIGNvbnNpZGVyIGVycm9yIGFzIGJsb2NraW5nICovCisgICAgICBlcnJvcmNvZGUgPSBodXNhcnQtPkVycm9yQ29kZSAmIEhBTF9VU0FSVF9FUlJPUl9PUkU7CisgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKSB8fAorICAgICAgICAgIChlcnJvcmNvZGUgIT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBCbG9ja2luZyBlcnJvciA6IHRyYW5zZmVyIGlzIGFib3J0ZWQKKyAgICAgICAgICAgU2V0IHRoZSBVU0FSVCBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzLAorICAgICAgICAgICBEaXNhYmxlIEludGVycnVwdHMsIGFuZCBkaXNhYmxlIERNQSByZXF1ZXN0cywgaWYgb25nb2luZyAqLworICAgICAgICBVU0FSVF9FbmRUcmFuc2ZlcihodXNhcnQpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIERNQSBSeCByZXF1ZXN0IGlmIGVuYWJsZWQgKi8KKyAgICAgICAgaWYgKEhBTF9JU19CSVRfU0VUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIpKQorICAgICAgICB7CisgICAgICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVIgfCBVU0FSVF9DUjNfRE1BUik7CisKKyAgICAgICAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgKi8KKyAgICAgICAgICBpZiAoaHVzYXJ0LT5oZG1hdHggIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIFVTQVJUIFR4IERNQSBBYm9ydCBjYWxsYmFjayB0byBOVUxMIDogbm8gY2FsbGJhY2sKKyAgICAgICAgICAgICAgIGV4ZWN1dGVkIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCisgICAgICAgICAgICBodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgICAgICAvKiBBYm9ydCBETUEgVFggKi8KKyAgICAgICAgICAgICh2b2lkKUhBTF9ETUFfQWJvcnRfSVQoaHVzYXJ0LT5oZG1hdHgpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgUnggY2hhbm5lbCAqLworICAgICAgICAgIGlmIChodXNhcnQtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgVVNBUlQgUnggRE1BIEFib3J0IGNhbGxiYWNrIDoKKyAgICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KKyAgICAgICAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFVTQVJUX0RNQUFib3J0T25FcnJvcjsKKworICAgICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovCisgICAgICAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChodXNhcnQtPmhkbWFyeCkgIT0gSEFMX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCisgICAgICAgICAgICAgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhodXNhcnQtPmhkbWFyeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBDYWxsYmFjayAqLworICAgICAgICAgICAgaHVzYXJ0LT5FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICAgICAgICAgICAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgICAgICAgICBodXNhcnQtPkVycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICAgICAgICAgIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb24gQmxvY2tpbmcgZXJyb3IgOiB0cmFuc2ZlciBjb3VsZCBnbyBvbi4KKyAgICAgICAgICAgRXJyb3IgaXMgbm90aWZpZWQgdG8gdXNlciB0aHJvdWdoIHVzZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIENhbGxiYWNrICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICAgICAgICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKworICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworCisKKyAgLyogVVNBUlQgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEVfVFhGTkYpICE9IDBVKQorICAgICAgJiYgKCgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFX1RYRk5GSUUpICE9IDBVKQorICAgICAgICAgIHx8ICgoY3IzaXRzICYgVVNBUlRfQ1IzX1RYRlRJRSkgIT0gMFUpKSkKKyAgeworICAgIGlmIChodXNhcnQtPlR4SVNSICE9IE5VTEwpCisgICAgeworICAgICAgaHVzYXJ0LT5UeElTUihodXNhcnQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBVU0FSVCBpbiBtb2RlIFRyYW5zbWl0dGVyICh0cmFuc21pc3Npb24gZW5kKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RDKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVENJRSkgIT0gMFUpKQorICB7CisgICAgVVNBUlRfRW5kVHJhbnNtaXRfSVQoaHVzYXJ0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBVU0FSVCBUWCBGaWZvIEVtcHR5IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpc3JmbGFncyAmIFVTQVJUX0lTUl9UWEZFKSAhPSAwVSkgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfVFhGRUlFKSAhPSAwVSkpCisgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggRmlmbyBFbXB0eSBDYWxsYmFjayAqLworICAgIGh1c2FydC0+VHhGaWZvRW1wdHlDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IEZpZm8gRW1wdHkgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICByZXR1cm47CisgIH0KKworICAvKiBVU0FSVCBSWCBGaWZvIEZ1bGwgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYRkYpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWEZGSUUpICE9IDBVKSkKKyAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBGaWZvIEZ1bGwgQ2FsbGJhY2sgKi8KKyAgICBodXNhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEZpZm8gRnVsbCBDYWxsYmFjayAqLworICAgIEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1R4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICB0aGUgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9SeEhhbGZDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiBUeC9SeCBUcmFuc2ZlcnMgY29tcGxldGVkIGNhbGxiYWNrIGZvciB0aGUgbm9uLWJsb2NraW5nIHByb2Nlc3MuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgVVNBUlQgZXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh1c2FydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VU0FSVF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBBYm9ydCBDb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgVVNBUlQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKKyAgICAgICgrKSBSZXR1cm4gdGhlIFVTQVJUIGhhbmRsZSBzdGF0ZQorICAgICAgKCspIFJldHVybiB0aGUgVVNBUlQgaGFuZGxlIGVycm9yIGNvZGUKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworCisvKioKKyAgKiBAYnJpZWYgUmV0dXJuIHRoZSBVU0FSVCBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtIGh1c2FydCBwb2ludGVyIHRvIGEgVVNBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVC4KKyAgKiBAcmV0dmFsIFVTQVJUIGhhbmRsZSBzdGF0ZQorICAqLworSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBIQUxfVVNBUlRfR2V0U3RhdGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICByZXR1cm4gaHVzYXJ0LT5TdGF0ZTsKK30KKworLyoqCisgICogQGJyaWVmIFJldHVybiB0aGUgVVNBUlQgZXJyb3IgY29kZS4KKyAgKiBAcGFyYW0gaHVzYXJ0IHBvaW50ZXIgdG8gYSBVU0FSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJULgorICAqIEByZXR2YWwgVVNBUlQgaGFuZGxlIEVycm9yIENvZGUKKyAgKi8KK3VpbnQzMl90IEhBTF9VU0FSVF9HZXRFcnJvcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHJldHVybiBodXNhcnQtPkVycm9yQ29kZTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0Z1bmN0aW9ucyBVU0FSVCBQcml2YXRlIEZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBub25lCisgICovCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCit2b2lkIFVTQVJUX0luaXRDYWxsYmFja3NUb0RlZmF1bHQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBJbml0IHRoZSBVU0FSVCBDYWxsYmFjayBzZXR0aW5ncyAqLworICBodXNhcnQtPlR4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodXNhcnQtPlR4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodXNhcnQtPlJ4SGFsZkNwbHRDYWxsYmFjayAgICAgICAgPSBIQUxfVVNBUlRfUnhIYWxmQ3BsdENhbGxiYWNrOyAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhIYWxmQ3BsdENhbGxiYWNrICAgICAgICAqLworICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrICAgICAgICAgICAgPSBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgUnhDcGx0Q2FsbGJhY2sgICAgICAgICAgICAqLworICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2sgICAgICAgICAgPSBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjazsgICAgICAgICAgLyogTGVnYWN5IHdlYWsgVHhSeENwbHRDYWxsYmFjayAgICAgICAgICAqLworICBodXNhcnQtPkVycm9yQ2FsbGJhY2sgICAgICAgICAgICAgPSBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjazsgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgICAgICAqLworICBodXNhcnQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfVVNBUlRfQWJvcnRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWJvcnRDcGx0Q2FsbGJhY2sgICAgICAgICAqLworICBodXNhcnQtPlJ4Rmlmb0Z1bGxDYWxsYmFjayAgICAgICAgPSBIQUxfVVNBUlRFeF9SeEZpZm9GdWxsQ2FsbGJhY2s7ICAgICAgLyogTGVnYWN5IHdlYWsgUnhGaWZvRnVsbENhbGxiYWNrICAgICAgICAqLworICBodXNhcnQtPlR4Rmlmb0VtcHR5Q2FsbGJhY2sgICAgICAgPSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrOyAgICAgLyogTGVnYWN5IHdlYWsgVHhGaWZvRW1wdHlDYWxsYmFjayAgICAgICAqLworfQorI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKy8qKgorICAqIEBicmllZiAgRW5kIG9uZ29pbmcgdHJhbnNmZXIgb24gVVNBUlQgcGVyaXBoZXJhbCAoZm9sbG93aW5nIGVycm9yIGRldGVjdGlvbiBvciBUcmFuc2ZlciBjb21wbGV0aW9uKS4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc2ZlcihVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFJYRlQsIFRYRlQsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUVfVFhGTkZJRSB8IFVTQVJUX0NSMV9UQ0lFKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSB8IFVTQVJUX0NSM19UWEZUSUUpKTsKKworICAvKiBBdCBlbmQgb2YgcHJvY2VzcywgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgVVNBUlQgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykpCisgIHsKKyAgICBodXNhcnQtPlR4WGZlckNvdW50ID0gMFU7CisKKyAgICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFUIGJpdAorICAgICAgICAgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworICAgIH0KKyAgfQorICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+VHhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVVNBUlRfVHhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgRE1BIFVTQVJUIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5UeEhhbGZDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggSGFsZiBDb21wbGV0ZSBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfVHhIYWxmQ3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworLyoqCisgICogQGJyaWVmIERNQSBVU0FSVCByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICAvKiBETUEgTm9ybWFsIG1vZGUgKi8KKyAgaWYgKEhBTF9JU19CSVRfQ0xSKGhkbWEtPkluc3RhbmNlLT5DQ1IsIERNQV9DQ1JfQ0lSQykpCisgIHsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgICAvKiBEaXNhYmxlIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKyAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgIC8qIERpc2FibGUgdGhlIERNQSBSWCB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBETUFSIGJpdAorICAgICAgIGluIFVTQVJUIENSMyByZWdpc3RlciAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKKyAgICAvKiBzaW1pbGFybHksIGRpc2FibGUgdGhlIERNQSBUWCB0cmFuc2ZlciB0aGF0IHdhcyBzdGFydGVkIHRvIHByb3ZpZGUgdGhlCisgICAgICAgY2xvY2sgdG8gdGhlIHNsYXZlIGRldmljZSAqLworICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKTsKKworICAgIGlmIChodXNhcnQtPlN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgIHsKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIC8qIFRoZSBVU0FSVCBzdGF0ZSBpcyBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCAqLworICAgIGVsc2UKKyAgICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKyAgfQorICAvKiBETUEgY2lyY3VsYXIgbW9kZSAqLworICBlbHNlCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICB7CisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgICAvKiBUaGUgVVNBUlQgc3RhdGUgaXMgSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlggKi8KKyAgICBlbHNlCisgICAgeworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiBETUEgVVNBUlQgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBIYWxmIENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1c2FydC0+UnhIYWxmQ3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IEhhbGYgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX1J4SGFsZkNwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiBETUEgVVNBUlQgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBVU0FSVF9FbmRUcmFuc2ZlcihodXNhcnQpOworCisgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9ETUE7CisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEVycm9yIENhbGxiYWNrICovCisgIGh1c2FydC0+RXJyb3JDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgLyogQ2FsbCBsZWdhY3kgd2VhayBFcnJvciBDYWxsYmFjayAqLworICBIQUxfVVNBUlRfRXJyb3JDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9CisKKy8qKgorICAqIEBicmllZiAgRE1BIFVTQVJUIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IEhBTCBzZXJ2aWNlcyBvbiBFcnJvcgorICAqICAgICAgICAgKFRvIGJlIGNhbGxlZCBhdCBlbmQgb2YgRE1BIEFib3J0IHByb2NlZHVyZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZW5jZSkuCisgICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCit7CisgIFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCA9IChVU0FSVF9IYW5kbGVUeXBlRGVmICopKGhkbWEtPlBhcmVudCk7CisgIGh1c2FydC0+UnhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIENhbGwgcmVnaXN0ZXJlZCBFcnJvciBDYWxsYmFjayAqLworICBodXNhcnQtPkVycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgRXJyb3IgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX0Vycm9yQ2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIERNQSBVU0FSVCBUeCBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLCB3aGVuIGluaXRpYXRlZCBieSB1c2VyCisgICogICAgICAgICAoVG8gYmUgY2FsbGVkIGF0IGVuZCBvZiBETUEgVHggQWJvcnQgcHJvY2VkdXJlIGZvbGxvd2luZyB1c2VyIGFib3J0IHJlcXVlc3QpLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBVc2VyIEFib3J0IGNvbXBsZXRlIGNhbGwgYmFjayBpcyBjYWxsZWQgb25seSBpZiBubworICAqICAgICAgICAgQWJvcnQgc3RpbGwgb25nb2luZyBmb3IgUnggRE1BIEhhbmRsZS4KKyAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX0RNQVR4QWJvcnRDYWxsYmFjayhETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKK3sKKyAgVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0ID0gKFVTQVJUX0hhbmRsZVR5cGVEZWYgKikoaGRtYS0+UGFyZW50KTsKKworICBodXNhcnQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworCisgIC8qIENoZWNrIGlmIGFuIEFib3J0IHByb2Nlc3MgaXMgc3RpbGwgb25nb2luZyAqLworICBpZiAoaHVzYXJ0LT5oZG1hcnggIT0gTlVMTCkKKyAgeworICAgIGlmIChodXNhcnQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogTm8gQWJvcnQgcHJvY2VzcyBzdGlsbCBvbmdvaW5nIDogQWxsIERNQSBjaGFubmVscyBhcmUgYWJvcnRlZCwgY2FsbCB1c2VyIEFib3J0IENvbXBsZXRlIGNhbGxiYWNrICovCisgIGh1c2FydC0+VHhYZmVyQ291bnQgPSAwVTsKKyAgaHVzYXJ0LT5SeFhmZXJDb3VudCA9IDBVOworCisgIC8qIFJlc2V0IGVycm9yQ29kZSAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCisgIF9fSEFMX1VTQVJUX0NMRUFSX0ZMQUcoaHVzYXJ0LCBVU0FSVF9DTEVBUl9PUkVGIHwgVVNBUlRfQ0xFQVJfTkVGIHwgVVNBUlRfQ0xFQVJfUEVGIHwgVVNBUlRfQ0xFQVJfRkVGKTsKKworICAvKiBSZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1c2FydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworfQorCisKKy8qKgorICAqIEBicmllZiAgRE1BIFVTQVJUIFJ4IGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2ssIHdoZW4gaW5pdGlhdGVkIGJ5IHVzZXIKKyAgKiAgICAgICAgIChUbyBiZSBjYWxsZWQgYXQgZW5kIG9mIERNQSBSeCBBYm9ydCBwcm9jZWR1cmUgZm9sbG93aW5nIHVzZXIgYWJvcnQgcmVxdWVzdCkuCisgICogQG5vdGUgICBXaGVuIHRoaXMgY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIFVzZXIgQWJvcnQgY29tcGxldGUgY2FsbCBiYWNrIGlzIGNhbGxlZCBvbmx5IGlmIG5vCisgICogICAgICAgICBBYm9ydCBzdGlsbCBvbmdvaW5nIGZvciBUeCBETUEgSGFuZGxlLgorICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQoreworICBVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQgPSAoVVNBUlRfSGFuZGxlVHlwZURlZiAqKShoZG1hLT5QYXJlbnQpOworCisgIGh1c2FydC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CisKKyAgLyogQ2hlY2sgaWYgYW4gQWJvcnQgcHJvY2VzcyBpcyBzdGlsbCBvbmdvaW5nICovCisgIGlmIChodXNhcnQtPmhkbWF0eCAhPSBOVUxMKQorICB7CisgICAgaWYgKGh1c2FydC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBObyBBYm9ydCBwcm9jZXNzIHN0aWxsIG9uZ29pbmcgOiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkLCBjYWxsIHVzZXIgQWJvcnQgQ29tcGxldGUgY2FsbGJhY2sgKi8KKyAgaHVzYXJ0LT5UeFhmZXJDb3VudCA9IDBVOworICBodXNhcnQtPlJ4WGZlckNvdW50ID0gMFU7CisKKyAgLyogUmVzZXQgZXJyb3JDb2RlICovCisgIGh1c2FydC0+RXJyb3JDb2RlID0gSEFMX1VTQVJUX0VSUk9SX05PTkU7CisKKyAgLyogQ2xlYXIgdGhlIEVycm9yIGZsYWdzIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KKyAgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhodXNhcnQsIFVTQVJUX0NMRUFSX09SRUYgfCBVU0FSVF9DTEVBUl9ORUYgfCBVU0FSVF9DTEVBUl9QRUYgfCBVU0FSVF9DTEVBUl9GRUYpOworCisgIC8qIFJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICBodXNhcnQtPlN0YXRlICA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBDYWxsIHVzZXIgQWJvcnQgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgLyogQ2FsbCByZWdpc3RlcmVkIEFib3J0IENvbXBsZXRlIENhbGxiYWNrICovCisgIGh1c2FydC0+QWJvcnRDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgIC8qIENhbGwgbGVnYWN5IHdlYWsgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgSEFMX1VTQVJUX0Fib3J0Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30KKworCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZSBVU0FSVCBDb21tdW5pY2F0aW9uIFRpbWVvdXQuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSAgRmxhZyBTcGVjaWZpZXMgdGhlIFVTQVJUIGZsYWcgdG8gY2hlY2suCisgICogQHBhcmFtICBTdGF0dXMgdGhlIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLgorICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgdGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLworICB3aGlsZSAoKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQorICB7CisgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICB7CisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIENvbmZpZ3VyZSB0aGUgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9TZXRDb25maWcoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCB0bXByZWc7CisgIFVTQVJUX0Nsb2NrU291cmNlVHlwZURlZiBjbG9ja3NvdXJjZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ICAgICAgICAgICAgICAgID0gSEFMX09LOworICB1aW50MTZfdCBicnJ0ZW1wOworICB1aW50MzJfdCB1c2FydGRpdiAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QT0xBUklUWShodXNhcnQtPkluaXQuQ0xLUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BIQVNFKGh1c2FydC0+SW5pdC5DTEtQaGFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTEFTVEJJVChodXNhcnQtPkluaXQuQ0xLTGFzdEJpdCkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQkFVRFJBVEUoaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9XT1JEX0xFTkdUSChodXNhcnQtPkluaXQuV29yZExlbmd0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfU1RPUEJJVFMoaHVzYXJ0LT5Jbml0LlN0b3BCaXRzKSk7CisgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QQVJJVFkoaHVzYXJ0LT5Jbml0LlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTU9ERShodXNhcnQtPkluaXQuTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUFJFU0NBTEVSKGh1c2FydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDbGVhciBNLCBQQ0UsIFBTLCBURSBhbmQgUkUgYml0cyBhbmQgY29uZmlndXJlCisgICogIHRoZSBVU0FSVCBXb3JkIExlbmd0aCwgUGFyaXR5IGFuZCBNb2RlOgorICAqICBzZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggdmFsdWUKKyAgKiAgc2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LlBhcml0eSB2YWx1ZQorICAqICBzZXQgVEUgYW5kIFJFIGJpdHMgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5Nb2RlIHZhbHVlCisgICogIGZvcmNlIE9WRVI4IHRvIDEgdG8gYWxsb3cgdG8gcmVhY2ggdGhlIG1heGltdW0gc3BlZWQgKEZjbG9jay84KSAqLworICB0bXByZWcgPSAodWludDMyX3QpaHVzYXJ0LT5Jbml0LldvcmRMZW5ndGggfCBodXNhcnQtPkluaXQuUGFyaXR5IHwgaHVzYXJ0LT5Jbml0Lk1vZGUgfCBVU0FSVF9DUjFfT1ZFUjg7CisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfRklFTERTLCB0bXByZWcpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDbGVhciBhbmQgY29uZmlndXJlIHRoZSBVU0FSVCBDbG9jaywgQ1BPTCwgQ1BIQSwgTEJDTCBTVE9QIGFuZCBTTFZFTiBiaXRzOgorICAgKiBzZXQgQ1BPTCBiaXQgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5DTEtQb2xhcml0eSB2YWx1ZQorICAgKiBzZXQgQ1BIQSBiaXQgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5DTEtQaGFzZSB2YWx1ZQorICAgKiBzZXQgTEJDTCBiaXQgYWNjb3JkaW5nIHRvIGh1c2FydC0+SW5pdC5DTEtMYXN0Qml0IHZhbHVlICh1c2VkIGluIFNQSSBtYXN0ZXIgbW9kZSBvbmx5KQorICAgKiBzZXQgU1RPUFsxMzoxMl0gYml0cyBhY2NvcmRpbmcgdG8gaHVzYXJ0LT5Jbml0LlN0b3BCaXRzIHZhbHVlICovCisgIHRtcHJlZyA9ICh1aW50MzJfdCkoVVNBUlRfQ0xPQ0tfRU5BQkxFKTsKKyAgdG1wcmVnIHw9ICh1aW50MzJfdClodXNhcnQtPkluaXQuQ0xLTGFzdEJpdDsKKyAgdG1wcmVnIHw9ICgodWludDMyX3QpaHVzYXJ0LT5Jbml0LkNMS1BvbGFyaXR5IHwgKHVpbnQzMl90KWh1c2FydC0+SW5pdC5DTEtQaGFzZSk7CisgIHRtcHJlZyB8PSAodWludDMyX3QpaHVzYXJ0LT5Jbml0LlN0b3BCaXRzOworICBNT0RJRllfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0ZJRUxEUywgdG1wcmVnKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIFBSRVNDIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUKKyAgICogLSBVU0FSVCBDbG9jayBQcmVzY2FsZXIgOiBzZXQgUFJFU0NBTEVSIGFjY29yZGluZyB0byBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhodXNhcnQtPkluc3RhbmNlLT5QUkVTQywgVVNBUlRfUFJFU0NfUFJFU0NBTEVSLCBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBCUlIgaXMgZmlsbGVkLXVwIGFjY29yZGluZyB0byBPVkVSOCBiaXQgc2V0dGluZyB3aGljaCBpcyBmb3JjZWQgdG8gMSAgICAgKi8KKyAgVVNBUlRfR0VUQ0xPQ0tTT1VSQ0UoaHVzYXJ0LCBjbG9ja3NvdXJjZSk7CisKKyAgc3dpdGNoIChjbG9ja3NvdXJjZSkKKyAgeworICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6CisgICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFBDTEsyRnJlcSgpLCBodXNhcnQtPkluaXQuQmF1ZFJhdGUsIGh1c2FydC0+SW5pdC5DbG9ja1ByZXNjYWxlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k6CisgICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIU0lfVkFMVUUsIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSwgaHVzYXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX1NZU0NMSzoKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSwgaHVzYXJ0LT5Jbml0LkNsb2NrUHJlc2NhbGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0xTRToKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KExTRV9WQUxVRSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlLCBodXNhcnQtPkluaXQuQ2xvY2tQcmVzY2FsZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFVTQVJURElWIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDBkMTYgYW5kIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBmZmZmICovCisgIGlmICgodXNhcnRkaXYgPj0gVVNBUlRfQlJSX01JTikgJiYgKHVzYXJ0ZGl2IDw9IFVTQVJUX0JSUl9NQVgpKQorICB7CisgICAgYnJydGVtcCA9ICh1aW50MTZfdCkodXNhcnRkaXYgJiAweEZGRjBVKTsKKyAgICBicnJ0ZW1wIHw9ICh1aW50MTZfdCkoKHVzYXJ0ZGl2ICYgKHVpbnQxNl90KTB4MDAwRlUpID4+IDFVKTsKKyAgICBodXNhcnQtPkluc3RhbmNlLT5CUlIgPSBicnJ0ZW1wOworICB9CisgIGVsc2UKKyAgeworICAgIHJldCA9IEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgaHVzYXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA9IDFVOworICBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzID0gMVU7CisKKyAgLyogQ2xlYXIgSVNSIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGh1c2FydC0+UnhJU1IgICA9IE5VTEw7CisgIGh1c2FydC0+VHhJU1IgICA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIENoZWNrIHRoZSBVU0FSVCBJZGxlIFN0YXRlLgorICAqIEBwYXJhbSBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX0NoZWNrSWRsZVN0YXRlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdGlja3N0YXJ0OworCisgIC8qIEluaXRpYWxpemUgdGhlIFVTQVJUIEVycm9yQ29kZSAqLworICBodXNhcnQtPkVycm9yQ29kZSA9IEhBTF9VU0FSVF9FUlJPUl9OT05FOworCisgIC8qIEluaXQgdGlja3N0YXJ0IGZvciB0aW1lb3V0IG1hbmFnbWVudCovCisgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWl0dGVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfVEUpID09IFVTQVJUX0NSMV9URSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgVEVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBVU0FSVCBzdGF0ZSovCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggc2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfVHJhbnNtaXRfSVQoKS4KKyAgKiBAbm90ZSAgIFRoZSBVU0FSVCBlcnJvcnMgYXJlIG5vdCBtYW5hZ2VkIHRvIGF2b2lkIHRoZSBvdmVycnVuIGVycm9yLgorICAqIEBub3RlICAgSVNSIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gRklGTyBtb2RlIGlzIGRpc2FibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyBsZXNzIHRoYW4gOSBiaXRzIGxvbmcuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIGNvbnN0IEhBTF9VU0FSVF9TdGF0ZVR5cGVEZWYgc3RhdGUgPSBodXNhcnQtPlN0YXRlOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDhfdCkoKmh1c2FydC0+cFR4QnVmZlB0ciAmICh1aW50OF90KTB4RkYpOworICAgICAgaHVzYXJ0LT5wVHhCdWZmUHRyKys7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9UcmFuc21pdF9JVCgpLgorICAqIEBub3RlICAgVGhlIFVTQVJUIGVycm9ycyBhcmUgbm90IG1hbmFnZWQgdG8gYXZvaWQgdGhlIG92ZXJydW4gZXJyb3IuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZGlzYWJsZWQgYW5kIHdoZW4gdGhlCisgICogICAgICAgICBkYXRhIHdvcmQgbGVuZ3RoIGlzIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90ICp0bXA7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBpZiAoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGludGVycnVwdCAqLworICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRSk7CisKKyAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICBfX0hBTF9VU0FSVF9FTkFCTEVfSVQoaHVzYXJ0LCBVU0FSVF9JVF9UQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wVHhCdWZmUHRyOworICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQxNl90KSgqdG1wICYgMHgwMUZGVSk7CisgICAgICBodXNhcnQtPnBUeEJ1ZmZQdHIgKz0gMlU7CisgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9UcmFuc21pdF9JVCgpLgorICAqIEBub3RlICAgVGhlIFVTQVJUIGVycm9ycyBhcmUgbm90IG1hbmFnZWQgdG8gYXZvaWQgdGhlIG92ZXJydW4gZXJyb3IuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCBhbmQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRhdGEgd29yZCBsZW5ndGggaXMgbGVzcyB0aGFuIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1R4SVNSXzhCSVRfRklGT0VOKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90ICBuYl90eF9kYXRhOworCisgIC8qIENoZWNrIHRoYXQgYSBUeCBwcm9jZXNzIGlzIG9uZ29pbmcgKi8KKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICBmb3IgKG5iX3R4X2RhdGEgPSBodXNhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzIDsgbmJfdHhfZGF0YSA+IDBVIDsgbmJfdHhfZGF0YS0tKQorICAgIHsKKyAgICAgIGlmIChodXNhcnQtPlR4WGZlckNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBUWCBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RYRlQpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgVVNBUlQgVHJhbnNtaXQgQ29tcGxldGUgSW50ZXJydXB0ICovCisgICAgICAgIF9fSEFMX1VTQVJUX0VOQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX1RDKTsKKworICAgICAgICBicmVhazsgLyogZm9yY2UgZXhpdCBsb29wICovCisgICAgICB9CisgICAgICBlbHNlIGlmIChfX0hBTF9VU0FSVF9HRVRfRkxBRyhodXNhcnQsIFVTQVJUX0ZMQUdfVFhGTkYpID09IFNFVCkKKyAgICAgIHsKKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpodXNhcnQtPnBUeEJ1ZmZQdHIgJiAodWludDhfdCkweEZGKTsKKyAgICAgICAgKmh1c2FydC0+cFR4QnVmZlB0cisrOworICAgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBTaW1wbGV4IHNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKKyAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkuCisgICogQG5vdGUgICBUaGUgVVNBUlQgZXJyb3JzIGFyZSBub3QgbWFuYWdlZCB0byBhdm9pZCB0aGUgb3ZlcnJ1biBlcnJvci4KKyAgKiBAbm90ZSAgIElTUiBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIEZJRk8gbW9kZSBpcyBlbmFibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyA5IGJpdHMgbG9uZy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9UeElTUl8xNkJJVF9GSUZPRU4oVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgKnRtcDsKKyAgdWludDE2X3QgIG5iX3R4X2RhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIGZvciAobmJfdHhfZGF0YSA9IGh1c2FydC0+TmJUeERhdGFUb1Byb2Nlc3MgOyBuYl90eF9kYXRhID4gMFUgOyBuYl90eF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVFhGVCk7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBUcmFuc21pdCBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfVVNBUlRfRU5BQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworCisgICAgICAgIGJyZWFrOyAvKiBmb3JjZSBleGl0IGxvb3AgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgVVNBUlRfRkxBR19UWEZORikgPT0gU0VUKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wVHhCdWZmUHRyOworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAodWludDE2X3QpKCp0bXAgJiAweDAxRkZVKTsKKyAgICAgICAgaHVzYXJ0LT5wVHhCdWZmUHRyICs9IDJVOworICAgICAgICBodXNhcnQtPlR4WGZlckNvdW50LS07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBXcmFwcyB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBodXNhcnQgUG9pbnRlciB0byBhIFVTQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0FSVCBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9FbmRUcmFuc21pdF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIC8qIERpc2FibGUgdGhlIFVTQVJUIFRyYW5zbWl0IENvbXBsZXRlIEludGVycnVwdCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFX0lUKGh1c2FydCwgVVNBUlRfSVRfVEMpOworCisgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRV9JVChodXNhcnQsIFVTQVJUX0lUX0VSUik7CisKKyAgLyogQ2xlYXIgVHhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICBodXNhcnQtPlR4SVNSID0gTlVMTDsKKworICBpZiAoaHVzYXJ0LT5TdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWCkKKyAgeworICAgIC8qIENsZWFyIG92ZXJydW4gZmxhZyBhbmQgZGlzY2FyZCB0aGUgcmVjZWl2ZWQgZGF0YSAqLworICAgIF9fSEFMX1VTQVJUX0NMRUFSX09SRUZMQUcoaHVzYXJ0KTsKKyAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsKKworICAgIC8qIFR4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgaHVzYXJ0LT5UeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX1R4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICB7CisgICAgLyogVHhSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQorfQorCisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZGlzYWJsZWQgYW5kIHdoZW4gdGhlCisgICogICAgICAgICBkYXRhIHdvcmQgbGVuZ3RoIGlzIGxlc3MgdGhhbiA5IGJpdHMgbG9uZy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzhCSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBjb25zdCBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90IHVoTWFzayA9IGh1c2FydC0+TWFzazsKKworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgICpodXNhcnQtPnBSeEJ1ZmZQdHIgPSAodWludDhfdCkoaHVzYXJ0LT5JbnN0YW5jZS0+UkRSICYgKHVpbnQ4X3QpdWhNYXNrKTsKKyAgICBodXNhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICBodXNhcnQtPlJ4WGZlckNvdW50LS07CisKKyAgICBpZiAoaHVzYXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBQYXJpdHkgRXJyb3IgSW50ZXJydXB0IGFuZCBSWE5FIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRV9SWEZORUlFIHwgVVNBUlRfQ1IxX1BFSUUpKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgRXJyb3IgSW50ZXJydXB0OiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSAqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIGh1c2FydC0+UnhJU1IgPSBOVUxMOworCisgICAgICAvKiB0eGRhdGFjb3VudCBpcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgTUlTUkFDMjAxMi1SdWxlLTEzLjUgKi8KKyAgICAgIHR4ZGF0YWNvdW50ID0gaHVzYXJ0LT5UeFhmZXJDb3VudDsKKworICAgICAgaWYgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBTUEkgc2xhdmUgdW5kZXJydW4gZmxhZyBhbmQgZGlzY2FyZCB0cmFuc21pdCBkYXRhICovCisgICAgICAgIGlmIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKQorICAgICAgICB7CisgICAgICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfVURSRkxBRyhodXNhcnQpOworICAgICAgICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgICAgICB9CisKKyAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodXNhcnQtPlJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisgICAgICBlbHNlIGlmICgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgIT0gVVNBUlRfQ1IxX1RDSUUpICYmCisgICAgICAgICAgICAgICAodHhkYXRhY291bnQgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBUeFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgaHVzYXJ0LT5UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZWxzZQorICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpICYmCisgICAgICAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICB7CisgICAgICAvKiBTZW5kIGR1bW15IGJ5dGUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgU2xhdmUgdG8gU2VuZCB0aGUgbmV4dCBkYXRhICovCisgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIFNpbXBsZXggcmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQorICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfVVNBUlRfUmVjZWl2ZV9JVCgpLgorICAqIEBub3RlICAgSVNSIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gRklGTyBtb2RlIGlzIGRpc2FibGVkIGFuZCB3aGVuIHRoZQorICAqICAgICAgICAgZGF0YSB3b3JkIGxlbmd0aCBpcyA5IGJpdHMgbG9uZy4KKyAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVTQVJUX1J4SVNSXzE2QklUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgY29uc3QgSEFMX1VTQVJUX1N0YXRlVHlwZURlZiBzdGF0ZSA9IGh1c2FydC0+U3RhdGU7CisgIHVpbnQxNl90IHR4ZGF0YWNvdW50OworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisKKyAgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgfHwKKyAgICAgIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9UWF9SWCkpCisgIHsKKyAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wUnhCdWZmUHRyOworICAgICp0bXAgPSAodWludDE2X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmIHVoTWFzayk7CisgICAgaHVzYXJ0LT5wUnhCdWZmUHRyICs9IDJVOworICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKworICAgIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgYW5kIFJYTkUgaW50ZXJydXB0Ki8KKyAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUgfCBVU0FSVF9DUjFfUEVJRSkpOworCisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpICovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRUlFKTsKKworICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVzYXJ0LT5SeElTUiA9IE5VTEw7CisKKyAgICAgIC8qIHR4ZGF0YWNvdW50IGlzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTMuNSAqLworICAgICAgdHhkYXRhY291bnQgPSBodXNhcnQtPlR4WGZlckNvdW50OworCisgICAgICBpZiAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfUlgpCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRyYW5zbWl0IGRhdGEgKi8KKyAgICAgICAgaWYgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICAgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1J4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChSRUFEX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSAhPSBVU0FSVF9DUjFfVENJRSkgJiYKKyAgICAgICAgICAgICAgICh0eGRhdGFjb3VudCA9PSAwVSkpCisgICAgICB7CisgICAgICAgIC8qIFR4UnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBUeCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgSEFMX1VTQVJUX1R4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgJiYKKyAgICAgICAgICAgICAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpKQorICAgIHsKKyAgICAgIC8qIFNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBTZW5kIHRoZSBuZXh0IGRhdGEgKi8KKyAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCBhbmQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRhdGEgd29yZCBsZW5ndGggaXMgbGVzcyB0aGFuIDkgYml0cyBsb25nLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgVVNBUlRfUnhJU1JfOEJJVF9GSUZPRU4oVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90IHJ4ZGF0YWNvdW50OworICB1aW50MTZfdCB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisgIHVpbnQxNl90IG5iX3J4X2RhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFJ4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIGZvciAobmJfcnhfZGF0YSA9IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgOyBuYl9yeF9kYXRhID4gMFUgOyBuYl9yeF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgVVNBUlRfRkxBR19SWEZORSkgPT0gU0VUKQorICAgICAgeworICAgICAgICAqaHVzYXJ0LT5wUnhCdWZmUHRyID0gKHVpbnQ4X3QpKGh1c2FydC0+SW5zdGFuY2UtPlJEUiAmICh1aW50OF90KSh1aE1hc2sgJiAweEZGVSkpOworICAgICAgICBodXNhcnQtPnBSeEJ1ZmZQdHIrKzsKKyAgICAgICAgaHVzYXJ0LT5SeFhmZXJDb3VudC0tOworCisgICAgICAgIGlmIChodXNhcnQtPlJ4WGZlckNvdW50ID09IDBVKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9QRUlFKTsKKworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIEVycm9yIEludGVycnVwdDogKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgYW5kIFJYIEZJRk8gVGhyZXNob2xkIGludGVycnVwdCAqLworICAgICAgICAgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfRUlFIHwgVVNBUlRfQ1IzX1JYRlRJRSkpOworCisgICAgICAgICAgLyogQ2xlYXIgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgICAgIGh1c2FydC0+UnhJU1IgPSBOVUxMOworCisgICAgICAgICAgLyogdHhkYXRhY291bnQgaXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIE1JU1JBQzIwMTItUnVsZS0xMy41ICovCisgICAgICAgICAgdHhkYXRhY291bnQgPSBodXNhcnQtPlR4WGZlckNvdW50OworCisgICAgICAgICAgaWYgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENsZWFyIFNQSSBzbGF2ZSB1bmRlcnJ1biBmbGFnIGFuZCBkaXNjYXJkIHRyYW5zbWl0IGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRU5BQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9DTEVBUl9VRFJGTEFHKGh1c2FydCk7CisgICAgICAgICAgICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSeCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgcmVzdG9yZSBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgICAgICAgICAgICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworICAgICAgICAgICAgc3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAgIC8qIENhbGwgcmVnaXN0ZXJlZCBSeCBDb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICAgICAgaHVzYXJ0LT5SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9VU0FSVF9SeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKChSRUFEX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9UQ0lFKSAhPSBVU0FSVF9DUjFfVENJRSkgJiYKKyAgICAgICAgICAgICAgICAgICAodHhkYXRhY291bnQgPT0gMFUpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFR4UnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgICAgIHN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGh1c2FydC0+VHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENhbGwgbGVnYWN5IHdlYWsgVHggUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIEhBTF9VU0FSVF9UeFJ4Q3BsdENhbGxiYWNrKGh1c2FydCk7CisjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSAmJgorICAgICAgICAgICAgICAgICAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0RJU0FCTEUpKQorICAgICAgICB7CisgICAgICAgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgICAgICAgIGh1c2FydC0+SW5zdGFuY2UtPlREUiA9IChVU0FSVF9EVU1NWV9EQVRBICYgKHVpbnQxNl90KTB4MDBGRik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogV2hlbiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIHRoZSBSWCBGSUZPCisgICAgdGhyZXNob2xkLCBuZXh0IGluY29taW5nIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGFzIGlmIEZJRk8gbW9kZSB3YXMKKyAgICBkaXNhYmxlZCAoaS5lLiBvbmUgaW50ZXJydXB0IHBlciByZWNlaXZlZCBmcmFtZSkuCisgICAgKi8KKyAgICByeGRhdGFjb3VudCA9IGh1c2FydC0+UnhYZmVyQ291bnQ7CisgICAgaWYgKCgocnhkYXRhY291bnQgIT0gMFUpKSAmJiAocnhkYXRhY291bnQgPCBodXNhcnQtPk5iUnhEYXRhVG9Qcm9jZXNzKSkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBSWEZUIGludGVycnVwdCovCisgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVElFKTsKKworICAgICAgLyogVXBkYXRlIHRoZSBSeElTUiBmdW5jdGlvbiBwb2ludGVyICovCisgICAgICBodXNhcnQtPlJ4SVNSID0gVVNBUlRfUnhJU1JfOEJJVDsKKworICAgICAgLyogRW5hYmxlIHRoZSBVU0FSVCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBpbnRlcnJ1cHQgKi8KKyAgICAgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUlhORUlFX1JYRk5FSUUpOworCisgICAgICBpZiAoKGh1c2FydC0+VHhYZmVyQ291bnQgPT0gMFUpICYmCisgICAgICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSAmJgorICAgICAgICAgIChodXNhcnQtPlNsYXZlTW9kZSA9PSBVU0FSVF9TTEFWRU1PREVfRElTQUJMRSkpCisgICAgICB7CisgICAgICAgIC8qIFNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBTZW5kIHRoZSBuZXh0IGRhdGEgKi8KKyAgICAgICAgaHVzYXJ0LT5JbnN0YW5jZS0+VERSID0gKFVTQVJUX0RVTU1ZX0RBVEEgJiAodWludDE2X3QpMHgwMEZGKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ2xlYXIgUlhORSBpbnRlcnJ1cHQgZmxhZyAqLworICAgIF9fSEFMX1VTQVJUX1NFTkRfUkVRKGh1c2FydCwgVVNBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgU2ltcGxleCByZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCisgICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9VU0FSVF9SZWNlaXZlX0lUKCkuCisgICogQG5vdGUgICBJU1IgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiBGSUZPIG1vZGUgaXMgZW5hYmxlZCBhbmQgd2hlbiB0aGUKKyAgKiAgICAgICAgIGRhdGEgd29yZCBsZW5ndGggaXMgOSBiaXRzIGxvbmcuCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVF9SeElTUl8xNkJJVF9GSUZPRU4oVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICBIQUxfVVNBUlRfU3RhdGVUeXBlRGVmIHN0YXRlID0gaHVzYXJ0LT5TdGF0ZTsKKyAgdWludDE2X3QgdHhkYXRhY291bnQ7CisgIHVpbnQxNl90IHJ4ZGF0YWNvdW50OworICB1aW50MTZfdCAqdG1wOworICB1aW50MTZfdCB1aE1hc2sgPSBodXNhcnQtPk1hc2s7CisgIHVpbnQxNl90IG5iX3J4X2RhdGE7CisKKyAgLyogQ2hlY2sgdGhhdCBhIFR4IHByb2Nlc3MgaXMgb25nb2luZyAqLworICBpZiAoKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1JYKSB8fAorICAgICAgKHN0YXRlID09IEhBTF9VU0FSVF9TVEFURV9CVVNZX1RYX1JYKSkKKyAgeworICAgIGZvciAobmJfcnhfZGF0YSA9IGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgOyBuYl9yeF9kYXRhID4gMFUgOyBuYl9yeF9kYXRhLS0pCisgICAgeworICAgICAgaWYgKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgVVNBUlRfRkxBR19SWEZORSkgPT0gU0VUKQorICAgICAgeworICAgICAgICB0bXAgPSAodWludDE2X3QgKikgaHVzYXJ0LT5wUnhCdWZmUHRyOworICAgICAgICAqdG1wID0gKHVpbnQxNl90KShodXNhcnQtPkluc3RhbmNlLT5SRFIgJiB1aE1hc2spOworICAgICAgICBodXNhcnQtPnBSeEJ1ZmZQdHIgKz0gMlU7CisgICAgICAgIGh1c2FydC0+UnhYZmVyQ291bnQtLTsKKworICAgICAgICBpZiAoaHVzYXJ0LT5SeFhmZXJDb3VudCA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIFVTQVJUIFBhcml0eSBFcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUEVJRSk7CisKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBFcnJvciBJbnRlcnJ1cHQ6IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGFuZCBSWCBGSUZPIFRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCAoVVNBUlRfQ1IzX0VJRSB8IFVTQVJUX0NSM19SWEZUSUUpKTsKKworICAgICAgICAgIC8qIENsZWFyIFJ4SVNSIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgICBodXNhcnQtPlJ4SVNSID0gTlVMTDsKKworICAgICAgICAgIC8qIHR4ZGF0YWNvdW50IGlzIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTMuNSAqLworICAgICAgICAgIHR4ZGF0YWNvdW50ID0gaHVzYXJ0LT5UeFhmZXJDb3VudDsKKworICAgICAgICAgIGlmIChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBDbGVhciBTUEkgc2xhdmUgdW5kZXJydW4gZmxhZyBhbmQgZGlzY2FyZCB0cmFuc21pdCBkYXRhICovCisgICAgICAgICAgICBpZiAoaHVzYXJ0LT5TbGF2ZU1vZGUgPT0gVVNBUlRfU0xBVkVNT0RFX0VOQUJMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19IQUxfVVNBUlRfQ0xFQVJfVURSRkxBRyhodXNhcnQpOworICAgICAgICAgICAgICBfX0hBTF9VU0FSVF9TRU5EX1JFUShodXNhcnQsIFVTQVJUX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUnggcHJvY2VzcyBpcyBjb21wbGV0ZWQsIHJlc3RvcmUgaHVzYXJ0LT5TdGF0ZSB0byBSZWFkeSAqLworICAgICAgICAgICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgICAgIHN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisjaWYgKFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgUnggQ29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGh1c2FydC0+UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVVNBUlRfUnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfVENJRSkgIT0gVVNBUlRfQ1IxX1RDSUUpICYmCisgICAgICAgICAgICAgICAgICAgKHR4ZGF0YWNvdW50ID09IDBVKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUeFJ4IHByb2Nlc3MgaXMgY29tcGxldGVkLCByZXN0b3JlIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KKyAgICAgICAgICAgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgICAgICBzdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgICAgLyogQ2FsbCByZWdpc3RlcmVkIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgICAgICBodXNhcnQtPlR4UnhDcGx0Q2FsbGJhY2soaHVzYXJ0KTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDYWxsIGxlZ2FjeSB3ZWFrIFR4IFJ4IENvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgICAgICBIQUxfVVNBUlRfVHhSeENwbHRDYWxsYmFjayhodXNhcnQpOworI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdGF0ZSA9PSBIQUxfVVNBUlRfU1RBVEVfQlVTWV9SWCkgJiYKKyAgICAgICAgICAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNlbmQgZHVtbXkgYnl0ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY2xvY2sgZm9yIHRoZSBTbGF2ZSB0byBTZW5kIHRoZSBuZXh0IGRhdGEgKi8KKyAgICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFdoZW4gcmVtYWluaW5nIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiB0aGUgUlggRklGTworICAgIHRocmVzaG9sZCwgbmV4dCBpbmNvbWluZyBmcmFtZXMgYXJlIHByb2Nlc3NlZCBhcyBpZiBGSUZPIG1vZGUgd2FzCisgICAgZGlzYWJsZWQgKGkuZS4gb25lIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUpLgorICAgICovCisgICAgcnhkYXRhY291bnQgPSBodXNhcnQtPlJ4WGZlckNvdW50OworICAgIGlmICgoKHJ4ZGF0YWNvdW50ICE9IDBVKSkgJiYgKHJ4ZGF0YWNvdW50IDwgaHVzYXJ0LT5OYlJ4RGF0YVRvUHJvY2VzcykpCisgICAgeworICAgICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgUlhGVCBpbnRlcnJ1cHQqLworICAgICAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX1JYRlRJRSk7CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgUnhJU1IgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgaHVzYXJ0LT5SeElTUiA9IFVTQVJUX1J4SVNSXzE2QklUOworCisgICAgICAvKiBFbmFibGUgdGhlIFVTQVJUIERhdGEgUmVnaXN0ZXIgTm90IEVtcHR5IGludGVycnVwdCAqLworICAgICAgU0VUX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9SWE5FSUVfUlhGTkVJRSk7CisKKyAgICAgIGlmICgoaHVzYXJ0LT5UeFhmZXJDb3VudCA9PSAwVSkgJiYKKyAgICAgICAgICAoc3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX0JVU1lfVFhfUlgpICYmCisgICAgICAgICAgKGh1c2FydC0+U2xhdmVNb2RlID09IFVTQVJUX1NMQVZFTU9ERV9ESVNBQkxFKSkKKyAgICAgIHsKKyAgICAgICAgLyogU2VuZCBkdW1teSBieXRlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIFNsYXZlIHRvIFNlbmQgdGhlIG5leHQgZGF0YSAqLworICAgICAgICBodXNhcnQtPkluc3RhbmNlLT5URFIgPSAoVVNBUlRfRFVNTVlfREFUQSAmICh1aW50MTZfdCkweDAwRkYpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDbGVhciBSWE5FIGludGVycnVwdCBmbGFnICovCisgICAgX19IQUxfVVNBUlRfU0VORF9SRVEoaHVzYXJ0LCBVU0FSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9VU0FSVF9NT0RVTEVfRU5BQkxFRCAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3VzYXJ0X2V4LmMgYi9TcmMvc3RtMzJ3Ynh4X2hhbF91c2FydF9leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDg5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2hhbF91c2FydF9leC5jCkBAIC0wLDAgKzEsNTMyIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF91c2FydF9leC5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBFeHRlbmRlZCBVU0FSVCBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIGV4dGVuZGVkCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBVbml2ZXJzYWwgU3luY2hyb25vdXMgUmVjZWl2ZXIgVHJhbnNtaXR0ZXIgUGVyaXBoZXJhbCAoVVNBUlQpLgorICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKgorICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICMjIyMjIFVTQVJUIHBlcmlwaGVyYWwgZXh0ZW5kZWQgZmVhdHVyZXMgICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgKCMpIEZJRk8gbW9kZSBlbmFibGluZy9kaXNhYmxpbmcgYW5kIFJYL1RYIEZJRk8gdGhyZXNob2xkIHByb2dyYW1taW5nLgorCisgICAgICAgIC1ALSBXaGVuIFVTQVJUIG9wZXJhdGVzIGluIEZJRk8gbW9kZSwgRklGTyBtb2RlIG11c3QgYmUgZW5hYmxlZCBwcmlvcgorICAgICAgICAgICAgc3RhcnRpbmcgUlgvVFggdHJhbnNmZXJzLiBBbHNvIFJYL1RYIEZJRk8gdGhyZXNob2xkcyBtdXN0IGJlCisgICAgICAgICAgICBjb25maWd1cmVkIHByaW9yIHN0YXJ0aW5nIFJYL1RYIHRyYW5zZmVycy4KKworICAgICgjKSBTbGF2ZSBtb2RlIGVuYWJsaW5nL2Rpc2FibGluZyBhbmQgTlNTIHBpbiBjb25maWd1cmF0aW9uLgorCisgICAgICAgIC1ALSBXaGVuIFVTQVJUIG9wZXJhdGVzIGluIFNsYXZlIG1vZGUsIFNsYXZlIG1vZGUgbXVzdCBiZSBlbmFibGVkIHByaW9yCisgICAgICAgICAgICBzdGFydGluZyBSWC9UWCB0cmFuc2ZlcnMuCisKKyAgQGVuZHZlcmJhdGltCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9oYWwuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4IFVTQVJURXgKKyAgKiBAYnJpZWYgVVNBUlQgRXh0ZW5kZWQgSEFMIG1vZHVsZSBkcml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1VTQVJUX01PRFVMRV9FTkFCTEVECisKKy8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBVQVJUIFJYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgUlhfRklGT19ERVBUSCA4VQorCisvKiBVQVJUIFRYIEZJRk8gZGVwdGggKi8KKyNkZWZpbmUgVFhfRklGT19ERVBUSCA4VQorCisvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVU0FSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVTQVJURXggUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIHZvaWQgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgVVNBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnMgIFVTQVJURXggRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqIEBicmllZiBFeHRlbmRlZCBVU0FSVCBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucworICAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgRklGTyBtb2RlIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zLgorCisgICAgKCMpIFRYL1JYIEZpZm9zIENhbGxiYWNrczoKKyAgICAgICAgKCspIEhBTF9VU0FSVEV4X1J4Rmlmb0Z1bGxDYWxsYmFjaygpCisgICAgICAgICgrKSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrKCkKKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBSWCBGaWZvIGZ1bGwgY2FsbGJhY2suCisgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaHVzYXJ0KTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX1VTQVJURXhfUnhGaWZvRnVsbENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBVU0FSVCBUWCBGaWZvIGVtcHR5IGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9VU0FSVEV4X1R4Rmlmb0VtcHR5Q2FsbGJhY2soVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodXNhcnQpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfVVNBUlRFeF9UeEZpZm9FbXB0eUNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLgorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBVU0FSVEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEBicmllZiAgICBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAoKykgSEFMX1VTQVJURXhfRW5hYmxlU1BJU2xhdmVNb2RlKCkgQVBJIGVuYWJsZXMgdGhlIFNQSSBzbGF2ZSBtb2RlCisgICAgICgrKSBIQUxfVVNBUlRFeF9EaXNhYmxlU1BJU2xhdmVNb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBTUEkgc2xhdmUgbW9kZQorICAgICAoKykgSEFMX1VTQVJURXhfQ29uZmlnTlNTIEFQSSBjb25maWd1cmVzIHRoZSBTbGF2ZSBTZWxlY3QgaW5wdXQgcGluIChOU1MpCisgICAgICgrKSBIQUxfVVNBUlRFeF9FbmFibGVGaWZvTW9kZSgpIEFQSSBlbmFibGVzIHRoZSBGSUZPIG1vZGUKKyAgICAgKCspIEhBTF9VU0FSVEV4X0Rpc2FibGVGaWZvTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgRklGTyBtb2RlCisgICAgICgrKSBIQUxfVVNBUlRFeF9TZXRUeEZpZm9UaHJlc2hvbGQoKSBBUEkgc2V0cyB0aGUgVFggRklGTyB0aHJlc2hvbGQKKyAgICAgKCspIEhBTF9VU0FSVEV4X1NldFJ4Rmlmb1RocmVzaG9sZCgpIEFQSSBzZXRzIHRoZSBSWCBGSUZPIHRocmVzaG9sZAorCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBTUEkgc2xhdmUgbW9kZS4KKyAgKiBAbm90ZSBXaGVuIHRoZSBVU0FSVCBvcGVyYXRlcyBpbiBTUEkgc2xhdmUgbW9kZSwgaXQgaGFuZGxlcyBkYXRhIGZsb3cgdXNpbmcKKyAgKiAgICAgICB0aGUgc2VyaWFsIGludGVyZmFjZSBjbG9jayBkZXJpdmVkIGZyb20gdGhlIGV4dGVybmFsIFNDTEsgc2lnbmFsCisgICogICAgICAgcHJvdmlkZWQgYnkgdGhlIGV4dGVybmFsIG1hc3RlciBTUEkgZGV2aWNlLgorICAqIEBub3RlIEluIFNQSSBzbGF2ZSBtb2RlLCB0aGUgVVNBUlQgbXVzdCBiZSBlbmFibGVkIGJlZm9yZSBzdGFydGluZyB0aGUgbWFzdGVyCisgICogICAgICAgY29tbXVuaWNhdGlvbnMgKG9yIGJldHdlZW4gZnJhbWVzIHdoaWxlIHRoZSBjbG9jayBpcyBzdGFibGUpLiBPdGhlcndpc2UsCisgICogICAgICAgaWYgdGhlIFVTQVJUIHNsYXZlIGlzIGVuYWJsZWQgd2hpbGUgdGhlIG1hc3RlciBpcyBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgKiAgICAgICBmcmFtZSwgaXQgd2lsbCBiZWNvbWUgZGVzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbWFzdGVyLgorICAqIEBub3RlIFRoZSBkYXRhIHJlZ2lzdGVyIG9mIHRoZSBzbGF2ZSBuZWVkcyB0byBiZSByZWFkeSBiZWZvcmUgdGhlIGZpcnN0IGVkZ2UKKyAgKiAgICAgICBvZiB0aGUgY29tbXVuaWNhdGlvbiBjbG9jayBvciBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgb25nb2luZyBjb21tdW5pY2F0aW9uLAorICAqICAgICAgIG90aGVyd2lzZSB0aGUgU1BJIHNsYXZlIHdpbGwgdHJhbnNtaXQgemVyb3MuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0VuYWJsZVNsYXZlTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1NQSV9TTEFWRV9JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogSW4gU1BJIHNsYXZlIG1vZGUgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgorICAtIExJTkVOIGFuZCBDTEtFTiBiaXQgaW4gdGhlIFVTQVJUX0NSMiByZWdpc3RlcgorICAtIEhEU0VMLCBTQ0VOIGFuZCBJUkVOIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOIHwgVVNBUlRfQ1IyX0NMS0VOKSk7CisgIENMRUFSX0JJVChodXNhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKSk7CisKKyAgLyogRW5hYmxlIFNQSSBzbGF2ZSBtb2RlICovCisgIFNFVF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IyLCBVU0FSVF9DUjJfU0xWRU4pOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1c2FydC0+U2xhdmVNb2RlID0gVVNBUlRfU0xBVkVNT0RFX0VOQUJMRTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIEVuYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9FTkFCTEUoaHVzYXJ0KTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU1BJIHNsYXZlIG1vZGUuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0Rpc2FibGVTbGF2ZU1vZGUoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9TUElfU0xBVkVfSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVVNBUlQgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIERpc2FibGUgU1BJIHNsYXZlIG1vZGUgKi8KKyAgQ0xFQVJfQklUKGh1c2FydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX1NMVkVOKTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlNsYXZlTW9kZSA9IFVTQVJUX1NMQVZFTU9ERV9FTkFCTEU7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTbGF2ZSBTZWxlY3QgaW5wdXQgcGluIChOU1MpLgorICAqIEBub3RlIFNvZnR3YXJlIE5TUyBtYW5hZ2VtZW50OiBTUEkgc2xhdmUgd2lsbCBhbHdheXMgYmUgc2VsZWN0ZWQgYW5kIE5TUworICAqICAgICAgIGlucHV0IHBpbiB3aWxsIGJlIGlnbm9yZWQuCisgICogQG5vdGUgSGFyZHdhcmUgTlNTIG1hbmFnZW1lbnQ6IHRoZSBTUEkgc2xhdmUgc2VsZWN0aW9uIGRlcGVuZHMgb24gTlNTCisgICogICAgICAgaW5wdXQgcGluLiBUaGUgc2xhdmUgaXMgc2VsZWN0ZWQgd2hlbiBOU1MgaXMgbG93IGFuZCBkZXNlbGVjdGVkIHdoZW4KKyAgKiAgICAgICBOU1MgaXMgaGlnaC4KKyAgKiBAcGFyYW0gaHVzYXJ0ICAgICAgVVNBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBOU1NDb25maWcgICBOU1MgY29uZmlndXJhdGlvbi4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX05TU19IQVJECisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfTlNTX1NPRlQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVEV4X0NvbmZpZ05TUyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IE5TU0NvbmZpZykKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfU1BJX1NMQVZFX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX05TUyhOU1NDb25maWcpKTsKKworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1c2FydCk7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9CVVNZOworCisgIC8qIFNhdmUgYWN0dWFsIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgdG1wY3IxID0gUkVBRF9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxKTsKKworICAvKiBEaXNhYmxlIFVTQVJUICovCisgIF9fSEFMX1VTQVJUX0RJU0FCTEUoaHVzYXJ0KTsKKworICAvKiBQcm9ncmFtIERJU19OU1MgYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9ESVNfTlNTLCBOU1NDb25maWcpOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgRklGTyBtb2RlLgorICAqIEBwYXJhbSBodXNhcnQgICAgICBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9FbmFibGVGaWZvTW9kZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX0ZJRk9fSU5TVEFOQ0UoaHVzYXJ0LT5JbnN0YW5jZSkpOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVzYXJ0KTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX0JVU1k7CisKKyAgLyogU2F2ZSBhY3R1YWwgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICB0bXBjcjEgPSBSRUFEX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIERpc2FibGUgVVNBUlQgKi8KKyAgX19IQUxfVVNBUlRfRElTQUJMRShodXNhcnQpOworCisgIC8qIEVuYWJsZSBGSUZPIG1vZGUgKi8KKyAgU0VUX0JJVCh0bXBjcjEsIFVTQVJUX0NSMV9GSUZPRU4pOworICBodXNhcnQtPkZpZm9Nb2RlID0gVVNBUlRfRklGT01PREVfRU5BQkxFOworCisgIC8qIFJlc3RvcmUgVVNBUlQgY29uZmlndXJhdGlvbiAqLworICBXUklURV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCB0bXBjcjEpOworCisgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcHJvY2VzcyBkdXJpbmcgUlgvVFggSVNSIGV4ZWN1dGlvbiAqLworICBVU0FSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHVzYXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEZJRk8gbW9kZS4KKyAgKiBAcGFyYW0gaHVzYXJ0ICAgICAgVVNBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfRGlzYWJsZUZpZm9Nb2RlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCkKK3sKKyAgdWludDMyX3QgdG1wY3IxOworCisgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfRklGT19JTlNUQU5DRShodXNhcnQtPkluc3RhbmNlKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogRW5hYmxlIEZJRk8gbW9kZSAqLworICBDTEVBUl9CSVQodG1wY3IxLCBVU0FSVF9DUjFfRklGT0VOKTsKKyAgaHVzYXJ0LT5GaWZvTW9kZSA9IFVTQVJUX0ZJRk9NT0RFX0RJU0FCTEU7CisKKyAgLyogUmVzdG9yZSBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIFdSSVRFX1JFRyhodXNhcnQtPkluc3RhbmNlLT5DUjEsIHRtcGNyMSk7CisKKyAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodXNhcnQpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBUWEZJRk8gdGhyZXNob2xkLgorICAqIEBwYXJhbSBodXNhcnQgICAgICBVU0FSVCBoYW5kbGUuCisgICogQHBhcmFtIFRocmVzaG9sZCAgVFggRklGTyB0aHJlc2hvbGQgdmFsdWUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYRklGT19USFJFU0hPTERfMV84CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF8xXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzFfMgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1RYRklGT19USFJFU0hPTERfM180CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfVFhGSUZPX1RIUkVTSE9MRF83XzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9UWEZJRk9fVEhSRVNIT0xEXzhfOAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJURXhfU2V0VHhGaWZvVGhyZXNob2xkKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgVGhyZXNob2xkKQoreworICB1aW50MzJfdCB0bXBjcjE7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1RYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogVXBkYXRlIFRYIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVzYXJ0KTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJYRklGTyB0aHJlc2hvbGQuCisgICogQHBhcmFtIGh1c2FydCAgICAgIFVTQVJUIGhhbmRsZS4KKyAgKiBAcGFyYW0gVGhyZXNob2xkICBSWCBGSUZPIHRocmVzaG9sZCB2YWx1ZQorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8xXzgKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzFfNAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1JYRklGT19USFJFU0hPTERfMV8yCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfUlhGSUZPX1RIUkVTSE9MRF8zXzQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9SWEZJRk9fVEhSRVNIT0xEXzdfOAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX1JYRklGT19USFJFU0hPTERfOF84CisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRFeF9TZXRSeEZpZm9UaHJlc2hvbGQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBUaHJlc2hvbGQpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9GSUZPX0lOU1RBTkNFKGh1c2FydC0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1JYRklGT19USFJFU0hPTEQoVGhyZXNob2xkKSk7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodXNhcnQpOworCisgIGh1c2FydC0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfQlVTWTsKKworICAvKiBTYXZlIGFjdHVhbCBVU0FSVCBjb25maWd1cmF0aW9uICovCisgIHRtcGNyMSA9IFJFQURfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSk7CisKKyAgLyogRGlzYWJsZSBVU0FSVCAqLworICBfX0hBTF9VU0FSVF9ESVNBQkxFKGh1c2FydCk7CisKKyAgLyogVXBkYXRlIFJYIHRocmVzaG9sZCBjb25maWd1cmF0aW9uICovCisgIE1PRElGWV9SRUcoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRywgVGhyZXNob2xkKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkYXRhIHRvIHByb2Nlc3MgZHVyaW5nIFJYL1RYIElTUiBleGVjdXRpb24gKi8KKyAgVVNBUlRFeF9TZXROYkRhdGFUb1Byb2Nlc3MoaHVzYXJ0KTsKKworICAvKiBSZXN0b3JlIFVTQVJUIGNvbmZpZ3VyYXRpb24gKi8KKyAgV1JJVEVfUkVHKGh1c2FydC0+SW5zdGFuY2UtPkNSMSwgdG1wY3IxKTsKKworICBodXNhcnQtPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFQURZOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1c2FydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVTQVJURXhfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF0YSB0byBwcm9jZXNzIGluIFJYL1RYIElTUi4KKyAgKiBAbm90ZSBUaGUgUlggRklGTyBkZXB0aCBhbmQgdGhlIFRYIEZJRk8gZGVwdGggaXMgZXh0cmFjdGVkIGZyb20KKyAgKiAgICAgICB0aGUgVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBVU0FSVEV4X1NldE5iRGF0YVRvUHJvY2VzcyhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCit7CisgIHVpbnQ4X3QgcnhfZmlmb19kZXB0aDsKKyAgdWludDhfdCB0eF9maWZvX2RlcHRoOworICB1aW50OF90IHJ4X2ZpZm9fdGhyZXNob2xkOworICB1aW50OF90IHR4X2ZpZm9fdGhyZXNob2xkOworICAvKiAyIDBVLzFVIGFkZGVkIGZvciBNSVNSQUMyMDEyLVJ1bGUtMTguMV9iIGFuZCBNSVNSQUMyMDEyLVJ1bGUtMTguMV9kICovCisgIHVpbnQ4X3QgbnVtZXJhdG9yW10gICA9IHsxVSwgMVUsIDFVLCAzVSwgN1UsIDFVLCAwVSwgMFV9OworICB1aW50OF90IGRlbm9taW5hdG9yW10gPSB7OFUsIDRVLCAyVSwgNFUsIDhVLCAxVSwgMVUsIDFVfTsKKworICBpZiAoaHVzYXJ0LT5GaWZvTW9kZSA9PSBVU0FSVF9GSUZPTU9ERV9ESVNBQkxFKQorICB7CisgICAgaHVzYXJ0LT5OYlR4RGF0YVRvUHJvY2VzcyA9IDFVOworICAgIGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAxVTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByeF9maWZvX2RlcHRoID0gUlhfRklGT19ERVBUSDsKKyAgICB0eF9maWZvX2RlcHRoID0gVFhfRklGT19ERVBUSDsKKyAgICByeF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KSgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfUlhGVENGRykgPj4gVVNBUlRfQ1IzX1JYRlRDRkdfUG9zKSAmIDB4RkZVKTsKKyAgICB0eF9maWZvX3RocmVzaG9sZCA9ICh1aW50OF90KSgoUkVBRF9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVFhGVENGRykgPj4gVVNBUlRfQ1IzX1RYRlRDRkdfUG9zKSAmIDB4RkZVKTsKKyAgICBodXNhcnQtPk5iVHhEYXRhVG9Qcm9jZXNzID0gKCh1aW50MTZfdCl0eF9maWZvX2RlcHRoICogbnVtZXJhdG9yW3R4X2ZpZm9fdGhyZXNob2xkXSkgLyAodWludDE2X3QpZGVub21pbmF0b3JbdHhfZmlmb190aHJlc2hvbGRdOworICAgIGh1c2FydC0+TmJSeERhdGFUb1Byb2Nlc3MgPSAoKHVpbnQxNl90KXJ4X2ZpZm9fZGVwdGggKiBudW1lcmF0b3JbcnhfZmlmb190aHJlc2hvbGRdKSAvICh1aW50MTZfdClkZW5vbWluYXRvcltyeF9maWZvX3RocmVzaG9sZF07CisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBIQUxfVVNBUlRfTU9EVUxFX0VOQUJMRUQgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfaGFsX3d3ZGcuYyBiL1NyYy9zdG0zMndieHhfaGFsX3d3ZGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ3MmRlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9oYWxfd3dkZy5jCkBAIC0wLDAgKzEsNDE0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2hhbF93d2RnLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgV2luZG93IFdhdGNoZG9nIChXV0RHKSBwZXJpcGhlcmFsOgorICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFdXREcgU3BlY2lmaWMgZmVhdHVyZXMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBPbmNlIGVuYWJsZWQgdGhlIFdXREcgZ2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0IG9uIGV4cGlyeSBvZiBhIHByb2dyYW1tZWQKKyAgICB0aW1lIHBlcmlvZCwgdW5sZXNzIHRoZSBwcm9ncmFtIHJlZnJlc2hlcyB0aGUgY291bnRlciAoVFs2OzBdIGRvd25jb3VudGVyKQorICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKKyAgICB2YWx1ZSByb2xscyBkb3duIGZyb20gMHg0MCB0byAweDNGKS4KKworICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCisgICAgICAgIGJlZm9yZSB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUuIFRoaXMKKyAgICAgICAgaW1wbGllcyB0aGF0IHRoZSBjb3VudGVyIG11c3QgYmUgcmVmcmVzaGVkIGluIGEgbGltaXRlZCB3aW5kb3cuCisgICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgorICAgICgrKSBXV0RHUlNUIGZsYWcgaW4gUkNDIENTUiByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBpbmZvcm0gd2hlbiBhIFdXREcKKyAgICAgICAgcmVzZXQgb2NjdXJzLgorICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKKyAgICAgICAgYnkgYSBwcm9ncmFtbWFibGUgcHJlc2NhbGVyLgorICAgICgrKSBXV0RHIGNsb2NrIChIeikgPSBQQ0xLMSAvICg0MDk2ICogUHJlc2NhbGVyKQorICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKKyAgICAgICAgd2hlcmUgVFs1OzBdIGFyZSB0aGUgbG93ZXN0IDYgYml0cyBvZiBDb3VudGVyLgorICAgICgrKSBXV0RHIENvdW50ZXIgcmVmcmVzaCBpcyBhbGxvd2VkIGJldHdlZW4gdGhlIGZvbGxvd2luZyBsaW1pdHMgOgorICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jaworICAgICAgICAoKyspIG1heCB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSAweDQwKSAvIFdXREcgY2xvY2sKKyAgICAoKykgVHlwaWNhbCB2YWx1ZXM6CisgICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA1NiBNSHooUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CisgICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDczLjE0IG1pY3Jvc2Vjb25kcworICAgICAgICAoKyspIENvdW50ZXIgbWF4IChUWzU7MF0gPSAweDNGKSBANTYgTUh6KFBDTEsxKSB3aXRoIHByZXNjYWxlciBkaXZpZGluZyBieSAxMjg6CisgICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDU5OS4xOCBtaWxsaXNlY29uZHMKKworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAqKiogQ29tbW9uIGRyaXZlciB1c2FnZSAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dCisgICAgKCspIEVuYWJsZSBXV0RHIEFQQjEgY2xvY2sgdXNpbmcgX19IQUxfUkNDX1dXREdfQ0xLX0VOQUJMRSgpLgorICAgICgrKSBTZXQgdGhlIFdXREcgcHJlc2NhbGVyLCByZWZyZXNoIHdpbmRvdyBhbmQgY291bnRlciB2YWx1ZQorICAgICAgICB1c2luZyBIQUxfV1dER19Jbml0KCkgZnVuY3Rpb24uCisgICAgKCspIFN0YXJ0IHRoZSBXV0RHIHVzaW5nIEhBTF9XV0RHX1N0YXJ0KCkgZnVuY3Rpb24uCisgICAgICAgIFdoZW4gdGhlIFdXREcgaXMgZW5hYmxlZCB0aGUgY291bnRlciB2YWx1ZSBzaG91bGQgYmUgY29uZmlndXJlZCB0bworICAgICAgICBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAweDQwIHRvIHByZXZlbnQgZ2VuZXJhdGluZyBhbiBpbW1lZGlhdGUgcmVzZXQuCisgICAgKCspIE9wdGlvbmFsbHkgeW91IGNhbiBlbmFibGUgdGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgd2hpY2ggaXMKKyAgICAgICAgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyAweDQwLCBhbmQgdGhlbiBzdGFydCB0aGUgV1dERyB1c2luZworICAgICAgICBIQUxfV1dER19TdGFydF9JVCgpLiBBdCBFV0kgSEFMX1dXREdfV2FrZXVwQ2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBjYWxsYmFjayBIQUxfV1dER19XYWtldXBDYWxsYmFjay4KKyAgICAgICAgT25jZSBlbmFibGVkLCBFV0kgaW50ZXJydXB0IGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCisgICAgKCspIFRoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gbXVzdCByZWZyZXNoIHRoZSBXV0RHIGNvdW50ZXIgYXQgcmVndWxhcgorICAgICAgICBpbnRlcnZhbHMgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBNQ1UgcmVzZXQsIHVzaW5nCisgICAgICAgIEhBTF9XV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IHdoZW4KKyAgICAgICAgdGhlIGNvdW50ZXIgaXMgbG93ZXIgdGhhbiB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUgYWxyZWFkeSBwcm9ncmFtbWVkLgorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFsuLl0KKyAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEgYWxsb3dzCisgICAgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLiBVc2UgRnVuY3Rpb25zCisgICAgQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorCisgICAgKCspIEZ1bmN0aW9uIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcKKyAgICAgICAgY2FsbGJhY2tzOgorICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKKyAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgKCspIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KKyAgICB0aGUgZGVmYXVsdCB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbi4gQHJlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soKQorICAgIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCisgICAgICAgICgrKykgTXNwSW5pdENhbGxiYWNrIDogV1dERyBNc3BJbml0LgorCisgICAgWy4uXQorICAgIFdoZW4gY2FsbGluZyBAcmVmIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24sIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlCisgICAgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOiAKKyAgICBAcmVmIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKSBhbmQgSEFMX1dXREdfTXNwSW5pdCgpIG9ubHkgaWYgdGhleSBoYXZlCisgICAgbm90IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUuCisKKyAgICBbLi5dCisgICAgV2hlbiBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIAorICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCisKKyAgICAqKiogV1dERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBXV0RHIEhBTCBkcml2ZXIuCisgICAgICAoKykgX19IQUxfV1dER19FTkFCTEU6IEVuYWJsZSB0aGUgV1dERyBwZXJpcGhlcmFsCisgICAgICAoKykgX19IQUxfV1dER19HRVRfRkxBRzogR2V0IHRoZSBzZWxlY3RlZCBXV0RHJ3MgZmxhZyBzdGF0dXMKKyAgICAgICgrKSBfX0hBTF9XV0RHX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBXV0RHJ3MgcGVuZGluZyBmbGFncworICAgICAgKCspIF9fSEFMX1dXREdfRU5BQkxFX0lUOiBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdAorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKKy8qKiBAZGVmZ3JvdXAgV1dERyBXV0RHCisgICogQGJyaWVmIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zIFdXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAqCitAdmVyYmF0aW0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBbLi5dCisgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKKyAgICAgICgrKSBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgICAgICAgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgYXNzb2NpYXRlZCBoYW5kbGUuCisgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZC4KKyAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogQ2hlY2sgdGhlIFdXREcgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGh3d2RnID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQUxMX0lOU1RBTkNFKGh3d2RnLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfV1dER19QUkVTQ0FMRVIoaHd3ZGctPkluaXQuUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX1dJTkRPVyhod3dkZy0+SW5pdC5XaW5kb3cpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihod3dkZy0+SW5pdC5Db3VudGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19XV0RHX0VXSV9NT0RFKGh3d2RnLT5Jbml0LkVXSU1vZGUpKTsKKworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgIC8qIFJlc2V0IENhbGxiYWNrIHBvaW50ZXJzICovCisgIGlmKGh3d2RnLT5Fd2lDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKKyAgfQorCisgIGlmKGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgeworICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OworICB9CisKKyAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2soaHd3ZGcpOworI2Vsc2UKKyAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisgIEhBTF9XV0RHX01zcEluaXQoaHd3ZGcpOworI2VuZGlmCisKKyAgLyogU2V0IFdXREcgQ291bnRlciAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKFdXREdfQ1JfV0RHQSB8IGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKKworICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DRlIsIChod3dkZy0+SW5pdC5FV0lNb2RlIHwgaHd3ZGctPkluaXQuUHJlc2NhbGVyIHwgaHd3ZGctPkluaXQuV2luZG93KSk7CisKKyAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICByZXR1cm4gSEFMX09LOworfQorCisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCisgICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgorICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKKyAgKiAgICAgICAgIHRvIGF2b2lkIG11bHRpcGxlIGluaXRpYWxpemUgd2hlbiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIGlzIGNhbGxlZAorICAqICAgICAgICAgYWdhaW4gdG8gY2hhbmdlIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfV1dER19Nc3BJbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh3d2RnKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9XV0RHX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworCisjaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKy8qKgorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFdXREcgQ2FsbGJhY2sKKyAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaHd3ZGcgV1dERyBoYW5kbGUKKyAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19FV0lfQ0JfSUQgRWFybHkgV2FrZVVwIEludGVycnVwdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECisgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwV1dER19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgaWYocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3dpdGNoKENhbGxiYWNrSUQpCisgICAgeworICAgICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CisgICAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKKyAgICAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBXV0RHIENhbGxiYWNrCisgICogICAgICAgICBXV0RHIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCisgICogQHBhcmFtICBod3dkZyBXV0RHIGhhbmRsZQorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX0VXSV9DQl9JRCBFYXJseSBXYWtlVXAgSW50ZXJydXB0IENhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcmV0dmFsIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfVW5SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBzd2l0Y2goQ2FsbGJhY2tJRCkKKyAgeworICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgorICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfV1dER19NU1BJTklUX0NCX0lEOgorICAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCisgKgorQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgorICAgICgrKSBSZWZyZXNoIHRoZSBXV0RHLgorICAgICgrKSBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbiBjYWxsYmFjay4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZWZyZXNoIHRoZSBXV0RHLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZnJlc2goV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKK3sKKyAgLyogV3JpdGUgdG8gV1dERyBDUiB0aGUgV1dERyBDb3VudGVyIHZhbHVlIHRvIHJlZnJlc2ggd2l0aCAqLworICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIFdXREcgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQG5vdGUgICBUaGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucworICAqICAgICAgICAgb3IgZGF0YSBsb2dnaW5nIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgYWN0dWFsIHJlc2V0IGlzIGdlbmVyYXRlZC4KKyAgKiAgICAgICAgIFRoZSBFV0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgYnkgY2FsbGluZyBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIHdpdGgKKyAgKiAgICAgICAgIEVXSU1vZGUgc2V0IHRvIFdXREdfRVdJX0VOQUJMRS4KKyAgKiAgICAgICAgIFdoZW4gdGhlIGRvd25jb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIDB4NDAsIGFuZCBFV0kgaW50ZXJydXB0IGlzCisgICogICAgICAgICBnZW5lcmF0ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgKElTUikgY2FuCisgICogICAgICAgICBiZSB1c2VkIHRvIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9ucyAoc3VjaCBhcyBjb21tdW5pY2F0aW9ucyBvciBkYXRhCisgICogICAgICAgICBsb2dnaW5nKSwgYmVmb3JlIHJlc2V0dGluZyB0aGUgZGV2aWNlLgorICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX1dXREdfSVJRSGFuZGxlcihXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQoreworICAvKiBDaGVjayBpZiBFYXJseSBXYWtldXAgSW50ZXJydXB0IGlzIGVuYWJsZSAqLworICBpZiAoX19IQUxfV1dER19HRVRfSVRfU09VUkNFKGh3d2RnLCBXV0RHX0lUX0VXSSkgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayBpZiBXV0RHIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKyAgICBpZiAoX19IQUxfV1dER19HRVRfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpICE9IFJFU0VUKQorICAgIHsKKyAgICAgIC8qIENsZWFyIHRoZSBXV0RHIEVhcmx5IFdha2V1cCBmbGFnICovCisgICAgICBfX0hBTF9XV0RHX0NMRUFSX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKTsKKworI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAvKiBFYXJseSBXYWtldXAgcmVnaXN0ZXJlZCBjYWxsYmFjayAqLworICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrKGh3d2RnKTsKKyNlbHNlCisgICAgICAvKiBFYXJseSBXYWtldXAgY2FsbGJhY2sgKi8KKyAgICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soaHd3ZGcpOworI2VuZGlmCisgICAgfQorICB9Cit9CisKKworLyoqCisgICogQGJyaWVmICBXV0RHIEVhcmx5IFdha2V1cCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGh3d2RnKTsKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgdGhlIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9hZGMuYyBiL1NyYy9zdG0zMndieHhfbGxfYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhODI1OQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfYWRjLmMKQEAgLTAsMCArMSw5NTcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfYWRjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIEFEQyBMTCBtb2R1bGUgZHJpdmVyCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfYWRjLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2J1cy5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQURDMSkKKworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTCBBREMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyogRGVmaW5pdGlvbnMgb2YgQURDIGhhcmR3YXJlIGNvbnN0cmFpbnRzIGRlbGF5cyAqLworLyogTm90ZTogT25seSBBREMgcGVyaXBoZXJhbCBIVyBkZWxheXMgYXJlIGRlZmluZWQgaW4gQURDIExMIGRyaXZlciBkcml2ZXIsICAgKi8KKy8qICAgICAgIG5vdCB0aW1lb3V0IHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBUaW1lb3V0IHZhbHVlcyBmb3IgQURDIG9wZXJhdGlvbnMgYXJlIGRlcGVuZGVudCB0byBkZXZpY2UgY2xvY2sgICAgICAqLworLyogICAgICAgY29uZmlndXJhdGlvbiAoc3lzdGVtIGNsb2NrIHZlcnN1cyBBREMgY2xvY2spLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBkZWZpbmVkIGluIHVzZXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBSZWZlciB0byBAcmVmIEFEQ19MTF9FQ19IV19ERUxBWVMgZm9yIGRlc2NyaXB0aW9uIG9mIEFEQyB0aW1lb3V0ICAgICAqLworLyogICAgICAgdmFsdWVzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IEFEQyB0aW1lb3V0IHZhbHVlcyBhcmUgZGVmaW5lZCBoZXJlIGluIENQVSBjeWNsZXMgdG8gYmUgaW5kZXBlbmRlbnQgICovCisvKiAgICAgICBvZiBkZXZpY2UgY2xvY2sgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgSW4gdXNlciBhcHBsaWNhdGlvbiwgQURDIHRpbWVvdXQgdmFsdWVzIHNob3VsZCBiZSBkZWZpbmVkIHdpdGggICAgICAgKi8KKy8qICAgICAgIHRlbXBvcmFsIHZhbHVlcywgaW4gZnVuY3Rpb24gb2YgZGV2aWNlIGNsb2NrIHNldHRpbmdzLiAgICAgICAgICAgICAgICovCisvKiAgICAgICBIaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgQURDIGNsb2NrIGZyZXF1ZW5jeTogICAgICAgICAgICAqLworLyogICAgICAgIC0gQURDIGNsb2NrIGZyb20gc3luY2hyb25vdXMgY2xvY2sgd2l0aCBBSEIgcHJlc2NhbGVyIDUxMiwgICAgICAgICAgKi8KKy8qICAgICAgICAgIEFQQiBwcmVzY2FsZXIgMTYsIEFEQyBwcmVzY2FsZXIgNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBBREMgY2xvY2sgZnJvbSBhc3luY2hyb25vdXMgY2xvY2sgKFBMTFNBSSkgd2l0aCBwcmVzY2FsZXIgMSwgICAgICAqLworLyogICAgICAgICAgd2l0aCBoaWdoZXN0IHJhdGlvIENQVSBjbG9jayBmcmVxdWVuY3kgdnMgSFNJIGNsb2NrIGZyZXF1ZW5jeTogICAgKi8KKy8qICAgICAgICAgIENQVSBjbG9jayBmcmVxdWVuY3kgbWF4IDcyTUh6LCBQTExTQUkgZnJlcSBtaW4gMjZNSHo6IHJhdGlvIDQuICAgICovCisvKiBVbml0OiBDUFUgY3ljbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgICAgICAgICAgKDUxMlVMICogMTZVTCAqIDRVTCkKKyNkZWZpbmUgQURDX1RJTUVPVVRfRElTQUJMRV9DUFVfQ1lDTEVTICAgICAgICAgIChBRENfQ0xPQ0tfUkFUSU9fVlNfQ1BVX0hJR0hFU1QgKiAxVUwpCisjZGVmaW5lIEFEQ19USU1FT1VUX1NUT1BfQ09OVkVSU0lPTl9DUFVfQ1lDTEVTICAoQURDX0NMT0NLX1JBVElPX1ZTX0NQVV9ISUdIRVNUICogMVVMKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIGNvbW1vbiB0byBzZXZlcmFsIEFEQyBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19DT01NT05fQ0xPQ0soX19DTE9DS19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfU1lOQ19QQ0xLX0RJVjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVYxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0NMT0NLX18pID09IExMX0FEQ19DTE9DS19BU1lOQ19ESVY2NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19DTE9DS19fKSA9PSBMTF9BRENfQ0xPQ0tfQVNZTkNfRElWMTI4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fQ0xPQ0tfXykgPT0gTExfQURDX0NMT0NLX0FTWU5DX0RJVjI1NikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICovCisvKiBBREMgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9BRENfUkVTT0xVVElPTihfX1JFU09MVVRJT05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzEyQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVTT0xVVElPTl9fKSA9PSBMTF9BRENfUkVTT0xVVElPTl8xMEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFU09MVVRJT05fXykgPT0gTExfQURDX1JFU09MVVRJT05fOEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRVNPTFVUSU9OX18pID09IExMX0FEQ19SRVNPTFVUSU9OXzZCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfREFUQV9BTElHTihfX0RBVEFfQUxJR05fXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19EQVRBX0FMSUdOX18pID09IExMX0FEQ19EQVRBX0FMSUdOX1JJR0hUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fREFUQV9BTElHTl9fKSA9PSBMTF9BRENfREFUQV9BTElHTl9MRUZUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0xPV19QT1dFUihfX0xPV19QT1dFUl9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fTE9XX1BPV0VSX18pID09IExMX0FEQ19MUF9NT0RFX05PTkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0xPV19QT1dFUl9fKSA9PSBMTF9BRENfTFBfQVVUT1dBSVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAqLworLyogQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShfX1JFR19UUklHX1NPVVJDRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfVFJHTykgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX1RSR08yKSAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMV9DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTFfQ0gyKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9USU0xX0NIMykgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19SRUdfVFJJR19FWFRfVElNMl9UUkdPKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfUkVHX1RSSUdfRVhUX1RJTTJfQ0gyKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX1JFR19UUklHX0VYVF9FWFRJX0xJTkUxMSkgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX0NPTlRJTlVPVVNfTU9ERShfX1JFR19DT05USU5VT1VTX01PREVfXykgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfQ09OVElOVU9VU19NT0RFX18pID09IExMX0FEQ19SRUdfQ09OVl9TSU5HTEUpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX0NPTlRJTlVPVVNfTU9ERV9fKSA9PSBMTF9BRENfUkVHX0NPTlZfQ09OVElOVU9VUykgICAgICAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIoX19SRUdfRE1BX1RSQU5TRkVSX18pICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX0RNQV9UUkFOU0ZFUl9fKSA9PSBMTF9BRENfUkVHX0RNQV9UUkFOU0ZFUl9OT05FKSAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19ETUFfVFJBTlNGRVJfXykgPT0gTExfQURDX1JFR19ETUFfVFJBTlNGRVJfTElNSVRFRCkgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfRE1BX1RSQU5TRkVSX18pID09IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX1VOTElNSVRFRCkgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9BRENfUkVHX09WUl9EQVRBX0JFSEFWSU9SKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pICAgICAgICAgICAgIFwKKyAgKCAgICgoX19SRUdfT1ZSX0RBVEFfQkVIQVZJT1JfXykgPT0gTExfQURDX1JFR19PVlJfREFUQV9QUkVTRVJWRUQpICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX09WUl9EQVRBX0JFSEFWSU9SX18pID09IExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU4pICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9MRU5HVEgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMlJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzNSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV80UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfNVJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzZSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV83UkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfOFJBTktTKSAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzlSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xMFJBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTFSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzEyUkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xM1JBTktTKSAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX1JFR19TRVFfU0NBTl9FTkFCTEVfMTRSQU5LUykgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19SRUdfU0VRX1NDQU5fRU5BQkxFXzE1UkFOS1MpICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfUkVHX1NFUV9TQ0FOX0VOQUJMRV8xNlJBTktTKSAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX1JFR19TRVFfU0NBTl9ESVNDT05UX01PREUoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSAgICAgICAgICBcCisgICggICAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFKSAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfMVJBTkspICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzJSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF8zUkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfNFJBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzVSQU5LUykgICAgICAgICAgICBcCisgICB8fCAoKF9fUkVHX1NFUV9ESVNDT05UX01PREVfXykgPT0gTExfQURDX1JFR19TRVFfRElTQ09OVF82UkFOS1MpICAgICAgICAgICAgXAorICAgfHwgKChfX1JFR19TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19SRUdfU0VRX0RJU0NPTlRfN1JBTktTKSAgICAgICAgICAgIFwKKyAgIHx8ICgoX19SRUdfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfUkVHX1NFUV9ESVNDT05UXzhSQU5LUykgICAgICAgICAgICBcCisgICkKKworLyogQ2hlY2sgb2YgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBvZiBBREMgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAgKi8KKy8qIEFEQyBncm91cCBpbmplY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoX19JTkpfVFJJR19TT1VSQ0VfXykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0xX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMV9UUkdPMikgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX1RJTTFfQ0g0KSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19TT1VSQ0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9USU0yX1RSR08pICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfU09VUkNFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfVElNMl9DSDEpICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX1NPVVJDRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0VYVElfTElORTE1KSAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfVFJJR19FWFRfRURHRShfX0lOSl9UUklHX0VYVF9FREdFX18pICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOSl9UUklHX0VYVF9FREdFX18pID09IExMX0FEQ19JTkpfVFJJR19FWFRfUklTSU5HKSAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfVFJJR19FWFRfRURHRV9fKSA9PSBMTF9BRENfSU5KX1RSSUdfRVhUX0ZBTExJTkcpICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1RSSUdfRVhUX0VER0VfXykgPT0gTExfQURDX0lOSl9UUklHX0VYVF9SSVNJTkdGQUxMSU5HKSAgICAgICAgICAgXAorICApCisKKyNkZWZpbmUgSVNfTExfQURDX0lOSl9UUklHX0FVVE8oX19JTkpfVFJJR19BVVRPX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggICAoKF9fSU5KX1RSSUdfQVVUT19fKSA9PSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQpICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOSl9UUklHX0FVVE9fXykgPT0gTExfQURDX0lOSl9UUklHX0ZST01fR1JQX1JFR1VMQVIpICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fTEVOR1RIKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9ESVNBQkxFKSAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfU0VRX1NDQU5fTEVOR1RIX18pID09IExMX0FEQ19JTkpfU0VRX1NDQU5fRU5BQkxFXzJSQU5LUykgICAgICAgICBcCisgICB8fCAoKF9fSU5KX1NFUV9TQ0FOX0xFTkdUSF9fKSA9PSBMTF9BRENfSU5KX1NFUV9TQ0FOX0VOQUJMRV8zUkFOS1MpICAgICAgICAgXAorICAgfHwgKChfX0lOSl9TRVFfU0NBTl9MRU5HVEhfXykgPT0gTExfQURDX0lOSl9TRVFfU0NBTl9FTkFCTEVfNFJBTktTKSAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0FEQ19JTkpfU0VRX1NDQU5fRElTQ09OVF9NT0RFKF9fSU5KX1NFUV9ESVNDT05UX01PREVfXykgICAgICAgICAgXAorICAoICAgKChfX0lOSl9TRVFfRElTQ09OVF9NT0RFX18pID09IExMX0FEQ19JTkpfU0VRX0RJU0NPTlRfRElTQUJMRSkgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTkpfU0VRX0RJU0NPTlRfTU9ERV9fKSA9PSBMTF9BRENfSU5KX1NFUV9ESVNDT05UXzFSQU5LKSAgICAgICAgICAgICBcCisgICkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEFEQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQURDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgcmVnaXN0ZXJzIG9mIGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0bworICAqICAgICAgICAgdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgcGVyZm9ybWluZyBhIGhhcmQgcmVzZXQsIHVzaW5nIGhpZ2ggbGV2ZWwKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfQ29tbW9uRGVJbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OKQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQURDX0NPTU1PTl9JTlNUQU5DRShBREN4eV9DT01NT04pKTsKKyAgCisgIC8qIEZvcmNlIHJlc2V0IG9mIEFEQyBjbG9jayAoY29yZSBjbG9jaykgKi8KKyAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9BREMpOworICAKKyAgLyogUmVsZWFzZSByZXNldCBvZiBBREMgY2xvY2sgKGNvcmUgY2xvY2spICovCisgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9BREMpOworICAKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycworICAqICAgICAgICAgKGFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlKQorICAqICAgICAgICAgYW5kIG11bHRpbW9kZSAoZm9yIGRldmljZXMgd2l0aCBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYXZhaWxhYmxlKS4KKyAgKiBAbm90ZSAgIFRoZSBzZXR0aW5nIG9mIEFEQyBjb21tb24gcGFyYW1ldGVycyBpcyBjb25kaXRpb25lZCB0bworICAqICAgICAgICAgQURDIGluc3RhbmNlcyBzdGF0ZToKKyAgKiAgICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBBREMgY29tbW9uIGluc3RhbmNlCisgICogICAgICAgICBtdXN0IGJlIGRpc2FibGVkLgorICAqIEBwYXJhbSAgQURDeHlfQ09NTU9OIEFEQyBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjYW4gYmUgc2V0IGRpcmVjdGx5IGZyb20gQ01TSVMgZGVmaW5pdGlvbiBvciBieSB1c2luZyBoZWxwZXIgbWFjcm8gQHJlZiBfX0xMX0FEQ19DT01NT05fSU5TVEFOQ0UoKSApCisgICogQHBhcmFtICBBRENfQ29tbW9uSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEFEQyBjb21tb24gcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19Db21tb25Jbml0KEFEQ19Db21tb25fVHlwZURlZiAqQURDeHlfQ09NTU9OLCBMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfQ09NTU9OX0NMT0NLKEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jaykpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zICAgICAgICAgICAgICovCisgIC8qICAgICAgICJMTF9BRENfU2V0Q29tbW9uWFhYKCkiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBPbiB0aGlzIFNUTTMyIHNlcmllLCBzZXR0aW5nIG9mIHRoZXNlIGZlYXR1cmVzIGlzIGNvbmRpdGlvbmVkIHRvICAgKi8KKyAgLyogICAgICAgQURDIHN0YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIEFsbCBBREMgaW5zdGFuY2VzIG9mIHRoZSBBREMgY29tbW9uIGdyb3VwIG11c3QgYmUgZGlzYWJsZWQuICAgICAgICAqLworICBpZihfX0xMX0FEQ19JU19FTkFCTEVEX0FMTF9DT01NT05fSU5TVEFOQ0UoQURDeHlfQ09NTU9OKSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gY29tbW9uIHRvIHNldmVyYWwgQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIChhbGwgQURDIGluc3RhbmNlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQURDIGNvbW1vbiBpbnN0YW5jZSkgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgY2xvY2sgKGNvbnZlcnNpb24gY2xvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChBRENfTVVMVElNT0RFX1NVUFBPUlQpCisgICAgaWYoQURDX0NvbW1vbkluaXRTdHJ1Y3QtPk11bHRpbW9kZSAhPSBMTF9BRENfTVVMVElfSU5ERVBFTkRFTlQpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0NLTU9ERQorICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfUFJFU0MKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RVQUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX01ETUEKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RFTEFZCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jaworICAgICAgICAgICAgICAgICB8IEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aW1vZGUKKyAgICAgICAgICAgICAgICAgfCBBRENfQ29tbW9uSW5pdFN0cnVjdC0+TXVsdGlETUFUcmFuc2ZlcgorICAgICAgICAgICAgICAgICB8IEFEQ19Db21tb25Jbml0U3RydWN0LT5NdWx0aVR3b1NhbXBsaW5nRGVsYXkKKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4eV9DT01NT04tPkNDUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0NSX0NLTU9ERQorICAgICAgICAgICAgICAgICB8IEFEQ19DQ1JfUFJFU0MKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RVQUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX01ETUEKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0NSX0RFTEFZCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jaworICAgICAgICAgICAgICAgICB8IExMX0FEQ19NVUxUSV9JTkRFUEVOREVOVAorICAgICAgICAgICAgICAgICk7CisgICAgfQorI2Vsc2UKKyAgICBMTF9BRENfU2V0Q29tbW9uQ2xvY2soQURDeHlfQ09NTU9OLCBBRENfQ29tbW9uSW5pdFN0cnVjdC0+Q29tbW9uQ2xvY2spOworI2VuZGlmCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IE9uZSBvciBzZXZlcmFsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvICAgICAgICAqLworICAgIC8qIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UgYXJlIG5vdCBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICAKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19Db21tb25Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0NvbW1vbkluaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX0NvbW1vbkluaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfQ29tbW9uU3RydWN0SW5pdChMTF9BRENfQ29tbW9uSW5pdFR5cGVEZWYgKkFEQ19Db21tb25Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0NvbW1vbkluaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIC8qIFNldCBmaWVsZHMgb2YgQURDIGNvbW1vbiAqLworICAvKiAoYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEFEQyBjb21tb24gaW5zdGFuY2UpICovCisgIEFEQ19Db21tb25Jbml0U3RydWN0LT5Db21tb25DbG9jayA9IExMX0FEQ19DTE9DS19TWU5DX1BDTEtfRElWMjsKKyAgCit9CisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgdGhlIHNlbGVjdGVkIEFEQyBpbnN0YW5jZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQG5vdGUgICBUbyByZXNldCBhbGwgQURDIGluc3RhbmNlcyBxdWlja2x5IChwZXJmb3JtIGEgaGFyZCByZXNldCksCisgICogICAgICAgICB1c2UgZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29tbW9uRGVJbml0KCkuCisgICogQG5vdGUgICBJZiB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zIGVycm9yIHN0YXR1cywgaXQgbWVhbnMgdGhhdCBBREMgaW5zdGFuY2UKKyAgKiAgICAgICAgIGlzIGluIGFuIHVua25vd24gc3RhdGUuCisgICogICAgICAgICBJbiB0aGlzIGNhc2UsIHBlcmZvcm0gYSBoYXJkIHJlc2V0IHVzaW5nIGhpZ2ggbGV2ZWwKKyAgKiAgICAgICAgIGNsb2NrIHNvdXJjZSBSQ0MgQURDIHJlc2V0LgorICAqICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfQ29tbW9uRGVJbml0KCkuCisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBBREMgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IEFEQyByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQURDX0RlSW5pdChBRENfVHlwZURlZiAqQURDeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIF9fSU8gdWludDMyX3QgdGltZW91dF9jcHVfY3ljbGVzID0gMFVMOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICAKKyAgLyogRGlzYWJsZSBBREMgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgZGlzYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKExMX0FEQ19Jc0VuYWJsZWQoQURDeCkgPT0gMVVMKQorICB7CisgICAgLyogU2V0IEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlIHRvIFNXIHN0YXJ0IHRvIGVuc3VyZSB0byBub3QgICAgICAqLworICAgIC8qIGhhdmUgYW4gZXh0ZXJuYWwgdHJpZ2dlciBldmVudCBvY2N1cnJpbmcgZHVyaW5nIHRoZSBjb252ZXJzaW9uIHN0b3AgICAgKi8KKyAgICAvKiBBREMgZGlzYWJsZSBwcm9jZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTExfQURDX1JFR19TZXRUcmlnZ2VyU291cmNlKEFEQ3gsIExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRSk7CisgICAgCisgICAgLyogU3RvcCBwb3RlbnRpYWwgQURDIGNvbnZlcnNpb24gb24gZ29pbmcgb24gQURDIGdyb3VwIHJlZ3VsYXIuICAgICAgICAgICAqLworICAgIGlmKExMX0FEQ19SRUdfSXNDb252ZXJzaW9uT25nb2luZyhBREN4KSAhPSAwVUwpCisgICAgeworICAgICAgaWYoTExfQURDX1JFR19Jc1N0b3BDb252ZXJzaW9uT25nb2luZyhBREN4KSA9PSAwVUwpCisgICAgICB7CisgICAgICAgIExMX0FEQ19SRUdfU3RvcENvbnZlcnNpb24oQURDeCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQgdG8gZW5zdXJlIHRvIG5vdCAgICAgKi8KKyAgICAvKiBoYXZlIGFuIGV4dGVybmFsIHRyaWdnZXIgZXZlbnQgb2NjdXJyaW5nIGR1cmluZyB0aGUgY29udmVyc2lvbiBzdG9wICAgICovCisgICAgLyogQURDIGRpc2FibGUgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExMX0FEQ19JTkpfU2V0VHJpZ2dlclNvdXJjZShBREN4LCBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkUpOworICAgIAorICAgIC8qIFN0b3AgcG90ZW50aWFsIEFEQyBjb252ZXJzaW9uIG9uIGdvaW5nIG9uIEFEQyBncm91cCBpbmplY3RlZC4gICAgICAgICAgKi8KKyAgICBpZihMTF9BRENfSU5KX0lzQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgIT0gMFVMKQorICAgIHsKKyAgICAgIGlmKExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgPT0gMFVMKQorICAgICAgeworICAgICAgICBMTF9BRENfSU5KX1N0b3BDb252ZXJzaW9uKEFEQ3gpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgY29udmVyc2lvbnMgYXJlIGVmZmVjdGl2ZWx5IHN0b3BwZWQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdGltZW91dF9jcHVfY3ljbGVzID0gQURDX1RJTUVPVVRfU1RPUF9DT05WRVJTSU9OX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKCggIExMX0FEQ19SRUdfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkgCisgICAgICAgICAgICB8IExMX0FEQ19JTkpfSXNTdG9wQ29udmVyc2lvbk9uZ29pbmcoQURDeCkpID09IDFVTCkKKyAgICB7CisgICAgICB0aW1lb3V0X2NwdV9jeWNsZXMtLTsKKyAgICAgIGlmKHRpbWVvdXRfY3B1X2N5Y2xlcyA9PSAwVUwpCisgICAgICB7CisgICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovCisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRmx1c2ggZ3JvdXAgaW5qZWN0ZWQgY29udGV4dHMgcXVldWUgKHJlZ2lzdGVyIEpTUVIpOiAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IEJpdCBKUU0gbXVzdCBiZSBzZXQgdG8gZW1wdHkgdGhlIGNvbnRleHRzIHF1ZXVlIChvdGhlcndpc2UgICAgICAgKi8KKyAgICAvKiAgICAgICBjb250ZXh0cyBxdWV1ZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIGxhc3QgYWN0aXZlIGNvbnRleHQpLiAgICAgICovCisgICAgTExfQURDX0lOSl9TZXRRdWV1ZU1vZGUoQURDeCwgTExfQURDX0lOSl9RVUVVRV8yQ09OVEVYVFNfRU5EX0VNUFRZKTsKKyAgICAKKyAgICAvKiBEaXNhYmxlIHRoZSBBREMgaW5zdGFuY2UgKi8KKyAgICBMTF9BRENfRGlzYWJsZShBREN4KTsKKyAgICAKKyAgICAvKiBXYWl0IGZvciBBREMgaW5zdGFuY2UgaXMgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KKyAgICB0aW1lb3V0X2NwdV9jeWNsZXMgPSBBRENfVElNRU9VVF9ESVNBQkxFX0NQVV9DWUNMRVM7CisgICAgd2hpbGUgKExMX0FEQ19Jc0Rpc2FibGVPbmdvaW5nKEFEQ3gpID09IDFVTCkKKyAgICB7CisgICAgICB0aW1lb3V0X2NwdV9jeWNsZXMtLTsKKyAgICAgIGlmKHRpbWVvdXRfY3B1X2N5Y2xlcyA9PSAwVUwpCisgICAgICB7CisgICAgICAgIC8qIFRpbWUtb3V0IGVycm9yICovCisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIC8qIENoZWNrIHdoZXRoZXIgQURDIHN0YXRlIGlzIGNvbXBsaWFudCB3aXRoIGV4cGVjdGVkIHN0YXRlICovCisgIGlmKFJFQURfQklUKEFEQ3gtPkNSLAorICAgICAgICAgICAgICAoICBBRENfQ1JfSkFEU1RQIHwgQURDX0NSX0FEU1RQIHwgQURDX0NSX0pBRFNUQVJUIHwgQURDX0NSX0FEU1RBUlQKKyAgICAgICAgICAgICAgIHwgQURDX0NSX0FERElTIHwgQURDX0NSX0FERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICkKKyAgICAgPT0gMFVMKQorICB7CisgICAgLyogPT09PT09PT09PSBSZXNldCBBREMgcmVnaXN0ZXJzID09PT09PT09PT0gKi8KKyAgICAvKiBSZXNldCByZWdpc3RlciBJRVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SUVSLAorICAgICAgICAgICAgICAoICBMTF9BRENfSVRfQURSRFkKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPQworICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfRU9TCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9PVlIKKyAgICAgICAgICAgICAgIHwgTExfQURDX0lUX0VPU01QCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KRU9DCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KRU9TCisgICAgICAgICAgICAgICB8IExMX0FEQ19JVF9KUU9WRgorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMQorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMgorICAgICAgICAgICAgICAgfCBMTF9BRENfSVRfQVdEMworICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBJU1IgKi8KKyAgICBTRVRfQklUKEFEQ3gtPklTUiwKKyAgICAgICAgICAgICggIExMX0FEQ19GTEFHX0FEUkRZCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT0MKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0VPUworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfT1ZSCisgICAgICAgICAgICAgfCBMTF9BRENfRkxBR19FT1NNUAorICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSkVPQworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSkVPUworICAgICAgICAgICAgIHwgTExfQURDX0ZMQUdfSlFPVkYKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDEKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDIKKyAgICAgICAgICAgICB8IExMX0FEQ19GTEFHX0FXRDMKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDUiAqLworICAgIC8qICAtIEJpdHMgQURDX0NSX0pBRFNUUCwgQURDX0NSX0FEU1RQLCBBRENfQ1JfSkFEU1RBUlQsIEFEQ19DUl9BRFNUQVJULCAgKi8KKyAgICAvKiAgICBBRENfQ1JfQURDQUwsIEFEQ19DUl9BRERJUywgQURDX0NSX0FERU4gYXJlIGluICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgYWNjZXNzIG1vZGUgInJlYWQtc2V0Ijogbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUuICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFJlc2V0IENhbGlicmF0aW9uIG1vZGUgdG8gZGVmYXVsdCBzZXR0aW5nIChzaW5nbGUgZW5kZWQpLiAgICAgICAgICAgKi8KKyAgICAvKiAgLSBEaXNhYmxlIEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gRW5hYmxlIEFEQyBkZWVwIHBvd2VyIGRvd24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIE5vdGU6IEFEQyBpbnRlcm5hbCB2b2x0YWdlIHJlZ3VsYXRvciBkaXNhYmxlIGFuZCBBREMgZGVlcCBwb3dlciAgICAgKi8KKyAgICAvKiAgICAgICAgICBkb3duIGVuYWJsZSBhcmUgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlIGRpc2FibGVkOiAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgYWxyZWFkeSBkb25lIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENMRUFSX0JJVChBREN4LT5DUiwgQURDX0NSX0FEVlJFR0VOIHwgQURDX0NSX0FEQ0FMRElGKTsKKyAgICBTRVRfQklUKEFEQ3gtPkNSLCBBRENfQ1JfREVFUFBXRCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQ0ZHUiAqLworICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgICggIEFEQ19DRkdSX0FXRDFDSCAgfCBBRENfQ0ZHUl9KQVVUTyAgIHwgQURDX0NGR1JfSkFXRDFFTgorICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVdEMUVOICB8IEFEQ19DRkdSX0FXRDFTR0wgfCBBRENfQ0ZHUl9KUU0KKyAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0pESVNDRU4gfCBBRENfQ0ZHUl9ESVNDTlVNIHwgQURDX0NGR1JfRElTQ0VOCisgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9BVVRETFkgIHwgQURDX0NGR1JfQ09OVCAgICB8IEFEQ19DRkdSX09WUk1PRAorICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRVhURU4gICB8IEFEQ19DRkdSX0VYVFNFTCAgfCBBRENfQ0ZHUl9BTElHTgorICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfUkVTICAgICB8IEFEQ19DRkdSX0RNQUNGRyAgfCBBRENfQ0ZHUl9ETUFFTiAgKSwKKyAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KUURJUworICAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIENGR1IyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNGR1IyLAorICAgICAgICAgICAgICAoICBBRENfQ0ZHUjJfUk9WU00gIHwgQURDX0NGR1IyX1RST1ZTIHwgQURDX0NGR1IyX09WU1MKKyAgICAgICAgICAgICAgIHwgQURDX0NGR1IyX09WU1IgICB8IEFEQ19DRkdSMl9KT1ZTRSB8IEFEQ19DRkdSMl9ST1ZTRSkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIxLAorICAgICAgICAgICAgICAoICBBRENfU01QUjFfU01QOSB8IEFEQ19TTVBSMV9TTVA4IHwgQURDX1NNUFIxX1NNUDcKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIxX1NNUDYgfCBBRENfU01QUjFfU01QNSB8IEFEQ19TTVBSMV9TTVA0CisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMV9TTVAzIHwgQURDX1NNUFIxX1NNUDIgfCBBRENfU01QUjFfU01QMSkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNNUFIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNNUFIyLAorICAgICAgICAgICAgICAoICBBRENfU01QUjJfU01QMTggfCBBRENfU01QUjJfU01QMTcgfCBBRENfU01QUjJfU01QMTYKKyAgICAgICAgICAgICAgIHwgQURDX1NNUFIyX1NNUDE1IHwgQURDX1NNUFIyX1NNUDE0IHwgQURDX1NNUFIyX1NNUDEzCisgICAgICAgICAgICAgICB8IEFEQ19TTVBSMl9TTVAxMiB8IEFEQ19TTVBSMl9TTVAxMSB8IEFEQ19TTVBSMl9TTVAxMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFRSMSAqLworICAgIE1PRElGWV9SRUcoQURDeC0+VFIxLCBBRENfVFIxX0hUMSB8IEFEQ19UUjFfTFQxLCBBRENfVFIxX0hUMSk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgVFIyICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5UUjIsIEFEQ19UUjJfSFQyIHwgQURDX1RSMl9MVDIsIEFEQ19UUjJfSFQyKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBUUjMgKi8KKyAgICBNT0RJRllfUkVHKEFEQ3gtPlRSMywgQURDX1RSM19IVDMgfCBBRENfVFIzX0xUMywgQURDX1RSM19IVDMpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjEgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+U1FSMSwKKyAgICAgICAgICAgICAgKCAgQURDX1NRUjFfU1E0IHwgQURDX1NRUjFfU1EzIHwgQURDX1NRUjFfU1EyCisgICAgICAgICAgICAgICB8IEFEQ19TUVIxX1NRMSB8IEFEQ19TUVIxX0wpCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIyICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjIsCisgICAgICAgICAgICAgICggIEFEQ19TUVIyX1NROSB8IEFEQ19TUVIyX1NROCB8IEFEQ19TUVIyX1NRNworICAgICAgICAgICAgICAgfCBBRENfU1FSMl9TUTYgfCBBRENfU1FSMl9TUTUpCisgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBTUVIzICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPlNRUjMsCisgICAgICAgICAgICAgICggIEFEQ19TUVIzX1NRMTQgfCBBRENfU1FSM19TUTEzIHwgQURDX1NRUjNfU1ExMgorICAgICAgICAgICAgICAgfCBBRENfU1FSM19TUTExIHwgQURDX1NRUjNfU1ExMCkKKyAgICAgICAgICAgICApOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIFNRUjQgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+U1FSNCwgQURDX1NRUjRfU1ExNiB8IEFEQ19TUVI0X1NRMTUpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIEpTUVIgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgKCAgQURDX0pTUVJfSkwKKyAgICAgICAgICAgICAgIHwgQURDX0pTUVJfSkVYVFNFTCB8IEFEQ19KU1FSX0pFWFRFTgorICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KU1E0ICAgIHwgQURDX0pTUVJfSlNRMworICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KU1EyICAgIHwgQURDX0pTUVJfSlNRMSAgKQorICAgICAgICAgICAgICk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgRFIgKi8KKyAgICAvKiBOb3RlOiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUgKi8KKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlIxICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPk9GUjEsIEFEQ19PRlIxX09GRlNFVDFfRU4gfCBBRENfT0ZSMV9PRkZTRVQxX0NIIHwgQURDX09GUjFfT0ZGU0VUMSk7CisgICAgLyogUmVzZXQgcmVnaXN0ZXIgT0ZSMiAqLworICAgIENMRUFSX0JJVChBREN4LT5PRlIyLCBBRENfT0ZSMl9PRkZTRVQyX0VOIHwgQURDX09GUjJfT0ZGU0VUMl9DSCB8IEFEQ19PRlIyX09GRlNFVDIpOworICAgIC8qIFJlc2V0IHJlZ2lzdGVyIE9GUjMgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+T0ZSMywgQURDX09GUjNfT0ZGU0VUM19FTiB8IEFEQ19PRlIzX09GRlNFVDNfQ0ggfCBBRENfT0ZSM19PRkZTRVQzKTsKKyAgICAvKiBSZXNldCByZWdpc3RlciBPRlI0ICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPk9GUjQsIEFEQ19PRlI0X09GRlNFVDRfRU4gfCBBRENfT0ZSNF9PRkZTRVQ0X0NIIHwgQURDX09GUjRfT0ZGU0VUNCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXJzIEpEUjEsIEpEUjIsIEpEUjMsIEpEUjQgKi8KKyAgICAvKiBOb3RlOiBiaXRzIGluIGFjY2VzcyBtb2RlIHJlYWQgb25seSwgbm8gZGlyZWN0IHJlc2V0IGFwcGxpY2FibGUgKi8KKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBBV0QyQ1IgKi8KKyAgICBDTEVBUl9CSVQoQURDeC0+QVdEMkNSLCBBRENfQVdEMkNSX0FXRDJDSCk7CisgICAgCisgICAgLyogUmVzZXQgcmVnaXN0ZXIgQVdEM0NSICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkFXRDNDUiwgQURDX0FXRDNDUl9BV0QzQ0gpOworICAgIAorICAgIC8qIFJlc2V0IHJlZ2lzdGVyIERJRlNFTCAqLworICAgIENMRUFSX0JJVChBREN4LT5ESUZTRUwsIEFEQ19ESUZTRUxfRElGU0VMKTsKKyAgICAKKyAgICAvKiBSZXNldCByZWdpc3RlciBDQUxGQUNUICovCisgICAgQ0xFQVJfQklUKEFEQ3gtPkNBTEZBQ1QsIEFEQ19DQUxGQUNUX0NBTEZBQ1RfRCB8IEFEQ19DQUxGQUNUX0NBTEZBQ1RfUyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQURDIGluc3RhbmNlIGlzIGluIGFuIHVua25vd24gc3RhdGUgKi8KKyAgICAvKiBOZWVkIHRvIHBlcmZvcm1pbmcgYSBoYXJkIHJlc2V0IG9mIEFEQyBpbnN0YW5jZSwgdXNpbmcgaGlnaCBsZXZlbCAgICAgICovCisgICAgLyogY2xvY2sgc291cmNlIFJDQyBBREMgcmVzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIENhdXRpb246IE9uIHRoaXMgU1RNMzIgc2VyaWUsIGlmIHNldmVyYWwgQURDIGluc3RhbmNlcyBhcmUgYXZhaWxhYmxlICAgKi8KKyAgICAvKiAgICAgICAgICBvbiB0aGUgc2VsZWN0ZWQgZGV2aWNlLCBSQ0MgQURDIHJlc2V0IHdpbGwgcmVzZXQgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgYWxsIEFEQyBpbnN0YW5jZXMgYmVsb25naW5nIHRvIHRoZSBjb21tb24gQURDIGluc3RhbmNlLiAgICAgICAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBBREMgaW5zdGFuY2UuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGluc3RhbmNlLgorICAqICAgICAgICAgQWZmZWN0cyBib3RoIGdyb3VwIHJlZ3VsYXIgYW5kIGdyb3VwIGluamVjdGVkIChhdmFpbGFiaWxpdHkKKyAgKiAgICAgICAgIG9mIEFEQyBncm91cCBpbmplY3RlZCBkZXBlbmRzIG9uIFNUTTMyIGZhbWlsaWVzKS4KKyAgKiAgICAgICAgIFJlZmVyIHRvIGNvcnJlc3BvbmRpbmcgdW5pdGFyeSBmdW5jdGlvbnMgaW50bworICAqICAgICAgICAgQHJlZiBBRENfTExfRUZfQ29uZmlndXJhdGlvbl9BRENfSW5zdGFuY2UgLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgc29tZSBvdGhlciBmZWF0dXJlcyBtdXN0IGJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgIHVzaW5nIExMIHVuaXRhcnkgZnVuY3Rpb25zLgorICAqICAgICAgICAgVGhlIG1pbmltdW0gY29uZmlndXJhdGlvbiByZW1haW5pbmcgdG8gYmUgZG9uZSBpczoKKyAgKiAgICAgICAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBvciBncm91cCBpbmplY3RlZCBzZXF1ZW5jZXI6CisgICogICAgICAgICAgICBtYXAgY2hhbm5lbCBvbiB0aGUgc2VsZWN0ZWQgc2VxdWVuY2VyIHJhbmsuCisgICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBAcmVmIExMX0FEQ19SRUdfU2V0U2VxdWVuY2VyUmFua3MoKS4KKyAgKiAgICAgICAgICAtIFNldCBBREMgY2hhbm5lbCBzYW1wbGluZyB0aW1lCisgICogICAgICAgICAgICBSZWZlciB0byBmdW5jdGlvbiBMTF9BRENfU2V0Q2hhbm5lbFNhbXBsaW5nVGltZSgpOworICAqIEBwYXJhbSAgQURDeCBBREMgaW5zdGFuY2UKKyAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgCisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVTT0xVVElPTihBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0RBVEFfQUxJR04oQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19MT1dfUE9XRVIoQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSkpOworICAKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihMTF9BRENfSXNFbmFibGVkKEFEQ3gpID09IDBVTCkKKyAgeworICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgQURDIGhpZXJhcmNoaWNhbCBzY29wZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBBREMgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGRhdGEgcmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBjb252ZXJzaW9uIGRhdGEgYWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgbG93IHBvd2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9SRVMKKyAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQUxJR04KKyAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQVVURExZCisgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgQURDX0luaXRTdHJ1Y3QtPlJlc29sdXRpb24KKyAgICAgICAgICAgICAgIHwgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQKKyAgICAgICAgICAgICAgIHwgQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZQorICAgICAgICAgICAgICApOworICAgIAorICB9CisgIGVsc2UKKyAgeworICAgIC8qIEluaXRpYWxpemF0aW9uIGVycm9yOiBBREMgaW5zdGFuY2UgaXMgbm90IGRpc2FibGVkLiAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9BRENfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEFEQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfQURDX1N0cnVjdEluaXQoTExfQURDX0luaXRUeXBlRGVmICpBRENfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IEFEQ19Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBpbnN0YW5jZSAqLworICBBRENfSW5pdFN0cnVjdC0+UmVzb2x1dGlvbiAgICA9IExMX0FEQ19SRVNPTFVUSU9OXzEyQjsKKyAgQURDX0luaXRTdHJ1Y3QtPkRhdGFBbGlnbm1lbnQgPSBMTF9BRENfREFUQV9BTElHTl9SSUdIVDsKKyAgQURDX0luaXRTdHJ1Y3QtPkxvd1Bvd2VyTW9kZSAgPSBMTF9BRENfTFBfTU9ERV9OT05FOworICAKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHNvbWUgZmVhdHVyZXMgb2YgQURDIGdyb3VwIHJlZ3VsYXIuCisgICogQG5vdGUgICBUaGVzZSBwYXJhbWV0ZXJzIGhhdmUgYW4gaW1wYWN0IG9uIEFEQyBzY29wZTogQURDIGdyb3VwIHJlZ3VsYXIuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIlJFRyIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgb3IgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyOgorICAqICAgICAgICAgICAgbWFwIGNoYW5uZWwgb24gdGhlIHNlbGVjdGVkIHNlcXVlbmNlciByYW5rLgorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gQHJlZiBMTF9BRENfUkVHX1NldFNlcXVlbmNlclJhbmtzKCkuCisgICogICAgICAgICAgLSBTZXQgQURDIGNoYW5uZWwgc2FtcGxpbmcgdGltZQorICAqICAgICAgICAgICAgUmVmZXIgdG8gZnVuY3Rpb24gTExfQURDX1NldENoYW5uZWxTYW1wbGluZ1RpbWUoKTsKKyAgKiBAcGFyYW0gIEFEQ3ggQURDIGluc3RhbmNlCisgICogQHBhcmFtICBBRENfUkVHX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQURDX1JFR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQURDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBREMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0FEQ19SRUdfSW5pdChBRENfVHlwZURlZiAqQURDeCwgTExfQURDX1JFR19Jbml0VHlwZURlZiAqQURDX1JFR19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0FEQ19BTExfSU5TVEFOQ0UoQURDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19UUklHX1NPVVJDRShBRENfUkVHX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19SRUdfU0VRX1NDQU5fTEVOR1RIKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoKSk7CisgIGlmKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0NPTlRfTU9ERShBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19DT05USU5VT1VTX01PREUoQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19ETUFfVFJBTlNGRVIoQURDX1JFR19Jbml0U3RydWN0LT5ETUFUcmFuc2ZlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX1JFR19PVlJfREFUQV9CRUhBVklPUihBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4pKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIHRyaWdnZXIgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBzZXF1ZW5jZXIgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGRpc2NvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgcmVndWxhciBjb252ZXJzaW9uIGRhdGEgdHJhbnNmZXI6IG5vIHRyYW5zZmVyIG9yICAgICovCisgICAgLyogICAgICB0cmFuc2ZlciBieSBETUEsIGFuZCBETUEgcmVxdWVzdHMgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCByZWd1bGFyIG92ZXJydW4gYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB0byB2YWx1ZSAweDAgYnkgICAgICovCisgICAgLyogICAgICAgc2V0dGluZyBvZiB0cmlnZ2VyIHNvdXJjZSB0byBTVyBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICE9IExMX0FEQ19SRUdfU0VRX1NDQU5fRElTQUJMRSkKKyAgICB7CisgICAgICBNT0RJRllfUkVHKEFEQ3gtPkNGR1IsCisgICAgICAgICAgICAgICAgICAgQURDX0NGR1JfRVhUU0VMCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRVhURU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ESVNDTlVNCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfQ09OVAorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0RNQUVOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRE1BQ0ZHCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfT1ZSTU9ECisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZQorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+U2VxdWVuY2VyRGlzY29udAorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPkRNQVRyYW5zZmVyCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5PdmVycnVuCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9FWFRTRUwKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9FWFRFTgorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0RJU0NFTgorICAgICAgICAgICAgICAgICB8IEFEQ19DRkdSX0RJU0NOVU0KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9DT05UCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfRE1BRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9ETUFDRkcKKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9PVlJNT0QKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgQURDX1JFR19Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlCisgICAgICAgICAgICAgICAgIHwgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICAgICAgICAgICAgICAgIHwgQURDX1JFR19Jbml0U3RydWN0LT5Db250aW51b3VzTW9kZQorICAgICAgICAgICAgICAgICB8IEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgfCBBRENfUkVHX0luaXRTdHJ1Y3QtPk92ZXJydW4KKyAgICAgICAgICAgICAgICApOworICAgIH0KKyAgICAKKyAgICAvKiBTZXQgQURDIGdyb3VwIHJlZ3VsYXIgc2VxdWVuY2VyIGxlbmd0aCBhbmQgc2NhbiBkaXJlY3Rpb24gKi8KKyAgICBMTF9BRENfUkVHX1NldFNlcXVlbmNlckxlbmd0aChBREN4LCBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6YXRpb24gZXJyb3I6IEFEQyBpbnN0YW5jZSBpcyBub3QgZGlzYWJsZWQuICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEFEQ19SRUdfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9BRENfUkVHX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfQURDX1JFR19TdHJ1Y3RJbml0KExMX0FEQ19SRUdfSW5pdFR5cGVEZWYgKkFEQ19SRUdfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IEFEQ19SRUdfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgLyogU2V0IGZpZWxkcyBvZiBBREMgZ3JvdXAgcmVndWxhciAqLworICAvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBBREMgdHJpZ2dlciBlZGdlIGlzIHNldCB0byB2YWx1ZSAweDAgYnkgICAgICAgKi8KKyAgLyogICAgICAgc2V0dGluZyBvZiB0cmlnZ2VyIHNvdXJjZSB0byBTVyBzdGFydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+VHJpZ2dlclNvdXJjZSAgICA9IExMX0FEQ19SRUdfVFJJR19TT0ZUV0FSRTsKKyAgQURDX1JFR19Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGggID0gTExfQURDX1JFR19TRVFfU0NBTl9ESVNBQkxFOworICBBRENfUkVHX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQgPSBMTF9BRENfUkVHX1NFUV9ESVNDT05UX0RJU0FCTEU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+Q29udGludW91c01vZGUgICA9IExMX0FEQ19SRUdfQ09OVl9TSU5HTEU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+RE1BVHJhbnNmZXIgICAgICA9IExMX0FEQ19SRUdfRE1BX1RSQU5TRkVSX05PTkU7CisgIEFEQ19SRUdfSW5pdFN0cnVjdC0+T3ZlcnJ1biAgICAgICAgICA9IExMX0FEQ19SRUdfT1ZSX0RBVEFfT1ZFUldSSVRURU47Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBzb21lIGZlYXR1cmVzIG9mIEFEQyBncm91cCBpbmplY3RlZC4KKyAgKiBAbm90ZSAgIFRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBhbiBpbXBhY3Qgb24gQURDIHNjb3BlOiBBREMgZ3JvdXAgaW5qZWN0ZWQuCisgICogICAgICAgICBSZWZlciB0byBjb3JyZXNwb25kaW5nIHVuaXRhcnkgZnVuY3Rpb25zIGludG8KKyAgKiAgICAgICAgIEByZWYgQURDX0xMX0VGX0NvbmZpZ3VyYXRpb25fQURDX0dyb3VwX1JlZ3VsYXIKKyAgKiAgICAgICAgIChmdW5jdGlvbnMgd2l0aCBwcmVmaXggIklOSiIpLgorICAqIEBub3RlICAgVGhlIHNldHRpbmcgb2YgdGhlc2UgcGFyYW1ldGVycyBieSBmdW5jdGlvbiBAcmVmIExMX0FEQ19Jbml0KCkKKyAgKiAgICAgICAgIGlzIGNvbmRpdGlvbmVkIHRvIEFEQyBzdGF0ZToKKyAgKiAgICAgICAgIEFEQyBpbnN0YW5jZSBtdXN0IGJlIGRpc2FibGVkLgorICAqICAgICAgICAgVGhpcyBjb25kaXRpb24gaXMgYXBwbGllZCB0byBhbGwgQURDIGZlYXR1cmVzLCBmb3IgZWZmaWNpZW5jeQorICAqICAgICAgICAgYW5kIGNvbXBhdGliaWxpdHkgb3ZlciBhbGwgU1RNMzIgZmFtaWxpZXMuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbnQKKyAgKiAgICAgICAgIGZlYXR1cmVzIGNhbiBiZSBzZXQgdW5kZXIgZGlmZmVyZW50IEFEQyBzdGF0ZSBjb25kaXRpb25zCisgICogICAgICAgICAoc2V0dGluZyBwb3NzaWJsZSB3aXRoIEFEQyBlbmFibGVkIHdpdGhvdXQgY29udmVyc2lvbiBvbiBnb2luZywKKyAgKiAgICAgICAgIEFEQyBlbmFibGVkIHdpdGggY29udmVyc2lvbiBvbiBnb2luZywgLi4uKQorICAqICAgICAgICAgRWFjaCBmZWF0dXJlIGNhbiBiZSB1cGRhdGVkIGFmdGVyd2FyZHMgd2l0aCBhIHVuaXRhcnkgZnVuY3Rpb24KKyAgKiAgICAgICAgIGFuZCBwb3RlbnRpYWxseSB3aXRoIEFEQyBpbiBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIGRpc2FibGVkLAorICAqICAgICAgICAgcmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBmb3Igc2V0dGluZworICAqICAgICAgICAgY29uZGl0aW9uZWQgdG8gQURDIHN0YXRlLgorICAqIEBub3RlICAgQWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXIgZmVhdHVyZXMgbXVzdCBiZSBjb25maWd1cmVkCisgICogICAgICAgICB1c2luZyBMTCB1bml0YXJ5IGZ1bmN0aW9ucy4KKyAgKiAgICAgICAgIFRoZSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gcmVtYWluaW5nIHRvIGJlIGRvbmUgaXM6CisgICogICAgICAgICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlcjoKKyAgKiAgICAgICAgICAgIG1hcCBjaGFubmVsIG9uIHRoZSBzZWxlY3RlZCBzZXF1ZW5jZXIgcmFuay4KKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIEByZWYgTExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcygpLgorICAqICAgICAgICAgIC0gU2V0IEFEQyBjaGFubmVsIHNhbXBsaW5nIHRpbWUKKyAgKiAgICAgICAgICAgIFJlZmVyIHRvIGZ1bmN0aW9uIExMX0FEQ19TZXRDaGFubmVsU2FtcGxpbmdUaW1lKCk7CisgICogQHBhcmFtICBBREN4IEFEQyBpbnN0YW5jZQorICAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFEQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQURDIHJlZ2lzdGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9BRENfSU5KX0luaXQoQURDX1R5cGVEZWYgKkFEQ3gsIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgKkFEQ19JTkpfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19BRENfQUxMX0lOU1RBTkNFKEFEQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19TT1VSQ0UoQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnZ2VyU291cmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9BRENfSU5KX1NFUV9TQ0FOX0xFTkdUSChBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCkpOworICBpZihBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfSU5KX1NFUV9TQ0FOX0RJU0FCTEUpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfQURDX0lOSl9TRVFfU0NBTl9ESVNDT05UX01PREUoQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250KSk7CisgIH0KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0FEQ19JTkpfVFJJR19BVVRPKEFEQ19JTkpfSW5pdFN0cnVjdC0+VHJpZ0F1dG8pKTsKKyAgCisgIC8qIE5vdGU6IEhhcmR3YXJlIGNvbnN0cmFpbnQgKHJlZmVyIHRvIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24pOiAgICAgICAqLworICAvKiAgICAgICBBREMgaW5zdGFuY2UgbXVzdCBiZSBkaXNhYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoTExfQURDX0lzRW5hYmxlZChBREN4KSA9PSAwVUwpCisgIHsKKyAgICAvKiBDb25maWd1cmF0aW9uIG9mIEFEQyBoaWVyYXJjaGljYWwgc2NvcGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gQURDIGdyb3VwIGluamVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCB0cmlnZ2VyIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAtIFNldCBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxdWVuY2VyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgLSBTZXQgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlciBkaXNjb250aW51b3VzIG1vZGUgICAgICAgICAgICAgICAqLworICAgIC8qICAgIC0gU2V0IEFEQyBncm91cCBpbmplY3RlZCBjb252ZXJzaW9uIHRyaWdnZXI6IGluZGVwZW5kZW50IG9yICAgICAgICAgKi8KKyAgICAvKiAgICAgIGZyb20gQURDIGdyb3VwIHJlZ3VsYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTm90ZTogT24gdGhpcyBTVE0zMiBzZXJpZSwgQURDIHRyaWdnZXIgZWRnZSBpcyBzZXQgdG8gdmFsdWUgMHgwIGJ5ICAgICAqLworICAgIC8qICAgICAgIHNldHRpbmcgb2YgdHJpZ2dlciBzb3VyY2UgdG8gU1cgc3RhcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckxlbmd0aCAhPSBMTF9BRENfUkVHX1NFUV9TQ0FOX0RJU0FCTEUpCisgICAgeworICAgICAgTU9ESUZZX1JFRyhBREN4LT5DRkdSLAorICAgICAgICAgICAgICAgICAgIEFEQ19DRkdSX0pESVNDRU4KKyAgICAgICAgICAgICAgICAgfCBBRENfQ0ZHUl9KQVVUTworICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlNlcXVlbmNlckRpc2NvbnQKKyAgICAgICAgICAgICAgICAgfCBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIE1PRElGWV9SRUcoQURDeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgICAgICBBRENfQ0ZHUl9KRElTQ0VOCisgICAgICAgICAgICAgICAgIHwgQURDX0NGR1JfSkFVVE8KKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgTExfQURDX1JFR19TRVFfRElTQ09OVF9ESVNBQkxFCisgICAgICAgICAgICAgICAgIHwgQURDX0lOSl9Jbml0U3RydWN0LT5UcmlnQXV0bworICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIAorICAgIE1PRElGWV9SRUcoQURDeC0+SlNRUiwKKyAgICAgICAgICAgICAgICAgQURDX0pTUVJfSkVYVFNFTAorICAgICAgICAgICAgICAgfCBBRENfSlNRUl9KRVhURU4KKyAgICAgICAgICAgICAgIHwgQURDX0pTUVJfSkwKKyAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UKKyAgICAgICAgICAgICAgIHwgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJMZW5ndGgKKyAgICAgICAgICAgICAgKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQURDIGluc3RhbmNlIGlzIG5vdCBkaXNhYmxlZC4gKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfQURDX0lOSl9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgQURDX0lOSl9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0FEQ19JTkpfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9BRENfSU5KX1N0cnVjdEluaXQoTExfQURDX0lOSl9Jbml0VHlwZURlZiAqQURDX0lOSl9Jbml0U3RydWN0KQoreworICAvKiBTZXQgQURDX0lOSl9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAvKiBTZXQgZmllbGRzIG9mIEFEQyBncm91cCBpbmplY3RlZCAqLworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdnZXJTb3VyY2UgICAgPSBMTF9BRENfSU5KX1RSSUdfU09GVFdBUkU7CisgIEFEQ19JTkpfSW5pdFN0cnVjdC0+U2VxdWVuY2VyTGVuZ3RoICA9IExMX0FEQ19JTkpfU0VRX1NDQU5fRElTQUJMRTsKKyAgQURDX0lOSl9Jbml0U3RydWN0LT5TZXF1ZW5jZXJEaXNjb250ID0gTExfQURDX0lOSl9TRVFfRElTQ09OVF9ESVNBQkxFOworICBBRENfSU5KX0luaXRTdHJ1Y3QtPlRyaWdBdXRvICAgICAgICAgPSBMTF9BRENfSU5KX1RSSUdfSU5ERVBFTkRFTlQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBBREMxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfY29tcC5jIGIvU3JjL3N0bTMyd2J4eF9sbF9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NzRhMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfY29tcC5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2NvbXAuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ09NUCBMTCBtb2R1bGUgZHJpdmVyCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfY29tcC5oIgorCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKworCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTCBDT01QCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBhZGR0b2dyb3VwIENPTVBfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisvKiBDaGVjayBvZiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIG9mIENPTVAgaGllcmFyY2hpY2FsIHNjb3BlOiAgICAgICAgICAqLworLyogQ09NUCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBJU19MTF9DT01QX1BPV0VSX01PREUoX19QT1dFUl9NT0RFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19QT1dFUl9NT0RFX18pID09IExMX0NPTVBfUE9XRVJNT0RFX0hJR0hTUEVFRCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fUE9XRVJfTU9ERV9fKSA9PSBMTF9DT01QX1BPV0VSTU9ERV9NRURJVU1TUEVFRCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX1BPV0VSX01PREVfXykgPT0gTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUikgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBjb21wYXJhdG9yIGlucHV0IHBsdXMgcGFyYW1ldGVycyBhcmUgICAgICAgICAgICAqLworLyogICAgICAgdGhlIHNhbWUgb24gYWxsIENPTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhvd2V2ZXIsIGNvbXBhcmF0b3IgaW5zdGFuY2Uga2VwdCBhcyBtYWNybyBwYXJhbWV0ZXIgZm9yICAgICAgICAgICAgICovCisvKiAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX1BMVVMoX19DT01QX0lOU1RBTkNFX18sIF9fSU5QVVRfUExVU19fKSAgICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9QTFVTX18pID09IExMX0NPTVBfSU5QVVRfUExVU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfUExVU19fKSA9PSBMTF9DT01QX0lOUFVUX1BMVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX1BMVVNfXykgPT0gTExfQ09NUF9JTlBVVF9QTFVTX0lPMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisvKiBOb3RlOiBPbiB0aGlzIFNUTTMyIHNlcmllLCBjb21wYXJhdG9yIGlucHV0IG1pbnVzIHBhcmFtZXRlcnMgYXJlICAgICAgICAgICAqLworLyogICAgICAgdGhlIHNhbWUgb24gYWxsIENPTVAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEhvd2V2ZXIsIGNvbXBhcmF0b3IgaW5zdGFuY2Uga2VwdCBhcyBtYWNybyBwYXJhbWV0ZXIgZm9yICAgICAgICAgICAgICovCisvKiAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgU1RNMzIgZmFtaWxpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU19MTF9DT01QX0lOUFVUX01JTlVTKF9fQ09NUF9JTlNUQU5DRV9fLCBfX0lOUFVUX01JTlVTX18pICAgICAgICAgICAgIFwKKyAgKCAgICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTXzFfNFZSRUZJTlQpICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU18xXzJWUkVGSU5UKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfM180VlJFRklOVCkgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQpICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9NSU5VU19fKSA9PSBMTF9DT01QX0lOUFVUX01JTlVTX0lPMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfTUlOVVNfXykgPT0gTExfQ09NUF9JTlBVVF9NSU5VU19JTzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX01JTlVTX18pID09IExMX0NPTVBfSU5QVVRfTUlOVVNfSU81KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0NPTVBfSU5QVVRfSFlTVEVSRVNJUyhfX0lOUFVUX0hZU1RFUkVTSVNfXykgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX05PTkUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19JTlBVVF9IWVNURVJFU0lTX18pID09IExMX0NPTVBfSFlTVEVSRVNJU19MT1cpICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fSU5QVVRfSFlTVEVSRVNJU19fKSA9PSBMTF9DT01QX0hZU1RFUkVTSVNfTUVESVVNKSAgICAgICAgICAgICAgICAgICAgXAorICAgfHwgKChfX0lOUFVUX0hZU1RFUkVTSVNfXykgPT0gTExfQ09NUF9IWVNURVJFU0lTX0hJR0gpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKQorCisjZGVmaW5lIElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICAgKChfX1BPTEFSSVRZX18pID09IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHx8ICgoX19QT0xBUklUWV9fKSA9PSBMTF9DT01QX09VVFBVVFBPTF9JTlZFUlRFRCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkKKworI2RlZmluZSBJU19MTF9DT01QX09VVFBVVF9CTEFOS0lOR19TT1VSQ0UoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pICAgICAgICAgIFwKKyAgKCAgICgoX19PVVRQVVRfQkxBTktJTkdfU09VUkNFX18pID09IExMX0NPTVBfQkxBTktJTkdTUkNfTk9ORSkgICAgICAgICAgICAgICBcCisgICB8fCAoKF9fT1VUUFVUX0JMQU5LSU5HX1NPVVJDRV9fKSA9PSBMTF9DT01QX0JMQU5LSU5HU1JDX1RJTTFfT0M1KSAgICAgICAgICAgXAorICAgfHwgKChfX09VVFBVVF9CTEFOS0lOR19TT1VSQ0VfXykgPT0gTExfQ09NUF9CTEFOS0lOR1NSQ19USU0yX09DMykgICAgICAgICAgIFwKKyAgKQorCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgQ09NUF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHJlZ2lzdGVycyBvZiB0aGUgc2VsZWN0ZWQgQ09NUCBpbnN0YW5jZQorICAqICAgICAgICAgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQG5vdGUgICBJZiBjb21wYXJhdG9yIGlzIGxvY2tlZCwgZGUtaW5pdGlhbGl6YXRpb24gYnkgc29mdHdhcmUgaXMKKyAgKiAgICAgICAgIG5vdCBwb3NzaWJsZS4KKyAgKiAgICAgICAgIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuCisgICogQHBhcmFtICBDT01QeCBDT01QIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENPTVAgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IENPTVAgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NPTVBfRGVJbml0KENPTVBfVHlwZURlZiAqQ09NUHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NPTVBfQUxMX0lOU1RBTkNFKENPTVB4KSk7CisKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbik6ICAgICAgICovCisgIC8qICAgICAgIENPTVAgaW5zdGFuY2UgbXVzdCBub3QgYmUgbG9ja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQ09NUF9Jc0xvY2tlZChDT01QeCkgPT0gMFVMKQorICB7CisgICAgTExfQ09NUF9Xcml0ZVJlZyhDT01QeCwgQ1NSLCAweDAwMDAwMDAwVUwpOworCisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ29tcGFyYXRvciBpbnN0YW5jZSBpcyBsb2NrZWQ6IGRlLWluaXRpYWxpemF0aW9uIGJ5IHNvZnR3YXJlIGlzICAgICAgICAgKi8KKyAgICAvKiBub3QgcG9zc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFRoZSBvbmx5IHdheSB0byB1bmxvY2sgdGhlIGNvbXBhcmF0b3IgaXMgYSBkZXZpY2UgaGFyZHdhcmUgcmVzZXQuICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgc29tZSBmZWF0dXJlcyBvZiBDT01QIGluc3RhbmNlLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGZlYXR1cmVzIG9mIHRoZSBzZWxlY3RlZCBDT01QIGluc3RhbmNlLgorICAqICAgICAgICAgU29tZSBmZWF0dXJlcyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgc2NvcGUgQ09NUCBjb21tb24gaW5zdGFuY2UKKyAgKiAgICAgICAgIChjb21tb24gdG8gc2V2ZXJhbCBDT01QIGluc3RhbmNlcykuCisgICogICAgICAgICBSZWZlciB0byBmdW5jdGlvbnMgaGF2aW5nIGFyZ3VtZW50ICJDT01QeHlfQ09NTU9OIiBhcyBwYXJhbWV0ZXIuCisgICogQHBhcmFtICBDT01QeCBDT01QIGluc3RhbmNlCisgICogQHBhcmFtICBDT01QX0luaXRTdHJ1Y3QgUG9pbnRlciB0byBhIEByZWYgTExfQ09NUF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ09NUCByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogQ09NUCByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfQ09NUF9Jbml0KENPTVBfVHlwZURlZiAqQ09NUHgsIExMX0NPTVBfSW5pdFR5cGVEZWYgKkNPTVBfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfQ09NUF9BTExfSU5TVEFOQ0UoQ09NUHgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfUE9XRVJfTU9ERShDT01QX0luaXRTdHJ1Y3QtPlBvd2VyTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9QTFVTKENPTVB4LCBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfQ09NUF9JTlBVVF9NSU5VUyhDT01QeCwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dE1pbnVzKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9DT01QX0lOUFVUX0hZU1RFUkVTSVMoQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX1BPTEFSSVRZKENPTVBfSW5pdFN0cnVjdC0+T3V0cHV0UG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0NPTVBfT1VUUFVUX0JMQU5LSU5HX1NPVVJDRShDT01QX0luaXRTdHJ1Y3QtPk91dHB1dEJsYW5raW5nU291cmNlKSk7CisKKyAgLyogTm90ZTogSGFyZHdhcmUgY29uc3RyYWludCAocmVmZXIgdG8gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbikgICAgICAgICovCisgIC8qICAgICAgIENPTVAgaW5zdGFuY2UgbXVzdCBub3QgYmUgbG9ja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZiAoTExfQ09NUF9Jc0xvY2tlZChDT01QeCkgPT0gMFVMKQorICB7CisgICAgLyogQ29uZmlndXJhdGlvbiBvZiBjb21wYXJhdG9yIGluc3RhbmNlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIFBvd2VyTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBJbnB1dFBsdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gSW5wdXRNaW51cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAtIElucHV0SHlzdGVyZXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgLSBPdXRwdXRQb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIC0gT3V0cHV0QmxhbmtpbmdTb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE1PRElGWV9SRUcoQ09NUHgtPkNTUiwKKyAgICAgICAgICAgICAgIENPTVBfQ1NSX1BXUk1PREUKKyAgICAgICAgICAgICAgIHwgQ09NUF9DU1JfSU5QU0VMCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX1NDQUxFTgorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9CUkdFTgorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9JTk1FU0VMCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0lOTVNFTAorICAgICAgICAgICAgICAgfCBDT01QX0NTUl9IWVNUCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX1BPTEFSSVRZCisgICAgICAgICAgICAgICB8IENPTVBfQ1NSX0JMQU5LSU5HCisgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICBDT01QX0luaXRTdHJ1Y3QtPlBvd2VyTW9kZQorICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0UGx1cworICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPklucHV0TWludXMKKyAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5JbnB1dEh5c3RlcmVzaXMKKyAgICAgICAgICAgICAgIHwgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eQorICAgICAgICAgICAgICAgfCBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dEJsYW5raW5nU291cmNlCisgICAgICAgICAgICAgICk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBJbml0aWFsaXphdGlvbiBlcnJvcjogQ09NUCBpbnN0YW5jZSBpcyBsb2NrZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9DT01QX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtIENPTVBfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9DT01QX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9DT01QX1N0cnVjdEluaXQoTExfQ09NUF9Jbml0VHlwZURlZiAqQ09NUF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgQ09NUF9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBDT01QX0luaXRTdHJ1Y3QtPlBvd2VyTW9kZSAgICAgICAgICAgID0gTExfQ09NUF9QT1dFUk1PREVfVUxUUkFMT1dQT1dFUjsKKyAgQ09NUF9Jbml0U3RydWN0LT5JbnB1dFBsdXMgICAgICAgICAgICA9IExMX0NPTVBfSU5QVVRfUExVU19JTzE7CisgIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRNaW51cyAgICAgICAgICAgPSBMTF9DT01QX0lOUFVUX01JTlVTX1ZSRUZJTlQ7CisgIENPTVBfSW5pdFN0cnVjdC0+SW5wdXRIeXN0ZXJlc2lzICAgICAgPSBMTF9DT01QX0hZU1RFUkVTSVNfTk9ORTsKKyAgQ09NUF9Jbml0U3RydWN0LT5PdXRwdXRQb2xhcml0eSAgICAgICA9IExMX0NPTVBfT1VUUFVUUE9MX05PTklOVkVSVEVEOworICBDT01QX0luaXRTdHJ1Y3QtPk91dHB1dEJsYW5raW5nU291cmNlID0gTExfQ09NUF9CTEFOS0lOR1NSQ19OT05FOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisKKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9jcmMuYyBiL1NyYy9zdG0zMndieHhfbGxfY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI2MDZlNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfY3JjLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfY3JjLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIENSQyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2NyYy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoQ1JDKQorCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgQ1JDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBDUkNfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBDUkMgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgQ1JDeCBDUkMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQ1JDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBDUkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NSQ19EZUluaXQoQ1JDX1R5cGVEZWYgKkNSQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0NSQ19BTExfSU5TVEFOQ0UoQ1JDeCkpOworCisgIGlmIChDUkN4ID09IENSQykKKyAgeworICAgIC8qIEZvcmNlIENSQyByZXNldCAqLworICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfQ1JDKTsKKworICAgIC8qIFJlbGVhc2UgQ1JDIHJlc2V0ICovCisgICAgTExfQUhCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIxX0dSUDFfUEVSSVBIX0NSQyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIChDUkMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9jcnMuYyBiL1NyYy9zdG0zMndieHhfbGxfY3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhNjczNwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfY3JzLmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9jcnMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgQ1JTIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9jcnMuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfYnVzLmgiCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoQ1JTKQorCisvKiogQGRlZmdyb3VwIENSU19MTCBDUlMKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBDUlNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIENSU19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1Jbml0aWFsaXplcyBDUlMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IENSUyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0NSU19EZUluaXQodm9pZCkKK3sKKyAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9DUlMpOworICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfQ1JTKTsKKworICByZXR1cm4gIFNVQ0NFU1M7Cit9CisKKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChDUlMpICovCisKKy8qKgorICAqIEB9CisgICovCisgIAorI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9kbWEuYyBiL1NyYy9zdG0zMndieHhfbGxfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYmU4OQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfZG1hLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfZG1hLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIERNQSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZG1hLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRE1BMSkgfHwgZGVmaW5lZCAoRE1BMikKKworLyoqIEBkZWZncm91cCBETUFfTEwgRE1BCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9ETUFfRElSRUNUSU9OKF9fVkFMVUVfXykgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfRElSRUNUSU9OX1BFUklQSF9UT19NRU1PUlkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX0RJUkVDVElPTl9NRU1PUllfVE9fUEVSSVBIKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9ESVJFQ1RJT05fTUVNT1JZX1RPX01FTU9SWSkpCisKKyNkZWZpbmUgSVNfTExfRE1BX01PREUoX19WQUxVRV9fKSAgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX01PREVfTk9STUFMKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9NT0RFX0NJUkNVTEFSKSkKKworI2RlZmluZSBJU19MTF9ETUFfUEVSSVBISU5DTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUEVSSVBIX0lOQ1JFTUVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UKSkKKworI2RlZmluZSBJU19MTF9ETUFfTUVNT1JZSU5DTU9ERShfX1ZBTFVFX18pICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTUVNT1JZX0lOQ1JFTUVOVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTUVNT1JZX05PSU5DUkVNRU5UKSkKKworI2RlZmluZSBJU19MTF9ETUFfUEVSSVBIREFUQVNJWkUoX19WQUxVRV9fKSAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUERBVEFBTElHTl9CWVRFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QREFUQUFMSUdOX1dPUkQpKQorCisjZGVmaW5lIElTX0xMX0RNQV9NRU1PUllEQVRBU0laRShfX1ZBTFVFX18pICAgICAoKChfX1ZBTFVFX18pID09IExMX0RNQV9NREFUQUFMSUdOX0JZVEUpICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfTURBVEFBTElHTl9IQUxGV09SRCkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX01EQVRBQUxJR05fV09SRCkpCisKKyNkZWZpbmUgSVNfTExfRE1BX05CREFUQShfX1ZBTFVFX18pICAgICAgICAgICAgICgoX19WQUxVRV9fKSAgPD0gMHgwMDAwRkZGRlUpCisKKyNkZWZpbmUgSVNfTExfRE1BX1BFUklQSFJFUVVFU1QoX19WQUxVRV9fKSAgICAgICgoX19WQUxVRV9fKSA8PSA0MFUpCisKKyNkZWZpbmUgSVNfTExfRE1BX1BSSU9SSVRZKF9fVkFMVUVfXykgICAgICAgICAgICgoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX0xPVykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9ETUFfUFJJT1JJVFlfTUVESVVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0RNQV9QUklPUklUWV9ISUdIKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRE1BX1BSSU9SSVRZX1ZFUllISUdIKSkKKworI2lmIGRlZmluZWQgKERNQTIpCisjaWYgZGVmaW5lZCAoRE1BMl9DaGFubmVsNikgJiYgZGVmaW5lZCAoRE1BMl9DaGFubmVsNykKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKElOU1RBTkNFKSA9PSBETUEyKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpKQorI2Vsc2UKKyNkZWZpbmUgSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKElOU1RBTkNFLCBDSEFOTkVMKSAgKCgoKElOU1RBTkNFKSA9PSBETUExKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF82KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF83KSkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKElOU1RBTkNFKSA9PSBETUEyKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSkpKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBJU19MTF9ETUFfQUxMX0NIQU5ORUxfSU5TVEFOQ0UoSU5TVEFOQ0UsIENIQU5ORUwpICAoKCgoSU5TVEFOQ0UpID09IERNQTEpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzEpfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBMTF9ETUFfQ0hBTk5FTF81KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IExMX0RNQV9DSEFOTkVMXzYpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0hBTk5FTCkgPT0gTExfRE1BX0NIQU5ORUxfNykpKSkKKyNlbmRpZgorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBETUFfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIERNQV9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIHRoZSBETUEgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgRE1BeCBETUF4IEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzIKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8zCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF82CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMX0FMTAorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBETUEgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IERNQSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfRE1BX0RlSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCkKK3sKKyAgRE1BX0NoYW5uZWxfVHlwZURlZiAqdG1wOworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBETUEgSW5zdGFuY2UgRE1BeCBhbmQgQ2hhbm5lbCBwYXJhbWV0ZXJzKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9BTExfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSB8fCAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpKTsKKworICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF9BTEwpCisgIHsKKyAgICBpZiAoRE1BeCA9PSBETUExKQorICAgIHsKKyAgICAgIC8qIEZvcmNlIHJlc2V0IG9mIERNQSBjbG9jayAqLworICAgICAgTExfQUhCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKworICAgICAgLyogUmVsZWFzZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMV9HUlAxX1BFUklQSF9ETUExKTsKKyAgICB9CisjaWYgZGVmaW5lZChETUEyKQorICAgIGVsc2UgaWYgKERNQXggPT0gRE1BMikKKyAgICB7CisgICAgICAvKiBGb3JjZSByZXNldCBvZiBETUEgY2xvY2sgKi8KKyAgICAgIExMX0FIQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisKKyAgICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgRE1BIGNsb2NrICovCisgICAgICBMTF9BSEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjFfR1JQMV9QRVJJUEhfRE1BMik7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB0bXAgPSAoRE1BX0NoYW5uZWxfVHlwZURlZiAqKShfX0xMX0RNQV9HRVRfQ0hBTk5FTF9JTlNUQU5DRShETUF4LCBDaGFubmVsKSk7CisKKyAgICAvKiBSZXNldCBETUF4X0NoYW5uZWx5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICBXUklURV9SRUcodG1wLT5DQ1IsIDBVKTsKKworICAgIC8qIFJlc2V0IERNQXhfQ2hhbm5lbHkgcmVtYWluaW5nIGJ5dGVzIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKHRtcC0+Q05EVFIsIDBVKTsKKworICAgIC8qIFJlc2V0IERNQXhfQ2hhbm5lbHkgcGVyaXBoZXJhbCBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKHRtcC0+Q1BBUiwgMFUpOworCisgICAgLyogUmVzZXQgRE1BeF9DaGFubmVseSBtZW1vcnkgYWRkcmVzcyByZWdpc3RlciAqLworICAgIFdSSVRFX1JFRyh0bXAtPkNNQVIsIDBVKTsKKworICAgIC8qIFJlc2V0IFJlcXVlc3QgcmVnaXN0ZXIgZmllbGQgZm9yIERNQXggQ2hhbm5lbCAqLworICAgIExMX0RNQV9TZXRQZXJpcGhSZXF1ZXN0KERNQXgsIENoYW5uZWwsIExMX0RNQU1VWF9SRVFfTUVNMk1FTSk7CisKKyAgICBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF8xKQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDEgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0kxKERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzIpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsMiAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTIoRE1BeCk7CisgICAgfQorICAgIGVsc2UgaWYgKENoYW5uZWwgPT0gTExfRE1BX0NIQU5ORUxfMykKKyAgICB7CisgICAgICAvKiBSZXNldCBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzIGZvciBETUF4IENoYW5uZWwzICovCisgICAgICBMTF9ETUFfQ2xlYXJGbGFnX0dJMyhETUF4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF80KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDQgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k0KERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzUpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNSAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTUoRE1BeCk7CisgICAgfQorCisgICAgZWxzZSBpZiAoQ2hhbm5lbCA9PSBMTF9ETUFfQ0hBTk5FTF82KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IGludGVycnVwdCBwZW5kaW5nIGJpdHMgZm9yIERNQXggQ2hhbm5lbDYgKi8KKyAgICAgIExMX0RNQV9DbGVhckZsYWdfR0k2KERNQXgpOworICAgIH0KKyAgICBlbHNlIGlmIChDaGFubmVsID09IExMX0RNQV9DSEFOTkVMXzcpCisgICAgeworICAgICAgLyogUmVzZXQgaW50ZXJydXB0IHBlbmRpbmcgYml0cyBmb3IgRE1BeCBDaGFubmVsNyAqLworICAgICAgTExfRE1BX0NsZWFyRmxhZ19HSTcoRE1BeCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIERNQSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBETUFfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIFRvIGNvbnZlcnQgRE1BeF9DaGFubmVseSBJbnN0YW5jZSB0byBETUF4IEluc3RhbmNlIGFuZCBDaGFubmVseSwgdXNlIGhlbHBlciBtYWNyb3MgOgorICAqICAgICAgICAgQGFyZyBAcmVmIF9fTExfRE1BX0dFVF9JTlNUQU5DRQorICAqICAgICAgICAgQGFyZyBAcmVmIF9fTExfRE1BX0dFVF9DSEFOTkVMCisgICogQHBhcmFtICBETUF4IERNQXggSW5zdGFuY2UKKyAgKiBAcGFyYW0gIENoYW5uZWwgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF8xCisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF80CisgICogICAgICAgICBAYXJnIEByZWYgTExfRE1BX0NIQU5ORUxfNQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0RNQV9DSEFOTkVMXzYKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9ETUFfQ0hBTk5FTF83CisgICogQHBhcmFtICBETUFfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9ETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBETUEgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9ETUFfSW5pdChETUFfVHlwZURlZiAqRE1BeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfRE1BX0luaXRUeXBlRGVmICpETUFfSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIERNQSBJbnN0YW5jZSBETUF4IGFuZCBDaGFubmVsIHBhcmFtZXRlcnMqLworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX0FMTF9DSEFOTkVMX0lOU1RBTkNFKERNQXgsIENoYW5uZWwpKTsKKworICAvKiBDaGVjayB0aGUgRE1BIHBhcmFtZXRlcnMgZnJvbSBETUFfSW5pdFN0cnVjdCAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX0RJUkVDVElPTihETUFfSW5pdFN0cnVjdC0+RGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTU9ERShETUFfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSElOQ01PREUoRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjSW5jTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX01FTU9SWUlOQ01PREUoRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0SW5jTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSERBVEFTSVpFKERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0RhdGFTaXplKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9ETUFfTUVNT1JZREFUQVNJWkUoRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0RGF0YVNpemUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9OQkRBVEEoRE1BX0luaXRTdHJ1Y3QtPk5iRGF0YSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRE1BX1BFUklQSFJFUVVFU1QoRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaFJlcXVlc3QpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0RNQV9QUklPUklUWShETUFfSW5pdFN0cnVjdC0+UHJpb3JpdHkpKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIERNQXhfQ2hhbm5lbHk6IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLCBkYXRhIHRyYW5zZmVyIG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsIGFuZCBtZW1vcnkgaW5jcmVtZW50IG1vZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNpemUgYWxpZ25tZW50IGFuZCAgcHJpb3JpdHkgbGV2ZWwgd2l0aCBwYXJhbWV0ZXJzIDoKKyAgICogLSBEaXJlY3Rpb246ICAgICAgRE1BX0NDUl9ESVIgYW5kIERNQV9DQ1JfTUVNMk1FTSBiaXRzCisgICAqIC0gTW9kZTogICAgICAgICAgIERNQV9DQ1JfQ0lSQyBiaXQKKyAgICogLSBQZXJpcGhPck0yTVNyY0luY01vZGU6ICBETUFfQ0NSX1BJTkMgYml0CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RJbmNNb2RlOiAgRE1BX0NDUl9NSU5DIGJpdAorICAgKiAtIFBlcmlwaE9yTTJNU3JjRGF0YVNpemU6IERNQV9DQ1JfUFNJWkVbMTowXSBiaXRzCisgICAqIC0gTWVtb3J5T3JNMk1Ec3REYXRhU2l6ZTogRE1BX0NDUl9NU0laRVsxOjBdIGJpdHMKKyAgICogLSBQcmlvcml0eTogICAgICAgICAgICAgICBETUFfQ0NSX1BMWzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX0NvbmZpZ1RyYW5zZmVyKERNQXgsIENoYW5uZWwsIERNQV9Jbml0U3RydWN0LT5EaXJlY3Rpb24gICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPk1vZGUgICAgICAgICAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoT3JNMk1TcmNJbmNNb2RlICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEluY01vZGUgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjRGF0YVNpemUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3REYXRhU2l6ZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNQV9Jbml0U3RydWN0LT5Qcmlvcml0eSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUF4IENNQVIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgbWVtb3J5IG9yIGRlc3RpbmF0aW9uIGJhc2UgYWRkcmVzcyB3aXRoIHBhcmFtZXRlciA6CisgICAqIC0gTWVtb3J5T3JNMk1Ec3RBZGRyZXNzOiBETUFfQ01BUl9NQVszMTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0TWVtb3J5QWRkcmVzcyhETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RBZGRyZXNzKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQXggQ1BBUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBwZXJpcGhlcmFsIG9yIHNvdXJjZSBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFBlcmlwaE9yTTJNU3JjQWRkcmVzczogRE1BX0NQQVJfUEFbMzE6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldFBlcmlwaEFkZHJlc3MoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjQWRkcmVzcyk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BeCBDTkRUUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3Mgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIE5iRGF0YTogRE1BX0NORFRSX05EVFsxNTowXSBiaXRzCisgICAqLworICBMTF9ETUFfU2V0RGF0YUxlbmd0aChETUF4LCBDaGFubmVsLCBETUFfSW5pdFN0cnVjdC0+TmJEYXRhKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBETUFNVVh4IENDUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBETUEgcmVxdWVzdCBmb3IgRE1BIENoYW5uZWxzIG9uIERNQU1VWCBDaGFubmVsIHggd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFBlcmlwaFJlcXVlc3Q6IERNQV9DeENSWzc6MF0gYml0cworICAgKi8KKyAgTExfRE1BX1NldFBlcmlwaFJlcXVlc3QoRE1BeCwgQ2hhbm5lbCwgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaFJlcXVlc3QpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfRE1BX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBETUFfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9ETUFfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9ETUFfU3RydWN0SW5pdChMTF9ETUFfSW5pdFR5cGVEZWYgKkRNQV9Jbml0U3RydWN0KQoreworICAvKiBTZXQgRE1BX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0FkZHJlc3MgID0gMHgwMDAwMDAwMFU7CisgIERNQV9Jbml0U3RydWN0LT5NZW1vcnlPck0yTURzdEFkZHJlc3MgID0gMHgwMDAwMDAwMFU7CisgIERNQV9Jbml0U3RydWN0LT5EaXJlY3Rpb24gICAgICAgICAgICAgID0gTExfRE1BX0RJUkVDVElPTl9QRVJJUEhfVE9fTUVNT1JZOworICBETUFfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgICAgICAgICA9IExMX0RNQV9NT0RFX05PUk1BTDsKKyAgRE1BX0luaXRTdHJ1Y3QtPlBlcmlwaE9yTTJNU3JjSW5jTW9kZSAgPSBMTF9ETUFfUEVSSVBIX05PSU5DUkVNRU5UOworICBETUFfSW5pdFN0cnVjdC0+TWVtb3J5T3JNMk1Ec3RJbmNNb2RlICA9IExMX0RNQV9NRU1PUllfTk9JTkNSRU1FTlQ7CisgIERNQV9Jbml0U3RydWN0LT5QZXJpcGhPck0yTVNyY0RhdGFTaXplID0gTExfRE1BX1BEQVRBQUxJR05fQllURTsKKyAgRE1BX0luaXRTdHJ1Y3QtPk1lbW9yeU9yTTJNRHN0RGF0YVNpemUgPSBMTF9ETUFfTURBVEFBTElHTl9CWVRFOworICBETUFfSW5pdFN0cnVjdC0+TmJEYXRhICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDBVOworICBETUFfSW5pdFN0cnVjdC0+UGVyaXBoUmVxdWVzdCAgICAgICAgICA9IExMX0RNQU1VWF9SRVFfTUVNMk1FTTsKKyAgRE1BX0luaXRTdHJ1Y3QtPlByaW9yaXR5ICAgICAgICAgICAgICAgPSBMTF9ETUFfUFJJT1JJVFlfTE9XOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogRE1BMSB8fCBETUEyICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfZXh0aS5jIGIvU3JjL3N0bTMyd2J4eF9sbF9leHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1NmZlYwotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfZXh0aS5jCkBAIC0wLDAgKzEsMjk5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2V4dGkuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgRVhUSSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZXh0aS5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRVhUSSkKKworLyoqIEBkZWZncm91cCBFWFRJX0xMIEVYVEkKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0VYVElfTElORV8wXzMxKF9fVkFMVUVfXykgICAgICAgICAgICAgICgoKF9fVkFMVUVfXykgJiB+TExfRVhUSV9MSU5FX0FMTF8wXzMxKSA9PSAweDAwMDAwMDAwVSkKKyNkZWZpbmUgSVNfTExfRVhUSV9MSU5FXzMyXzYzKF9fVkFMVUVfXykgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSAmIH5MTF9FWFRJX0xJTkVfQUxMXzMyXzYzKSA9PSAweDAwMDAwMDAwVSkKKworI2RlZmluZSBJU19MTF9FWFRJX01PREUoX19WQUxVRV9fKSAgICAgICAgICAgICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0VYVElfTU9ERV9JVCkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9NT0RFX0VWRU5UKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX01PREVfSVRfRVZFTlQpKQorCisKKyNkZWZpbmUgSVNfTExfRVhUSV9UUklHR0VSKF9fVkFMVUVfXykgICAgICAgICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfTk9ORSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0VYVElfVFJJR0dFUl9SSVNJTkcpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfRVhUSV9UUklHR0VSX0ZBTExJTkcpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkcpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEVYVElfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSB0aGUgRVhUSSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEVYVEkgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9FWFRJX0RlSW5pdCh2b2lkKQoreworICAvKiBSaXNpbmcgVHJpZ2dlciBzZWxlY3Rpb24gcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoUlRTUjEsICAweDAwMDAwMDAwVSk7CisgIAorICAvKiBGYWxsaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKEZUU1IxLCAgMHgwMDAwMDAwMFUpOworICAKKyAgLyogU29mdHdhcmUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFNXSUVSMSwgMHgwMDAwMDAwMFUpOworICAKKyAgLyogUGVuZGluZyByZWdpc3RlciBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhQUjEsIEVYVElfUFIxX1BJRl9Nc2spOworCisgIC8qIFJpc2luZyBUcmlnZ2VyIHNlbGVjdGlvbiByZWdpc3RlciAyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFJUU1IyLCAgICAgICAweDAwMDAwMDAwVSk7CisgIAorICAvKiBGYWxsaW5nIFRyaWdnZXIgc2VsZWN0aW9uIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoRlRTUjIsICAgICAgIDB4MDAwMDAwMDBVKTsKKyAgCisgIC8qIFNvZnR3YXJlIGludGVycnVwdCBldmVudCByZWdpc3RlciAyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKFNXSUVSMiwgICAgICAweDAwMDAwMDAwVSk7CisgIAorICAvKiBQZW5kaW5nIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoUFIyLCBFWFRJX1BSMl9QSUZfTXNrKTsKKyAgCisgIC8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyIHNldCB0byBkZWZhdWx0IHJlc2V0IHZhbHVlcyAqLworICBMTF9FWFRJX1dyaXRlUmVnKElNUjEsIDB4MDAwMDAwMDBVKTsKKyAgTExfRVhUSV9Xcml0ZVJlZyhDMklNUjEsIDB4MDAwMDAwMDBVKTsKKyAgCisgIC8qIEV2ZW50IG1hc2sgcmVnaXN0ZXIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoRU1SMSwgMHgwMDAwMDAwMFUpOworICBMTF9FWFRJX1dyaXRlUmVnKEMyRU1SMSwgMHgwMDAwMDAwMFUpOworICAKKyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgMiBzZXQgdG8gZGVmYXVsdCByZXNldCB2YWx1ZXMgKi8KKyAgTExfRVhUSV9Xcml0ZVJlZyhJTVIyLCAweDAwMDAwMDAwVSk7CisgIExMX0VYVElfV3JpdGVSZWcoQzJJTVIyLCAweDAwMDAwMDAwVSk7CisgIAorICAvKiBFdmVudCBtYXNrIHJlZ2lzdGVyIDIgc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWVzICovCisgIExMX0VYVElfV3JpdGVSZWcoRU1SMiwgMHgwMDAwMDAwMFUpOworICBMTF9FWFRJX1dyaXRlUmVnKEMyRU1SMiwgMHgwMDAwMDAwMFUpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEVYVEkgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gRVhUSV9Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgRVhUSV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0VYVElfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBFWFRJIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfRVhUSV9Jbml0KExMX0VYVElfSW5pdFR5cGVEZWYgKkVYVElfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfTElORV8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9FWFRJX0xJTkVfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKSk7CisgIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKEVYVElfSW5pdFN0cnVjdC0+TGluZUNvbW1hbmQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0VYVElfTU9ERShFWFRJX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKworICAvKiBFTkFCTEUgTGluZUNvbW1hbmQgKi8KKyAgaWYgKEVYVElfSW5pdFN0cnVjdC0+TGluZUNvbW1hbmQgIT0gRElTQUJMRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9FWFRJX1RSSUdHRVIoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyKSk7CisKKyAgICAvKiBDb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDAgdG8gMzEgKi8KKyAgICBpZiAoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEgIT0gTExfRVhUSV9MSU5FX05PTkUpCisgICAgeworICAgICAgc3dpdGNoIChFWFRJX0luaXRTdHJ1Y3QtPk1vZGUpCisgICAgICB7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0lUOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRXZlbnQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVFdmVudF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBJVCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0VWRU5UOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0lUX0VWRU5UOgorICAgICAgICAgIC8qIERpcmVjdGx5IEVuYWJsZSBJVCAmIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVJVF8wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlciAhPSBMTF9FWFRJX1RSSUdHRVJfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoIChFWFRJX0luaXRTdHJ1Y3QtPlRyaWdnZXIpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIExMX0VYVElfVFJJR0dFUl9SSVNJTkc6CisgICAgICAgICAgICAvKiBGaXJzdCBEaXNhYmxlIEZhbGxpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9EaXNhYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBSaXNpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVSaXNpbmdUcmlnXzBfMzEoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzBfMzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgUmlzaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICAvKiBUaGVuIEVuYWJsZSBGYWxsaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIExMX0VYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORzoKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18wXzMxKEVYVElfSW5pdFN0cnVjdC0+TGluZV8wXzMxKTsKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDb25maWd1cmUgRVhUSSBMaW5lcyBpbiByYW5nZSBmcm9tIDMyIHRvIDYzICovCisgICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82MyAhPSBMTF9FWFRJX0xJTkVfTk9ORSkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+TW9kZSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBMTF9FWFRJX01PREVfSVQ6CisgICAgICAgICAgLyogRmlyc3QgRGlzYWJsZSBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRGlzYWJsZUV2ZW50XzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgLyogVGhlbiBFbmFibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUlUXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTExfRVhUSV9NT0RFX0VWRU5UOgorICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVJVF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEV2ZW50IG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgTExfRVhUSV9FbmFibGVFdmVudF8zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExMX0VYVElfTU9ERV9JVF9FVkVOVDoKKyAgICAgICAgICAvKiBEaXJlY3RseSBFbmFibGUgSVQgJiBFdmVudCBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgIExMX0VYVElfRW5hYmxlSVRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICBMTF9FWFRJX0VuYWJsZUV2ZW50XzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoRVhUSV9Jbml0U3RydWN0LT5UcmlnZ2VyICE9IExMX0VYVElfVFJJR0dFUl9OT05FKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlcikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgTExfRVhUSV9UUklHR0VSX1JJU0lORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgRmFsbGluZyBUcmlnZ2VyIG9uIHByb3ZpZGVkIExpbmVzICovCisgICAgICAgICAgICBMTF9FWFRJX0Rpc2FibGVGYWxsaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgLyogVGhlbiBFbmFibGUgSVQgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlUmlzaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzoKKyAgICAgICAgICAgIC8qIEZpcnN0IERpc2FibGUgUmlzaW5nIFRyaWdnZXIgb24gcHJvdmlkZWQgTGluZXMgKi8KKyAgICAgICAgICAgIExMX0VYVElfRGlzYWJsZVJpc2luZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIC8qIFRoZW4gRW5hYmxlIEZhbGxpbmcgVHJpZ2dlciBvbiBwcm92aWRlZCBMaW5lcyAqLworICAgICAgICAgICAgTExfRVhUSV9FbmFibGVGYWxsaW5nVHJpZ18zMl82MyhFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMzJfNjMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMTF9FWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkc6CisgICAgICAgICAgICBMTF9FWFRJX0VuYWJsZVJpc2luZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIExMX0VYVElfRW5hYmxlRmFsbGluZ1RyaWdfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIERJU0FCTEUgTGluZUNvbW1hbmQgKi8KKyAgZWxzZQorICB7CisgICAgLyogRGUtY29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAwIHRvIDMxICovCisgICAgTExfRVhUSV9EaXNhYmxlSVRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMF8zMShFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSk7CisgICAgLyogRGUtY29uZmlndXJlIEVYVEkgTGluZXMgaW4gcmFuZ2UgZnJvbSAzMiB0byA2MyAqLworICAgIExMX0VYVElfRGlzYWJsZUlUXzMyXzYzKEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82Myk7CisgICAgTExfRVhUSV9EaXNhYmxlRXZlbnRfMzJfNjMoRVhUSV9Jbml0U3RydWN0LT5MaW5lXzMyXzYzKTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfRVhUSV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgRVhUSV9Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0VYVElfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9FWFRJX1N0cnVjdEluaXQoTExfRVhUSV9Jbml0VHlwZURlZiAqRVhUSV9Jbml0U3RydWN0KQoreworICBFWFRJX0luaXRTdHJ1Y3QtPkxpbmVfMF8zMSAgICAgID0gTExfRVhUSV9MSU5FX05PTkU7CisgIEVYVElfSW5pdFN0cnVjdC0+TGluZV8zMl82MyAgICAgPSBMTF9FWFRJX0xJTkVfTk9ORTsKKyAgRVhUSV9Jbml0U3RydWN0LT5MaW5lQ29tbWFuZCAgICA9IERJU0FCTEU7CisgIEVYVElfSW5pdFN0cnVjdC0+TW9kZSAgICAgICAgICAgPSBMTF9FWFRJX01PREVfSVQ7CisgIEVYVElfSW5pdFN0cnVjdC0+VHJpZ2dlciAgICAgICAgPSBMTF9FWFRJX1RSSUdHRVJfRkFMTElORzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKEVYVEkpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfZ3Bpby5jIGIvU3JjL3N0bTMyd2J4eF9sbF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NTNiNAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfZ3Bpby5jCkBAIC0wLDAgKzEsMjc4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX2dwaW8uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgR1BJTyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfZ3Bpby5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKEdQSU9BKSB8fCBkZWZpbmVkIChHUElPQikgfHwgZGVmaW5lZCAoR1BJT0MpIHx8IGRlZmluZWQgKEdQSU9EKSB8fCBkZWZpbmVkIChHUElPRSkgfHwgZGVmaW5lZCAoR1BJT0gpCisKKy8qKiBAYWRkdG9ncm91cCBHUElPX0xMCisgICogQHsKKyAgKi8KKy8qKiBNSVNSQSBDOjIwMTIgZGV2aWF0aW9uIHJ1bGUgaGFzIGJlZW4gZ3JhbnRlZCBmb3IgZm9sbG93aW5nIHJ1bGVzOgorICAqIFJ1bGUtMTIuMiAtIE1lZGl1bTogUkhTIGFyZ3VtZW50IGlzIGluIGludGVydmFsIFswLElORl0gd2hpY2ggaXMgb3V0IG9mCisgICogcmFuZ2Ugb2YgdGhlIHNoaWZ0IG9wZXJhdG9yIGluIGZvbGxvd2luZyBBUEkgOgorICAqIExMX0dQSU9fSW5pdAorICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEdQSU9fTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9HUElPX1BJTihfX1ZBTFVFX18pICAgICAgICAgICgoKDB4MDB1KSA8IChfX1ZBTFVFX18pKSAmJiAoKF9fVkFMVUVfXykgPD0gKExMX0dQSU9fUElOX0FMTCkpKQorCisjZGVmaW5lIElTX0xMX0dQSU9fTU9ERShfX1ZBTFVFX18pICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX01PREVfSU5QVVQpICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fTU9ERV9PVVRQVVQpICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX01PREVfQU5BTE9HKSkKKworI2RlZmluZSBJU19MTF9HUElPX09VVFBVVF9UWVBFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfR1BJT19PVVRQVVRfUFVTSFBVTEwpICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTikpCisKKyNkZWZpbmUgSVNfTExfR1BJT19TUEVFRChfX1ZBTFVFX18pICAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fU1BFRURfRlJFUV9MT1cpICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19TUEVFRF9GUkVRX01FRElVTSkgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1NQRUVEX0ZSRVFfSElHSCkgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX0dQSU9fUFVMTChfX1ZBTFVFX18pICAgICAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfTk8pICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfVVApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX1BVTExfRE9XTikpCisKKyNkZWZpbmUgSVNfTExfR1BJT19BTFRFUk5BVEUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMCAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzIgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMyAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl80ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzUgICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfNiAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl83ICApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzggICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfOSAgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xMCApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzExICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMTIgKSAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfR1BJT19BRl8xMyApICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9HUElPX0FGXzE0ICkgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0dQSU9fQUZfMTUgKSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgR1BJT19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgR1BJT19MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIEdQSU8gcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgR1BJT3ggR1BJTyBQb3J0CisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEdQSU8gcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6ICAgV3JvbmcgR1BJTyBQb3J0CisgICovCitFcnJvclN0YXR1cyBMTF9HUElPX0RlSW5pdChHUElPX1R5cGVEZWYgKkdQSU94KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOworCisgIC8qIEZvcmNlIGFuZCBSZWxlYXNlIHJlc2V0IG9uIGNsb2NrIG9mIEdQSU94IFBvcnQgKi8KKyAgaWYgKEdQSU94ID09IEdQSU9BKQorICB7CisgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQSk7CisgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9BKTsKKyAgfQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPQikKKyAgeworICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0IpOworICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPQik7CisgIH0KKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0MpCisgIHsKKyAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9DKTsKKyAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0MpOworICB9CisjaWYgZGVmaW5lZChHUElPRCkKKyAgZWxzZSBpZiAoR1BJT3ggPT0gR1BJT0QpCisgIHsKKyAgICBMTF9BSEIyX0dSUDFfRm9yY2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9EKTsKKyAgICBMTF9BSEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0QpOworICB9CisjZW5kaWYgLyogR1BJT0QgKi8KKyNpZiBkZWZpbmVkKEdQSU9FKQorICBlbHNlIGlmIChHUElPeCA9PSBHUElPRSkKKyAgeworICAgIExMX0FIQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjJfR1JQMV9QRVJJUEhfR1BJT0UpOworICAgIExMX0FIQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPRSk7CisgIH0KKyNlbmRpZiAvKiBHUElPRSAqLworI2lmIGRlZmluZWQoR1BJT0gpCisgIGVsc2UgaWYgKEdQSU94ID09IEdQSU9IKQorICB7CisgICAgTExfQUhCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQUhCMl9HUlAxX1BFUklQSF9HUElPSCk7CisgICAgTExfQUhCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIyX0dSUDFfUEVSSVBIX0dQSU9IKTsKKyAgfQorI2VuZGlmIC8qIEdQSU9IICovCisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgR1BJTyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBHUElPX0luaXRTdHJ1Y3QuCisgICogQHBhcmFtICBHUElPeCBHUElPIFBvcnQKKyAgKiBAcGFyYW0gR1BJT19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEdQSU8gcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogR1BJTyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBHUElPX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6ICAgTm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0dQSU9fSW5pdChHUElPX1R5cGVEZWYgKkdQSU94LCBMTF9HUElPX0luaXRUeXBlRGVmICpHUElPX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHBpbnBvczsKKyAgdWludDMyX3QgY3VycmVudHBpbjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BTExfSU5TVEFOQ0UoR1BJT3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fUElOKEdQSU9fSW5pdFN0cnVjdC0+UGluKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX01PREUoR1BJT19Jbml0U3RydWN0LT5Nb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX1BVTEwoR1BJT19Jbml0U3RydWN0LT5QdWxsKSk7CisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAtLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIEluaXRpYWxpemUgIHBpbnBvcyBvbiBmaXJzdCBwaW4gc2V0ICovCisgIHBpbnBvcyA9IFBPU0lUSU9OX1ZBTChHUElPX0luaXRTdHJ1Y3QtPlBpbik7CisKKyAgLyogQ29uZmlndXJlIHRoZSBwb3J0IHBpbnMgKi8KKyAgd2hpbGUgKCgoR1BJT19Jbml0U3RydWN0LT5QaW4pID4+IHBpbnBvcykgIT0gMHgwMHUpCisgIHsKKyAgICAvKiBHZXQgY3VycmVudCBpbyBwb3NpdGlvbiAqLworICAgIGN1cnJlbnRwaW4gPSAoR1BJT19Jbml0U3RydWN0LT5QaW4pICYgKDB4MDAwMDAwMDF1TCA8PCBwaW5wb3MpOworCisgICAgaWYgKGN1cnJlbnRwaW4gIT0gMHgwMHUpCisgICAgeworICAgICAgLyogUGluIE1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTExfR1BJT19TZXRQaW5Nb2RlKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPk1vZGUpOworCisgICAgICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayBTcGVlZCBtb2RlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0dQSU9fU1BFRUQoR1BJT19Jbml0U3RydWN0LT5TcGVlZCkpOworCisgICAgICAgIC8qIFNwZWVkIG1vZGUgY29uZmlndXJhdGlvbiAqLworICAgICAgICBMTF9HUElPX1NldFBpblNwZWVkKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPlNwZWVkKTsKKyAgICAgIH0KKworICAgICAgLyogUHVsbC11cCBQdWxsIGRvd24gcmVzaXN0b3IgY29uZmlndXJhdGlvbiovCisgICAgICBMTF9HUElPX1NldFBpblB1bGwoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCk7CisKKyAgICAgIGlmIChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgQWx0ZXJuYXRlIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfR1BJT19BTFRFUk5BVEUoR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUpKTsKKworICAgICAgICAvKiBTcGVlZCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgaWYgKFBPU0lUSU9OX1ZBTChjdXJyZW50cGluKSA8IDB4MDAwMDAwMDh1TCkKKyAgICAgICAgeworICAgICAgICAgIExMX0dQSU9fU2V0QUZQaW5fMF83KEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1KEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcGlucG9zKys7CisgIH0KKworICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQorICB7CisgICAgLyogQ2hlY2sgT3V0cHV0IG1vZGUgcGFyYW1ldGVycyAqLworICAgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX09VVFBVVF9UWVBFKEdQSU9fSW5pdFN0cnVjdC0+T3V0cHV0VHlwZSkpOworCisgICAgLyogT3V0cHV0IG1vZGUgY29uZmlndXJhdGlvbiovCisgICAgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKEdQSU94LCBHUElPX0luaXRTdHJ1Y3QtPlBpbiwgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlKTsKKworICB9CisgIHJldHVybiAoU1VDQ0VTUyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gR1BJT19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0dQSU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9HUElPX1N0cnVjdEluaXQoTExfR1BJT19Jbml0VHlwZURlZiAqR1BJT19Jbml0U3RydWN0KQoreworICAvKiBSZXNldCBHUElPIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovCisgIEdQSU9fSW5pdFN0cnVjdC0+UGluICAgICAgICA9IExMX0dQSU9fUElOX0FMTDsKKyAgR1BJT19Jbml0U3RydWN0LT5Nb2RlICAgICAgID0gTExfR1BJT19NT0RFX0FOQUxPRzsKKyAgR1BJT19Jbml0U3RydWN0LT5TcGVlZCAgICAgID0gTExfR1BJT19TUEVFRF9GUkVRX0xPVzsKKyAgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlID0gTExfR1BJT19PVVRQVVRfUFVTSFBVTEw7CisgIEdQSU9fSW5pdFN0cnVjdC0+UHVsbCAgICAgICA9IExMX0dQSU9fUFVMTF9OTzsKKyAgR1BJT19Jbml0U3RydWN0LT5BbHRlcm5hdGUgID0gTExfR1BJT19BRl8wOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoR1BJT0EpIHx8IGRlZmluZWQgKEdQSU9CKSB8fCBkZWZpbmVkIChHUElPQykgfHwgZGVmaW5lZCAoR1BJT0QpIHx8IGRlZmluZWQgKEdQSU9FKSB8fCBkZWZpbmVkIChHUElPSCkgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2xsX2kyYy5jIGIvU3JjL3N0bTMyd2J4eF9sbF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA0ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9sbF9pMmMuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9pMmMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSTJDIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfaTJjLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSTJDMSkgfHwgZGVmaW5lZCAoSTJDMykKKworLyoqIEBkZWZncm91cCBJMkNfTEwgSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBJMkNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0kyQ19QRVJJUEhFUkFMX01PREUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX0kyQykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9JMkNfTU9ERV9TTUJVU19IT1NUKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX01PREVfU01CVVNfREVWSUNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlApKQorCisjZGVmaW5lIElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfSTJDX0RJR0lUQUxfRklMVEVSKF9fVkFMVUVfXykgICAgICgoX19WQUxVRV9fKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19MTF9JMkNfT1dOX0FERFJFU1MxKF9fVkFMVUVfXykgICAgICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwMDAzRkZVKQorCisjZGVmaW5lIElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19BQ0spIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfSTJDX05BQ0spKQorCisjZGVmaW5lIElTX0xMX0kyQ19PV05fQUREUlNJWkUoX19WQUxVRV9fKSAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0kyQ19PV05BRERSRVNTMV8xMEJJVCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEkyQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgSTJDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEkyQyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBJMkN4IEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogSTJDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBJMkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0kyQ19EZUluaXQoSTJDX1R5cGVEZWYgKkkyQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICBpZiAoSTJDeCA9PSBJMkMxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0kyQzEpOworICB9CisgIGVsc2UgaWYgKEkyQ3ggPT0gSTJDMykKKyAgeworICAgIC8qIEZvcmNlIHJlc2V0IG9mIEkyQyBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfSTJDMyk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIEkyQyBjbG9jayAqLworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9JMkMzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSTJDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIEkyQ19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgSTJDeCBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBJMkMgcmVnaXN0ZXJzIGFyZSBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9JMkNfSW5pdChJMkNfVHlwZURlZiAqSTJDeCwgTExfSTJDX0luaXRUeXBlRGVmICpJMkNfSW5pdFN0cnVjdCkKK3sKKyAgLyogQ2hlY2sgdGhlIEkyQyBJbnN0YW5jZSBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX0lOU1RBTkNFKEkyQ3gpKTsKKworICAvKiBDaGVjayB0aGUgSTJDIHBhcmFtZXRlcnMgZnJvbSBJMkNfSW5pdFN0cnVjdCAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX1BFUklQSEVSQUxfTU9ERShJMkNfSW5pdFN0cnVjdC0+UGVyaXBoZXJhbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19BTkFMT0dfRklMVEVSKEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19ESUdJVEFMX0ZJTFRFUihJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19UWVBFX0FDS05PV0xFREdFKEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0kyQ19PV05fQUREUlNJWkUoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJTaXplKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDeCBQZXJpcGhlcmFsICovCisgIExMX0kyQ19EaXNhYmxlKEkyQ3gpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIGFuYWxvZyBhbmQgZGlnaXRhbCBub2lzZSBmaWx0ZXJzIHdpdGggcGFyYW1ldGVycyA6CisgICAqIC0gQW5hbG9nRmlsdGVyOiBJMkNfQ1IxX0FORk9GRiBiaXQKKyAgICogLSBEaWdpdGFsRmlsdGVyOiBJMkNfQ1IxX0RORlszOjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19Db25maWdGaWx0ZXJzKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5BbmFsb2dGaWx0ZXIsIEkyQ19Jbml0U3RydWN0LT5EaWdpdGFsRmlsdGVyKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBUSU1JTkdSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUaW1pbmc6IEkyQ19USU1JTkdSX1BSRVNDWzM6MF0sIEkyQ19USU1JTkdSX1NDTERFTFszOjBdLCBJMkNfVElNSU5HUl9TREFERUxbMzowXSwKKyAgICogICAgICAgICAgIEkyQ19USU1JTkdSX1NDTEhbNzowXSBhbmQgSTJDX1RJTUlOR1JfU0NMTFs3OjBdIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRUaW1pbmcoSTJDeCwgSTJDX0luaXRTdHJ1Y3QtPlRpbWluZyk7CisKKyAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkN4IFBlcmlwaGVyYWwgKi8KKyAgTExfSTJDX0VuYWJsZShJMkN4KTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogRGlzYWJsZSwgQ29uZmlndXJlIGFuZCBFbmFibGUgSTJDeCBkZXZpY2Ugb3duIGFkZHJlc3MgMSB3aXRoIHBhcmFtZXRlcnMgOgorICAgKiAtIE93bkFkZHJlc3MxOiAgSTJDX09BUjFfT0ExWzk6MF0gYml0cworICAgKiAtIE93bkFkZHJTaXplOiAgSTJDX09BUjFfT0ExTU9ERSBiaXQKKyAgICovCisgIExMX0kyQ19EaXNhYmxlT3duQWRkcmVzczEoSTJDeCk7CisgIExMX0kyQ19TZXRPd25BZGRyZXNzMShJMkN4LCBJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEsIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyU2l6ZSk7CisKKyAgLyogT3duQWRyZXNzMSA9PSAwIGlzIHJlc2VydmVkIGZvciBHZW5lcmFsIENhbGwgYWRkcmVzcyAqLworICBpZiAoSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxICE9IDBVKQorICB7CisgICAgTExfSTJDX0VuYWJsZU93bkFkZHJlc3MxKEkyQ3gpOworICB9CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggTU9ERSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogQ29uZmlndXJlIEkyQ3ggcGVyaXBoZXJhbCBtb2RlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBQZXJpcGhlcmFsTW9kZTogSTJDX0NSMV9TTUJERU4gYW5kIEkyQ19DUjFfU01CSEVOIGJpdHMKKyAgICovCisgIExMX0kyQ19TZXRNb2RlKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbgorICAgKiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlIHdpdGggcGFyYW1ldGVyIDoKKyAgICogLSBUeXBlQWNrbm93bGVkZ2U6IEkyQ19DUjJfTkFDSyBiaXQKKyAgICovCisgIExMX0kyQ19BY2tub3dsZWRnZU5leHREYXRhKEkyQ3gsIEkyQ19Jbml0U3RydWN0LT5UeXBlQWNrbm93bGVkZ2UpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfSTJDX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdCBQb2ludGVyIHRvIGEgQHJlZiBMTF9JMkNfSW5pdFR5cGVEZWYgc3RydWN0dXJlLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9JMkNfU3RydWN0SW5pdChMTF9JMkNfSW5pdFR5cGVEZWYgKkkyQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgSTJDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSAgPSBMTF9JMkNfTU9ERV9JMkM7CisgIEkyQ19Jbml0U3RydWN0LT5UaW1pbmcgICAgICAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPkFuYWxvZ0ZpbHRlciAgICA9IExMX0kyQ19BTkFMT0dGSUxURVJfRU5BQkxFOworICBJMkNfSW5pdFN0cnVjdC0+RGlnaXRhbEZpbHRlciAgID0gMFU7CisgIEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSAgICAgPSAwVTsKKyAgSTJDX0luaXRTdHJ1Y3QtPlR5cGVBY2tub3dsZWRnZSA9IExMX0kyQ19OQUNLOworICBJMkNfSW5pdFN0cnVjdC0+T3duQWRkclNpemUgICAgID0gTExfSTJDX09XTkFERFJFU1MxXzdCSVQ7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBJMkMxIHx8IEkyQzMgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9scHRpbS5jIGIvU3JjL3N0bTMyd2J4eF9sbF9scHRpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Yjk0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX2xwdGltLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfbHB0aW0uYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTFBUSU0gTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9scHRpbS5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfcmNjLmgiCisKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoTFBUSU0xKSB8fCBkZWZpbmVkIChMUFRJTTIpCisKKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTFBUSU1fTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9MUFRJTV9DTE9DS19TT1VSQ0UoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMKSkKKworI2RlZmluZSBJU19MTF9MUFRJTV9DTE9DS19QUkVTQ0FMRVIoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYxKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVY4KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjMyKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVY2NCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMTI4KSkKKworI2RlZmluZSBJU19MTF9MUFRJTV9XQVZFRk9STShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1BXTSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fT1VUUFVUX1dBVkVGT1JNX1NFVE9OQ0UpKQorCisjZGVmaW5lIElTX0xMX0xQVElNX09VVFBVVF9QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFlfSU5WRVJTRSkpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBMUFRJTV9Qcml2YXRlX0Z1bmN0aW9ucyBMUFRJTSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgTFBUSU1fTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgU2V0IExQVElNeCByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzLgorICAqIEBwYXJhbSAgTFBUSU14IExQIFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogaW52YWxpZCBMUFRJTXggaW5zdGFuY2UKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKExQVElNeCkpOworCisgIGlmIChMUFRJTXggPT0gTFBUSU0xKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpOworICAgIExMX0FQQjFfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9MUFRJTTEpOworICB9CisjaWYgZGVmaW5lZChMUFRJTTIpCisgIGVsc2UgaWYgKExQVElNeCA9PSBMUFRJTTIpCisgIHsKKyAgICBMTF9BUEIxX0dSUDJfRm9yY2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMik7CisgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVElNMik7CisgIH0KKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyAgZWxzZQorICB7CisgICAgcmVzdWx0ID0gRVJST1I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIGZpZWxkcyBvZiB0aGUgTFBUSU1fSW5pdFN0cnVjdCBzdHJ1Y3R1cmUgdG8gaXRzIGRlZmF1bHQKKyAgKiAgICAgICAgIHZhbHVlLgorICAqIEBwYXJhbSAgTFBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UgPSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMOworICBMUFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIgICA9IExMX0xQVElNX1BSRVNDQUxFUl9ESVYxOworICBMUFRJTV9Jbml0U3RydWN0LT5XYXZlZm9ybSAgICA9IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV007CisgIExQVElNX0luaXRTdHJ1Y3QtPlBvbGFyaXR5ICAgID0gTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX1JFR1VMQVI7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBMUFRJTXggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAqIEBub3RlIExMX0xQVElNX0luaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGRpc2FibGVkLgorICAqIEBub3RlIExQVElNeCBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0xQVElNX0Rpc2FibGUoKS4KKyAgKiBAcGFyYW0gIExQVElNeCBMUCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgTFBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTFBUSU14IGluc3RhbmNlIGhhcyBiZWVuIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogTFBUSU14IGluc3RhbmNlIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9MUFRJTV9Jbml0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYgKkxQVElNX0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX0NMT0NLX1NPVVJDRShMUFRJTV9Jbml0U3RydWN0LT5DbG9ja1NvdXJjZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKExQVElNX0luaXRTdHJ1Y3QtPlByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fV0FWRUZPUk0oTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0pKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX09VVFBVVF9QT0xBUklUWShMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSkpOworCisgIC8qIFRoZSBMUFRJTXhfQ0ZHUiByZWdpc3RlciBtdXN0IG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGUgTFBUSU0gaXMgZGlzYWJsZWQKKyAgICAgKEVOQUJMRSBiaXQgaXMgcmVzZXQgdG8gMCkuCisgICovCisgIGlmIChMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU14KSA9PSAxVUwpCisgIHsKKyAgICByZXN1bHQgPSBFUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgQ0tTRUwgYml0ZmllbGQgYWNjb3JkaW5nIHRvIENsb2NrU291cmNlIHZhbHVlICovCisgICAgLyogU2V0IFBSRVNDIGJpdGZpZWxkIGFjY29yZGluZyB0byBQcmVzY2FsZXIgdmFsdWUgKi8KKyAgICAvKiBTZXQgV0FWRSBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gV2F2ZWZvcm0gdmFsdWUgKi8KKyAgICAvKiBTZXQgV0FWRVBPTCBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gUG9sYXJpdHkgdmFsdWUgKi8KKyAgICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX0NLU0VMIHwgTFBUSU1fQ0ZHUl9QUkVTQyB8IExQVElNX0NGR1JfV0FWRSB8IExQVElNX0NGR1JfV0FWUE9MKSwKKyAgICAgICAgICAgICAgIExQVElNX0luaXRTdHJ1Y3QtPkNsb2NrU291cmNlIHwgXAorICAgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyIHwgXAorICAgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0gfCBcCisgICAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIExQVElNIGluc3RhbmNlCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU5BQkxFICAgICAgICBMTF9MUFRJTV9EaXNhYmxlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0xQVElNX0Rpc2FibGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBMTF9SQ0NfQ2xvY2tzVHlwZURlZiByY2NfY2xvY2s7CisgIHVpbnQzMl90IHRtcGNsa3NvdXJjZSA9IDA7CisgIHVpbnQzMl90IHRtcElFUjsKKyAgdWludDMyX3QgdG1wQ0ZHUjsKKyAgdWludDMyX3QgdG1wQ01QOworICB1aW50MzJfdCB0bXBBUlI7CisgIHVpbnQzMl90IHRtcE9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsKKworICBfX2Rpc2FibGVfaXJxKCk7CisKKyAgLyoqKioqKioqKiogU2F2ZSBMUFRJTSBDb25maWcgKioqKioqKioqLworICAvKiBTYXZlIExQVElNIHNvdXJjZSBjbG9jayAqLworICBzd2l0Y2ggKCh1aW50MzJfdClMUFRJTXgpCisgIHsKKyAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICB0bXBjbGtzb3VyY2UgPSBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSk7CisgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChMUFRJTTIpCisgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgdG1wY2xrc291cmNlID0gTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTExfUkNDX0xQVElNMl9DTEtTT1VSQ0UpOworICAgICAgIGJyZWFrOworI2VuZGlmIC8qIExQVElNMiAqLworICAgICBkZWZhdWx0OgorICAgICAgIGJyZWFrOworICB9CisKKyAgLyogU2F2ZSBMUFRJTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworICB0bXBJRVIgPSBMUFRJTXgtPklFUjsKKyAgdG1wQ0ZHUiA9IExQVElNeC0+Q0ZHUjsKKyAgdG1wQ01QID0gTFBUSU14LT5DTVA7CisgIHRtcEFSUiA9IExQVElNeC0+QVJSOworICB0bXBPUiA9IExQVElNeC0+T1I7CisKKyAgLyoqKioqKioqKioqKiogUmVzZXQgTFBUSU0gKioqKioqKioqKioqLworICAodm9pZClMTF9MUFRJTV9EZUluaXQoTFBUSU14KTsKKworICAvKioqKioqKioqIFJlc3RvcmUgTFBUSU0gQ29uZmlnICoqKioqKiovCisgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKCZyY2NfY2xvY2spOworCisgIGlmICgodG1wQ01QICE9IDBVTCkgfHwgKHRtcEFSUiAhPSAwVUwpKQorICB7CisgICAgLyogRm9yY2UgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayBmcm9tIEFQQiAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KUxQVElNeCkKKyAgICB7CisgICAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICAgIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlKExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxKTsKKyAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoTFBUSU0yKQorICAgICAgIGNhc2UgTFBUSU0yX0JBU0U6CisgICAgICAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9QQ0xLMSk7CisgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBMUFRJTTIgKi8KKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRtcENNUCAhPSAwVUwpCisgICAgeworICAgICAgLyogUmVzdG9yZSBDTVAgYW5kIEFSUiByZWdpc3RlcnMgKExQVElNIHNob3VsZCBiZSBlbmFibGVkIGZpcnN0KSAqLworICAgICAgTFBUSU14LT5DUiB8PSBMUFRJTV9DUl9FTkFCTEU7CisgICAgICBMUFRJTXgtPkNNUCA9IHRtcENNUDsKKworICAgICAgLyogUG9sbGluZyBvbiBDTVAgd3JpdGUgb2sgc3RhdHVzIGFmdGVyIGFib3ZlIHJlc3RvcmUgb3BlcmF0aW9uICovCisgICAgICBkbworICAgICAgeworICAgICAgICByY2NfY2xvY2suU1lTQ0xLX0ZyZXF1ZW5jeS0tOyAvKiBVc2VkIGZvciB0aW1lb3V0ICovCisgICAgICB9IHdoaWxlICgoKExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBPSyhMUFRJTXgpICE9IDFVTCkpICYmICgocmNjX2Nsb2NrLlNZU0NMS19GcmVxdWVuY3kpID4gMFVMKSk7CisKKyAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19DTVBPSyhMUFRJTXgpOworICAgIH0KKworICAgIGlmICh0bXBBUlIgIT0gMFVMKQorICAgIHsKKyAgICAgIExQVElNeC0+Q1IgfD0gTFBUSU1fQ1JfRU5BQkxFOworICAgICAgTFBUSU14LT5BUlIgPSB0bXBBUlI7CisKKyAgICAgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKCZyY2NfY2xvY2spOworICAgICAgLyogUG9sbGluZyBvbiBBUlIgd3JpdGUgb2sgc3RhdHVzIGFmdGVyIGFib3ZlIHJlc3RvcmUgb3BlcmF0aW9uICovCisgICAgICBkbworICAgICAgeworICAgICAgICByY2NfY2xvY2suU1lTQ0xLX0ZyZXF1ZW5jeS0tOyAvKiBVc2VkIGZvciB0aW1lb3V0ICovCisgICAgICB9IHdoaWxlICgoKExMX0xQVElNX0lzQWN0aXZlRmxhZ19BUlJPSyhMUFRJTXgpICE9IDFVTCkpICYmICgocmNjX2Nsb2NrLlNZU0NMS19GcmVxdWVuY3kpID4gMFVMKSk7CisKKyAgICAgIExMX0xQVElNX0NsZWFyRmxhZ19BUlJPSyhMUFRJTXgpOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayAqLworICAgIExMX1JDQ19TZXRMUFRJTUNsb2NrU291cmNlKHRtcGNsa3NvdXJjZSk7CisgIH0KKworICAvKiBSZXN0b3JlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChMUFRJTSBzaG91bGQgYmUgZGlzYWJsZWQgZmlyc3QpICovCisgIExQVElNeC0+Q1IgJj0gfihMUFRJTV9DUl9FTkFCTEUpOworICBMUFRJTXgtPklFUiA9IHRtcElFUjsKKyAgTFBUSU14LT5DRkdSID0gdG1wQ0ZHUjsKKyAgTFBUSU14LT5PUiA9IHRtcE9SOworCisgIF9fZW5hYmxlX2lycSgpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogTFBUSU0xIHx8IExQVElNMiAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2xsX2xwdWFydC5jIGIvU3JjL3N0bTMyd2J4eF9sbF9scHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYyNWVlCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9sbF9scHVhcnQuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9scHVhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgTFBVQVJUIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKKyAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKworLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMndieHhfbGxfbHB1YXJ0LmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKExQVUFSVDEpCisKKy8qKiBAYWRkdG9ncm91cCBMUFVBUlRfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTFBVQVJUX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIExQVUFSVF9MTF9Qcml2YXRlX01hY3JvcworICAqIEB7CisgICovCisKKy8qIENoZWNrIG9mIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgTFBVQVJUIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX1BSRVNDQUxFUihfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVY0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxMCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjEyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYzMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUFJFU0NBTEVSX0RJVjY0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMTI4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QUkVTQ0FMRVJfRElWMjU2KSkKKworLyogX19CQVVEUkFURV9fIERlcGVuZGluZyBvbiBjb25zdHJhaW50cyBhcHBsaWNhYmxlIGZvciBMUFVBUlQgQlJSIHJlZ2lzdGVyICAgKi8KKy8qICAgICAgICAgICAgICB2YWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAtIGZjayBtdXN0IGJlIGluIHRoZSByYW5nZSBbMyB4IGJhdWRyYXRlLCA0MDk2IHggYmF1ZHJhdGVdICAqLworLyogICAgICAgICAgICAgICAgLSBMUFVBUlRfQlJSIHJlZ2lzdGVyIHZhbHVlIHNob3VsZCBiZSA+PSAweDMwMCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgIC0gTFBVQVJUX0JSUiByZWdpc3RlciB2YWx1ZSBzaG91bGQgYmUgPD0gMHhGRkZGRiAoMjAgYml0cykgICovCisvKiAgICAgICAgICAgICAgQmF1ZHJhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHNob3VsZCBiZWxvbmcgdG8gWzgsIDIxMzAwMDAwXS4qLworI2RlZmluZSBJU19MTF9MUFVBUlRfQkFVRFJBVEUoX19CQVVEUkFURV9fKSAoKChfX0JBVURSQVRFX18pIDw9IDIxMzAwMDAwVSkgJiYgKChfX0JBVURSQVRFX18pID49IDhVKSkKKworLyogX19WQUxVRV9fIEJSUiBjb250ZW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDB4MzAwLiAqLworI2RlZmluZSBJU19MTF9MUFVBUlRfQlJSX01JTihfX1ZBTFVFX18pICAgKChfX1ZBTFVFX18pID49IDB4MzAwVSkKKworLyogX19WQUxVRV9fIEJSUiBjb250ZW50IG11c3QgYmUgbG93ZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkZGLiAqLworI2RlZmluZSBJU19MTF9MUFVBUlRfQlJSX01BWChfX1ZBTFVFX18pICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwRkZGRkZVKQorCisjZGVmaW5lIElTX0xMX0xQVUFSVF9ESVJFQ1RJT04oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9ESVJFQ1RJT05fTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfRElSRUNUSU9OX1JYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9ESVJFQ1RJT05fVFgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RJUkVDVElPTl9UWF9SWCkpCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX1BBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1BBUklUWV9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9QQVJJVFlfRVZFTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfUEFSSVRZX09ERCkpCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX0RBVEFXSURUSChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0RBVEFXSURUSF83QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfREFUQVdJRFRIXzhCKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9EQVRBV0lEVEhfOUIpKQorCisjZGVmaW5lIElTX0xMX0xQVUFSVF9TVE9QQklUUyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX1NUT1BCSVRTXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfU1RPUEJJVFNfMikpCisKKyNkZWZpbmUgSVNfTExfTFBVQVJUX0hXQ09OVFJPTChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0hXQ09OVFJPTF9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBVQVJUX0hXQ09OVFJPTF9SVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFVBUlRfSFdDT05UUk9MX0NUUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVUFSVF9IV0NPTlRST0xfUlRTX0NUUykpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgTFBVQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBMUFVBUlRfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBMUFVBUlQgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgTFBVQVJUeCBMUFVBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTFBVQVJUIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfTFBVQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFVBUlRfSU5TVEFOQ0UoTFBVQVJUeCkpOworCisgIGlmIChMUFVBUlR4ID09IExQVUFSVDEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBMUFVBUlQgcGVyaXBoZXJhbCAqLworICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBVQVJUMSk7CisKKyAgICAvKiBSZWxlYXNlIHJlc2V0IG9mIExQVUFSVCBwZXJpcGhlcmFsICovCisgICAgTExfQVBCMV9HUlAyX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDJfUEVSSVBIX0xQVUFSVDEpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemUgTFBVQVJUIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiBMUFVBUlRfSW5pdFN0cnVjdC4KKyAgKiBAbm90ZSAgIEFzIHNvbWUgYml0cyBpbiBMUFVBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBMUFVBUlQgaXMgZGlzYWJsZWQgKFVTQVJUX0NSMV9VRSBiaXQgPTApLAorICAqICAgICAgICAgTFBVQVJUIFBlcmlwaGVyYWwgc2hvdWxkIGJlIGluIGRpc2FibGVkIHN0YXRlIHByaW9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBFUlJPUiByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIEJhdWQgcmF0ZSB2YWx1ZSBzdG9yZWQgaW4gTFBVQVJUX0luaXRTdHJ1Y3QgQmF1ZFJhdGUgZmllbGQsIHNob3VsZCBiZSB2YWxpZCAoZGlmZmVyZW50IGZyb20gMCkuCisgICogQHBhcmFtICBMUFVBUlR4IExQVUFSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgTFBVQVJUX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfTFBVQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBMUFVBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTFBVQVJUIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0IGNvbnRlbnQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBQcm9ibGVtIG9jY3VycmVkIGR1cmluZyBMUFVBUlQgUmVnaXN0ZXJzIGluaXRpYWxpemF0aW9uCisgICovCitFcnJvclN0YXR1cyBMTF9MUFVBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpMUFVBUlR4LCBMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKyAgdWludDMyX3QgcGVyaXBoY2xrOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19MUFVBUlRfSU5TVEFOQ0UoTFBVQVJUeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX1BSRVNDQUxFUihMUFVBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9CQVVEUkFURShMUFVBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9EQVRBV0lEVEgoTFBVQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX1NUT1BCSVRTKExQVUFSVF9Jbml0U3RydWN0LT5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX1BBUklUWShMUFVBUlRfSW5pdFN0cnVjdC0+UGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfRElSRUNUSU9OKExQVUFSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfTFBVQVJUX0hXQ09OVFJPTChMUFVBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCkpOworCisgIC8qIExQVUFSVCBuZWVkcyB0byBiZSBpbiBkaXNhYmxlZCBzdGF0ZSwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjb25maWd1cmUgc29tZSBiaXRzIGluCisgICAgIENSeCByZWdpc3RlcnMuIE90aGVyd2lzZSAoTFBVQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSkgPT4gcmV0dXJuIEVSUk9SICovCisgIGlmIChMTF9MUFVBUlRfSXNFbmFibGVkKExQVUFSVHgpID09IDBVKQorICB7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBMUFVBUlR4IENSMSAoTFBVQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIFRyYW5zZmVyIERpcmVjdGlvbiBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBEYXRhV2lkdGg6ICAgICAgICAgIFVTQVJUX0NSMV9NIGJpdHMgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggdmFsdWUKKyAgICAgKiAtIFBhcml0eTogICAgICAgICAgICAgVVNBUlRfQ1IxX1BDRSwgVVNBUlRfQ1IxX1BTIGJpdHMgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0LT5QYXJpdHkgdmFsdWUKKyAgICAgKiAtIFRyYW5zZmVyRGlyZWN0aW9uOiAgVVNBUlRfQ1IxX1RFLCBVU0FSVF9DUjFfUkUgYml0cyBhY2NvcmRpbmcgdG8gTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHZhbHVlCisgICAgICovCisgICAgTU9ESUZZX1JFRyhMUFVBUlR4LT5DUjEsCisgICAgICAgICAgICAgICAoVVNBUlRfQ1IxX00gfCBVU0FSVF9DUjFfUENFIHwgVVNBUlRfQ1IxX1BTIHwgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFKSwKKyAgICAgICAgICAgICAgIChMUFVBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoIHwgTFBVQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSB8IExQVUFSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbikpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExQVUFSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBMUFVBUlR4IENSMiAoU3RvcCBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBTdG9wIEJpdHM6ICAgICAgICAgIFVTQVJUX0NSMl9TVE9QIGJpdHMgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0LT5TdG9wQml0cyB2YWx1ZS4KKyAgICAgKi8KKyAgICBMTF9MUFVBUlRfU2V0U3RvcEJpdHNMZW5ndGgoTFBVQVJUeCwgTFBVQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFVBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgTFBVQVJUeCBDUjMgKEhhcmR3YXJlIEZsb3cgQ29udHJvbCkgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gSGFyZHdhcmVGbG93Q29udHJvbDogVVNBUlRfQ1IzX1JUU0UsIFVTQVJUX0NSM19DVFNFIGJpdHMgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sIHZhbHVlLgorICAgICAqLworICAgIExMX0xQVUFSVF9TZXRIV0Zsb3dDdHJsKExQVUFSVHgsIExQVUFSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFVBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBSZXRyaWV2ZSBDbG9jayBmcmVxdWVuY3kgdXNlZCBmb3IgTFBVQVJUIFBlcmlwaGVyYWwKKyAgICAgKi8KKyAgICBwZXJpcGhjbGsgPSBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRSk7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIExQVUFSVCBCYXVkIFJhdGUgOgorICAgICAgIC0gcHJlc2NhbGVyIHZhbHVlIGlzIHJlcXVpcmVkCisgICAgICAgLSB2YWxpZCBiYXVkIHJhdGUgdmFsdWUgKGRpZmZlcmVudCBmcm9tIDApIGlzIHJlcXVpcmVkCisgICAgICAgLSBQZXJpcGhlcmFsIGNsb2NrIGFzIHJldHVybmVkIGJ5IFJDQyBzZXJ2aWNlLCBzaG91bGQgYmUgdmFsaWQgKGRpZmZlcmVudCBmcm9tIDApLgorICAgICovCisgICAgaWYgKChwZXJpcGhjbGsgIT0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8pCisgICAgICAgICYmIChMUFVBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgIT0gMFUpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgICBMTF9MUFVBUlRfU2V0QmF1ZFJhdGUoTFBVQVJUeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhjbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVQVJUX0luaXRTdHJ1Y3QtPlByZXNjYWxlclZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVUFSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSk7CisKKyAgICAgIC8qIENoZWNrIEJSUiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMHgzMDAgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9MUFVBUlRfQlJSX01JTihMUFVBUlR4LT5CUlIpKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gMHhGRkZGRiAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVUFSVF9CUlJfTUFYKExQVUFSVHgtPkJSUikpOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMUFVBUlQgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBMUFVBUlR4IFBSRVNDIChQcmVzY2FsZXIpIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIFByZXNjYWxlclZhbHVlOiBMUFVBUlRfUFJFU0NfUFJFU0NBTEVSIGJpdHMgYWNjb3JkaW5nIHRvIExQVUFSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBMTF9MUFVBUlRfU2V0UHJlc2NhbGVyKExQVUFSVHgsIExQVUFSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSk7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBAcmVmIExMX0xQVUFSVF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBMUFVBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFVBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9MUFVBUlRfU3RydWN0SW5pdChMTF9MUFVBUlRfSW5pdFR5cGVEZWYgKkxQVUFSVF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgTFBVQVJUX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIExQVUFSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSAgICAgID0gTExfTFBVQVJUX1BSRVNDQUxFUl9ESVYxOworICBMUFVBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgICA9IDk2MDBVOworICBMUFVBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoICAgICAgICAgICA9IExMX0xQVUFSVF9EQVRBV0lEVEhfOEI7CisgIExQVUFSVF9Jbml0U3RydWN0LT5TdG9wQml0cyAgICAgICAgICAgID0gTExfTFBVQVJUX1NUT1BCSVRTXzE7CisgIExQVUFSVF9Jbml0U3RydWN0LT5QYXJpdHkgICAgICAgICAgICAgID0gTExfTFBVQVJUX1BBUklUWV9OT05FIDsKKyAgTFBVQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uICAgPSBMTF9MUFVBUlRfRElSRUNUSU9OX1RYX1JYOworICBMUFVBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCA9IExMX0xQVUFSVF9IV0NPTlRST0xfTk9ORTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKExQVUFSVDEpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KKwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9wa2EuYyBiL1NyYy9zdG0zMndieHhfbGxfcGthLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMDRhZAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfcGthLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfcGthLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFBLQSBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3BrYS5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQS0EpCisKKy8qKiBAYWRkdG9ncm91cCBQS0FfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBQS0FfTExfUHJpdmF0ZV9NYWNyb3MgUEtBIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfUEtBX01PREUoX19WQUxVRV9fKSAgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9NT05UR09NRVJZX1BBUkFNX01PRF9FWFApIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfTU9OVEdPTUVSWV9QQVJBTSkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9NT0RVTEFSX0VYUCkgICAgICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1BLQV9NT0RFX01PTlRHT01FUllfUEFSQU1fRUNDKSAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfRUNDX0tQX1BSSU1JVElWRSkgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9FQ0RTQV9TSUdOQVRVUkUpICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1BLQV9NT0RFX0VDRFNBX1ZFUklGSUNBVElPTikgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfUE9JTlRfQ0hFQ0spICAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9SU0FfQ1JUX0VYUCkgICAgICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1BLQV9NT0RFX01PRFVMQVJfSU5WKSAgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfQVJJVEhNRVRJQ19BREQpICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9BUklUSE1FVElDX1NVQikgICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1BLQV9NT0RFX0FSSVRITUVUSUNfTVVMKSAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfQ09NUEFSSVNPTikgICAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9NT0RVTEFSX1JFRFVDKSAgICAgICAgICAgICB8fFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX1BLQV9NT0RFX01PRFVMQVJfQUREKSAgICAgICAgICAgICAgIHx8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfUEtBX01PREVfTU9EVUxBUl9TVUIpICAgICAgICAgICAgICAgfHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9QS0FfTU9ERV9NT05UR09NRVJZX01VTCkpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUEtBX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQS0FfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSBQS0EgcmVnaXN0ZXJzIChSZWdpc3RlcnMgcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMpLgorICAqIEBwYXJhbSAgUEtBeCBQS0EgSW5zdGFuY2UuCisgICogQHJldHZhbCBFcnJvclN0YXR1cworICAqICAgICAgICAgIC0gU1VDQ0VTUzogUEtBIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBQS0EgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1BLQV9EZUluaXQoUEtBX1R5cGVEZWYgKlBLQXgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1BLQV9BTExfSU5TVEFOQ0UoUEtBeCkpOworCisgIGlmIChQS0F4ID09IFBLQSkKKyAgeworICAgIC8qIEZvcmNlIFBLQSByZXNldCAqLworICAgIExMX0FIQjNfR1JQMV9Gb3JjZVJlc2V0KExMX0FIQjNfR1JQMV9QRVJJUEhfUEtBKTsKKworICAgIC8qIFJlbGVhc2UgUEtBIHJlc2V0ICovCisgICAgTExfQUhCM19HUlAxX1JlbGVhc2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX1BLQSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBQS0EgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gUEtBX0luaXRTdHJ1Y3QuCisgICogQHBhcmFtICBQS0F4IFBLQSBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFBLQV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1BLQV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgUEtBIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBFcnJvclN0YXR1cworICAqICAgICAgICAgIC0gU1VDQ0VTUzogUEtBIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIFBLQV9Jbml0U3RydWN0IGNvbnRlbnQKKyAgKiAgICAgICAgICAtIEVSUk9SOiAgIE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9QS0FfSW5pdChQS0FfVHlwZURlZiAqUEtBeCwgTExfUEtBX0luaXRUeXBlRGVmICpQS0FfSW5pdFN0cnVjdCkKK3sKKyAgYXNzZXJ0X3BhcmFtKElTX1BLQV9BTExfSU5TVEFOQ0UoUEtBeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUEtBX01PREUoUEtBX0luaXRTdHJ1Y3QtPk1vZGUpKTsKKworICBMTF9QS0FfQ29uZmlnKFBLQXgsIFBLQV9Jbml0U3RydWN0LT5Nb2RlKTsKKworICByZXR1cm4gKFNVQ0NFU1MpOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9QS0FfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gUEtBX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUEtBX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBmaWVsZHMgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisKK3ZvaWQgTExfUEtBX1N0cnVjdEluaXQoTExfUEtBX0luaXRUeXBlRGVmICpQS0FfSW5pdFN0cnVjdCkKK3sKKyAgLyogUmVzZXQgUEtBIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzICovCisgIFBLQV9Jbml0U3RydWN0LT5Nb2RlICAgICAgID0gTExfUEtBX01PREVfTU9OVEdPTUVSWV9QQVJBTV9NT0RfRVhQOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoUEtBKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfcHdyLmMgYi9TcmMvc3RtMzJ3Ynh4X2xsX3B3ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDNhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX3B3ci5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3B3ci5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBQV1IgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3B3ci5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZChQV1IpCisKKy8qKiBAZGVmZ3JvdXAgUFdSX0xMIFBXUgorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqIEBkZWZncm91cCBQV1JfTExfUHJpdmF0ZV9Db25zdGFudHMgUFdSIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKy8qIERlZmluaXRpb25zIG9mIFBXUiByZWdpc3RlcnMgcmVzZXQgdmFsdWUgKi8KKyNkZWZpbmUgUFdSX0NSMV9SRVNFVF9WQUxVRSAgICgweDAwMDAwMjAwKQorI2RlZmluZSBQV1JfQ1IyX1JFU0VUX1ZBTFVFICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFBXUl9DUjNfUkVTRVRfVkFMVUUgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgUFdSX0NSNF9SRVNFVF9WQUxVRSAgICgweDAwMDAwMDAwKQorI2RlZmluZSBQV1JfQ1I1X1JFU0VUX1ZBTFVFICAgKDB4MDAwMDQyNzIpCisjZGVmaW5lIFBXUl9QVUNSQV9SRVNFVF9WQUxVRSAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUFdSX1BEQ1JBX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwKQorI2RlZmluZSBQV1JfUFVDUkJfUkVTRVRfVkFMVUUgKDB4MDAwMDAwMDApCisjZGVmaW5lIFBXUl9QRENSQl9SRVNFVF9WQUxVRSAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUFdSX1BVQ1JDX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwKQorI2RlZmluZSBQV1JfUERDUkNfUkVTRVRfVkFMVUUgKDB4MDAwMDAwMDApCisjZGVmaW5lIFBXUl9QVUNSRF9SRVNFVF9WQUxVRSAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUFdSX1BEQ1JEX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwKQorI2RlZmluZSBQV1JfUFVDUkVfUkVTRVRfVkFMVUUgKDB4MDAwMDAwMDApCisjZGVmaW5lIFBXUl9QRENSRV9SRVNFVF9WQUxVRSAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUFdSX1BVQ1JIX1JFU0VUX1ZBTFVFICgweDAwMDAwMDAwKQorI2RlZmluZSBQV1JfUERDUkhfUkVTRVRfVkFMVUUgKDB4MDAwMDAwMDApCisjZGVmaW5lIFBXUl9DMkNSMV9SRVNFVF9WQUxVRSAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUFdSX0MyQ1IzX1JFU0VUX1ZBTFVFICgweDAwMDA4MDAwKQorLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUFdSX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBQV1JfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZSB0aGUgUFdSIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUFdSIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUFdSX0RlSW5pdCh2b2lkKQoreworICAvKiBBcHBseSByZXNldCB2YWx1ZXMgdG8gYWxsIFBXUiByZWdpc3RlcnMgKi8KKyAgTExfUFdSX1dyaXRlUmVnKENSMSwgUFdSX0NSMV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhDUjIsIFBXUl9DUjJfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoQ1IzLCBQV1JfQ1IzX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKENSNCwgUFdSX0NSNF9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhDUjUsIFBXUl9DUjVfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUFVDUkEsIFBXUl9QVUNSQV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQRENSQSwgUFdSX1BEQ1JBX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBVQ1JCLCBQV1JfUFVDUkJfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUERDUkIsIFBXUl9QRENSQl9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQVUNSQywgUFdSX1BVQ1JDX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBEQ1JDLCBQV1JfUERDUkNfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUFVDUkQsIFBXUl9QVUNSRF9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQRENSRCwgUFdSX1BEQ1JEX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBVQ1JFLCBQV1JfUFVDUkVfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoUERDUkUsIFBXUl9QRENSRV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhQVUNSSCwgUFdSX1BVQ1JIX1JFU0VUX1ZBTFVFKTsKKyAgTExfUFdSX1dyaXRlUmVnKFBEQ1JILCBQV1JfUERDUkhfUkVTRVRfVkFMVUUpOworICBMTF9QV1JfV3JpdGVSZWcoQzJDUjEsIFBXUl9DMkNSMV9SRVNFVF9WQUxVRSk7CisgIExMX1BXUl9Xcml0ZVJlZyhDMkNSMywgUFdSX0MyQ1IzX1JFU0VUX1ZBTFVFKTsKKyAgCisgIC8qIENsZWFyIGFsbCBmbGFncyAqLworICBMTF9QV1JfV3JpdGVSZWcoU0NSLAorICAgICAgICAgICAgICAgICAgICBMTF9QV1JfU0NSX0NDMkhGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQzgwMkFGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQ0JMRUFGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQ0NSUEVGCisgICAgICAgICAgICAgICAgICB8IExMX1BXUl9TQ1JfQzgwMldVRgorICAgICAgICAgICAgICAgICAgfCBMTF9QV1JfU0NSX0NCTEVXVUYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX1NDUl9DQk9SSEYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX1NDUl9DU01QU0ZCRgorICAgICAgICAgICAgICAgICAgfCBMTF9QV1JfU0NSX0NXVUYKKyAgICAgICAgICAgICAgICAgKTsKKyAgCisgIExMX1BXUl9Xcml0ZVJlZyhFWFRTQ1IsCisgICAgICAgICAgICAgICAgICAgIExMX1BXUl9FWFRTQ1JfQ0NSUEYKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX0VYVFNDUl9DMkNTU0YKKyAgICAgICAgICAgICAgICAgIHwgTExfUFdSX0VYVFNDUl9DMUNTU0YKKyAgICAgICAgICAgICAgICAgKTsKKyAgCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQoUFdSKSAqLworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9yY2MuYyBiL1NyYy9zdG0zMndieHhfbGxfcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiZjBhNgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfcmNjLmMKQEAgLTAsMCArMSwxMjk2IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3JjYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBSQ0MgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3JjYy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQoUkNDKQorCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9SQ0NfVVNBUlRfQ0xLU09VUkNFKF9fVkFMVUVfXykgICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0UpKQorCisjZGVmaW5lIElTX0xMX1JDQ19MUFVBUlRfQ0xLU09VUkNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0UpKQorCisjZGVmaW5lIElTX0xMX1JDQ19JMkNfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19JMkMzX0NMS1NPVVJDRSkpCisKKyNkZWZpbmUgSVNfTExfUkNDX0xQVElNX0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRSkpCisKKyNkZWZpbmUgSVNfTExfUkNDX1NBSV9DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NBSTFfQ0xLU09VUkNFKQorCisjZGVmaW5lIElTX0xMX1JDQ19STkdfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfUk5HX0NMS1NPVVJDRSkpCisKKyNkZWZpbmUgSVNfTExfUkNDX0NMSzQ4X0NMS1NPVVJDRShfX1ZBTFVFX18pICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19DTEs0OF9DTEtTT1VSQ0UpKQorCisjZGVmaW5lIElTX0xMX1JDQ19VU0JfQ0xLU09VUkNFKF9fVkFMVUVfXykgICAgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfVVNCX0NMS1NPVVJDRSkpCisKKyNkZWZpbmUgSVNfTExfUkNDX0FEQ19DTEtTT1VSQ0UoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BRENfQ0xLU09VUkNFKSkKKworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgUkNDX0xMX1ByaXZhdGVfRnVuY3Rpb25zIFJDQyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fU1lTKHZvaWQpOwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NBSSh2b2lkKTsKK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9BREModm9pZCk7Cit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fNDhNKHZvaWQpOworCit1aW50MzJfdCBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluX1NBSSh2b2lkKTsKK3VpbnQzMl90IFJDQ19QTExTQUkxX0dldEZyZXFEb21haW5fNDhNKHZvaWQpOwordWludDMyX3QgUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9BREModm9pZCk7CisKK3VpbnQzMl90IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEodm9pZCk7CisKKwordWludDMyX3QgUkNDX0dldEhDTEsxQ2xvY2tGcmVxKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX0dldEhDTEsyQ2xvY2tGcmVxKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX0dldEhDTEs0Q2xvY2tGcmVxKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3kpOwordWludDMyX3QgUkNDX0dldEhDTEs1Q2xvY2tGcmVxKHZvaWQpOworCisKK3VpbnQzMl90IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcSh1aW50MzJfdCBIQ0xLX0ZyZXF1ZW5jeSk7Cit1aW50MzJfdCBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEodWludDMyX3QgSENMS19GcmVxdWVuY3kpOworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUkNDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJlc2V0IHRoZSBSQ0MgY2xvY2sgIHRvIHRoZSBkZWZhdWx0IHJlc2V0IHN0YXRlLgorICAqIEBub3RlICAgVGhlIGRlZmF1bHQgcmVzZXQgc3RhdGUgb2YgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYmVsb3c6CisgICogICAgICAgICAtIE1TSSBPTiBhbmQgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgc291cmNlCisgICogICAgICAgICAtIEhTRSwgSFNJLCBIU0k0OCwgUExMIGFuZCBQTExTQUkxIFNvdXJjZSBPRkYKKyAgKiAgICAgICAgIC0gQ1BVMSwgQ1BVMiwgQUhCNCwgQVBCMSBhbmQgQVBCMiBwcmVzY2FsZXIgc2V0IHRvIDEuCisgICogICAgICAgICAtIENTUywgTUNPIE9GRgorICAqICAgICAgICAgLSBBbGwgaW50ZXJydXB0cyBkaXNhYmxlZAorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgKiAgICAgICAgIC0gUGVyaXBoZXJhbCBjbG9ja3MKKyAgKiAgICAgICAgIC0gTFNJLCBMU0UgYW5kIFJUQyBjbG9ja3MKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUkNDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUkNDX0RlSW5pdCh2b2lkKQoreworICB1aW50MzJfdCB2bF9tYXNrOworCisgIC8qIFNldCBNU0lPTiBiaXQgKi8KKyAgTExfUkNDX01TSV9FbmFibGUoKTsKKworICAvKiBJbnN1cmUgTVNJUkRZIGJpdCBpcyBzZXQgYmVmb3JlIHdyaXRpbmcgZGVmYXVsdCBNU0lSQU5HRSB2YWx1ZSAqLworICB3aGlsZSAoTExfUkNDX01TSV9Jc1JlYWR5KCkgPT0gMFUpCisgIHt9CisKKyAgLyogU2V0IE1TSVJBTkdFIGRlZmF1bHQgdmFsdWUgKi8KKyAgTExfUkNDX01TSV9TZXRSYW5nZShMTF9SQ0NfTVNJUkFOR0VfNik7CisKKyAgLyogU2V0IE1TSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWUqLworICBMTF9SQ0NfTVNJX1NldENhbGliVHJpbW1pbmcoMCk7CisKKyAgLyogU2V0IEhTSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWUqLworICBMTF9SQ0NfSFNJX1NldENhbGliVHJpbW1pbmcoMHg0MFUpOworCisgIC8qIFJlc2V0IENGR1IgcmVnaXN0ZXIgKi8KKyAgTExfUkNDX1dyaXRlUmVnKENGR1IsIDB4MDAwNzAwMDBVKTsgLyogTVNJIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBhbmQgYWxsIHByZXNjYWxlciB0byBub3QgZGl2aWRlZCAqLworCisgIC8qIFJlc2V0IENSIHJlZ2lzdGVyICovCisgIHZsX21hc2sgPSAweEZGRkZGRkZGVTsKKyAgLyogUmVzZXQgSFNJT04sIEhTSUtFUk9OLCBIU0lBU0ZTLCBIU0VPTiwgUExMU1lTT04gYml0cyAqLworICBDTEVBUl9CSVQodmxfbWFzaywgKFJDQ19DUl9IU0lPTiB8IFJDQ19DUl9IU0lBU0ZTIHwgUkNDX0NSX0hTSUtFUk9OICB8IFJDQ19DUl9IU0VPTiB8IFJDQ19DUl9IU0VCWVAgfCBSQ0NfQ1JfSFNFUFJFIHwgUkNDX0NSX1BMTE9OIHwgUkNDX0NSX1BMTFNBSTFPTikpOworCisgIC8qIFdyaXRlIG5ldyBtYXNrIGluIENSIHJlZ2lzdGVyICovCisgIExMX1JDQ19Xcml0ZVJlZyhDUiwgdmxfbWFzayk7CisKKyAgLyogV2FpdCBmb3IgUExMIFJFQURZIGJpdCB0byBiZSByZXNldCAqLworICB3aGlsZShMTF9SQ0NfUExMX0lzUmVhZHkoKSAhPSAwVSkKKyAge30KKworICAvKiBSZXNldCBQTExDRkdSIHJlZ2lzdGVyICovCisgIExMX1JDQ19Xcml0ZVJlZyhQTExDRkdSLCAweDIyMDQxMDAwVSk7CisKKyAgLyogV2FpdCBmb3IgUExMU0FJIFJFQURZIGJpdCB0byBiZSByZXNldCAqLworICB3aGlsZShMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMFUpCisgIHt9CisKKyAgLyogUmVzZXQgUExMU0FJMUNGR1IgcmVnaXN0ZXIgKi8KKyAgTExfUkNDX1dyaXRlUmVnKFBMTFNBSTFDRkdSLCAweDIyMDQxMDAwVSk7CisKKyAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworICBMTF9SQ0NfV3JpdGVSZWcoQ0lFUiwgMHgwMDAwMDAwMFUpOworCisgIC8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgZmxhZ3MgKi8KKyAgdmxfbWFzayA9IFJDQ19DSUNSX0xTSTFSRFlDIHwgUkNDX0NJQ1JfTFNFUkRZQyB8IFJDQ19DSUNSX01TSVJEWUMgfCBSQ0NfQ0lDUl9IU0lSRFlDIHwgUkNDX0NJQ1JfSFNFUkRZQyB8IFJDQ19DSUNSX1BMTFJEWUMgfCBSQ0NfQ0lDUl9QTExTQUkxUkRZQyB8XAorICAgICAgICAgICAgUkNDX0NJQ1JfQ1NTQyB8IFJDQ19DSUNSX0hTSTQ4UkRZQyB8IFJDQ19DSUNSX0xTRUNTU0MgfCBSQ0NfQ0lDUl9MU0kyUkRZQzsKKworICBMTF9SQ0NfV3JpdGVSZWcoQ0lDUiwgdmxfbWFzayk7CisKKyAgLyogQ2xlYXIgcmVzZXQgZmxhZ3MgKi8KKyAgTExfUkNDX0NsZWFyUmVzZXRGbGFncygpOworCisgIC8qIFNNUFMgcmVzZXQgKi8KKyAgTExfUkNDX1dyaXRlUmVnKFNNUFNDUiwgMHgwMDAwMDMwMVUpOyAvKiBNU0kgZGVmYXVsdCBjbG9jayBzb3VyY2UgKi8KKworICAvKiBSRiBXYWtldXAgQ2xvY2sgU291cmNlIHNlbGVjdGlvbiAqLworICBMTF9SQ0NfU2V0UkZXS1BDbG9ja1NvdXJjZShMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX05PTkUpOworCisgIC8qIEhTSTQ4IHJlc2V0ICovCisgIExMX1JDQ19IU0k0OF9EaXNhYmxlKCk7CisKKyAgLyogSFNFQ1IgcmVnaXN0ZXIgd3JpdGUgdW5sb2NrICYgdGhlbiByZXNldCovCisgIExMX1JDQ19Xcml0ZVJlZyhIU0VDUiwgSFNFX0NPTlRST0xfVU5MT0NLX0tFWSk7CisgIExMX1JDQ19Xcml0ZVJlZyhIU0VDUiwgTExfUkNDX0hTRV9DVVJSRU5UTUFYXzMpOyAvKiBIU0VHTUMgc2V0IHRvIGRlZmF1bHQgdmFsdWUgMDExLCBjdXJyZW50IG1heCBsaW1pdCAxLjEzIG1BL1YgKi8KKworICAvKiBFWFRDRkdSIHJlc2V0Ki8KKyAgTExfUkNDX1dyaXRlUmVnKEVYVENGR1IsIDB4MDAwMzAwMDBVKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFJDQ19MTF9FRl9HZXRfRnJlcQorICAqIEBicmllZiAgUmV0dXJuIHRoZSBmcmVxdWVuY2llcyBvZiBkaWZmZXJlbnQgb24gY2hpcCBjbG9ja3M7ICBTeXN0ZW0sIEFIQiwgQVBCMSBhbmQgQVBCMiBidXNlcyBjbG9ja3MKKyAgKiAgICAgICAgIGFuZCBkaWZmZXJlbnQgcGVyaXBoZXJhbCBjbG9ja3MgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UuCisgICogQG5vdGUgICBJZiBTWVNDTEsgc291cmNlIGlzIE1TSSwgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gTVNJIHZhbHVlcygqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBIU0ksIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTSV9WQUxVRSgqKikKKyAgKiBAbm90ZSAgIElmIFNZU0NMSyBzb3VyY2UgaXMgSFNFLCBmdW5jdGlvbiByZXR1cm5zIHZhbHVlcyBiYXNlZCBvbiBIU0VfVkFMVUUoKioqKQorICAqIEBub3RlICAgSWYgU1lTQ0xLIHNvdXJjZSBpcyBQTEwsIGZ1bmN0aW9uIHJldHVybnMgdmFsdWVzIGJhc2VkIG9uIEhTRV9WQUxVRSgqKiopCisgICogICAgICAgICBvciBIU0lfVkFMVUUoKiopIG9yIE1TSSB2YWx1ZXMoKikgbXVsdGlwbGllZC9kaXZpZGVkIGJ5IHRoZSBQTEwgZmFjdG9ycy4KKyAgKiBAbm90ZSAgICgqKSAgTVNJIHZhbHVlcyBhcmUgcmV0cmlldmVkIHRoYW5rcyB0byBfX0xMX1JDQ19DQUxDX01TSV9GUkVRIG1hY3JvCisgICogQG5vdGUgICAoKiopIEhTSV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gdGhpcyBmaWxlIChkZWZhdWx0IHZhbHVlCisgICogICAgICAgICAgICAgIDE2IE1IeikgYnV0IHRoZSByZWFsIHZhbHVlIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgdmFyaWF0aW9ucworICAqICAgICAgICAgICAgICBpbiB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZS4KKyAgKiBAbm90ZSAgICgqKiopIEhTRV9WQUxVRSBpcyBhIGNvbnN0YW50IGRlZmluZWQgaW4gdGhpcyBmaWxlIChkZWZhdWx0IHZhbHVlCisgICogICAgICAgICAgICAgICAzMiBNSHopLCB1c2VyIGhhcyB0byBlbnN1cmUgdGhhdCBIU0VfVkFMVUUgaXMgc2FtZSBhcyB0aGUgcmVhbAorICAqICAgICAgICAgICAgICAgZnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsIHVzZWQuIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBtYXkKKyAgKiAgICAgICAgICAgICAgIGhhdmUgd3JvbmcgcmVzdWx0LgorICAqIEBub3RlICAgVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGluY29ycmVjdCB3aGVuIHVzaW5nIGZyYWN0aW9uYWwKKyAgKiAgICAgICAgIHZhbHVlIGZvciBIU0UgY3J5c3RhbC4KKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY29tcHV0ZSB0aGUKKyAgKiAgICAgICAgIGJhdWQtcmF0ZSBmb3IgdGhlIGNvbW11bmljYXRpb24gcGVyaXBoZXJhbHMgb3IgY29uZmlndXJlIG90aGVyIHBhcmFtZXRlcnMuCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gdGhlIGZyZXF1ZW5jaWVzIG9mIGRpZmZlcmVudCBvbiBjaGlwIGNsb2NrczsgIFN5c3RlbSwgQUhCLCBBUEIxIGFuZCBBUEIyIGJ1c2VzIGNsb2NrcworICAqIEBub3RlICAgRWFjaCB0aW1lIFNZU0NMSywgSENMSywgUENMSzEgYW5kL29yIFBDTEsyIGNsb2NrIGNoYW5nZXMsIHRoaXMgZnVuY3Rpb24KKyAgKiAgICAgICAgIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSBzdHJ1Y3R1cmUgZmllbGRzLiBPdGhlcndpc2UsIGFueQorICAqICAgICAgICAgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW5jb3JyZWN0LgorICAqIEBwYXJhbSAgUkNDX0Nsb2NrcyBwb2ludGVyIHRvIGEgQHJlZiBMTF9SQ0NfQ2xvY2tzVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBob2xkIHRoZSBjbG9ja3MgZnJlcXVlbmNpZXMKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEoTExfUkNDX0Nsb2Nrc1R5cGVEZWYgKlJDQ19DbG9ja3MpCit7CisgIC8qIEdldCBTWVNDTEsgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisKKyAgLyogSENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPkhDTEsxX0ZyZXF1ZW5jeSAgID0gUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19DbG9ja3MtPlNZU0NMS19GcmVxdWVuY3kpOworCisgIC8qIEhDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworICBSQ0NfQ2xvY2tzLT5IQ0xLMl9GcmVxdWVuY3kgICA9IFJDQ19HZXRIQ0xLMkNsb2NrRnJlcShSQ0NfQ2xvY2tzLT5TWVNDTEtfRnJlcXVlbmN5KTsKKworICAvKiBIQ0xLNCBjbG9jayBmcmVxdWVuY3kgKi8KKyAgUkNDX0Nsb2Nrcy0+SENMSzRfRnJlcXVlbmN5ICAgPSBSQ0NfR2V0SENMSzRDbG9ja0ZyZXEoUkNDX0Nsb2Nrcy0+U1lTQ0xLX0ZyZXF1ZW5jeSk7CisKKyAgLyogSENMSzUgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPkhDTEs1X0ZyZXF1ZW5jeSAgID0gUkNDX0dldEhDTEs1Q2xvY2tGcmVxKCk7CisKKyAgLyogUENMSzEgY2xvY2sgZnJlcXVlbmN5ICovCisgIFJDQ19DbG9ja3MtPlBDTEsxX0ZyZXF1ZW5jeSAgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0Nsb2Nrcy0+SENMSzFfRnJlcXVlbmN5KTsKKworICAvKiBQQ0xLMiBjbG9jayBmcmVxdWVuY3kgKi8KKyAgUkNDX0Nsb2Nrcy0+UENMSzJfRnJlcXVlbmN5ICA9IFJDQ19HZXRQQ0xLMkNsb2NrRnJlcShSQ0NfQ2xvY2tzLT5IQ0xLMV9GcmVxdWVuY3kpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTTVBTIGNsb2NrIGZyZXF1ZW5jeQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiBDUFUgcnVucywKKyAgKiAgICAgICAgIFdoZW4gd2FraW5nIHVwIGZyb20gU3RhbmRieSBtb2RlIGFuZCBwb3dlcmluZyBvbiB0aGUgVkNPREUgc3VwcGx5LCB0aGUgSFNJIGlzCisgICogICAgICAgICBzZWxlY3RlZCBhcyBTTVBTIFN0ZXAgRG93biBjb252ZXJ0ZXIgY2xvY2ssIGluZGVwZW5kZW50IGZyb20gdGhlIHNlbGVjdGlvbiBpbgorICAqICAgICAgICAgU01QU1NFTC4KKyAgKiBAcmV0dmFsIFNNUFMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0U01QU0Nsb2NrRnJlcSh2b2lkKQoreworICB1aW50MzJfdCBzbXBzX2ZyZXF1ZW5jeTsKKyAgdWludDMyX3Qgc21wc19wcmVzY2FsZXJfaW5kZXggPSAoKExMX1JDQ19HZXRTTVBTUHJlc2NhbGVyKCkpID4+IFJDQ19TTVBTQ1JfU01QU0RJVl9Qb3MpOworICB1aW50MzJfdCBzbXBzQ2xvY2tTb3VyY2UgPSBMTF9SQ0NfR2V0U01QU0Nsb2NrU291cmNlKCk7CisgIAorICBpZihzbXBzQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0kpLyogU01QUyBDbG9jayBzb3VyY2UgaXMgSFNJIE9zYy4gKi8KKyAgeworICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICB7CisgICAgICBzbXBzX2ZyZXF1ZW5jeSA9IEhTSV9WQUxVRSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bMF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzbXBzX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworICAgIH0KKyAgfQorICBlbHNlIGlmKCBzbXBzQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1NNUFNfQ0xLU09VUkNFX1NUQVRVU19IU0UpIC8qIFNNUFMgQ2xvY2sgc291cmNlIGlzIEhTRSBPc2MuICovCisgIHsKKyAgICBpZiAoTExfUkNDX0hTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBIU0VfVkFMVUUgLyBTbXBzUHJlc2NhbGVyVGFibGVbc21wc19wcmVzY2FsZXJfaW5kZXhdWzVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiggc21wc0Nsb2NrU291cmNlID09IExMX1JDQ19TTVBTX0NMS1NPVVJDRV9TVEFUVVNfTVNJKSAvKiBTTVBTIENsb2NrIHNvdXJjZSBpcyBNU0kgT3NjLiAqLworICB7CisgICAgdWludDMyX3QgbXNpUmFuZ2UgPSBMTF9SQ0NfTVNJX0dldFJhbmdlKCk7CisgICAgCisgICAgaWYobXNpUmFuZ2UgPT0gTExfUkNDX01TSVJBTkdFXzgpCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lSQU5HRV84KSAvIFNtcHNQcmVzY2FsZXJUYWJsZVtzbXBzX3ByZXNjYWxlcl9pbmRleF1bNF07CisgICAgfQorICAgIGVsc2UgaWYgKG1zaVJhbmdlID09IExMX1JDQ19NU0lSQU5HRV85KQorICAgIHsKKyAgICAgIHNtcHNfZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJUkFOR0VfOSkgLyBTbXBzUHJlc2NhbGVyVGFibGVbc21wc19wcmVzY2FsZXJfaW5kZXhdWzNdOworICAgIH0KKyAgICBlbHNlIGlmIChtc2lSYW5nZSA9PSBMTF9SQ0NfTVNJUkFOR0VfMTApCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lSQU5HRV8xMCkgLyBTbXBzUHJlc2NhbGVyVGFibGVbc21wc19wcmVzY2FsZXJfaW5kZXhdWzJdOworICAgIH0KKyAgICBlbHNlIGlmIChtc2lSYW5nZSA9PSBMTF9SQ0NfTVNJUkFOR0VfMTEpCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lSQU5HRV8xMSkgLyBTbXBzUHJlc2NhbGVyVGFibGVbc21wc19wcmVzY2FsZXJfaW5kZXhdWzFdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc21wc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBTTVBTIGhhcyBubyBDbG9jayAqLworICB7CisgICAgc21wc19mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKyAgfQorCisgIGlmIChzbXBzX2ZyZXF1ZW5jeSAhPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTykKKyAgeworICAgIC8qIFN5c3RlbWF0aWMgZGl2IGJ5IDIgKi8KKyAgICBzbXBzX2ZyZXF1ZW5jeSA9IHNtcHNfZnJlcXVlbmN5ID4+IDFVOworICB9CisKKyAgcmV0dXJuIHNtcHNfZnJlcXVlbmN5OworfQorCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFVTQVJUeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFVTQVJUeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFCisgICogQHJldHZhbCBVU0FSVCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChIU0kgb3IgTFNFKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRVU0FSVENsb2NrRnJlcSh1aW50MzJfdCBVU0FSVHhTb3VyY2UpCit7CisgIHVpbnQzMl90IHVzYXJ0X2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX1VTQVJUX0NMS1NPVVJDRShVU0FSVHhTb3VyY2UpKTsKKworICAvKiBVU0FSVDFDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHN3aXRjaCAoTExfUkNDX0dldFVTQVJUQ2xvY2tTb3VyY2UoVVNBUlR4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBVU0FSVDEgQ2xvY2sgaXMgU3lzdGVtIENsb2NrICovCisgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1VTQVJUMV9DTEtTT1VSQ0VfSFNJOiAgICAvKiBVU0FSVDEgQ2xvY2sgaXMgSFNJIE9zYy4gKi8KKyAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgdXNhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFX0xTRTogICAgLyogVVNBUlQxIENsb2NrIGlzIExTRSBPc2MuICovCisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHVzYXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfVVNBUlQxX0NMS1NPVVJDRV9QQ0xLMjogIC8qIFVTQVJUMSBDbG9jayBpcyBQQ0xLMiAqLworICAgIGRlZmF1bHQ6CisgICAgICB1c2FydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEoUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHVzYXJ0X2ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSTJDeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIEkyQ3hTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfSTJDM19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIEkyQyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBIU0kgb3NjaWxsYXRvciBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRJMkNDbG9ja0ZyZXEodWludDMyX3QgSTJDeFNvdXJjZSkKK3sKKyAgdWludDMyX3QgaTJjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0kyQ19DTEtTT1VSQ0UoSTJDeFNvdXJjZSkpOworCisgIGlmIChJMkN4U291cmNlID09IExMX1JDQ19JMkMxX0NMS1NPVVJDRSkKKyAgeworICAgIC8qIEkyQzEgQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldEkyQ0Nsb2NrU291cmNlKEkyQ3hTb3VyY2UpKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX1NZU0NMSzogLyogSTJDMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0kyQzFfQ0xLU09VUkNFX0hTSTogICAgLyogSTJDMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBpMmNfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19JMkMxX0NMS1NPVVJDRV9QQ0xLMTogIC8qIEkyQzEgQ2xvY2sgaXMgUENMSzEgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGkyY19mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSTJDMyBDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgICAgc3dpdGNoIChMTF9SQ0NfR2V0STJDQ2xvY2tTb3VyY2UoSTJDeFNvdXJjZSkpCisgICAgeworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfU1lTQ0xLOiAvKiBJMkMzIENsb2NrIGlzIFN5c3RlbSBDbG9jayAqLworICAgICAgICBpMmNfZnJlcXVlbmN5ID0gUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfSTJDM19DTEtTT1VSQ0VfSFNJOiAgICAvKiBJMkMzIENsb2NrIGlzIEhTSSBPc2MuICovCisgICAgICAgIGlmIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGkyY19mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0kyQzNfQ0xLU09VUkNFX1BDTEsxOiAgLyogSTJDMyBDbG9jayBpcyBQQ0xLMSAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaTJjX2ZyZXF1ZW5jeSA9IFJDQ19HZXRQQ0xLMUNsb2NrRnJlcShSQ0NfR2V0SENMSzFDbG9ja0ZyZXEoUkNDX0dldFN5c3RlbUNsb2NrRnJlcSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBpMmNfZnJlcXVlbmN5OworfQorCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIExQVUFSVHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBMUFVBUlR4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFCisgICogQHJldHZhbCBMUFVBUlQgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJIG9yIExTRSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0TFBVQVJUQ2xvY2tGcmVxKHVpbnQzMl90IExQVUFSVHhTb3VyY2UpCit7CisgIHVpbnQzMl90IGxwdWFydF9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19MUFVBUlRfQ0xLU09VUkNFKExQVUFSVHhTb3VyY2UpKTsKKworICAvKiBMUFVBUlQxQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRMUFVBUlRDbG9ja1NvdXJjZShMUFVBUlR4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX1NZU0NMSzogLyogTFBVQVJUMSBDbG9jayBpcyBTeXN0ZW0gQ2xvY2sgKi8KKyAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX0xQVUFSVDFfQ0xLU09VUkNFX0hTSTogICAgLyogTFBVQVJUMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgaWYgKExMX1JDQ19IU0lfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBscHVhcnRfZnJlcXVlbmN5ID0gSFNJX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19MUFVBUlQxX0NMS1NPVVJDRV9MU0U6ICAgIC8qIExQVUFSVDEgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgbHB1YXJ0X2ZyZXF1ZW5jeSA9IExTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfTFBVQVJUMV9DTEtTT1VSQ0VfUENMSzE6ICAvKiBMUFVBUlQxIENsb2NrIGlzIFBDTEsxICovCisgICAgZGVmYXVsdDoKKyAgICAgIGxwdWFydF9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gbHB1YXJ0X2ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gTFBUSU14IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgTFBUSU14U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRQorICAqIEByZXR2YWwgTFBUSU0gY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoSFNJLCBMU0kgb3IgTFNFKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRMUFRJTUNsb2NrRnJlcSh1aW50MzJfdCBMUFRJTXhTb3VyY2UpCit7CisgIHVpbnQzMl90IGxwdGltX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworICB1aW50MzJfdCB0ZW1wID0gTExfUkNDX0xTSTJfSXNSZWFkeSgpOworCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX0xQVElNX0NMS1NPVVJDRShMUFRJTXhTb3VyY2UpKTsKKworICBpZiAoTFBUSU14U291cmNlID09IExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFKQorICB7CisgICAgLyogTFBUSU0xQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTFBUSU14U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX0xTSTogICAgLyogTFBUSU0xIENsb2NrIGlzIExTSSBPc2MuICovCisgICAgICAgIGlmICgoTExfUkNDX0xTSTFfSXNSZWFkeSgpID09IDFVTCkgfHwgKHRlbXAgPT0gMVVMKSkKKyAgICAgICAgeworICAgICAgICAgIGxwdGltX2ZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9IU0k6ICAgIC8qIExQVElNMSBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVElNMV9DTEtTT1VSQ0VfTFNFOiAgICAvKiBMUFRJTTEgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19MUFRJTTFfQ0xLU09VUkNFX1BDTEsxOiAgLyogTFBUSU0xIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTFBUSU0yQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICAgIHN3aXRjaCAoTExfUkNDX0dldExQVElNQ2xvY2tTb3VyY2UoTFBUSU14U291cmNlKSkKKyAgICB7CisgICAgICBjYXNlIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX0xTSTogICAgLyogTFBUSU0yIENsb2NrIGlzIExTSSBPc2MuICovCisgICAgICAgIGlmICgoTExfUkNDX0xTSTFfSXNSZWFkeSgpID09IDFVTCkgfHwgKHRlbXAgPT0gMVVMKSkKKyAgICAgICAgeworICAgICAgICAgIGxwdGltX2ZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMTF9SQ0NfTFBUSU0yX0NMS1NPVVJDRV9IU0k6ICAgIC8qIExQVElNMiBDbG9jayBpcyBIU0kgT3NjLiAqLworICAgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTExfUkNDX0xQVElNMl9DTEtTT1VSQ0VfTFNFOiAgICAvKiBMUFRJTTIgQ2xvY2sgaXMgTFNFIE9zYy4gKi8KKyAgICAgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgbHB0aW1fZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19MUFRJTTJfQ0xLU09VUkNFX1BDTEsxOiAgLyogTFBUSU0yIENsb2NrIGlzIFBDTEsxICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBscHRpbV9mcmVxdWVuY3kgPSBSQ0NfR2V0UENMSzFDbG9ja0ZyZXEoUkNDX0dldEhDTEsxQ2xvY2tGcmVxKFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gbHB0aW1fZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTQUl4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgU0FJeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19TQUkxX0NMS1NPVVJDRQorICAqCisgICogQHJldHZhbCBTQUkgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgUExMIGlzIG5vdCByZWFkeQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQSBpbmRpY2F0ZXMgdGhhdCBleHRlcm5hbCBjbG9jayBpcyB1c2VkCisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0U0FJQ2xvY2tGcmVxKHVpbnQzMl90IFNBSXhTb3VyY2UpCit7CisgIHVpbnQzMl90IHNhaV9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19TQUlfQ0xLU09VUkNFKFNBSXhTb3VyY2UpKTsKKworICBzd2l0Y2ggKExMX1JDQ19HZXRTQUlDbG9ja1NvdXJjZShTQUl4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1NBSTFfQ0xLU09VUkNFX0hTSTogICAgICAgIC8qIEhTSSBjbG9jayB1c2VkIGFzIFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTSV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHNhaV9mcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1NBSTFfQ0xLU09VUkNFX1BMTFNBSTE6ICAgIC8qIFBMTFNBSTEgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExTQUkxX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgc2FpX2ZyZXF1ZW5jeSA9IFJDQ19QTExTQUkxX0dldEZyZXFEb21haW5fU0FJKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QTEw6ICAgICAgICAvKiBQTEwgY2xvY2sgdXNlZCBhcyBTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBzYWlfZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NBSSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19TQUkxX0NMS1NPVVJDRV9QSU46ICAgICAgICAvKiBFeHRlcm5hbCBpbnB1dCBjbG9jayB1c2VkIGFzIFNBSTEgY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIHNhaV9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBzYWlfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBDTEs0OHggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBDTEs0OHhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFCisgICogQHJldHZhbCBVU0IgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoTVNJIG9yIEhTSTQ4KSBvciBQTExzIChQTEwgb3IgUExMU0FJMSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0Q0xLNDhDbG9ja0ZyZXEodWludDMyX3QgQ0xLNDh4U291cmNlKQoreworICB1aW50MzJfdCBjbGs0OF9mcmVxdWVuY3kgPSBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTzsKKworICAvKiBDaGVjayBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JDQ19DTEs0OF9DTEtTT1VSQ0UoQ0xLNDh4U291cmNlKSk7CisKKyAgLyogQ0xLNDhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIHN3aXRjaCAoTExfUkNDX0dldFVTQkNsb2NrU291cmNlKENMSzQ4eFNvdXJjZSkpCisgIHsKKyAgICBjYXNlIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfUExMU0FJMTogICAgICAgLyogUExMU0FJMSBjbG9jayB1c2VkIGFzIENMSzQ4IGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExTQUkxX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgY2xrNDhfZnJlcXVlbmN5ID0gUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl80OE0oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFX1BMTDogICAgICAgICAgIC8qIFBMTCBjbG9jayB1c2VkIGFzIENMSzQ4IGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBjbGs0OF9mcmVxdWVuY3kgPSBSQ0NfUExMX0dldEZyZXFEb21haW5fNDhNKCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX0NMSzQ4X0NMS1NPVVJDRV9NU0k6ICAgICAgICAgICAvKiBNU0kgY2xvY2sgdXNlZCBhcyBDTEs0OCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfTVNJX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgY2xrNDhfZnJlcXVlbmN5ID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19DTEs0OF9DTEtTT1VSQ0VfSFNJNDg6ICAgICAgIC8qIEhTSTQ4IGNsb2NrIHVzZWQgYXMgQ0xLNDggY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChMTF9SQ0NfSFNJNDhfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBjbGs0OF9mcmVxdWVuY3kgPSBIU0k0OF9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGNsazQ4X2ZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gVVNCeCBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFVTQnhTb3VyY2UgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SQ0NfQ0xLNDhfQ0xLU09VUkNFCisgICogQHJldHZhbCBVU0IgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoTVNJIG9yIEhTSTQ4KSBvciBQTExzIChQTEwgb3IgUExMU0FJMSkgaXMgbm90IHJlYWR5CisgICovCit1aW50MzJfdCBMTF9SQ0NfR2V0VVNCQ2xvY2tGcmVxKHVpbnQzMl90IFVTQnhTb3VyY2UpCit7CisgIHJldHVybiBMTF9SQ0NfR2V0Q0xLNDhDbG9ja0ZyZXEoVVNCeFNvdXJjZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFJOR3ggY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBSTkd4U291cmNlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUkNDX1JOR19DTEtTT1VSQ0UKKyAgKiBAcmV0dmFsIFJORyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9yIChNU0kgb3IgSFNJNDgpIG9yIFBMTHMgKFBMTCBvciBQTExTQUkxKSBpcyBub3QgcmVhZHkKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRSTkdDbG9ja0ZyZXEodWludDMyX3QgUk5HeFNvdXJjZSkKK3sKKyAgdWludDMyX3Qgcm5nX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworICB1aW50MzJfdCBybmdDbG9ja1NvdXJjZSA9IExMX1JDQ19HZXRSTkdDbG9ja1NvdXJjZShSTkd4U291cmNlKTsKKyAgCisgIC8qIENoZWNrIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfUkNDX1JOR19DTEtTT1VSQ0UoUk5HeFNvdXJjZSkpOworCisgIC8qIFJOR0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgaWYocm5nQ2xvY2tTb3VyY2UgPT0gTExfUkNDX1JOR19DTEtTT1VSQ0VfTFNJKSAvKiBMU0kgY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgIHsKKyAgICBjb25zdCB1aW50MzJfdCB0ZW1wX2xzaTFTdGF0dXMgPSBMTF9SQ0NfTFNJMV9Jc1JlYWR5KCk7CisgICAgY29uc3QgdWludDMyX3QgdGVtcF9sc2kyU3RhdHVzID0gTExfUkNDX0xTSTJfSXNSZWFkeSgpOworICAgIGlmICgodGVtcF9sc2kxU3RhdHVzID09IDFVKSB8fCAodGVtcF9sc2kyU3RhdHVzID09IDFVKSkKKyAgICB7CisgICAgICBybmdfZnJlcXVlbmN5ID0gTFNJX1ZBTFVFOworICAgIH0KKyAgfQorICBlbHNlIGlmKHJuZ0Nsb2NrU291cmNlID09IExMX1JDQ19STkdfQ0xLU09VUkNFX0xTRSkgLyogTFNFIGNsb2NrIHVzZWQgYXMgUk5HIGNsb2NrIHNvdXJjZSAqLworICB7CisgICAgaWYgKExMX1JDQ19MU0VfSXNSZWFkeSgpID09IDFVKQorICAgIHsKKyAgICAgIHJuZ19mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgfQorICB9CisgIGVsc2UgLyogQ0xLNDggY2xvY2sgdXNlZCBhcyBSTkcgY2xvY2sgc291cmNlICovCisgIHsKKyAgICAvKiBTeXN0ZW1hdGljIERpdiBieSAzICovCisgICAgcm5nX2ZyZXF1ZW5jeSA9ICBMTF9SQ0NfR2V0Q0xLNDhDbG9ja0ZyZXEoTExfUkNDX0NMSzQ4X0NMS1NPVVJDRSkvIDNVOworICB9CisgIHJldHVybiBybmdfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBBREN4IGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgQURDeFNvdXJjZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JDQ19BRENfQ0xLU09VUkNFCisgICogQHJldHZhbCBBREMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvciAoTVNJKSBvciBQTEwgaXMgbm90IHJlYWR5CisgICogICAgICAgICAtIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldEFEQ0Nsb2NrRnJlcSh1aW50MzJfdCBBREN4U291cmNlKQoreworICB1aW50MzJfdCBhZGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19MTF9SQ0NfQURDX0NMS1NPVVJDRShBREN4U291cmNlKSk7CisKKyAgLyogQURDQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICBzd2l0Y2ggKExMX1JDQ19HZXRBRENDbG9ja1NvdXJjZShBREN4U291cmNlKSkKKyAgeworICAgIGNhc2UgTExfUkNDX0FEQ19DTEtTT1VSQ0VfUExMU0FJMTogICAgICAgLyogUExMU0FJMSBjbG9jayB1c2VkIGFzIEFEQyBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGFkY19mcmVxdWVuY3kgPSBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluX0FEQygpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19BRENfQ0xLU09VUkNFX1NZU0NMSzogICAgICAgIC8qIFNZU0NMSyBjbG9jayB1c2VkIGFzIEFEQyBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGFkY19mcmVxdWVuY3kgPSBSQ0NfR2V0U3lzdGVtQ2xvY2tGcmVxKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX0FEQ19DTEtTT1VSQ0VfUExMOiAgICAgICAgICAgLyogUExMIGNsb2NrIHVzZWQgYXMgVVNCIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19QTExfSXNSZWFkeSgpID09IDFVKQorICAgICAgeworICAgICAgICBhZGNfZnJlcXVlbmN5ID0gUkNDX1BMTF9HZXRGcmVxRG9tYWluX0FEQygpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19BRENfQ0xLU09VUkNFX05PTkU6ICAgICAgICAgIC8qIE5vIGNsb2NrIHVzZWQgYXMgQURDIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBhZGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkE7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBhZGNfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSVEMgJiBMQ0QgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBSVEMgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKiAgICAgICAgIC0gQHJlZiAgTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk8gaW5kaWNhdGVzIHRoYXQgb3NjaWxsYXRvcnMgKExTSSwgTFNFIG9yIEhTRSkgYXJlIG5vdCByZWFkeQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OQSBpbmRpY2F0ZXMgdGhhdCBubyBjbG9jayBzb3VyY2Ugc2VsZWN0ZWQKKyAgKi8KK3VpbnQzMl90IExMX1JDQ19HZXRSVENDbG9ja0ZyZXEodm9pZCkKK3sKKyAgdWludDMyX3QgcnRjX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworICB1aW50MzJfdCB0ZW1wID0gTExfUkNDX0xTSTJfSXNSZWFkeSgpOworCisgIC8qIFJUQ0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgc3dpdGNoIChMTF9SQ0NfR2V0UlRDQ2xvY2tTb3VyY2UoKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNFOiAgICAgICAvKiBMU0UgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0xTRV9Jc1JlYWR5KCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHJ0Y19mcmVxdWVuY3kgPSBMU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1JUQ19DTEtTT1VSQ0VfTFNJOiAgICAgICAvKiBMU0kgY2xvY2sgdXNlZCBhcyBSVEMgY2xvY2sgc291cmNlICovCisKKyAgICAgIGlmICgoTExfUkNDX0xTSTFfSXNSZWFkeSgpID09IDFVTCkgfHwgKHRlbXAgPT0gMVVMKSkKKyAgICAgIHsKKyAgICAgICAgcnRjX2ZyZXF1ZW5jeSA9IExTSV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUlRDX0NMS1NPVVJDRV9IU0VfRElWMzI6ICAgICAgICAvKiBIU0UgY2xvY2sgdXNlZCBhcyBBREMgY2xvY2sgc291cmNlICovCisgICAgICBydGNfZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMzJVOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19SVENfQ0xLU09VUkNFX05PTkU6ICAgICAgICAgIC8qIE5vIGNsb2NrIHVzZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBydGNfZnJlcXVlbmN5ID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTkE7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBydGNfZnJlcXVlbmN5OworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBSRiBXYWtldXAgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBSRldLUCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqICAgICAgICAgLSBAcmVmICBMTF9SQ0NfUEVSSVBIX0ZSRVFVRU5DWV9OTyBpbmRpY2F0ZXMgdGhhdCBvc2NpbGxhdG9ycyAoTFNJLCBMU0Ugb3IgSFNFKSBhcmUgbm90IHJlYWR5CisgICogICAgICAgICAtIEByZWYgIExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BIGluZGljYXRlcyB0aGF0IG5vIGNsb2NrIHNvdXJjZSBzZWxlY3RlZAorICAqLwordWludDMyX3QgTExfUkNDX0dldFJGV0tQQ2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IHJmd2twX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05POworICB1aW50MzJfdCB0ZW1wID0gTExfUkNDX0xTSTJfSXNSZWFkeSgpOworCisgIC8qIFJUQ0NMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgc3dpdGNoIChMTF9SQ0NfR2V0UkZXS1BDbG9ja1NvdXJjZSgpKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUkZXS1BfQ0xLU09VUkNFX0xTRTogICAgICAgICAgICAgIC8qIExTRSBjbG9jayB1c2VkIGFzIFJGIFdha2V1cCBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfTFNFX0lzUmVhZHkoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgcmZ3a3BfZnJlcXVlbmN5ID0gTFNFX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19SRldLUF9DTEtTT1VSQ0VfTFNJOiAgICAgICAgICAgICAgLyogTFNJIGNsb2NrIHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKChMTF9SQ0NfTFNJMV9Jc1JlYWR5KCkgPT0gMVVMKSB8fCAodGVtcCA9PSAxVUwpKQorICAgICAgeworICAgICAgICByZndrcF9mcmVxdWVuY3kgPSBMU0lfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9IU0VfRElWMTAyNDogICAgICAgLyogSFNFIGNsb2NrIHVzZWQgYXMgUkYgV2FrZXVwIGNsb2NrIHNvdXJjZSAqLworICAgICAgcmZ3a3BfZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMTAyNFU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1JGV0tQX0NMS1NPVVJDRV9OT05FOiAgICAgICAgICAgICAgLyogTm8gY2xvY2sgdXNlZCBhcyBSRiBXYWtldXAgY2xvY2sgc291cmNlICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJmd2twX2ZyZXF1ZW5jeSA9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05BOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmZ3a3BfZnJlcXVlbmN5OworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSQ0NfTExfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBTWVNURU0gY2xvY2sgKFNZU0NMSykgZnJlcXVlbmN5CisgICogQHJldHZhbCBTWVNURU0gY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRTeXN0ZW1DbG9ja0ZyZXEodm9pZCkKK3sKKyAgdWludDMyX3QgZnJlcXVlbmN5OworCisgIC8qIEdldCBTWVNDTEsgc291cmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBzd2l0Y2ggKExMX1JDQ19HZXRTeXNDbGtTb3VyY2UoKSkKKyAgeworICAgIGNhc2UgTExfUkNDX1NZU19DTEtTT1VSQ0VfU1RBVFVTX01TSTogIC8qIE1TSSB1c2VkIGFzIHN5c3RlbSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIGZyZXF1ZW5jeSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNJOiAgLyogSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrICBzb3VyY2UgKi8KKyAgICAgIGZyZXF1ZW5jeSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfSFNFOiAgLyogSFNFIHVzZWQgYXMgc3lzdGVtIGNsb2NrICBzb3VyY2UgKi8KKyAgICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMlU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZXF1ZW5jeSA9IEhTRV9WQUxVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfU1lTX0NMS1NPVVJDRV9TVEFUVVNfUExMOiAgLyogUExMIHVzZWQgYXMgc3lzdGVtIGNsb2NrICBzb3VyY2UgKi8KKyAgICAgIGZyZXF1ZW5jeSA9IFJDQ19QTExfR2V0RnJlcURvbWFpbl9TWVMoKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGZyZXF1ZW5jeSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGZyZXF1ZW5jeTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSENMSzEgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIEhDTEsxIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0SENMSzFDbG9ja0ZyZXEodWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSkKK3sKKyAgLyogSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShTWVNDTEtfRnJlcXVlbmN5LCBMTF9SQ0NfR2V0QUhCUHJlc2NhbGVyKCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBIQ0xLMiBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFNZU0NMS19GcmVxdWVuY3kgU1lTQ0xLIGNsb2NrIGZyZXF1ZW5jeQorICAqIEByZXR2YWwgSENMSzIgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19HZXRIQ0xLMkNsb2NrRnJlcSh1aW50MzJfdCBTWVNDTEtfRnJlcXVlbmN5KQoreworICAvKiBIQ0xLIGNsb2NrIGZyZXF1ZW5jeSAqLworICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19IQ0xLMl9GUkVRKFNZU0NMS19GcmVxdWVuY3ksIExMX0MyX1JDQ19HZXRBSEJQcmVzY2FsZXIoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIEhDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIEhDTEs0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0SENMSzRDbG9ja0ZyZXEodWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSkKK3sKKyAgLyogSENMSyBjbG9jayBmcmVxdWVuY3kgKi8KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfSENMSzRfRlJFUShTWVNDTEtfRnJlcXVlbmN5LCBMTF9SQ0NfR2V0QUhCNFByZXNjYWxlcigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gSENMSzUgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBIQ0xLNSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX0dldEhDTEs1Q2xvY2tGcmVxKHZvaWQpCit7CisgIHVpbnQzMl90IGZyZXF1ZW5jeTsKKworICAvKiBHZXQgU1lTQ0xLIHNvdXJjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgc3dpdGNoIChMTF9SQ0NfR2V0UkZDbG9ja1NvdXJjZSgpKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUkZfQ0xLU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCisgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1JGX0NMS1NPVVJDRV9IU0VfRElWMjogIC8qIEhTRSBEaXYyIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLworICAgICAgZnJlcXVlbmN5ID0gSFNFX1ZBTFVFIC8gMlU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcmVxdWVuY3kgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmcmVxdWVuY3k7CisKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQQ0xLMSBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIEhDTEtfRnJlcXVlbmN5IEhDTEsgY2xvY2sgZnJlcXVlbmN5CisgICogQHJldHZhbCBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX0dldFBDTEsxQ2xvY2tGcmVxKHVpbnQzMl90IEhDTEtfRnJlcXVlbmN5KQoreworICAvKiBQQ0xLMSBjbG9jayBmcmVxdWVuY3kgKi8KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUENMSzFfRlJFUShIQ0xLX0ZyZXF1ZW5jeSwgTExfUkNDX0dldEFQQjFQcmVzY2FsZXIoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeQorICAqIEBwYXJhbSAgSENMS19GcmVxdWVuY3kgSENMSyBjbG9jayBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfR2V0UENMSzJDbG9ja0ZyZXEodWludDMyX3QgSENMS19GcmVxdWVuY3kpCit7CisgIC8qIFBDTEsyIGNsb2NrIGZyZXF1ZW5jeSAqLworICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QQ0xLMl9GUkVRKEhDTEtfRnJlcXVlbmN5LCBMTF9SQ0NfR2V0QVBCMlByZXNjYWxlcigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIChQTExSQ0xLKSBmcmVxdWVuY3kgdXNlZCBmb3Igc3lzdGVtIGRvbWFpbgorICAqIEByZXR2YWwgUExMUkNMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NZUyh2b2lkKQoreworICB1aW50MzJfdCBwbGxpbnB1dGZyZXEsIHBsbHNvdXJjZTsKKworICAvKiBQTExfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgb3IgTVNJIFZhbHVlLyBQTExNKSAqIFBMTE4KKyAgICAgU1lTQ0xLID0gUExMX1ZDTyAvIFBMTFIKKyAgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfTVNJOiAgLyogTVNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNFOiAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgaWYgKExMX1JDQ19IU0VfSXNFbmFibGVkRGl2MigpID09IDFVKQorICAgICAgeworICAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUUgLyAyVTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMQ0xLX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTF9HZXROKCksIExMX1JDQ19QTExfR2V0UigpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMIGNsb2NrIChQTExQQ0xLKSBmcmVxdWVuY3kgdXNlZCBmb3IgU0FJIGRvbWFpbgorICAqIEByZXR2YWwgUExMUENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX1BMTF9HZXRGcmVxRG9tYWluX1NBSSh2b2lkKQoreworICB1aW50MzJfdCBwbGxpbnB1dGZyZXEsIHBsbHNvdXJjZTsKKworICAvKiBQTExfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgb3IgTVNJIFZhbHVlIC8gUExMTSkgKiBQTExOCisgICAgIFNBSSBEb21haW4gY2xvY2sgPSBQTExfVkNPIC8gUExMUAorICAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9NU0k6ICAvKiBNU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0k6ICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExDTEtfU0FJX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExfR2V0TigpLCBMTF9SQ0NfUExMX0dldFAoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBMTCBjbG9jayAoUExMUENMSykgZnJlcXVlbmN5IHVzZWQgZm9yIEFEQyBkb21haW4KKyAgKiBAcmV0dmFsIFBMTFBDTEsgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExfR2V0RnJlcURvbWFpbl9BREModm9pZCkKK3sKKyAgdWludDMyX3QgcGxsaW5wdXRmcmVxLCBwbGxzb3VyY2U7CisKKyAgLyogUExMX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFIG9yIE1TSSBWYWx1ZSAvIFBMTE0pICogUExMTgorICAgICBTQUkgRG9tYWluIGNsb2NrID0gUExMX1ZDTyAvIFBMTFAKKyAgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfTVNJOiAgLyogTVNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNFOiAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICB7CisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUUgLyAyVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTENMS19BRENfRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTF9HZXROKCksIExMX1JDQ19QTExfR2V0UCgpKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiBQTEwgY2xvY2sgKFBMTFFDTEspIGZyZXF1ZW5jeSB1c2VkIGZvciA0OCBNSHogZG9tYWluCisgICogQHJldHZhbCBQTExRQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfUExMX0dldEZyZXFEb21haW5fNDhNKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTF9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSBvciBNU0kgVmFsdWUvIFBMTE0pICogUExMTgorICAgICA0OE0gRG9tYWluIGNsb2NrID0gUExMX1ZDTyAvIFBMTFEKKyAgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfTVNJOiAgLyogTVNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNFOiAgLyogSFNFIHVzZWQgYXMgUExMIGNsb2NrIHNvdXJjZSAqLworICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICB7CisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUUgLyAyVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICB9CisKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTENMS180OE1fRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTF9HZXROKCksIExMX1JDQ19QTExfR2V0USgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMU0FJMSBjbG9jayAoUExMU0FJMVBDTEspIGZyZXF1ZW5jeSB1c2VkIGZvciBTQUkgZG9tYWluCisgICogQHJldHZhbCBQTExTQUkxUENMSyBjbG9jayBmcmVxdWVuY3kgKGluIEh6KQorICAqLwordWludDMyX3QgUkNDX1BMTFNBSTFfR2V0RnJlcURvbWFpbl9TQUkodm9pZCkKK3sKKyAgdWludDMyX3QgcGxsaW5wdXRmcmVxLCBwbGxzb3VyY2U7CisKKyAgLyogUExMU0FJMV9WQ08gPSAoSFNFX1ZBTFVFIG9yIEhTSV9WQUxVRSBvciBNU0kgVmFsdWUvIFBMTE0pICogUExMU0FJMU4gKi8KKyAgLyogU0FJIERvbWFpbiBjbG9jayAgPSBQTExTQUkxX1ZDTyAvIFBMTFNBSTFQICovCisgIHBsbHNvdXJjZSA9IExMX1JDQ19QTExfR2V0TWFpblNvdXJjZSgpOworCisgIHN3aXRjaCAocGxsc291cmNlKQorICB7CisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX01TSTogIC8qIE1TSSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0k6ICAvKiBIU0kgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gSFNJX1ZBTFVFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNFOiAgLyogSFNFIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgICAgICAgIGlmIChMTF9SQ0NfSFNFX0lzRW5hYmxlZERpdjIoKSA9PSAxVSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcGxsaW5wdXRmcmVxID0gSFNFX1ZBTFVFIC8gMlU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fTExfUkNDX0NBTENfUExMU0FJMV9TQUlfRlJFUShwbGxpbnB1dGZyZXEsIExMX1JDQ19QTExfR2V0RGl2aWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMX1JDQ19QTExTQUkxX0dldE4oKSwgTExfUkNDX1BMTFNBSTFfR2V0UCgpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm4gUExMU0FJMSBjbG9jayAoUExMU0FJMVFDTEspIGZyZXF1ZW5jeSB1c2VkIGZvciA0OE1oeiBkb21haW4KKyAgKiBAcmV0dmFsIFBMTFNBSTFRQ0xLIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopCisgICovCit1aW50MzJfdCBSQ0NfUExMU0FJMV9HZXRGcmVxRG9tYWluXzQ4TSh2b2lkKQoreworICB1aW50MzJfdCBwbGxpbnB1dGZyZXEsIHBsbHNvdXJjZTsKKworICAvKiBQTExTQUkxX1ZDTyA9IChIU0VfVkFMVUUgb3IgSFNJX1ZBTFVFIG9yIE1TSSBWYWx1ZS8gUExMTSkgKiBQTExTQUkxTiAqLworICAvKiA0OE0gRG9tYWluIGNsb2NrICA9IFBMTFNBSTFfVkNPIC8gUExMU0FJMVEgKi8KKyAgcGxsc291cmNlID0gTExfUkNDX1BMTF9HZXRNYWluU291cmNlKCk7CisKKyAgc3dpdGNoIChwbGxzb3VyY2UpCisgIHsKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfTVNJOiAgLyogTVNJIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTSTogIC8qIEhTSSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBwbGxpbnB1dGZyZXEgPSBIU0lfVkFMVUU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9IU0U6ICAvKiBIU0UgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICBpZiAoTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKCkgPT0gMVUpCisgICAgIHsKKyAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUUgLyAyVTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHBsbGlucHV0ZnJlcSA9IF9fTExfUkNDX0NBTENfTVNJX0ZSRVEoTExfUkNDX01TSV9HZXRSYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX0xMX1JDQ19DQUxDX1BMTFNBSTFfNDhNX0ZSRVEocGxsaW5wdXRmcmVxLCBMTF9SQ0NfUExMX0dldERpdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9SQ0NfUExMU0FJMV9HZXROKCksIExMX1JDQ19QTExTQUkxX0dldFEoKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIFBMTFNBSTEgY2xvY2sgKFBMTFNBSTFSQ0xLKSBmcmVxdWVuY3kgdXNlZCBmb3IgQURDIGRvbWFpbgorICAqIEByZXR2YWwgUExMU0FJMVJDTEsgY2xvY2sgZnJlcXVlbmN5IChpbiBIeikKKyAgKi8KK3VpbnQzMl90IFJDQ19QTExTQUkxX0dldEZyZXFEb21haW5fQURDKHZvaWQpCit7CisgIHVpbnQzMl90IHBsbGlucHV0ZnJlcSwgcGxsc291cmNlOworCisgIC8qIFBMTFNBSTFfVkNPID0gKEhTRV9WQUxVRSBvciBIU0lfVkFMVUUgb3IgTVNJIFZhbHVlLyBQTExNKSAqIFBMTFNBSTFOICovCisgIC8qIDQ4TSBEb21haW4gY2xvY2sgID0gUExMU0FJMV9WQ08gLyBQTExTQUkxUiAqLworICBwbGxzb3VyY2UgPSBMTF9SQ0NfUExMX0dldE1haW5Tb3VyY2UoKTsKKworICBzd2l0Y2ggKHBsbHNvdXJjZSkKKyAgeworICAgIGNhc2UgTExfUkNDX1BMTFNPVVJDRV9NU0k6ICAvKiBNU0kgdXNlZCBhcyBQTExTQUkxIGNsb2NrIHNvdXJjZSAqLworICAgICAgcGxsaW5wdXRmcmVxID0gX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShMTF9SQ0NfTVNJX0dldFJhbmdlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExMX1JDQ19QTExTT1VSQ0VfSFNJOiAgLyogSFNJIHVzZWQgYXMgUExMU0FJMSBjbG9jayBzb3VyY2UgKi8KKyAgICAgIHBsbGlucHV0ZnJlcSA9IEhTSV9WQUxVRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTF9SQ0NfUExMU09VUkNFX0hTRTogIC8qIEhTRSB1c2VkIGFzIFBMTFNBSTEgY2xvY2sgc291cmNlICovCisgICAgICBpZiAoTExfUkNDX0hTRV9Jc0VuYWJsZWREaXYyKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHBsbGlucHV0ZnJlcSA9IEhTRV9WQUxVRSAvIDJVOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwbGxpbnB1dGZyZXEgPSBIU0VfVkFMVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwbGxpbnB1dGZyZXEgPSBfX0xMX1JDQ19DQUxDX01TSV9GUkVRKExMX1JDQ19NU0lfR2V0UmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gX19MTF9SQ0NfQ0FMQ19QTExTQUkxX0FEQ19GUkVRKHBsbGlucHV0ZnJlcSwgTExfUkNDX1BMTF9HZXREaXZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfUkNDX1BMTFNBSTFfR2V0TigpLCBMTF9SQ0NfUExMU0FJMV9HZXRSKCkpOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBkZWZpbmVkKFJDQykgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF9ybmcuYyBiL1NyYy9zdG0zMndieHhfbGxfcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMDAxMgotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfcm5nLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfcm5nLmMKKyAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQorICAqIEBicmllZiAgIFJORyBMTCBtb2R1bGUgZHJpdmVyLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3JuZy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKworI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoUk5HKQorCisvKiogQGFkZHRvZ3JvdXAgUk5HX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSTkdfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9STkdfQ0VEKF9fTU9ERV9fKSAoKChfX01PREVfXykgPT0gTExfUk5HX0NFRF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IExMX1JOR19DRURfRElTQUJMRSkpCisKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFJOR19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgUk5HX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgUk5HIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJORyByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JOR19EZUluaXQoUk5HX1R5cGVEZWYgKlJOR3gpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19STkdfQUxMX0lOU1RBTkNFKFJOR3gpKTsKKyAgLyogRW5hYmxlIFJORyByZXNldCBzdGF0ZSAqLworICBMTF9BSEIzX0dSUDFfRm9yY2VSZXNldChMTF9BSEIzX0dSUDFfUEVSSVBIX1JORyk7CisKKyAgLyogUmVsZWFzZSBSTkcgZnJvbSByZXNldCBzdGF0ZSAqLworICBMTF9BSEIzX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FIQjNfR1JQMV9QRVJJUEhfUk5HKTsKKyAgcmV0dXJuIChTVUNDRVNTKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIFJORyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBSTkdfSW5pdFN0cnVjdC4KKyAgKiBAcGFyYW0gIFJOR3ggUk5HIEluc3RhbmNlCisgICogQHBhcmFtICBSTkdfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgTExfUk5HX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBSTkcgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUk5HIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIFJOR19Jbml0U3RydWN0IGNvbnRlbnQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfUk5HX0luaXQoUk5HX1R5cGVEZWYgKlJOR3gsIExMX1JOR19Jbml0VHlwZURlZiAqUk5HX0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19STkdfQUxMX0lOU1RBTkNFKFJOR3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JOR19DRUQoUk5HX0luaXRTdHJ1Y3QtPkNsb2NrRXJyb3JEZXRlY3Rpb24pKTsKKworICAvKiBDbG9jayBFcnJvciBEZXRlY3Rpb24gY29uZmlndXJhdGlvbiAqLworICBNT0RJRllfUkVHKFJOR3gtPkNSLCBSTkdfQ1JfQ0VELCBSTkdfSW5pdFN0cnVjdC0+Q2xvY2tFcnJvckRldGVjdGlvbik7CisKKyAgcmV0dXJuIChTVUNDRVNTKTsKK30KKworLyoqCisgICogQGJyaWVmIFNldCBlYWNoIEByZWYgTExfUk5HX0luaXRUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUuCisgICogQHBhcmFtIFJOR19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JOR19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgZmllbGRzIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9STkdfU3RydWN0SW5pdChMTF9STkdfSW5pdFR5cGVEZWYgKlJOR19Jbml0U3RydWN0KQoreworICAvKiBTZXQgUk5HX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIFJOR19Jbml0U3RydWN0LT5DbG9ja0Vycm9yRGV0ZWN0aW9uID0gTExfUk5HX0NFRF9FTkFCTEU7CisKK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBSTkcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLworCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJ3Ynh4X2xsX3J0Yy5jIGIvU3JjL3N0bTMyd2J4eF9sbF9ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTMwOTMwCi0tLSAvZGV2L251bGwKKysrIGIvU3JjL3N0bTMyd2J4eF9sbF9ydGMuYwpAQCAtMCwwICsxLDg3OSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyd2J4eF9sbF9ydGMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgUlRDIExMIG1vZHVsZSBkcml2ZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBhdHRlbnRpb24KKyAgKgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9ydGMuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfY29ydGV4LmgiCisjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAorI2luY2x1ZGUgInN0bTMyX2Fzc2VydC5oIgorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0X3BhcmFtKGV4cHIpICgodm9pZCkwVSkKKyNlbmRpZgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkKFJUQykKKworLyoqIEBhZGR0b2dyb3VwIFJUQ19MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBSVENfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworLyogRGVmYXVsdCB2YWx1ZXMgdXNlZCBmb3IgcHJlc2NhbGVyICovCisjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFU0NfREVGQVVMVCAgICAgMHgwMDAwMDA3RlUKKyNkZWZpbmUgUlRDX1NZTkNIX1BSRVNDX0RFRkFVTFQgICAgICAweDAwMDAwMEZGVQorCisvKiBWYWx1ZXMgdXNlZCBmb3IgdGltZW91dCAqLworI2RlZmluZSBSVENfSU5JVE1PREVfVElNRU9VVCAgICAgICAgIDEwMDBVIC8qIDFzIHdoZW4gdGljayBzZXQgdG8gMW1zICovCisjZGVmaW5lIFJUQ19TWU5DSFJPX1RJTUVPVVQgICAgICAgICAgMTAwMFUgLyogMXMgd2hlbiB0aWNrIHNldCB0byAxbXMgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19MTF9SVENfSE9VUkZPUk1BVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfSE9VUkZPUk1BVF9BTVBNKSkKKworI2RlZmluZSBJU19MTF9SVENfQVNZTkNIX1BSRURJVihfX1ZBTFVFX18pICAgKChfX1ZBTFVFX18pIDw9IDB4N0ZVKQorCisjZGVmaW5lIElTX0xMX1JUQ19TWU5DSF9QUkVESVYoX19WQUxVRV9fKSAgICAoKF9fVkFMVUVfXykgPD0gMHg3RkZGVSkKKworI2RlZmluZSBJU19MTF9SVENfRk9STUFUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfRk9STUFUX0JJTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfRk9STUFUX0JDRCkpCisKKyNkZWZpbmUgSVNfTExfUlRDX1RJTUVfRk9STUFUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfVElNRV9GT1JNQVRfQU1fT1JfMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfVElNRV9GT1JNQVRfUE0pKQorCisjZGVmaW5lIElTX0xMX1JUQ19IT1VSMTIoX19IT1VSX18pICAgICAgICAgICAgKCgoX19IT1VSX18pID4gMFUpICYmICgoX19IT1VSX18pIDw9IDEyVSkpCisjZGVmaW5lIElTX0xMX1JUQ19IT1VSMjQoX19IT1VSX18pICAgICAgICAgICAgKChfX0hPVVJfXykgPD0gMjNVKQorI2RlZmluZSBJU19MTF9SVENfTUlOVVRFUyhfX01JTlVURVNfXykgICAgICAgICgoX19NSU5VVEVTX18pIDw9IDU5VSkKKyNkZWZpbmUgSVNfTExfUlRDX1NFQ09ORFMoX19TRUNPTkRTX18pICAgICAgICAoKF9fU0VDT05EU19fKSA8PSA1OVUpCisKKyNkZWZpbmUgSVNfTExfUlRDX1dFRUtEQVkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19XRUVLREFZX01PTkRBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfVFVFU0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfV0VETkVTREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9USFVSU0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfRlJJREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfV0VFS0RBWV9TQVRVUkRBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX1dFRUtEQVlfU1VOREFZKSkKKworI2RlZmluZSBJU19MTF9SVENfREFZKF9fREFZX18pICAgICgoKF9fREFZX18pID49IDFVKSAmJiAoKF9fREFZX18pIDw9IDMxVSkpCisKKyNkZWZpbmUgSVNfTExfUlRDX01PTlRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfSkFOVUFSWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9GRUJSVUFSWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9NQVJDSCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9BUFJJTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9NQVkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfSlVORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9KVUxZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX01PTlRIX0FVR1VTVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9TRVBURU1CRVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfTU9OVEhfT0NUT0JFUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9OT1ZFTUJFUikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19NT05USF9ERUNFTUJFUikpCisKKyNkZWZpbmUgSVNfTExfUlRDX1lFQVIoX19ZRUFSX18pICgoX19ZRUFSX18pIDw9IDk5VSkKKworI2RlZmluZSBJU19MTF9SVENfQUxNQV9NQVNLKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX05PTkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19EQVRFV0VFS0RBWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX0hPVVJTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1BX01BU0tfTUlOVVRFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQV9NQVNLX1NFQ09ORFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUFfTUFTS19BTEwpKQorCisjZGVmaW5lIElTX0xMX1JUQ19BTE1CX01BU0soX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX0RBVEVXRUVLREFZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfSE9VUlMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUlRDX0FMTUJfTUFTS19NSU5VVEVTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JUQ19BTE1CX01BU0tfU0VDT05EUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SVENfQUxNQl9NQVNLX0FMTCkpCisKKworI2RlZmluZSBJU19MTF9SVENfQUxNQV9EQVRFX1dFRUtEQVlfU0VMKF9fU0VMX18pICgoKF9fU0VMX18pID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9XRUVLREFZKSkKKworI2RlZmluZSBJU19MTF9SVENfQUxNQl9EQVRFX1dFRUtEQVlfU0VMKF9fU0VMX18pICgoKF9fU0VMX18pID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NFTF9fKSA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9XRUVLREFZKSkKKworCisvKioKKyAgKiBAfQorICAqLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgUlRDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBSVENfTExfRUZfSW5pdAorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZXMgdGhlIFJUQyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVzZXQgdGhlIFJUQyBDbG9jayBzb3VyY2UgYW5kIFJUQyBCYWNrdXAgRGF0YQorICAqICAgICAgICAgcmVnaXN0ZXJzLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19EZUluaXQoUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2V0IEluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgaWYgKExMX1JUQ19FbnRlckluaXRNb2RlKFJUQ3gpICE9IEVSUk9SKQorICB7CisgICAgLyogUmVzZXQgVFIsIERSIGFuZCBDUiByZWdpc3RlcnMgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+VFIsICAgICAgIDB4MDAwMDAwMDBVKTsKKyNpZiBkZWZpbmVkKFJUQ19XQUtFVVBfU1VQUE9SVCkKKyAgICBXUklURV9SRUcoUlRDeC0+V1VUUiwgICAgIFJUQ19XVVRSX1dVVCk7CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisgICAgV1JJVEVfUkVHKFJUQ3gtPkRSICAsICAgICAoUlRDX0RSX1dEVV8wIHwgUlRDX0RSX01VXzAgfCBSVENfRFJfRFVfMCkpOworICAgIC8qIFJlc2V0IEFsbCBDUiBiaXRzIGV4Y2VwdCBDUlsyOjBdICovCisjaWYgZGVmaW5lZChSVENfV0FLRVVQX1NVUFBPUlQpCisgICAgV1JJVEVfUkVHKFJUQ3gtPkNSLCAoUkVBRF9SRUcoUlRDeC0+Q1IpICYgUlRDX0NSX1dVQ0tTRUwpKTsKKyNlbHNlCisgICAgV1JJVEVfUkVHKFJUQ3gsIENSLCAweDAwMDAwMDAwVSk7CisjZW5kaWYgLyogUlRDX1dBS0VVUF9TVVBQT1JUICovCisgICAgV1JJVEVfUkVHKFJUQ3gtPlBSRVIsICAgICAoUlRDX1BSRVJfUFJFRElWX0EgfCBSVENfU1lOQ0hfUFJFU0NfREVGQVVMVCkpOworICAgIFdSSVRFX1JFRyhSVEN4LT5BTFJNQVIsICAgMHgwMDAwMDAwMFUpOworICAgIFdSSVRFX1JFRyhSVEN4LT5BTFJNQlIsICAgMHgwMDAwMDAwMFUpOworICAgIFdSSVRFX1JFRyhSVEN4LT5TSElGVFIsICAgMHgwMDAwMDAwMFUpOworICAgIFdSSVRFX1JFRyhSVEN4LT5DQUxSLCAgICAgMHgwMDAwMDAwMFUpOworICAgIFdSSVRFX1JFRyhSVEN4LT5BTFJNQVNTUiwgMHgwMDAwMDAwMFUpOworICAgIFdSSVRFX1JFRyhSVEN4LT5BTFJNQlNTUiwgMHgwMDAwMDAwMFUpOworCisgICAgLyogUmVzZXQgSVNSIHJlZ2lzdGVyIGFuZCBleGl0IGluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgICBXUklURV9SRUcoUlRDeC0+SVNSLCAgICAgIDB4MDAwMDAwMDBVKTsKKworICAgIC8qIFJlc2V0IFRhbXBlciBhbmQgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKFJUQ3gtPlRBTVBDUiwgMHgwMDAwMDAwMFUpOworCisgICAgLyogUmVzZXQgT3B0aW9uIHJlZ2lzdGVyICovCisgICAgV1JJVEVfUkVHKFJUQ3gtPk9SLCAweDAwMDAwMDAwVSk7CisKKyAgICAvKiBXYWl0IHRpbGwgdGhlIFJUQyBSU0YgZmxhZyBpcyBzZXQgKi8KKyAgICBzdGF0dXMgPSBMTF9SVENfV2FpdEZvclN5bmNocm8oUlRDeCk7CisgIH0KKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBSVEMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgIGluIFJUQ19Jbml0U3RydWN0LgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSVEMgcGVyaXBoZXJhbC4KKyAgKiBAbm90ZSAgIFRoZSBSVEMgUHJlc2NhbGVyIHJlZ2lzdGVyIGlzIHdyaXRlIHByb3RlY3RlZCBhbmQgY2FuIGJlIHdyaXR0ZW4gaW4KKyAgKiAgICAgICAgIGluaXRpYWxpemF0aW9uIG1vZGUgb25seS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgcmVnaXN0ZXJzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1JUQ19Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCBMTF9SVENfSW5pdFR5cGVEZWYgKlJUQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUkZPUk1BVChSVENfSW5pdFN0cnVjdC0+SG91ckZvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FTWU5DSF9QUkVESVYoUlRDX0luaXRTdHJ1Y3QtPkFzeW5jaFByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NZTkNIX1BSRURJVihSVENfSW5pdFN0cnVjdC0+U3luY2hQcmVzY2FsZXIpKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChMTF9SVENfRW50ZXJJbml0TW9kZShSVEN4KSAhPSBFUlJPUikKKyAgeworICAgIC8qIFNldCBIb3VyIEZvcm1hdCAqLworICAgIExMX1JUQ19TZXRIb3VyRm9ybWF0KFJUQ3gsIFJUQ19Jbml0U3RydWN0LT5Ib3VyRm9ybWF0KTsKKworICAgIC8qIENvbmZpZ3VyZSBTeW5jaHJvbm91cyBhbmQgQXN5bmNocm9ub3VzIHByZXNjYWxlciBmYWN0b3IgKi8KKyAgICBMTF9SVENfU2V0U3luY2hQcmVzY2FsZXIoUlRDeCwgUlRDX0luaXRTdHJ1Y3QtPlN5bmNoUHJlc2NhbGVyKTsKKyAgICBMTF9SVENfU2V0QXN5bmNoUHJlc2NhbGVyKFJUQ3gsIFJUQ19Jbml0U3RydWN0LT5Bc3luY2hQcmVzY2FsZXIpOworCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX0Rpc2FibGVJbml0TW9kZShSVEN4KTsKKworICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgIH0KKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1JUQ19Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgUlRDX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9SVENfU3RydWN0SW5pdChMTF9SVENfSW5pdFR5cGVEZWYgKlJUQ19Jbml0U3RydWN0KQoreworICAvKiBTZXQgUlRDX0luaXRTdHJ1Y3QgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIFJUQ19Jbml0U3RydWN0LT5Ib3VyRm9ybWF0ICAgICAgPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVI7CisgIFJUQ19Jbml0U3RydWN0LT5Bc3luY2hQcmVzY2FsZXIgPSBSVENfQVNZTkNIX1BSRVNDX0RFRkFVTFQ7CisgIFJUQ19Jbml0U3RydWN0LT5TeW5jaFByZXNjYWxlciAgPSBSVENfU1lOQ0hfUFJFU0NfREVGQVVMVDsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBjdXJyZW50IHRpbWUuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19UaW1lU3RydWN0IHBvaW50ZXIgdG8gYSBSVENfVGltZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aW1lIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBSVEMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFJUQyBUaW1lIHJlZ2lzdGVyIGlzIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgVGltZSByZWdpc3RlciBpcyBub3QgY29uZmlndXJlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX1RJTUVfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX1RpbWVUeXBlRGVmICpSVENfVGltZVN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0ZPUk1BVChSVENfRm9ybWF0KSk7CisKKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKFJUQ19UaW1lU3RydWN0LT5Ib3VycykpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19USU1FX0ZPUk1BVChSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KFJUQ19UaW1lU3RydWN0LT5Ib3VycykpOworICAgIH0KKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+SG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSVENfVGltZVN0cnVjdC0+VGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19UaW1lU3RydWN0LT5Ib3VycykpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfVGltZVN0cnVjdC0+TWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19UaW1lU3RydWN0LT5TZWNvbmRzKSkpOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICAvKiBTZXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICBpZiAoTExfUlRDX0VudGVySW5pdE1vZGUoUlRDeCkgIT0gRVJST1IpCisgIHsKKyAgICAvKiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3JtYXQgKi8KKyAgICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgICBMTF9SVENfVElNRV9Db25maWcoUlRDeCwgUlRDX1RpbWVTdHJ1Y3QtPlRpbWVGb3JtYXQsIFJUQ19UaW1lU3RydWN0LT5Ib3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVGltZVN0cnVjdC0+TWludXRlcywgUlRDX1RpbWVTdHJ1Y3QtPlNlY29uZHMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgTExfUlRDX1RJTUVfQ29uZmlnKFJUQ3gsIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0LCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX1RpbWVTdHJ1Y3QtPkhvdXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX1RpbWVTdHJ1Y3QtPk1pbnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfVGltZVN0cnVjdC0+U2Vjb25kcykpOworICAgIH0KKworICAgIC8qIEV4aXQgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19EaXNhYmxlSW5pdE1vZGUoUlRDKTsKKworICAgIC8qIElmICBSVENfQ1JfQllQU0hBRCBiaXQgPSAwLCB3YWl0IGZvciBzeW5jaHJvIGVsc2UgdGhpcyBjaGVjayBpcyBub3QgbmVlZGVkICovCisgICAgaWYgKExMX1JUQ19Jc1NoYWRvd1JlZ0J5cGFzc0VuYWJsZWQoUlRDeCkgPT0gMFUpCisgICAgeworICAgICAgc3RhdHVzID0gTExfUlRDX1dhaXRGb3JTeW5jaHJvKFJUQ3gpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19FbmFibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1JUQ19UaW1lVHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlIChUaW1lID0gMDBoOjAwbWluOjAwc2VjKS4KKyAgKiBAcGFyYW0gIFJUQ19UaW1lU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19UaW1lVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX1RJTUVfU3RydWN0SW5pdChMTF9SVENfVGltZVR5cGVEZWYgKlJUQ19UaW1lU3RydWN0KQoreworICAvKiBUaW1lID0gMDBoOjAwbWluOjAwc2VjICovCisgIFJUQ19UaW1lU3RydWN0LT5UaW1lRm9ybWF0ID0gTExfUlRDX1RJTUVfRk9STUFUX0FNX09SXzI0OworICBSVENfVGltZVN0cnVjdC0+SG91cnMgICAgICA9IDBVOworICBSVENfVGltZVN0cnVjdC0+TWludXRlcyAgICA9IDBVOworICBSVENfVGltZVN0cnVjdC0+U2Vjb25kcyAgICA9IDBVOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgUlRDIGN1cnJlbnQgZGF0ZS4KKyAgKiBAcGFyYW0gIFJUQ3ggUlRDIEluc3RhbmNlCisgICogQHBhcmFtICBSVENfRm9ybWF0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CSU4KKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JDRAorICAqIEBwYXJhbSBSVENfRGF0ZVN0cnVjdCBwb2ludGVyIHRvIGEgUlRDX0RhdGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFJUQy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIERheSByZWdpc3RlciBpcyBjb25maWd1cmVkCisgICogICAgICAgICAgLSBFUlJPUjogUlRDIERheSByZWdpc3RlciBpcyBub3QgY29uZmlndXJlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0RBVEVfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0RhdGVUeXBlRGVmICpSVENfRGF0ZVN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1JUQ19BTExfSU5TVEFOQ0UoUlRDeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0ZPUk1BVChSVENfRm9ybWF0KSk7CisKKyAgaWYgKChSVENfRm9ybWF0ID09IExMX1JUQ19GT1JNQVRfQklOKSAmJiAoKFJUQ19EYXRlU3RydWN0LT5Nb250aCAmIDB4MTBVKSA9PSAweDEwVSkpCisgIHsKKyAgICBSVENfRGF0ZVN0cnVjdC0+TW9udGggPSAoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoICYgKHVpbnQ4X3QpfigweDEwVSkpICsgMHgwQVU7CisgIH0KKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1lFQVIoUlRDX0RhdGVTdHJ1Y3QtPlllYXIpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01PTlRIKFJUQ19EYXRlU3RydWN0LT5Nb250aCkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKFJUQ19EYXRlU3RydWN0LT5EYXkpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1lFQVIoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19EYXRlU3RydWN0LT5ZZWFyKSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTU9OVEgoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19EYXRlU3RydWN0LT5Nb250aCkpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0RhdGVTdHJ1Y3QtPkRheSkpKTsKKyAgfQorICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXkpKTsKKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNldCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgIGlmIChMTF9SVENfRW50ZXJJbml0TW9kZShSVEN4KSAhPSBFUlJPUikKKyAgeworICAgIC8qIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvcm1hdCAqLworICAgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICAgIHsKKyAgICAgIExMX1JUQ19EQVRFX0NvbmZpZyhSVEN4LCBSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSwgUlRDX0RhdGVTdHJ1Y3QtPkRheSwgUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoLCBSVENfRGF0ZVN0cnVjdC0+WWVhcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBMTF9SVENfREFURV9Db25maWcoUlRDeCwgUlRDX0RhdGVTdHJ1Y3QtPldlZWtEYXksIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfRGF0ZVN0cnVjdC0+RGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoKSwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19EYXRlU3RydWN0LT5ZZWFyKSk7CisgICAgfQorCisgICAgLyogRXhpdCBJbml0aWFsaXphdGlvbiBtb2RlICovCisgICAgTExfUlRDX0Rpc2FibGVJbml0TW9kZShSVEMpOworCisgICAgLyogSWYgIFJUQ19DUl9CWVBTSEFEIGJpdCA9IDAsIHdhaXQgZm9yIHN5bmNocm8gZWxzZSB0aGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgKi8KKyAgICBpZiAoTExfUlRDX0lzU2hhZG93UmVnQnlwYXNzRW5hYmxlZChSVEN4KSA9PSAwVSkKKyAgICB7CisgICAgICBzdGF0dXMgPSBMTF9SVENfV2FpdEZvclN5bmNocm8oUlRDeCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBTVUNDRVNTOworICAgIH0KKyAgfQorICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfUlRDX0RhdGVUeXBlRGVmIGZpZWxkIHRvIGRlZmF1bHQgdmFsdWUgKGRhdGUgPSBNb25kYXksIEphbnVhcnkgMDEgeHgwMCkKKyAgKiBAcGFyYW0gIFJUQ19EYXRlU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19EYXRlVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX0RBVEVfU3RydWN0SW5pdChMTF9SVENfRGF0ZVR5cGVEZWYgKlJUQ19EYXRlU3RydWN0KQoreworICAvKiBNb25kYXksIEphbnVhcnkgMDEgeHgwMCAqLworICBSVENfRGF0ZVN0cnVjdC0+V2Vla0RheSA9IExMX1JUQ19XRUVLREFZX01PTkRBWTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPkRheSAgICAgPSAxVTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPk1vbnRoICAgPSBMTF9SVENfTU9OVEhfSkFOVUFSWTsKKyAgUlRDX0RhdGVTdHJ1Y3QtPlllYXIgICAgPSAwVTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBBbGFybSBBLgorICAqIEBub3RlICAgVGhlIEFsYXJtIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBbGFybQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgKFVzZSBAcmVmIExMX1JUQ19BTE1BX0Rpc2FibGUgZnVuY3Rpb24pLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFJUQ19Gb3JtYXQgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9SVENfRk9STUFUX0JJTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQkNECisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBhbGFybSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEFMQVJNQSByZWdpc3RlcnMgYXJlIGNvbmZpZ3VyZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBBTEFSTUEgcmVnaXN0ZXJzIGFyZSBub3QgY29uZmlndXJlZAorICAqLworRXJyb3JTdGF0dXMgTExfUlRDX0FMTUFfSW5pdChSVENfVHlwZURlZiAqUlRDeCwgdWludDMyX3QgUlRDX0Zvcm1hdCwgTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfUlRDX0FMTF9JTlNUQU5DRShSVEN4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9SVENfRk9STUFUKFJUQ19Gb3JtYXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1BX01BU0soUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19BTE1BX0RBVEVfV0VFS0RBWV9TRUwoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsKSk7CisKKyAgaWYgKFJUQ19Gb3JtYXQgPT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSk7CisgICAgfQorICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKworICAgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUFfREFURVdFRUtEQVlTRUxfREFURSkKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKExMX1JUQ19HZXRIb3VyRm9ybWF0KFJUQ3gpICE9IExMX1JUQ19IT1VSRk9STUFUXzI0SE9VUikKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0hPVVIxMihfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKSk7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1RJTUVfRk9STUFUKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSAweDAwVTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjI0KF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICB9CisKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX01JTlVURVMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19TRUNPTkRTKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKSkpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1dFRUtEQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCisgIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIC8qIFNlbGVjdCB3ZWVrZGF5IHNlbGVjdGlvbiAqLworICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1BX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGRhdGUgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUFfRGlzYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgaWYgKFJUQ19Gb3JtYXQgIT0gTExfUlRDX0ZPUk1BVF9CSU4pCisgICAgeworICAgICAgTExfUlRDX0FMTUFfU2V0RGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBMTF9SVENfQUxNQV9TZXREYXkoUlRDeCwgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBTZXQgdGhlIHdlZWsgZGF5IGZvciBBTEFSTSAqLworICAgIExMX1JUQ19BTE1BX0VuYWJsZVdlZWtkYXkoUlRDeCk7CisgICAgTExfUlRDX0FMTUFfU2V0V2Vla0RheShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkpOworICB9CisKKyAgLyogQ29uZmlndXJlIHRoZSBBbGFybSByZWdpc3RlciAqLworICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIExMX1JUQ19BTE1BX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzLCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5TZWNvbmRzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBMTF9SVENfQUxNQV9Db25maWdUaW1lKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MTF9SVENfQ09OVkVSVF9CSU4yQkNEKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKTsKKyAgfQorICAvKiBTZXQgQUxBUk0gbWFzayAqLworICBMTF9SVENfQUxNQV9TZXRNYXNrKFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrKTsKKworICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0VuYWJsZVdyaXRlUHJvdGVjdGlvbihSVEN4KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIFJUQyBBbGFybSBCLgorICAqIEBub3RlICAgVGhlIEFsYXJtIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgY29ycmVzcG9uZGluZyBBbGFybQorICAqICAgICAgICAgaXMgZGlzYWJsZWQgKEByZWYgTExfUlRDX0FMTUJfRGlzYWJsZSBmdW5jdGlvbikuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgUlRDX0Zvcm1hdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1JUQ19GT1JNQVRfQklOCisgICogICAgICAgICBAYXJnIEByZWYgTExfUlRDX0ZPUk1BVF9CQ0QKKyAgKiBAcGFyYW0gIFJUQ19BbGFybVN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGFsYXJtIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogQUxBUk1CIHJlZ2lzdGVycyBhcmUgY29uZmlndXJlZAorICAqICAgICAgICAgIC0gRVJST1I6IEFMQVJNQiByZWdpc3RlcnMgYXJlIG5vdCBjb25maWd1cmVkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfQUxNQl9Jbml0KFJUQ19UeXBlRGVmICpSVEN4LCB1aW50MzJfdCBSVENfRm9ybWF0LCBMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19GT1JNQVQoUlRDX0Zvcm1hdCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUJfTUFTSyhSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzaykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX0FMTUJfREFURV9XRUVLREFZX1NFTChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwpKTsKKworICBpZiAoUlRDX0Zvcm1hdCA9PSBMTF9SVENfRk9STUFUX0JJTikKKyAgeworICAgIGlmIChMTF9SVENfR2V0SG91ckZvcm1hdChSVEN4KSAhPSBMTF9SVENfSE9VUkZPUk1BVF8yNEhPVVIpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMTIoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMpKTsKKyAgICB9CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19NSU5VVEVTKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworCisgICAgaWYgKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9PSBMTF9SVENfQUxNQl9EQVRFV0VFS0RBWVNFTF9EQVRFKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19XRUVLREFZKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoTExfUlRDX0dldEhvdXJGb3JtYXQoUlRDeCkgIT0gTExfUlRDX0hPVVJGT1JNQVRfMjRIT1VSKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfSE9VUjEyKF9fTExfUlRDX0NPTlZFUlRfQkNEMkJJTihSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycykpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfVElNRV9GT1JNQVQoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IDB4MDBVOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19IT1VSMjQoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLkhvdXJzKSkpOworICAgIH0KKworICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfTUlOVVRFUyhfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcykpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfUlRDX1NFQ09ORFMoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpKSk7CisKKyAgICBpZiAoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5U2VsID09IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1JUQ19EQVkoX19MTF9SVENfQ09OVkVSVF9CQ0QyQklOKFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9SVENfV0VFS0RBWShfX0xMX1JUQ19DT05WRVJUX0JDRDJCSU4oUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSkpOworICAgIH0KKyAgfQorCisgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KKyAgTExfUlRDX0Rpc2FibGVXcml0ZVByb3RlY3Rpb24oUlRDeCk7CisKKyAgLyogU2VsZWN0IHdlZWtkYXkgc2VsZWN0aW9uICovCisgIGlmIChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPT0gTExfUlRDX0FMTUJfREFURVdFRUtEQVlTRUxfREFURSkKKyAgeworICAgIC8qIFNldCB0aGUgZGF0ZSBmb3IgQUxBUk0gKi8KKyAgICBMTF9SVENfQUxNQl9EaXNhYmxlV2Vla2RheShSVEN4KTsKKyAgICBpZiAoUlRDX0Zvcm1hdCAhPSBMTF9SVENfRk9STUFUX0JJTikKKyAgICB7CisgICAgICBMTF9SVENfQUxNQl9TZXREYXkoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExMX1JUQ19BTE1CX1NldERheShSVEN4LCBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybURhdGVXZWVrRGF5KSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIC8qIFNldCB0aGUgd2VlayBkYXkgZm9yIEFMQVJNICovCisgICAgTExfUlRDX0FMTUJfRW5hYmxlV2Vla2RheShSVEN4KTsKKyAgICBMTF9SVENfQUxNQl9TZXRXZWVrRGF5KFJUQ3gsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSk7CisgIH0KKworICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHJlZ2lzdGVyICovCisgIGlmIChSVENfRm9ybWF0ICE9IExMX1JUQ19GT1JNQVRfQklOKQorICB7CisgICAgTExfUlRDX0FMTUJfQ29uZmlnVGltZShSVEN4LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5UaW1lRm9ybWF0LCBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMsIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMpOworICB9CisgIGVsc2UKKyAgeworICAgIExMX1JUQ19BTE1CX0NvbmZpZ1RpbWUoUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTExfUlRDX0NPTlZFUlRfQklOMkJDRChSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuTWludXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xMX1JUQ19DT05WRVJUX0JJTjJCQ0QoUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcykpOworICB9CisgIC8qIFNldCBBTEFSTSBtYXNrICovCisgIExMX1JUQ19BTE1CX1NldE1hc2soUlRDeCwgUlRDX0FsYXJtU3RydWN0LT5BbGFybU1hc2spOworCisgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLworICBMTF9SVENfRW5hYmxlV3JpdGVQcm90ZWN0aW9uKFJUQ3gpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCBlYWNoIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBvZiBBTEFSTUEgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZSAoVGltZSA9IDAwaDowMG1uOjAwc2VjIC8KKyAgKiAgICAgICAgIERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoL01hc2sgPSBhbGwgZmllbGRzIGFyZSBtYXNrZWQpLgorICAqIEBwYXJhbSAgUlRDX0FsYXJtU3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1JUQ19BbGFybVR5cGVEZWYgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1JUQ19BTE1BX1N0cnVjdEluaXQoTExfUlRDX0FsYXJtVHlwZURlZiAqUlRDX0FsYXJtU3RydWN0KQoreworICAvKiBBbGFybSBUaW1lIFNldHRpbmdzIDogVGltZSA9IDAwaDowMG1uOjAwc2VjICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlRpbWVGb3JtYXQgPSBMTF9SVENfQUxNQV9USU1FX0ZPUk1BVF9BTTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuSG91cnMgICAgICA9IDBVOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5NaW51dGVzICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLlNlY29uZHMgICAgPSAwVTsKKworICAvKiBBbGFybSBEYXkgU2V0dGluZ3MgOiBEYXkgPSAxc3QgZGF5IG9mIHRoZSBtb250aCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXlTZWwgPSBMTF9SVENfQUxNQV9EQVRFV0VFS0RBWVNFTF9EQVRFOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtRGF0ZVdlZWtEYXkgICAgPSAxVTsKKworICAvKiBBbGFybSBNYXNrcyBTZXR0aW5ncyA6IE1hc2sgPSAgYWxsIGZpZWxkcyBhcmUgbm90IG1hc2tlZCAqLworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtTWFzayAgICAgICAgICAgPSBMTF9SVENfQUxNQV9NQVNLX05PTkU7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9SVENfQWxhcm1UeXBlRGVmIG9mIEFMQVJNQSBmaWVsZCB0byBkZWZhdWx0IHZhbHVlIChUaW1lID0gMDBoOjAwbW46MDBzZWMgLworICAqICAgICAgICAgRGF5ID0gMXN0IGRheSBvZiB0aGUgbW9udGgvTWFzayA9IGFsbCBmaWVsZHMgYXJlIG1hc2tlZCkuCisgICogQHBhcmFtICBSVENfQWxhcm1TdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfUlRDX0FsYXJtVHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfUlRDX0FMTUJfU3RydWN0SW5pdChMTF9SVENfQWxhcm1UeXBlRGVmICpSVENfQWxhcm1TdHJ1Y3QpCit7CisgIC8qIEFsYXJtIFRpbWUgU2V0dGluZ3MgOiBUaW1lID0gMDBoOjAwbW46MDBzZWMgKi8KKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuVGltZUZvcm1hdCA9IExMX1JUQ19BTE1CX1RJTUVfRk9STUFUX0FNOworICBSVENfQWxhcm1TdHJ1Y3QtPkFsYXJtVGltZS5Ib3VycyAgICAgID0gMFU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1UaW1lLk1pbnV0ZXMgICAgPSAwVTsKKyAgUlRDX0FsYXJtU3RydWN0LT5BbGFybVRpbWUuU2Vjb25kcyAgICA9IDBVOworCisgIC8qIEFsYXJtIERheSBTZXR0aW5ncyA6IERheSA9IDFzdCBkYXkgb2YgdGhlIG1vbnRoICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheVNlbCA9IExMX1JUQ19BTE1CX0RBVEVXRUVLREFZU0VMX0RBVEU7CisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1EYXRlV2Vla0RheSAgICA9IDFVOworCisgIC8qIEFsYXJtIE1hc2tzIFNldHRpbmdzIDogTWFzayA9ICBhbGwgZmllbGRzIGFyZSBub3QgbWFza2VkICovCisgIFJUQ19BbGFybVN0cnVjdC0+QWxhcm1NYXNrICAgICAgICAgICA9IExMX1JUQ19BTE1CX01BU0tfTk9ORTsKK30KKworLyoqCisgICogQGJyaWVmICBFbnRlcnMgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIGlzIGluIEluaXQgbW9kZQorICAqICAgICAgICAgIC0gRVJST1I6IFJUQyBpcyBub3QgaW4gSW5pdCBtb2RlCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfRW50ZXJJbml0TW9kZShSVENfVHlwZURlZiAqUlRDeCkKK3sKKyAgX19JTyB1aW50MzJfdCB0aW1lb3V0ID0gUlRDX0lOSVRNT0RFX1RJTUVPVVQ7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKworICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8KKyAgaWYgKExMX1JUQ19Jc0FjdGl2ZUZsYWdfSU5JVChSVEN4KSA9PSAwVSkKKyAgeworICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLworICAgIExMX1JUQ19FbmFibGVJbml0TW9kZShSVEN4KTsKKworICAgIC8qIFdhaXQgdGlsbCBSVEMgaXMgaW4gSU5JVCBzdGF0ZSBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCisgICAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ3gpOworICAgIHdoaWxlICgodGltZW91dCAhPSAwVSkgJiYgKHRtcCAhPSAxVSkpCisgICAgeworICAgICAgaWYgKExMX1NZU1RJQ0tfSXNBY3RpdmVDb3VudGVyRmxhZygpID09IDFVKQorICAgICAgeworICAgICAgICB0aW1lb3V0IC0tOworICAgICAgfQorICAgICAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19JTklUKFJUQ3gpOworICAgICAgaWYgKHRpbWVvdXQgPT0gMFUpCisgICAgICB7CisgICAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEV4aXQgdGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgaXMgY29tcGxldGUsIHRoZSBjYWxlbmRhciByZXN0YXJ0cworICAqICAgICAgICAgY291bnRpbmcgYWZ0ZXIgNCBSVENDTEsgY3ljbGVzLgorICAqIEBub3RlICAgVGhlIFJUQyBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHdyaXRlIHByb3RlY3RlZCwgdXNlIHRoZQorICAqICAgICAgICAgQHJlZiBMTF9SVENfRGlzYWJsZVdyaXRlUHJvdGVjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgUlRDeCBSVEMgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUlRDIGV4aXRlZCBmcm9tIGluIEluaXQgbW9kZQorICAqICAgICAgICAgIC0gRVJST1I6IE5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfRXhpdEluaXRNb2RlKFJUQ19UeXBlRGVmICpSVEN4KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKworICAvKiBEaXNhYmxlIGluaXRpYWxpemF0aW9uIG1vZGUgKi8KKyAgTExfUlRDX0Rpc2FibGVJbml0TW9kZShSVEN4KTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBXYWl0cyB1bnRpbCB0aGUgUlRDIFRpbWUgYW5kIERheSByZWdpc3RlcnMgKFJUQ19UUiBhbmQgUlRDX0RSKSBhcmUKKyAgKiAgICAgICAgIHN5bmNocm9uaXplZCB3aXRoIFJUQyBBUEIgY2xvY2suCisgICogQG5vdGUgICBUaGUgUlRDIFJlc3luY2hyb25pemF0aW9uIG1vZGUgaXMgd3JpdGUgcHJvdGVjdGVkLCB1c2UgdGhlCisgICogICAgICAgICBAcmVmIExMX1JUQ19EaXNhYmxlV3JpdGVQcm90ZWN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICogQG5vdGUgICBUbyByZWFkIHRoZSBjYWxlbmRhciB0aHJvdWdoIHRoZSBzaGFkb3cgcmVnaXN0ZXJzIGFmdGVyIENhbGVuZGFyCisgICogICAgICAgICBpbml0aWFsaXphdGlvbiwgY2FsZW5kYXIgdXBkYXRlIG9yIGFmdGVyIHdha2V1cCBmcm9tIGxvdyBwb3dlciBtb2RlcworICAqICAgICAgICAgdGhlIHNvZnR3YXJlIG11c3QgZmlyc3QgY2xlYXIgdGhlIFJTRiBmbGFnLgorICAqICAgICAgICAgVGhlIHNvZnR3YXJlIG11c3QgdGhlbiB3YWl0IHVudGlsIGl0IGlzIHNldCBhZ2FpbiBiZWZvcmUgcmVhZGluZworICAqICAgICAgICAgdGhlIGNhbGVuZGFyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjYWxlbmRhciByZWdpc3RlcnMgaGF2ZSBiZWVuCisgICogICAgICAgICBjb3JyZWN0bHkgY29waWVkIGludG8gdGhlIFJUQ19UUiBhbmQgUlRDX0RSIHNoYWRvdyByZWdpc3RlcnMuCisgICogQHBhcmFtICBSVEN4IFJUQyBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBSVEMgcmVnaXN0ZXJzIGFyZSBzeW5jaHJvbmlzZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBSVEMgcmVnaXN0ZXJzIGFyZSBub3Qgc3luY2hyb25pc2VkCisgICovCitFcnJvclN0YXR1cyBMTF9SVENfV2FpdEZvclN5bmNocm8oUlRDX1R5cGVEZWYgKlJUQ3gpCit7CisgIF9fSU8gdWludDMyX3QgdGltZW91dCA9IFJUQ19TWU5DSFJPX1RJTUVPVVQ7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IHRtcDsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19SVENfQUxMX0lOU1RBTkNFKFJUQ3gpKTsKKworICAvKiBDbGVhciBSU0YgZmxhZyAqLworICBMTF9SVENfQ2xlYXJGbGFnX1JTKFJUQ3gpOworCisgIC8qIFdhaXQgdGhlIHJlZ2lzdGVycyB0byBiZSBzeW5jaHJvbmlzZWQgKi8KKyAgdG1wID0gTExfUlRDX0lzQWN0aXZlRmxhZ19SUyhSVEN4KTsKKyAgd2hpbGUgKCh0aW1lb3V0ICE9IDBVKSAmJiAodG1wICE9IDBVKSkKKyAgeworICAgIGlmIChMTF9TWVNUSUNLX0lzQWN0aXZlQ291bnRlckZsYWcoKSA9PSAxVSkKKyAgICB7CisgICAgICB0aW1lb3V0LS07CisgICAgfQorICAgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDeCk7CisgICAgaWYgKHRpbWVvdXQgPT0gMFUpCisgICAgeworICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgfQorICB9CisKKyAgaWYgKHN0YXR1cyAhPSBFUlJPUikKKyAgeworICAgIHRpbWVvdXQgPSBSVENfU1lOQ0hST19USU1FT1VUOworICAgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDeCk7CisgICAgd2hpbGUgKCh0aW1lb3V0ICE9IDBVKSAmJiAodG1wICE9IDFVKSkKKyAgICB7CisgICAgICBpZiAoTExfU1lTVElDS19Jc0FjdGl2ZUNvdW50ZXJGbGFnKCkgPT0gMVUpCisgICAgICB7CisgICAgICAgIHRpbWVvdXQtLTsKKyAgICAgIH0KKyAgICAgIHRtcCA9IExMX1JUQ19Jc0FjdGl2ZUZsYWdfUlMoUlRDeCk7CisgICAgICBpZiAodGltZW91dCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZChSVEMpICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfc3BpLmMgYi9TcmMvc3RtMzJ3Ynh4X2xsX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjFhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX3NwaS5jCkBAIC0wLDAgKzEsMjc5IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3NwaS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBTUEkgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9zcGkuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFNQSTEpIHx8IGRlZmluZWQgKFNQSTIpCisKKy8qKiBAYWRkdG9ncm91cCBTUElfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgU1BJX0xMX1ByaXZhdGVfQ29uc3RhbnRzIFNQSSBQcml2YXRlIENvbnN0YW50cworICAqIEB7CisgICovCisvKiBTUEkgcmVnaXN0ZXJzIE1hc2tzICovCisjZGVmaW5lIFNQSV9DUjFfQ0xFQVJfTUFTSyAgICAgICAgICAgICAgICAgKFNQSV9DUjFfQ1BIQSAgICB8IFNQSV9DUjFfQ1BPTCAgICAgfCBTUElfQ1IxX01TVFIgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9CUiAgICAgIHwgU1BJX0NSMV9MU0JGSVJTVCB8IFNQSV9DUjFfU1NJICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfQ1IxX1NTTSAgICAgfCBTUElfQ1IxX1JYT05MWSAgIHwgU1BJX0NSMV9DUkNMICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9DUjFfQ1JDTkVYVCB8IFNQSV9DUjFfQ1JDRU4gICAgfCBTUElfQ1IxX0JJRElPRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJX0NSMV9CSURJTU9ERSkKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIFNQSV9MTF9Qcml2YXRlX01hY3JvcyBTUEkgUHJpdmF0ZSBNYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9TUElfVFJBTlNGRVJfRElSRUNUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfRlVMTF9EVVBMRVgpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX1NJTVBMRVhfUlgpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9IQUxGX0RVUExFWF9SWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfSEFMRl9EVVBMRVhfVFgpKQorCisjZGVmaW5lIElTX0xMX1NQSV9NT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTU9ERV9NQVNURVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9NT0RFX1NMQVZFKSkKKworI2RlZmluZSBJU19MTF9TUElfREFUQVdJRFRIKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzRCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfNUJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF82QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzdCSVQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfOEJJVCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF85QklUKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzEwQklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTFCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xMkJJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzEzQklUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9EQVRBV0lEVEhfMTRCSVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0RBVEFXSURUSF8xNUJJVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfREFUQVdJRFRIXzE2QklUKSkKKworI2RlZmluZSBJU19MTF9TUElfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9QT0xBUklUWV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUE9MQVJJVFlfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMUVER0UpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfUEhBU0VfMkVER0UpKQorCisjZGVmaW5lIElTX0xMX1NQSV9OU1MoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1NQSV9OU1NfU09GVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfTlNTX0hBUkRfSU5QVVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX05TU19IQVJEX09VVFBVVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JBVURSQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjQpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY4KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjMyKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1NQSV9CQVVEUkFURVBSRVNDQUxFUl9ESVY2NCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMTI4KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0JBVURSQVRFUFJFU0NBTEVSX0RJVjI1NikpCisKKyNkZWZpbmUgSVNfTExfU1BJX0JJVE9SREVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfTFNCX0ZJUlNUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX01TQl9GSVJTVCkpCisKKyNkZWZpbmUgSVNfTExfU1BJX0NSQ0NBTENVTEFUSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9TUElfQ1JDQ0FMQ1VMQVRJT05fRU5BQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA+PSAweDFVKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFNQSV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgU1BJX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIFNQSSByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBTUEkgcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFNQSSByZWdpc3RlcnMgYXJlIG5vdCBkZS1pbml0aWFsaXplZAorICAqLworRXJyb3JTdGF0dXMgTExfU1BJX0RlSW5pdChTUElfVHlwZURlZiAqU1BJeCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisjaWYgZGVmaW5lZChTUEkxKQorICBpZiAoU1BJeCA9PSBTUEkxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9TUEkxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgU1BJIGNsb2NrICovCisgICAgTExfQVBCMl9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIyX0dSUDFfUEVSSVBIX1NQSTEpOworCisgICAgc3RhdHVzID0gU1VDQ0VTUzsKKyAgfQorI2VuZGlmIC8qIFNQSTEgKi8KKyNpZiBkZWZpbmVkKFNQSTIpCisgIGlmIChTUEl4ID09IFNQSTIpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfRm9yY2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX1NQSTIpOworCisgICAgLyogUmVsZWFzZSByZXNldCBvZiBTUEkgY2xvY2sgKi8KKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfU1BJMik7CisKKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisjZW5kaWYgLyogU1BJMiAqLworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgU1BJIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIFNQSV9Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFNQSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFNQSSBpcyBkaXNhYmxlZCAoU1BJX0NSMV9TUEUgYml0ID0wKSwKKyAgKiAgICAgICAgIFNQSSBwZXJpcGhlcmFsIHNob3VsZCBiZSBpbiBkaXNhYmxlZCBzdGF0ZSBwcmlvciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgRVJST1IgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCisgICogQHBhcmFtICBTUEl4IFNQSSBJbnN0YW5jZQorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWUuIChSZXR1cm4gYWx3YXlzIFNVQ0NFU1MpCisgICovCitFcnJvclN0YXR1cyBMTF9TUElfSW5pdChTUElfVHlwZURlZiAqU1BJeCwgTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gRVJST1I7CisKKyAgLyogQ2hlY2sgdGhlIFNQSSBJbnN0YW5jZSBTUEl4Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX1NQSV9BTExfSU5TVEFOQ0UoU1BJeCkpOworCisgIC8qIENoZWNrIHRoZSBTUEkgcGFyYW1ldGVycyBmcm9tIFNQSV9Jbml0U3RydWN0Ki8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9UUkFOU0ZFUl9ESVJFQ1RJT04oU1BJX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfTU9ERShTUElfSW5pdFN0cnVjdC0+TW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX0RBVEFXSURUSChTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfUE9MQVJJVFkoU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9QSEFTRShTUElfSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfU1BJX05TUyhTUElfSW5pdFN0cnVjdC0+TlNTKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQkFVRFJBVEUoU1BJX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQklUT1JERVIoU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9TUElfQ1JDQ0FMQ1VMQVRJT04oU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uKSk7CisKKyAgaWYgKExMX1NQSV9Jc0VuYWJsZWQoU1BJeCkgPT0gMHgwMDAwMDAwMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDb25maWd1cmUgU1BJeCBDUjEgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gVHJhbnNmZXJEaXJlY3Rpb246ICBTUElfQ1IxX0JJRElNT0RFLCBTUElfQ1IxX0JJRElPRSBhbmQgU1BJX0NSMV9SWE9OTFkgYml0cworICAgICAqIC0gTWFzdGVyL1NsYXZlIE1vZGU6ICBTUElfQ1IxX01TVFIgYml0CisgICAgICogLSBDbG9ja1BvbGFyaXR5OiAgICAgIFNQSV9DUjFfQ1BPTCBiaXQKKyAgICAgKiAtIENsb2NrUGhhc2U6ICAgICAgICAgU1BJX0NSMV9DUEhBIGJpdAorICAgICAqIC0gTlNTIG1hbmFnZW1lbnQ6ICAgICBTUElfQ1IxX1NTTSBiaXQKKyAgICAgKiAtIEJhdWRSYXRlIHByZXNjYWxlcjogU1BJX0NSMV9CUlsyOjBdIGJpdHMKKyAgICAgKiAtIEJpdE9yZGVyOiAgICAgICAgICAgU1BJX0NSMV9MU0JGSVJTVCBiaXQKKyAgICAgKiAtIENSQ0NhbGN1bGF0aW9uOiAgICAgU1BJX0NSMV9DUkNFTiBiaXQKKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFNQSXgtPkNSMSwKKyAgICAgICAgICAgICAgIFNQSV9DUjFfQ0xFQVJfTUFTSywKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiB8IFNQSV9Jbml0U3RydWN0LT5Nb2RlIHwKKyAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwgU1BJX0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgfAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPk5TUyB8IFNQSV9Jbml0U3RydWN0LT5CYXVkUmF0ZSB8CisgICAgICAgICAgICAgICBTUElfSW5pdFN0cnVjdC0+Qml0T3JkZXIgfCBTUElfSW5pdFN0cnVjdC0+Q1JDQ2FsY3VsYXRpb24pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1IyIHdpdGggcGFyYW1ldGVyczoKKyAgICAgKiAtIERhdGFXaWR0aDogICAgICAgICAgRFNbMzowXSBiaXRzCisgICAgICogLSBOU1MgbWFuYWdlbWVudDogICAgIFNTT0UgYml0CisgICAgICovCisgICAgTU9ESUZZX1JFRyhTUEl4LT5DUjIsCisgICAgICAgICAgICAgICBTUElfQ1IyX0RTIHwgU1BJX0NSMl9TU09FLAorICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB8IChTUElfSW5pdFN0cnVjdC0+TlNTID4+IDE2VSkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSXggQ1JDUFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFNQSXggQ1JDUFIgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gQ1JDUG9seTogICAgICAgICAgICBDUkNQT0xZWzE1OjBdIGJpdHMKKyAgICAgKi8KKyAgICBpZiAoU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uID09IExMX1NQSV9DUkNDQUxDVUxBVElPTl9FTkFCTEUpCisgICAgeworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1NQSV9DUkNfUE9MWU5PTUlBTChTUElfSW5pdFN0cnVjdC0+Q1JDUG9seSkpOworICAgICAgTExfU1BJX1NldENSQ1BvbHlub21pYWwoU1BJeCwgU1BJX0luaXRTdHJ1Y3QtPkNSQ1BvbHkpOworICAgIH0KKyAgICBzdGF0dXMgPSBTVUNDRVNTOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZWFjaCBAcmVmIExMX1NQSV9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSAgU1BJX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfU1BJX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfU1BJX1N0cnVjdEluaXQoTExfU1BJX0luaXRUeXBlRGVmICpTUElfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IFNQSV9Jbml0U3RydWN0IGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICBTUElfSW5pdFN0cnVjdC0+VHJhbnNmZXJEaXJlY3Rpb24gPSBMTF9TUElfRlVMTF9EVVBMRVg7CisgIFNQSV9Jbml0U3RydWN0LT5Nb2RlICAgICAgICAgICAgICA9IExMX1NQSV9NT0RFX1NMQVZFOworICBTUElfSW5pdFN0cnVjdC0+RGF0YVdpZHRoICAgICAgICAgPSBMTF9TUElfREFUQVdJRFRIXzhCSVQ7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1NQSV9QT0xBUklUWV9MT1c7CisgIFNQSV9Jbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1NQSV9QSEFTRV8xRURHRTsKKyAgU1BJX0luaXRTdHJ1Y3QtPk5TUyAgICAgICAgICAgICAgID0gTExfU1BJX05TU19IQVJEX0lOUFVUOworICBTUElfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgICAgICAgICAgPSBMTF9TUElfQkFVRFJBVEVQUkVTQ0FMRVJfRElWMjsKKyAgU1BJX0luaXRTdHJ1Y3QtPkJpdE9yZGVyICAgICAgICAgID0gTExfU1BJX01TQl9GSVJTVDsKKyAgU1BJX0luaXRTdHJ1Y3QtPkNSQ0NhbGN1bGF0aW9uICAgID0gTExfU1BJX0NSQ0NBTENVTEFUSU9OX0RJU0FCTEU7CisgIFNQSV9Jbml0U3RydWN0LT5DUkNQb2x5ICAgICAgICAgICA9IDdVOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogZGVmaW5lZCAoU1BJMSkgfHwgZGVmaW5lZCAoU1BJMikgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF90aW0uYyBiL1NyYy9zdG0zMndieHhfbGxfdGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxM2I2MQotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMndieHhfbGxfdGltLmMKQEAgLTAsMCArMSwxMzA0IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3RpbS5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUSU0gTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF90aW0uaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfYnVzLmgiCisKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmIC8qIFVTRV9GVUxMX0FTU0VSVCAqLworCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX0RyaXZlcgorICAqIEB7CisgICovCisKKyNpZiBkZWZpbmVkIChUSU0xKSB8fCBkZWZpbmVkIChUSU0yKSB8fCBkZWZpbmVkIChUSU0xNikgfHwgZGVmaW5lZCAoVElNNykKKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTAorICAqIEB7CisgICovCisKKy8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVElNX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgSVNfTExfVElNX0NPVU5URVJNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfVVApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfRE9XTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX0RPV04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQX0RPV04pKQorCisjZGVmaW5lIElTX0xMX1RJTV9DTE9DS0RJVklTSU9OKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0KSkKKworI2RlZmluZSBJU19MTF9USU1fT0NNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZST1pFTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0lOQUNUSVZFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfVE9HR0xFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1BXTTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yKSkKKworI2RlZmluZSBJU19MTF9USU1fT0NTVEFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DU1RBVEVfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DU1RBVEVfRU5BQkxFKSkKKworI2RlZmluZSBJU19MTF9USU1fT0NQT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX09DUE9MQVJJVFlfSElHSCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DUE9MQVJJVFlfTE9XKSkKKworI2RlZmluZSBJU19MTF9USU1fT0NJRExFU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ0lETEVTVEFURV9MT1cpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NJRExFU1RBVEVfSElHSCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0FDVElWRUlOUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ1BTQyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVY0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjgpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19GSUxURVIoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX040KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWNF9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTZfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMzJfTjgpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9GQUxMSU5HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0JPVEhFREdFKSkKKworI2RlZmluZSBJU19MTF9USU1fRU5DT0RFUk1PREUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1g0X1RJMTIpKQorCisjZGVmaW5lIElTX0xMX1RJTV9JQ19QT0xBUklUWV9FTkNPREVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfUklTSU5HKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORykpCisKKyNkZWZpbmUgSVNfTExfVElNX09TU1JfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NSX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NSX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX09TU0lfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NJX0RJU0FCTEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NJX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfVElNX0xPQ0tfTEVWRUwoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfT0ZGKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMXzEpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF8yKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfMykpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBS19QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdIKSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUtfRklMVEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX04yKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9OOCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0JSRUFLMl9TVEFURShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRU5BQkxFKSkKKworI2RlZmluZSBJU19MTF9USU1fQlJFQUsyX1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1RJTV9CUkVBSzJfRklMVEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMSkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjIpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9ONCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOCkpCisKKyNkZWZpbmUgSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpKQorLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBUSU1fTExfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBPQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0MyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBPQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9PQ19Jbml0VHlwZURlZiAqVElNX09DSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgT0M1Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIE9DNkNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzFDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CitzdGF0aWMgRXJyb3JTdGF0dXMgSUMyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpOworc3RhdGljIEVycm9yU3RhdHVzIElDM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KTsKK3N0YXRpYyBFcnJvclN0YXR1cyBJQzRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVElNX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFNldCBUSU14IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IGludmFsaWQgVElNeCBpbnN0YW5jZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0RlSW5pdChUSU1fVHlwZURlZiAqVElNeCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gU1VDQ0VTUzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKFRJTXgpKTsKKworICBpZiAoVElNeCA9PSBUSU0xKQorICB7CisgICAgTExfQVBCMl9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xKTsKKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMSk7CisgIH0KKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0yKQorICB7CisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9USU0yKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfVElNMik7CisgIH0KKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNikKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTYpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNik7CisgIH0KKyAgZWxzZSBpZiAoVElNeCA9PSBUSU0xNykKKyAgeworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVElNMTcpOworICAgIExMX0FQQjJfR1JQMV9SZWxlYXNlUmVzZXQoTExfQVBCMl9HUlAxX1BFUklQSF9USU0xNyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVzdWx0ID0gRVJST1I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmllbGRzIG9mIHRoZSB0aW1lIGJhc2UgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogICAgICAgICB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcGFyYW0gIFRJTV9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRpbWUgYmFzZSB1bml0IGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9TdHJ1Y3RJbml0KExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIgICAgICAgICA9ICh1aW50MTZfdCkweDAwMDA7CisgIFRJTV9Jbml0U3RydWN0LT5Db3VudGVyTW9kZSAgICAgICA9IExMX1RJTV9DT1VOVEVSTU9ERV9VUDsKKyAgVElNX0luaXRTdHJ1Y3QtPkF1dG9yZWxvYWQgICAgICAgID0gMHhGRkZGRkZGRlU7CisgIFRJTV9Jbml0U3RydWN0LT5DbG9ja0RpdmlzaW9uICAgICA9IExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjE7CisgIFRJTV9Jbml0U3RydWN0LT5SZXBldGl0aW9uQ291bnRlciA9ICh1aW50OF90KTB4MDA7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IHRpbWUgYmFzZSB1bml0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCB0aW1lIGJhc2UgdW5pdCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworRXJyb3JTdGF0dXMgTExfVElNX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNyMTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9DT1VOVEVSTU9ERShUSU1fSW5pdFN0cnVjdC0+Q291bnRlck1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9DTE9DS0RJVklTSU9OKFRJTV9Jbml0U3RydWN0LT5DbG9ja0RpdmlzaW9uKSk7CisKKyAgdG1wY3IxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IxKTsKKworICBpZiAoSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZWxlY3QgdGhlIENvdW50ZXIgTW9kZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IxLCAoVElNX0NSMV9ESVIgfCBUSU1fQ1IxX0NNUyksIFRJTV9Jbml0U3RydWN0LT5Db3VudGVyTW9kZSk7CisgIH0KKworICBpZiAoSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgLyogU2V0IHRoZSBjbG9jayBkaXZpc2lvbiAqLworICAgIE1PRElGWV9SRUcodG1wY3IxLCBUSU1fQ1IxX0NLRCwgVElNX0luaXRTdHJ1Y3QtPkNsb2NrRGl2aXNpb24pOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENSMSwgdG1wY3IxKTsKKworICAvKiBTZXQgdGhlIEF1dG9yZWxvYWQgdmFsdWUgKi8KKyAgTExfVElNX1NldEF1dG9SZWxvYWQoVElNeCwgVElNX0luaXRTdHJ1Y3QtPkF1dG9yZWxvYWQpOworCisgIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovCisgIExMX1RJTV9TZXRQcmVzY2FsZXIoVElNeCwgVElNX0luaXRTdHJ1Y3QtPlByZXNjYWxlcik7CisKKyAgaWYgKElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICAvKiBTZXQgdGhlIFJlcGV0aXRpb24gQ291bnRlciB2YWx1ZSAqLworICAgIExMX1RJTV9TZXRSZXBldGl0aW9uQ291bnRlcihUSU14LCBUSU1fSW5pdFN0cnVjdC0+UmVwZXRpdGlvbkNvdW50ZXIpOworICB9CisKKyAgLyogR2VuZXJhdGUgYW4gdXBkYXRlIGV2ZW50IHRvIHJlbG9hZCB0aGUgUHJlc2NhbGVyCisgICAgIGFuZCB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlIChpZiBhcHBsaWNhYmxlKSBpbW1lZGlhdGVseSAqLworICBMTF9USU1fR2VuZXJhdGVFdmVudF9VUERBVEUoVElNeCk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IHRoZSBmaWVsZHMgb2YgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhCisgICogICAgICAgICBzdHJ1Y3R1cmUgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fT0NfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fT0NfSW5pdFR5cGVEZWYgc3RydWN0dXJlICh0aGUgb3V0cHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX09DX1N0cnVjdEluaXQoTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NfSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DTW9kZSAgICAgICA9IExMX1RJTV9PQ01PREVfRlJPWkVOOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NTdGF0ZSAgICAgID0gTExfVElNX09DU1RBVEVfRElTQUJMRTsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DTlN0YXRlICAgICA9IExMX1RJTV9PQ1NUQVRFX0RJU0FCTEU7CisgIFRJTV9PQ19Jbml0U3RydWN0LT5Db21wYXJlVmFsdWUgPSAweDAwMDAwMDAwVTsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgICA9IExMX1RJTV9PQ1BPTEFSSVRZX0hJR0g7CisgIFRJTV9PQ19Jbml0U3RydWN0LT5PQ05Qb2xhcml0eSAgPSBMTF9USU1fT0NQT0xBUklUWV9ISUdIOworICBUSU1fT0NfSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgID0gTExfVElNX09DSURMRVNUQVRFX0xPVzsKKyAgVElNX09DX0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSA9IExMX1RJTV9PQ0lETEVTVEFURV9MT1c7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgQ2hhbm5lbCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NIMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1RJTV9DSEFOTkVMX0NINgorICAqIEBwYXJhbSAgVElNX09DX0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX09DX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IG91dHB1dCBjaGFubmVsIGlzIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9PQ19Jbml0KFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBDaGFubmVsLCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ19Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyByZXN1bHQgPSBFUlJPUjsKKworICBzd2l0Y2ggKENoYW5uZWwpCisgIHsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMToKKyAgICAgIHJlc3VsdCA9IE9DMUNvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMjoKKyAgICAgIHJlc3VsdCA9IE9DMkNvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NIMzoKKyAgICAgIHJlc3VsdCA9IE9DM0NvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NINDoKKyAgICAgIHJlc3VsdCA9IE9DNENvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NINToKKyAgICAgIHJlc3VsdCA9IE9DNUNvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIExMX1RJTV9DSEFOTkVMX0NINjoKKyAgICAgIHJlc3VsdCA9IE9DNkNvbmZpZyhUSU14LCBUSU1fT0NfSW5pdFN0cnVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmllbGRzIG9mIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhCisgICogICAgICAgICBzdHJ1Y3R1cmUgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9JQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgKHRoZSBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX1RJTV9JQ19TdHJ1Y3RJbml0KExMX1RJTV9JQ19Jbml0VHlwZURlZiAqVElNX0lDSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSAgICA9IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkc7CisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQgPSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEk7CisgIFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyICAgPSBMTF9USU1fSUNQU0NfRElWMTsKKyAgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgICAgICA9IExMX1RJTV9JQ19GSUxURVJfRkRJVjE7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBDaGFubmVsIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gxCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gyCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0gzCisgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0NIQU5ORUxfQ0g0CisgICogQHBhcmFtICBUSU1fSUNfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9USU1fSUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCBvdXRwdXQgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IFRJTXggb3V0cHV0IGNoYW5uZWwgaXMgbm90IGluaXRpYWxpemVkCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fSUNfSW5pdChUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQ2hhbm5lbCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNfSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgcmVzdWx0ID0gRVJST1I7CisKKyAgc3dpdGNoIChDaGFubmVsKQorICB7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDE6CisgICAgICByZXN1bHQgPSBJQzFDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDI6CisgICAgICByZXN1bHQgPSBJQzJDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDM6CisgICAgICByZXN1bHQgPSBJQzNDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMTF9USU1fQ0hBTk5FTF9DSDQ6CisgICAgICByZXN1bHQgPSBJQzRDb25maWcoVElNeCwgVElNX0lDX0luaXRTdHJ1Y3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgICogQGJyaWVmICBGaWxscyBlYWNoIFRJTV9FbmNvZGVySW5pdFN0cnVjdCBmaWVsZCB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlCisgICogQHBhcmFtICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChlbmNvZGVyIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fRU5DT0RFUl9TdHJ1Y3RJbml0KExMX1RJTV9FTkNPREVSX0luaXRUeXBlRGVmICpUSU1fRW5jb2RlckluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+RW5jb2Rlck1vZGUgICAgPSBMTF9USU1fRU5DT0RFUk1PREVfWDJfVEkxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5ICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFBY3RpdmVJbnB1dCA9IExMX1RJTV9BQ1RJVkVJTlBVVF9ESVJFQ1RUSTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMUZpbHRlciAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJQb2xhcml0eSAgICA9IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkc7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyQWN0aXZlSW5wdXQgPSBMTF9USU1fQUNUSVZFSU5QVVRfRElSRUNUVEk7CisgIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUHJlc2NhbGVyICAgPSBMTF9USU1fSUNQU0NfRElWMTsKKyAgVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJGaWx0ZXIgICAgICA9IExMX1RJTV9JQ19GSUxURVJfRkRJVjE7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBvZiB0aGUgdGltZXIgaW5zdGFuY2UuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fRW5jb2RlckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0VOQ09ERVJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChUSU14IGVuY29kZXIgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUpCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitFcnJvclN0YXR1cyBMTF9USU1fRU5DT0RFUl9Jbml0KFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fRU5DT0RFUl9Jbml0VHlwZURlZiAqVElNX0VuY29kZXJJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjY21yMTsKKyAgdWludDMyX3QgdG1wY2NlcjsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9FTkNPREVSTU9ERShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPkVuY29kZXJNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMlBvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ0MxIGFuZCBDQzI6IFJlc2V0IHRoZSBDQzFFIGFuZCBDQzJFIEJpdHMgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpfihUSU1fQ0NFUl9DQzFFIHwgVElNX0NDRVJfQ0MyRSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIxIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIxID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjEpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ0VSIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjZXIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBDb25maWd1cmUgVEkxICovCisgIHRtcGNjbXIxICY9ICh1aW50MzJfdCl+KFRJTV9DQ01SMV9DQzFTIHwgVElNX0NDTVIxX0lDMUYgIHwgVElNX0NDTVIxX0lDMVBTQyk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFBY3RpdmVJbnB1dCA+PiAxNlUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMxRmlsdGVyID4+IDE2VSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIgPj4gMTZVKTsKKworICAvKiBDb25maWd1cmUgVEkyICovCisgIHRtcGNjbXIxICY9ICh1aW50MzJfdCl+KFRJTV9DQ01SMV9DQzJTIHwgVElNX0NDTVIxX0lDMkYgIHwgVElNX0NDTVIxX0lDMlBTQyk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJBY3RpdmVJbnB1dCA+PiA4VSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0VuY29kZXJJbml0U3RydWN0LT5JQzJGaWx0ZXIgPj4gOFUpOworICB0bXBjY21yMSB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUHJlc2NhbGVyID4+IDhVKTsKKworICAvKiBTZXQgVEkxIGFuZCBUSTIgcG9sYXJpdHkgYW5kIGVuYWJsZSBUSTEgYW5kIFRJMiAqLworICB0bXBjY2VyICY9ICh1aW50MzJfdCl+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gKHVpbnQzMl90KShUSU1fRW5jb2RlckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5KTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+SUMyUG9sYXJpdHkgPDwgNFUpOworICB0bXBjY2VyIHw9ICh1aW50MzJfdCkoVElNX0NDRVJfQ0MxRSB8IFRJTV9DQ0VSX0NDMkUpOworCisgIC8qIFNldCBlbmNvZGVyIG1vZGUgKi8KKyAgTExfVElNX1NldEVuY29kZXJNb2RlKFRJTXgsIFRJTV9FbmNvZGVySW5pdFN0cnVjdC0+RW5jb2Rlck1vZGUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjEgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIxLCB0bXBjY21yMSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIGZpZWxkcyBvZiB0aGUgVElNeCBIYWxsIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhCisgICogICAgICAgICBzdHJ1Y3R1cmUgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICogQHBhcmFtICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVElNX0hBTExTRU5TT1JfSW5pdFR5cGVEZWYgc3RydWN0dXJlIChIQUxMIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVElNX0hBTExTRU5TT1JfU3RydWN0SW5pdChMTF9USU1fSEFMTFNFTlNPUl9Jbml0VHlwZURlZiAqVElNX0hhbGxTZW5zb3JJbml0U3RydWN0KQoreworICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5ICAgICAgID0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORzsKKyAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFQcmVzY2FsZXIgICAgICA9IExMX1RJTV9JQ1BTQ19ESVYxOworICBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMUZpbHRlciAgICAgICAgID0gTExfVElNX0lDX0ZJTFRFUl9GRElWMTsKKyAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5Db21tdXRhdGlvbkRlbGF5ICA9IDBVOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgSGFsbCBzZW5zb3IgaW50ZXJmYWNlIG9mIHRoZSB0aW1lciBpbnN0YW5jZS4KKyAgKiBAbm90ZSBUSU14IENIMSwgQ0gyIGFuZCBDSDMgaW5wdXRzIGNvbm5lY3RlZCB0aHJvdWdoIGEgWE9SCisgICogICAgICAgdG8gdGhlIFRJMSBpbnB1dCBjaGFubmVsCisgICogQG5vdGUgVElNeCBzbGF2ZSBtb2RlIGNvbnRyb2xsZXIgaXMgY29uZmlndXJlZCBpbiByZXNldCBtb2RlLgorICAgICAgICAgIFNlbGVjdGVkIGludGVybmFsIHRyaWdnZXIgaXMgVEkxRl9FRC4KKyAgKiBAbm90ZSBDaGFubmVsIDEgaXMgY29uZmlndXJlZCBhcyBpbnB1dCwgSUMxIGlzIG1hcHBlZCBvbiBUUkMuCisgICogQG5vdGUgQ2FwdHVyZWQgdmFsdWUgc3RvcmVkIGluIFRJTXhfQ0NSMSBjb3JyZXNwb25kIHRvIHRoZSB0aW1lIGVsYXBzZWQKKyAgKiAgICAgICBiZXR3ZWVuIDIgY2hhbmdlcyBvbiB0aGUgaW5wdXRzLiBJdCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBtb3RvciBzcGVlZC4KKyAgKiBAbm90ZSBDaGFubmVsIDIgaXMgY29uZmlndXJlZCBpbiBvdXRwdXQgUFdNIDIgbW9kZS4KKyAgKiBAbm90ZSBDb21wYXJlIHZhbHVlIHN0b3JlZCBpbiBUSU14X0NDUjIgY29ycmVzcG9uZHMgdG8gdGhlIGNvbW11dGF0aW9uIGRlbGF5LgorICAqIEBub3RlIE9DMlJFRiBpcyBzZWxlY3RlZCBhcyB0cmlnZ2VyIG91dHB1dCBvbiBUUkdPLgorICAqIEBub3RlIExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSBtdXN0IG5vdCBiZSB1c2VkIGZvciBUSTEgd2hlbiBpdCBpcyB1c2VkCisgICogICAgICAgd2hlbiBUSU14IG9wZXJhdGVzIGluIEhhbGwgc2Vuc29yIGludGVyZmFjZSBtb2RlLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0hhbGxTZW5zb3JJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoVElNeCBIQUxMIHNlbnNvciBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZSkKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9IQUxMU0VOU09SX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9IQUxMU0VOU09SX0luaXRUeXBlRGVmICpUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNyMjsKKyAgdWludDMyX3QgdG1wY2NtcjE7CisgIHVpbnQzMl90IHRtcGNjZXI7CisgIHVpbnQzMl90IHRtcHNtY3I7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX1BPTEFSSVRZX0VOQ09ERVIoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9IYWxsU2Vuc29ySW5pdFN0cnVjdC0+SUMxRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ0MxIGFuZCBDQzI6IFJlc2V0IHRoZSBDQzFFIGFuZCBDQzJFIEJpdHMgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpfihUSU1fQ0NFUl9DQzFFIHwgVElNX0NDRVJfQ0MyRSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IFNNQ1IgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wc21jciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIFNNQ1IpOworCisgIC8qIENvbm5lY3QgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgdG8gdGhlIFRJMSBpbnB1dCAqLworICB0bXBjcjIgfD0gVElNX0NSMl9USTFTOworCisgIC8qIE9DMlJFRiBzaWduYWwgaXMgdXNlZCBhcyB0cmlnZ2VyIG91dHB1dCAoVFJHTykgKi8KKyAgdG1wY3IyIHw9IExMX1RJTV9UUkdPX09DMlJFRjsKKworICAvKiBDb25maWd1cmUgdGhlIHNsYXZlIG1vZGUgY29udHJvbGxlciAqLworICB0bXBzbWNyICY9ICh1aW50MzJfdCl+KFRJTV9TTUNSX1RTIHwgVElNX1NNQ1JfU01TKTsKKyAgdG1wc21jciB8PSBMTF9USU1fVFNfVEkxRl9FRDsKKyAgdG1wc21jciB8PSBMTF9USU1fU0xBVkVNT0RFX1JFU0VUOworCisgIC8qIENvbmZpZ3VyZSBpbnB1dCBjaGFubmVsIDEgKi8KKyAgdG1wY2NtcjEgJj0gKHVpbnQzMl90KX4oVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfSUMxRiAgfCBUSU1fQ0NNUjFfSUMxUFNDKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShMTF9USU1fQUNUSVZFSU5QVVRfVFJDID4+IDE2VSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoVElNX0hhbGxTZW5zb3JJbml0U3RydWN0LT5JQzFGaWx0ZXIgPj4gMTZVKTsKKyAgdG1wY2NtcjEgfD0gKHVpbnQzMl90KShUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVByZXNjYWxlciA+PiAxNlUpOworCisgIC8qIENvbmZpZ3VyZSBpbnB1dCBjaGFubmVsIDIgKi8KKyAgdG1wY2NtcjEgJj0gKHVpbnQzMl90KX4oVElNX0NDTVIxX09DMk0gfCBUSU1fQ0NNUjFfT0MyRkUgIHwgVElNX0NDTVIxX09DMlBFICB8IFRJTV9DQ01SMV9PQzJDRSk7CisgIHRtcGNjbXIxIHw9ICh1aW50MzJfdCkoTExfVElNX09DTU9ERV9QV00yIDw8IDhVKTsKKworICAvKiBTZXQgQ2hhbm5lbCAxIHBvbGFyaXR5IGFuZCBlbmFibGUgQ2hhbm5lbCAxIGFuZCBDaGFubmVsMiAqLworICB0bXBjY2VyICY9ICh1aW50MzJfdCl+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCB8IFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCk7CisgIHRtcGNjZXIgfD0gKHVpbnQzMl90KShUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPklDMVBvbGFyaXR5KTsKKyAgdG1wY2NlciB8PSAodWludDMyX3QpKFRJTV9DQ0VSX0NDMUUgfCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBXcml0ZSB0byBUSU14IENSMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ1IyLCB0bXBjcjIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggU01DUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgU01DUiwgdG1wc21jcik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjEsIHRtcGNjbXIxKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NSMiAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMihUSU14LCBUSU1fSGFsbFNlbnNvckluaXRTdHJ1Y3QtPkNvbW11dGF0aW9uRGVsYXkpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgZmllbGRzIG9mIHRoZSBCcmVhayBhbmQgRGVhZCBUaW1lIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAqIEBwYXJhbSAgVElNX0JEVFJJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoQnJlYWsgYW5kIERlYWQgVGltZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBMTF9USU1fQkRUUl9TdHJ1Y3RJbml0KExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpCit7CisgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTUlN0YXRlICAgICAgID0gTExfVElNX09TU1JfRElTQUJMRTsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5PU1NJU3RhdGUgICAgICAgPSBMTF9USU1fT1NTSV9ESVNBQkxFOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPkxvY2tMZXZlbCAgICAgICA9IExMX1RJTV9MT0NLTEVWRUxfT0ZGOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPkRlYWRUaW1lICAgICAgICA9ICh1aW50OF90KTB4MDA7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSAgICAgID0gTExfVElNX0JSRUFLX0RJU0FCTEU7CisgIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtQb2xhcml0eSAgID0gTExfVElNX0JSRUFLX1BPTEFSSVRZX0xPVzsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlciAgICAgPSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxOworICBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMlN0YXRlICAgICA9IExMX1RJTV9CUkVBSzJfRElTQUJMRTsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJQb2xhcml0eSAgPSBMTF9USU1fQlJFQUsyX1BPTEFSSVRZX0xPVzsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJGaWx0ZXIgICAgPSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTsKKyAgVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQgPSBMTF9USU1fQVVUT01BVElDT1VUUFVUX0RJU0FCTEU7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBCcmVhayBhbmQgRGVhZCBUaW1lIGZlYXR1cmUgb2YgdGhlIHRpbWVyIGluc3RhbmNlLgorICAqIEBub3RlIEFzIHRoZSBiaXRzIEJLMlAsIEJLMkUsIEJLMkZbMzowXSwgQktGWzM6MF0sIEFPRSwgQktQLCBCS0UsIE9TU0ksIE9TU1IKKyAgKiAgYW5kIERUR1s3OjBdIGNhbiBiZSB3cml0ZS1sb2NrZWQgZGVwZW5kaW5nIG9uIHRoZSBMT0NLIGNvbmZpZ3VyYXRpb24sIGl0CisgICogIGNhbiBiZSBuZWNlc3NhcnkgdG8gY29uZmlndXJlIGFsbCBvZiB0aGVtIGR1cmluZyB0aGUgZmlyc3Qgd3JpdGUgYWNjZXNzIHRvCisgICogIHRoZSBUSU14X0JEVFIgcmVnaXN0ZXIuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCisgICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0LgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0JEVFJJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoQnJlYWsgYW5kIERlYWQgVGltZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBCcmVhayBhbmQgRGVhZCBUaW1lIGlzIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogbm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1RJTV9CRFRSX0luaXQoVElNX1R5cGVEZWYgKlRJTXgsIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmICpUSU1fQkRUUkluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGJkdHIgPSAwOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09TU1JfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5PU1NSU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PU1NJX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTSVN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fTE9DS19MRVZFTChUSU1fQkRUUkluaXRTdHJ1Y3QtPkxvY2tMZXZlbCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLX1NUQVRFKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLX1BPTEFSSVRZKFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpKTsKKworICAvKiBTZXQgdGhlIExvY2sgbGV2ZWwsIHRoZSBCcmVhayBlbmFibGUgQml0IGFuZCB0aGUgUG9sYXJpdHksIHRoZSBPU1NSIFN0YXRlLAorICB0aGUgT1NTSSBTdGF0ZSwgdGhlIGRlYWQgdGltZSB2YWx1ZSBhbmQgdGhlIEF1dG9tYXRpYyBPdXRwdXQgRW5hYmxlIEJpdCAqLworCisgIC8qIFNldCB0aGUgQkRUUiBiaXRzICovCisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfRFRHLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkRlYWRUaW1lKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9MT0NLLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkxvY2tMZXZlbCk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfT1NTSSwgVElNX0JEVFJJbml0U3RydWN0LT5PU1NJU3RhdGUpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX09TU1IsIFRJTV9CRFRSSW5pdFN0cnVjdC0+T1NTUlN0YXRlKTsKKyAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CS0UsIFRJTV9CRFRSSW5pdFN0cnVjdC0+QnJlYWtTdGF0ZSk7CisgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktQLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrUG9sYXJpdHkpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0FPRSwgVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpOworICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX01PRSwgVElNX0JEVFJJbml0U3RydWN0LT5BdXRvbWF0aWNPdXRwdXQpOworICBpZiAoSVNfVElNX0FEVkFOQ0VEX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBS19GSUxURVIoVElNX0JEVFJJbml0U3RydWN0LT5CcmVha0ZpbHRlcikpOworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQktGLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrRmlsdGVyKTsKKyAgfQorCisgIGlmIChJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0JSRUFLMl9TVEFURShUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMlN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9CUkVBSzJfUE9MQVJJVFkoVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJQb2xhcml0eSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQlJFQUsyX0ZJTFRFUihUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMkZpbHRlcikpOworCisgICAgLyogU2V0IHRoZSBCUkVBSzIgaW5wdXQgcmVsYXRlZCBCRFRSIGJpdC1maWVsZHMgKi8KKyAgICBNT0RJRllfUkVHKHRtcGJkdHIsIFRJTV9CRFRSX0JLMkYsIChUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMkZpbHRlcikpOworICAgIE1PRElGWV9SRUcodG1wYmR0ciwgVElNX0JEVFJfQksyRSwgVElNX0JEVFJJbml0U3RydWN0LT5CcmVhazJTdGF0ZSk7CisgICAgTU9ESUZZX1JFRyh0bXBiZHRyLCBUSU1fQkRUUl9CSzJQLCBUSU1fQkRUUkluaXRTdHJ1Y3QtPkJyZWFrMlBvbGFyaXR5KTsKKyAgfQorCisgIC8qIFNldCBUSU14X0JEVFIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIEJEVFIsIHRtcGJkdHIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFRJTV9MTF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0MxQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDMUUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzFFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NFUik7CisKKyAgLyogR2V0IHRoZSBUSU14IENSMiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjcjIgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDUjIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMSByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMSA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIxKTsKKworICAvKiBSZXNldCBDYXB0dXJlL0NvbXBhcmUgc2VsZWN0aW9uIEJpdHMgKi8KKyAgQ0xFQVJfQklUKHRtcGNjbXIxLCBUSU1fQ0NNUjFfQ0MxUyk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovCisgIE1PRElGWV9SRUcodG1wY2NtcjEsIFRJTV9DQ01SMV9PQzFNLCBUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IENvbXBhcmUgUG9sYXJpdHkgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzFQLCBUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMUUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpOworCisgIGlmIChJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkpCisgIHsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTklkbGVTdGF0ZSkpOworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUpKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgUG9sYXJpdHkgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDMU5QLCBUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSA8PCAyVSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzFORSwgVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUgPDwgMlUpOworCisgICAgLyogU2V0IHRoZSBPdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzEsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKTsKKworICAgIC8qIFNldCB0aGUgY29tcGxlbWVudGFyeSBvdXRwdXQgSWRsZSBzdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY3IyLCBUSU1fQ1IyX09JUzFOLCBUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUgPDwgMVUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENSMiwgdG1wY3IyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIxICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMSwgdG1wY2NtcjEpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxKFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMi4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgMiBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0MyQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIxOworICB1aW50MzJfdCB0bXBjY2VyOworICB1aW50MzJfdCB0bXBjcjI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DTU9ERShUSU1fT0NJbml0U3RydWN0LT5PQ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ1NUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlN0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIENMRUFSX0JJVChUSU14LT5DQ0VSLCBUSU1fQ0NFUl9DQzJFKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NFUiByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY2VyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ1IyKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ0NNUjEgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NtcjEgPSBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ01SMSk7CisKKyAgLyogUmVzZXQgQ2FwdHVyZS9Db21wYXJlIHNlbGVjdGlvbiBCaXRzICovCisgIENMRUFSX0JJVCh0bXBjY21yMSwgVElNX0NDTVIxX0NDMlMpOworCisgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLworICBNT0RJRllfUkVHKHRtcGNjbXIxLCBUSU1fQ0NNUjFfT0MyTSwgVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlIDw8IDhVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5ICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MyUCwgVElNX09DSW5pdFN0cnVjdC0+T0NQb2xhcml0eSA8PCA0VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgU3RhdGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJFLCBUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlIDw8IDRVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFBvbGFyaXR5ICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzJOUCwgVElNX09DSW5pdFN0cnVjdC0+T0NOUG9sYXJpdHkgPDwgNlUpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBTdGF0ZSAqLworICAgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MyTkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlN0YXRlIDw8IDZVKTsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMiwgVElNX0NSMl9PSVMyLCBUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSA8PCAyVSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMiwgVElNX0NSMl9PSVMyTiwgVElNX09DSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlIDw8IDNVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMSAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjEsIHRtcGNjbXIxKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMihUSU14LCBUSU1fT0NJbml0U3RydWN0LT5Db21wYXJlVmFsdWUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDMuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDMgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIE9DM0NvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjY21yMjsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05TdGF0ZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DUE9MQVJJVFkoVElNX09DSW5pdFN0cnVjdC0+T0NOUG9sYXJpdHkpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDM6IFJlc2V0IHRoZSBDQzNFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0MzRSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9ICBMTF9USU1fUmVhZFJlZyhUSU14LCBDQ0VSKTsKKworICAvKiBHZXQgdGhlIFRJTXggQ1IyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNyMiA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjIpOworCisgIC8qIFJlc2V0IENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICBDTEVBUl9CSVQodG1wY2NtcjIsIFRJTV9DQ01SMl9DQzNTKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMiwgVElNX0NDTVIyX09DM00sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDM1AsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgOFUpOworCisgIC8qIFNldCB0aGUgT3V0cHV0IFN0YXRlICovCisgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MzRSwgVElNX09DSW5pdFN0cnVjdC0+T0NTdGF0ZSA8PCA4VSk7CisKKyAgaWYgKElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NJRExFU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlKSk7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSkpOworCisgICAgLyogU2V0IHRoZSBjb21wbGVtZW50YXJ5IG91dHB1dCBQb2xhcml0eSAqLworICAgIE1PRElGWV9SRUcodG1wY2NlciwgVElNX0NDRVJfQ0MzTlAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTlBvbGFyaXR5IDw8IDEwVSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IFN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjY2VyLCBUSU1fQ0NFUl9DQzNORSwgVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUgPDwgMTBVKTsKKworICAgIC8qIFNldCB0aGUgT3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMiwgVElNX0NSMl9PSVMzLCBUSU1fT0NJbml0U3RydWN0LT5PQ0lkbGVTdGF0ZSA8PCA0VSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbXBsZW1lbnRhcnkgb3V0cHV0IElkbGUgc3RhdGUgKi8KKyAgICBNT0RJRllfUkVHKHRtcGNyMiwgVElNX0NSMl9PSVMzTiwgVElNX09DSW5pdFN0cnVjdC0+T0NOSWRsZVN0YXRlIDw8IDVVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ1IyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDUjIsIHRtcGNyMik7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ01SMiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NNUjIsIHRtcGNjbXIyKTsKKworICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLworICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMyhUSU14LCBUSU1fT0NJbml0U3RydWN0LT5Db21wYXJlVmFsdWUpOworCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NFUiAqLworICBMTF9USU1fV3JpdGVSZWcoVElNeCwgQ0NFUiwgdG1wY2Nlcik7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDQuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fT0NJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IG91dHB1dCBjaGFubmVsIDQgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIE9DNENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX09DX0luaXRUeXBlRGVmICpUSU1fT0NJbml0U3RydWN0KQoreworICB1aW50MzJfdCB0bXBjY21yMjsKKyAgdWludDMyX3QgdG1wY2NlcjsKKyAgdWludDMyX3QgdG1wY3IyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDQ6IFJlc2V0IHRoZSBDQzRFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M0RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDUjIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY3IyID0gIExMX1RJTV9SZWFkUmVnKFRJTXgsIENSMik7CisKKyAgLyogR2V0IHRoZSBUSU14IENDTVIyIHJlZ2lzdGVyIHZhbHVlICovCisgIHRtcGNjbXIyID0gTExfVElNX1JlYWRSZWcoVElNeCwgQ0NNUjIpOworCisgIC8qIFJlc2V0IENhcHR1cmUvQ29tcGFyZSBzZWxlY3Rpb24gQml0cyAqLworICBDTEVBUl9CSVQodG1wY2NtcjIsIFRJTV9DQ01SMl9DQzRTKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMiwgVElNX0NDTVIyX09DNE0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNFAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMTJVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNEUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMTJVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyh0bXBjcjIsIFRJTV9DUjJfT0lTNCwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgNlUpOworICB9CisKKyAgLyogV3JpdGUgdG8gVElNeCBDUjIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENSMiwgdG1wY3IyKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDTVIyICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMiwgdG1wY2NtcjIpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g0KFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNS4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0M1Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIzOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDU6IFJlc2V0IHRoZSBDQzVFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M1RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMyByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMyA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIzKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMywgVElNX0NDTVIzX09DNU0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNVAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMTZVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNUUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMTZVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfT0lTNSwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgOFUpOworCisgIH0KKworICAvKiBXcml0ZSB0byBUSU14IENDTVIzICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ01SMywgdG1wY2NtcjMpOworCisgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovCisgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1KFRJTXgsIFRJTV9PQ0luaXRTdHJ1Y3QtPkNvbXBhcmVWYWx1ZSk7CisKKyAgLyogV3JpdGUgdG8gVElNeCBDQ0VSICovCisgIExMX1RJTV9Xcml0ZVJlZyhUSU14LCBDQ0VSLCB0bXBjY2VyKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNi4KKyAgKiBAcGFyYW0gIFRJTXggVGltZXIgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIFRJTV9PQ0luaXRTdHJ1Y3QgcG9pbnRlciB0byB0aGUgdGhlIFRJTXggb3V0cHV0IGNoYW5uZWwgNiBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgT0M2Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fT0NfSW5pdFR5cGVEZWYgKlRJTV9PQ0luaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHRtcGNjbXIzOworICB1aW50MzJfdCB0bXBjY2VyOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ01PREUoVElNX09DSW5pdFN0cnVjdC0+T0NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ1N0YXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fT0NQT0xBUklUWShUSU1fT0NJbml0U3RydWN0LT5PQ05Qb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DU1RBVEUoVElNX09DSW5pdFN0cnVjdC0+T0NOU3RhdGUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDU6IFJlc2V0IHRoZSBDQzZFIEJpdCAqLworICBDTEVBUl9CSVQoVElNeC0+Q0NFUiwgVElNX0NDRVJfQ0M2RSk7CisKKyAgLyogR2V0IHRoZSBUSU14IENDRVIgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgdG1wY2NlciA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDRVIpOworCisgIC8qIEdldCB0aGUgVElNeCBDQ01SMyByZWdpc3RlciB2YWx1ZSAqLworICB0bXBjY21yMyA9IExMX1RJTV9SZWFkUmVnKFRJTXgsIENDTVIzKTsKKworICAvKiBTZWxlY3QgdGhlIE91dHB1dCBDb21wYXJlIE1vZGUgKi8KKyAgTU9ESUZZX1JFRyh0bXBjY21yMywgVElNX0NDTVIzX09DNk0sIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DTW9kZSA8PCA4VSk7CisKKyAgLyogU2V0IHRoZSBPdXRwdXQgQ29tcGFyZSBQb2xhcml0eSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNlAsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DUG9sYXJpdHkgPDwgMjBVKTsKKworICAvKiBTZXQgdGhlIE91dHB1dCBTdGF0ZSAqLworICBNT0RJRllfUkVHKHRtcGNjZXIsIFRJTV9DQ0VSX0NDNkUsIFRJTV9PQ0luaXRTdHJ1Y3QtPk9DU3RhdGUgPDwgMjBVKTsKKworICBpZiAoSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpKQorICB7CisgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9PQ0lETEVTVEFURShUSU1fT0NJbml0U3RydWN0LT5PQ05JZGxlU3RhdGUpKTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX09DSURMRVNUQVRFKFRJTV9PQ0luaXRTdHJ1Y3QtPk9DSWRsZVN0YXRlKSk7CisKKyAgICAvKiBTZXQgdGhlIE91dHB1dCBJZGxlIHN0YXRlICovCisgICAgTU9ESUZZX1JFRyhUSU14LT5DUjIsIFRJTV9DUjJfT0lTNiwgVElNX09DSW5pdFN0cnVjdC0+T0NJZGxlU3RhdGUgPDwgMTBVKTsKKyAgfQorCisgIC8qIFdyaXRlIHRvIFRJTXggQ0NNUjMgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDTVIzLCB0bXBjY21yMyk7CisKKyAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8KKyAgTExfVElNX09DX1NldENvbXBhcmVDSDYoVElNeCwgVElNX09DSW5pdFN0cnVjdC0+Q29tcGFyZVZhbHVlKTsKKworICAvKiBXcml0ZSB0byBUSU14IENDRVIgKi8KKyAgTExfVElNX1dyaXRlUmVnKFRJTXgsIENDRVIsIHRtcGNjZXIpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDEuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgSUMxQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWShUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAxOiBSZXNldCB0aGUgQ0MxRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpflRJTV9DQ0VSX0NDMUU7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgYW5kIHRoZSBwcmVzY2FsZXIgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ01SMSwKKyAgICAgICAgICAgICAoVElNX0NDTVIxX0NDMVMgfCBUSU1fQ0NNUjFfSUMxRiB8IFRJTV9DQ01SMV9JQzFQU0MpLAorICAgICAgICAgICAgIChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0IHwgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgfCBUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikgPj4gMTZVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMUUgQml0ICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSB8IFRJTV9DQ0VSX0NDMUUpKTsKKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFRJTXggaW5wdXQgY2hhbm5lbCAyLgorICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQorICAqIEBwYXJhbSAgVElNX0lDSW5pdFN0cnVjdCBwb2ludGVyIHRvIHRoZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDIgY29uZmlndXJhdGlvbiBkYXRhIHN0cnVjdHVyZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBUSU14IHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBub3QgYXBwbGljYWJsZQorICAqLworc3RhdGljIEVycm9yU3RhdHVzIElDMkNvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgTExfVElNX0lDX0luaXRUeXBlRGVmICpUSU1fSUNJbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0FDVElWRUlOUFVUKFRJTV9JQ0luaXRTdHJ1Y3QtPklDQWN0aXZlSW5wdXQpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ1BTQyhUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5JQ0ZpbHRlcikpOworCisgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMjogUmVzZXQgdGhlIENDMkUgQml0ICovCisgIFRJTXgtPkNDRVIgJj0gKHVpbnQzMl90KX5USU1fQ0NFUl9DQzJFOworCisgIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyIGFuZCB0aGUgcHJlc2NhbGVyIHZhbHVlICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NNUjEsCisgICAgICAgICAgICAgKFRJTV9DQ01SMV9DQzJTIHwgVElNX0NDTVIxX0lDMkYgfCBUSU1fQ0NNUjFfSUMyUFNDKSwKKyAgICAgICAgICAgICAoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCB8IFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyIHwgVElNX0lDSW5pdFN0cnVjdC0+SUNQcmVzY2FsZXIpID4+IDhVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDMkUgQml0ICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSwKKyAgICAgICAgICAgICAoKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgPDwgNFUpIHwgVElNX0NDRVJfQ0MyRSkpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDMuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgMyBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgSUMzQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWShUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAzOiBSZXNldCB0aGUgQ0MzRSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpflRJTV9DQ0VSX0NDM0U7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgYW5kIHRoZSBwcmVzY2FsZXIgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ01SMiwKKyAgICAgICAgICAgICAoVElNX0NDTVIyX0NDM1MgfCBUSU1fQ0NNUjJfSUMzRiB8IFRJTV9DQ01SMl9JQzNQU0MpLAorICAgICAgICAgICAgIChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0IHwgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgfCBUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikgPj4gMTZVKTsKKworICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5IGFuZCBzZXQgdGhlIENDM0UgQml0ICovCisgIE1PRElGWV9SRUcoVElNeC0+Q0NFUiwKKyAgICAgICAgICAgICAoVElNX0NDRVJfQ0MzUCB8IFRJTV9DQ0VSX0NDM05QKSwKKyAgICAgICAgICAgICAoKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUG9sYXJpdHkgPDwgOFUpIHwgVElNX0NDRVJfQ0MzRSkpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgVElNeCBpbnB1dCBjaGFubmVsIDQuCisgICogQHBhcmFtICBUSU14IFRpbWVyIEluc3RhbmNlCisgICogQHBhcmFtICBUSU1fSUNJbml0U3RydWN0IHBvaW50ZXIgdG8gdGhlIHRoZSBUSU14IGlucHV0IGNoYW5uZWwgNCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFRJTXggcmVnaXN0ZXJzIGFyZSBkZS1pbml0aWFsaXplZAorICAqICAgICAgICAgIC0gRVJST1I6IG5vdCBhcHBsaWNhYmxlCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgSUM0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCBMTF9USU1fSUNfSW5pdFR5cGVEZWYgKlRJTV9JQ0luaXRTdHJ1Y3QpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1RJTV9JQ19QT0xBUklUWShUSU1fSUNJbml0U3RydWN0LT5JQ1BvbGFyaXR5KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fQUNUSVZFSU5QVVQoVElNX0lDSW5pdFN0cnVjdC0+SUNBY3RpdmVJbnB1dCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVElNX0lDUFNDKFRJTV9JQ0luaXRTdHJ1Y3QtPklDUHJlc2NhbGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9USU1fSUNfRklMVEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPklDRmlsdGVyKSk7CisKKyAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0M0RSBCaXQgKi8KKyAgVElNeC0+Q0NFUiAmPSAodWludDMyX3QpflRJTV9DQ0VSX0NDNEU7CisKKyAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgYW5kIHRoZSBwcmVzY2FsZXIgdmFsdWUgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ01SMiwKKyAgICAgICAgICAgICAoVElNX0NDTVIyX0NDNFMgfCBUSU1fQ0NNUjJfSUM0RiB8IFRJTV9DQ01SMl9JQzRQU0MpLAorICAgICAgICAgICAgIChUSU1fSUNJbml0U3RydWN0LT5JQ0FjdGl2ZUlucHV0IHwgVElNX0lDSW5pdFN0cnVjdC0+SUNGaWx0ZXIgfCBUSU1fSUNJbml0U3RydWN0LT5JQ1ByZXNjYWxlcikgPj4gOFUpOworCisgIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgYW5kIHNldCB0aGUgQ0MyRSBCaXQgKi8KKyAgTU9ESUZZX1JFRyhUSU14LT5DQ0VSLAorICAgICAgICAgICAgIChUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApLAorICAgICAgICAgICAgICgoVElNX0lDSW5pdFN0cnVjdC0+SUNQb2xhcml0eSA8PCAxMlUpIHwgVElNX0NDRVJfQ0M0RSkpOworCisgIHJldHVybiBTVUNDRVNTOworfQorCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBUSU0xIHx8IFRJTTIgfHwgVElNMTYgfHwgVElNMTcgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF91c2FydC5jIGIvU3JjL3N0bTMyd2J4eF9sbF91c2FydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTc4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX3VzYXJ0LmMKQEAgLTAsMCArMSwzODkgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfdXNhcnQuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVVNBUlQgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisjaWYgZGVmaW5lZChVU0VfRlVMTF9MTF9EUklWRVIpCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3VzYXJ0LmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3JjYy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9idXMuaCIKKyNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjZWxzZQorI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQorI2VuZGlmCisKKy8qKiBAYWRkdG9ncm91cCBTVE0zMldCeHhfTExfRHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmIGRlZmluZWQgKFVTQVJUMSkKKworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX1ByaXZhdGVfQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX1ByaXZhdGVfTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19MTF9VU0FSVF9QUkVTQ0FMRVIoX19WQUxVRV9fKSAgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMTApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjEyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QUkVTQ0FMRVJfRElWMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjY0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxMjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUFJFU0NBTEVSX0RJVjI1NikpCisKKy8qIF9fQkFVRFJBVEVfXyBUaGUgbWF4aW11bSBCYXVkIFJhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBtYXhpbXVtIGNsb2NrIGF2YWlsYWJsZQorICogICAgICAgICAgICAgIGRpdmlkZWQgYnkgdGhlIHNtYWxsZXN0IG92ZXJzYW1wbGluZyB1c2VkIG9uIHRoZSBVU0FSVCAoaS5lLiA4KSAgICAqLworI2RlZmluZSBJU19MTF9VU0FSVF9CQVVEUkFURShfX0JBVURSQVRFX18pICgoX19CQVVEUkFURV9fKSA8PSA4MDAwMDAwVSkKKworLyogX19WQUxVRV9fIEluIGNhc2Ugb2Ygb3ZlcnNhbXBsaW5nIGJ5IDE2IGFuZCA4LCBCUlIgY29udGVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQuICovCisjZGVmaW5lIElTX0xMX1VTQVJUX0JSUl9NSU4oX19WQUxVRV9fKSAoKF9fVkFMVUVfXykgPj0gMTZVKQorCisvKiBfX1ZBTFVFX18gQlJSIGNvbnRlbnQgbXVzdCBiZSBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRi4gKi8KKyNkZWZpbmUgSVNfTExfVVNBUlRfQlJSX01BWChfX1ZBTFVFX18pICgoX19WQUxVRV9fKSA8PSAweDAwMDBGRkZGVSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9ESVJFQ1RJT04oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1JYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9QQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BBUklUWV9OT05FKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX0VWRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfT0REKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9EQVRBV0lEVEgoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF83QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF84QikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF85QikpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfTEFTVEJJVENMS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUKSkKKworI2RlZmluZSBJU19MTF9VU0FSVF9DTE9DS1BIQVNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8xRURHRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8yRURHRSkpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUE9MQVJJVFlfTE9XKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BPTEFSSVRZX0hJR0gpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX0NMT0NLT1VUUFVUKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9DTE9DS19FTkFCTEUpKQorCisjZGVmaW5lIElTX0xMX1VTQVJUX1NUT1BCSVRTKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18wXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzFfNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMikpCisKKyNkZWZpbmUgSVNfTExfVVNBUlRfSFdDT05UUk9MKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBVU0FSVF9MTF9FRl9Jbml0CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBEZS1pbml0aWFsaXplIFVTQVJUIHJlZ2lzdGVycyAoUmVnaXN0ZXJzIHJlc3RvcmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBVU0FSVCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogVVNBUlQgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX1VTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisKKyAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgIHsKKyAgICAvKiBGb3JjZSByZXNldCBvZiBVU0FSVCBjbG9jayAqLworICAgIExMX0FQQjJfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgVVNBUlQgY2xvY2sgKi8KKyAgICBMTF9BUEIyX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjJfR1JQMV9QRVJJUEhfVVNBUlQxKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIFVTQVJUIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICAqICAgICAgICAgcGFyYW1ldGVycyBpbiBVU0FSVF9Jbml0U3RydWN0LgorICAqIEBub3RlICAgQXMgc29tZSBiaXRzIGluIFVTQVJUIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgVVNBUlQgaXMgZGlzYWJsZWQgKFVTQVJUX0NSMV9VRSBiaXQgPTApLAorICAqICAgICAgICAgVVNBUlQgSVAgc2hvdWxkIGJlIGluIGRpc2FibGVkIHN0YXRlIHByaW9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBFUlJPUiByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KKyAgKiBAbm90ZSAgIEJhdWQgcmF0ZSB2YWx1ZSBzdG9yZWQgaW4gVVNBUlRfSW5pdFN0cnVjdCBCYXVkUmF0ZSBmaWVsZCwgc2hvdWxkIGJlIHZhbGlkIChkaWZmZXJlbnQgZnJvbSAwKS4KKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVVNBUlRfSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgTExfVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlCisgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IFVTQVJUIHJlZ2lzdGVycyBhcmUgaW5pdGlhbGl6ZWQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmICpVU0FSVHgsIExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsKKyAgdWludDMyX3QgcGVyaXBoY2xrID0gTExfUkNDX1BFUklQSF9GUkVRVUVOQ1lfTk87CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9QUkVTQ0FMRVIoVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JBVURSQVRFKFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9EQVRBV0lEVEgoVVNBUlRfSW5pdFN0cnVjdC0+RGF0YVdpZHRoKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9TVE9QQklUUyhVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cykpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfUEFSSVRZKFVTQVJUX0luaXRTdHJ1Y3QtPlBhcml0eSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfRElSRUNUSU9OKFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9IV0NPTlRST0woVVNBUlRfSW5pdFN0cnVjdC0+SGFyZHdhcmVGbG93Q29udHJvbCkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfT1ZFUlNBTVBMSU5HKFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZykpOworCisgIC8qIFVTQVJUIG5lZWRzIHRvIGJlIGluIGRpc2FibGVkIHN0YXRlLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGJpdHMgaW4KKyAgICAgQ1J4IHJlZ2lzdGVycyAqLworICBpZiAoTExfVVNBUlRfSXNFbmFibGVkKFVTQVJUeCkgPT0gMFUpCisgIHsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjEgKFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHksIE1vZGUgYW5kIE92ZXJzYW1wbGluZyBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICogLSBEYXRhV2lkdGg6ICAgICAgICAgIFVTQVJUX0NSMV9NIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCB2YWx1ZQorICAgICAqIC0gUGFyaXR5OiAgICAgICAgICAgICBVU0FSVF9DUjFfUENFLCBVU0FSVF9DUjFfUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSW5pdFN0cnVjdC0+UGFyaXR5IHZhbHVlCisgICAgICogLSBUcmFuc2ZlckRpcmVjdGlvbjogIFVTQVJUX0NSMV9URSwgVVNBUlRfQ1IxX1JFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHZhbHVlCisgICAgICogLSBPdmVyc2FtcGxpbmc6ICAgICAgIFVTQVJUX0NSMV9PVkVSOCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBNT0RJRllfUkVHKFVTQVJUeC0+Q1IxLAorICAgICAgICAgICAgICAgKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyB8CisgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX09WRVI4KSwKKyAgICAgICAgICAgICAgIChVU0FSVF9Jbml0U3RydWN0LT5EYXRhV2lkdGggfCBVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkgfAorICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPlRyYW5zZmVyRGlyZWN0aW9uIHwgVVNBUlRfSW5pdFN0cnVjdC0+T3ZlclNhbXBsaW5nKSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjIgKFN0b3AgYml0cykgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gU3RvcCBCaXRzOiAgICAgICAgICBVU0FSVF9DUjJfU1RPUCBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyB2YWx1ZS4KKyAgICAgKiAtIENMS0VOLCBDUE9MLCBDUEhBIGFuZCBMQkNMIGJpdHMgYXJlIHRvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgTExfVVNBUlRfQ2xvY2tJbml0KCkuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0U3RvcEJpdHNMZW5ndGgoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5TdG9wQml0cyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29uZmlndXJlIFVTQVJUeCBDUjMgKEhhcmR3YXJlIEZsb3cgQ29udHJvbCkgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gSGFyZHdhcmVGbG93Q29udHJvbDogVVNBUlRfQ1IzX1JUU0UsIFVTQVJUX0NSM19DVFNFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUuCisgICAgICovCisgICAgTExfVVNBUlRfU2V0SFdGbG93Q3RybChVU0FSVHgsIFVTQVJUX0luaXRTdHJ1Y3QtPkhhcmR3YXJlRmxvd0NvbnRyb2wpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHJpZXZlIENsb2NrIGZyZXF1ZW5jeSB1c2VkIGZvciBVU0FSVCBQZXJpcGhlcmFsCisgICAgICovCisgICAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpCisgICAgeworICAgICAgcGVyaXBoY2xrID0gTExfUkNDX0dldFVTQVJUQ2xvY2tGcmVxKExMX1JDQ19VU0FSVDFfQ0xLU09VUkNFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8sIGFzIGVycm9yIGNvZGUgaXMgYWxyZWFkeSBhc3NpZ25lZCB0byBFUlJPUiB2YWx1ZSAqLworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQmF1ZCBSYXRlIDoKKyAgICAgICAtIHByZXNjYWxlciB2YWx1ZSBpcyByZXF1aXJlZAorICAgICAgIC0gdmFsaWQgYmF1ZCByYXRlIHZhbHVlIChkaWZmZXJlbnQgZnJvbSAwKSBpcyByZXF1aXJlZAorICAgICAgIC0gUGVyaXBoZXJhbCBjbG9jayBhcyByZXR1cm5lZCBieSBSQ0Mgc2VydmljZSwgc2hvdWxkIGJlIHZhbGlkIChkaWZmZXJlbnQgZnJvbSAwKS4KKyAgICAqLworICAgIGlmICgocGVyaXBoY2xrICE9IExMX1JDQ19QRVJJUEhfRlJFUVVFTkNZX05PKQorICAgICAgICAmJiAoVVNBUlRfSW5pdFN0cnVjdC0+QmF1ZFJhdGUgIT0gMFUpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFNVQ0NFU1M7CisgICAgICBMTF9VU0FSVF9TZXRCYXVkUmF0ZShVU0FSVHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpcGhjbGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPkJhdWRSYXRlKTsKKworICAgICAgLyogQ2hlY2sgQlJSIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNmQgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9CUlJfTUlOKFVTQVJUeC0+QlJSKSk7CisKKyAgICAgIC8qIENoZWNrIEJSUiBpcyBsb3dlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRiAqLworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0JSUl9NQVgoVVNBUlR4LT5CUlIpKTsKKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgUFJFU0MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbmZpZ3VyZSBVU0FSVHggUFJFU0MgKFByZXNjYWxlcikgd2l0aCBwYXJhbWV0ZXJzOgorICAgICAqIC0gUHJlc2NhbGVyVmFsdWU6IFVTQVJUX1BSRVNDX1BSRVNDQUxFUiBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBMTF9VU0FSVF9TZXRQcmVzY2FsZXIoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5QcmVzY2FsZXJWYWx1ZSk7CisgIH0KKyAgLyogRW5kaWYgKD0+IFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IpICovCisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgU2V0IGVhY2ggQHJlZiBMTF9VU0FSVF9Jbml0VHlwZURlZiBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VTQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKwordm9pZCBMTF9VU0FSVF9TdHJ1Y3RJbml0KExMX1VTQVJUX0luaXRUeXBlRGVmICpVU0FSVF9Jbml0U3RydWN0KQoreworICAvKiBTZXQgVVNBUlRfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgVVNBUlRfSW5pdFN0cnVjdC0+UHJlc2NhbGVyVmFsdWUgICAgICA9IExMX1VTQVJUX1BSRVNDQUxFUl9ESVYxOworICBVU0FSVF9Jbml0U3RydWN0LT5CYXVkUmF0ZSAgICAgICAgICAgID0gOTYwMFU7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPkRhdGFXaWR0aCAgICAgICAgICAgPSBMTF9VU0FSVF9EQVRBV0lEVEhfOEI7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPlN0b3BCaXRzICAgICAgICAgICAgPSBMTF9VU0FSVF9TVE9QQklUU18xOworICBVU0FSVF9Jbml0U3RydWN0LT5QYXJpdHkgICAgICAgICAgICAgID0gTExfVVNBUlRfUEFSSVRZX05PTkUgOworICBVU0FSVF9Jbml0U3RydWN0LT5UcmFuc2ZlckRpcmVjdGlvbiAgID0gTExfVVNBUlRfRElSRUNUSU9OX1RYX1JYOworICBVU0FSVF9Jbml0U3RydWN0LT5IYXJkd2FyZUZsb3dDb250cm9sID0gTExfVVNBUlRfSFdDT05UUk9MX05PTkU7CisgIFVTQVJUX0luaXRTdHJ1Y3QtPk92ZXJTYW1wbGluZyAgICAgICAgPSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfMTY7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5pdGlhbGl6ZSBVU0FSVCBDbG9jayByZWxhdGVkIHNldHRpbmdzIGFjY29yZGluZyB0byB0aGUKKyAgKiAgICAgICAgIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QuCisgICogQG5vdGUgICBBcyBzb21lIGJpdHMgaW4gVVNBUlQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBVU0FSVCBpcyBkaXNhYmxlZCAoVVNBUlRfQ1IxX1VFIGJpdCA9MCksCisgICogICAgICAgICBVU0FSVCBJUCBzaG91bGQgYmUgaW4gZGlzYWJsZWQgc3RhdGUgcHJpb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIEVSUk9SIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkLgorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIENsb2NrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogVVNBUlQgcmVnaXN0ZXJzIHJlbGF0ZWQgdG8gQ2xvY2sgc2V0dGluZ3MgYXJlIGluaXRpYWxpemVkIGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgY29udGVudAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIFVTQVJUIFJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgorICAqLworRXJyb3JTdGF0dXMgTExfVVNBUlRfQ2xvY2tJbml0KFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiAqVVNBUlRfQ2xvY2tJbml0U3RydWN0KQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIFVTQVJUIEluc3RhbmNlIGFuZCBDbG9jayBzaWduYWwgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfSU5TVEFOQ0UoVVNBUlR4KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS09VVFBVVChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0KSk7CisKKyAgLyogVVNBUlQgbmVlZHMgdG8gYmUgaW4gZGlzYWJsZWQgc3RhdGUsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIHNvbWUgYml0cyBpbgorICAgICBDUnggcmVnaXN0ZXJzICovCisgIGlmIChMTF9VU0FSVF9Jc0VuYWJsZWQoVVNBUlR4KSA9PSAwVSkKKyAgeworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogSWYgQ2xvY2sgc2lnbmFsIGhhcyB0byBiZSBvdXRwdXQgKi8KKyAgICBpZiAoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja091dHB1dCA9PSBMTF9VU0FSVF9DTE9DS19ESVNBQkxFKQorICAgIHsKKyAgICAgIC8qIERlYWN0aXZhdGUgQ2xvY2sgc2lnbmFsIGRlbGl2ZXJ5IDoKKyAgICAgICAqIC0gRGlzYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICBVU0FSVF9DUjJfQ0xLRU4gY2xlYXJlZAorICAgICAgICovCisgICAgICBMTF9VU0FSVF9EaXNhYmxlU0NMS091dHB1dChVU0FSVHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5zdXJlIFVTQVJUIGluc3RhbmNlIGlzIFVTQVJUIGNhcGFibGUgKi8KKyAgICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9JTlNUQU5DRShVU0FSVHgpKTsKKworICAgICAgLyogQ2hlY2sgY2xvY2sgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgICBhc3NlcnRfcGFyYW0oSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUG9sYXJpdHkpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19MTF9VU0FSVF9DTE9DS1BIQVNFKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+Q2xvY2tQaGFzZSkpOworICAgICAgYXNzZXJ0X3BhcmFtKElTX0xMX1VTQVJUX0xBU1RCSVRDTEtPVVRQVVQoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSkpOworCisgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAqIENvbmZpZ3VyZSBVU0FSVHggQ1IyIChDbG9jayBzaWduYWwgcmVsYXRlZCBiaXRzKSB3aXRoIHBhcmFtZXRlcnM6CisgICAgICAgKiAtIEVuYWJsZSBDbG9jayBPdXRwdXQ6ICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHNldAorICAgICAgICogLSBDbG9jayBQb2xhcml0eTogICAgICAgICAgICAgIFVTQVJUX0NSMl9DUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHZhbHVlCisgICAgICAgKiAtIENsb2NrIFBoYXNlOiAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrUGhhc2UgdmFsdWUKKyAgICAgICAqIC0gTGFzdCBCaXQgQ2xvY2sgUHVsc2UgT3V0cHV0OiBVU0FSVF9DUjJfTEJDTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+TGFzdEJpdENsb2NrUHVsc2UgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIE1PRElGWV9SRUcoVVNBUlR4LT5DUjIsCisgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0NQT0wgfCBVU0FSVF9DUjJfTEJDTCwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5IHwKKyAgICAgICAgICAgICAgICAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSk7CisgICAgfQorICB9CisgIC8qIEVsc2UgKFVTQVJUIG5vdCBpbiBEaXNhYmxlZCBzdGF0ZSA9PiByZXR1cm4gRVJST1IgKi8KKyAgZWxzZQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKgorICAqIEBicmllZiBTZXQgZWFjaCBmaWVsZCBvZiBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiB0eXBlIHN0cnVjdHVyZSB0byBkZWZhdWx0IHZhbHVlLgorICAqIEBwYXJhbSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVNBUlRfQ2xvY2tJbml0VHlwZURlZiBzdHJ1Y3R1cmUKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIGZpZWxkcyB3aWxsIGJlIHNldCB0byBkZWZhdWx0IHZhbHVlcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KExMX1VTQVJUX0Nsb2NrSW5pdFR5cGVEZWYgKlVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkKK3sKKyAgLyogU2V0IExMX1VTQVJUX0Nsb2NrSW5pdFN0cnVjdCBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcyAqLworICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPkNsb2NrT3V0cHV0ICAgICAgID0gTExfVVNBUlRfQ0xPQ0tfRElTQUJMRTsKKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BvbGFyaXR5ICAgICA9IExMX1VTQVJUX1BPTEFSSVRZX0xPVzsgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5DbG9ja1BoYXNlICAgICAgICA9IExMX1VTQVJUX1BIQVNFXzFFREdFOyAgICAgICAgICAgICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KKyAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5MYXN0Qml0Q2xvY2tQdWxzZSA9IExMX1VTQVJUX0xBU1RDTEtQVUxTRV9OT19PVVRQVVQ7ICAvKiBOb3QgcmVsZXZhbnQgd2hlbiBDbG9ja091dHB1dCA9IExMX1VTQVJUX0NMT0NLX0RJU0FCTEUgKi8KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIFVTQVJUMSAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCisKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMndieHhfbGxfdXNiLmMgYi9TcmMvc3RtMzJ3Ynh4X2xsX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmI2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX3VzYi5jCkBAIC0wLDAgKzEsODc4IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJ3Ynh4X2xsX3VzYi5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBVU0IgTG93IExheWVyIEhBTCBtb2R1bGUgZHJpdmVyLgorICAqCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZworICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcjoKKyAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBJL08gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCisgIEB2ZXJiYXRpbQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgICAoIykgRmlsbCBwYXJhbWV0ZXJzIG9mIEluaXQgc3RydWN0dXJlIGluIFVTQl9PVEdfQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUuCisKKyAgICAgICgjKSBDYWxsIFVTQl9Db3JlSW5pdCgpIEFQSSB0byBpbml0aWFsaXplIHRoZSBVU0IgQ29yZSBwZXJpcGhlcmFsLgorCisgICAgICAoIykgVGhlIHVwcGVyIEhBTCBIQ0QvUENEIGRyaXZlciB3aWxsIGNhbGwgdGhlIHJpZ2h0IHJvdXRpbmVzIGZvciBpdHMgaW50ZXJuYWwgcHJvY2Vzc2VzLgorCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0xMX1VTQl9EUklWRVIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoSEFMX1BDRF9NT0RVTEVfRU5BQkxFRCkgfHwgZGVmaW5lZCAoSEFMX0hDRF9NT0RVTEVfRU5BQkxFRCkKKyNpZiBkZWZpbmVkIChVU0IpCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVVNCIENvcmUKKyAgKiBAcGFyYW0gIFVTQng6IFVTQiBJbnN0YW5jZQorICAqIEBwYXJhbSAgY2ZnIDogcG9pbnRlciB0byBhIFVTQl9DZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0J4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQ29yZUluaXQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9DZmdUeXBlRGVmIGNmZykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChjZmcpOworCisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9FbmFibGVHbG9iYWxJbnQKKyAgKiAgICAgICAgIEVuYWJsZXMgdGhlIGNvbnRyb2xsZXIncyBHbG9iYWwgSW50IGluIHRoZSBBSEIgQ29uZmlnIHJlZworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VuYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgdWludDE2X3Qgd2ludGVycnVwdG1hc2s7CisKKyAgLyogU2V0IHdpbnRlcnJ1cHRtYXNrIHZhcmlhYmxlICovCisgIHdpbnRlcnJ1cHRtYXNrID0gVVNCX0NOVFJfQ1RSTSAgfCBVU0JfQ05UUl9XS1VQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfU1VTUE0gfCBVU0JfQ05UUl9FUlJNIHwKKyAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9TT0ZNIHwgVVNCX0NOVFJfRVNPRk0gfAorICAgICAgICAgICAgICAgICAgIFVTQl9DTlRSX1JFU0VUTSB8IFVTQl9DTlRSX0wxUkVRTTsKKworICAvKiBTZXQgaW50ZXJydXB0IG1hc2sgKi8KKyAgVVNCeC0+Q05UUiB8PSB3aW50ZXJydXB0bWFzazsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9EaXNhYmxlR2xvYmFsSW50CisgICogICAgICAgICBEaXNhYmxlIHRoZSBjb250cm9sbGVyJ3MgR2xvYmFsIEludCBpbiB0aGUgQUhCIENvbmZpZyByZWcKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGlzYWJsZUdsb2JhbEludChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgdWludDE2X3Qgd2ludGVycnVwdG1hc2s7CisKKyAgLyogU2V0IHdpbnRlcnJ1cHRtYXNrIHZhcmlhYmxlICovCisgIHdpbnRlcnJ1cHRtYXNrID0gVVNCX0NOVFJfQ1RSTSAgfCBVU0JfQ05UUl9XS1VQTSB8CisgICAgICAgICAgICAgICAgICAgVVNCX0NOVFJfU1VTUE0gfCBVU0JfQ05UUl9FUlJNIHwKKyAgICAgICAgICAgICAgICAgICBVU0JfQ05UUl9TT0ZNIHwgVVNCX0NOVFJfRVNPRk0gfAorICAgICAgICAgICAgICAgICAgIFVTQl9DTlRSX1JFU0VUTSB8IFVTQl9DTlRSX0wxUkVRTTsKKworICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayAqLworICBVU0J4LT5DTlRSICY9IH53aW50ZXJydXB0bWFzazsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9TZXRDdXJyZW50TW9kZSA6IFNldCBmdW5jdGlvbmFsIG1vZGUKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIG1vZGUgOiAgY3VycmVudCBjb3JlIG1vZGUKKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSB0aGVzZSB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIFVTQl9ERVZJQ0VfTU9ERTogUGVyaXBoZXJhbCBtb2RlIG1vZGUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXRDdXJyZW50TW9kZShVU0JfVHlwZURlZiAqVVNCeCwgVVNCX01vZGVUeXBlRGVmIG1vZGUpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICBVTlVTRUQobW9kZSk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9EZXZJbml0IDogSW5pdGlhbGl6ZXMgdGhlIFVTQiBjb250cm9sbGVyIHJlZ2lzdGVycworICAqICAgICAgICAgZm9yIGRldmljZSBtb2RlCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBjZmcgIDogcG9pbnRlciB0byBhIFVTQl9DZmdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBVU0J4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRGV2SW5pdChVU0JfVHlwZURlZiAqVVNCeCwgVVNCX0NmZ1R5cGVEZWYgY2ZnKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChjZmcpOworCisgIC8qIEluaXQgRGV2aWNlICovCisgIC8qQ05UUl9GUkVTID0gMSovCisgIFVTQngtPkNOVFIgPSBVU0JfQ05UUl9GUkVTOworCisgIC8qQ05UUl9GUkVTID0gMCovCisgIFVTQngtPkNOVFIgPSAwOworCisgIC8qQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzKi8KKyAgVVNCeC0+SVNUUiA9IDA7CisKKyAgLypTZXQgQnRhYmxlIEFkZHJlc3MqLworICBVU0J4LT5CVEFCTEUgPSBCVEFCTEVfQUREUkVTUzsKKworICAvKiBFbmFibGUgVVNCIERldmljZSBJbnRlcnJ1cHQgbWFzayAqLworICAodm9pZClVU0JfRW5hYmxlR2xvYmFsSW50KFVTQngpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1NldERldlNwZWVkIDpJbml0aWFsaXplcyB0aGUgZGV2aWNlIHNwZWVkCisgICogICAgICAgICBkZXBlbmRpbmcgb24gdGhlIFBIWSB0eXBlIGFuZCB0aGUgZW51bWVyYXRpb24gc3BlZWQgb2YgdGhlIGRldmljZS4KKyAgKiBAcGFyYW0gIFVTQnggIFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgc3BlZWQgIGRldmljZSBzcGVlZAorICAqIEByZXR2YWwgIEhhbCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TZXREZXZTcGVlZChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBzcGVlZCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChzcGVlZCk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0ZsdXNoVHhGaWZvIDogRmx1c2ggYSBUeCBGSUZPCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBudW0gOiBGSUZPIG51bWJlcgorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgZnJvbSAxIHRvIDE1CisgICAgICAgICAgICAxNSBtZWFucyBGbHVzaCBhbGwgVHggRklGT3MKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9GbHVzaFR4RmlmbyhVU0JfVHlwZURlZiAqVVNCeCwgdWludDMyX3QgbnVtKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgVU5VU0VEKG51bSk7CisKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0ZsdXNoUnhGaWZvIDogRmx1c2ggUnggRklGTworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0ZsdXNoUnhGaWZvKFVTQl9UeXBlRGVmICpVU0J4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBBY3RpdmF0ZSBhbmQgY29uZmlndXJlIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBlcDogcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9BY3RpdmF0ZUVuZHBvaW50KFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ID0gSEFMX09LOworICB1aW50MTZfdCB3RXBSZWdWYWw7CisKKyAgd0VwUmVnVmFsID0gUENEX0dFVF9FTkRQT0lOVChVU0J4LCBlcC0+bnVtKSAmIFVTQl9FUF9UX01BU0s7CisKKyAgLyogaW5pdGlhbGl6ZSBFbmRwb2ludCAqLworICBzd2l0Y2ggKGVwLT50eXBlKQorICB7CisgICAgY2FzZSBFUF9UWVBFX0NUUkw6CisgICAgICB3RXBSZWdWYWwgfD0gVVNCX0VQX0NPTlRST0w7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVBfVFlQRV9CVUxLOgorICAgICAgd0VwUmVnVmFsIHw9IFVTQl9FUF9CVUxLOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVQX1RZUEVfSU5UUjoKKyAgICAgIHdFcFJlZ1ZhbCB8PSBVU0JfRVBfSU5URVJSVVBUOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVQX1RZUEVfSVNPQzoKKyAgICAgIHdFcFJlZ1ZhbCB8PSBVU0JfRVBfSVNPQ0hST05PVVM7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBIQUxfRVJST1I7CisgICAgICBicmVhazsKKyAgfQorCisgIFBDRF9TRVRfRU5EUE9JTlQoVVNCeCwgZXAtPm51bSwgd0VwUmVnVmFsIHwgVVNCX0VQX0NUUl9SWCB8IFVTQl9FUF9DVFJfVFgpOworCisgIFBDRF9TRVRfRVBfQUREUkVTUyhVU0J4LCBlcC0+bnVtLCBlcC0+bnVtKTsKKworICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkKKyAgeworICAgIGlmIChlcC0+aXNfaW4gIT0gMFUpCisgICAgeworICAgICAgLypTZXQgdGhlIGVuZHBvaW50IFRyYW5zbWl0IGJ1ZmZlciBhZGRyZXNzICovCisgICAgICBQQ0RfU0VUX0VQX1RYX0FERFJFU1MoVVNCeCwgZXAtPm51bSwgZXAtPnBtYWFkcmVzcyk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJlIE5BSyBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLworICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJlIFRYIEVuZHBvaW50IHRvIGRpc2FibGVkIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLypTZXQgdGhlIGVuZHBvaW50IFJlY2VpdmUgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICAgIFBDRF9TRVRfRVBfUlhfQUREUkVTUyhVU0J4LCBlcC0+bnVtLCBlcC0+cG1hYWRyZXNzKTsKKyAgICAgIC8qU2V0IHRoZSBlbmRwb2ludCBSZWNlaXZlIGJ1ZmZlciBjb3VudGVyKi8KKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKFVTQngsIGVwLT5udW0sIGVwLT5tYXhwYWNrZXQpOworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICAvKiBDb25maWd1cmUgVkFMSUQgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgICB9CisgIH0KKyAgLypEb3VibGUgQnVmZmVyKi8KKyAgZWxzZQorICB7CisgICAgLyogU2V0IHRoZSBlbmRwb2ludCBhcyBkb3VibGUgYnVmZmVyZWQgKi8KKyAgICBQQ0RfU0VUX0VQX0RCVUYoVVNCeCwgZXAtPm51bSk7CisgICAgLyogU2V0IGJ1ZmZlciBhZGRyZXNzIGZvciBkb3VibGUgYnVmZmVyZWQgbW9kZSAqLworICAgIFBDRF9TRVRfRVBfREJVRl9BRERSKFVTQngsIGVwLT5udW0sIGVwLT5wbWFhZGRyMCwgZXAtPnBtYWFkZHIxKTsKKworICAgIGlmIChlcC0+aXNfaW4gPT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQgKi8KKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIC8qIFJlc2V0IHZhbHVlIG9mIHRoZSBkYXRhIHRvZ2dsZSBiaXRzIGZvciB0aGUgZW5kcG9pbnQgb3V0ICovCisgICAgICBQQ0RfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX1ZBTElEKTsKKyAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQgKi8KKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgaWYgKGVwLT50eXBlICE9IEVQX1RZUEVfSVNPQykKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJlIE5BSyBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCAqLworICAgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfTkFLKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29uZmlndXJlIFRYIEVuZHBvaW50IHRvIGRpc2FibGVkIHN0YXRlICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9ESVMpOworICAgICAgfQorCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfRElTKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAgKiBAYnJpZWYgIERlLWFjdGl2YXRlIGFuZCBkZS1pbml0aWFsaXplIGFuIGVuZHBvaW50CisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBlcDogcG9pbnRlciB0byBlbmRwb2ludCBzdHJ1Y3R1cmUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZWFjdGl2YXRlRW5kcG9pbnQoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKQoreworICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkKKyAgeworICAgIGlmIChlcC0+aXNfaW4gIT0gMFUpCisgICAgeworICAgICAgUENEX0NMRUFSX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFBDRF9DTEVBUl9SWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgLyogQ29uZmlndXJlIERJU0FCTEUgc3RhdHVzIGZvciB0aGUgRW5kcG9pbnQqLworICAgICAgUENEX1NFVF9FUF9SWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1JYX0RJUyk7CisgICAgfQorICB9CisgIC8qRG91YmxlIEJ1ZmZlciovCisgIGVsc2UKKyAgeworICAgIGlmIChlcC0+aXNfaW4gPT0gMFUpCisgICAgeworICAgICAgLyogQ2xlYXIgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBJTi9PVVQqLworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICBQQ0RfQ0xFQVJfVFhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKworICAgICAgLyogUmVzZXQgdmFsdWUgb2YgdGhlIGRhdGEgdG9nZ2xlIGJpdHMgZm9yIHRoZSBlbmRwb2ludCBvdXQqLworICAgICAgUENEX1RYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOworICAgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX0RJUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDbGVhciB0aGUgZGF0YSB0b2dnbGUgYml0cyBmb3IgdGhlIGVuZHBvaW50IElOL09VVCovCisgICAgICBQQ0RfQ0xFQVJfUlhfRFRPRyhVU0J4LCBlcC0+bnVtKTsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworICAgICAgUENEX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisgICAgICAvKiBDb25maWd1cmUgRElTQUJMRSBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1RYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfVFhfRElTKTsKKyAgICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9ESVMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0VQU3RhcnRYZmVyIDogc2V0dXAgYW5kIHN0YXJ0cyBhIHRyYW5zZmVyIG92ZXIgYW4gRVAKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGVwOiBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQU3RhcnRYZmVyKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkKK3sKKyAgdWludDE2X3QgcG1hYnVmZmVyOworICB1aW50MzJfdCBsZW47CisKKyAgLyogSU4gZW5kcG9pbnQgKi8KKyAgaWYgKGVwLT5pc19pbiA9PSAxVSkKKyAgeworICAgIC8qTXVsdGkgcGFja2V0IHRyYW5zZmVyKi8KKyAgICBpZiAoZXAtPnhmZXJfbGVuID4gZXAtPm1heHBhY2tldCkKKyAgICB7CisgICAgICBsZW4gPSBlcC0+bWF4cGFja2V0OworICAgICAgZXAtPnhmZXJfbGVuIC09IGxlbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IGVwLT54ZmVyX2xlbjsKKyAgICAgIGVwLT54ZmVyX2xlbiA9IDBVOworICAgIH0KKworICAgIC8qIGNvbmZpZ3VyZSBhbmQgdmFsaWRhdGUgVHggZW5kcG9pbnQgKi8KKyAgICBpZiAoZXAtPmRvdWJsZWJ1ZmZlciA9PSAwVSkKKyAgICB7CisgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgZXAtPnBtYWFkcmVzcywgKHVpbnQxNl90KWxlbik7CisgICAgICBQQ0RfU0VUX0VQX1RYX0NOVChVU0J4LCBlcC0+bnVtLCBsZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIFVTQiBlbmRwb2ludCAqLworICAgICAgaWYgKChQQ0RfR0VUX0VORFBPSU5UKFVTQngsIGVwLT5udW0pICYgVVNCX0VQX0RUT0dfVFgpICE9IDBVKQorICAgICAgeworICAgICAgICAvKiBTZXQgdGhlIERvdWJsZSBidWZmZXIgY291bnRlciBmb3IgcG1hYnVmZmVyMSAqLworICAgICAgICBQQ0RfU0VUX0VQX0RCVUYxX0NOVChVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4sIGxlbik7CisgICAgICAgIHBtYWJ1ZmZlciA9IGVwLT5wbWFhZGRyMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBEb3VibGUgYnVmZmVyIGNvdW50ZXIgZm9yIHBtYWJ1ZmZlcjAgKi8KKyAgICAgICAgUENEX1NFVF9FUF9EQlVGMF9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgICAgICBwbWFidWZmZXIgPSBlcC0+cG1hYWRkcjA7CisgICAgICB9CisgICAgICBVU0JfV3JpdGVQTUEoVVNCeCwgZXAtPnhmZXJfYnVmZiwgcG1hYnVmZmVyLCAodWludDE2X3QpbGVuKTsKKyAgICAgIFBDRF9GcmVlVXNlckJ1ZmZlcihVU0J4LCBlcC0+bnVtLCBlcC0+aXNfaW4pOworICAgIH0KKworICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9WQUxJRCk7CisgIH0KKyAgZWxzZSAvKiBPVVQgZW5kcG9pbnQgKi8KKyAgeworICAgIC8qIE11bHRpIHBhY2tldCB0cmFuc2ZlciovCisgICAgaWYgKGVwLT54ZmVyX2xlbiA+IGVwLT5tYXhwYWNrZXQpCisgICAgeworICAgICAgbGVuID0gZXAtPm1heHBhY2tldDsKKyAgICAgIGVwLT54ZmVyX2xlbiAtPSBsZW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBlcC0+eGZlcl9sZW47CisgICAgICBlcC0+eGZlcl9sZW4gPSAwVTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgYW5kIHZhbGlkYXRlIFJ4IGVuZHBvaW50ICovCisgICAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgICAgeworICAgICAgLypTZXQgUlggYnVmZmVyIGNvdW50Ki8KKyAgICAgIFBDRF9TRVRfRVBfUlhfQ05UKFVTQngsIGVwLT5udW0sIGxlbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKlNldCB0aGUgRG91YmxlIGJ1ZmZlciBjb3VudGVyKi8KKyAgICAgIFBDRF9TRVRfRVBfREJVRl9DTlQoVVNCeCwgZXAtPm51bSwgZXAtPmlzX2luLCBsZW4pOworICAgIH0KKworICAgIFBDRF9TRVRfRVBfUlhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9SWF9WQUxJRCk7CisgIH0KKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9Xcml0ZVBhY2tldCA6IFdyaXRlcyBhIHBhY2tldCBpbnRvIHRoZSBUeCBGSUZPIGFzc29jaWF0ZWQKKyAgKiAgICAgICAgIHdpdGggdGhlIEVQL2NoYW5uZWwKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIHNyYyA6ICBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKyAgKiBAcGFyYW0gIGNoX2VwX251bSA6IGVuZHBvaW50IG9yIGhvc3QgY2hhbm5lbCBudW1iZXIKKyAgKiBAcGFyYW0gIGxlbiA6IE51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX1dyaXRlUGFja2V0KFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgY2hfZXBfbnVtLCB1aW50MTZfdCBsZW4pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICBVTlVTRUQoc3JjKTsKKyAgVU5VU0VEKGNoX2VwX251bSk7CisgIFVOVVNFRChsZW4pOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1JlYWRQYWNrZXQgOiByZWFkIGEgcGFja2V0IGZyb20gdGhlIFR4IEZJRk8gYXNzb2NpYXRlZAorICAqICAgICAgICAgd2l0aCB0aGUgRVAvY2hhbm5lbAorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZGVzdCA6IGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgKiBAcGFyYW0gIGxlbiA6IE51bWJlciBvZiBieXRlcyB0byByZWFkCisgICogQHJldHZhbCBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAqLwordm9pZCAqVVNCX1JlYWRQYWNrZXQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKmRlc3QsIHVpbnQxNl90IGxlbikKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChkZXN0KTsKKyAgVU5VU0VEKGxlbik7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKyAgcmV0dXJuICgodm9pZCAqKU5VTEwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9FUFNldFN0YWxsIDogc2V0IGEgc3RhbGwgY29uZGl0aW9uIG92ZXIgYW4gRVAKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGVwOiBwb2ludGVyIHRvIGVuZHBvaW50IHN0cnVjdHVyZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0VQU2V0U3RhbGwoVVNCX1R5cGVEZWYgKlVTQngsIFVTQl9FUFR5cGVEZWYgKmVwKQoreworICBpZiAoZXAtPmlzX2luICE9IDBVKQorICB7CisgICAgUENEX1NFVF9FUF9UWF9TVEFUVVMoVVNCeCwgZXAtPm51bSwgVVNCX0VQX1RYX1NUQUxMKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfU1RBTEwpOworICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfRVBDbGVhclN0YWxsIDogQ2xlYXIgYSBzdGFsbCBjb25kaXRpb24gb3ZlciBhbiBFUAorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEBwYXJhbSAgZXA6IHBvaW50ZXIgdG8gZW5kcG9pbnQgc3RydWN0dXJlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfRVBDbGVhclN0YWxsKFVTQl9UeXBlRGVmICpVU0J4LCBVU0JfRVBUeXBlRGVmICplcCkKK3sKKyAgaWYgKGVwLT5kb3VibGVidWZmZXIgPT0gMFUpCisgIHsKKyAgICBpZiAoZXAtPmlzX2luICE9IDBVKQorICAgIHsKKyAgICAgIFBDRF9DTEVBUl9UWF9EVE9HKFVTQngsIGVwLT5udW0pOworCisgICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9JU09DKQorICAgICAgeworICAgICAgICAvKiBDb25maWd1cmUgTkFLIHN0YXR1cyBmb3IgdGhlIEVuZHBvaW50ICovCisgICAgICAgIFBDRF9TRVRfRVBfVFhfU1RBVFVTKFVTQngsIGVwLT5udW0sIFVTQl9FUF9UWF9OQUspOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgUENEX0NMRUFSX1JYX0RUT0coVVNCeCwgZXAtPm51bSk7CisKKyAgICAgIC8qIENvbmZpZ3VyZSBWQUxJRCBzdGF0dXMgZm9yIHRoZSBFbmRwb2ludCovCisgICAgICBQQ0RfU0VUX0VQX1JYX1NUQVRVUyhVU0J4LCBlcC0+bnVtLCBVU0JfRVBfUlhfVkFMSUQpOworICAgIH0KKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1N0b3BEZXZpY2UgOiBTdG9wIHRoZSB1c2IgZGV2aWNlIG1vZGUKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9TdG9wRGV2aWNlKFVTQl9UeXBlRGVmICpVU0J4KQoreworICAvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBmb3JjZSBVU0IgcmVzZXQgKi8KKyAgVVNCeC0+Q05UUiA9IFVTQl9DTlRSX0ZSRVM7CisKKyAgLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworICBVU0J4LT5JU1RSID0gMDsKKworICAvKiBzd2l0Y2gtb2ZmIGRldmljZSAqLworICBVU0J4LT5DTlRSID0gKFVTQl9DTlRSX0ZSRVMgfCBVU0JfQ05UUl9QRFdOKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9TZXREZXZBZGRyZXNzIDogU3RvcCB0aGUgdXNiIGRldmljZSBtb2RlCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHBhcmFtICBhZGRyZXNzIDogbmV3IGRldmljZSBhZGRyZXNzIHRvIGJlIGFzc2lnbmVkCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDI1NQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIFVTQl9TZXREZXZBZGRyZXNzKFVTQl9UeXBlRGVmICpVU0J4LCB1aW50OF90IGFkZHJlc3MpCit7CisgIGlmIChhZGRyZXNzID09IDBVKQorICB7CisgICAgLyogc2V0IGRldmljZSBhZGRyZXNzIGFuZCBlbmFibGUgZnVuY3Rpb24gKi8KKyAgICBVU0J4LT5EQUREUiA9IFVTQl9EQUREUl9FRjsKKyAgfQorCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0RldkNvbm5lY3QgOiBDb25uZWN0IHRoZSBVU0IgZGV2aWNlIGJ5IGVuYWJsaW5nIHRoZSBwdWxsLXVwL3B1bGwtZG93bgorICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgIFVTQl9EZXZDb25uZWN0KFVTQl9UeXBlRGVmICpVU0J4KQoreworICAvKiBFbmFibGluZyBEUCBQdWxsLVVQIGJpdCB0byBDb25uZWN0IGludGVybmFsIFBVIHJlc2lzdG9yIG9uIFVTQiBEUCBsaW5lICovCisgIFVTQngtPkJDRFIgfD0gVVNCX0JDRFJfRFBQVTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQl9EZXZEaXNjb25uZWN0IDogRGlzY29ubmVjdCB0aGUgVVNCIGRldmljZSBieSBkaXNhYmxpbmcgdGhlIHB1bGwtdXAvcHVsbC1kb3duCisgICogQHBhcmFtICBVU0J4IDogU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiAgVVNCX0RldkRpc2Nvbm5lY3QoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIC8qIERpc2FibGUgRFAgUHVsbC1VcCBiaXQgdG8gZGlzY29ubmVjdCB0aGUgSW50ZXJuYWwgUFUgcmVzaXN0b3Igb24gVVNCIERQIGxpbmUgKi8KKyAgVVNCeC0+QkNEUiAmPSAodWludDE2X3QpKH4oVVNCX0JDRFJfRFBQVSkpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1JlYWRJbnRlcnJ1cHRzOiByZXR1cm4gdGhlIGdsb2JhbCBVU0IgaW50ZXJydXB0IHN0YXR1cworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordWludDMyX3QgIFVTQl9SZWFkSW50ZXJydXB0cyhVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIHRtcHJlZyA9IFVTQngtPklTVFI7CisgIHJldHVybiB0bXByZWc7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX1JlYWREZXZBbGxPdXRFcEludGVycnVwdDogcmV0dXJuIHRoZSBVU0IgZGV2aWNlIE9VVCBlbmRwb2ludHMgaW50ZXJydXB0IHN0YXR1cworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordWludDMyX3QgVVNCX1JlYWREZXZBbGxPdXRFcEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKyAgcmV0dXJuICgwKTsKK30KKworLyoqCisgICogQGJyaWVmICBVU0JfUmVhZERldkFsbEluRXBJbnRlcnJ1cHQ6IHJldHVybiB0aGUgVVNCIGRldmljZSBJTiBlbmRwb2ludHMgaW50ZXJydXB0IHN0YXR1cworICAqIEBwYXJhbSAgVVNCeCA6IFNlbGVjdGVkIGRldmljZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLwordWludDMyX3QgVVNCX1JlYWREZXZBbGxJbkVwSW50ZXJydXB0KFVTQl9UeXBlRGVmICpVU0J4KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChVU0J4KTsKKyAgLyogTk9URSA6IC0gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkgVVNCIERldmljZSBGUyBwZXJpcGhlcmFsLCBpdCBpcyB1c2VkCisgICAgICAgICAgICAgIG9ubHkgYnkgVVNCIE9URyBGUyBwZXJpcGhlcmFsLgorICAgICAgICAgICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAqLworICByZXR1cm4gKDApOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybnMgRGV2aWNlIE9VVCBFUCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGVwbnVtIDogZW5kcG9pbnQgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDE1CisgICogQHJldHZhbCBEZXZpY2UgT1VUIEVQIEludGVycnVwdCByZWdpc3RlcgorICAqLwordWludDMyX3QgVVNCX1JlYWREZXZPdXRFUEludGVycnVwdChVU0JfVHlwZURlZiAqVVNCeCwgdWludDhfdCBlcG51bSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChlcG51bSk7CisgIC8qIE5PVEUgOiAtIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlcXVpcmVkIGJ5IFVTQiBEZXZpY2UgRlMgcGVyaXBoZXJhbCwgaXQgaXMgdXNlZAorICAgICAgICAgICAgICBvbmx5IGJ5IFVTQiBPVEcgRlMgcGVyaXBoZXJhbC4KKyAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgcGxhdGZvcm1zLgorICAgKi8KKyAgcmV0dXJuICgwKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZXR1cm5zIERldmljZSBJTiBFUCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAgKiBAcGFyYW0gIFVTQnggOiBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGVwbnVtIDogZW5kcG9pbnQgbnVtYmVyCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDE1CisgICogQHJldHZhbCBEZXZpY2UgSU4gRVAgSW50ZXJydXB0IHJlZ2lzdGVyCisgICovCit1aW50MzJfdCBVU0JfUmVhZERldkluRVBJbnRlcnJ1cHQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgZXBudW0pCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKFVTQngpOworICBVTlVTRUQoZXBudW0pOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiAoMCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0NsZWFySW50ZXJydXB0czogY2xlYXIgYSBVU0IgaW50ZXJydXB0CisgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIGludGVycnVwdCAgaW50ZXJydXB0IGZsYWcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgIFVTQl9DbGVhckludGVycnVwdHMoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQzMl90IGludGVycnVwdCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChpbnRlcnJ1cHQpOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgUHJlcGFyZSB0aGUgRVAwIHRvIHN0YXJ0IHRoZSBmaXJzdCBjb250cm9sIHNldHVwCisgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcGFyYW0gIHBzZXR1cCAgcG9pbnRlciB0byBzZXR1cCBwYWNrZXQKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9FUDBfT3V0U3RhcnQoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnBzZXR1cCkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoVVNCeCk7CisgIFVOVVNFRChwc2V0dXApOworICAvKiBOT1RFIDogLSBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZCBieSBVU0IgRGV2aWNlIEZTIHBlcmlwaGVyYWwsIGl0IGlzIHVzZWQKKyAgICAgICAgICAgICAgb25seSBieSBVU0IgT1RHIEZTIHBlcmlwaGVyYWwuCisgICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICovCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0FjdGl2YXRlUmVtb3RlV2FrZXVwIDogYWN0aXZlIHJlbW90ZSB3YWtldXAgc2lnbmFsbGluZworICAqIEBwYXJhbSAgVVNCeCAgU2VsZWN0ZWQgZGV2aWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBVU0JfQWN0aXZhdGVSZW1vdGVXYWtldXAoVVNCX1R5cGVEZWYgKlVTQngpCit7CisgIFVTQngtPkNOVFIgfD0gVVNCX0NOVFJfUkVTVU1FOworCisgIHJldHVybiBIQUxfT0s7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNCX0RlQWN0aXZhdGVSZW1vdGVXYWtldXAgOiBkZS1hY3RpdmUgcmVtb3RlIHdha2V1cCBzaWduYWxsaW5nCisgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9EZUFjdGl2YXRlUmVtb3RlV2FrZXVwKFVTQl9UeXBlRGVmICpVU0J4KQoreworICBVU0J4LT5DTlRSICY9IH4oVVNCX0NOVFJfUkVTVU1FKTsKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIENvcHkgYSBidWZmZXIgZnJvbSB1c2VyIG1lbW9yeSBhcmVhIHRvIHBhY2tldCBtZW1vcnkgYXJlYSAoUE1BKQorICAqIEBwYXJhbSAgIFVTQnggVVNCIHBlcmlwaGVyYWwgaW5zdGFuY2UgcmVnaXN0ZXIgYWRkcmVzcy4KKyAgKiBAcGFyYW0gICBwYlVzckJ1ZiBwb2ludGVyIHRvIHVzZXIgbWVtb3J5IGFyZWEuCisgICogQHBhcmFtICAgd1BNQUJ1ZkFkZHIgYWRkcmVzcyBpbnRvIFBNQS4KKyAgKiBAcGFyYW0gICB3TkJ5dGVzOiBuby4gb2YgYnl0ZXMgdG8gYmUgY29waWVkLgorICAqIEByZXR2YWwgTm9uZQorICAqLwordm9pZCBVU0JfV3JpdGVQTUEoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLCB1aW50MTZfdCB3UE1BQnVmQWRkciwgdWludDE2X3Qgd05CeXRlcykKK3sKKyAgdWludDMyX3QgbiA9ICgodWludDMyX3Qpd05CeXRlcyArIDFVKSA+PiAxOworICB1aW50MzJfdCBCYXNlQWRkciA9ICh1aW50MzJfdClVU0J4OworICB1aW50MzJfdCBpLCB0ZW1wMSwgdGVtcDI7CisgIF9fSU8gdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOworCisgIHBkd1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKEJhc2VBZGRyICsgMHg0MDBVICsgKCh1aW50MzJfdCl3UE1BQnVmQWRkciAqIFBNQV9BQ0NFU1MpKTsKKworICBmb3IgKGkgPSBuOyBpICE9IDBVOyBpLS0pCisgIHsKKyAgICB0ZW1wMSA9ICpwQnVmOworICAgIHBCdWYrKzsKKyAgICB0ZW1wMiA9IHRlbXAxIHwgKCh1aW50MTZfdCkoKHVpbnQxNl90KSAqcEJ1ZiA8PCA4KSk7CisgICAgKnBkd1ZhbCA9ICh1aW50MTZfdCl0ZW1wMjsKKyAgICBwZHdWYWwrKzsKKworI2lmIFBNQV9BQ0NFU1MgPiAxVQorICAgIHBkd1ZhbCsrOworI2VuZGlmCisKKyAgICBwQnVmKys7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmIENvcHkgYSBidWZmZXIgZnJvbSB1c2VyIG1lbW9yeSBhcmVhIHRvIHBhY2tldCBtZW1vcnkgYXJlYSAoUE1BKQorICAqIEBwYXJhbSAgIFVTQng6IFVTQiBwZXJpcGhlcmFsIGluc3RhbmNlIHJlZ2lzdGVyIGFkZHJlc3MuCisgICogQHBhcmFtICAgcGJVc3JCdWYgcG9pbnRlciB0byB1c2VyIG1lbW9yeSBhcmVhLgorICAqIEBwYXJhbSAgIHdQTUFCdWZBZGRyIGFkZHJlc3MgaW50byBQTUEuCisgICogQHBhcmFtICAgd05CeXRlczogbm8uIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgVVNCX1JlYWRQTUEoVVNCX1R5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKnBiVXNyQnVmLCB1aW50MTZfdCB3UE1BQnVmQWRkciwgdWludDE2X3Qgd05CeXRlcykKK3sKKyAgdWludDMyX3QgbiA9ICh1aW50MzJfdCl3TkJ5dGVzID4+IDE7CisgIHVpbnQzMl90IEJhc2VBZGRyID0gKHVpbnQzMl90KVVTQng7CisgIHVpbnQzMl90IGksIHRlbXA7CisgIF9fSU8gdWludDE2X3QgKnBkd1ZhbDsKKyAgdWludDhfdCAqcEJ1ZiA9IHBiVXNyQnVmOworCisgIHBkd1ZhbCA9IChfX0lPIHVpbnQxNl90ICopKEJhc2VBZGRyICsgMHg0MDBVICsgKCh1aW50MzJfdCl3UE1BQnVmQWRkciAqIFBNQV9BQ0NFU1MpKTsKKworICBmb3IgKGkgPSBuOyBpICE9IDBVOyBpLS0pCisgIHsKKyAgICB0ZW1wID0gKihfX0lPIHVpbnQxNl90ICopcGR3VmFsOworICAgIHBkd1ZhbCsrOworICAgICpwQnVmID0gKHVpbnQ4X3QpKCh0ZW1wID4+IDApICYgMHhGRlUpOworICAgIHBCdWYrKzsKKyAgICAqcEJ1ZiA9ICh1aW50OF90KSgodGVtcCA+PiA4KSAmIDB4RkZVKTsKKyAgICBwQnVmKys7CisKKyNpZiBQTUFfQUNDRVNTID4gMVUKKyAgICBwZHdWYWwrKzsKKyNlbmRpZgorICB9CisKKyAgaWYgKCh3TkJ5dGVzICUgMlUpICE9IDBVKQorICB7CisgICAgdGVtcCA9ICpwZHdWYWw7CisgICAgKnBCdWYgPSAodWludDhfdCkoKHRlbXAgPj4gMCkgJiAweEZGVSk7CisgIH0KK30KKworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIGRlZmluZWQgKFVTQikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkIChIQUxfUENEX01PRFVMRV9FTkFCTEVEKSB8fCBkZWZpbmVkIChIQUxfSENEX01PRFVMRV9FTkFCTEVEKSAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyd2J4eF9sbF91dGlscy5jIGIvU3JjL3N0bTMyd2J4eF9sbF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDI3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJ3Ynh4X2xsX3V0aWxzLmMKQEAgLTAsMCArMSw3MjAgQEAKKy8qKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAZmlsZSAgICBzdG0zMndieHhfbGxfdXRpbHMuYworICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgVVRJTFMgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKgorICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInN0bTMyd2J4eF9sbF91dGlscy5oIgorI2luY2x1ZGUgInN0bTMyd2J4eF9sbF9yY2MuaCIKKyNpbmNsdWRlICJzdG0zMndieHhfbGxfc3lzdGVtLmgiCisjaW5jbHVkZSAic3RtMzJ3Ynh4X2xsX3B3ci5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyV0J4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTEwKKyAgKiBAeworICAqLworCisvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9Db25zdGFudHMKKyAgKiBAeworICAqLworI2RlZmluZSBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMSAgNjQwMDAwMDBVICAgICAgICAvKiE8IE1heGltdW0gZnJlcXVlbmN5IGZvciBzeXN0ZW0gY2xvY2sgYXQgcG93ZXIgc2NhbGUxLCBpbiBIeiAqLworI2RlZmluZSBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMiAgMTYwMDAwMDBVICAgICAgICAvKiE8IE1heGltdW0gZnJlcXVlbmN5IGZvciBzeXN0ZW0gY2xvY2sgYXQgcG93ZXIgc2NhbGUyLCBpbiBIeiAqLworCisvKiBEZWZpbmVzIHVzZWQgZm9yIFBMTCByYW5nZSAqLworI2RlZmluZSBVVElMU19QTExWQ09fSU5QVVRfTUlOICAgICAgNDAwMDAwMFUgICAgICAgICAvKiE8IEZyZXF1ZW5jeSBtaW4gZm9yIFBMTFZDTyBpbnB1dCwgaW4gSHogICAqLworI2RlZmluZSBVVElMU19QTExWQ09fSU5QVVRfTUFYICAgICAgMTYwMDAwMDBVICAgICAgICAvKiE8IEZyZXF1ZW5jeSBtYXggZm9yIFBMTFZDTyBpbnB1dCwgaW4gSHogICAqLworI2RlZmluZSBVVElMU19QTExWQ09fT1VUUFVUX01JTiAgICAgNjQwMDAwMDBVICAgICAgICAvKiE8IEZyZXF1ZW5jeSBtaW4gZm9yIFBMTFZDTyBvdXRwdXQsIGluIEh6ICAqLworI2RlZmluZSBVVElMU19QTExWQ09fT1VUUFVUX01BWCAgICAgMzQ0MDAwMDAwVSAgICAgICAvKiE8IEZyZXF1ZW5jeSBtYXggZm9yIFBMTFZDTyBvdXRwdXQsIGluIEh6ICAqLworCisvKiBEZWZpbmVzIHVzZWQgZm9yIEhDTEsyIGZyZXF1ZW5jeSBjaGVjayAqLworI2RlZmluZSBVVElMU19IQ0xLMl9NQVggICAgICAgICAgICAgMzIwMDAwMDBVICAgICAgICAvKiE8IEhDTEsyIGZyZXF1ZW5jeSBtYXhpbXVtIGF0IDMyTUh6ICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworI2RlZmluZSBJU19MTF9VVElMU19TWVNDTEtfRElWKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8xKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMikgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzMpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl80KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfNSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzYpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl84KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfMTApICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzE2KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8zMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfNjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19TWVNDTEtfRElWXzEyOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfU1lTQ0xLX0RJVl8yNTYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1NZU0NMS19ESVZfNTEyKSkKKworI2RlZmluZSBJU19MTF9VVElMU19BUEIxX0RJVihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjFfRElWXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl8yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMV9ESVZfNCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjFfRElWXzgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIxX0RJVl8xNikpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfQVBCMl9ESVYoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIyX0RJVl8xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX0FQQjJfRElWXzQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19BUEIyX0RJVl84KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9SQ0NfQVBCMl9ESVZfMTYpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX1BMTE1fVkFMVUUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl8xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl8yKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl8zKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl80KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl81KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl82KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl83KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1JDQ19QTExNX0RJVl84KSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExOX1ZBTFVFKF9fVkFMVUVfXykgKCg4VSA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IDg2VSkpCisKKyNkZWZpbmUgSVNfTExfVVRJTFNfUExMUl9WQUxVRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfUkNDX1BMTFJfRElWXzgpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX1BMTFZDT19JTlBVVChfX1ZBTFVFX18pICAoKFVUSUxTX1BMTFZDT19JTlBVVF9NSU4gPD0gKF9fVkFMVUVfXykpICYmICgoX19WQUxVRV9fKSA8PSBVVElMU19QTExWQ09fSU5QVVRfTUFYKSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExWQ09fT1VUUFVUKF9fVkFMVUVfXykgKChVVElMU19QTExWQ09fT1VUUFVUX01JTiA8PSAoX19WQUxVRV9fKSkgJiYgKChfX1ZBTFVFX18pIDw9IFVUSUxTX1BMTFZDT19PVVRQVVRfTUFYKSkKKworI2RlZmluZSBJU19MTF9VVElMU19QTExfRlJFUVVFTkNZKF9fVkFMVUVfXykgKChMTF9QV1JfR2V0UmVndWxWb2x0YWdlU2NhbGluZygpID09IExMX1BXUl9SRUdVX1ZPTFRBR0VfU0NBTEUxKSA/ICgoX19WQUxVRV9fKSA8PSBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPD0gVVRJTFNfTUFYX0ZSRVFVRU5DWV9TQ0FMRTIpKQorCisjZGVmaW5lIElTX0xMX1VUSUxTX0hTRV9CWVBBU1MoX19TVEFURV9fKSAoKChfX1NUQVRFX18pID09IExMX1VUSUxTX0hTRUJZUEFTU19PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19TVEFURV9fKSA9PSBMTF9VVElMU19IU0VCWVBBU1NfT0ZGKSkKKworI2RlZmluZSBjb3VudG9mKGEpICAgKHNpemVvZihhKSAvIHNpemVvZigqKGEpKSkKKy8qKgorICAqIEB9CisgICovCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBVVElMU19MTF9Qcml2YXRlX0Z1bmN0aW9ucyBVVElMUyBQcml2YXRlIGZ1bmN0aW9ucworICAqIEB7CisgICovCisgIHN0YXRpYyB1aW50MzJfdCAgICBVVElMU19HZXRQTExPdXRwdXRGcmVxdWVuY3kodWludDMyX3QgUExMX0lucHV0RnJlcXVlbmN5LExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0KTsKKyAgc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1NldEZsYXNoTGF0ZW5jeSh1aW50MzJfdCBIQ0xLNF9GcmVxdWVuY3kpOworICBzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHVpbnQzMl90IFNZU0NMS19GcmVxdWVuY3ksIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmICpVVElMU19DbGtJbml0U3RydWN0KTsKKyAgc3RhdGljIEVycm9yU3RhdHVzIFVUSUxTX1BMTF9Jc0J1c3kodm9pZCk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfRXhwb3J0ZWRfRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0xMX0VGX0RFTEFZCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIENvcnRleC1NIFN5c1RpY2sgc291cmNlIHRvIGhhdmUgMW1zIHRpbWUgYmFzZS4KKyAgKiBAbm90ZSAgIFdoZW4gYSBSVE9TIGlzIHVzZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBTeXN0aWNrCisgICogICAgICAgICBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgZm9yIGEgZGVsYXkgdXNlIHJhdGhlciBvc0RlbGF5IFJUT1Mgc2VydmljZS4KKyAgKiBAcGFyYW0gIEhDTEtGcmVxdWVuY3kgSENMSyBmcmVxdWVuY3kgaW4gSHoKKyAgKiBAbm90ZSAgIEhDTEsgZnJlcXVlbmN5IGNhbiBiZSBjYWxjdWxhdGVkIHRoYW5rcyB0byBSQ0MgaGVscGVyIG1hY3JvIG9yIGZ1bmN0aW9uIEByZWYgTExfUkNDX0dldFN5c3RlbUNsb2Nrc0ZyZXEgKEhDTEsxX0ZyZXF1ZW5jeSBmaWVsZCkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfSW5pdDFtc1RpY2sodWludDMyX3QgSENMS0ZyZXF1ZW5jeSkKK3sKKyAgLyogVXNlIGZyZXF1ZW5jeSBwcm92aWRlZCBpbiBhcmd1bWVudCAqLworICBMTF9Jbml0VGljayhIQ0xLRnJlcXVlbmN5LCAxMDAwKTsKK30KKworCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYWNjdXJhdGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmFzZWQKKyAgKiAgICAgICAgIG9uIFN5c1RpY2sgY291bnRlciBmbGFnCisgICogQG5vdGUgICBXaGVuIGEgUlRPUyBpcyB1c2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCB1c2luZyBibG9ja2luZyBkZWxheQorICAqICAgICAgICAgYW5kIHVzZSByYXRoZXIgb3NEZWxheSBzZXJ2aWNlLgorICAqIEBub3RlICAgVG8gcmVzcGVjdCAxbXMgdGltZWJhc2UsIHVzZXIgc2hvdWxkIGNhbGwgQHJlZiBMTF9Jbml0MW1zVGljayBmdW5jdGlvbiB3aGljaAorICAqICAgICAgICAgd2lsbCBjb25maWd1cmUgU3lzdGljayB0byAxbXMKKyAgKiBAcGFyYW0gIERlbGF5IHNwZWNpZmllcyB0aGUgZGVsYXkgdGltZSBsZW5ndGgsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfbURlbGF5KHVpbnQzMl90IERlbGF5KQoreworICB1aW50MzJfdCBtRGVsYXkgPSBEZWxheTsKKyAgX19JTyB1aW50MzJfdCAgdG1wID0gU3lzVGljay0+Q1RSTDsgIC8qIENsZWFyIHRoZSBDT1VOVEZMQUcgZmlyc3QgKi8KKyAgLyogQWRkIHRoaXMgY29kZSB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsIHZhcmlhYmxlIGlzIG5vdCB1c2VkICovCisgICgodm9pZCl0bXApOworCisgIC8qIEFkZCBhIHBlcmlvZCB0byBndWFyYW50eSBtaW5pbXVtIHdhaXQgKi8KKyAgaWYgKG1EZWxheSA8IExMX01BWF9ERUxBWSkKKyAgeworICAgIG1EZWxheSsrOworICB9CisKKyAgd2hpbGUgKG1EZWxheSAhPSAwVSkKKyAgeworICAgIGlmICgoU3lzVGljay0+Q1RSTCAmIFN5c1RpY2tfQ1RSTF9DT1VOVEZMQUdfTXNrKSAhPSAwVSkKKyAgICB7CisgICAgICBtRGVsYXktLTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIFVUSUxTX0VGX1NZU1RFTQorICAqICBAYnJpZWYgICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAjIyMjIyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgICAgICAgU3lzdGVtLCBIQ0xLMSwgSENMSzIsIEFIQlMsIEFIQlJGIGFuZCBBUEIgYnVzZXMgY2xvY2tzIGNvbmZpZ3VyYXRpb24KKworICAgICAgICAgKCspIFRoZSBtYXhpbXVtIGZyZXF1ZW5jeSBvZiB0aGUgU1lTQ0xLLCBIQ0xLMSwgSENMSzQsIFBDTEsxIGFuZCBQQ0xLMiAKKyAgICAgICAgICAgICBpcyA2NDAwMDAwMDAgSHouCisgLi4uLi4uLiAoKykgVGhlIG1heGltdW0gZnJlcXVlbmN5IG9mIHRoZSBIQ0xLMiBpcyAzMjAwMDAwMDAgSHouCisgICAgICAgICAgICAgCisgIEBlbmR2ZXJiYXRpbQorICBAaW50ZXJuYWwKKyAgICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIGRldmljZSB2b2x0YWdlIHJhbmdlLCB0aGUgbWF4aW11bSBmcmVxdWVuY3kgc2hvdWxkIGJlCisgICAgICAgICAgICAgYWRhcHRlZCBhY2NvcmRpbmdseToKKyAgICAgICAgICAgICAoKyspIEhDTEs0IGNsb2NrIGZyZXF1ZW5jeSBmb3IgU1RNMzJXQjU1eHggZGV2aWNlCisgICAgICAgICAgICAgKCsrKSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgKCsrKSB8IExhdGVuY3kgICAgICAgICB8ICAgICBIQ0xLNCBjbG9jayBmcmVxdWVuY3kgKE1IeikgICAgICB8CisgICAgICAgICAgICAgKCsrKSB8ICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8ICAgICAgICAgICAgICAgICB8ICB2b2x0YWdlIHJhbmdlIDEgIHwgdm9sdGFnZSByYW5nZSAyICB8CisgICAgICAgICAgICAgKCsrKSB8ICAgICAgICAgICAgICAgICB8ICAgICAgIDEuMiBWICAgICAgIHwgICAgIDEuMCBWICAgICAgICB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MFdTKDEgQ1BVIGN5Y2xlcyl8ICAgMCA8IEhDTEs0IDw9IDE4IHwgIDAgPCBIQ0xLNCA8PSA2ICB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MVdTKDIgQ1BVIGN5Y2xlcyl8ICAxOCA8IEhDTEs0IDw9IDM2IHwgIDYgPCBIQ0xLNCA8PSAxMiB8CisgICAgICAgICAgICAgKCsrKSB8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgKCsrKSB8MldTKDMgQ1BVIGN5Y2xlcyl8ICAzNiA8IEhDTEs0IDw9IDU0IHwgMTIgPCBIQ0xLNCA8PSAxNnwKKyAgICAgICAgICAgICAoKyspIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgICAgICAgICAoKyspIHwzV1MoNCBDUFUgY3ljbGVzKXwgIDU0IDwgSENMSzQgPD0gNjQgfCAgICAgICBOLkEuICAgICAgIHwKKyAgICAgICAgICAgICAoKyspICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgQGVuZGludGVybmFsCisgICogQHsKKyAgKi8KKyAgCisvKioKKyAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gc2V0cyBkaXJlY3RseSBTeXN0ZW1Db3JlQ2xvY2sgQ01TSVMgdmFyaWFibGUuCisgICogQG5vdGUgICBWYXJpYWJsZSBjYW4gYmUgY2FsY3VsYXRlZCBhbHNvIHRocm91Z2ggU3lzdGVtQ29yZUNsb2NrVXBkYXRlIGZ1bmN0aW9uLgorICAqIEBwYXJhbSAgSENMS0ZyZXF1ZW5jeSBIQ0xLIGZyZXF1ZW5jeSBpbiBIeiAoY2FuIGJlIGNhbGN1bGF0ZWQgdGhhbmtzIHRvIFJDQyBoZWxwZXIgbWFjcm8gb3IgZnVuY3Rpb24gQHJlZiBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSAoSENMSzFfRnJlcXVlbmN5IGZpZWxkKSkKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgTExfU2V0U3lzdGVtQ29yZUNsb2NrKHVpbnQzMl90IEhDTEtGcmVxdWVuY3kpCit7CisgIC8qIEhDTEsgY2xvY2sgZnJlcXVlbmN5ICovCisgIFN5c3RlbUNvcmVDbG9jayA9IEhDTEtGcmVxdWVuY3k7Cit9CisKKy8qKgorICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHN5c3RlbSBjbG9jayB3aXRoIE1TSSBhcyBjbG9jayBzb3VyY2Ugb2YgdGhlIFBMTAorICAqIEBub3RlICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGVuc3VyZSB0aGF0IFBMTCBhbmQgUExMU0FJMSBhcmUgZGlzYWJsZWQuCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gZW5zdXJlIHRoYXQgUExMIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQKKyAgKiBAbm90ZSAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBlbnN1cmUgdGhhdCBNU0kgcmFuZ2UgaXMgdmFsaWQuCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gZW5zdXJlIHRoYXQgQlVTIHByZXNjYWxlcnMgYXJlIHZhbGlkCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICogICAgICAgICAtIFBMTCBvdXRwdXQgZnJlcXVlbmN5ID0gKCgoTVNJIGZyZXF1ZW5jeSAvIFBMTE0pICogUExMTikgLyBQTExSKQorICAqICAgICAgICAgLSBQTExNOiBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1IeiAoUExMVkNPX2lucHV0ID0gTVNJIGZyZXF1ZW5jeSAvIFBMTE0pCisgICogICAgICAgICAtIFBMTE46IGVuc3VyZSB0aGF0IHRoZSBWQ08gb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6IChQTExWQ09fb3V0cHV0ID0gUExMVkNPX2lucHV0ICogUExMTikKKyAgKiAgICAgICAgIC0gUExMUjogZW5zdXJlIHRoYXQgbWF4IGZyZXF1ZW5jeSBhdCA2NDAwMDAwMCBIeiBpcyByZWFjaGVkIChQTExWQ09fb3V0cHV0IC8gUExMUikKKyAgKiBAcGFyYW0gIFVUSUxTX1BMTEluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBQTEwuCisgICogQHBhcmFtICBVVElMU19DbGtJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgQlVTIHByZXNjYWxlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBkb25lCisgICogICAgICAgICAgLSBFUlJPUjogTWF4IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uIG5vdCBkb25lCisgICovCitFcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfTVNJKExMX1VUSUxTX1BMTEluaXRUeXBlRGVmICpVVElMU19QTExJbml0U3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTF9VVElMU19DbGtJbml0VHlwZURlZiAqVVRJTFNfQ2xrSW5pdFN0cnVjdCkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzOworICB1aW50MzJfdCBwbGxyZnJlcSwgaGNsazJmcmVxLCBtc2lfcmFuZ2U7CisKKyAgLyogQ2hlY2sgaWYgb25lIG9mIHRoZSBQTEwgaXMgZW5hYmxlZCAqLworICBpZihVVElMU19QTExfSXNCdXN5KCkgPT0gU1VDQ0VTUykKKyAgeworICAgIC8qIEdldCB0aGUgY3VycmVudCBNU0kgcmFuZ2UgJiBjaGVjayBjb2hlcmVuY3kgKi8KKyAgICBtc2lfcmFuZ2UgPSAgTExfUkNDX01TSV9HZXRSYW5nZSgpOworICAgIHN3aXRjaCAobXNpX3JhbmdlKQorICAgIHsKKyAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzA6ICAgICAvKiBNU0kgPSAxMDAgS0h6ICAqLworICAgICAgY2FzZSBMTF9SQ0NfTVNJUkFOR0VfMTogICAgIC8qIE1TSSA9IDIwMCBLSHogICovCisgICAgICBjYXNlIExMX1JDQ19NU0lSQU5HRV8yOiAgICAgLyogTVNJID0gNDAwIEtIeiAgKi8KKyAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzM6ICAgICAvKiBNU0kgPSA4MDAgS0h6ICAqLworICAgICAgY2FzZSBMTF9SQ0NfTVNJUkFOR0VfNDogICAgIC8qIE1TSSA9IDEgTUh6ICAgICovCisgICAgICBjYXNlIExMX1JDQ19NU0lSQU5HRV81OiAgICAgLyogTVNJID0gMiBNSHogICAgKi8KKyAgICAgICAgLyogUExMVkNPIGlucHV0IGZyZXF1ZW5jeSBjYW4gbm90IGluIHRoZSByYW5nZSBmcm9tIDQgdG8gMTYgTUh6Ki8KKyAgICAgICAgc3RhdHVzID0gRVJST1I7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExMX1JDQ19NU0lSQU5HRV82OiAgICAgLyogTVNJID0gNCBNSHogICAgKi8KKyAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzc6ICAgICAvKiBNU0kgPSA4IE1IeiAgICAqLworICAgICAgY2FzZSBMTF9SQ0NfTVNJUkFOR0VfODogICAgIC8qIE1TSSA9IDE2IE1IeiAgICovCisgICAgICBjYXNlIExMX1JDQ19NU0lSQU5HRV85OiAgICAgLyogTVNJID0gMjQgTUh6ICAgKi8KKyAgICAgIGNhc2UgTExfUkNDX01TSVJBTkdFXzEwOiAgICAvKiBNU0kgPSAzMiBNSHogICAqLworICAgICAgY2FzZSBMTF9SQ0NfTVNJUkFOR0VfMTE6ICAgIC8qIE1TSSA9IDQ4IE1IeiAgICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBTVUNDRVNTOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBQTEwgaXMgcmVhZHksIE1TSSByYW5nZSBpcyB2YWxpZCBhbmQgSENMSzIgZnJlcXVlbmN5IGlzIGNvaGVyZW50CisgICAgICAgTWFpbiBQTEwgY29uZmlndXJhdGlvbiBhbmQgYWN0aXZhdGlvbiAqLworICAgIGlmKHN0YXR1cyAhPSBFUlJPUikKKyAgICB7CisgICAgICAvKiBDYWxjdWxhdGUgdGhlIG5ldyBQTEwgb3V0cHV0IGZyZXF1ZW5jeSAmIHZlcmlmeSBhbGwgUExMIHN0YWdlcyBhcmUgY29ycmVjdCAoVkNPIGlucHV0IHJhbmdlcywgCisgICAgICAgICBWQ08gb3V0cHV0IHJhbmdlcyAmIFNZU0NMSyBtYXgpIHdoZW4gYXNzZXJ0IGFjdGl2YXRlZCAqLworICAgICAgcGxscmZyZXEgPSBVVElMU19HZXRQTExPdXRwdXRGcmVxdWVuY3koX19MTF9SQ0NfQ0FMQ19NU0lfRlJFUShtc2lfcmFuZ2UpLCBVVElMU19QTExJbml0U3RydWN0KTsKKyAgICAgIGhjbGsyZnJlcSA9IF9fTExfUkNDX0NBTENfSENMSzJfRlJFUShwbGxyZnJlcSwgVVRJTFNfQ2xrSW5pdFN0cnVjdC0+Q1BVMkNMS0RpdmlkZXIpOworCisgICAgICAvKiBDaGVjayBIQ0xLMiBmcmVxdWVuY3kgY29oZXJlbmN5ICovCisgICAgICBpZiAoaGNsazJmcmVxID4gVVRJTFNfSENMSzJfTUFYKQorICAgICAgeworICAgICAgICAvKiBIQ0xLMiBmcmVxdWVuY3kgY2FuIG5vdCBiZSBoaWdoZXIgdGhhbiAzMk1oeiAqLworICAgICAgICBzdGF0dXMgPSBFUlJPUjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKworICAgICAgICAvKiBFbmFibGUgTVNJIGlmIG5vdCBlbmFibGVkICovCisgICAgICAgIGlmKExMX1JDQ19NU0lfSXNSZWFkeSgpICE9IDFVKQorICAgICAgICB7CisgICAgICAgICAgTExfUkNDX01TSV9FbmFibGUoKTsKKyAgICAgICAgICB3aGlsZSAoKExMX1JDQ19NU0lfSXNSZWFkeSgpICE9IDFVKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciBNU0kgcmVhZHkgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb25maWd1cmUgUExMIGRvbWFpbiBTWVMgKi8KKyAgICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKExMX1JDQ19QTExTT1VSQ0VfTVNJLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNLCBVVElMU19QTExJbml0U3RydWN0LT5QTExOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMUik7CisKKyAgICAgICAgLyogRW5hYmxlIFBMTCBhbmQgc3dpdGNoIHN5c3RlbSBjbG9jayB0byBQTEwgLSBsYXRlbmN5IGNoZWNrIGRvbmUgaW50ZXJuYWxseSAqLworICAgICAgICBzdGF0dXMgPSBVVElMU19FbmFibGVQTExBbmRTd2l0Y2hTeXN0ZW0ocGxscmZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDdXJyZW50IFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgc3lzdGVtIGNsb2NrIGF0IG1heGltdW0gZnJlcXVlbmN5IHdpdGggSFNJIGFzIGNsb2NrIHNvdXJjZSBvZiB0aGUgUExMCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZCB0byBlbnN1cmUgdGhhdCBQTEwgYW5kL29yIFBMTFNBSTEgYXJlIGRpc2FibGVkLgorICAqIEBub3RlICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGVuc3VyZSB0aGF0IFBMTCBjb25maWd1cmF0aW9uIGlzIHZhbGlkCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gZW5zdXJlIHRoYXQgQlVTIHByZXNjYWxlcnMgYXJlIHZhbGlkCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICogICAgICAgICAtIFBMTCBvdXRwdXQgZnJlcXVlbmN5ID0gKCgoSFNJIGZyZXF1ZW5jeSAvIFBMTE0pICogUExMTikgLyBQTExSKQorICAqICAgICAgICAgLSBQTExNOiBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1IeiAoUExMVkNPX2lucHV0ID0gSFNJIGZyZXF1ZW5jeSAvIFBMTE0pCisgICogICAgICAgICAtIFBMTE46IGVuc3VyZSB0aGF0IHRoZSBWQ08gb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6IChQTExWQ09fb3V0cHV0ID0gUExMVkNPX2lucHV0ICogUExMTikKKyAgKiAgICAgICAgIC0gUExMUjogZW5zdXJlIHRoYXQgbWF4IGZyZXF1ZW5jeSBhdCA2NDAwMDAwMCBIeiBpcyByZWFjaCAoUExMVkNPX291dHB1dCAvIFBMTFIpCisgICogQHBhcmFtICBVVElMU19QTExJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX1BMTEluaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgUExMLgorICAqIEBwYXJhbSAgVVRJTFNfQ2xrSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9VVElMU19DbGtJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEJVUyBwcmVzY2FsZXJzLgorICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bWVyYXRpb24gdmFsdWU6CisgICogICAgICAgICAgLSBTVUNDRVNTOiBNYXggZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24gZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBub3QgZG9uZQorICAqLworRXJyb3JTdGF0dXMgTExfUExMX0NvbmZpZ1N5c3RlbUNsb2NrX0hTSShMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1czsKKyAgdWludDMyX3QgcGxscmZyZXEsIGhjbGsyZnJlcTsKKworICAvKiBDaGVjayBpZiBvbmUgb2YgdGhlIFBMTCBpcyBlbmFibGVkICovCisgIGlmKFVUSUxTX1BMTF9Jc0J1c3koKSA9PSBTVUNDRVNTKQorICB7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKyAgICBwbGxyZnJlcSA9IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeShIU0lfVkFMVUUsIFVUSUxTX1BMTEluaXRTdHJ1Y3QpOworICAgIGhjbGsyZnJlcSA9IF9fTExfUkNDX0NBTENfSENMSzJfRlJFUShwbGxyZnJlcSwgVVRJTFNfQ2xrSW5pdFN0cnVjdC0+Q1BVMkNMS0RpdmlkZXIpOworCisgICAgLyogQ2hlY2sgSENMSzIgZnJlcXVlbmN5IGNvaGVyZW5jeSAqLworICAgIGlmIChoY2xrMmZyZXEgPiBVVElMU19IQ0xLMl9NQVgpCisgICAgeworICAgICAgLyogSENMSzIgZnJlcXVlbmN5IGNhbiBub3QgYmUgaGlnaGVyIHRoYW4gMzJNaHogKi8KKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogRW5hYmxlIEhTSSBpZiBub3QgZW5hYmxlZCAqLworICAgICAgaWYoTExfUkNDX0hTSV9Jc1JlYWR5KCkgIT0gMVUpCisgICAgICB7CisgICAgICAgIExMX1JDQ19IU0lfRW5hYmxlKCk7CisgICAgICAgIHdoaWxlIChMTF9SQ0NfSFNJX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFdhaXQgZm9yIEhTSSByZWFkeSAqLworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENvbmZpZ3VyZSBQTEwgKi8KKyAgICAgIExMX1JDQ19QTExfQ29uZmlnRG9tYWluX1NZUyhMTF9SQ0NfUExMU09VUkNFX0hTSSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTSwgVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVElMU19QTExJbml0U3RydWN0LT5QTExSKTsKKyAgICAKKyAgICAgIC8qIEVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovCisgICAgICBzdGF0dXMgPSBVVElMU19FbmFibGVQTExBbmRTd2l0Y2hTeXN0ZW0ocGxscmZyZXEsIFVUSUxTX0Nsa0luaXRTdHJ1Y3QpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBDdXJyZW50IFBMTCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCAqLworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgc3lzdGVtIGNsb2NrIHdpdGggSFNFIGFzIGNsb2NrIHNvdXJjZSBvZiB0aGUgUExMCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZCB0byBlbnN1cmUgdGhhdCBQTEwgYW5kL29yIFBMTFNBSTEgYXJlIGRpc2FibGVkLgorICAqIEBub3RlICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGVuc3VyZSB0aGF0IFBMTCBjb25maWd1cmF0aW9uIGlzIHZhbGlkCisgICogQG5vdGUgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gZW5zdXJlIHRoYXQgQlVTIHByZXNjYWxlcnMgYXJlIHZhbGlkCisgICogQG5vdGUgICBGdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisgICogICAgICAgICAtIFBMTCBvdXRwdXQgZnJlcXVlbmN5ID0gKCgoSFNFIGZyZXF1ZW5jeSAvIFBMTE0pICogUExMTikgLyBQTExSKQorICAqICAgICAgICAgLSBQTExNOiBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1IeiAoUExMVkNPX2lucHV0ID0gSFNFIGZyZXF1ZW5jeSAvIFBMTE0pCisgICogICAgICAgICAtIFBMTE46IGVuc3VyZSB0aGF0IHRoZSBWQ08gb3V0cHV0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuIDY0IGFuZCAzNDQgTUh6IChQTExWQ09fb3V0cHV0ID0gUExMVkNPX2lucHV0ICogUExMTikKKyAgKiAgICAgICAgIC0gUExMUjogZW5zdXJlIHRoYXQgbWF4IGZyZXF1ZW5jeSBhdCA2NDAwMDAwMCBIeiBpcyByZWFjaGVkIChQTExWQ09fb3V0cHV0IC8gUExMUikKKyAgKiBAcGFyYW0gIEhTRUJ5cGFzcyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX0hTRUJZUEFTU19PTgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VUSUxTX0hTRUJZUEFTU19PRkYKKyAgKiBAcGFyYW0gIFVUSUxTX1BMTEluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBQTEwuCisgICogQHBhcmFtICBVVElMU19DbGtJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1VUSUxTX0Nsa0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgQlVTIHByZXNjYWxlcnMuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IE1heCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbiBkb25lCisgICogICAgICAgICAgLSBFUlJPUjogTWF4IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uIG5vdCBkb25lCisgICovCitFcnJvclN0YXR1cyBMTF9QTExfQ29uZmlnU3lzdGVtQ2xvY2tfSFNFKHVpbnQzMl90IEhTRUJ5cGFzcyxMTF9VVElMU19QTExJbml0VHlwZURlZiAqVVRJTFNfUExMSW5pdFN0cnVjdCwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1czsKKyAgdWludDMyX3QgcGxscmZyZXEsIGhjbGsyZnJlcTsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfSFNFX0JZUEFTUyhIU0VCeXBhc3MpKTsKKworICAvKiBDaGVjayBpZiBvbmUgb2YgdGhlIFBMTCBpcyBlbmFibGVkICovCisgIGlmKFVUSUxTX1BMTF9Jc0J1c3koKSA9PSBTVUNDRVNTKQorICB7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBuZXcgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKyAgICBwbGxyZnJlcSA9IFVUSUxTX0dldFBMTE91dHB1dEZyZXF1ZW5jeShIU0VfVkFMVUUsIFVUSUxTX1BMTEluaXRTdHJ1Y3QpOworICAgIGhjbGsyZnJlcSA9IF9fTExfUkNDX0NBTENfSENMSzJfRlJFUShwbGxyZnJlcSwgVVRJTFNfQ2xrSW5pdFN0cnVjdC0+Q1BVMkNMS0RpdmlkZXIpOworCisgICAgLyogQ2hlY2sgSENMSzIgZnJlcXVlbmN5IGNvaGVyZW5jeSAqLworICAgIGlmIChoY2xrMmZyZXEgPiBVVElMU19IQ0xLMl9NQVgpCisgICAgeworICAgICAgLyogSENMSzIgZnJlcXVlbmN5IGNhbiBub3QgYmUgaGlnaGVyIHRoYW4gMzJNaHogKi8KKyAgICAgIHN0YXR1cyA9IEVSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAvKiBFbmFibGUgSFNFIGlmIG5vdCBlbmFibGVkICovCisgICAgICBpZihMTF9SQ0NfSFNFX0lzUmVhZHkoKSAhPSAxVSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2hlY2sgaWYgbmVlZCB0byBlbmFibGUgSFNFIGJ5cGFzcyBmZWF0dXJlIG9yIG5vdCAqLworICAgICAgICBpZihIU0VCeXBhc3MgPT0gTExfVVRJTFNfSFNFQllQQVNTX09OKQorICAgICAgICB7CisgICAgICAgICAgTExfUkNDX0hTRV9FbmFibGVCeXBhc3MoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBMTF9SQ0NfSFNFX0Rpc2FibGVCeXBhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVuYWJsZSBIU0UgKi8KKyAgICAgICAgTExfUkNDX0hTRV9FbmFibGUoKTsKKyAgICAgICAgd2hpbGUgKExMX1JDQ19IU0VfSXNSZWFkeSgpICE9IDFVKQorICAgICAgICB7CisgICAgICAgICAgLyogV2FpdCBmb3IgSFNFIHJlYWR5ICovCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ29uZmlndXJlIFBMTCAqLworICAgICAgTExfUkNDX1BMTF9Db25maWdEb21haW5fU1lTKExMX1JDQ19QTExTT1VSQ0VfSFNFLCBVVElMU19QTExJbml0U3RydWN0LT5QTExNLCBVVElMU19QTExJbml0U3RydWN0LT5QTExOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTFIpOworCisgICAgICAvKiBFbmFibGUgUExMIGFuZCBzd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTCAqLworICAgICAgc3RhdHVzID0gVVRJTFNfRW5hYmxlUExMQW5kU3dpdGNoU3lzdGVtKHBsbHJmcmVxLCBVVElMU19DbGtJbml0U3RydWN0KTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogQ3VycmVudCBQTEwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgVVRJTFNfTExfUHJpdmF0ZV9GdW5jdGlvbnMKKyAgKiBAeworICAqLworLyoqCisgICogQGJyaWVmICBVcGRhdGUgbnVtYmVyIG9mIEZsYXNoIHdhaXQgc3RhdGVzIGluIGxpbmUgd2l0aCBuZXcgZnJlcXVlbmN5IGFuZCBjdXJyZW50CisgICAgICAgICAgICB2b2x0YWdlIHJhbmdlLgorICAqIEBwYXJhbSAgSENMSzRfRnJlcXVlbmN5ICBIQ0xLNCBmcmVxdWVuY3kKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTGF0ZW5jeSBoYXMgYmVlbiBtb2RpZmllZAorICAqICAgICAgICAgIC0gRVJST1I6IExhdGVuY3kgY2Fubm90IGJlIG1vZGlmaWVkCisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfU2V0Rmxhc2hMYXRlbmN5KHVpbnQzMl90IEhDTEs0X0ZyZXF1ZW5jeSkKK3sKKyAgRXJyb3JTdGF0dXMgc3RhdHVzID0gU1VDQ0VTUzsKKyAgdWludDMyX3QgbGF0ZW5jeSAgID0gTExfRkxBU0hfTEFURU5DWV8wOyAgLyogZGVmYXVsdCB2YWx1ZSAwV1MgKi8KKyAgdWludDE2X3QgaW5kZXg7CisKKyAgLyogQXJyYXkgdXNlZCBmb3IgRkxBU0ggbGF0ZW5jeSBhY2NvcmRpbmcgdG8gSENMSzQgRnJlcXVlbmN5ICovCisgIC8qIEZsYXNoIENsb2NrIHNvdXJjZSAoSENMSzQpIHJhbmdlIGluIE1IeiB3aXRoIGEgVkNPUkUgaXMgcmFuZ2UxICovCisgIGNvbnN0IHVpbnQzMl90IFVUSUxTX0NMS19TUkNfUkFOR0VfVk9TMVtdID0gezE4MDAwMDAwVSwgMzYwMDAwMDBVLCA1NDAwMDAwMFUsIFVUSUxTX01BWF9GUkVRVUVOQ1lfU0NBTEUxfTsKKworICAvKiBGbGFzaCBDbG9jayBzb3VyY2UgKEhDTEs0KSByYW5nZSBpbiBNSHogd2l0aCBhIFZDT1JFIGlzIHJhbmdlMiAqLworICBjb25zdCB1aW50MzJfdCBVVElMU19DTEtfU1JDX1JBTkdFX1ZPUzJbXSA9IHs2MDAwMDAwVSwgMTIwMDAwMDBVLCBVVElMU19NQVhfRlJFUVVFTkNZX1NDQUxFMn07CisKKyAgLyogRmxhc2ggTGF0ZW5jeSByYW5nZSAqLworICBjb25zdCB1aW50MzJfdCBVVElMU19MQVRFTkNZX1JBTkdFW10gPSB7TExfRkxBU0hfTEFURU5DWV8wLCBMTF9GTEFTSF9MQVRFTkNZXzEsIExMX0ZMQVNIX0xBVEVOQ1lfMiwgTExfRkxBU0hfTEFURU5DWV8zfTsKKworICAvKiBGcmVxdWVuY3kgY2Fubm90IGJlIGVxdWFsIHRvIDAgKi8KKyAgaWYoSENMSzRfRnJlcXVlbmN5ID09IDBVKQorICB7CisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoTExfUFdSX0dldFJlZ3VsVm9sdGFnZVNjYWxpbmcoKSA9PSBMTF9QV1JfUkVHVV9WT0xUQUdFX1NDQUxFMSkKKyAgICB7CisgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50b2YoVVRJTFNfQ0xLX1NSQ19SQU5HRV9WT1MxKTsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgaWYoSENMSzRfRnJlcXVlbmN5IDw9IFVUSUxTX0NMS19TUkNfUkFOR0VfVk9TMVtpbmRleF0pCisgICAgICAgIHsKKyAgICAgICAgICBsYXRlbmN5ID0gVVRJTFNfTEFURU5DWV9SQU5HRVtpbmRleF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBTQ0FMRTIgKi8KKyAgICB7CisgICAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50b2YoVVRJTFNfQ0xLX1NSQ19SQU5HRV9WT1MyKTsgaW5kZXgrKykKKyAgICAgIHsKKyAgICAgICAgaWYoSENMSzRfRnJlcXVlbmN5IDw9IFVUSUxTX0NMS19TUkNfUkFOR0VfVk9TMltpbmRleF0pCisgICAgICAgIHsKKyAgICAgICAgICBsYXRlbmN5ID0gVVRJTFNfTEFURU5DWV9SQU5HRVtpbmRleF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBMTF9GTEFTSF9TZXRMYXRlbmN5KGxhdGVuY3kpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgdG8gYWNjZXNzIHRoZSBGbGFzaAorICAgICAgIG1lbW9yeSBieSByZWFkaW5nIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KKyAgICB3aGlsZSAoTExfRkxBU0hfR2V0TGF0ZW5jeSgpICE9IGxhdGVuY3kpCisgICAgeworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgUExMIGNhbiBiZSBtb2RpZmllZAorICAqIEBwYXJhbSAgUExMX0lucHV0RnJlcXVlbmN5ICBQTEwgaW5wdXQgZnJlcXVlbmN5IChpbiBIeikKKyAgKiBAcGFyYW0gIFVUSUxTX1BMTEluaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBQTEwuCisgICogQHJldHZhbCBQTEwgb3V0cHV0IGZyZXF1ZW5jeSAoaW4gSHopCisgICovCitzdGF0aWMgdWludDMyX3QgVVRJTFNfR2V0UExMT3V0cHV0RnJlcXVlbmN5KHVpbnQzMl90IFBMTF9JbnB1dEZyZXF1ZW5jeSwgTExfVVRJTFNfUExMSW5pdFR5cGVEZWYgKlVUSUxTX1BMTEluaXRTdHJ1Y3QpCit7CisgIHVpbnQzMl90IHBsbGZyZXE7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTE1fVkFMVUUoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUExMTl9WQUxVRShVVElMU19QTExJbml0U3RydWN0LT5QTExOKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExSX1ZBTFVFKFVUSUxTX1BMTEluaXRTdHJ1Y3QtPlBMTFIpKTsKKworICAvKiBDaGVjayBkaWZmZXJlbnQgUExMIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFJNICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBQTExNOiBlbnN1cmUgdGhhdCB0aGUgVkNPIGlucHV0IGZyZXF1ZW5jeSByYW5nZXMgZnJvbSA0IHRvIDE2IE1Iei4gICAqLworICBwbGxmcmVxID0gUExMX0lucHV0RnJlcXVlbmN5IC8gKCgoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMTSA+PiBSQ0NfUExMQ0ZHUl9QTExNX1BvcykgKyAxVSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfUExMVkNPX0lOUFVUKHBsbGZyZXEpKTsKKworICAvKiAgLSBQTExOOiBlbnN1cmUgdGhhdCB0aGUgVkNPIG91dHB1dCBmcmVxdWVuY3kgaXMgYmV0d2VlbiA2NCBhbmQgMzQ0IE1Iei4qLworICBwbGxmcmVxID0gcGxsZnJlcSAqIChVVElMU19QTExJbml0U3RydWN0LT5QTExOICYgKFJDQ19QTExDRkdSX1BMTE4gPj4gUkNDX1BMTENGR1JfUExMTl9Qb3MpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX1BMTFZDT19PVVRQVVQocGxsZnJlcSkpOworCisgIC8qICAtIFBMTFI6IGVuc3VyZSB0aGF0IG1heCBmcmVxdWVuY3kgYXQgNjQwMDAwMDAgSHogaXMgcmVhY2hlZCAgICAgICAgICAgICAgICAgICAqLworICBwbGxmcmVxID0gcGxsZnJlcSAvICgoVVRJTFNfUExMSW5pdFN0cnVjdC0+UExMUiA+PiBSQ0NfUExMQ0ZHUl9QTExSX1BvcykgKyAxVSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9VVElMU19QTExfRlJFUVVFTkNZKHBsbGZyZXEpKTsKKworICByZXR1cm4gcGxsZnJlcTsKK30KKworLyoqCisgICogQGJyaWVmICBGdW5jdGlvbiB0byBjaGVjayB0aGF0IFBMTCBjYW4gYmUgbW9kaWZpZWQKKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogUExMIG1vZGlmaWNhdGlvbiBjYW4gYmUgZG9uZQorICAqICAgICAgICAgIC0gRVJST1I6IFBMTCBpcyBidXN5CisgICovCitzdGF0aWMgRXJyb3JTdGF0dXMgVVRJTFNfUExMX0lzQnVzeSh2b2lkKQoreworICBFcnJvclN0YXR1cyBzdGF0dXMgPSBTVUNDRVNTOworCisgIC8qIENoZWNrIGlmIFBMTCBpcyBidXN5Ki8KKyAgaWYoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMFUpCisgIHsKKyAgICAvKiBQTEwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyAgICBzdGF0dXMgPSBFUlJPUjsKKyAgfQorICAvKiBDaGVjayBpZiBQTExTQUkxIGlzIGJ1c3kqLworICBpZihMTF9SQ0NfUExMU0FJMV9Jc1JlYWR5KCkgIT0gMFUpCisgIHsKKyAgICAvKiBQTExTQUkxIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkICovCisgICAgc3RhdHVzID0gRVJST1I7CisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIEZ1bmN0aW9uIHRvIGVuYWJsZSBQTEwgYW5kIHN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMCisgICogQHBhcmFtICBTWVNDTEtfRnJlcXVlbmN5IFNZU0NMSyBmcmVxdWVuY3kKKyAgKiBAcGFyYW0gIFVUSUxTX0Nsa0luaXRTdHJ1Y3QgcG9pbnRlciB0byBhIEByZWYgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBCVVMgcHJlc2NhbGVycy4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogTm8gcHJvYmxlbSB0byBzd2l0Y2ggc3lzdGVtIHRvIFBMTAorICAqICAgICAgICAgIC0gRVJST1I6IFByb2JsZW0gdG8gc3dpdGNoIHN5c3RlbSB0byBQTEwKKyAgKi8KK3N0YXRpYyBFcnJvclN0YXR1cyBVVElMU19FbmFibGVQTExBbmRTd2l0Y2hTeXN0ZW0odWludDMyX3QgU1lTQ0xLX0ZyZXF1ZW5jeSwgTExfVVRJTFNfQ2xrSW5pdFR5cGVEZWYgKlVUSUxTX0Nsa0luaXRTdHJ1Y3QpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisgIHVpbnQzMl90IGhjbGtzX2ZyZXF1ZW5jeV90YXJnZXQsIGhjbGtzX2ZyZXF1ZW5jeV9jdXJyZW50LCBzeXNjbGtfY3VycmVudDsKKworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfU1lTQ0xLX0RJVihVVElMU19DbGtJbml0U3RydWN0LT5DUFUxQ0xLRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfU1lTQ0xLX0RJVihVVElMU19DbGtJbml0U3RydWN0LT5DUFUyQ0xLRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfU1lTQ0xLX0RJVihVVElMU19DbGtJbml0U3RydWN0LT5BSEI0Q0xLRGl2aWRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfVVRJTFNfQVBCMV9ESVYoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMUNMS0RpdmlkZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX1VUSUxTX0FQQjJfRElWKFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFQQjJDTEtEaXZpZGVyKSk7CisKKyAgLyogQ2FsY3VsYXRlIEhDTEs0IGZyZXF1ZW5jeSBiYXNlZCBvbiBTWVNDTEtfRnJlcXVlbmN5IHRhcmdldCAqLworICBoY2xrc19mcmVxdWVuY3lfdGFyZ2V0ID0gX19MTF9SQ0NfQ0FMQ19IQ0xLNF9GUkVRKFNZU0NMS19GcmVxdWVuY3ksIFVUSUxTX0Nsa0luaXRTdHJ1Y3QtPkFIQjRDTEtEaXZpZGVyKTsKKworICAvKiBDYWxjdWxhdGUgSENMSzQgZnJlcXVlbmN5IGN1cnJlbnQgKi8KKyAgc3lzY2xrX2N1cnJlbnQgPSAoU3lzdGVtQ29yZUNsb2NrICogQUhCUHJlc2NUYWJsZVsoTExfUkNDX0dldEFIQlByZXNjYWxlcigpICYgUkNDX0NGR1JfSFBSRSkgPj4gIFJDQ19DRkdSX0hQUkVfUG9zXSk7CisgIGhjbGtzX2ZyZXF1ZW5jeV9jdXJyZW50ID0gX19MTF9SQ0NfQ0FMQ19IQ0xLNF9GUkVRKHN5c2Nsa19jdXJyZW50LCBMTF9SQ0NfR2V0QUhCNFByZXNjYWxlcigpKTsKKworICAvKiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgYmVjYXVzZSBvZiBoaWdoZXIgQ1BVIGZyZXF1ZW5jeSAqLworICBpZihoY2xrc19mcmVxdWVuY3lfY3VycmVudCA8IGhjbGtzX2ZyZXF1ZW5jeV90YXJnZXQpCisgIHsKKyAgICAvKiBTZXQgRkxBU0ggbGF0ZW5jeSB0byBoaWdoZXN0IGxhdGVuY3kgKi8KKyAgICBzdGF0dXMgPSBVVElMU19TZXRGbGFzaExhdGVuY3koaGNsa3NfZnJlcXVlbmN5X3RhcmdldCk7CisgIH0KKworICAvKiBVcGRhdGUgc3lzdGVtIGNsb2NrIGNvbmZpZ3VyYXRpb24gKi8KKyAgaWYoc3RhdHVzID09IFNVQ0NFU1MpCisgIHsKKyAgICAvKiBFbmFibGUgUExMICovCisgICAgTExfUkNDX1BMTF9FbmFibGUoKTsKKyAgICBMTF9SQ0NfUExMX0VuYWJsZURvbWFpbl9TWVMoKTsKKyAgICB3aGlsZSAoTExfUkNDX1BMTF9Jc1JlYWR5KCkgIT0gMVUpCisgICAgeworICAgICAgLyogV2FpdCBmb3IgUExMIHJlYWR5ICovCisgICAgfQorCisgICAgLyogU3lzY2xrIGFjdGl2YXRpb24gb24gdGhlIG1haW4gUExMICovCisgICAgTExfUkNDX1NldEFIQlByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5DUFUxQ0xLRGl2aWRlcik7CisgICAgTExfQzJfUkNDX1NldEFIQlByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5DUFUyQ0xLRGl2aWRlcik7CisgICAgTExfUkNDX1NldEFIQjRQcmVzY2FsZXIoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QUhCNENMS0RpdmlkZXIpOworICAgIExMX1JDQ19TZXRTeXNDbGtTb3VyY2UoTExfUkNDX1NZU19DTEtTT1VSQ0VfUExMKTsKKyAgICB3aGlsZSAoTExfUkNDX0dldFN5c0Nsa1NvdXJjZSgpICE9IExMX1JDQ19TWVNfQ0xLU09VUkNFX1NUQVRVU19QTEwpCisgICAgeworICAgICAgLyogV2FpdCBmb3Igc3lzdGVtIGNsb2NrIHN3aXRjaCB0byBQTEwgKi8KKyAgICB9CisKKyAgICAvKiBTZXQgQVBCMSAmIEFQQjIgcHJlc2NhbGVyKi8KKyAgICBMTF9SQ0NfU2V0QVBCMVByZXNjYWxlcihVVElMU19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlcik7CisgICAgTExfUkNDX1NldEFQQjJQcmVzY2FsZXIoVVRJTFNfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpOworICB9CisgICAgCisgIC8qIERlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB3YWl0IHN0YXRlcyBiZWNhdXNlIG9mIGxvd2VyIENQVSBmcmVxdWVuY3kgKi8KKyAgaWYoaGNsa3NfZnJlcXVlbmN5X2N1cnJlbnQgPiBoY2xrc19mcmVxdWVuY3lfdGFyZ2V0KQorICB7CisgICAgLyogU2V0IEZMQVNIIGxhdGVuY3kgdG8gbG93ZXN0IGxhdGVuY3kgKi8KKyAgICBzdGF0dXMgPSBVVElMU19TZXRGbGFzaExhdGVuY3koaGNsa3NfZnJlcXVlbmN5X3RhcmdldCk7CisgIH0KKworICAvKiBVcGRhdGUgU3lzdGVtQ29yZUNsb2NrIHZhcmlhYmxlICovCisgIGlmKHN0YXR1cyA9PSBTVUNDRVNTKQorICB7CisgICAgTExfU2V0U3lzdGVtQ29yZUNsb2NrKF9fTExfUkNDX0NBTENfSENMSzFfRlJFUShTWVNDTEtfRnJlcXVlbmN5LCBVVElMU19DbGtJbml0U3RydWN0LT5DUFUxQ0xLRGl2aWRlcikpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9faHRtcmVzYy9taW5pLXN0LmNzcyBiL19odG1yZXNjL21pbmktc3QuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmJjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9faHRtcmVzYy9taW5pLXN0LmNzcwpAQCAtMCwwICsxLDE3MDAgQEAKK0BjaGFyc2V0ICJVVEYtOCI7CisvKgorICBGbGF2b3IgbmFtZTogRGVmYXVsdCAobWluaS1kZWZhdWx0KQorICBBdXRob3I6IEFuZ2Vsb3MgQ2hhbGFyaXMgKGNoYWxhcmFuZ2Vsb0BnbWFpbC5jb20pCisgIE1haW50YWluZXJzOiBBbmdlbG9zIENoYWxhcmlzCisgIG1pbmkuY3NzIHZlcnNpb246IHYzLjAuMC1hbHBoYS4zCisqLworLyoKKyAgQnJvd3NlcnMgcmVzZXRzIGFuZCBiYXNlIHR5cG9ncmFwaHkuCisqLworLyogQ29yZSBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tZm9yZS1jb2xvcjogIzExMTsKKyAgLS1zZWNvbmRhcnktZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLXNlY29uZGFyeS1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLWJsb2NrcXVvdGUtY29sb3I6ICNmNTdjMDA7CisgIC0tcHJlLWNvbG9yOiAjMTU2NWMwOworICAtLWJvcmRlci1jb2xvcjogI2FhYTsKKyAgLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWhlYWRpbmctcmF0aW86IDEuMTk7CisgIC0tdW5pdmVyc2FsLW1hcmdpbjogMC41cmVtOworICAtLXVuaXZlcnNhbC1wYWRkaW5nOiAwLjEyNXJlbTsKKyAgLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1czogMC4xMjVyZW07CisgIC0tYS1saW5rLWNvbG9yOiAjMDI3N2JkOworICAtLWEtdmlzaXRlZC1jb2xvcjogIzAxNTc5YjsgfQorCitodG1sIHsKKyAgZm9udC1zaXplOiAxNHB4OyB9CisKK2EsIGIsIGRlbCwgZW0sIGksIGlucywgcSwgc3Bhbiwgc3Ryb25nLCB1IHsKKyAgZm9udC1zaXplOiAxZW07IH0KKworaHRtbCwgKiB7CisgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgVWJ1bnR1LCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgIGxpbmUtaGVpZ2h0OiAxLjQ7CisgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgfQorCisqIHsKKyAgZm9udC1zaXplOiAxcmVtOyB9CisKK2JvZHkgeworICBtYXJnaW46IDA7CisgIGNvbG9yOiB2YXIoLS1mb3JlLWNvbG9yKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tYmFjay1jb2xvcik7IH0KKworZGV0YWlscyB7CisgIGRpc3BsYXk6IGJsb2NrOyB9CisKK3N1bW1hcnkgeworICBkaXNwbGF5OiBsaXN0LWl0ZW07IH0KKworYWJiclt0aXRsZV0geworICBib3JkZXItYm90dG9tOiBub25lOworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7IH0KKworaW5wdXQgeworICBvdmVyZmxvdzogdmlzaWJsZTsgfQorCitpbWcgeworICBtYXgtd2lkdGg6IDEwMCU7CisgIGhlaWdodDogYXV0bzsgfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKyAgbGluZS1oZWlnaHQ6IDEuMjsKKyAgbWFyZ2luOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgZm9udC13ZWlnaHQ6IDUwMDsgfQorICBoMSBzbWFsbCwgaDIgc21hbGwsIGgzIHNtYWxsLCBoNCBzbWFsbCwgaDUgc21hbGwsIGg2IHNtYWxsIHsKKyAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWZvcmUtY29sb3IpOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi10b3A6IC0wLjI1cmVtOyB9CisKK2gxIHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSAqIHZhcigtLWhlYWRpbmctcmF0aW8pICogdmFyKC0taGVhZGluZy1yYXRpbykpOyB9CisKK2gyIHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1oZWFkaW5nLXJhdGlvKSAqIHZhcigtLWhlYWRpbmctcmF0aW8pOyApOworICBiYWNrZ3JvdW5kOiB2YXIoLS1tYXJrLWJhY2stY29sb3IpOworICBmb250LXdlaWdodDogNjAwOworICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsKKyAgY29sb3I6IHZhcigtLW1hcmstZm9yZS1jb2xvcik7IH0KKworaDMgeworICBmb250LXNpemU6IGNhbGMoMXJlbSAqIHZhcigtLWhlYWRpbmctcmF0aW8pKTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IAorICAvKiBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOyAqLworICAgIH0KKworaDQgeworICBmb250LXNpemU6IDFyZW07KTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDQgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7ICB9CisKK2g1IHsKKyAgZm9udC1zaXplOiAxcmVtOyB9CisKK2g2IHsKKyAgZm9udC1zaXplOiBjYWxjKDFyZW0gLyB2YXIoLS1oZWFkaW5nLXJhdGlvKSk7IH0KKworcCB7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworb2wsIHVsIHsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgcGFkZGluZy1sZWZ0OiBjYWxjKDYgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKworYiwgc3Ryb25nIHsKKyAgZm9udC13ZWlnaHQ6IDcwMDsgfQorCitociB7CisgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OworICBib3JkZXI6IDA7CisgIGxpbmUtaGVpZ2h0OiAxLjI1ZW07CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGhlaWdodDogMC4wNjI1cmVtOworICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCB2YXIoLS1ib3JkZXItY29sb3IpIDIwJSwgdmFyKC0tYm9yZGVyLWNvbG9yKSA4MCUsIHRyYW5zcGFyZW50KTsgfQorCitibG9ja3F1b3RlIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWZvcmUtY29sb3IpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICBwYWRkaW5nOiBjYWxjKDMgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLWxlZnQ6IDAuMzc1cmVtIHNvbGlkIHZhcigtLWJsb2NrcXVvdGUtY29sb3IpOworICBib3JkZXItcmFkaXVzOiAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMDsgfQorICBibG9ja3F1b3RlOmJlZm9yZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogY2FsYygwcmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICBsZWZ0OiAwOworICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogM3JlbTsKKyAgICBmb250LXdlaWdodDogNzAwOworICAgIGNvbnRlbnQ6ICJcMjAxYyI7CisgICAgY29sb3I6IHZhcigtLWJsb2NrcXVvdGUtY29sb3IpOyB9CisgIGJsb2NrcXVvdGVbY2l0ZV06YWZ0ZXIgeworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXNpemU6IDAuNzVlbTsKKyAgICBmb250LXdlaWdodDogNzAwOworICAgIGNvbnRlbnQ6ICJcYeKAlCAgIiBhdHRyKGNpdGUpOworICAgIHdoaXRlLXNwYWNlOiBwcmU7IH0KKworY29kZSwga2JkLCBwcmUsIHNhbXAgeworICBmb250LWZhbWlseTogTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2U7CisgIGZvbnQtc2l6ZTogMC44NWVtOyB9CisKK2NvZGUgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK2tiZCB7CisgIGJhY2tncm91bmQ6IHZhcigtLWZvcmUtY29sb3IpOworICBjb2xvcjogdmFyKC0tYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK3ByZSB7CisgIG92ZXJmbG93OiBhdXRvOworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1sZWZ0OiAwLjI1cmVtIHNvbGlkIHZhcigtLXByZS1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSAwOyB9CisKK3N1cCwgc3ViLCBjb2RlLCBrYmQgeworICBsaW5lLWhlaWdodDogMDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IH0KKworc21hbGwsIHN1cCwgc3ViLCBmaWdjYXB0aW9uIHsKKyAgZm9udC1zaXplOiAwLjc1ZW07IH0KKworc3VwIHsKKyAgdG9wOiAtMC41ZW07IH0KKworc3ViIHsKKyAgYm90dG9tOiAtMC4yNWVtOyB9CisKK2ZpZ3VyZSB7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7IH0KKworZmlnY2FwdGlvbiB7CisgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktZm9yZS1jb2xvcik7IH0KKworYSB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQorICBhOmxpbmsgeworICAgIGNvbG9yOiB2YXIoLS1hLWxpbmstY29sb3IpOyB9CisgIGE6dmlzaXRlZCB7CisgICAgY29sb3I6IHZhcigtLWEtdmlzaXRlZC1jb2xvcik7IH0KKyAgYTpob3ZlciwgYTpmb2N1cyB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KKworLyoKKyAgRGVmaW5pdGlvbnMgZm9yIHRoZSBncmlkIHN5c3RlbSwgY2FyZHMgYW5kIGNvbnRhaW5lcnMuCisqLworLmNvbnRhaW5lciB7CisgIG1hcmdpbjogMCBhdXRvOworICBwYWRkaW5nOiAwIGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorCisucm93IHsKKyAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleDogMCAxIGF1dG87CisgIGZsZXgtZmxvdzogcm93IHdyYXA7IH0KKworLmNvbC1zbSwKK1tjbGFzc149J2NvbC1zbS0nXSwKK1tjbGFzc149J2NvbC1zbS1vZmZzZXQtJ10sCisucm93W2NsYXNzKj0nY29scy1zbS0nXSA+ICogeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBmbGV4OiAwIDAgYXV0bzsKKyAgcGFkZGluZzogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKKy5jb2wtc20sCisucm93LmNvbHMtc20gPiAqIHsKKyAgbWF4LXdpZHRoOiAxMDAlOworICBmbGV4LWdyb3c6IDE7CisgIGZsZXgtYmFzaXM6IDA7IH0KKworLmNvbC1zbS0xLAorLnJvdy5jb2xzLXNtLTEgPiAqIHsKKyAgbWF4LXdpZHRoOiA4LjMzMzMzMzMzMzMlOworICBmbGV4LWJhc2lzOiA4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTAgeworICBtYXJnaW4tbGVmdDogMDsgfQorCisuY29sLXNtLTIsCisucm93LmNvbHMtc20tMiA+ICogeworICBtYXgtd2lkdGg6IDE2LjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiAxNi42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC0xIHsKKyAgbWFyZ2luLWxlZnQ6IDguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS0zLAorLnJvdy5jb2xzLXNtLTMgPiAqIHsKKyAgbWF4LXdpZHRoOiAyNSU7CisgIGZsZXgtYmFzaXM6IDI1JTsgfQorCisuY29sLXNtLW9mZnNldC0yIHsKKyAgbWFyZ2luLWxlZnQ6IDE2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tNCwKKy5yb3cuY29scy1zbS00ID4gKiB7CisgIG1heC13aWR0aDogMzMuMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDMzLjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTMgeworICBtYXJnaW4tbGVmdDogMjUlOyB9CisKKy5jb2wtc20tNSwKKy5yb3cuY29scy1zbS01ID4gKiB7CisgIG1heC13aWR0aDogNDEuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDQxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTQgeworICBtYXJnaW4tbGVmdDogMzMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS02LAorLnJvdy5jb2xzLXNtLTYgPiAqIHsKKyAgbWF4LXdpZHRoOiA1MCU7CisgIGZsZXgtYmFzaXM6IDUwJTsgfQorCisuY29sLXNtLW9mZnNldC01IHsKKyAgbWFyZ2luLWxlZnQ6IDQxLjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tNywKKy5yb3cuY29scy1zbS03ID4gKiB7CisgIG1heC13aWR0aDogNTguMzMzMzMzMzMzMyU7CisgIGZsZXgtYmFzaXM6IDU4LjMzMzMzMzMzMzMlOyB9CisKKy5jb2wtc20tb2Zmc2V0LTYgeworICBtYXJnaW4tbGVmdDogNTAlOyB9CisKKy5jb2wtc20tOCwKKy5yb3cuY29scy1zbS04ID4gKiB7CisgIG1heC13aWR0aDogNjYuNjY2NjY2NjY2NyU7CisgIGZsZXgtYmFzaXM6IDY2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tb2Zmc2V0LTcgeworICBtYXJnaW4tbGVmdDogNTguMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS05LAorLnJvdy5jb2xzLXNtLTkgPiAqIHsKKyAgbWF4LXdpZHRoOiA3NSU7CisgIGZsZXgtYmFzaXM6IDc1JTsgfQorCisuY29sLXNtLW9mZnNldC04IHsKKyAgbWFyZ2luLWxlZnQ6IDY2LjY2NjY2NjY2NjclOyB9CisKKy5jb2wtc20tMTAsCisucm93LmNvbHMtc20tMTAgPiAqIHsKKyAgbWF4LXdpZHRoOiA4My4zMzMzMzMzMzMzJTsKKyAgZmxleC1iYXNpczogODMuMzMzMzMzMzMzMyU7IH0KKworLmNvbC1zbS1vZmZzZXQtOSB7CisgIG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworLmNvbC1zbS0xMSwKKy5yb3cuY29scy1zbS0xMSA+ICogeworICBtYXgtd2lkdGg6IDkxLjY2NjY2NjY2NjclOworICBmbGV4LWJhc2lzOiA5MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW9mZnNldC0xMCB7CisgIG1hcmdpbi1sZWZ0OiA4My4zMzMzMzMzMzMzJTsgfQorCisuY29sLXNtLTEyLAorLnJvdy5jb2xzLXNtLTEyID4gKiB7CisgIG1heC13aWR0aDogMTAwJTsKKyAgZmxleC1iYXNpczogMTAwJTsgfQorCisuY29sLXNtLW9mZnNldC0xMSB7CisgIG1hcmdpbi1sZWZ0OiA5MS42NjY2NjY2NjY3JTsgfQorCisuY29sLXNtLW5vcm1hbCB7CisgIG9yZGVyOiBpbml0aWFsOyB9CisKKy5jb2wtc20tZmlyc3QgeworICBvcmRlcjogLTk5OTsgfQorCisuY29sLXNtLWxhc3QgeworICBvcmRlcjogOTk5OyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSB7CisgIC5jb2wtbWQsCisgIFtjbGFzc149J2NvbC1tZC0nXSwKKyAgW2NsYXNzXj0nY29sLW1kLW9mZnNldC0nXSwKKyAgLnJvd1tjbGFzcyo9J2NvbHMtbWQtJ10gPiAqIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGZsZXg6IDAgMCBhdXRvOworICAgIHBhZGRpbmc6IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCisgIC5jb2wtbWQsCisgIC5yb3cuY29scy1tZCA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgZmxleC1iYXNpczogMDsgfQorCisgIC5jb2wtbWQtMSwKKyAgLnJvdy5jb2xzLW1kLTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTAgeworICAgIG1hcmdpbi1sZWZ0OiAwOyB9CisKKyAgLmNvbC1tZC0yLAorICAucm93LmNvbHMtbWQtMiA+ICogeworICAgIG1heC13aWR0aDogMTYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC0xIHsKKyAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtMywKKyAgLnJvdy5jb2xzLW1kLTMgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDI1JTsKKyAgICBmbGV4LWJhc2lzOiAyNSU7IH0KKworICAuY29sLW1kLW9mZnNldC0yIHsKKyAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTQsCisgIC5yb3cuY29scy1tZC00ID4gKiB7CisgICAgbWF4LXdpZHRoOiAzMy4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7IH0KKworICAuY29sLW1kLTUsCisgIC5yb3cuY29scy1tZC01ID4gKiB7CisgICAgbWF4LXdpZHRoOiA0MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTQgeworICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtNiwKKyAgLnJvdy5jb2xzLW1kLTYgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDUwJTsKKyAgICBmbGV4LWJhc2lzOiA1MCU7IH0KKworICAuY29sLW1kLW9mZnNldC01IHsKKyAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTcsCisgIC5yb3cuY29scy1tZC03ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1OC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7IH0KKworICAuY29sLW1kLTgsCisgIC5yb3cuY29scy1tZC04ID4gKiB7CisgICAgbWF4LXdpZHRoOiA2Ni42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbWQtb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbWQtOSwKKyAgLnJvdy5jb2xzLW1kLTkgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDc1JTsKKyAgICBmbGV4LWJhc2lzOiA3NSU7IH0KKworICAuY29sLW1kLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLTEwLAorICAucm93LmNvbHMtbWQtMTAgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDgzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsgfQorCisgIC5jb2wtbWQtMTEsCisgIC5yb3cuY29scy1tZC0xMSA+ICogeworICAgIG1heC13aWR0aDogOTEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLW1kLW9mZnNldC0xMCB7CisgICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1tZC0xMiwKKyAgLnJvdy5jb2xzLW1kLTEyID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtYmFzaXM6IDEwMCU7IH0KKworICAuY29sLW1kLW9mZnNldC0xMSB7CisgICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1tZC1ub3JtYWwgeworICAgIG9yZGVyOiBpbml0aWFsOyB9CisKKyAgLmNvbC1tZC1maXJzdCB7CisgICAgb3JkZXI6IC05OTk7IH0KKworICAuY29sLW1kLWxhc3QgeworICAgIG9yZGVyOiA5OTk7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgIC5jb2wtbGcsCisgIFtjbGFzc149J2NvbC1sZy0nXSwKKyAgW2NsYXNzXj0nY29sLWxnLW9mZnNldC0nXSwKKyAgLnJvd1tjbGFzcyo9J2NvbHMtbGctJ10gPiAqIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIGZsZXg6IDAgMCBhdXRvOworICAgIHBhZGRpbmc6IDAgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsgfQorCisgIC5jb2wtbGcsCisgIC5yb3cuY29scy1sZyA+ICogeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4LWdyb3c6IDE7CisgICAgZmxleC1iYXNpczogMDsgfQorCisgIC5jb2wtbGctMSwKKyAgLnJvdy5jb2xzLWxnLTEgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDguMzMzMzMzMzMzMyU7CisgICAgZmxleC1iYXNpczogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTAgeworICAgIG1hcmdpbi1sZWZ0OiAwOyB9CisKKyAgLmNvbC1sZy0yLAorICAucm93LmNvbHMtbGctMiA+ICogeworICAgIG1heC13aWR0aDogMTYuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC0xIHsKKyAgICBtYXJnaW4tbGVmdDogOC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctMywKKyAgLnJvdy5jb2xzLWxnLTMgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDI1JTsKKyAgICBmbGV4LWJhc2lzOiAyNSU7IH0KKworICAuY29sLWxnLW9mZnNldC0yIHsKKyAgICBtYXJnaW4tbGVmdDogMTYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTQsCisgIC5yb3cuY29scy1sZy00ID4gKiB7CisgICAgbWF4LXdpZHRoOiAzMy4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTMgeworICAgIG1hcmdpbi1sZWZ0OiAyNSU7IH0KKworICAuY29sLWxnLTUsCisgIC5yb3cuY29scy1sZy01ID4gKiB7CisgICAgbWF4LXdpZHRoOiA0MS42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA0MS42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTQgeworICAgIG1hcmdpbi1sZWZ0OiAzMy4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctNiwKKyAgLnJvdy5jb2xzLWxnLTYgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDUwJTsKKyAgICBmbGV4LWJhc2lzOiA1MCU7IH0KKworICAuY29sLWxnLW9mZnNldC01IHsKKyAgICBtYXJnaW4tbGVmdDogNDEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTcsCisgIC5yb3cuY29scy1sZy03ID4gKiB7CisgICAgbWF4LXdpZHRoOiA1OC4zMzMzMzMzMzMzJTsKKyAgICBmbGV4LWJhc2lzOiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTYgeworICAgIG1hcmdpbi1sZWZ0OiA1MCU7IH0KKworICAuY29sLWxnLTgsCisgIC5yb3cuY29scy1sZy04ID4gKiB7CisgICAgbWF4LXdpZHRoOiA2Ni42NjY2NjY2NjY3JTsKKyAgICBmbGV4LWJhc2lzOiA2Ni42NjY2NjY2NjY3JTsgfQorCisgIC5jb2wtbGctb2Zmc2V0LTcgeworICAgIG1hcmdpbi1sZWZ0OiA1OC4zMzMzMzMzMzMzJTsgfQorCisgIC5jb2wtbGctOSwKKyAgLnJvdy5jb2xzLWxnLTkgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDc1JTsKKyAgICBmbGV4LWJhc2lzOiA3NSU7IH0KKworICAuY29sLWxnLW9mZnNldC04IHsKKyAgICBtYXJnaW4tbGVmdDogNjYuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLTEwLAorICAucm93LmNvbHMtbGctMTAgPiAqIHsKKyAgICBtYXgtd2lkdGg6IDgzLjMzMzMzMzMzMzMlOworICAgIGZsZXgtYmFzaXM6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy1vZmZzZXQtOSB7CisgICAgbWFyZ2luLWxlZnQ6IDc1JTsgfQorCisgIC5jb2wtbGctMTEsCisgIC5yb3cuY29scy1sZy0xMSA+ICogeworICAgIG1heC13aWR0aDogOTEuNjY2NjY2NjY2NyU7CisgICAgZmxleC1iYXNpczogOTEuNjY2NjY2NjY2NyU7IH0KKworICAuY29sLWxnLW9mZnNldC0xMCB7CisgICAgbWFyZ2luLWxlZnQ6IDgzLjMzMzMzMzMzMzMlOyB9CisKKyAgLmNvbC1sZy0xMiwKKyAgLnJvdy5jb2xzLWxnLTEyID4gKiB7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXgtYmFzaXM6IDEwMCU7IH0KKworICAuY29sLWxnLW9mZnNldC0xMSB7CisgICAgbWFyZ2luLWxlZnQ6IDkxLjY2NjY2NjY2NjclOyB9CisKKyAgLmNvbC1sZy1ub3JtYWwgeworICAgIG9yZGVyOiBpbml0aWFsOyB9CisKKyAgLmNvbC1sZy1maXJzdCB7CisgICAgb3JkZXI6IC05OTk7IH0KKworICAuY29sLWxnLWxhc3QgeworICAgIG9yZGVyOiA5OTk7IH0gfQorLyogQ2FyZCBjb21wb25lbnQgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLWNhcmQtZm9yZS1jb2xvcjogIzExMTsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2RkZDsgfQorCisuY2FyZCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgYWxpZ24tc2VsZjogY2VudGVyOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHdpZHRoOiAxMDAlOworICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tY2FyZC1mb3JlLWNvbG9yKTsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY2FyZC1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIG92ZXJmbG93OiBoaWRkZW47IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMzIwcHgpIHsKKyAgICAuY2FyZCB7CisgICAgICBtYXgtd2lkdGg6IDMyMHB4OyB9IH0KKyAgLmNhcmQgPiAuc2VjdGlvbmUgeworICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFjay1jb2xvcik7CisgICAgY29sb3I6IHZhcigtLWNhcmQtZm9yZS1jb2xvcik7CisgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICBtYXJnaW46IDA7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgYm9yZGVyLWJvdHRvbTogMC4wNjI1cmVtIHNvbGlkIHZhcigtLWNhcmQtYm9yZGVyLWNvbG9yKTsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgd2lkdGg6IDEwMCU7IH0KKyAgICAuY2FyZCA+IC5zZWN0aW9uZS5tZWRpYSB7CisgICAgICBoZWlnaHQ6IDIwMHB4OworICAgICAgcGFkZGluZzogMDsKKyAgICAgIC1vLW9iamVjdC1maXQ6IGNvdmVyOworICAgICAgb2JqZWN0LWZpdDogY292ZXI7IH0KKyAgLmNhcmQgPiAuc2VjdGlvbmU6bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLWJvdHRvbTogMDsgfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIGNhcmQgZWxlbWVudHMuCisqLworQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMjQwcHgpIHsKKyAgLmNhcmQuc21hbGwgeworICAgIG1heC13aWR0aDogMjQwcHg7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNDgwcHgpIHsKKyAgLmNhcmQubGFyZ2UgeworICAgIG1heC13aWR0aDogNDgwcHg7IH0gfQorLmNhcmQuZmx1aWQgeworICBtYXgtd2lkdGg6IDEwMCU7CisgIHdpZHRoOiBhdXRvOyB9CisKKy5jYXJkLndhcm5pbmcgeworLyogIC0tY2FyZC1iYWNrLWNvbG9yOiAjZmZjYTI4OyAqLworICAtLWNhcmQtYmFjay1jb2xvcjogI2U1YjhiNzsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2U4YjgyNTsgfQorCisuY2FyZC5lcnJvciB7CisgIC0tY2FyZC1iYWNrLWNvbG9yOiAjYjcxYzFjOworICAtLWNhcmQtZm9yZS1jb2xvcjogI2Y4ZjhmODsKKyAgLS1jYXJkLWJvcmRlci1jb2xvcjogI2E3MWExYTsgfQorCisuY2FyZCA+IC5zZWN0aW9uZS5kYXJrIHsKKyAgLS1jYXJkLWJhY2stY29sb3I6ICNlMGUwZTA7IH0KKworLmNhcmQgPiAuc2VjdGlvbmUuZG91YmxlLXBhZGRlZCB7CisgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgZm9ybXMgYW5kIGlucHV0IGVsZW1lbnRzLgorKi8KKy8qIElucHV0X2NvbnRyb2wgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucyAqLworOnJvb3QgeworICAtLWZvcm0tYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1mb3JtLWZvcmUtY29sb3I6ICMxMTE7CisgIC0tZm9ybS1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0taW5wdXQtYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1pbnB1dC1mb3JlLWNvbG9yOiAjMTExOworICAtLWlucHV0LWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1pbnB1dC1mb2N1cy1jb2xvcjogIzAyODhkMTsKKyAgLS1pbnB1dC1pbnZhbGlkLWNvbG9yOiAjZDMyZjJmOworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjZTJlMmUyOworICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjZGNkY2RjOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjMjEyMTIxOworICAtLWJ1dHRvbi1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICAtLWJ1dHRvbi1ob3Zlci1ib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OworICAtLWJ1dHRvbi1ncm91cC1ib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxMjQsIDEyNCwgMC41NCk7IH0KKworZm9ybSB7CisgIGJhY2tncm91bmQ6IHZhcigtLWZvcm0tYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1mb3JtLWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1mb3JtLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgcGFkZGluZzogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworZmllbGRzZXQgeworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1mb3JtLWJvcmRlci1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCk7CisgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCitsZWdlbmQgeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBkaXNwbGF5OiB0YWJsZTsKKyAgbWF4LXdpZHRoOiAxMDAlOworICB3aGl0ZS1zcGFjZTogbm9ybWFsOworICBmb250LXdlaWdodDogNzAwOworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisKK2xhYmVsIHsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7IH0KKworLmlucHV0LWdyb3VwIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9CisgIC5pbnB1dC1ncm91cC5mbHVpZCB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyB9CisgICAgLmlucHV0LWdyb3VwLmZsdWlkID4gaW5wdXQgeworICAgICAgbWF4LXdpZHRoOiAxMDAlOworICAgICAgZmxleC1ncm93OiAxOworICAgICAgZmxleC1iYXNpczogMHB4OyB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgICAgIC5pbnB1dC1ncm91cC5mbHVpZCB7CisgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOworICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyB9IH0KKyAgLmlucHV0LWdyb3VwLnZlcnRpY2FsIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOworICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0KKyAgICAuaW5wdXQtZ3JvdXAudmVydGljYWwgPiBpbnB1dCB7CisgICAgICBtYXgtd2lkdGg6IDEwMCU7CisgICAgICBmbGV4LWdyb3c6IDE7CisgICAgICBmbGV4LWJhc2lzOiAwcHg7IH0KKworW3R5cGU9Im51bWJlciJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLCBbdHlwZT0ibnVtYmVyIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24geworICBoZWlnaHQ6IGF1dG87IH0KKworW3R5cGU9InNlYXJjaCJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7CisgIG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9CisKK1t0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwKK1t0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgfQorCitpbnB1dDpub3QoW3R5cGVdKSwgW3R5cGU9InRleHQiXSwgW3R5cGU9ImVtYWlsIl0sIFt0eXBlPSJudW1iZXIiXSwgW3R5cGU9InNlYXJjaCJdLAorW3R5cGU9InBhc3N3b3JkIl0sIFt0eXBlPSJ1cmwiXSwgW3R5cGU9InRlbCJdLCBbdHlwZT0iY2hlY2tib3giXSwgW3R5cGU9InJhZGlvIl0sIHRleHRhcmVhLCBzZWxlY3QgeworICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iYWNrLWNvbG9yKTsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1pbnB1dC1ib3JkZXItY29sb3IpOworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgIG1hcmdpbjogY2FsYyh2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSAvIDIpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisKK2lucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6aG92ZXIsIGlucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSk6Zm9jdXMsIHRleHRhcmVhOmhvdmVyLCB0ZXh0YXJlYTpmb2N1cywgc2VsZWN0OmhvdmVyLCBzZWxlY3Q6Zm9jdXMgeworICBib3JkZXItY29sb3I6IHZhcigtLWlucHV0LWZvY3VzLWNvbG9yKTsKKyAgYm94LXNoYWRvdzogbm9uZTsgfQoraW5wdXQ6bm90KFt0eXBlPSJidXR0b24iXSk6bm90KFt0eXBlPSJzdWJtaXQiXSk6bm90KFt0eXBlPSJyZXNldCJdKTppbnZhbGlkLCBpbnB1dDpub3QoW3R5cGU9ImJ1dHRvbiJdKTpub3QoW3R5cGU9InN1Ym1pdCJdKTpub3QoW3R5cGU9InJlc2V0Il0pOmZvY3VzOmludmFsaWQsIHRleHRhcmVhOmludmFsaWQsIHRleHRhcmVhOmZvY3VzOmludmFsaWQsIHNlbGVjdDppbnZhbGlkLCBzZWxlY3Q6Zm9jdXM6aW52YWxpZCB7CisgIGJvcmRlci1jb2xvcjogdmFyKC0taW5wdXQtaW52YWxpZC1jb2xvcik7CisgIGJveC1zaGFkb3c6IG5vbmU7IH0KK2lucHV0Om5vdChbdHlwZT0iYnV0dG9uIl0pOm5vdChbdHlwZT0ic3VibWl0Il0pOm5vdChbdHlwZT0icmVzZXQiXSlbcmVhZG9ubHldLCB0ZXh0YXJlYVtyZWFkb25seV0sIHNlbGVjdFtyZWFkb25seV0geworICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFjay1jb2xvcik7IH0KKworc2VsZWN0IHsKKyAgbWF4LXdpZHRoOiAxMDAlOyB9CisKK29wdGlvbiB7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9CisKK1t0eXBlPSJjaGVja2JveCJdLCBbdHlwZT0icmFkaW8iXSB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgLW1vei1hcHBlYXJhbmNlOiBub25lOworICBhcHBlYXJhbmNlOiBub25lOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGhlaWdodDogY2FsYygxcmVtICsgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMik7CisgIHdpZHRoOiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOworICBwYWRkaW5nOiAwOworICBmbGV4LWJhc2lzOiBjYWxjKDFyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKSAhaW1wb3J0YW50OworICBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfQorICBbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkOmJlZm9yZSwgW3R5cGU9InJhZGlvIl06Y2hlY2tlZDpiZWZvcmUgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQorCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkOmJlZm9yZSB7CisgIGNvbnRlbnQ6ICdcMjcxMyc7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBmb250LXNpemU6IGNhbGMoMXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICB0b3A6IGNhbGMoMHJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgIGxlZnQ6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCk7IH0KKworW3R5cGU9InJhZGlvIl0geworICBib3JkZXItcmFkaXVzOiAxMDAlOyB9CisgIFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQ6YmVmb3JlIHsKKyAgICBib3JkZXItcmFkaXVzOiAxMDAlOworICAgIGNvbnRlbnQ6ICcnOworICAgIHRvcDogY2FsYygwLjA2MjVyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgICBsZWZ0OiBjYWxjKDAuMDYyNXJlbSArIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOworICAgIGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICAgIHdpZHRoOiAwLjVyZW07CisgICAgaGVpZ2h0OiAwLjVyZW07IH0KKworOnBsYWNlaG9sZGVyLXNob3duIHsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOyB9CisKKzo6LW1zLXBsYWNlaG9sZGVyIHsKKyAgY29sb3I6IHZhcigtLWlucHV0LWZvcmUtY29sb3IpOworICBvcGFjaXR5OiAwLjU0OyB9CisKK2J1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwgW3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLCBbdHlwZT0icmVzZXQiXTo6LW1vei1mb2N1cy1pbm5lciwgW3R5cGU9InN1Ym1pdCJdOjotbW96LWZvY3VzLWlubmVyIHsKKyAgYm9yZGVyLXN0eWxlOiBub25lOworICBwYWRkaW5nOiAwOyB9CisKK2J1dHRvbiwgaHRtbCBbdHlwZT0iYnV0dG9uIl0sIFt0eXBlPSJyZXNldCJdLCBbdHlwZT0ic3VibWl0Il0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgfQorCitidXR0b24geworICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgdGV4dC10cmFuc2Zvcm06IG5vbmU7IH0KKworYnV0dG9uLCBbdHlwZT0iYnV0dG9uIl0sIFt0eXBlPSJzdWJtaXQiXSwgW3R5cGU9InJlc2V0Il0sCithLmJ1dHRvbiwgbGFiZWwuYnV0dG9uLCAuYnV0dG9uLAorYVtyb2xlPSJidXR0b24iXSwgbGFiZWxbcm9sZT0iYnV0dG9uIl0sIFtyb2xlPSJidXR0b24iXSB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tYnV0dG9uLWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgIGJ1dHRvbjpob3ZlciwgYnV0dG9uOmZvY3VzLCBbdHlwZT0iYnV0dG9uIl06aG92ZXIsIFt0eXBlPSJidXR0b24iXTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdOmhvdmVyLCBbdHlwZT0ic3VibWl0Il06Zm9jdXMsIFt0eXBlPSJyZXNldCJdOmhvdmVyLCBbdHlwZT0icmVzZXQiXTpmb2N1cywKKyAgYS5idXR0b246aG92ZXIsCisgIGEuYnV0dG9uOmZvY3VzLCBsYWJlbC5idXR0b246aG92ZXIsIGxhYmVsLmJ1dHRvbjpmb2N1cywgLmJ1dHRvbjpob3ZlciwgLmJ1dHRvbjpmb2N1cywKKyAgYVtyb2xlPSJidXR0b24iXTpob3ZlciwKKyAgYVtyb2xlPSJidXR0b24iXTpmb2N1cywgbGFiZWxbcm9sZT0iYnV0dG9uIl06aG92ZXIsIGxhYmVsW3JvbGU9ImJ1dHRvbiJdOmZvY3VzLCBbcm9sZT0iYnV0dG9uIl06aG92ZXIsIFtyb2xlPSJidXR0b24iXTpmb2N1cyB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3IpOworICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcik7IH0KKworaW5wdXQ6ZGlzYWJsZWQsIGlucHV0W2Rpc2FibGVkXSwgdGV4dGFyZWE6ZGlzYWJsZWQsIHRleHRhcmVhW2Rpc2FibGVkXSwgc2VsZWN0OmRpc2FibGVkLCBzZWxlY3RbZGlzYWJsZWRdLCBidXR0b246ZGlzYWJsZWQsIGJ1dHRvbltkaXNhYmxlZF0sIC5idXR0b246ZGlzYWJsZWQsIC5idXR0b25bZGlzYWJsZWRdLCBbcm9sZT0iYnV0dG9uIl06ZGlzYWJsZWQsIFtyb2xlPSJidXR0b24iXVtkaXNhYmxlZF0geworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworICBvcGFjaXR5OiAwLjc1OyB9CisKKy5idXR0b24tZ3JvdXAgeworICBkaXNwbGF5OiBmbGV4OworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisgIC5idXR0b24tZ3JvdXAgPiBidXR0b24sIC5idXR0b24tZ3JvdXAgW3R5cGU9ImJ1dHRvbiJdLCAuYnV0dG9uLWdyb3VwID4gW3R5cGU9InN1Ym1pdCJdLCAuYnV0dG9uLWdyb3VwID4gW3R5cGU9InJlc2V0Il0sIC5idXR0b24tZ3JvdXAgPiAuYnV0dG9uLCAuYnV0dG9uLWdyb3VwID4gW3JvbGU9ImJ1dHRvbiJdIHsKKyAgICBtYXJnaW46IDA7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXg6IDEgMSBhdXRvOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBib3gtc2hhZG93OiBub25lOyB9CisgIC5idXR0b24tZ3JvdXAgPiA6bm90KDpmaXJzdC1jaGlsZCkgeworICAgIGJvcmRlci1sZWZ0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tYnV0dG9uLWdyb3VwLWJvcmRlci1jb2xvcik7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgICAuYnV0dG9uLWdyb3VwIHsKKyAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0KKyAgICAgIC5idXR0b24tZ3JvdXAgPiA6bm90KDpmaXJzdC1jaGlsZCkgeworICAgICAgICBib3JkZXI6IDA7CisgICAgICAgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1idXR0b24tZ3JvdXAtYm9yZGVyLWNvbG9yKTsgfSB9CisKKy8qCisgIEN1c3RvbSBlbGVtZW50cyBmb3IgZm9ybXMgYW5kIGlucHV0IGVsZW1lbnRzLgorKi8KK2J1dHRvbi5wcmltYXJ5LCBbdHlwZT0iYnV0dG9uIl0ucHJpbWFyeSwgW3R5cGU9InN1Ym1pdCJdLnByaW1hcnksIFt0eXBlPSJyZXNldCJdLnByaW1hcnksIC5idXR0b24ucHJpbWFyeSwgW3JvbGU9ImJ1dHRvbiJdLnByaW1hcnkgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjMTk3NmQyOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi5wcmltYXJ5OmhvdmVyLCBidXR0b24ucHJpbWFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnByaW1hcnk6aG92ZXIsIFt0eXBlPSJidXR0b24iXS5wcmltYXJ5OmZvY3VzLCBbdHlwZT0ic3VibWl0Il0ucHJpbWFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnByaW1hcnk6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLnByaW1hcnk6aG92ZXIsIFt0eXBlPSJyZXNldCJdLnByaW1hcnk6Zm9jdXMsIC5idXR0b24ucHJpbWFyeTpob3ZlciwgLmJ1dHRvbi5wcmltYXJ5OmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0ucHJpbWFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnByaW1hcnk6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICMxNTY1YzA7IH0KKworYnV0dG9uLnNlY29uZGFyeSwgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeSwgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeSwgW3R5cGU9InJlc2V0Il0uc2Vjb25kYXJ5LCAuYnV0dG9uLnNlY29uZGFyeSwgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeSB7CisgIC0tYnV0dG9uLWJhY2stY29sb3I6ICNkMzJmMmY7CisgIC0tYnV0dG9uLWZvcmUtY29sb3I6ICNmOGY4Zjg7IH0KKyAgYnV0dG9uLnNlY29uZGFyeTpob3ZlciwgYnV0dG9uLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpob3ZlciwgW3R5cGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnNlY29uZGFyeTpmb2N1cywgW3R5cGU9InJlc2V0Il0uc2Vjb25kYXJ5OmhvdmVyLCBbdHlwZT0icmVzZXQiXS5zZWNvbmRhcnk6Zm9jdXMsIC5idXR0b24uc2Vjb25kYXJ5OmhvdmVyLCAuYnV0dG9uLnNlY29uZGFyeTpmb2N1cywgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnNlY29uZGFyeTpmb2N1cyB7CisgICAgLS1idXR0b24taG92ZXItYmFjay1jb2xvcjogI2M2MjgyODsgfQorCitidXR0b24udGVydGlhcnksIFt0eXBlPSJidXR0b24iXS50ZXJ0aWFyeSwgW3R5cGU9InN1Ym1pdCJdLnRlcnRpYXJ5LCBbdHlwZT0icmVzZXQiXS50ZXJ0aWFyeSwgLmJ1dHRvbi50ZXJ0aWFyeSwgW3JvbGU9ImJ1dHRvbiJdLnRlcnRpYXJ5IHsKKyAgLS1idXR0b24tYmFjay1jb2xvcjogIzMwODczMjsKKyAgLS1idXR0b24tZm9yZS1jb2xvcjogI2Y4ZjhmODsgfQorICBidXR0b24udGVydGlhcnk6aG92ZXIsIGJ1dHRvbi50ZXJ0aWFyeTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmhvdmVyLCBbdHlwZT0iYnV0dG9uIl0udGVydGlhcnk6Zm9jdXMsIFt0eXBlPSJzdWJtaXQiXS50ZXJ0aWFyeTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLnRlcnRpYXJ5OmZvY3VzLCBbdHlwZT0icmVzZXQiXS50ZXJ0aWFyeTpob3ZlciwgW3R5cGU9InJlc2V0Il0udGVydGlhcnk6Zm9jdXMsIC5idXR0b24udGVydGlhcnk6aG92ZXIsIC5idXR0b24udGVydGlhcnk6Zm9jdXMsIFtyb2xlPSJidXR0b24iXS50ZXJ0aWFyeTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLnRlcnRpYXJ5OmZvY3VzIHsKKyAgICAtLWJ1dHRvbi1ob3Zlci1iYWNrLWNvbG9yOiAjMjc3NTI5OyB9CisKK2J1dHRvbi5pbnZlcnNlLCBbdHlwZT0iYnV0dG9uIl0uaW52ZXJzZSwgW3R5cGU9InN1Ym1pdCJdLmludmVyc2UsIFt0eXBlPSJyZXNldCJdLmludmVyc2UsIC5idXR0b24uaW52ZXJzZSwgW3JvbGU9ImJ1dHRvbiJdLmludmVyc2UgeworICAtLWJ1dHRvbi1iYWNrLWNvbG9yOiAjMjEyMTIxOworICAtLWJ1dHRvbi1mb3JlLWNvbG9yOiAjZjhmOGY4OyB9CisgIGJ1dHRvbi5pbnZlcnNlOmhvdmVyLCBidXR0b24uaW52ZXJzZTpmb2N1cywgW3R5cGU9ImJ1dHRvbiJdLmludmVyc2U6aG92ZXIsIFt0eXBlPSJidXR0b24iXS5pbnZlcnNlOmZvY3VzLCBbdHlwZT0ic3VibWl0Il0uaW52ZXJzZTpob3ZlciwgW3R5cGU9InN1Ym1pdCJdLmludmVyc2U6Zm9jdXMsIFt0eXBlPSJyZXNldCJdLmludmVyc2U6aG92ZXIsIFt0eXBlPSJyZXNldCJdLmludmVyc2U6Zm9jdXMsIC5idXR0b24uaW52ZXJzZTpob3ZlciwgLmJ1dHRvbi5pbnZlcnNlOmZvY3VzLCBbcm9sZT0iYnV0dG9uIl0uaW52ZXJzZTpob3ZlciwgW3JvbGU9ImJ1dHRvbiJdLmludmVyc2U6Zm9jdXMgeworICAgIC0tYnV0dG9uLWhvdmVyLWJhY2stY29sb3I6ICMxMTE7IH0KKworYnV0dG9uLnNtYWxsLCBbdHlwZT0iYnV0dG9uIl0uc21hbGwsIFt0eXBlPSJzdWJtaXQiXS5zbWFsbCwgW3R5cGU9InJlc2V0Il0uc21hbGwsIC5idXR0b24uc21hbGwsIFtyb2xlPSJidXR0b24iXS5zbWFsbCB7CisgIHBhZGRpbmc6IGNhbGMoMC41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKSBjYWxjKDAuNzUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisKK2J1dHRvbi5sYXJnZSwgW3R5cGU9ImJ1dHRvbiJdLmxhcmdlLCBbdHlwZT0ic3VibWl0Il0ubGFyZ2UsIFt0eXBlPSJyZXNldCJdLmxhcmdlLCAuYnV0dG9uLmxhcmdlLCBbcm9sZT0iYnV0dG9uIl0ubGFyZ2UgeworICBwYWRkaW5nOiBjYWxjKDEuNSAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgbmF2aWdhdGlvbiBlbGVtZW50cy4KKyovCisvKiBOYXZpZ2F0aW9uIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1oZWFkZXItYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1oZWFkZXItaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1oZWFkZXItZm9yZS1jb2xvcjogIzQ0NDsKKyAgLS1oZWFkZXItYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLW5hdi1iYWNrLWNvbG9yOiAjZjhmOGY4OworICAtLW5hdi1ob3Zlci1iYWNrLWNvbG9yOiAjZjBmMGYwOworICAtLW5hdi1mb3JlLWNvbG9yOiAjNDQ0OworICAtLW5hdi1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tbmF2LWxpbmstY29sb3I6ICMwMjc3YmQ7CisgIC0tZm9vdGVyLWZvcmUtY29sb3I6ICM0NDQ7CisgIC0tZm9vdGVyLWJhY2stY29sb3I6ICNmOGY4Zjg7CisgIC0tZm9vdGVyLWJvcmRlci1jb2xvcjogI2RkZDsKKyAgLS1mb290ZXItbGluay1jb2xvcjogIzAyNzdiZDsKKyAgLS1kcmF3ZXItYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS1kcmF3ZXItaG92ZXItYmFjay1jb2xvcjogI2YwZjBmMDsKKyAgLS1kcmF3ZXItYm9yZGVyLWNvbG9yOiAjZGRkOworICAtLWRyYXdlci1jbG9zZS1jb2xvcjogIzQ0NDsgfQorCitoZWFkZXIgeworICBoZWlnaHQ6IDMuMTg3NXJlbTsKKyAgYmFja2dyb3VuZDogdmFyKC0taGVhZGVyLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0taGVhZGVyLWZvcmUtY29sb3IpOworICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0taGVhZGVyLWJvcmRlci1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gNCkgMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgb3ZlcmZsb3cteDogYXV0bzsKKyAgb3ZlcmZsb3cteTogaGlkZGVuOyB9CisgIGhlYWRlci5yb3cgeworICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyB9CisgIGhlYWRlciAubG9nbyB7CisgICAgY29sb3I6IHZhcigtLWhlYWRlci1mb3JlLWNvbG9yKTsKKyAgICBmb250LXNpemU6IDEuNzVyZW07CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CisgIGhlYWRlciBidXR0b24sIGhlYWRlciBbdHlwZT0iYnV0dG9uIl0sIGhlYWRlciAuYnV0dG9uLCBoZWFkZXIgW3JvbGU9ImJ1dHRvbiJdIHsKKyAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IGNhbGMoMHJlbSAtIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpOworICAgIGhlaWdodDogY2FsYygzLjE4NzVyZW0gKyB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyAyKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1oZWFkZXItYmFjay1jb2xvcik7CisgICAgbGluZS1oZWlnaHQ6IGNhbGMoMy4xODc1cmVtIC0gdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpICogMS41KTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgY29sb3I6IHZhcigtLWhlYWRlci1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXI6IDA7CisgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICBtYXJnaW46IDA7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQorICAgIGhlYWRlciBidXR0b246aG92ZXIsIGhlYWRlciBidXR0b246Zm9jdXMsIGhlYWRlciBbdHlwZT0iYnV0dG9uIl06aG92ZXIsIGhlYWRlciBbdHlwZT0iYnV0dG9uIl06Zm9jdXMsIGhlYWRlciAuYnV0dG9uOmhvdmVyLCBoZWFkZXIgLmJ1dHRvbjpmb2N1cywgaGVhZGVyIFtyb2xlPSJidXR0b24iXTpob3ZlciwgaGVhZGVyIFtyb2xlPSJidXR0b24iXTpmb2N1cyB7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1oZWFkZXItaG92ZXItYmFjay1jb2xvcik7IH0KKworbmF2IHsKKyAgYmFja2dyb3VuZDogdmFyKC0tbmF2LWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tbmF2LWZvcmUtY29sb3IpOworICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1uYXYtYm9yZGVyLWNvbG9yKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICBtYXJnaW46IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOyB9CisgIG5hdiAqIHsKKyAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgIG5hdiBhLCBuYXYgYTp2aXNpdGVkIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBjb2xvcjogdmFyKC0tbmF2LWxpbmstY29sb3IpOworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgICBuYXYgYTpob3ZlciwgbmF2IGE6Zm9jdXMsIG5hdiBhOnZpc2l0ZWQ6aG92ZXIsIG5hdiBhOnZpc2l0ZWQ6Zm9jdXMgeworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmF2LWhvdmVyLWJhY2stY29sb3IpOyB9CisgIG5hdiAuc3VibGluay0xIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luLWxlZnQ6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7IH0KKyAgICBuYXYgLnN1YmxpbmstMTpiZWZvcmUgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgbGVmdDogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLSAxICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKyAgICAgIHRvcDogLTAuMDYyNXJlbTsKKyAgICAgIGNvbnRlbnQ6ICcnOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tbmF2LWJvcmRlci1jb2xvcik7CisgICAgICBib3JkZXItbGVmdDogMDsgfQorICBuYXYgLnN1YmxpbmstMiB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDQgKiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykpOyB9CisgICAgbmF2IC5zdWJsaW5rLTI6YmVmb3JlIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGxlZnQ6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC0gMyAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSk7CisgICAgICB0b3A6IC0wLjA2MjVyZW07CisgICAgICBjb250ZW50OiAnJzsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIGJvcmRlcjogMC4wNjI1cmVtIHNvbGlkIHZhcigtLW5hdi1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLWxlZnQ6IDA7IH0KKworZm9vdGVyIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tZm9vdGVyLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tZm9vdGVyLWZvcmUtY29sb3IpOworICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZm9vdGVyLWJvcmRlci1jb2xvcik7CisgIHBhZGRpbmc6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSkgdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICBmb250LXNpemU6IDAuODc1cmVtOyB9CisgIGZvb3RlciBhLCBmb290ZXIgYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogdmFyKC0tZm9vdGVyLWxpbmstY29sb3IpOyB9CisKK2hlYWRlci5zdGlja3kgeworICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7CisgIHBvc2l0aW9uOiBzdGlja3k7CisgIHotaW5kZXg6IDExMDE7CisgIHRvcDogMDsgfQorCitmb290ZXIuc3RpY2t5IHsKKyAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OworICBwb3NpdGlvbjogc3RpY2t5OworICB6LWluZGV4OiAxMTAxOworICBib3R0b206IDA7IH0KKworLmRyYXdlci10b2dnbGU6YmVmb3JlIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CisgIGNvbnRlbnQ6ICdcMDBhMFwyMjYxXDAwYTAnOworICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxLjVlbTsgfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgLmRyYXdlci10b2dnbGU6bm90KC5wZXJzaXN0ZW50KSB7CisgICAgZGlzcGxheTogbm9uZTsgfSB9CisKK1t0eXBlPSJjaGVja2JveCJdLmRyYXdlciB7CisgIGhlaWdodDogMXB4OworICB3aWR0aDogMXB4OworICBtYXJnaW46IC0xcHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgICAgcG9zaXRpb246IGZpeGVkOworICAgIHRvcDogMDsKKyAgICB3aWR0aDogMzIwcHg7CisgICAgaGVpZ2h0OiAxMDB2aDsKKyAgICBvdmVyZmxvdy15OiBhdXRvOworICAgIGJhY2tncm91bmQ6IHZhcigtLWRyYXdlci1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1kcmF3ZXItYm9yZGVyLWNvbG9yKTsKKyAgICBib3JkZXItcmFkaXVzOiAwOworICAgIG1hcmdpbjogMDsKKyAgICB6LWluZGV4OiAxMTEwOworICAgIHJpZ2h0OiAtMzIwcHg7CisgICAgdHJhbnNpdGlvbjogcmlnaHQgMC4zczsgfQorICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZSB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICB0b3A6IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICAgICAgcmlnaHQ6IHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pOworICAgICAgei1pbmRleDogMTExMTsKKyAgICAgIHdpZHRoOiAycmVtOworICAgICAgaGVpZ2h0OiAycmVtOworICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgICAgbWFyZ2luOiAwOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOyB9CisgICAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXIgKyAqIC5kcmF3ZXItY2xvc2U6YmVmb3JlIHsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgIGNvbnRlbnQ6ICdcMDBENyc7CisgICAgICAgIGNvbG9yOiB2YXIoLS1kcmF3ZXItY2xvc2UtY29sb3IpOworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICAgICAgICBmb250LXNpemU6IDJyZW07CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxOworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogLmRyYXdlci1jbG9zZTpob3ZlciwgW3R5cGU9ImNoZWNrYm94Il0uZHJhd2VyICsgKiAuZHJhd2VyLWNsb3NlOmZvY3VzIHsKKyAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZHJhd2VyLWhvdmVyLWJhY2stY29sb3IpOyB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlciArICogeworICAgICAgICB3aWR0aDogMTAwJTsgfSB9CisgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlcjpjaGVja2VkICsgKiB7CisgICAgcmlnaHQ6IDA7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgICBbdHlwZT0iY2hlY2tib3giXS5kcmF3ZXI6bm90KC5wZXJzaXN0ZW50KSArICogeworICAgICAgcG9zaXRpb246IHN0YXRpYzsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHotaW5kZXg6IDExMDA7IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLmRyYXdlcjpub3QoLnBlcnNpc3RlbnQpICsgKiAuZHJhd2VyLWNsb3NlIHsKKyAgICAgICAgZGlzcGxheTogbm9uZTsgfSB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciB0aGUgcmVzcG9uc2l2ZSB0YWJsZSBjb21wb25lbnQuCisqLworLyogVGFibGUgbW9kdWxlIENTUyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gKi8KKzpyb290IHsKKyAgLS10YWJsZS1ib3JkZXItY29sb3I6ICNhYWE7CisgIC0tdGFibGUtYm9yZGVyLXNlcGFyYXRvci1jb2xvcjogIzY2NjsKKyAgLS10YWJsZS1oZWFkLWJhY2stY29sb3I6ICNlNmU2ZTY7CisgIC0tdGFibGUtaGVhZC1mb3JlLWNvbG9yOiAjMTExOworICAtLXRhYmxlLWJvZHktYmFjay1jb2xvcjogI2Y4ZjhmODsKKyAgLS10YWJsZS1ib2R5LWZvcmUtY29sb3I6ICMxMTE7CisgIC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcjogI2VlZTsgfQorCit0YWJsZSB7CisgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7CisgIGJvcmRlci1zcGFjaW5nOiAwOworICA6IG1hcmdpbjogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXg6IDAgMSBhdXRvOworICBmbGV4LWZsb3c6IHJvdyB3cmFwOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgIHBhZGRpbmctdG9wOiAwOworCW1hcmdpbjogY2FsYygxLjUgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSkgdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CX0KKyAgdGFibGUgY2FwdGlvbiB7CisgICAgZm9udC1zaXplOiAxLjI1ICogcmVtOworICAgIG1hcmdpbjogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpIDA7CisgICAgbWF4LXdpZHRoOiAxMDAlOworICAgIGZsZXg6IDAgMCAxMDAlOworCQl0ZXh0LWFsaWduOiBsZWZ0O30KKyAgdGFibGUgdGhlYWQsIHRhYmxlIHRib2R5IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZmxvdzogcm93IHdyYXA7CisgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICB0YWJsZSB0aGVhZCB7CisgICAgei1pbmRleDogOTk5OworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgMCAwOworICAgIGJvcmRlci1ib3R0b206IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItc2VwYXJhdG9yLWNvbG9yKTsgfQorICB0YWJsZSB0Ym9keSB7CisgICAgYm9yZGVyLXRvcDogMDsKKyAgICBtYXJnaW4tdG9wOiBjYWxjKDAgLSB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgdGFibGUgdHIgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgcGFkZGluZzogMDsgfQorICB0YWJsZSB0aCwgdGFibGUgdGQgeworICAgIHBhZGRpbmc6IGNhbGMoMC41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsKKwkJZm9udC1zaXplOiAwLjlyZW07IH0KKyAgdGFibGUgdGggeworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtaGVhZC1iYWNrLWNvbG9yKTsKKyAgICBjb2xvcjogdmFyKC0tdGFibGUtaGVhZC1mb3JlLWNvbG9yKTsgfQorICB0YWJsZSB0ZCB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1iYWNrLWNvbG9yKTsKKyAgICBjb2xvcjogdmFyKC0tdGFibGUtYm9keS1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXItdG9wOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorCit0YWJsZTpub3QoLmhvcml6b250YWwpIHsKKyAgb3ZlcmZsb3c6IGF1dG87CisgIG1heC1oZWlnaHQ6IDg1MHB4OyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGhlYWQsIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGJvZHkgeworICAgIG1heC13aWR0aDogMTAwJTsKKyAgICBmbGV4OiAwIDAgMTAwJTsgfQorICB0YWJsZTpub3QoLmhvcml6b250YWwpIHRyIHsKKyAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOworICAgIGZsZXg6IDAgMCAxMDAlOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGgsIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGQgeworICAgIGZsZXg6IDEgMCAwJTsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGhlYWQgeworICAgIHBvc2l0aW9uOiBzdGlja3k7CisgICAgdG9wOiAwOyB9CisgIHRhYmxlOm5vdCguaG9yaXpvbnRhbCkgdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQgeworICAgIGJvcmRlci10b3A6IDA7IH0KKwordGFibGUuaG9yaXpvbnRhbCB7CisgIGJvcmRlcjogMDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoZWFkLCB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHsKKyAgICBib3JkZXI6IDA7CisgICAgZmxleC1mbG93OiByb3cgbm93cmFwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgeworICAgIG92ZXJmbG93OiBhdXRvOworICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgICBmbGV4OiAxIDAgMDsKKyAgICBtYXJnaW4tbGVmdDogY2FsYyggNCAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgICBwYWRkaW5nLWJvdHRvbTogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KTsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRyIHsKKyAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICAgIGZsZXg6IDEgMCBhdXRvOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGgsIHRhYmxlLmhvcml6b250YWwgdGQgeworICAgIHdpZHRoOiAxMDAlOworICAgIGJvcmRlcjogMDsKKyAgICBib3JkZXItYm90dG9tOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGg6bm90KDpmaXJzdC1jaGlsZCksIHRhYmxlLmhvcml6b250YWwgdGQ6bm90KDpmaXJzdC1jaGlsZCkgeworICAgICAgYm9yZGVyLXRvcDogMDsgfQorICB0YWJsZS5ob3Jpem9udGFsIHRoIHsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICBib3JkZXItbGVmdDogMC4wNjI1cmVtIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcik7CisgICAgYm9yZGVyLXJpZ2h0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLXNlcGFyYXRvci1jb2xvcik7IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCB0cjpmaXJzdC1jaGlsZCB7CisgICAgcGFkZGluZy1sZWZ0OiAwOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlLmhvcml6b250YWwgdGQ6Zmlyc3QtY2hpbGQgeworICAgIGJvcmRlci10b3A6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwLjA2MjVyZW0gc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4yNXJlbTsgfQorICAgIHRhYmxlLmhvcml6b250YWwgdGJvZHkgdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjI1cmVtOyB9CisgIHRhYmxlLmhvcml6b250YWwgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQgeworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuMjVyZW07IH0KKyAgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkIHsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjI1cmVtOyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ5OXB4KSB7CisgIHRhYmxlLCB0YWJsZS5ob3Jpem9udGFsIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBkaXNwbGF5OiB0YWJsZTsgfQorICAgIHRhYmxlIHRoZWFkLCB0YWJsZSB0aCwgdGFibGUuaG9yaXpvbnRhbCB0aGVhZCwgdGFibGUuaG9yaXpvbnRhbCB0aCB7CisgICAgICBib3JkZXI6IDA7CisgICAgICBoZWlnaHQ6IDFweDsKKyAgICAgIHdpZHRoOiAxcHg7CisgICAgICBtYXJnaW46IC0xcHg7CisgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgcGFkZGluZzogMDsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpOyB9CisgICAgdGFibGUgdGJvZHksIHRhYmxlLmhvcml6b250YWwgdGJvZHkgeworICAgICAgYm9yZGVyOiAwOworICAgICAgZGlzcGxheTogdGFibGUtcm93LWdyb3VwOyB9CisgICAgdGFibGUgdHIsIHRhYmxlLmhvcml6b250YWwgdHIgeworICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpOworICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKKyAgICAgIHBhZGRpbmc6IHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgICAgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgICAgICBtYXJnaW4tYm90dG9tOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7IH0KKyAgICB0YWJsZSB0aCwgdGFibGUgdGQsIHRhYmxlLmhvcml6b250YWwgdGgsIHRhYmxlLmhvcml6b250YWwgdGQgeworICAgICAgd2lkdGg6IGF1dG87IH0KKyAgICB0YWJsZSB0ZCwgdGFibGUuaG9yaXpvbnRhbCB0ZCB7CisgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgIGJvcmRlcjogMDsKKyAgICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9CisgICAgdGFibGUgdGQ6YmVmb3JlLCB0YWJsZS5ob3Jpem9udGFsIHRkOmJlZm9yZSB7CisgICAgICBjb250ZW50OiBhdHRyKGRhdGEtbGFiZWwpOworICAgICAgZmxvYXQ6IGxlZnQ7CisgICAgICBmb250LXdlaWdodDogNjAwOyB9CisgICAgdGFibGUgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlIHRkOmZpcnN0LWNoaWxkLCB0YWJsZS5ob3Jpem9udGFsIHRoOmZpcnN0LWNoaWxkLCB0YWJsZS5ob3Jpem9udGFsIHRkOmZpcnN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci10b3A6IDA7IH0KKyAgICB0YWJsZSB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkLCB0YWJsZS5ob3Jpem9udGFsIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQgeworICAgICAgYm9yZGVyLXJpZ2h0OiAwOyB9IH0KKzpyb290IHsKKyAgLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yOiAjZWVlOyB9CisKK3RhYmxlIHRyOm50aC1vZi10eXBlKDJuKSA+IHRkIHsKKyAgYmFja2dyb3VuZDogdmFyKC0tdGFibGUtYm9keS1hbHQtYmFjay1jb2xvcik7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTAwcHgpIHsKKyAgdGFibGUgdHI6bnRoLW9mLXR5cGUoMm4pIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWFsdC1iYWNrLWNvbG9yKTsgfSB9Cis6cm9vdCB7CisgIC0tdGFibGUtYm9keS1ob3Zlci1iYWNrLWNvbG9yOiAjOTBjYWY5OyB9CisKK3RhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciwgdGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyID4gdGQsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cywgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzID4gdGQgeworICBiYWNrZ3JvdW5kOiB2YXIoLS10YWJsZS1ib2R5LWhvdmVyLWJhY2stY29sb3IpOyB9CisKK0BtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDUwMHB4KSB7CisgIHRhYmxlLmhvdmVyYWJsZSB0cjpob3ZlciwgdGFibGUuaG92ZXJhYmxlIHRyOmhvdmVyID4gdGQsIHRhYmxlLmhvdmVyYWJsZSB0cjpmb2N1cywgdGFibGUuaG92ZXJhYmxlIHRyOmZvY3VzID4gdGQgeworICAgIGJhY2tncm91bmQ6IHZhcigtLXRhYmxlLWJvZHktaG92ZXItYmFjay1jb2xvcik7IH0gfQorLyoKKyAgRGVmaW5pdGlvbnMgZm9yIGNvbnRleHR1YWwgYmFja2dyb3VuZCBlbGVtZW50cywgdG9hc3RzIGFuZCB0b29sdGlwcy4KKyovCisvKiBDb250ZXh0dWFsIG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1tYXJrLWJhY2stY29sb3I6ICMwMjc3YmQ7CisgIC0tbWFyay1mb3JlLWNvbG9yOiAjZmFmYWZhOyB9CisKK21hcmsgeworICBiYWNrZ3JvdW5kOiB2YXIoLS1tYXJrLWJhY2stY29sb3IpOworICBjb2xvcjogdmFyKC0tbWFyay1mb3JlLWNvbG9yKTsKKyAgZm9udC1zaXplOiAwLjk1ZW07CisgIGxpbmUtaGVpZ2h0OiAxZW07CisgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsKKyAgcGFkZGluZzogY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgLyA0KSBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpOyB9CisgIG1hcmsuaW5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgZm9udC1zaXplOiAxZW07CisgICAgbGluZS1oZWlnaHQ6IDEuNTsKKyAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDIpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsgfQorCis6cm9vdCB7CisgIC0tdG9hc3QtYmFjay1jb2xvcjogIzQyNDI0MjsKKyAgLS10b2FzdC1mb3JlLWNvbG9yOiAjZmFmYWZhOyB9CisKKy50b2FzdCB7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgYm90dG9tOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pICogMyk7CisgIGxlZnQ6IDUwJTsKKyAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CisgIHotaW5kZXg6IDExMTE7CisgIGNvbG9yOiB2YXIoLS10b2FzdC1mb3JlLWNvbG9yKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tdG9hc3QtYmFjay1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpICogMTYpOworICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgY2FsYyh2YXIoLS11bml2ZXJzYWwtcGFkZGluZykgKiAzKTsgfQorCis6cm9vdCB7CisgIC0tdG9vbHRpcC1iYWNrLWNvbG9yOiAjMjEyMTIxOworICAtLXRvb2x0aXAtZm9yZS1jb2xvcjogI2ZhZmFmYTsgfQorCisudG9vbHRpcCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9CisgIC50b29sdGlwOmJlZm9yZSwgLnRvb2x0aXA6YWZ0ZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBvcGFjaXR5OiAwOworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpOworICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgdHJhbnNpdGlvbjogYWxsIDAuM3M7CisgICAgei1pbmRleDogMTAxMDsKKyAgICBsZWZ0OiA1MCU7IH0KKyAgLnRvb2x0aXA6bm90KC5ib3R0b20pOmJlZm9yZSwgLnRvb2x0aXA6bm90KC5ib3R0b20pOmFmdGVyIHsKKyAgICBib3R0b206IDc1JTsgfQorICAudG9vbHRpcC5ib3R0b206YmVmb3JlLCAudG9vbHRpcC5ib3R0b206YWZ0ZXIgeworICAgIHRvcDogNzUlOyB9CisgIC50b29sdGlwOmhvdmVyOmJlZm9yZSwgLnRvb2x0aXA6aG92ZXI6YWZ0ZXIsIC50b29sdGlwOmZvY3VzOmJlZm9yZSwgLnRvb2x0aXA6Zm9jdXM6YWZ0ZXIgeworICAgIG9wYWNpdHk6IDE7CisgICAgY2xpcDogYXV0bzsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMCUpOworICAgIGNsaXAtcGF0aDogaW5zZXQoMCUpOyB9CisgIC50b29sdGlwOmJlZm9yZSB7CisgICAgY29udGVudDogJyc7CisgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBsZWZ0OiBjYWxjKDUwJSAtIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsgfQorICAudG9vbHRpcDpub3QoLmJvdHRvbSk6YmVmb3JlIHsKKyAgICBib3JkZXItdG9wLWNvbG9yOiAjMjEyMTIxOyB9CisgIC50b29sdGlwLmJvdHRvbTpiZWZvcmUgeworICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMyMTIxMjE7IH0KKyAgLnRvb2x0aXA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6IGF0dHIoYXJpYS1sYWJlbCk7CisgICAgY29sb3I6IHZhcigtLXRvb2x0aXAtZm9yZS1jb2xvcik7CisgICAgYmFja2dyb3VuZDogdmFyKC0tdG9vbHRpcC1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7CisgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9CisgIC50b29sdGlwOm5vdCguYm90dG9tKTphZnRlciB7CisgICAgbWFyZ2luLWJvdHRvbTogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisgIC50b29sdGlwLmJvdHRvbTphZnRlciB7CisgICAgbWFyZ2luLXRvcDogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikpOyB9CisKKzpyb290IHsKKyAgLS1tb2RhbC1vdmVybGF5LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDUpOworICAtLW1vZGFsLWNsb3NlLWNvbG9yOiAjNDQ0OworICAtLW1vZGFsLWNsb3NlLWhvdmVyLWNvbG9yOiAjZjBmMGYwOyB9CisKK1t0eXBlPSJjaGVja2JveCJdLm1vZGFsIHsKKyAgaGVpZ2h0OiAxcHg7CisgIHdpZHRoOiAxcHg7CisgIG1hcmdpbjogLTFweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBjbGlwOiByZWN0KDAgMCAwIDApOworICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgeworICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICBkaXNwbGF5OiBub25lOworICAgIHdpZHRoOiAxMDB2dzsKKyAgICBoZWlnaHQ6IDEwMHZoOworICAgIGJhY2tncm91bmQ6IHZhcigtLW1vZGFsLW92ZXJsYXktY29sb3IpOyB9CisgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgeworICAgICAgbWFyZ2luOiAwIGF1dG87CisgICAgICBtYXgtaGVpZ2h0OiA1MHZoOworICAgICAgb3ZlcmZsb3c6IGF1dG87IH0KKyAgICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZSB7CisgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgICAgdG9wOiAwOworICAgICAgICByaWdodDogMDsKKyAgICAgICAgd2lkdGg6IDEuNzVyZW07CisgICAgICAgIGhlaWdodDogMS43NXJlbTsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOworICAgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICAgIG1hcmdpbjogMDsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuM3M7IH0KKyAgICAgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlOmJlZm9yZSB7CisgICAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICAgICAgICAgY29udGVudDogJ1wwMEQ3JzsKKyAgICAgICAgICBjb2xvcjogdmFyKC0tbW9kYWwtY2xvc2UtY29sb3IpOworICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgICAgICAgICBmb250LXNpemU6IDEuNzVyZW07CisgICAgICAgICAgbGluZS1oZWlnaHQ6IDE7CisgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyB9CisgICAgICAgIFt0eXBlPSJjaGVja2JveCJdLm1vZGFsICsgZGl2IC5jYXJkIC5tb2RhbC1jbG9zZTpob3ZlciwgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWwgKyBkaXYgLmNhcmQgLm1vZGFsLWNsb3NlOmZvY3VzIHsKKyAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tb2RhbC1jbG9zZS1ob3Zlci1jb2xvcik7IH0KKyAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWw6Y2hlY2tlZCArIGRpdiB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4OiAwIDEgYXV0bzsKKyAgICB6LWluZGV4OiAxMjAwOyB9CisgICAgW3R5cGU9ImNoZWNrYm94Il0ubW9kYWw6Y2hlY2tlZCArIGRpdiAuY2FyZCAubW9kYWwtY2xvc2UgeworICAgICAgei1pbmRleDogMTIxMTsgfQorCis6cm9vdCB7CisgIC0tY29sbGFwc2UtbGFiZWwtYmFjay1jb2xvcjogI2U4ZThlODsKKyAgLS1jb2xsYXBzZS1sYWJlbC1mb3JlLWNvbG9yOiAjMjEyMTIxOworICAtLWNvbGxhcHNlLWxhYmVsLWhvdmVyLWJhY2stY29sb3I6ICNmMGYwZjA7CisgIC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYmFjay1jb2xvcjogI2VjZWNlYzsKKyAgLS1jb2xsYXBzZS1ib3JkZXItY29sb3I6ICNkZGQ7CisgIC0tY29sbGFwc2UtY29udGVudC1iYWNrLWNvbG9yOiAjZmFmYWZhOworICAtLWNvbGxhcHNlLXNlbGVjdGVkLWxhYmVsLWJvcmRlci1jb2xvcjogIzAyNzdiZDsgfQorCisuY29sbGFwc2UgeworICB3aWR0aDogY2FsYygxMDAlIC0gMiAqIHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pKTsKKyAgb3BhY2l0eTogMTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyLXJhZGl1czogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpOyB9CisgIC5jb2xsYXBzZSA+IFt0eXBlPSJyYWRpbyJdLCAuY29sbGFwc2UgPiBbdHlwZT0iY2hlY2tib3giXSB7CisgICAgaGVpZ2h0OiAxcHg7CisgICAgd2lkdGg6IDFweDsKKyAgICBtYXJnaW46IC0xcHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsgfQorICAuY29sbGFwc2UgPiBsYWJlbCB7CisgICAgZmxleC1ncm93OiAxOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBoZWlnaHQ6IDEuNXJlbTsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjNzOworICAgIGNvbG9yOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1mb3JlLWNvbG9yKTsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1iYWNrLWNvbG9yKTsKKyAgICBib3JkZXI6IDAuMDYyNXJlbSBzb2xpZCB2YXIoLS1jb2xsYXBzZS1ib3JkZXItY29sb3IpOworICAgIHBhZGRpbmc6IGNhbGMoMS41ICogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpKTsgfQorICAgIC5jb2xsYXBzZSA+IGxhYmVsOmhvdmVyLCAuY29sbGFwc2UgPiBsYWJlbDpmb2N1cyB7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1sYWJlbC1ob3Zlci1iYWNrLWNvbG9yKTsgfQorICAgIC5jb2xsYXBzZSA+IGxhYmVsICsgZGl2IHsKKyAgICAgIGZsZXgtYmFzaXM6IGF1dG87CisgICAgICBoZWlnaHQ6IDFweDsKKyAgICAgIHdpZHRoOiAxcHg7CisgICAgICBtYXJnaW46IC0xcHg7CisgICAgICBvdmVyZmxvdzogaGlkZGVuOworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgY2xpcDogcmVjdCgwIDAgMCAwKTsKKyAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCgxMDAlKTsKKyAgICAgIGNsaXAtcGF0aDogaW5zZXQoMTAwJSk7CisgICAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuM3M7CisgICAgICBtYXgtaGVpZ2h0OiAxcHg7IH0KKyAgLmNvbGxhcHNlID4gOmNoZWNrZWQgKyBsYWJlbCB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYmFjay1jb2xvcik7CisgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tY29sbGFwc2Utc2VsZWN0ZWQtbGFiZWwtYm9yZGVyLWNvbG9yKTsgfQorICAgIC5jb2xsYXBzZSA+IDpjaGVja2VkICsgbGFiZWwgKyBkaXYgeworICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKKyAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgaGVpZ2h0OiBhdXRvOworICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICBtYXJnaW46IDA7CisgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYXBzZS1jb250ZW50LWJhY2stY29sb3IpOworICAgICAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tY29sbGFwc2UtYm9yZGVyLWNvbG9yKTsKKyAgICAgIGJvcmRlci10b3A6IDA7CisgICAgICBwYWRkaW5nOiB2YXIoLS11bml2ZXJzYWwtcGFkZGluZyk7CisgICAgICBjbGlwOiBhdXRvOworICAgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDAlKTsKKyAgICAgIGNsaXAtcGF0aDogaW5zZXQoMCUpOworICAgICAgbWF4LWhlaWdodDogODUwcHg7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6bm90KDpmaXJzdC1vZi10eXBlKSB7CisgICAgYm9yZGVyLXRvcDogMDsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpmaXJzdC1vZi10eXBlIHsKKyAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIDAgMDsgfQorICAuY29sbGFwc2UgPiBsYWJlbDpsYXN0LW9mLXR5cGU6bm90KDpmaXJzdC1vZi10eXBlKSB7CisgICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cyk7IH0KKyAgLmNvbGxhcHNlID4gbGFiZWw6bGFzdC1vZi10eXBlOmZpcnN0LW9mLXR5cGUgeworICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorICAuY29sbGFwc2UgPiA6Y2hlY2tlZDpsYXN0LW9mLXR5cGU6bm90KDpmaXJzdC1vZi10eXBlKSArIGxhYmVsIHsKKyAgICBib3JkZXItcmFkaXVzOiAwOyB9CisgIC5jb2xsYXBzZSA+IDpjaGVja2VkOmxhc3Qtb2YtdHlwZSArIGxhYmVsICsgZGl2IHsKKyAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKTsgfQorCisvKgorICBDdXN0b20gZWxlbWVudHMgZm9yIGNvbnRleHR1YWwgYmFja2dyb3VuZCBlbGVtZW50cywgdG9hc3RzIGFuZCB0b29sdGlwcy4KKyovCittYXJrLnNlY29uZGFyeSB7CisgIC0tbWFyay1iYWNrLWNvbG9yOiAjZDMyZjJmOyB9CisKK21hcmsudGVydGlhcnkgeworICAtLW1hcmstYmFjay1jb2xvcjogIzMwODczMjsgfQorCittYXJrLnRhZyB7CisgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpLzIpIHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKTsKKyAgYm9yZGVyLXJhZGl1czogMWVtOyB9CisKKy8qCisgIERlZmluaXRpb25zIGZvciBwcm9ncmVzcyBlbGVtZW50cyBhbmQgc3Bpbm5lcnMuCisqLworLyogUHJvZ2VzcyBtb2R1bGUgQ1NTIHZhcmlhYmxlIGRlZmluaXRpb25zICovCis6cm9vdCB7CisgIC0tcHJvZ3Jlc3MtYmFjay1jb2xvcjogI2RkZDsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjNTU1OyB9CisKK3Byb2dyZXNzIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CisgIGFwcGVhcmFuY2U6IG5vbmU7CisgIGhlaWdodDogMC43NXJlbTsKKyAgd2lkdGg6IGNhbGMoMTAwJSAtIDIgKiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKSk7CisgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbik7CisgIGJvcmRlcjogMDsKKyAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsKKyAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtYmFjay1jb2xvcik7CisgIGNvbG9yOiB2YXIoLS1wcm9ncmVzcy1mb3JlLWNvbG9yKTsgfQorICBwcm9ncmVzczo6LXdlYmtpdC1wcm9ncmVzcy12YWx1ZSB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcik7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOyB9CisgIHByb2dyZXNzOjotd2Via2l0LXByb2dyZXNzLWJhciB7CisgICAgYmFja2dyb3VuZDogdmFyKC0tcHJvZ3Jlc3MtYmFjay1jb2xvcik7IH0KKyAgcHJvZ3Jlc3M6Oi1tb3otcHJvZ3Jlc3MtYmFyIHsKKyAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcm9ncmVzcy1mb3JlLWNvbG9yKTsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKDIgKiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykpOworICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IGNhbGMoMiAqIHZhcigtLXVuaXZlcnNhbC1ib3JkZXItcmFkaXVzKSk7IH0KKyAgcHJvZ3Jlc3NbdmFsdWU9IjEwMDAiXTo6LXdlYmtpdC1wcm9ncmVzcy12YWx1ZSB7CisgICAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzc1t2YWx1ZT0iMTAwMCJdOjotbW96LXByb2dyZXNzLWJhciB7CisgICAgYm9yZGVyLXJhZGl1czogY2FsYygyICogdmFyKC0tdW5pdmVyc2FsLWJvcmRlci1yYWRpdXMpKTsgfQorICBwcm9ncmVzcy5pbmxpbmUgeworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIHdpZHRoOiA2MCU7IH0KKworOnJvb3QgeworICAtLXNwaW5uZXItYmFjay1jb2xvcjogI2RkZDsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICM1NTU7IH0KKworQGtleWZyYW1lcyBzcGlubmVyLWRvbnV0LWFuaW0geworICAwJSB7CisgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KKyAgMTAwJSB7CisgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9Cisuc3Bpbm5lciB7CisgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgbWFyZ2luOiB2YXIoLS11bml2ZXJzYWwtbWFyZ2luKTsKKyAgYm9yZGVyOiAwLjI1cmVtIHNvbGlkIHZhcigtLXNwaW5uZXItYmFjay1jb2xvcik7CisgIGJvcmRlci1sZWZ0OiAwLjI1cmVtIHNvbGlkIHZhcigtLXNwaW5uZXItZm9yZS1jb2xvcik7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKKyAgd2lkdGg6IDEuMjVyZW07CisgIGhlaWdodDogMS4yNXJlbTsKKyAgYW5pbWF0aW9uOiBzcGlubmVyLWRvbnV0LWFuaW0gMS4ycyBsaW5lYXIgaW5maW5pdGU7IH0KKworLyoKKyAgQ3VzdG9tIGVsZW1lbnRzIGZvciBwcm9ncmVzcyBiYXJzIGFuZCBzcGlubmVycy4KKyovCitwcm9ncmVzcy5wcmltYXJ5IHsKKyAgLS1wcm9ncmVzcy1mb3JlLWNvbG9yOiAjMTk3NmQyOyB9CisKK3Byb2dyZXNzLnNlY29uZGFyeSB7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogI2QzMmYyZjsgfQorCitwcm9ncmVzcy50ZXJ0aWFyeSB7CisgIC0tcHJvZ3Jlc3MtZm9yZS1jb2xvcjogIzMwODczMjsgfQorCisuc3Bpbm5lci5wcmltYXJ5IHsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICMxOTc2ZDI7IH0KKworLnNwaW5uZXIuc2Vjb25kYXJ5IHsKKyAgLS1zcGlubmVyLWZvcmUtY29sb3I6ICNkMzJmMmY7IH0KKworLnNwaW5uZXIudGVydGlhcnkgeworICAtLXNwaW5uZXItZm9yZS1jb2xvcjogIzMwODczMjsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgaWNvbnMgLSBwb3dlcmVkIGJ5IEZlYXRoZXIgKGh0dHBzOi8vZmVhdGhlcmljb25zLmNvbS8pLgorKi8KK3NwYW5bY2xhc3NePSdpY29uLSddIHsKKyAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICBoZWlnaHQ6IDFlbTsKKyAgd2lkdGg6IDFlbTsKKyAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOworICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CisgIG1hcmdpbjogMCBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCk7IH0KKyAgc3BhbltjbGFzc149J2ljb24tJ10uc2Vjb25kYXJ5IHsKKyAgICAtd2Via2l0LWZpbHRlcjogaW52ZXJ0KDI1JSk7CisgICAgZmlsdGVyOiBpbnZlcnQoMjUlKTsgfQorICBzcGFuW2NsYXNzXj0naWNvbi0nXS5pbnZlcnNlIHsKKyAgICAtd2Via2l0LWZpbHRlcjogaW52ZXJ0KDEwMCUpOworICAgIGZpbHRlcjogaW52ZXJ0KDEwMCUpOyB9CisKK3NwYW4uaWNvbi1hbGVydCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPScxMCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMTInIHkxPSc4JyB4Mj0nMTInIHkyPScxMiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMTYnIHgyPScxMicgeTI9JzE2JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tYm9va21hcmsgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTE5IDIxbC03LTUtNyA1VjVhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAyeiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWNhbGVuZGFyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NyZWN0IHg9JzMnIHk9JzQnIHdpZHRoPScxOCcgaGVpZ2h0PScxOCcgcng9JzInIHJ5PScyJyUzRSUzQy9yZWN0JTNFJTNDbGluZSB4MT0nMTYnIHkxPScyJyB4Mj0nMTYnIHkyPSc2JyUzRSUzQy9saW5lJTNFJTNDbGluZSB4MT0nOCcgeTE9JzInIHgyPSc4JyB5Mj0nNiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzMnIHkxPScxMCcgeDI9JzIxJyB5Mj0nMTAnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1jcmVkaXQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3JlY3QgeD0nMScgeT0nNCcgd2lkdGg9JzIyJyBoZWlnaHQ9JzE2JyByeD0nMicgcnk9JzInJTNFJTNDL3JlY3QlM0UlM0NsaW5lIHgxPScxJyB5MT0nMTAnIHgyPScyMycgeTI9JzEwJyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tZWRpdCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMjAgMTQuNjZWMjBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDUuMzQnJTNFJTNDL3BhdGglM0UlM0Nwb2x5Z29uIHBvaW50cz0nMTggMiAyMiA2IDEyIDE2IDggMTYgOCAxMiAxOCAyJyUzRSUzQy9wb2x5Z29uJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbGluayB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzExMScgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnJTNFJTNDcGF0aCBkPSdNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNiclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMTUgMyAyMSAzIDIxIDknJTNFJTNDL3BvbHlsaW5lJTNFJTNDbGluZSB4MT0nMTAnIHkxPScxNCcgeDI9JzIxJyB5Mj0nMyclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWhlbHAgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTkuMDkgOWEzIDMgMCAwIDEgNS44MyAxYzAgMi0zIDMtMyAzJyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzEyJyByPScxMCclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nMTInIHkxPScxNycgeDI9JzEyJyB5Mj0nMTcnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1ob21lIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnonJTNFJTNDL3BhdGglM0UlM0Nwb2x5bGluZSBwb2ludHM9JzkgMjIgOSAxMiAxNSAxMiAxNSAyMiclM0UlM0MvcG9seWxpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1pbmZvIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzEwJyUzRSUzQy9jaXJjbGUlM0UlM0NsaW5lIHgxPScxMicgeTE9JzE2JyB4Mj0nMTInIHkyPScxMiclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nOCcgeDI9JzEyJyB5Mj0nOCclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWxvY2sgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3JlY3QgeD0nMycgeT0nMTEnIHdpZHRoPScxOCcgaGVpZ2h0PScxMScgcng9JzInIHJ5PScyJyUzRSUzQy9yZWN0JTNFJTNDcGF0aCBkPSdNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjQnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi1tYWlsIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J000IDRoMTZjMS4xIDAgMiAuOSAyIDJ2MTJjMCAxLjEtLjkgMi0yIDJINGMtMS4xIDAtMi0uOS0yLTJWNmMwLTEuMS45LTIgMi0yeiclM0UlM0MvcGF0aCUzRSUzQ3BvbHlsaW5lIHBvaW50cz0nMjIsNiAxMiwxMyAyLDYnJTNFJTNDL3BvbHlsaW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tbG9jYXRpb24geworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIxIDEwYzAgNy05IDEzLTkgMTNzLTktNi05LTEzYTkgOSAwIDAgMSAxOCAweiclM0UlM0MvcGF0aCUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMCcgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tcGhvbmUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ3BhdGggZD0nTTIyIDE2LjkydjNhMiAyIDAgMCAxLTIuMTggMiAxOS43OSAxOS43OSAwIDAgMS04LjYzLTMuMDcgMTkuNSAxOS41IDAgMCAxLTYtNiAxOS43OSAxOS43OSAwIDAgMS0zLjA3LTguNjdBMiAyIDAgMCAxIDQuMTEgMmgzYTIgMiAwIDAgMSAyIDEuNzIgMTIuODQgMTIuODQgMCAwIDAgLjcgMi44MSAyIDIgMCAwIDEtLjQ1IDIuMTFMOC4wOSA5LjkxYTE2IDE2IDAgMCAwIDYgNmwxLjI3LTEuMjdhMiAyIDAgMCAxIDIuMTEtLjQ1IDEyLjg0IDEyLjg0IDAgMCAwIDIuODEuN0EyIDIgMCAwIDEgMjIgMTYuOTJ6JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tcnNzIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J000IDExYTkgOSAwIDAgMSA5IDknJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J000IDRhMTYgMTYgMCAwIDEgMTYgMTYnJTNFJTNDL3BhdGglM0UlM0NjaXJjbGUgY3g9JzUnIGN5PScxOScgcj0nMSclM0UlM0MvY2lyY2xlJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tc2VhcmNoIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzExJyBjeT0nMTEnIHI9JzgnJTNFJTNDL2NpcmNsZSUzRSUzQ2xpbmUgeDE9JzIxJyB5MT0nMjEnIHgyPScxNi42NScgeTI9JzE2LjY1JyUzRSUzQy9saW5lJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tc2V0dGluZ3MgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDcGF0aCBkPSdNMTkuNCAxNWExLjY1IDEuNjUgMCAwIDAgLjMzIDEuODJsLjA2LjA2YTIgMiAwIDAgMSAwIDIuODMgMiAyIDAgMCAxLTIuODMgMGwtLjA2LS4wNmExLjY1IDEuNjUgMCAwIDAtMS44Mi0uMzMgMS42NSAxLjY1IDAgMCAwLTEgMS41MVYyMWEyIDIgMCAwIDEtMiAyIDIgMiAwIDAgMS0yLTJ2LS4wOUExLjY1IDEuNjUgMCAwIDAgOSAxOS40YTEuNjUgMS42NSAwIDAgMC0xLjgyLjMzbC0uMDYuMDZhMiAyIDAgMCAxLTIuODMgMCAyIDIgMCAwIDEgMC0yLjgzbC4wNi0uMDZhMS42NSAxLjY1IDAgMCAwIC4zMy0xLjgyIDEuNjUgMS42NSAwIDAgMC0xLjUxLTFIM2EyIDIgMCAwIDEtMi0yIDIgMiAwIDAgMSAyLTJoLjA5QTEuNjUgMS42NSAwIDAgMCA0LjYgOWExLjY1IDEuNjUgMCAwIDAtLjMzLTEuODJsLS4wNi0uMDZhMiAyIDAgMCAxIDAtMi44MyAyIDIgMCAwIDEgMi44MyAwbC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMS44Mi4zM0g5YTEuNjUgMS42NSAwIDAgMCAxLTEuNTFWM2EyIDIgMCAwIDEgMi0yIDIgMiAwIDAgMSAyIDJ2LjA5YTEuNjUgMS42NSAwIDAgMCAxIDEuNTEgMS42NSAxLjY1IDAgMCAwIDEuODItLjMzbC4wNi0uMDZhMiAyIDAgMCAxIDIuODMgMCAyIDIgMCAwIDEgMCAyLjgzbC0uMDYuMDZhMS42NSAxLjY1IDAgMCAwLS4zMyAxLjgyVjlhMS42NSAxLjY1IDAgMCAwIDEuNTEgMUgyMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMS0yIDJoLS4wOWExLjY1IDEuNjUgMCAwIDAtMS41MSAxeiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLXNoYXJlIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NjaXJjbGUgY3g9JzE4JyBjeT0nNScgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDY2lyY2xlIGN4PSc2JyBjeT0nMTInIHI9JzMnJTNFJTNDL2NpcmNsZSUzRSUzQ2NpcmNsZSBjeD0nMTgnIGN5PScxOScgcj0nMyclM0UlM0MvY2lyY2xlJTNFJTNDbGluZSB4MT0nOC41OScgeTE9JzEzLjUxJyB4Mj0nMTUuNDInIHkyPScxNy40OSclM0UlM0MvbGluZSUzRSUzQ2xpbmUgeDE9JzE1LjQxJyB5MT0nNi41MScgeDI9JzguNTknIHkyPScxMC40OSclM0UlM0MvbGluZSUzRSUzQy9zdmclM0UiKTsgfQorc3Bhbi5pY29uLWNhcnQgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMxMTEnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyUzRSUzQ2NpcmNsZSBjeD0nOScgY3k9JzIxJyByPScxJyUzRSUzQy9jaXJjbGUlM0UlM0NjaXJjbGUgY3g9JzIwJyBjeT0nMjEnIHI9JzEnJTNFJTNDL2NpcmNsZSUzRSUzQ3BhdGggZD0nTTEgMWg0bDIuNjggMTMuMzlhMiAyIDAgMCAwIDIgMS42MWg5LjcyYTIgMiAwIDAgMCAyLTEuNjFMMjMgNkg2JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIpOyB9CitzcGFuLmljb24tdXBsb2FkIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00JyUzRSUzQy9wYXRoJTNFJTNDcG9seWxpbmUgcG9pbnRzPScxNyA4IDEyIDMgNyA4JyUzRSUzQy9wb2x5bGluZSUzRSUzQ2xpbmUgeDE9JzEyJyB5MT0nMycgeDI9JzEyJyB5Mj0nMTUnJTNFJTNDL2xpbmUlM0UlM0Mvc3ZnJTNFIik7IH0KK3NwYW4uaWNvbi11c2VyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzMTExJyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0NwYXRoIGQ9J00yMCAyMXYtMmE0IDQgMCAwIDAtNC00SDhhNCA0IDAgMCAwLTQgNHYyJyUzRSUzQy9wYXRoJTNFJTNDY2lyY2xlIGN4PScxMicgY3k9JzcnIHI9JzQnJTNFJTNDL2NpcmNsZSUzRSUzQy9zdmclM0UiKTsgfQorCisvKgorICBEZWZpbml0aW9ucyBmb3IgdXRpbGl0aWVzIGFuZCBoZWxwZXIgY2xhc3Nlcy4KKyovCisvKiBVdGlsaXR5IG1vZHVsZSBDU1MgdmFyaWFibGUgZGVmaW5pdGlvbnMgKi8KKzpyb290IHsKKyAgLS1nZW5lcmljLWJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOworICAtLWdlbmVyaWMtYm94LXNoYWRvdzogMCAwLjI1cmVtIDAuMjVyZW0gMCByZ2JhKDAsIDAsIDAsIDAuMTI1KSwgMCAwLjEyNXJlbSAwLjEyNXJlbSAtMC4xMjVyZW0gcmdiYSgwLCAwLCAwLCAwLjI1KTsgfQorCisuaGlkZGVuIHsKKyAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CisKKy52aXN1YWxseS1oaWRkZW4geworICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKKyAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICBtYXJnaW46IC0xcHggIWltcG9ydGFudDsKKyAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgY2xpcDogcmVjdCgwIDAgMCAwKSAhaW1wb3J0YW50OworICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7IH0KKworLmJvcmRlcmVkIHsKKyAgYm9yZGVyOiAwLjA2MjVyZW0gc29saWQgdmFyKC0tZ2VuZXJpYy1ib3JkZXItY29sb3IpICFpbXBvcnRhbnQ7IH0KKworLnJvdW5kZWQgeworICBib3JkZXItcmFkaXVzOiB2YXIoLS11bml2ZXJzYWwtYm9yZGVyLXJhZGl1cykgIWltcG9ydGFudDsgfQorCisuY2lyY3VsYXIgeworICBib3JkZXItcmFkaXVzOiA1MCUgIWltcG9ydGFudDsgfQorCisuc2hhZG93ZWQgeworICBib3gtc2hhZG93OiB2YXIoLS1nZW5lcmljLWJveC1zaGFkb3cpICFpbXBvcnRhbnQ7IH0KKworLnJlc3BvbnNpdmUtbWFyZ2luIHsKKyAgbWFyZ2luOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1tYXJnaW4pIC8gNCkgIWltcG9ydGFudDsgfQorICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1MDBweCkgeworICAgIC5yZXNwb25zaXZlLW1hcmdpbiB7CisgICAgICBtYXJnaW46IGNhbGModmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgLyAyKSAhaW1wb3J0YW50OyB9IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSB7CisgICAgLnJlc3BvbnNpdmUtbWFyZ2luIHsKKyAgICAgIG1hcmdpbjogdmFyKC0tdW5pdmVyc2FsLW1hcmdpbikgIWltcG9ydGFudDsgfSB9CisKKy5yZXNwb25zaXZlLXBhZGRpbmcgeworICBwYWRkaW5nOiBjYWxjKHZhcigtLXVuaXZlcnNhbC1wYWRkaW5nKSAvIDQpICFpbXBvcnRhbnQ7IH0KKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIHsKKyAgICAucmVzcG9uc2l2ZS1wYWRkaW5nIHsKKyAgICAgIHBhZGRpbmc6IGNhbGModmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpIC8gMikgIWltcG9ydGFudDsgfSB9CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAgIC5yZXNwb25zaXZlLXBhZGRpbmcgeworICAgICAgcGFkZGluZzogdmFyKC0tdW5pdmVyc2FsLXBhZGRpbmcpICFpbXBvcnRhbnQ7IH0gfQorCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0OTlweCkgeworICAuaGlkZGVuLXNtIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIHsKKyAgLmhpZGRlbi1tZCB7CisgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODBweCkgeworICAuaGlkZGVuLWxnIHsKKyAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDk5cHgpIHsKKyAgLnZpc3VhbGx5LWhpZGRlbi1zbSB7CisgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICAgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDUwMHB4KSBhbmQgKG1heC13aWR0aDogMTI3OXB4KSB7CisgIC52aXN1YWxseS1oaWRkZW4tbWQgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICAgIHdpZHRoOiAxcHggIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OworICAgIG1hcmdpbjogLTFweCAhaW1wb3J0YW50OworICAgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKKyAgICBjbGlwOiByZWN0KDAgMCAwIDApICFpbXBvcnRhbnQ7CisgICAgLXdlYmtpdC1jbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgY2xpcC1wYXRoOiBpbnNldCgxMDAlKSAhaW1wb3J0YW50OworICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsgfSB9CitAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHsKKyAgLnZpc3VhbGx5LWhpZGRlbi1sZyB7CisgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CisgICAgd2lkdGg6IDFweCAhaW1wb3J0YW50OworICAgIGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luOiAtMXB4ICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7CisgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMCAwIDAgMCkgIWltcG9ydGFudDsKKyAgICAtd2Via2l0LWNsaXAtcGF0aDogaW5zZXQoMTAwJSkgIWltcG9ydGFudDsKKyAgICBjbGlwLXBhdGg6IGluc2V0KDEwMCUpICFpbXBvcnRhbnQ7CisgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OyB9IH0KKworLyojIHNvdXJjZU1hcHBpbmdVUkw9bWluaS1kZWZhdWx0LmNzcy5tYXAgKi8KZGlmZiAtLWdpdCBhL19odG1yZXNjL3N0X2xvZ28ucG5nIGIvX2h0bXJlc2Mvc3RfbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4MDA1NwotLS0gL2Rldi9udWxsCisrKyBiL19odG1yZXNjL3N0X2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIK